[VXA] Magic Kingdom - The First Story [VXA]

13»

Comments

  • StupidDonutStupidDonut Posts: 1,196Registered
    Dự án đang được phục hồi bởi @mr.rpg.700
  • ttnghia195ttnghia195 Posts: 58Registered
    Cho mình xin demo script trang bị thay đổi theo đồ mặc được không bạn
  • StupidDonutStupidDonut Posts: 1,196Registered
    [chapter]Scripts[/chapter]
    Add 3 script này vào
    1
    #==============================================================================
    # Composite Graphics / Visual Equipment + FenixFyrex's MultiFrame Sprites
    # Compatibility Patch
    # Version: 1.0
    # Author: modern algebra (rmrk.net)
    # Date: January 15, 2012
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Instructions:
    #
    # This script should be inserted into its own slot in the Script Editor,
    # above Main but below the Composite Graphics script.
    #
    # Note that in order for a multiframe sprite to show properly if composing
    # graphics, then every graphic in the composite must have the special code.
    #==============================================================================

    if $imported[:MA_CompositeGraphics]
    module Cache
    # alias macgve_make_unique_name
    class << self
    alias macgve_gencomp_mkuniqname_4df2 macgve_make_unique_name
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Make Unique Name
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_make_unique_name(cg_array = [], *args)
    result = macgve_gencomp_mkuniqname_4df2(cg_array, *args) # Call Original Method
    # If using FenixFyrex's Custom Sprites script
    if defined?(FyxA::CustomSprites::Patterns)
    FyxA::CustomSprites::Patterns.keys.each {|pattern|
    result += pattern if cg_array.all?{|cg| cg.filename.include?(pattern)} }
    end
    result
    end
    end
    else
    p "Error: Composite Graphics + FenixFyrex's MultiFrame Sprites;\n
    the Compatibility Patch must be inserted below the Composite Graphics\n
    in the Script Editor. It must still be above Main though."
    end
    2
    #==============================================================================
    # Composite Graphics / Visual Equipment + MSX XP Characters on VX/Ace
    # Compatibility Patch
    # Version: 1.0
    # Author: modern algebra (rmrk.net)
    # Date: January 17, 2012
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Instructions:
    #
    # This script should be inserted into its own slot in the Script Editor,
    # above Main but below the Composite Graphics script.
    #
    # Note that in order for an XP sprite to show properly if composing
    # graphics, then every graphic in the composite must have the $xp code.
    #==============================================================================

    if $imported[:MA_CompositeGraphics]
    module Cache
    # alias macgve_make_unique_name
    class << self
    alias macgve_msxxponacecomp_uniqname_5fr1 macgve_make_unique_name
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Make Unique Name
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_make_unique_name(cg_array = [], *args)
    # Call Original Method
    result = macgve_msxxponacecomp_uniqname_5fr1(cg_array, *args)
    # Set If all graphics in composite have special $xp code
    result += "$xp" if cg_array.all?{|cg| cg.filename.include?("$xp") }
    result
    end
    end
    else
    p "Error: Composite Graphics + MSX XP Characters on VX/VX Ace;\n
    the Compatibility Patch must be inserted below the Composite Graphics\n
    in the Script Editor. It must still be above Main though."
    end
    3
    #==============================================================================
    # Composite Graphics / Visual Equipment
    # Version: 1.0.1
    # Author: modern algebra (rmrk.net)
    # Date: January 13, 2013
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Description:
    #
    # This script allows you to "compose" face and character graphics out of
    # multiple graphics. This permits you to make it so that equipment worn by
    # a character can change the appearance of that actor's sprite and/or face.
    #
    # Unlike my VX version, this script has a lot of new and improved features,
    # including, but not limited to: support for faces and not just character
    # sprites; a more flexible configuration scheme; the ability to set one
    # equipment to draw different graphics onto different actors (useful, for
    # instance, if you want an equipment to show a different graphic on males
    # than it would on females).
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Instructions:
    #
    # Paste this script into its own slot in the Script Editor (F11), above Main
    # but below Materials.
    #
    # I hope that this script is fairly straightforward to set up. The
    # configuration may look daunting at first, and I have obviously gone a bit
    # overboard on the volume of instructions I gave, but I trust that once you
    # take a look you will find it to be quite easy and that really, all the
    # codes are basically identical. I will start by going over how to setup
    # actors, then move on to equipment, and then move on to events.
    #``````````````````````````````````````````````````````````````````````````````
    # Actors:
    #
    # The first thing to mention about actors is that the default character
    # sprite is retained, so if the face or character sprite you setup there is
    # sufficient, you do not have to spend much time configuring actors.
    #
    # There are three codes you can use in an Actor's note box. Of these, \cc
    # and \cf are identical as to how they are configured - the only difference
    # is that \cc is setting up a character sprite while \cf is setting up a
    # face. For that reason, I will go over these codes together. The general
    # format for these codes are as follows (note that where there are numbers,
    # such as 0 or 255, then that simply means that is the default value of that
    # parameter - that is what you replace when you are setting it). It may seem
    # a little daunting at first, but note that only the filename is a required
    # parameter - the rest are just additional features.
    #
    # \cc["filename", i0, h0, o255, z0, r0]
    # \cf["filename", i0, h0, o255, z0, r0]
    #
    # "filename" : this should be the name of the character or face file you
    # want to load. You MUST put the quotation marks around it. Ie. if you
    # wanted to load a character graphic from Actor1, you would put "Actor1"
    # i0 : this is the index of the character or face you want in the
    # characterset or faceset. The indices correspond to a particular
    # graphic in the characterset or faceset, in the following manner:
    # 0 1 2 3
    # 4 5 6 7
    # So if you want the third face in a faceset, you would put i2. Note
    # that you can exclude the i and just put 2.
    # h0 : this allows you to change the hue of a character or face
    # graphic you select. It can be anything between 0 and 360. Ie. h65
    # would change the hue by 65 degrees.
    # o255 : this allows you to change the transparency of the character
    # or face graphic selected. 255 is fully opaque, while 0 is fully
    # transparent. Ie. o128 would add the face graphic but make it half
    # see-through.
    # z0 : this determines the order in which each of the graphics in
    # a composite set are drawn. Those with lower z values are drawn before
    # ones with higher z values. So, if you want to make sure that the hair
    # is drawn over the skin, you need to set it so that the z value is
    # higher. This can also be negative. Example: if you have four graphics
    # on an actor, one with z-2, one with z2, one with z0, and one with z4,
    # then the z-2 will be drawn first, then the z0, then the z2, and then
    # the z4.
    # r0 : The R-code is a way of setting up graphics that are
    # replaced if one with a greater r-code is applied. It is useful for
    # instance, if you want your actor to normally have a full head of hair,
    # but want the hair to be removed if an actor is wearing a helmet. In
    # that case, all you need to do is make sure they have the same r-code.
    # Graphics with r-code of 0 all show up and are not replaced.
    #
    # There are a lot of options here, but I note that you only need to fill in
    # the filename and the rest of the parameters will default to the value above.
    # In other words, if you want the hue to be 0, opacity to be 255, and R-code
    # to to be 0, then you could exclude them all together and just specify the
    # filename, index, and z value. Additionally, I should note that the default
    # graphic of an actor you set through the normal way has only the filename and
    # index set - the rest of the values are all default.
    #
    # EXAMPLES:
    # \cc["Actor1", 2]
    # This will set it so that the third character graphic in the "Actor1"
    # character set is drawn onto the character. Since no other values are
    # set, they default to h0, o255, z0, r0.
    # \cf["BackHair1", 3, z-1, h105, r1]
    # This will set it so that the fourth face graphic in the "BackHair1"
    # faceset will have its hue changed by 105 degrees and then drawn onto
    # the actor's face graphic. Since it's z is -1, it will be drawn below
    # anything with a higher z value, including the default face. It's r-code
    # is 1, so if the actor equips anything else that has an r-code of 1,
    # this graphic will not show up at all. Since the opacity is not set, it
    # defaults to 255.
    #
    # There is only one further setting you can configure in the Actor notebox,
    # and it will probably make a little more sense once we look at equipment,
    # but it is the following:
    #
    # \ct[x, y, ..., z]
    #
    # where x, y, and z are just a series of integers. What this feature does is
    # set this actor's composite types, which will let you make equipments that
    # draw different graphics depending on which actor is equipping the item. As
    # I mentioned, this will become clearer once we look at equipment. Note that
    # type 0 is automatically applied to all actors, and will be drawn on all
    # actors.
    #
    # EXAMPLES:
    # \ct[2, 5]
    # This actor has composite sets 2 and 5, so any equipment graphics of
    # those types will be drawn on this actor.
    #``````````````````````````````````````````````````````````````````````````````
    # Weapons & Armor:
    #
    # The codes for equipment are, in almost every respect, the same as that for
    # actors. The only difference is that you have the option to set "type" for
    # each graphic, in which case that graphic will only be drawn on an actor
    # equipping this weapon or armor if that actor has the correct type. To set
    # this, you use this code:
    #
    # \cc0["filename", i0, h0, o255, z0, r0]
    # \cf0["filename", i0, h0, o255, z0, r0]
    #
    # As you can see, the stuff inside the square brackets is exactly the same
    # as for actors. The difference lies in the number you place which lies
    # directly before the square brackets. It is optional - if you do not place
    # a number there at all (or if you put 0 there) then it will apply to every
    # actor who equips the weapon or armor. However, if you put any integer above
    # 0, then it will only apply to actors who have that ID listed in their \ct[]
    # code.
    #
    # EXAMPLE:
    # \cf["Helmet1", 2, z1, r1]
    # Any actor who equips this item will have the 3rd graphic in the
    # "Helmet1" faceset drawn oon their face. If that actor has as one of its
    # base graphics something with an r-code of 1, then that will be erased and
    # only the Helmet will show up.
    # \cc4["Actor1", 5]
    # The 6th character in the "Actor1" characterset will be drawn onto an
    # an actor when he or she equips this item, but only if 4 is in that
    # actor's \ct[] code.
    #``````````````````````````````````````````````````````````````````````````````
    # Events:
    #
    # You can also set up events to use composite characters, though not faces.
    # To do so, you need to create a comment at the very top of a new page (must
    # be the first line in the page), and in that comment you can use the exact
    # same character codes as you can for actors:
    #
    # \cc["filename", i0, h0, o255, z0, r0]
    #
    # It is the exact same as with Actors. Additionally, you can use the
    # following codes:
    # \cc[a1] - This allows you to set an event to the composite character of
    # the actor with the specified ID. All you do is replace the 1 with the
    # ID of the actor you want, so \cc[a5], for example, would make it so
    # this event looked exactly like Actor 5, including equipment.
    # \cc[p1] - This is similar, except the index you give corresponds
    # instead to the actor in that position in the party. It starts at one,
    # so \cc[p1] would show the party leader, \cc[p2] the second member in
    # the party, etc.
    # \cc[w1] - This will show the graphic you set for the weapon with that
    # ID. So, for instance, \cc[w8] would apply the composite graphic of the
    # weapon with ID 8 to the event.
    # \cc[ar1] - This will show the graphic you set for the armor with that
    # ID. So, for instance, \cc[ar3] would apply the composite graphic of the
    # armor with ID 3 to the event.
    #
    # Given that you can apply weapon and armor character graphics to an event,
    # you can also use the \ct[] codes from Actor here if you are using that
    # feature.
    #``````````````````````````````````````````````````````````````````````````````
    # Messages:
    #
    # This script introduces two new codes which can be used in messages to show
    # actor faces, since otherwise you would be unable to show composite faces in
    # messages. The codes are:
    #
    # \af[x] - this will show the face of the actor with ID x
    # \pf[x] - this will show the face of the party member in xth place. It
    # starts at 1, so \pf[1] would show the face of the party leader,
    # \pf[2] would show the second member's face, etc.
    #``````````````````````````````````````````````````````````````````````````````
    # Adding & Removing Composite Graphics:
    #
    # Firstly, I will note that the regular event command of Change Actor
    # Graphic does work, but it will only change the basic sprite - it will not
    # remove any of the composite graphics you set up through the notebox.
    #
    # To add or remove composite graphics from events, you use the following
    # code in a comment (NOT a script call!), wherever you want it to happen in
    # the sequence of events:
    #
    # \add_e1_cc["filename", i0, h0, o255, z0, r0]
    # \remove_e1_cc["filename", i0, h0, o255, z0, r0]
    #
    # As you can see, the arguments ("filename", etc.) are all identical to
    # those with which you should now be familiar. The biggest difference is that
    # you need to put remove_e1 or add_e1 before that stuff. Note, the 1 after e
    # is the ID of the event. So, it can be any integer and the graphic will be
    # added to or removed from the event with that ID. If you don't provide any
    # ID, then it will go to the event from which it is called.
    #
    # It is important to note that when you use a remove code, you do not need
    # to specify every aspect of the code - what the script will do is simply get
    # rid of every graphic that shares the parameters you do set in. So all you
    # need to do is be specific enough with the arguments that you don't
    # accidentally delete more than you want to delete.
    #
    # The codes for actors are similar:
    #
    # \add_a1_cc["filename", i0, h0, o255, z0, r0]
    # \remove_a1_cc["filename", i0, h0, o255, z0, r0]
    # \add_a1_cf["filename", i0, h0, o255, z0, r0]
    # \remove_a1_cf["filename", i0, h0, o255, z0, r0]
    #
    # Again, replace the 1 after the a with the ID of the actor whose composite
    # graphic you want to change.
    #
    # Finally, you can also use the commands:
    #
    # \add_p1_cc["filename", i0, h0, o255, z0, r0]
    # \remove_p1_cc["filename", i0, h0, o255, z0, r0]
    # \add_p1_cf["filename", i0, h0, o255, z0, r0]
    # \remove_p1_cf["filename", i0, h0, o255, z0, r0]
    #
    # That will change the composite graphic selected for the party member in
    # that order. So, p1 would be the leader of the party, p2 the second actor
    # in the party, etc...
    #==============================================================================

    $imported = {} unless $imported
    $imported[:MA_CompositeGraphics] = true

    #==============================================================================
    # *** RPG
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # new module - MACGVE_Data_CompositeGraphic, mixed in with Actor & EquipItem
    # modified class - Actor
    #==============================================================================

    module RPG
    #============================================================================
    # *** MACGVE_Data_CompositeGraphic
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # This module holds a method to retrieve composite graphics. It is to be
    # mixed in with the relevant data classes
    #============================================================================

    module MACGVE_Data_CompositeGraphic
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Composite Character and Composite Face methods - lazy instantiation
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    [:character, :face].each { |method|
    define_method(:"macgve_composite_#{method}") do |*args|
    id, = *args
    # Define @macgve_composite_ if undefined
    if !instance_variable_defined?(:"@macgve_composite_#{method}";)
    instance_variable_set(:"@macgve_composite_#{method}";, {})
    end
    if !instance_variable_get(:"@macgve_composite_#{method}";)[id]
    instance_variable_get(:"@macgve_composite_#{method}";)[id] = []
    idtos = id == 0 ? "0?" : id.to_s
    note.scan(/\\C#{method.to_s[0,1] + idtos}\[(.+?)\]/im) { |str|
    str[0].gsub!(/[\r\n]/, "")
    cg = MACGVE_Data_CompositeGraphic.interpret_composite_graphic_string(str[0])
    instance_variable_get(:"@macgve_composite_#{method}";)[id] << cg
    }
    end
    instance_variable_get(:"@macgve_composite_#{method}";)[id]
    end
    }
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Interpret Composite Graphic String
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.interpret_composite_graphic_string(string, cg = MA_Composite_Graphic.new("", 0, 0, 255, 0, 0))
    if cg.is_a?(Hash)
    string.sub!(/["'](.+)["']/) { cg[:filename] = $1; "" } # Filename: ""
    string.sub!(/[Zz](-?\d+)/) { cg[:z] = $1.to_i; "" } # Z: 0
    string.sub!(/[Hh](\d+)/) { cg[:hue] = $1.to_i; "" } # Hue: 0
    string.sub!(/[Oo](\d+)/) { cg[:opacity] = $1.to_i; "" } # Opacity: 255
    string.sub!(/[Rr](\d+)/) { cg[:rcode] = $1.to_i; "" } # R-Code: 0
    string.sub!(/[Ii]?(\d+)/) { cg[:index] = $1.to_i; "" } # Index: 0
    elsif cg.is_a?(MA_Composite_Graphic)
    string.sub!(/["'](.+)["']/) { cg.filename = $1; "" } # Filename: ""
    string.sub!(/[Zz](-?\d+)/) { cg.z = $1.to_i; "" } # Z: 0
    string.sub!(/[Hh](\d+)/) { cg.hue = $1.to_i; "" } # Hue: 0
    string.sub!(/[Oo](\d+)/) { cg.opacity = $1.to_i; "" } # Opacity: 255
    string.sub!(/[Rr](\d+)/) { cg.rcode = $1.to_i; "" } # R-Code: 0
    string.sub!(/[Ii]?(\d+)/) { cg.index = $1.to_i; "" } # Index: 0
    end
    cg
    end
    end

    #============================================================================
    # ** Actor, EquipItem
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # MACGVE_Data_CompositeGraphic included in both classes
    # new method in Actor - macgve_composite_type
    #============================================================================

    class Actor
    include(MACGVE_Data_CompositeGraphic)
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Composite Type
    #````````````````````````````````````````````````````````````````````````
    # This is a type set to an actor - mostly used to distinguish between
    # visual equipment assigned to particular genders
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_composite_types
    if !@macgve_composite_types
    @macgve_composite_types = [0]
    if note[/\\CT\[(.+)\]/i]
    match = $1
    match.scan(/\d+/).each { |id| @macgve_composite_types << id.to_i }
    end
    @macgve_composite_types.compact!
    end
    @macgve_composite_types
    end
    end

    EquipItem.send(:include, MACGVE_Data_CompositeGraphic)
    end

    #==============================================================================
    # *** Cache
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # new constant - MACGVE_PRESERVED_CHARACTERS
    # new methods - self.macgve_composite_graphic_name; self.make_unique_name;
    # self.macgve_create_composite_graphic; self.macgve_src_rect;
    # self.macgve_get_individual_graphic; self.macgve_get_key;
    # self.macgve_get_path; self.macgve_tidy_cg_array
    # aliased method - clear; load_bitmap
    #==============================================================================

    module Cache
    class << self
    alias macgve_clearcach_2jh5 clear
    alias macgve_lodbmp_3nj6 load_bitmap
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Clear Cache
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.clear(*args, &block)
    @macgve_name_cache ||= { face: {}, character: {} }
    @macgve_name_cache.clear
    @macgve_unique_name_id ||= 0
    macgve_clearcach_2jh5(*args, &block)
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Load Bitmap
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.load_bitmap(folder_name, filename, *args)
    path = folder_name + filename
    if @cache && @cache[path] && @cache[path].disposed? && filename[0, 8] == "$macgve_"
    retrieved_ary = macgve_cgary_from_name(filename)
    recache_cg_from_key(*retrieved_ary) if retrieved_ary
    end
    macgve_lodbmp_3nj6(folder_name, filename, *args) # Call original method
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Composite Graphic
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_composite_graphic_name(type, composite_graphics)
    cg_array = macgve_tidy_cg_array(composite_graphics)
    return "" if cg_array.empty?
    key = macgve_get_key(cg_array)
    path = macgve_get_path(type)
    @macgve_name_cache ||= { face: {}, character: {} }
    # If no graphic for this cached
    if !@macgve_name_cache[type].has_key?(key) ||
    !include?(path + @macgve_name_cache[type][key])
    name = macgve_make_unique_name(cg_array)
    # Create new graphic and cache it
    @cache[path + name] = macgve_create_composite_graphic(type, cg_array)
    @macgve_name_cache[type][key] = name
    end
    @macgve_name_cache[type][key] # Return cached graphic
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Tidy Composite Graphic Array
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_tidy_cg_array(cg_array)
    cg_array = cg_array.select {|cg| cg.is_a?(MA_Composite_Graphic) && !cg.filename.empty? }
    # Delete subordinate R-Codes - preserve latest of each type
    rcodes = cg_array.collect { |cg| cg.rcode }
    cg_array.delete_if { |cg| rcodes.shift != 0 && rcodes.include?(cg.rcode) }
    cg_array.sort! {|a, b| a.z <=> b.z }
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Get Key
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_get_key(cg_array)
    cg_array.collect {|cg| Array(cg)[0, 4] }.flatten
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Get Path
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_get_path(type)
    type == :character ? "Graphics/Characters/" : "Graphics/Faces/"
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Make Unique Name
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_make_unique_name(cg_array = [])
    @macgve_unique_name_id ||= 0
    @macgve_unique_name_id += 1
    # Create a mostly garbage name to avoid accidental overwrite
    char_ary = Array(0..9).collect {|i| i.to_s } + Array("a".."z") + Array("A".."Z")
    rand_s = ""
    24.times do rand_s += char_ary.sample end
    result = "$macgve_#{rand_s}_#{@macgve_unique_name_id}";
    result.insert(0, '!') if cg_array.any? {|cg| cg.filename[/^!/] != nil }
    result
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Create Composite Graphic
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_create_composite_graphic(type, cg_array)
    bmp_array = cg_array.collect {|cg| macgve_get_individual_graphic(type, cg) }
    w = bmp_array.max_by { |bmp| bmp.width }.width
    h = bmp_array.max_by { |bmp| bmp.height }.height
    bitmap = Bitmap.new(w, h)
    bmp_array.each { |bmp| bitmap.blt((bitmap.width - bmp.width) / 2,
    bitmap.height - bmp.height, bmp, bmp.rect) }
    bitmap # Return bitmap
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Collect Individual Graphics
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_get_individual_graphic(type, cg)
    bmp = send(type, cg.filename) # Get graphic from file
    src_rect = macgve_src_rect(type, bmp, cg)
    bitmap = Bitmap.new(src_rect.width, src_rect.height)
    bitmap.blt(0, 0, bmp, src_rect, cg.opacity)
    bitmap.hue_change(cg.hue) if cg.hue != 0
    bitmap
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Get Source Rectangle
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_src_rect(type, bmp, cg)
    if type == :face || type == :character
    sign = cg.filename[/^[\!\$]./]
    if sign && sign.include?('$')
    w, h = bmp.width, bmp.height
    else
    w, h = bmp.width / 4, bmp.height / 2
    end
    else
    w, h = bmp.width, bmp.height # Full graphic if unrecognized type
    end
    Rect.new((cg.index % 4) * w, (cg.index / 4) * h, w, h)
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Get CG Array from Name
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.macgve_cgary_from_name(name)
    @macgve_name_cache.keys.each { |key|
    @macgve_name_cache[key].each_pair { |cg_key, cg_name|
    return [key, name, cg_key] if cg_name == name } }
    false
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Recache CG from Key
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.recache_cg_from_key(type, name, key)
    return [] if !key || key.empty?
    cg_array = []
    for i in 0...(key.size / 4)
    cg_array.push(MA_Composite_Graphic.new(*(key.slice!(0, 4) + [i, 0])))
    end
    @cache[macgve_get_path(type) + name] = macgve_create_composite_graphic(type, cg_array)
    @macgve_name_cache ||= { face: {}, character: {} }
    @macgve_name_cache[type][key] = name
    end
    end

    #==============================================================================
    # *** DataManager
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # aliased method - extract_save_contents; make_save_header; load_header
    #==============================================================================

    module DataManager
    class << self
    alias macgve_extractsave_2wm5 extract_save_contents
    alias macgve_savehedr_2df6 make_save_header
    alias macgve_ldheadr_6hk8 load_header
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Extract Save Contents
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.extract_save_contents(contents, *args, &block)
    macgve_extractsave_2wm5(contents, *args, &block) # Call Original Method
    # Initialize new data for actors if old save file
    for i in 1...$data_actors.size
    # If actor has been initialized in this save file but data not setup
    if $game_actors.macgve_actor_init?(i) && !$game_actors.composite_equip_types
    $game_actors.macgve_initialize_composite_graphics
    $game_actors.macgve_extend_equips_to_refresh
    end
    end
    $game_player.refresh
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Make Save Header
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.make_save_header(*args, &block)
    result = macgve_savehedr_2df6(*args, &block)
    result[:cache_cgs] = []
    # Cycle through all values of the header (while :characters holds the
    # characters by default, this is intended to check for the possibility
    # that another script adds it under a different key - :face, for instance
    result.values.flatten.each { |el|
    if el.is_a?(String)
    r = Cache.macgve_cgary_from_name(el)
    result[:cache_cgs].push(r) if r
    end
    }
    result
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Load Header
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def self.load_header(*args, &block)
    result = macgve_ldheadr_6hk8(*args, &block) # Call Original Method
    if result && result[:cache_cgs]
    result[:cache_cgs].each { |type, name, cg_key|
    cg_array = Cache.recache_cg_from_key(type, name, cg_key)
    }
    end
    result
    end
    end

    #==============================================================================
    # *** MACGVE_BaseItem_Refresh
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # This module is intended to be mixed in with instances of Game_BaseItem that
    # handle equipment, and it refreshes the player whenever equipment changes
    #==============================================================================

    module MACGVE_BaseItem_Refresh
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Set Object
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def object=(*args, &block)
    result = super(*args, &block)
    $game_player.refresh
    result
    end
    end

    #==============================================================================
    # ** Composite_Graphic
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # This Struct holds data for composite graphics
    #==============================================================================

    class MA_Composite_Graphic < Struct.new(:filename, :index, :hue, :opacity, :z, :rcode)
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Equality?
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def eql?(other)
    # Don't check for z or rcode equality
    other.is_a?(MA_Composite_Graphic) && @filename == other.filename &&
    @index == other.index && @hue == other.hue && @opacity == other.opacity
    end
    alias == eql?
    end

    #==============================================================================
    # ** Game Actor
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # new public instance variables - composite_equip_types;
    # base_composite_characte; base_composite_face;
    # aliased methods - init_graphics; init_equips; character_name,
    # character_index, face_name, face_index
    # new methods - macgve_composite_character; macgve_composite_face;
    # macgve_add_cg; macgve_remove_cg;
    # macgve_initialize_composite_graphics
    #==============================================================================

    class Game_Actor
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Public Instance Variables
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    attr_accessor :composite_equip_types
    attr_accessor :base_composite_character
    attr_accessor :base_composite_face
    [:character, :face].each { |method|
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Compose Character/Face
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    define_method(:"macgve_composite_#{method}") do |*args|
    # Add all composite graphics from actor, equipments and states
    basic = MA_Composite_Graphic.new(instance_variable_get(:"@#{method}_name";),
    instance_variable_get("@#{method}_index";), 0, 255, 0, 0)
    result = [basic] + instance_variable_get(:"@base_composite_#{method}";)
    equips.compact.each { |equip|
    composite_equip_types.each { |t|
    result += equip.send(:"macgve_composite_#{method}", t) } }
    result
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Character/Face Name
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias_method(:"macgve_#{method}nm_2qa5", :"#{method}_name")
    define_method(:"#{method}_name") do |*args|
    if send(:"macgve_composite_#{method}").size > 1
    Cache.macgve_composite_graphic_name(method, send(:"macgve_composite_#{method}"))
    else
    send(:"macgve_#{method}nm_2qa5", *args)
    end
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Character/Face Index
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias_method(:"macgve_#{method}ix_3fm9", :"#{method}_index")
    define_method(:"#{method}_index") do |*args|
    send(:"macgve_composite_#{method}").size > 1 ? 0 :
    send(:"macgve_#{method}ix_3fm9", *args)
    end
    }
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Initialize Graphics
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_initlzgraph_3dk4 init_graphics
    def init_graphics(*args, &block)
    macgve_initialize_composite_graphics
    macgve_initlzgraph_3dk4(*args, &block)
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Initialize Composite Graphics
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_initialize_composite_graphics
    @composite_equip_types = actor.macgve_composite_types
    @base_composite_character = actor.macgve_composite_character
    @base_composite_face = actor.macgve_composite_face
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Initialize Equips
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_initequpment_2gu7 init_equips
    def init_equips(*args, &block)
    macgve_initequpment_2gu7(*args, &block)
    macgve_extend_equips_to_refresh
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Extend Equips to Refresh
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_extend_equips_to_refresh
    @equips.each { |eqp| eqp.send(:extend, MACGVE_BaseItem_Refresh) }
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Add Composite Character/Face
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_add_cg(type, arg = {})
    case arg
    when String then cg = RPG::MACGVE_Data_CompositeGraphic.interpret_composite_graphic_string(arg)
    when Hash
    cg = MA_Composite_Graphic.new("", 0, 0, 255, 0, 0)
    arg.each_pair(key, value) { cg.send(:"#{key}=", value) }
    when MA_Composite_Graphic then cg = arg
    else
    return
    end
    send(:"base_composite_#{type}") << cg
    $game_player.refresh
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Remove Composite Character/Face
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_remove_cg(type, hash = {})
    hash = RPG::MACGVE_Data_CompositeGraphic.interpret_composite_graphic_string(hash, {}) if hash.is_a?(String)
    send(:"base_composite_#{type}").delete_if { |cg|
    return_value = true
    # If any element is not equal to the CG, then return false
    hash.each_pair { |key, value|
    unless cg.send(key) == value
    return_value = false
    break
    end
    }
    return_value
    }
    $game_player.refresh
    end
    end

    #==============================================================================
    # ** Game Actors
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # new method - macgve_actor_init?
    #==============================================================================

    class Game_Actors
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Actor Initialized?
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_actor_init?(id)
    @data[id] != nil
    end
    end

    #==============================================================================
    # ** Game Event
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # aliased methods - clear_page_settings; setup_page_settings
    # overwritten (super)methods - character_name; character_index
    # new method - macgve_setup_composite_characters;
    # interpret_composite_graphic_string
    #==============================================================================

    class Game_Event
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Public Instance Variables
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    attr_accessor :composite_equip_types
    attr_accessor :base_composite_character
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Clear Page Settings
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_clrpagesets_2rd8 clear_page_settings
    def clear_page_settings(*args, &block)
    @macgve_character_name = ""
    macgve_clrpagesets_2rd8(*args, &block) # Call Original Method
    @base_composite_characters = []
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Setup Page Settings
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_setppagestngs_4qm3 setup_page_settings
    def setup_page_settings(*args, &block)
    macgve_setppagestngs_4qm3(*args, &block) # Call Original Method
    macgve_setup_composite_characters
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Setup Composite Characters
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_setup_composite_characters
    # Collect Comments
    comment = maccve_get_first_comment
    set_composite_equip_types(comment)
    set_base_composite_characters(comment)
    @macgve_character_name = Cache.macgve_composite_graphic_name(:character, macgve_composite_characters)
    # If no original graphic
    if @page.graphic.character_name.empty? && !@base_composite_characters.empty?
    @pattern, @original_pattern = 1, 1
    @tile_id = 0
    end
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Get First Comment
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def maccve_get_first_comment
    comment = ""
    i = 0
    while !@list.nil? && (@list.code == 108 || @list.code == 408)
    comment += @list.parameters[0].dup
    i += 1
    end
    comment
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Set Composite Equip Types
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def set_composite_equip_types(comment = "")
    @composite_equip_types = [0]
    unless comment[/\\CT\[(.+?)\]/i].nil?
    match = $1
    match.scan(/\d+/).each { |id| @composite_equip_types << id.to_i }
    end
    @composite_equip_types
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Set Base Composite Characters
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def set_base_composite_characters(comment = "")
    @base_composite_characters = []
    comment.scan(/\\CC\[(.+?)\]/i) { |str|
    composite_equip_types.each { |id|
    @base_composite_characters += interpret_composite_graphic_string(str[0], id)
    }
    }
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Interpret Composite Graphic String
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def interpret_composite_graphic_string(string, id = 0)
    string.gsub!(/([APW]|AR)(\d+)/i) {
    object = case $1.upcase
    when 'A' then $game_actors[$2.to_i] # Actor
    when 'P' then $game_party.members[$2.to_i - 1] # Party Member
    when 'W' then $data_weapons[$2.to_i] # Weapon
    when 'AR' then $data_armors[$2.to_i] # Armor
    end
    return *object.macgve_composite_character(id) unless object.nil?
    ""
    }
    [RPG::MACGVE_Data_CompositeGraphic.interpret_composite_graphic_string(string)]
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Composite Characters
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_composite_characters
    # Add all composite graphics from actor, equipments and states
    result = [MA_Composite_Graphic.new(@character_name, @character_index, 0, 255, 0, 0)]
    result += @base_composite_characters if @base_composite_characters
    result
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Add Composite Character
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_add_cc(string)
    @base_composite_characters ||= []
    @base_composite_characters.push(*interpret_composite_graphic_string(string))
    @macgve_character_name = Cache.macgve_composite_graphic_name(:character, macgve_composite_characters)
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Remove Composite Character
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_remove_cc(string)
    return unless @base_composite_characters
    hash = RPG::MACGVE_Data_CompositeGraphic.interpret_composite_graphic_string(string, {})
    @base_composite_characters.delete_if { |cg|
    return_value = true
    # If any element is not equal to the CG, then return false
    hash.each_pair { |key, value|
    unless cg.send(key) == value
    return_value = false
    break
    end
    }
    return_value
    }
    @macgve_character_name = Cache.macgve_composite_graphic_name(:character, macgve_composite_characters)
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Character Name/Index
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_crctrname_4dk8 character_name
    def character_name
    if !@base_composite_characters.empty? # If not just the base sprite
    if @macgve_character_name.empty? || !Cache.include?("Graphics/Characters/" + @macgve_character_name)
    @macgve_character_name = Cache.macgve_composite_graphic_name(:character, macgve_composite_characters)
    end
    @macgve_character_name
    else # If no composite characters, just return the default.
    macgve_crctrname_4dk8
    end
    end
    alias macgve_charindx_2vd3 character_index
    def character_index
    !@base_composite_characters.empty? ? 0 : macgve_charindx_2vd3
    end
    end

    #==============================================================================
    # ** Game Interpreter
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # aliased method - command_108
    # new method - macgve_interpret_cg_comment
    # new methods - add_actor_cc; add_actor_cf; remove_actor_cc; remove_actor_cf
    #==============================================================================

    class Game_Interpreter
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Collect Comment
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_commnd108comments_1xh4 command_108
    def command_108(*args, &block)
    macgve_commnd108comments_1xh4(*args, &block) # Call Original Method
    macgve_interpret_cg_comment(@comments.join)
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Interpret Composite Graphic Comment
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_interpret_cg_comment(comment)
    comment.scan(/\\(add|remove)_([eap])(-?\d*)_c([cf])\[(.+?)\]/i) { |oper, char, id, type, args|
    case char.upcase
    when 'A' then actor = $game_actors[id.empty? ? 1 : id.to_i]
    when 'P' then actor = $game_party.members[id.empty? ? 0 : id.to_i - 1]
    when 'E' then id.to_i < 0 ? actor = $game_player.actor : event = get_character(id.to_i)
    end
    type = type.upcase == 'C' ? :character : :face
    actor.send(:"macgve_#{oper.downcase}_cg", type, args) unless actor.nil?
    event.send(:"macgve_#{oper.downcase}_cc", args) unless event.nil?
    }
    end
    end

    #==============================================================================
    # ** Window_Base
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # aliased method - draw_face
    #==============================================================================

    class Window_Base
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Draw Face
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias masff_drawfac_1wk7 draw_face
    def draw_face(face_name, face_index, *args, &block)
    if face_index == 0 && face_name[/^$/]
    ma_draw_single_face(face_name, *args, &block) # Draw single face
    else
    # Call Original Method
    masff_drawfac_1wk7(face_name, face_index, *args, &block)
    end
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Draw Single Face
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    unless method_defined?(:ma_draw_single_face)
    def ma_draw_single_face(face_name, x, y, enabled = true)
    bmp = Cache.face(face_name)
    contents.blt(x, y, bmp, bmp.rect, enabled ? 255 : translucent_alpha)
    end
    end
    end

    #==============================================================================
    # ** Window_Message
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # Summary of Changes:
    # aliased (super)method - new_page; process_escape_character
    # new method - macgve_new_page
    #==============================================================================

    class Window_Message
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * New Page
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if instance_methods(false).include?(:new_page)
    alias macgve_newpage_5di4 new_page
    def new_page(text, pos, *args, &block)
    result = macgve_new_page(text, pos, *args, &block)
    macgve_newpage_5di4(result, pos, *args, *block) # Call Original Method
    end
    else
    def new_page(text, pos, *args, &block)
    result = macgve_new_page(text, pos, *args, &block)
    super(result, pos, *args, *block) # Call Original Method
    end
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Check First Code for Face
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    def macgve_new_page(text, pos, *args, &block)
    result = text.dup
    # Remove AF or PF code and process it
    if result[/\A\e[AP]F\[\d+\]/i] != nil
    result.sub!(/\A\e([AP]F)/i, "")
    process_escape_character($1, result, pos)
    end
    return result
    end
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # * Process Escape Character
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    alias macgve_procesccha_2gk1 process_escape_character
    def process_escape_character(code, text, *args, &block)
    if code.upcase[/([AP])F/] != nil
    type = ($1 == 'A')
    param = obtain_escape_param(text)
    actor = type ? $game_actors[param] : $game_party.members[param - 1]
    if actor
    # Change face to that of the chosen actor
    $game_message.face_name = actor.face_name
    $game_message.face_index = actor.face_index
    end
    else
    macgve_procesccha_2gk1(code, text, *args, &block) # Call Original Method
    end
    end
    end
    [chapter]Cách sử dụng[/chapter]
    B1 : Bạn cần một file ảnh ntn nè
    ux5jjf.png
    B2 : bỏ file ảnh vào thư mục characters trong dự án
    B3 : Tạo một item cái áo và nhập dòng sau vào Note của item
    \cc["$Tên file ảnh của bạn", i0, z0]
  • ttnghia195ttnghia195 Posts: 58Registered
    Muốn có nón, vũ khí luôn thì làm sao bạn?
  • DeathDeath Posts: 732Registered, Moderators
    ttnghia195 wrote:
    Muốn có nón, vũ khí luôn thì làm sao bạn?

    Vẽ.
  • ttnghia195ttnghia195 Posts: 58Registered
    Death wrote:
    ttnghia195 wrote:
    Muốn có nón, vũ khí luôn thì làm sao bạn?

    Vẽ.

    Cho vũ khí đeo sau lưng rồi thay đổi như đồ thì làm được không?
  • StupidDonutStupidDonut Posts: 1,196Registered
    ttnghia195 wrote:
    Muốn có nón, vũ khí luôn thì làm sao bạn?
    DEMO
Sign In or Register to comment.