How to draw character's face

● ARCHIVED · READ-ONLY
Started by Demrottens 13 posts View original ↗
  1. I can't program in Ruby (I think this is the language that RPG Maker uses). After reading all the scripts (probably not well read enough) I kind of figured out how to do it

    Maybe you have to
    Code:
    draw_actor_face(actor.face_name, actor.face_index)
    I searched in google but could not find how to just draw the characters face on one corner of the screen
    I found a script that draws current battling characters face in the battle window or however it is called, so I took it and modified it so that I (thought I) could draw the characters face on the screen:

    Code:
    class Window_ActorCommand < Window_Command
      alias face_command_setup setup
      def setup(actor)
        face_command_setup(actor)
        draw_face_command
      end
      def window_width
        return 220
      end
      def item_rect(index)
        rect = Rect.new
        rect.width = 96
        rect.height = 96
        rect.x = 8
        rect.y = 8
        rect
      end
      def draw_face_command
        draw_actor_face(actor.face_name, actor.face_index)
      end
    end

    This is my result. I don't get any error of any kind but no face's shown so I think either I have to call that script from somewhere to execute it or I wrote it wrong (wich probably is the case)

    Any help with this? Just draw character's face on the top left corner of the screen. xD
  2. I've moved this thread to Script Support. Thank you.

  3. Are you wanting to have the face on the screen all the time? There are battle script that do that. It's the active battle I think, where you fight monsters on the map.
    If it's temporarily, check out Galv's Explorer Hud.
  4. Where do you plan to display this face image? On which scene? The map, or in some other menus?
    And which actor's face should be shown? The party leader's or someone else's?

    Without knowing these, there is no way to write a script for it.
  5. Roninator2 said:
    Are you wanting to have the face on the screen all the time? There are battle script that do that. It's the active battle I think, where you fight monsters on the map.
    If it's temporarily, check out Galv's Explorer Hud.
    I'm already using a ABS script but has no "show face" method or whatever
    Sixth said:
    Where do you plan to display this face image? On which scene? The map, or in some other menus?
    And which actor's face should be shown? The party leader's or someone else's?

    Without knowing these, there is no way to write a script for it.
    I want it on the upper left corner of the screen in the map scene, coordinates x=8, y=8 showing only party leader's face
  6. I made a little script for you:
    Spoiler


    This should do what you want. You can examine the script to see how can images be shown on the map scene, in case you need to display something else.
  7. Sixth said:
    I made a little script for you:
    Spoiler


    This should do what you want. You can examine the script to see how can images be shown on the map scene, in case you need to display something else.

    Thank you, BUT I still have something to say:
    I installed it, and executed the game, and no face was shown so I investigated and discovered that if you open the menu, it draws the face very nicely ans sweeeeeet. That is only when you start new game, if you load it works, AND that is because at the very beggining of the game, the first thing you see is a message of the main actor going like "Oh, what a tiring hard work day, I should go take a nap"
    So I noticed every time a message box is shown the face disapears, then you open menu (exit map scene) again, then close menu (enter map scene) and the face is drawn again, and keeps being drawn aaaaalll the time until another message box is open, then you have to open menu again. Then I will read all my installed scripts and game scripts, I may find something to fix this

    EDIT: Also forgot to say, if you place a "control switch" to activate the HUD after the message it does not work xD

    EDIT2: I have this YanFly's script for messages:

    YanFly's Message Script
    Code:
    #==============================================================================
    #
    # ▼ Yanfly Engine Ace - Ace Message System v1.05
    # -- Last Updated: 2012.01.13
    # -- Level: Normal
    # -- Requires: n/a
    #
    #==============================================================================
    
    $imported = {} if $imported.nil?
    $imported["YEA-MessageSystem"] = true
    
    #==============================================================================
    # ▼ Updates
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # 2012.07.21 - Fixed REGEXP error at line 824
    # 2012.01.13 - Bug Fixed: Negative tags didn't display other party members.
    # 2012.01.12 - Compatibility Update: Message Actor Codes
    # 2012.01.10 - Added Feature: \pic[x] text code.
    # 2012.01.04 - Bug Fixed: \ic tag was \ii. No longer the case.
    #            - Added: Scroll Text window now uses message window font.
    # 2011.12.31 - Started Script and Finished.
    #
    #==============================================================================
    # ▼ Introduction
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # While RPG Maker VX Ace certainly improved the message system a whole lot, it
    # wouldn't hurt to add in a few more features, such as name windows, converting
    # textcodes to write out the icons and/or names of items, weapons, armours, and
    # more in quicker fashion. This script also gives the developer the ability to
    # adjust the size of the message window during the game, give it a separate
    # font, and to give the player a text fast-forward feature.
    #
    #==============================================================================
    # ▼ Instructions
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # To install this script, open up your script editor and copy/paste this script
    # to an open slot below ▼ Materials/素材 but above ▼ Main. Remember to save.
    #
    # -----------------------------------------------------------------------------
    # Message Window text Codes - These go inside of your message window.
    # -----------------------------------------------------------------------------
    #  Default:    Effect:
    #    \v[x]     - Writes variable x's value.
    #    \n[x]     - Writes actor x's name.
    #    \p[x]     - Writes party member x's name.
    #    \g        - Writes gold currency name.
    #    \c[x]     - Changes the colour of the text to x.
    #    \i[x]     - Draws icon x at position of the text.
    #    \{        - Makes text bigger by 8 points.
    #    \}        - Makes text smaller by 8 points.
    #    \$        - Opens gold window.
    #    \.        - Waits 15 frames (quarter second).
    #    \|        - Waits 60 frames (a full second).
    #    \!        - Waits until key is pressed.
    #    \>        - Following text is instant.
    #    \<        - Following text is no longer instant.
    #    \^        - Skips to the next message.
    #    \\        - Writes a "\" in the window.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Wait:       Effect:
    #    \w[x]     - Waits x frames (60 frames = 1 second). Message window only.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  NameWindow: Effect:
    #    \n<x>     - Creates a name box with x string. Left side. *Note
    #    \nc<x>    - Creates a name box with x string. Centered. *Note
    #    \nr<x>    - Creates a name box with x string. Right side. *Note
    #
    #              *Note: Works for message window only.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Position:   Effect:
    #    \px[x]    - Sets x position of text to x.
    #    \py[x]    - Sets y position of text to y.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Picture:    Effect:
    #    \pic[x]   - Draws picture x from the Graphics\Pictures folder.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Outline:    Effect:
    #    \oc[x]    - Sets outline colour to x.
    #    \oo[x]    - Sets outline opacity to x.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Font:       Effect:
    #    \fr       - Resets all font changes.
    #    \fz[x]    - Changes font size to x.
    #    \fn[x]    - Changes font name to x.
    #    \fb       - Toggles font boldness.
    #    \fi       - Toggles font italic.
    #    \fo       - Toggles font outline.
    #    \fs       - Toggles font shadow.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Actor:      Effect:
    #    \af[x]    - Shows face of actor x. *Note
    #    \ac[x]    - Writes out actor's class name. *Note
    #    \as[x]    - Writes out actor's subclass name. Req: Class System. *Note
    #    \an[x]    - Writes out actor's nickname. *Note
    #
    #              *Note: If x is 0 or negative, it will show the respective
    #               party member's face instead.
    #                   0 - Party Leader
    #                  -1 - 1st non-leader member.
    #                  -2 - 2nd non-leader member. So on.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Names:      Effect:
    #    \nc[x]    - Writes out class x's name.
    #    \ni[x]    - Writes out item x's name.
    #    \nw[x]    - Writes out weapon x's name.
    #    \na[x]    - Writes out armour x's name.
    #    \ns[x]    - Writes out skill x's name.
    #    \nt[x]    - Writes out state x's name.
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    #  Icon Names: Effect:
    #    \ic[x]    - Writes out class x's name including icon. *
    #    \ii[x]    - Writes out item x's name including icon.
    #    \iw[x]    - Writes out weapon x's name including icon.
    #    \ia[x]    - Writes out armour x's name including icon.
    #    \is[x]    - Writes out skill x's name including icon.
    #    \it[x]    - Writes out state x's name including icon.
    #
    #              *Note: Requires YEA - Class System
    #
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    #
    # And those are the text codes added with this script. Keep in mind that some
    # of these text codes only work for the Message Window. Otherwise, they'll work
    # for help descriptions, actor biographies, and others.
    #
    #==============================================================================
    # ▼ Compatibility
    # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    # This script is made strictly for RPG Maker VX Ace. It is highly unlikely that
    # it will run with RPG Maker VX without adjusting.
    #
    #==============================================================================
    
    module YEA
      module MESSAGE
       
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # - General Message Settings -
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # The following below will adjust the basic settings and that will affect
        # the majority of the script. Adjust them as you see fit.
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # This button is the button used to make message windows instantly skip
        # forward. Hold down for the effect. Note that when held down, this will
        # speed up the messages, but still wait for the pauses. However, it will
        # automatically go to the next page when prompted.
        TEXT_SKIP = :A     # Input::A is the shift button on keyboard.
       
        # This variable adjusts the number of visible rows shown in the message
        # window. If you do not wish to use this feature, set this constant to 0.
        # If the row value is 0 or below, it will automatically default to 4 rows.
        VARIABLE_ROWS  = 21
       
        # This variable adjusts the width of the message window shown. If you do
        # not wish to use this feature, set this constant to 0. If the width value
        # is 0 or below, it will automatically default to the screen width.
        VARIABLE_WIDTH = 22
       
        # This is the amount of space that the message window will indent whenever
        # a face is used. Default: 112
        FACE_INDENT_X = 112
       
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # - Name Window Settings -
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # The name window is a window that appears outside of the main message
        # window box to display whatever text is placed inside of it like a name.
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        NAME_WINDOW_X_BUFFER = -20     # Buffer x position of the name window.
        NAME_WINDOW_Y_BUFFER = 0       # Buffer y position of the name window.
        NAME_WINDOW_PADDING  = 20      # Padding added to the horizontal position.
        NAME_WINDOW_OPACITY  = 255     # Opacity of the name window.
        NAME_WINDOW_COLOUR   = 6       # Text colour used by default for names.
       
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # - Message Font Settings -
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # Ace Message System separates the in-game system font form the message
        # font. Adjust the settings here for your fonts.
        #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
        # This array constant determines the fonts used. If the first font does not
        # exist on the player's computer, the next font in question will be used
        # in place instead and so on.
        MESSAGE_WINDOW_FONT_NAME = ["Verdana", "Arial", "Courier New"]
       
        # These adjust the other settings regarding the way the game font appears
        # including the font size, whether or not the font is bolded by default,
        # italic by default, etc.
        MESSAGE_WINDOW_FONT_SIZE    = 24       # Font size.
        MESSAGE_WINDOW_FONT_BOLD    = false    # Default bold?
        MESSAGE_WINDOW_FONT_ITALIC  = false    # Default italic?
        MESSAGE_WINDOW_FONT_OUTLINE = true     # Default outline?
        MESSAGE_WINDOW_FONT_SHADOW  = false    # Default shadow?
       
      end # MESSAGE
    end # YEA
    
    #==============================================================================
    # ▼ Editting anything past this point may potentially result in causing
    # computer damage, incontinence, explosion of user's head, coma, death, and/or
    # halitosis so edit at your own risk.
    #==============================================================================
    
    #==============================================================================
    # ■ Variable
    #==============================================================================
    
    module Variable
    
      #--------------------------------------------------------------------------
      # self.message_rows
      #--------------------------------------------------------------------------
      def self.message_rows
        return 4 if YEA::MESSAGE::VARIABLE_ROWS <= 0
        return 4 if $game_variables[YEA::MESSAGE::VARIABLE_ROWS] <= 0
        return $game_variables[YEA::MESSAGE::VARIABLE_ROWS]
      end
    
      #--------------------------------------------------------------------------
      # self.message_width
      #--------------------------------------------------------------------------
      def self.message_width
        return Graphics.width if YEA::MESSAGE::VARIABLE_WIDTH <= 0
        return Graphics.width if $game_variables[YEA::MESSAGE::VARIABLE_WIDTH] <= 0
        return $game_variables[YEA::MESSAGE::VARIABLE_WIDTH]
      end
    
    end # Variable
    
    #==============================================================================
    # ■ Game_Interpreter
    #==============================================================================
    
    class Game_Interpreter
    
      #--------------------------------------------------------------------------
      # overwrite method: command_101
      #--------------------------------------------------------------------------
      def command_101
        wait_for_message
        $game_message.face_name = @params[0]
        $game_message.face_index = @params[1]
        $game_message.background = @params[2]
        $game_message.position = @params[3]
        while continue_message_string?
          @index += 1
          if @list[@index].code == 401
            $game_message.add(@list[@index].parameters[0])
          end
          break if $game_message.texts.size >= Variable.message_rows
        end
        case next_event_code
        when 102
          @index += 1
          setup_choices(@list[@index].parameters)
        when 103
          @index += 1
          setup_num_input(@list[@index].parameters)
        when 104
          @index += 1
          setup_item_choice(@list[@index].parameters)
        end
        wait_for_message
      end
    
      #--------------------------------------------------------------------------
      # new method: continue_message_string?
      #--------------------------------------------------------------------------
      def continue_message_string?
        return true if next_event_code == 101 && Variable.message_rows > 4
        return next_event_code == 401
      end
    
    end # Game_Interpreter
    
    #==============================================================================
    # ■ Window_Base
    #==============================================================================
    
    class Window_Base < Window
    
      #--------------------------------------------------------------------------
      # new method: setup_message_font
      #--------------------------------------------------------------------------
      def setup_message_font
        @message_font = true
        change_color(normal_color)
        contents.font.out_color = Font.default_out_color
        contents.font.name = YEA::MESSAGE::MESSAGE_WINDOW_FONT_NAME
        contents.font.size = YEA::MESSAGE::MESSAGE_WINDOW_FONT_SIZE
        contents.font.bold = YEA::MESSAGE::MESSAGE_WINDOW_FONT_BOLD
        contents.font.italic = YEA::MESSAGE::MESSAGE_WINDOW_FONT_ITALIC
        contents.font.outline = YEA::MESSAGE::MESSAGE_WINDOW_FONT_OUTLINE
        contents.font.shadow = YEA::MESSAGE::MESSAGE_WINDOW_FONT_SHADOW
      end
    
      #--------------------------------------------------------------------------
      # alias method: reset_font_settings
      #--------------------------------------------------------------------------
      alias window_base_reset_font_settings_ams reset_font_settings
      def reset_font_settings
        if @message_font
          setup_message_font
        else
          window_base_reset_font_settings_ams
          contents.font.out_color = Font.default_out_color
          contents.font.outline = Font.default_outline
          contents.font.shadow = Font.default_shadow
        end
      end
    
      #--------------------------------------------------------------------------
      # alias method: convert_escape_characters
      #--------------------------------------------------------------------------
      alias window_base_convert_escape_characters_ams convert_escape_characters
      def convert_escape_characters(text)
        result = window_base_convert_escape_characters_ams(text)
        result = convert_ace_message_system_new_escape_characters(result)
        return result
      end
    
      #--------------------------------------------------------------------------
      # new method: convert_ace_message_system_new_escape_characters
      #--------------------------------------------------------------------------
      def convert_ace_message_system_new_escape_characters(result)
        #---
        result.gsub!(/\eFR/i) { "\eAMSF[0]" }
        result.gsub!(/\eFB/i) { "\eAMSF[1]" }
        result.gsub!(/\eFI/i) { "\eAMSF[2]" }
        result.gsub!(/\eFO/i) { "\eAMSF[3]" }
        result.gsub!(/\eFS/i) { "\eAMSF[4]" }
        #---
        result.gsub!(/\eAC\[([-+]?\d+)\]/i) { escape_actor_class_name($1.to_i) }
        result.gsub!(/\eAS\[([-+]?\d+)\]/i) { escape_actor_subclass_name($1.to_i) }
        result.gsub!(/\eAN\[([-+]?\d+)\]/i) { escape_actor_nickname($1.to_i) }
        #---
        result.gsub!(/\eNC\[(\d+)\]/i) { $data_classes[$1.to_i].name }
        result.gsub!(/\eNI\[(\d+)\]/i) { $data_items[$1.to_i].name }
        result.gsub!(/\eNW\[(\d+)\]/i) { $data_weapons[$1.to_i].name }
        result.gsub!(/\eNA\[(\d+)\]/i) { $data_armors[$1.to_i].name }
        result.gsub!(/\eNS\[(\d+)\]/i) { $data_skills[$1.to_i].name }
        result.gsub!(/\eNT\[(\d+)\]/i) { $data_states[$1.to_i].name }
        #---
        result.gsub!(/\eIC\[(\d+)\]/i) { escape_icon_item($1.to_i, :class) }
        result.gsub!(/\eII\[(\d+)\]/i) { escape_icon_item($1.to_i, :item) }
        result.gsub!(/\eIW\[(\d+)\]/i) { escape_icon_item($1.to_i, :weapon) }
        result.gsub!(/\eIA\[(\d+)\]/i) { escape_icon_item($1.to_i, :armour) }
        result.gsub!(/\eIS\[(\d+)\]/i) { escape_icon_item($1.to_i, :skill) }
        result.gsub!(/\eIT\[(\d+)\]/i) { escape_icon_item($1.to_i, :state) }
        #---
        return result
      end
    
      #--------------------------------------------------------------------------
      # new method: escape_actor_class_name
      #--------------------------------------------------------------------------
      def escape_actor_class_name(actor_id)
        actor_id = $game_party.members[actor_id.abs].id if actor_id <= 0
        actor = $game_actors[actor_id]
        return "" if actor.nil?
        return actor.class.name
      end
    
      #--------------------------------------------------------------------------
      # new method: actor_subclass_name
      #--------------------------------------------------------------------------
      def escape_actor_subclass_name(actor_id)
        return "" unless $imported["YEA-ClassSystem"]
        actor_id = $game_party.members[actor_id.abs].id if actor_id <= 0
        actor = $game_actors[actor_id]
        return "" if actor.nil?
        return "" if actor.subclass.nil?
        return actor.subclass.name
      end
    
      #--------------------------------------------------------------------------
      # new method: escape_actor_nickname
      #--------------------------------------------------------------------------
      def escape_actor_nickname(actor_id)
        actor_id = $game_party.members[actor_id.abs].id if actor_id <= 0
        actor = $game_actors[actor_id]
        return "" if actor.nil?
        return actor.nickname
      end
    
      #--------------------------------------------------------------------------
      # new method: escape_icon_item
      #--------------------------------------------------------------------------
      def escape_icon_item(data_id, type)
        case type
        when :class
          return "" unless $imported["YEA-ClassSystem"]
          icon = $data_classes[data_id].icon_index
          name = $data_items[data_id].name
        when :item
          icon = $data_items[data_id].icon_index
          name = $data_items[data_id].name
        when :weapon
          icon = $data_weapons[data_id].icon_index
          name = $data_weapons[data_id].name
        when :armour
          icon = $data_armors[data_id].icon_index
          name = $data_armors[data_id].name
        when :skill
          icon = $data_skills[data_id].icon_index
          name = $data_skills[data_id].name
        when :state
          icon = $data_states[data_id].icon_index
          name = $data_states[data_id].name
        else; return ""
        end
        text = "\eI[#{icon}]" + name
        return text
      end
    
      #--------------------------------------------------------------------------
      # alias method: process_escape_character
      #--------------------------------------------------------------------------
      alias window_base_process_escape_character_ams process_escape_character
      def process_escape_character(code, text, pos)
        case code.upcase
        #---
        when 'FZ'
          contents.font.size = obtain_escape_param(text)
        when 'FN'
          text.sub!(/\[(.*?)\]/, "")
          font_name = $1.to_s
          font_name = Font.default_name if font_name.nil?
          contents.font.name = font_name.to_s
        #---
        when 'OC'
          colour = text_color(obtain_escape_param(text))
          contents.font.out_color = colour
        when 'OO'
          contents.font.out_color.alpha = obtain_escape_param(text)
        #---
        when 'AMSF'
          case obtain_escape_param(text)
          when 0; reset_font_settings
          when 1; contents.font.bold = !contents.font.bold
          when 2; contents.font.italic = !contents.font.italic
          when 3; contents.font.outline = !contents.font.outline
          when 4; contents.font.shadow = !contents.font.shadow
          end
        #---
        when 'PX'
          pos[:x] = obtain_escape_param(text)
        when 'PY'
          pos[:y] = obtain_escape_param(text)
        #---
        when 'PIC'
          text.sub!(/\[(.*?)\]/, "")
          bmp = Cache.picture($1.to_s)
          rect = Rect.new(0, 0, bmp.width, bmp.height)
          contents.blt(pos[:x], pos[:y], bmp, rect)
        #---
        else
          window_base_process_escape_character_ams(code, text, pos)
        end
      end
    
    end # Window_Base
    
    #==============================================================================
    # ■ Window_ChoiceList
    #==============================================================================
    
    class Window_ChoiceList < Window_Command
    
      #--------------------------------------------------------------------------
      # alias method: initialize
      #--------------------------------------------------------------------------
      alias window_choicelist_initialize_ams initialize
      def initialize(message_window)
        window_choicelist_initialize_ams(message_window)
        setup_message_font
      end
    
    end # Window_ChoiceList
    
    #==============================================================================
    # ■ Window_ScrollText
    #==============================================================================
    
    class Window_ScrollText < Window_Base
    
      #--------------------------------------------------------------------------
      # alias method: initialize
      #--------------------------------------------------------------------------
      alias window_scrolltext_initialize_ams initialize
      def initialize
        window_scrolltext_initialize_ams
        setup_message_font
      end
    
    end # Window_ScrollText
    
    #==============================================================================
    # ■ Window_NameMessage
    #==============================================================================
    
    class Window_NameMessage < Window_Base
    
      #--------------------------------------------------------------------------
      # initialize
      #--------------------------------------------------------------------------
      def initialize(message_window)
        @message_window = message_window
        super(0, 0, Graphics.width, fitting_height(1))
        self.opacity = YEA::MESSAGE::NAME_WINDOW_OPACITY
        self.z = @message_window.z + 1
        self.openness = 0
        setup_message_font
        @close_counter = 0
        deactivate
      end
    
      #--------------------------------------------------------------------------
      # update
      #--------------------------------------------------------------------------
      def update
        super
        return if self.active
        return if self.openness == 0
        return if @closing
        @close_counter -= 1
        return if @close_counter > 0
        close
      end
    
      #--------------------------------------------------------------------------
      # start_close
      #--------------------------------------------------------------------------
      def start_close
        @close_counter = 4
        deactivate
      end
    
      #--------------------------------------------------------------------------
      # force_close
      #--------------------------------------------------------------------------
      def force_close
        @close_counter = 0
        deactivate
        close
      end
    
      #--------------------------------------------------------------------------
      # start
      #--------------------------------------------------------------------------
      def start(text, x_position)
        @text = text.clone
        set_width
        create_contents
        set_x_position(x_position)
        set_y_position
        refresh
        activate
        open
      end
    
      #--------------------------------------------------------------------------
      # set_width
      #--------------------------------------------------------------------------
      def set_width
        text = @text.clone
        dw = standard_padding * 2 + text_size(text).width
        dw += YEA::MESSAGE::NAME_WINDOW_PADDING * 2
        dw += calculate_size(text.slice!(0, 1), text) until text.empty?
        self.width = dw
      end
    
      #--------------------------------------------------------------------------
      # calculate_size
      #--------------------------------------------------------------------------
      def calculate_size(code, text)
        case code
        when "\e"
          return calculate_escape_code_width(obtain_escape_code(text), text)
        else
          return 0
        end
      end
    
      #--------------------------------------------------------------------------
      # calculate_escape_code_width
      #--------------------------------------------------------------------------
      def calculate_escape_code_width(code, text)
        dw = -text_size("\e").width - text_size(code).width
        case code.upcase
        when 'C', 'OC', 'OO'
          dw += -text_size("[" + obtain_escape_param(text).to_s + "]").width
          return dw
        when 'I'
          dw += -text_size("[" + obtain_escape_param(text).to_s + "]").width
          dw += 24
          return dw
        when '{'
          make_font_bigger
        when '}'
          make_font_smaller
        when 'FZ'
          contents.font.size = obtain_escape_param(text)
        when 'FN'
          text.sub!(/\[(.*?)\]/, "")
          font_name = $1.to_s
          font_name = Font.default_name if font_name.nil?
          contents.font.name = font_name.to_s
        when 'AMSF'
          case obtain_escape_param(text)
          when 0; reset_font_settings
          when 1; contents.font.bold = !contents.font.bold
          when 2; contents.font.italic = !contents.font.italic
          when 3; contents.font.outline = !contents.font.outline
          when 4; contents.font.shadow = !contents.font.shadow
          end
        else
          return dw
        end
      end
    
      #--------------------------------------------------------------------------
      # set_y_position
      #--------------------------------------------------------------------------
      def set_x_position(x_position)
        case x_position
        when 1 # Left
          self.x = @message_window.x
          self.x += YEA::MESSAGE::NAME_WINDOW_X_BUFFER
        when 2 # 3/10
          self.x = @message_window.x
          self.x += @message_window.width * 3 / 10
          self.x -= self.width / 2
        when 3 # Center
          self.x = @message_window.x
          self.x += @message_window.width / 2
          self.x -= self.width / 2
        when 4 # 7/10
          self.x = @message_window.x
          self.x += @message_window.width * 7 / 10
          self.x -= self.width / 2
        when 5 # Right
          self.x = @message_window.x + @message_window.width
          self.x -= self.width
          self.x -= YEA::MESSAGE::NAME_WINDOW_X_BUFFER
        end
        self.x = [[self.x, Graphics.width - self.width].min, 0].max
      end
    
      #--------------------------------------------------------------------------
      # set_y_position
      #--------------------------------------------------------------------------
      def set_y_position
        case $game_message.position
        when 0
          self.y = @message_window.height
          self.y -= YEA::MESSAGE::NAME_WINDOW_Y_BUFFER
        else
          self.y = @message_window.y - self.height
          self.y += YEA::MESSAGE::NAME_WINDOW_Y_BUFFER
        end
      end
    
      #--------------------------------------------------------------------------
      # refresh
      #--------------------------------------------------------------------------
      def refresh
        contents.clear
        reset_font_settings
        @text = sprintf("\eC[%d]%s", YEA::MESSAGE::NAME_WINDOW_COLOUR, @text)
        draw_text_ex(YEA::MESSAGE::NAME_WINDOW_PADDING, 0, @text)
      end
    
    end # Window_NameMessage
    
    #==============================================================================
    # ■ Window_Message
    #==============================================================================
    
    class Window_Message < Window_Base
    
      #--------------------------------------------------------------------------
      # alias method: initialize
      #--------------------------------------------------------------------------
      alias window_message_initialize_ams initialize
      def initialize
        window_message_initialize_ams
        setup_message_font
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: window_width
      #--------------------------------------------------------------------------
      def window_width
        return Variable.message_width
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: window_height
      #--------------------------------------------------------------------------
      def window_height
        return fitting_height(Variable.message_rows)
      end
    
      #--------------------------------------------------------------------------
      # alias method: create_all_windows
      #--------------------------------------------------------------------------
      alias window_message_create_all_windows_ams create_all_windows
      def create_all_windows
        window_message_create_all_windows_ams
        @name_window = Window_NameMessage.new(self)
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: create_back_bitmap
      #--------------------------------------------------------------------------
      def create_back_bitmap
        @back_bitmap = Bitmap.new(width, height)
        rect1 = Rect.new(0, 0, Graphics.width, 12)
        rect2 = Rect.new(0, 12, Graphics.width, fitting_height(4) - 24)
        rect3 = Rect.new(0, fitting_height(4) - 12, Graphics.width, 12)
        @back_bitmap.gradient_fill_rect(rect1, back_color2, back_color1, true)
        @back_bitmap.fill_rect(rect2, back_color1)
        @back_bitmap.gradient_fill_rect(rect3, back_color1, back_color2, true)
      end
    
      #--------------------------------------------------------------------------
      # alias method: dispose_all_windows
      #--------------------------------------------------------------------------
      alias window_message_dispose_all_windows_ams dispose_all_windows
      def dispose_all_windows
        window_message_dispose_all_windows_ams
        @name_window.dispose
      end
    
      #--------------------------------------------------------------------------
      # alias method: update_all_windows
      #--------------------------------------------------------------------------
      alias window_message_update_all_windows_ams update_all_windows
      def update_all_windows
        window_message_update_all_windows_ams
        @name_window.update
        @name_window.back_opacity = self.back_opacity
        @name_window.opacity = self.opacity
      end
    
      #--------------------------------------------------------------------------
      # alias method: update_show_fast
      #--------------------------------------------------------------------------
      alias window_message_update_show_fast_ams update_show_fast
      def update_show_fast
        @show_fast = true if Input.press?(YEA::MESSAGE::TEXT_SKIP)
        window_message_update_show_fast_ams
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: input_pause
      #--------------------------------------------------------------------------
      def input_pause
        self.pause = true
        wait(10)
        Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C) ||
          Input.press?(YEA::MESSAGE::TEXT_SKIP)
        Input.update
        self.pause = false
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: convert_escape_characters
      #--------------------------------------------------------------------------
      def convert_escape_characters(text)
        result = super(text.to_s.clone)
        result = namebox_escape_characters(result)
        result = message_escape_characters(result)
        return result
      end
    
      #--------------------------------------------------------------------------
      # new method: namebox_escape_characters
      #--------------------------------------------------------------------------
      def namebox_escape_characters(result)
        result.gsub!(/\eN\<(.+?)\>/i)  { namewindow($1, 1) }
        result.gsub!(/\eN1\<(.+?)\>/i) { namewindow($1, 1) }
        result.gsub!(/\eN2\<(.+?)\>/i) { namewindow($1, 2) }
        result.gsub!(/\eNC\<(.+?)\>/i) { namewindow($1, 3) }
        result.gsub!(/\eN3\<(.+?)\>/i) { namewindow($1, 3) }
        result.gsub!(/\eN4\<(.+?)\>/i) { namewindow($1, 4) }
        result.gsub!(/\eN5\<(.+?)\>/i) { namewindow($1, 5) }
        result.gsub!(/\eNR\<(.+?)\>/i) { namewindow($1, 5) }
        return result
      end
    
      #--------------------------------------------------------------------------
      # new method: namebox
      #--------------------------------------------------------------------------
      def namewindow(text, position)
        @name_text = text
        @name_position = position
        return ""
      end
    
      #--------------------------------------------------------------------------
      # new method: message_escape_characters
      #--------------------------------------------------------------------------
      def message_escape_characters(result)
        result.gsub!(/\eAF\[(-?\d+)]/i) { change_face($1.to_i) }
        return result
      end
    
      #--------------------------------------------------------------------------
      # new method: change_face
      #--------------------------------------------------------------------------
      def change_face(actor_id)
        actor_id = $game_party.members[actor_id.abs].id if actor_id <= 0
        actor = $game_actors[actor_id]
        return "" if actor.nil?
        $game_message.face_name = actor.face_name
        $game_message.face_index = actor.face_index
        return ""
      end
    
      #--------------------------------------------------------------------------
      # alias method: new_page
      #--------------------------------------------------------------------------
      alias window_message_new_page_ams new_page
      def new_page(text, pos)
        adjust_message_window_size
        window_message_new_page_ams(text, pos)
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: new_line_x
      #--------------------------------------------------------------------------
      def new_line_x
        return $game_message.face_name.empty? ? 0 : YEA::MESSAGE::FACE_INDENT_X
      end
    
      #--------------------------------------------------------------------------
      # new method: adjust_message_window_size
      #--------------------------------------------------------------------------
      def adjust_message_window_size
        self.height = window_height
        self.width = window_width
        create_contents
        update_placement
        self.x = (Graphics.width - self.width) / 2
        start_name_window
      end
    
      #--------------------------------------------------------------------------
      # new method: clear_name_window
      #--------------------------------------------------------------------------
      def clear_name_window
        @name_text = ""
        @name_position = 0
      end
    
      #--------------------------------------------------------------------------
      # new method: start_name_window
      #--------------------------------------------------------------------------
      def start_name_window
        return if @name_text == ""
        @name_window.start(@name_text, @name_position)
      end
    
      #--------------------------------------------------------------------------
      # overwrite method: fiber_main
      #--------------------------------------------------------------------------
      def fiber_main
        $game_message.visible = true
        update_background
        update_placement
        loop do
          process_all_text if $game_message.has_text?
          process_input
          $game_message.clear
          @gold_window.close
          @name_window.start_close
          Fiber.yield
          break unless text_continue?
        end
        close_and_wait
        $game_message.visible = false
        @fiber = nil
      end
    
      #--------------------------------------------------------------------------
      # alias method: open_and_wait
      #--------------------------------------------------------------------------
      alias window_message_open_and_wait_ams open_and_wait
      def open_and_wait
        clear_name_window
        adjust_message_window_size
        window_message_open_and_wait_ams
      end
    
      #--------------------------------------------------------------------------
      # alias method: close_and_wait
      #--------------------------------------------------------------------------
      alias window_message_close_and_wait_ams close_and_wait
      def close_and_wait
        @name_window.force_close
        window_message_close_and_wait_ams
      end
    
      #--------------------------------------------------------------------------
      # alias method: all_close?
      #--------------------------------------------------------------------------
      alias window_message_all_close_ams all_close?
      def all_close?
        return window_message_all_close_ams && @name_window.close?
      end
    
      #--------------------------------------------------------------------------
      # alias method: process_escape_character
      #--------------------------------------------------------------------------
      alias window_message_process_escape_character_ams process_escape_character
      def process_escape_character(code, text, pos)
        case code.upcase
        when 'W' # Wait
          wait(obtain_escape_param(text))
        else
          window_message_process_escape_character_ams(code, text, pos)
        end
      end
    
    end # Window_Message
    
    #==============================================================================
    #
    # ▼ End of File
    #
    #==============================================================================

    So there's a bunch of tags you can use to enhance messages, it is the only thing related to messages I have
  8. Updated the script, it should work now.
  9. Sixth said:
    Updated the script, it should work now.
    Hohohoo! Let's try and see....NICE! It does absolutely everything I needed...LOVELY!!
    This was not even absolutely necesary for the game, just an enhancement. And you did it for me, and the generations to come hahah THANK YOU
    Really helpful you are!

    Hey hey! For how long have you been working with ruby (I think it is the language RMVXA uses)?
  10. I would like to be as useful as you....okay, time to practice!
  11. Demrottens said:
    For how long have you been working with ruby (I think it is the language RMVXA uses)?
    Around 3 years (around 8 to 12 hours coding daily for the last 2 years).
    RMVXA uses Ruby, yes, but sadly, it is an older version (v1.9.2), so a lot of functions from the newer versions are not available.
    Regardless, it is still Ruby, so that's the syntax you will need to learn for RMVXA.
    It needs a lot of practice to get used to, but after a few months, it will get way easier and faster to make what you want.
    Although, if you are not yet into Ruby, I suggest you switch to JavaScript and RMMV, since you could do more in that engine (performance-wise, RMMV is way better), and JavaScript in general is way more used for other engines and general programming.
    That is, if you are not too far in your RMVXA project yet, so you can move your project over to RMMV easily.
  12. Sixth said:
    Around 3 years (around 8 to 12 hours coding daily for the last 2 years).
    RMVXA uses Ruby, yes, but sadly, it is an older version (v1.9.2), so a lot of functions from the newer versions are not available.
    Regardless, it is still Ruby, so that's the syntax you will need to learn for RMVXA.
    It needs a lot of practice to get used to, but after a few months, it will get way easier and faster to make what you want.
    Although, if you are not yet into Ruby, I suggest you switch to JavaScript and RMMV, since you could do more in that engine (performance-wise, RMMV is way better), and JavaScript in general is way more used for other engines and general programming.
    That is, if you are not too far in your RMVXA project yet, so you can move your project over to RMMV easily.
    Nice, I surely will use many months of practice.
    Sadly I can not move my project to MV because I am already way too far on my current project, but it would be nice, since I know a bit of Java
    Anyway, thank you!