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

M+ Event Icons

Iniciado por M3T, 30/07/2014 às 18:40

30/07/2014 às 18:40 Última edição: 31/07/2014 às 14:53 por M3T

M+ Event Icons
v1.0


Compativel com: RMVXAce/XP
Compatibilidade: boa
Facilidade de uso: fácil
Lag gerado: pouco



Introdução e Características
Este script permite que você mostre um ícone (pode ser qualquer imagem) em cima de um ou mais evento(s).
Diferente de outros do estilo, além de ter um comentário que, ao estar presente no evento, mostrará o icone independentemente de interação com ele, o script também tem um que funciona como um comando normal, ou seja, pode ser ativado quando for mandado, e não será ativado caso tenha uma condição bloqueando-o.
Você também pode controlar os ícones de outro evento, podendo desativá-lo, ativá-lo e mudá-lo.

Como o script mostra sprites adicionais no mapa, ele tem chances de gerar lag, mas eu testei ele em um mapa com mais de 100 eventos se mexendo com um ícone na cabeça. O FPS se manteu em 39-40, ou seja, a chance dele gerar lag é baixíssima. Veja abaixo:
Spoiler
[close]

Se você quiser que os ícones sejam salvos mesmo que você saia do mapa, dê uma olhada neste script:
M+ Save Event Infos



Instruções de uso
- Crie um novo script na seção "Scripts Adicionais" e cole o script abaixo lá
- Eu considero a configuração dentro do script desnecessária, mas ela está lá. Você pode mudar o deslocamento do ícone, a opacidade e a prioridade do ícone sobre outros sprites.
- Para deixar um ícone em um evento sem ter que interagir com ele, coloque um comentário em qualquer lugar do evento escrito:
event_icon <nome_da_imagem>

Substitua <nome_da_imagem> pelo nome da imagem encontrada no Graphics/Pictures que será mostrada.
- Para fazer com que um ícone apareça no evento quando você quiser, ou seja, ele não já nascerá com o ícone e o comentário funcionará como qualquer outro comentário e sofrerá condições, crie um comentário com:
set_icon <nome_da_imagem> <self/número do evento>

Substitua <self/número do evento> por "self" (sem as aspas) se quiser que o ícone apareça em cima do próprio evento ou o número de um evento no mapa para o ícone aparecer nele.
- Para desativar um ícone em certo evento, crie um comentário com (este comando funciona igual o acima, portanto, funciona como um comando normal):
icon_deactivate <self/número do evento>

- Para ativar o ícone novamente no evento, crie um comentário com:
icon_activate <self/número do evento>




Imagens
[hs width=216 height=164]http://i.imgur.com/RQL21C2.png[/hs]



Script
#==============================================================================
# M+ Event Icons - 1.0
# Por M3T
# (30/07/2014)
#------------------------------------------------------------------------------
# Este script possibilita que ícones sejam mostrados acima dos
# eventos. Você pode mostrá-lo de 2 formas:
# -Ícone automático, como vários outros scripts que já fazem
# isso. (event_icon <nome do ícone>)
# -Ícone somente quando ativado, assim o comentário funciona como
# um comando de verdade, pois será somente ativado quando passar
# pelas condições do evento. (set_icon <nome do ícone> <evento>)
#==============================================================================
# Para deixar um evento com um ícone sem ter que interagir com
# ele: 
# Insira um comentário em qualquer lugar do evento com: 
# event_icon <nome_da_imagem>
# Substitua <nome_da_imagem> pelo nome da imagem dentro da pasta
# Graphics/Pictures.
# -
# Para deixar um evento com um ícone interagindo com ele:
# Insira um comentário onde quer que o ícone seja ligado,
# ou seja, se estiver dentro de uma condição, ele terá que
# cumprir essa condição, com:
# set_icon <nome_da_imagem> <self/número do evento>
# Caso queira que o ícone seja no próprio evento, coloque self.
# Caso queira que seja em outro evento do mapa, coloque o ID dele.
# -
# Para desativar o ícone de um evento (funciona do mesmo jeito
# que o comando acima), insira um comentário com:
# icon_deactivate <self/número do evento>
# -
# Para ativá-lo novamente, insira um comentário com:
# icon_activate <self/número do evento>
#==============================================================================
# * Configuração do Script
module MPlus
  # Quantidade de pixels que o ícone será mais para a direita
  # (para a esquerda, é só colocar um número negativo)
  EventIcon_PlusX = 0
  # Quantidade de pixels que o ícone será mais para baixo
  # (para cima, é só colocar um número negativo)
  EventIcon_PlusY = -10
  # Prioridade do Ícone sobre outros Sprites.
  # Isto serve para regular se ele fica em cima ou em baixo
  # de outras coisas. Quanto maior o número, maior a prioridade.
  # (é o valor "z" do sprite)
  EventIcon_Priority = 10
  # Opacidade do Ícone.
  EventIcon_Opacity = 255
end
#==============================================================================
class Interpreter
  def execute_command
    # Quando se chega ao fim da lista de execução
    if @index >= @list.size - 1
      # terminar evento
      command_end
      # Continuar
      return true
    end
    # Parâmetro de um comando de evento referência no @parameters
    command = @list[@index]
    @parameters = command.parameters
    eval "command_#{command.code}"
    # Ok, eu sei. Modifiquei esse método para ficar igual ao do
    # VX Ace, mas ninguém merece o original do XP, né?
    # Se eu não fizesse isso, o código ficaria muito maior e
    # a interferência com outros scripts seria maior. -M3T
  end
  
  alias m_icon_command_108 command_108 if defined?(command_108)
  def command_108
    m_icon_command_108 if defined?(m_icon_command_108)
    d = @parameters[0]
    ev = $game_map.events[@event_id]
    d.gsub(/icon_deactivate[ ]?(\w+)/) {
      if $1 != "self"
        $game_map.events[$1.to_i].icon_active = false
      else
        ev.icon_active = false
      end }
    d.gsub(/icon_activate[ ]?(\w+)/) {
      if $1 != "self"
        $game_map.events[$1.to_i].icon_active = true
      else
        ev.icon_active = true
      end }
    d.gsub(/set_icon[ ]?(\w+) (\w+)/) {
      if $2 != "self"
        $game_map.events[$2.to_i].icon_active = true
        $game_map.events[$2.to_i].icon_name = $1
      else
        ev.icon_name = $1
        ev.icon_active = true
      end }
  end
  alias command_408 command_108
end

class Game_Character
  attr_accessor :icon_name
  attr_accessor :icon_active
  alias m_icon_ch_initialize initialize
  def initialize
    m_icon_ch_initialize
    @icon_name = ""
    @icon_active = false
  end
end

class Game_Event < Game_Character
  alias m_icon_evt_initialize initialize
  def initialize(map_id, event)
    m_icon_evt_initialize(map_id, event)
    return if @list.nil?
    for item in @list
      next if item.nil?
      if [108, 408].include?(item.code)
        item.parameters[0].gsub(/event_icon[ ]?(\w+)/) {
        @icon_name = $1
        @icon_active = true }
      end
    end
  end
end

class Sprite_Character
  include MPlus
  alias m_icon_event_initialize initialize
  def initialize(viewport, character = nil)
    if character.is_a?(Game_Event)
      v = Viewport.new(0, 0, 640, 480)
      v.z = EventIcon_Priority
      @icon_sprite = Sprite.new(v)
      @icon_sprite.opacity = 0
    end
    m_icon_event_initialize(viewport, character)
  end
  
  alias m_icon_event_update update
  def update
    m_icon_event_update
    if @character.icon_name != ""
      if @character.icon_active
        if @icon_sprite.bitmap == nil or @character.icon_name != @actual_icon_name
          icon_name = @character.icon_name
          @icon_sprite.bitmap = RPG::Cache.picture(icon_name)
          @actual_icon_name = icon_name
        end
        x = ((self.bitmap.width / 4) - @icon_sprite.bitmap.width) / 2
        y = -@icon_sprite.bitmap.height 
        @icon_sprite.x = (self.x - self.ox) + x + EventIcon_PlusX
        @icon_sprite.y = (self.y - self.oy) + y + EventIcon_PlusY
      end
      @icon_sprite.opacity = @character.icon_active ? EventIcon_Opacity : 0
    end
  end
  
  alias m_icon_event_dispose dispose
  def dispose
    if @icon_sprite != nil && !@icon_sprite.disposed?
      @icon_sprite.dispose
    end
    m_icon_event_dispose
  end
end