じ☆ve冰风 发表于 2026-7-27 18:08:20

Trilobytes Message System XP

Message System XP Version 1.00
Trilobytes 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]
查看完整版本: Trilobytes Message System XP