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

Sprite Sun - Sistema de Sol

Iniciado por LoboShow, 06/12/2012 às 17:38

Sprite Sun

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

[box class=titlebg]
Para que serve o script
[/box]
Este sistema permite que você e todos os eventos "preparados" gerem sombras
no mapa.  O jogador pode mover-se em torno de um evento de "sol" e será exibida uma sombra. Do mesmo modo, os eventos com um comentário especial dentro da lista de comandos podem igualmente gerar sombras.
Instruções
Spoiler
.O Sol
Para criar um efeito de sol, você precisa criar um evento no mapa que será usado como "sol". Na maioria das vezes, isto será evento sem um gráfico do jogo. Você não quer "VÊ" o sol, você quer? Para fazer um destes eventos ser um sol, você precisa colocar poucas coisas em "comandos de eventos". Essas coisas são nada mais que comentários. O primeiro comentário para adicionar é "begin Sun" (sem aspas). Ele informa o sistema que este mapa tem um efeito do sol. Os outros dois valores são opcionais e possuem valores padrão definidos na seção de configuração (somente apenas adicionadas no script). Esses támbem são adicionados como comentários. self_angle  'número': Quanto de um ângulo cada sombra terá. self_opacity 'número': O quanto escura a sombra será. Após isso, seus personagens podem mover-se e gerar sombras.

.Outros Eventos
Os eventos não sabem que podem gerar sombras. Para deixá-los gerar uma sombra, tudo que você precisa fazer é adicionar um comentário especial na sua "Lista de Comandos do evento". Este comentário necessário é meramente a frase "begin Shadow" (outra vez, sem aspas).
[close]

[box class=titlebg]
Script
[/box]
#==============================================================================
# Sprite Sun
#------------------------------------------------------------------------------
#    Baseado em Sprite Shadow
#    Modificado por Rataime
#    Novas edições por DerVVulfman
#    Modificado para VX por Syvkal
#    Traduzido por Bennamy :: Amy Productions
#    28 de Agosto, 2008
#
#------------------------------------------------------------------------------
#
# Introdução:
#
#  Este sistema permitir que você e todos os eventos "preparados" gerem sombras
#  no mapa. O jogador pode mover-se em torno de um evento de "sol" e
#  será exibida uma sombra. Do mesmo modo, os eventos com um comentário
#  especial dentro da lista de comandos podem igualmente gerar sombras.
#
#------------------------------------------------------------------------------
#
# Instruções:
#
#  -- O Sol
#     Para criar um efeito de sol, você precisa criar um evento no mapa que
#     será usado como "sol". Na maioria das vezes, isto será evento sem um
#     gráfico do jogo. Você não quer "VÊ" o sol, você quer?
#
#     Para fazer um destes eventos ser um sol, você precisa colocar
#     poucas coisas em "comandos de eventos". Essas coisas são nada mais que
#     comentários. 
#
#     O primeiro comentário para adicionar é "begin Sun" (sem aspas). Ele
#     informa o sistema que este mapa tem um efeito do sol. Os outros
#     dois valores são opcionais e possuem valores padrão definidos na seção de
#     configuração (somente apenas adicionadas no script). Esses támbem são
#     adicionados como comentários.
#
#     self_angle  'número'  --- Quanto de um ângulo cada sombra terá.
#     self_opacity 'número' --- O quanto escura a sombra será.
#
#     Após isso, seus personagens podem mover-se e gerar sombras.
#
#  -- Outros Eventos
#     Os eventos não sabem que podem gerar sombras. Para deixá-los gerar uma
#     sombra, tudo que você precisa fazer é adicionar um comentário especial
#     na sua "Lista de Comandos do evento". Este comentário necessário é
#     meramente a frase "begin Shadow" (outra vez, sem aspas).
#
#
#------------------------------------------------------------------------------
#
# Notas da revisão:
#
#  1) Adicionado o cabeçalho formatado e comentários em todo o script.
#  2) Embutindo um código de comentário/parâmetro em um módulo XPML.
#  3) Ajustando o array da sombrado sol em valor de instância para reduzir o resource.
#  4) Compatabilidade com o sistema Near Fantastica's Squad Movement.
#  5) Compatabilidade com o sistema Ccoa's Caterpillar.
#  6) Compatabilidade com o sistema Trickster's Caterpillar.
#  7) Adicionado o ajuste de sombra padrão na seção de configuração.
#
#==============================================================================



   #========================================================================
   #     C  O  N  F  I  G  U  R  A  Ç  à O   D O   S  I  S  T  E  M  A    #
   #========================================================================
    # Sistemas Caterpillar
    CATERPILLAR_COMPATIBLE      = true    # Ativação para Fukuyama's original   
    SQUAD_MOVE_COMPATIBLE       = false   # Ativação para Near Fantastica's SBABS
    CCOA_CATER_COMPATIBLE       = false   # Ativação para Ccoa's Caterpillar
    TRICKSTER_CATER_COMPATIBLE  = false   # Ativação para Trickster's Caterpillar
   
    # Sistema de Sol Específico
    SUN_WARN                    = true    # Verificações para o sistema de sol
    SUN_ANGLE                   = 45      # Ângulo para a sombra do sol gerada
    SUN_OPACITY                 = 128     # Nível da escuridão da sombra

   
   #========================================================================
   #            F I M   D A   C  O  N  F  I  G  U  R  A  Ç  à O           #
   #========================================================================
   
   

#==============================================================================
# Game_Temp
#------------------------------------------------------------------------------
# Esta classe controla dados que não são salvos pelo jogo, os dados temporários
# Pode ser acessada utilizando $game_temp.
#==============================================================================

class Game_Temp
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #--------------------------------------------------------------------------
  attr_accessor :sun_spriteset        # prende spritesets para sombras do "sol"
end

#==============================================================================
# Game_Party
#------------------------------------------------------------------------------
# Classe que trata do Grupo. Inclui informações sobre dinheiro, itens, etc.
# Pode ser acessada utilizando $game_party.
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #--------------------------------------------------------------------------
  attr_reader :characters
end

#==============================================================================
# ** Sprite_Sun
#------------------------------------------------------------------------------
#  Este sprite é usado para posicionar no mapa as sombras do caráter.
#  Observa a classe de Game_Character e muda automaticamente o sprite
#  conforme circunstâncias.
#==============================================================================

class Sprite_Sun < Sprite_Base
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #--------------------------------------------------------------------------
  attr_accessor :character           
  #--------------------------------------------------------------------------
  # Inicialização do objeto
  #     viewport  : viewport
  #     character : personagem (Game_Character)
  #     id        : id
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil, id=0)
    super(viewport)
    @character = character
    params=$game_temp.sun_spriteset.sun[id]
    self_angle    = SUN_ANGLE
    self_opacity  = SUN_OPACITY
    self_angle    = params[0]   if params.size > 0
    self_opacity  = params[1]   if params.size > 1
    @self_angle   = self_angle
    @self_opacity = self_opacity
    update
  end
  #--------------------------------------------------------------------------
  # Atualização da tela
  #-------------------------------------------------------------------------- 
  def update
    super
    # Se a ID do tile, o nome de arquivo, ou a matiz são diferentes da atual
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_index != @character.character_index
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_index = @character.character_index
      if @tile_id > 0
        sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
        sy = @tile_id % 256 / 8 % 16 * 32;
        set_number = @tile_id / 256
        self.bitmap = Cache.system("TileB") if set_number == 0
        self.bitmap = Cache.system("TileC") if set_number == 1
        self.bitmap = Cache.system("TileD") if set_number == 2
        self.bitmap = Cache.system("TileE") if set_number == 3
        self.src_rect.set(sx, sy, 32, 32)
        self.ox = 16
        self.oy = 32
      else
        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
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    # Situação visível ajustada
    self.visible = (not @character.transparent)
    # Se o gráfico é do personagem
    if @tile_id == 0
      index = @character.character_index
      pattern = @character.pattern < 3 ? @character.pattern : 1
      # Transferência retangular ajustada
      sx = (index % 4 * 3 + pattern) * @cw
      @direct = @character.direction
      if self.angle > 90 or angle < -90
        sy = ( 4 - 2) / 2 * @ch                   if @direct == 6
        sy = ( 6 - 2) / 2 * @ch                   if @direct == 4
        sy = (@character.direction - 2) / 2 * @ch if @direct != 4 and @direct != 6
      else
        sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
      end
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    # Ajustar côordenadas do sprite   
    self.x = @character.screen_x
    self.y = @character.screen_y-5
    self.z = @character.screen_z- 1
    # Método da mistura e profundidade ajustados do arbusto
    self.opacity = @self_opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    # Animação
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
    self.angle = @self_angle.to_i - 90
    self.color = Color.new(0, 0, 0)
  end
end

#==============================================================================
# Sprite_Character
#------------------------------------------------------------------------------
# Classe que gerencia os gráficos de personagens a serem exibidos.
# Esta classe está vinculada à classe Game_Character, que a monitora e
# automaticamente muda o status do sprite.
#==============================================================================

class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # Lista Alias
  #-------------------------------------------------------------------------- 
  alias sun_initialize initialize
  alias sun_update update
  #--------------------------------------------------------------------------
  # Iniialização do objeto
  #     viewport  : "camada"
  #     character : Personagem (Game_Character)
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    @viewport0 = Viewport.new(0, 0, 544, 416)
    @viewport0.z = 1
    @character = character
    super(viewport)
    @sunlist=[]
    if character.is_a?(Game_Event) and $game_temp.sun_spriteset.sun != []
      params = XPML.XPML_read("Shadow", @character.id, 2)
      if params != nil
        for i in 0...$game_temp.sun_spriteset.sun.size
          @sunlist.push(Sprite_Sun.new(@viewport0, @character, i))
        end
      end
    end
    if character.is_a?(Game_Player) and $game_temp.sun_spriteset.sun != []
      for i in 0...$game_temp.sun_spriteset.sun.size
        @sunlist.push(Sprite_Sun.new(@viewport0, $game_player, i))
      end
      #===================================================
      # Compatibilidade com Funções Caterpillar
      #===================================================
      if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
        for member in $game_party.characters
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
          end
        end
      end
      if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
        for member in $game_allies.values
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
          end
        end
      end
      if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
        for member in $game_train.actors
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
          end
        end
      end
      if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
        for member in $game_party.followers
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(@viewport0, member, i))
          end
        end
      end
      #===================================================
      # Fim da compatibilidade
      #===================================================       
    end
    # Perform the original call
    sun_initialize(viewport, @character)
  end
  #--------------------------------------------------------------------------
  # Atualização da tela
  #-------------------------------------------------------------------------- 
  def update
    sun_update
    if @sunlist != []
      for i in 0...@sunlist.size
        @sunlist[i].update
      end
    end
  end 
end

#==============================================================================
# Game_Event
#------------------------------------------------------------------------------
# Esta classe controla os eventos. Verifica as condições para mudar de página
# e funções, como processo paralelo. Utiliza a classe Game_Map.
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #--------------------------------------------------------------------------
  attr_accessor :id
end

#==============================================================================
# Sprite_Character
#------------------------------------------------------------------------------
# Classe que gerencia os gráficos de personagens a serem exibidos.
# Esta classe está vinculada à classe Game_Character, que a monitora e
# automaticamente muda o status do sprite.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # Variáveis públicas
  #-------------------------------------------------------------------------- 
  attr_accessor :sun
  #--------------------------------------------------------------------------
  # Lista Alias
  #--------------------------------------------------------------------------   
  alias sun_initialize initialize
  #--------------------------------------------------------------------------
  # Inicialização do objeto
  #--------------------------------------------------------------------------   
  def initialize
    @sun = []
    $game_temp.sun_spriteset = self
    warn = false
    for k in $game_map.events.keys.sort
      if ($game_map.events[k].list != nil and
          $game_map.events[k].list[0].code == 108 and
          ($game_map.events[k].list[0].parameters == ["sun"] or
          $game_map.events[k].list[0].parameters == ["o"]))
        warn = true
      end
      params = XPML.XPML_read("Sun", k, 2)
      $game_temp.sun_spriteset.sun.push(params) if params != nil
    end
    if warn == true and SUN_WARN
      p "Aviso : Pelo menos um evento neste mapa usa uma maneira obsoleta de adicionar um efeito do sol"
    end
    # Executar a chamada original
    sun_initialize
  end 
end

#==============================================================================
# ** module XPML
#------------------------------------------------------------------------------
#  Este módulo segura a leitura e a passagem de parâmetros do "comentário"
#
#  O método principal de XPML é usado para verificar e ler comentários do evento.
#  * Retorna 'nil' se o texto da "verificação" da markup não está presente.
#  * Retorna [] se nenhum parâmetro é passado
#  * Retorna uma lista de parâmetro com o "int" convertido como o int.
#       ex :
#       begin first
#       begin second
#       param1 1
#       param2 two
#       begin third
#       anything 3
#
#   p XPML_read("first", event_id) -> []
#   p XPML_read("second", event_id) -> [1,"two"]
#   p XPML_read("third", event_id) -> [3]
#   p XPML_read("forth", event_id) -> nil
#===================================================

module XPML
  module_function
  #--------------------------------------------------------------------------
  # * XPML_read
  #     markup           : verificar texto no comentário do evento
  #     event_id         : ID do evento
  #     max_param_number : número máximo de parametros/comentários para carregar
  #-------------------------------------------------------------------------- 
  def XPML_read(markup, event_id, max_param_number = 0)
    parameter_list = nil
    event = $game_map.events[event_id]
    return if event.list == nil
      for i in 0...event.list.size
        if event.list[i].code == 108 and
          event.list[i].parameters[0].downcase == "begin " + markup.downcase
          parameter_list = [] if parameter_list == nil
          for j in i + 1...event.list.size
            if event.list[j].code == 108
              parts = event.list[j].parameters[0].split
              if parts.size != 1 and parts[0].downcase != "begin"
                if parts[1].to_i != 0 or parts[1] == "0"
                  parameter_list.push(parts[1].to_i)
                else
                  parameter_list.push(parts[1])
                end
              else
                return parameter_list
              end
            else
              return parameter_list
            end
            if max_param_number != 0 and j == i + max_param_number
              return parameter_list
            end
          end
        end
      end
    return parameter_list
  end
end


[box class=titlebg]
Imagens
[/box]

[box class=titlebg]
Download
[/box]

[box class=titlebg]
Créditos e Avisos
[/box]
Baseado em Sprite Shadow
.Modificado por Rataime
.Novas edições por DerVVulfman
.Modificado para VX por Syvkal
.Traduzido por Bennamy :: Amy Productions