ATS: Formatting
Version: 1.1.5
Author: modern algebra
Date: 26 February 2015
Version History
- <Version 1.1.5> 2015.02.26 - Fixed error when used with Face Options
- <Version 1.1.3> 2014.04.30 - Fixed error with mid-line size changes and incomplete lines after forcing a new page with \pn. Also updated ParagraphFormatter to version 1.0.1
- <Version 1.1.2> 2012.10.04 - Fixed an error where alignment would erase the text if paragraph formatting was not on and if there were wait codes in the text.
- <Version 1.1.1> 2012.09.24 - Fixed an error where alignment would not work if there was a space before an explicit line break.
- <Version 1.1.0> 2012.09.08 - Modified the paragraph formatting methods in this script to be more consistent with my other scripts, and I also fixed an error where \n would not break a line if there was nothing in it.
- <Version 1.0.3> 2012.08.01 - Added \lb as an alternate code to break a line
- <Version 1.0.2> 2012.07.31 - Fixed an incompatibility that could occur with other message scripts
- <Version 1.0a> 2012.04.23 - Included the Escape Codes Fix in the body of the script
- <Version 1.0> 2012.01.28 - Original Release
Description
This script adds a few features when using the Display Text event command. Most notably, the paragraph formatting feature allows you to write text without any fear that it will get cut off when it shows up in-game. This should work with any font and it is designed to recognize most message codes that are added, even by unrelated scripts. Supplementary to that, you can set it so that subsequent text boxes are appended, which allows you to write long dialogues using paragraph format without fear of weird page breaks. Finally, it adds a feature that allows you to align the text differently.
Features
- Paragraph Formatting permits you to ignore the markers when displaying text - nothing will get cut off.
- Appended Text supplements paragraph formatting for long dialogues
- Can align the text
Screenshots
Instructions
Paste this script into its own slot in the Script Editor, above Main but below Materials. If you are using another message script, I recommend that this script be placed below it.
Please see the header of the script for instructions on use.
Script
#==============================================================================
# ATS: Formatting [VXA]
# Version: 1.1.5
# Author: modern algebra (rmrk.net)
# Date: 26 February 2015
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Description:
#
# This script essentially adds three features to your messages, all of which
# may be familiar if you used the VX version of the ATS. The first feature is
# paragraph formatting, and if that is on then the script will essentially
# draw the text so that only as much text as can fit on a line is included.
# In other words, if you have put so much text in a message such that it
# would normally be cut off on the right, this script will make it so that
# instead, if the text is in danger of being cut off, it will simply draw it
# on the next line. Along with this, this script will also bring in a new
# message code to start a new line (since the traditional line breaks are
# wiped out when you use paragraph format).
#
# The second feature is appended text, which in this context is really only
# useful if you are using paragraph format. When you have this feature on,
# what it will do is make it so that the text in any immediately subsequent
# Display Text event command with the same settings will be joined to the
# first text window, and then they will be shown in the same window if there
# is room. What this means is that if, for instance, you have two messages,
# and the first would only show two lines and the second would show three
# lines, then in-game, if appended text is on, the first two lines of the
# second command would be shown with the two lines of the first command, and
# the next page would only show the last line of the second command. It is a
# useful feature when using paragraph formatting, since otherwise when
# writing long dialogues with the same character, you would need to be
# writing in sets of four lines so that it doesn't have weird stops.
#
# The third feature is text alignment, so you can now set it so that text is
# aligned to the left, right or centre in the message box.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 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:
#
# Paste this script into its own slot in the Script Editor, above Main but
# below Materials. If you are using another message system, such as Yanfly's
# Ace Message System, I recommend that this script be placed underneath it.
#
# You can change the default setting for paragraph formatting at line 127.
# Currently, it is set to true, which means that it will be operative in
# every message unless you specifically turn it off. To change this default
# value in-game, use one of the following codes in a script call:
#
# ats_all(:paragraph_format, true) # Turns paragraph format on
# ats_all(:paragraph_format, false) # Turns paragraph format off
#
# Similarly, you can change it for just the very next display text command.
# Simply use one of the following codes in a script call:
#
# ats_next(:paragraph_format, true) # Turns paragraph format on
# ats_next(:paragraph_format, false) # Turns paragraph format off
#
# Alternatively, you can turn paragraph format on or off for a message by
# message codes. See the special message codes list at lines 96 and 97.
#
# You can change the default setting for appended text at line 135. If true,
# then any immediately subsequent display text commands with the same
# same settings (same face, background, position) will be added to the
# message shown.
#
# Similar to paragraph format, you can use the following commands in a
# script call
#
# ats_all(:append_text, true) # Turns default appended text on
# ats_all(:append_text, false) # Turns default appended text off
# ats_next(:append_text, true) # Turns appended text on for next message
# ats_next(:append_text, false) # Turns appended text off for next message
#
# Finally, you can also change the alignment of text with the special
# message codes listed below at lines 100, 101 & 102.
#
# Lastly, I would draw your attention to the \n and \pn codes, which allows
# you to make new lines and new pages, respectively. These are useful for
# when you are using paragraph format and appended text, as it allows you
# more control. They are described at line 98 and 99.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# List of Special Message Codes Added:
#
# \pf - Turn on paragraph format for this message.
# /pf - Turn off paragraph format for this message.
# \n - Start a new line.
# \lb - Start a new line.
# \pn - Start a new page.
# \a[L] - Aligns the text to the left for this line. Can also use \a[0].
# \a[C] - Aligns the text to the centre for this line. Can also use \a[1].
# \a[R] - Aligns the text to the right for this line. Can also use \a[2].
#==============================================================================
$imported ||= {}
if !$imported[:ATS_Formatting]
$imported[:ATS_Formatting] = true
#==============================================================================
# ** Game_ATS
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new public instance variables - ats_paragraph_formatting; ats_alignment;
# paragraph_format
#==============================================================================
class Game_ATS
CONFIG ||= {}
CONFIG[:ats_formatting] = {
ats_formatting: true,
ats_alignment: 0,
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
# EDITABLE REGION
#||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Set the below value to either true or false. If true, then paragraph
# format will be on by default. If false, then paragraph_format will be
# off by default.
paragraph_format: true,
# Set the below value to either true or false. If true, then any
# immediately subsequent display text event commands with the same settings
# will be joined together and they will show in the same message window if
# there is space. This option is only useful if using paragraph format. If
# you are using ATS: Message Options, it will only recognize the value of
# :append_text set up in that script.
append_text: true,
#||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# END EDITABLE REGION
#////////////////////////////////////////////////////////////////////////
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Public Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CONFIG[:ats_formatting].delete(:append_text) if $imported[:ATS_MessageOptions]
CONFIG[:ats_formatting].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
alias modb_ats_crtgmobj_6yh7 create_game_objects
alias mlba_ats_mksave_5tg9 make_save_contents
alias ma_ats_extrcsvcon_8uj2 extract_save_contents
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Create Game Objects
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def self.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
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def self.make_save_contents(*args, &block)
contents = mlba_ats_mksave_5tg9(*args, &block)
contents[:ats] = $game_ats
contents
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Extract Save Contents
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def self.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
#============================================================================
# ** 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
$imported[:AdvancedTextSystem] = true
end
# Fix the error with Escape codes
unless $imported[:MA_EscapeCodesFix]
#============================================================================
# ** Window_Base
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased method - obtain_escape_code
#============================================================================
class Window_Base
alias maatspf_obtainesccode_2jk3 obtain_escape_code
def obtain_escape_code(*args, &block)
code = maatspf_obtainesccode_2jk3(*args, &block)
if code.nil?
p "ERROR in #{self}:\nThere is no escaped code between \ and [ in your text."
""
else
code
end
end
end
$imported[:MA_EscapeCodesFix] = true
end
unless $imported[:"MA_ParagraphFormat_1.0.1"]
#==============================================================================
# ** MA_Window_ParagraphFormat
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This module inserts into Window_Base and provides a method to format the
# strings so as to go to the next line if it exceeds a set limit. This is
# designed to work with draw_text_ex, and a string formatted by this method
# should go through that, not draw_text.
#==============================================================================
module MA_Window_ParagraphFormat
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Calc Line Width
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def mapf_calc_line_width(line, tw = 0, contents_dummy = false)
return tw if line.nil?
line = line.clone
unless contents_dummy
real_contents = contents # Preserve Real Contents
# Create a dummy contents
self.contents = Bitmap.new(24, 24)
reset_font_settings
end
pos = {x: 0, y: 0, new_x: 0, height: calc_line_height(line)}
while line[/^(.*?)\e(.*)/]
tw += text_size($1).width
line = $2
# Remove all ancillaries to the code, like parameters
code = obtain_escape_code(line)
# If direct setting of x, reset tw.
tw = 0 if ($imported[:ATS_SpecialMessageCodes] && code.upcase == 'X') ||
($imported["YEA-MessageSystem"] && code.upcase == 'PX')
# If I need to do something special on the basis that it is testing,
# alias process_escape_character and differentiate using @atsf_testing
process_escape_character(code, line, pos)
end
# Add width of remaining text, as well as the value of pos[:x] under the
# assumption that any additions to it are because the special code is
# replaced by something which requires space (like icons)
tw += text_size(line).width + pos[:x]
unless contents_dummy
contents.dispose # Dispose dummy contents
self.contents = real_contents # Restore real contents
end
return tw
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Format Paragraph
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def mapf_format_paragraph(text, max_width = contents_width)
text = text.clone
# Create a Dummy Contents - I wanted to boost compatibility by using the
# default process method for escape codes. It may have the opposite effect,
# for some :(
real_contents = contents # Preserve Real Contents
self.contents = Bitmap.new(24, 24)
reset_font_settings
paragraph = ""
while !text.empty?
text.lstrip!
oline, nline, tw = mapf_format_by_line(text.clone, max_width)
# Replace old line with the new one
text.sub!(/#{Regexp.escape(oline)}/m, nline)
paragraph += text.slice!(/.*?(\n|$)/)
end
contents.dispose # Dispose dummy contents
self.contents = real_contents # Restore real contents
return paragraph
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Format By Line
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def mapf_format_by_line(text, max_width = contents_width)
oline, nline, tw = "", "", 0
loop do
# Format each word until reach the width limit
oline, nline, tw, done = mapf_format_by_word(text, nline, tw, max_width)
return oline, nline, tw if done
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Format By Word
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def mapf_format_by_word(text, line, tw, max_width)
return line, line, tw, true if text.nil? || text.empty?
# Extract next word
if text.sub!(/([ \t\r]*)(\S*)([\n\f]?)/, "") != nil
prespace, word, line_end = $1, $2, $3
ntw = mapf_calc_line_width(word, tw, true)
pw = contents.text_size(prespace).width
if (pw + ntw >= max_width)
# Insert
if line.empty?
# If one word takes entire line
return prespace + word, word + "\n", ntw, true
else
return line + prespace + word, line + "\n" + word, tw, true
end
else
line += prespace + word
tw = pw + ntw
# If the line is force ended, then end
return line, line, tw, true if !line_end.strip.empty?
end
else
return line, line, tw, true
end
return line, line, tw, false
end
end
class Window_Base
include MA_Window_ParagraphFormat
end
$imported[:"MA_ParagraphFormat_1.0"] = true
$imported[:"MA_ParagraphFormat_1.0.1"] = true
end
#==============================================================================
# ** Game Message
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# new public instance variables - ats_paragraph_formatting; paragraph_format;
# ats_alignment; append_text
# aliased method - all_text
#==============================================================================
class Game_Message
Game_ATS::CONFIG[:ats_formatting].keys.each { |key| attr_accessor key }
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * All Text
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_alltex_6hu7 all_text
def all_text(*args, &block)
result = maatsf_alltex_6hu7(*args, &block) # Call Original Method
# Look for the Paragraph Format Code
result.gsub!(/([\/\\])PF/i) { |match| self.paragraph_format = (match[0] == "\\"); "" }
# Remove natural \n if paragraph format is ON
result.gsub!(/\s*[\r\n\f]\s*/) {" "} if paragraph_format
result
end
end
#==============================================================================
# ** Game_Interpreter
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased methods - command_101; next_event_code
# new method - maatsf_same_message_conditions?
#==============================================================================
if !$imported[:ATS_MessageOptions]
class Game_Interpreter
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Display Text Message
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_disptext_3jf5 command_101
def command_101(*args, &block)
@ats_appending_text = $game_message.append_text
maatsf_disptext_3jf5(*args, &block) # Call Original Method
@ats_appending_text = false
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Next Event Code
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_nexcode_5rq9 next_event_code
def next_event_code(*args, &block)
result = maatsf_nexcode_5rq9(*args, &block) # Call Original Method
if @ats_appending_text && result == 101
if maats_same_message_conditions?(@index + 1)
@index += 1
result = next_event_code(*args, &block)
end
end
result
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Same Message Conditions?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maats_same_message_conditions?(list_index)
n_params = @list[list_index].parameters
if ($imported[:MA_CompositeGraphics] || $imported[:ATS_FaceOptions]) &&
@list[list_index + 1] && @list[list_index + 1].parameters[0][/^\\([AP])F\[(\d+)\]/i]
param = $2.to_i
actor = ($1 == 'A') ? $game_actors[param] : $game_party.members[param - 1]
return (actor.face_name == $game_message.face_name &&
actor.face_index == $game_message.face_index &&
n_params[2] == $game_message.background && n_params[3] == $game_message.position)
end
n_params[0] == $game_message.face_name && n_params[1] == $game_message.face_index &&
n_params[2] == $game_message.background && n_params[3] == $game_message.position
end
end
end
#==============================================================================
# *** Paragraph Formatting for Message Windows
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This module is included in Window_Message and Window_ScrollText
#==============================================================================
module ATS_Formatting_WindowMessage
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Convert Escape Characters
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maatsf_convert_escape_characters(text, *args, &block)
# Alignment
text.gsub!(/\eA\[([012])\]/i) { "\eALIGN\[#{$1}\]" }
text.gsub!(/\eA\[([LRC])\]/i) { "\eALIGN\[#{$1.upcase == 'L' ? 0 : $1.upcase == 'C' ? 1 : 2}\]" }
text.gsub!(/\ePN/i, "\f") # New Page
# New Line
text.gsub!(/\e(N|LB)/i, "\n") unless $imported[:ATS_SpecialMessageCodes]
text
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Paragraph New Line
#``````````````````````````````````````````````````````````````````````````
# This adds processing for paragraph format and alignment to these methods
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maatsf_paragraph_new_line(orig_method, text, pos, *args, &block)
tw = nil
tw = maatsf_set_next_line(text, pos) if $game_message.paragraph_format && !text.nil? && !text.empty?
orig_method.call(text, pos, *args, &block) # Call original Method
# Alignment
next_line = text[/^[^\n\f]*/]
align = maatsf_line_alignment(next_line)
if align != 0 # If not left aligned
if tw.nil?
@atsf_testing = true
tw = mapf_calc_line_width(next_line)
@atsf_testing = false
end
space = maatsf_total_line_width(pos[:y]) - tw
pos[:x] = [pos[:x] + (space / (align == 1 ? 2 : 1)), pos[:x]].max
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Paragraph Line
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maatsf_set_next_line(text, pos)
text.gsub!(/^[ \t\r\f]*/, "")
max_width = maatsf_total_line_width(pos[:y])
# Create a Dummy Contents
real_contents = contents # Preserve Real Contents
self.contents = Bitmap.new(24, 24)
self.contents.font = real_contents.font.dup
@atsf_testing = true
# Do everything
oline, nline, tw = mapf_format_by_line(text.clone, max_width)
# Replace old line with the new one
text.sub!(/#{Regexp.escape(oline)}/m, nline)
contents.dispose # Dispose dummy contents
self.contents = real_contents # Restore real contents
@atsf_testing = false
return tw
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Alignment
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maatsf_line_alignment(line)
line[/\eALIGN\[([012])\]/] != nil ? $1.to_i : $game_message.ats_alignment
end
end
#==============================================================================
# ** Window_Message
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased methods - convert_escape_characters; new_page; process_new_line;
# wait; wait_for_one_character; input_pause; process_escape_character
# new methods - maatsf_set_next_line; mapf_format_by_word;
# mapf_calc_line_width; maatsf_total_line_width;
# maatsf_line_alignment; maats_convert_escape_characters;
# maatsf_paragraph_new_line
#==============================================================================
class Window_Message
include ATS_Formatting_WindowMessage
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Convert Escape Characters
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if instance_methods(false).include?(:convert_escape_characters)
# If convert_escape_characters already defined in Window_Message, just alias
alias maatsf_convrtescchars_8ju5 convert_escape_characters
def convert_escape_characters(*args, &block)
maatsf_convert_escape_characters(maatsf_convrtescchars_8ju5(*args, &block))
end
else
# If convert_escape_characters undefined in Window_Message, call super method
def convert_escape_characters(*args, &block)
maatsf_convert_escape_characters(super(*args, &block))
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * New Page / Process New Line
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[:new_page, :process_new_line].each { |meth|
alias_method(:"maatsf_#{meth}_3wj9", meth)
define_method(meth) do |*args|
maatsf_paragraph_new_line(method(:"maatsf_#{meth}_3wj9"), *args)
end
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Wait / Wait for One Character / Process Input
#``````````````````````````````````````````````````````````````````````````
# Do not permit these to run when testing
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[:wait, :wait_for_one_character, :input_pause].each { |meth|
alias_method(:"maatsf_#{meth}_2hd4", meth)
define_method(meth) do |*args|
send(:"maatsf_#{meth}_2hd4", *args) unless @atsf_testing
end
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Process Escape Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_proceschar_4fq6 process_escape_character
def process_escape_character(code, text, *args, &block)
if code.upcase == 'ALIGN'
$game_message.ats_alignment = obtain_escape_param(text)
else
maatsf_proceschar_4fq6(code, text, *args, &block) # Call Original Method
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Total Line Width
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maatsf_total_line_width(y = 0)
contents_width - new_line_x
end
end
#==============================================================================
# ** Window_ScrollText
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Summary of Changes:
# aliased methods - convert_escape_characters; process_new_line;
# update_all_text_height
# new methods - maatsf_set_next_line; mapf_format_by_word;
# mapf_calc_line_width; maatsf_total_line_width;
# maatsf_line_alignment; maats_convert_escape_characters;
# maatsf_paragraph_new_line
#==============================================================================
class Window_ScrollText
include ATS_Formatting_WindowMessage
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Convert Escape Characters
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_convescchrs_3wv5 convert_escape_characters
def convert_escape_characters(*args, &block)
maatsf_convert_escape_characters(maatsf_convescchrs_3wv5(*args, &block))
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Process New Line
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_procenewlin_2gv5 process_new_line
def process_new_line(*args, &block)
maatsf_paragraph_new_line(method(:maatsf_procenewlin_2gv5), *args, &block)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Has to be done in process Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_updalltextheight_2sd8 update_all_text_height
def update_all_text_height(*args, &block)
text = convert_escape_characters(@text)
if $game_message.paragraph_format
new_text = ""
pos = { x: 4, y: 0, new_x: 4, height: fitting_height(1) }
while !text.nil? && !text.empty?
maatsf_set_next_line(text, pos)
if text.sub!(/^([^\n\f]*)([\n\f])/, "")
new_text += $1 + $2
else
new_text += text
break
end
end
@text = new_text
end
maatsf_updalltextheight_2sd8(*args, &block) # Run Original Method
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Process Escape Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias maatsf_processesc_2hk8 process_escape_character
def process_escape_character(code, text, *args, &block)
if code.upcase == 'ALIGN'
$game_message.ats_alignment = obtain_escape_param(text)
else
maatsf_processesc_2hk8(code, text, *args, &block) # Call Original Method
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Total Line Width
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def maatsf_total_line_width(y = 0)
contents_width
end
end
else
p "You have two copies of ATS: Formatting installed. Please remove one."
end
Credit
Thanks
- djDarkX, for a bug report.
- titan_strife, for a bug report.
- ThatRandomGuy00, for a bug report.
Support
Please post in this topic at RMRK if you require any assistance with this script at all. If you encounter any bugs or incompatibilities, please let me know about them so that I can fix them.
Known Compatibility Issues
It should be compatible with all other scripts in the ATS series, and it might also be compatible with other message systems as long as this script is placed below them in the Script Editor (though still above Main).
Spoiler for Yanfly's Victory Aftermath:
If using Yanfly's Victory Aftermath with the Formatting, then \n will not work in quotes to break lines. You can fix that in two ways (Note: In some older versions of the Victory Aftermath script, \n would not work at all. The following fixes apply only to versions of Yanfly's Victory Aftermath that are v. 1.04 or greater):
If you want to turn off paragraph formatting altogether, you can simply go to line 171 of the Victory Aftermath script and add /pf anywhere the following line:
HEADER_TEXT = "\e>\eC[6]%s\eC[0]\e<\n" # Always at start of messages.
Like this:
HEADER_TEXT = "/pf\e>\eC[6]%s\eC[0]\e<\n" # Always at start of messages.
Alternatively, if you have ATS: Formatting 1.0.3. or later, the \lb code can be used. So, if you want paragraph formatting to apply to the body of the quote but not to the header, you would change the same line and replace \n with \elb, like so:
HEADER_TEXT = "\e>\eC[6]%s\eC[0]\e<\elb" # Always at start of messages.
You can also use \lb in the notefields to break a line manually.