O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Visual Equipment

Iniciado por LoboShow, 26/01/2013 às 13:34

Visual Equipment

Compativel com: RMVX
Compatibilidade: ?
Facilidade de uso: ?
Lag gerado: ?

[box class=titlebg]
Para que serve o script
[/box]
Este script permite que você tenha um character set de múltiplos character sheets, sobrepondo-os uns aos outros. Támbem permite que você defina gráficos para armas e armaduras, estes támbem sobrepondo o personagem, formando assim um sistema de equipamento visual.
Funções:
- Fácil para configurar
- Permite que você ajuste a matiz para o character sheet, significa que cada resource pode ter centenas de cores distintas
- Permite que toda arma ou armadura tenha qualquer número de character set sobrepondo o personagem equipado
- Os Eventos e os Personagens támbem podem ser configurados para que tenham múltiplos character sets.

[box class=titlebg]
Instruções
[/box]
Coloque este script entre "Scripts Adicionais" e "Principal" no Editor.

Para definir um gráfico para uma arma ou armadura, tudo que você precisa é colocar este código no campo "Hisórico" do "Banco de Dados" deste item:

    \CG[<Nome do Character Set>, <índice no character set>, <matiz>]

Se você não definir o índice, ele por padrão será 0 e se você támbem não definir a matiz, ela támbem será por padrão 0. Você pode colocar mais gráficos para uma arma ou armadura que elas serão sobrepostas.

Configurando um evento é similar - tudo que você precisa é colocar um comentário bem no começo das ações do evento contendo o mesmo código. As mesmas regras aplicam-se, e lembre-se, você pode sobrepor os character sets.

Exemplos:
    \cg[Actor1, 2]     # Character Set = Actor1 : índice = 2 : matiz = 0
    \CG[Evil]          # Character Set = Evil   : índice = 0 : matiz = 0
    \cG[Actor2, 3, 50] # Character Set = Actor2 : índice = 3 : matiz = 50

Configurando seus personagens é similar - veja a linha 150 do script para detalhes.

[box class=titlebg]
Imagens
[/box]

[box class=titlebg]
Download
[/box]

[box class=titlebg]
Script
[/box]
#==============================================================================
#  Composite Characters / Visual Equipment
#  Versão 1.0
#  Autor: modern algebra
#  Traduzido por Bennamy :: Amy Productions
#  Data: 5 de Julho, 2008
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Instruções:
#
#    Coloque este script entre "Scripts Adicionais" e "Principal" no Editor.
#
#    Para definir um gráfico para uma arma ou armadura, tudo que você precisa
#    é colocar este código no campo "Hisórico" do "Banco de Dados" deste item:
#
#    \CG[<Nome do Character Set>, <índice no character set>, <matiz>]
#
#    Se você não definir o índice, ele por padrão será 0 e se você támbem não
#  definir a matiz, ela támbem será por padrão 0. Você pode colocar mais que
#  gráfico para uma arma ou armadura e serão sobrepostas.
#
#    Configurando um evento é similar - tudo que você precisa é colocar um
#  comentário bem no começo das acões do evento contendo o mesmo código. As
#  mesmas regras aplicam-se, e lembre-se, você pode sobrepor os character sets.
#
#  Exemplos:
#    \cg[Actor1, 2]     # Character Set = Actor1 : índice = 2 : matiz = 0
#    \CG[Evil]          # Character Set = Evil   : índice = 0 : matiz = 0
#    \cG[Actor2, 3, 50] # Character Set = Actor2 : índice = 3 : matiz = 50
#
#  Configurando seus personagens é similar - veja a linha 151 para detalhes.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Compatibilidade:
#
#    Infelizmente, eu precisei reescrever alguns metódos para este script, e
#  devido a isso contém problemas de compatibilidade. Eu sei que o script
#  "Extra Movement Frames" certamente não irá funcionar com este script, e
#  qualquer script que altere o modo como um character set é exibido támbem terá
#  problemas. Agora, isso não quer dizer que qualquer script que exibe um
#  character set será incompativél - Contando que o desenvolvedor usou o método
#  draw_actor_graphic de Window_Base ele funcionará perfeitamente - apenas
#  scripts que alteram o modo como um character set é exibido, causarão
#  problemas. Támbem, eu utilizei o método load_gamedata de Window_SaveFile,
#  e asim se outro script reescreve este método, novamente haverá problemas
#  de compatibilidade.
#==============================================================================

#==============================================================================
#* Módulo Cache
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Método novo - composite_character
#==============================================================================

module Cache
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Composite Character
  #    char_array : Um array contendo os nomes e todas as partesde um gráfico
  #--------------------------------------------------------------------------
  #  Compor um único bitmap do personagem fora de todos os dados.
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def self.composite_character (char_array)
    @cache = {} if @cache == nil
    # Bitmap em branco se não há nada no array.
    @cache[char_array] = Bitmap.new (32, 32) if char_array.empty?
    # Se não no cache
    if !@cache.include? (char_array) || @cache[char_array].disposed?
      # Criar um template bitmap
      bitmap = Bitmap.new (32, 32)
      # Adicionar em todos gráficos restantes
      char_array.each { |i|
        name, index, hue = i[0], i[1], i[2]
        # Desvio self.character a fim permitir o ajuste da matiz
        bmp = load_bitmap ("Graphics/Characters/", name, hue)
        sign = name[/^[\!\$]./]
        # Definindo a largura e altura do único personagem
        if sign != nil && sign.include? ('$')
          wdth, hght = bmp.width, bmp.width
        else
          wdth = bmp.width / 4
          hght = bmp.height / 2
        end
        # Expandir o bitmap caso necessário
        if bitmap.width < wdth || bitmap.height < hght
          # Recrear o bitmap
          temp_bmp = bitmap.dup
          bitmap = Bitmap.new ([temp_bmp.width, wdth].max, [temp_bmp.height, hght].max)
          bitmap.blt (0, 0, temp_bmp, temp_bmp.rect)
          temp_bmp.dispose
        end
        # Exibir o gráfico novo do personagem no bitmap
        src_rect = Rect.new ((index%4)*wdth, (index/4)*hght, wdth, hght)
        bitmap.blt (0, 0, bmp, src_rect)
      }
      @cache[char_array] = bitmap
    end
    return @cache[char_array]
  end
end

#==============================================================================
# RPG::BaseItem
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    new method - character_graphics
#==============================================================================

class RPG::BaseItem
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Gráficos do personagem
  #--------------------------------------------------------------------------
  #  Recuperar o Gráfico do personagem no campo Histórico
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def character_graphics
    graphics = []
    # Recuperar campo Histórico
    text = self.note.dup
    while text.sub! (/\\cg\[([\w\s]+),*\s*(\d*),*\s*(\d*)\]/i) { '' } != nil
      graphics.push ([$1.to_s, $2.to_i, $3.to_i])
    end
    return graphics
  end
end


#==============================================================================
# Game_Actor
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Método novo - composite_character
#    aliased_method - initialize, change_equip
#==============================================================================

class Game_Actor
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Variáveis públicas
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_writer :composite_character
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Inicialização do objeto
  #-------------------------------------------------------------------------
  #  Inicializa variável stacked_character
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_arclght_vsual_equip_init_4t6h initialize
  def initialize (id)
    # Funcionar o método original
    modalg_arclght_vsual_equip_init_4t6h (id)
    @composite_character = []
    case @actor_id
    #---------------------------------------------------------------------
    # REGIÃO EDITÁVEL
    #|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    #  Um personagem terá automaticamente como camada inferior, o que você
    #  definiu no Banco de dados, mas se você precisar de outros character sets
    #  colocados sobre ele, então coloque eles neste formato:
    #
    #  when <ID do personagem>
    #    @composite_character.push (['Nome do gráfico', índice, matiz])
    #      *Coloque quantos gráficos você desejar.
    #----------------------------------------------------------------------
    when 1 # Primeiro personagem
      # Criar o cabelo do personagem
      @composite_character.push (['VisEquipSample', 1, 0])
    when 3 # Terceiro personagem
      # Criar a pele do personagem com matiz diferente
      @composite_character.push (['VisEquipSample', 0, 20])
      # Criar o cabelo do personagem
      @composite_character.push (['VisEquipSample', 2, 75])
      @composite_character.push (['VisEquipSample', 3, 75])
    #----------------------------------------------------------------------
    # FIM DA REGIÃO EDITÁVEL
    #----------------------------------------------------------------------
    end
    @composite_character.each { |i|
      i[1] = 0 if i[1] == nil
      i[2] = 0 if i[2] == nil
    }
    @composite_character.unshift ([@character_name, @character_index, 0]) if @character_name != ''
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Definir o caráter composto
  #--------------------------------------------------------------------------
  #  Terotna o Array do gráfico para o personagem
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def composite_character
    armor_graphics = []
    weapon_graphics = []
    # Armadura, Elmo, Escudo, Todos os outros
    dup_armors = armors.dup
    for i in 0...2
      j = 2 - i
      armor_graphics += dup_armors[j].character_graphics if dup_armors[j] != nil
      dup_armors.delete_at (j)
    end
    # Se há algum script de multi-equip, colocará os acessórios e o resto na ordem
    dup_armors.each { |armr| armor_graphics += armr.character_graphics if armr != nil }
    weapons.each { |wpn| weapon_graphics += wpn.character_graphics if wpn != nil }
    return @composite_character + armor_graphics + weapon_graphics
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Mudar o equipamento (objeto designado)
  #--------------------------------------------------------------------------
  #  Atualizar o jogador para demonstrar a mudança da armadura
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modalg_rfrsh_plyer_eq_chnge_8mj2 change_equip
  def change_equip(equip_type, item, test = false)
    modalg_rfrsh_plyer_eq_chnge_8mj2 (equip_type, item, test)
    $game_player.refresh
  end
end

#==============================================================================
# Game_Party
#==============================================================================
class Game_Party
  attr_reader :actors
end

#==============================================================================
# Game_Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Nova variável - composite_character
#==============================================================================

class Game_Character
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Variáveis públicas
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader :composite_character
end

#==============================================================================
# Game_Event
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Métodos aliasados - setup
#==============================================================================

class Game_Event
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Configuração da página de um evento
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malgbr_rclgh_req_comp_char_setup_5msk setup
  def setup(new_page)
    malgbr_rclgh_req_comp_char_setup_5msk (new_page)
    # Criar o personagem composto
    @composite_character = []
    @composite_character.push ([@character_name, @character_index, 0]) unless @character_name.nil?
    # Se page == nil, retornar
    return if @page == nil
    # Retrieve  first line comments
    comments = []
    @page.list.each { |i| i.code == 108 || i.code == 408 ? comments.push (i) : break }
    # Avaliar comentários para o código \CG
    comments.each { |i|
      text = i.parameters[0].dup
      while text.sub! (/\\cg\[([\w\s]+),*\s*(\d*),*\s*(\d*)\]/i) { '' } != nil
        @composite_character.push ([$1.to_s, $2.to_i, $3.to_i])
      end
    }
  end
end

#==============================================================================
# Game_Player
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Métodos aliasados - refresh
#==============================================================================

class Game_Player
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Atualização
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mdalg_arc_comp_character_find_rfrsh_8kwi refresh
  def refresh
    mdalg_arc_comp_character_find_rfrsh_8kwi
    return if $game_party.members.empty?
    @composite_character = $game_party.members[0].composite_character
  end
end

#==============================================================================
# Sprite_Character
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Summary of Changes:
#    Métodos aliasados - update_bitmap
#==============================================================================

class Sprite_Character
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Atualização do bitmap
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias modern_alg_arclightrequest_visual_equip_bmp_update update_bitmap
  def update_bitmap
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_index != @character.character_index ||
       @composite_character != @character.composite_character
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_index = 0
      @composite_character = @character.composite_character
      if @tile_id > 0
        sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
        sy = @tile_id % 256 / 8 % 16 * 32;
        self.bitmap = tileset_bitmap(@tile_id)
        self.src_rect.set(sx, sy, 32, 32)
        self.ox = 16
        self.oy = 32
      else
        if @composite_character == nil
          # Retrato regular de personagem
          self.bitmap = Cache.character(@character_name)
          sign = @character_name[/^[\!\$]./]
          if sign != nil and sign.include?('$')
            @cw = bitmap.width / 3
            @ch = bitmap.height / 4
          else
            @cw = bitmap.width / 12
            @ch = bitmap.height / 8
          end
        else
          self.bitmap = Cache.composite_character(@composite_character)
          @cw = self.bitmap.width / 3
          @ch = self.bitmap.height / 4
        end
          self.ox = @cw / 2
          self.oy = @ch
      end
    end
  end
  #--------------------------------------------------------------------------
  # Atualização de bitmap retangular
  #--------------------------------------------------------------------------
  def update_src_rect
    if @tile_id == 0
      index = 0
      pattern = @character.pattern < 3 ? @character.pattern : 1
      sx = (index % 4 * 3 + pattern) * @cw
      sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
  end
end

#==============================================================================
# Window_Base
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Métodos reescritos - draw_character_graphic
#==============================================================================

class Window_Base
  #--------------------------------------------------------------------------
  # Exibição dos gráficos do herói
  #     actor : herói
  #     x     : exibe na coordenada X
  #     y     : exibe na coordenada Y
  #--------------------------------------------------------------------------
  def draw_actor_graphic(actor, x, y)
    bitmap = Cache.composite_character (actor.composite_character)
    cw = bitmap.width / 3
    ch = bitmap.height / 4
    rect = Rect.new (cw, 0, cw, ch)
    self.contents.blt (x - (cw / 2), y - ch, bitmap, rect)
  end
end

#==============================================================================
# Window_SaveFile
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#  Sumário das mudanças:
#    Métodos Reescritos - load_gamedata,
#==============================================================================

class Window_SaveFile < Window_Base
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # Carregar arquivo
  #--------------------------------------------------------------------------
  def load_gamedata
    @time_stamp = Time.at(0)
    @file_exist = FileTest.exist?(@filename)
    if @file_exist
      file = File.open(@filename, "r")
      @time_stamp = file.mtime
      begin
        @characters     = Marshal.load(file)
        @frame_count    = Marshal.load(file)
        @last_bgm       = Marshal.load(file)
        @last_bgs       = Marshal.load(file)
        @game_system    = Marshal.load(file)
        @game_message   = Marshal.load(file)
        @game_switches  = Marshal.load(file)
        @game_variables = Marshal.load(file)
        # Bypass self-switches
        @game_self_switches = Marshal.load(file)
        # Bypass Actors
        @game_actors = Marshal.load(file)
        # Get Party
        @game_party = Marshal.load (file)
        @total_sec = @frame_count / Graphics.frame_rate
      rescue
        @file_exist = false
      ensure
        file.close
      end
    end
  end
  #--------------------------------------------------------------------------
  # Desenho dos membros da euqipe
  #     x : desenha na coordenada X
  #     y : desenha na coordenada Y
  #--------------------------------------------------------------------------
  def draw_party_characters(x, y)
    for i in 0...@game_party.actors.size
      draw_actor_graphic (@game_actors[@game_party.actors[i]], x + i * 48, y)
    end
  end
end


[box class=titlebg]
Créditos e Avisos
[/box]
modern algebra: Scripter
famitsu.com: Pelos resources usados na demo
Bennamy: Tradução, Demo e disponibilização.