Advanced Analyze System 2.2b

8 de agosto de 2011

Este script, feito por Blizzard, vai permitir seus personagens colher informações sobre inimigos durante a batalha e mostrá-los em uma janela, num game sendo feito no RPG Maker XP. Também conta com compatibilidade embutida com o script “Bestiary” e permite adicionar inimigos à ele apenas se os inimigos forem analisados pelo menos uma vez.

É um script bastante interessante, com uma função semelhante à magia/skill Identify Monster dos RPGs da série Might and Magic e pode ser facilmente usado em jogos tipo Pokémon.

Este script é 96% compatível com o SDK v1.x., 70% compatível com SDK v2.x. Pode causar incompatibilidade com CBSs exóticos e IRÁ corromper seus savegames antigos.

Funcionalidades

  • Cria um ou mais skills que são capazes de analisar inimigos durante a batalha
  • Mostra dados completos sobre estes
  • Suporte ao script “Bestiary” e a opção de anulá-lo, adicionando apenas inimigos analisados
  • Apertando SHIFT/ENTER, pode-se mudar a aparência da janela de análise
  • usando LEFT/RIGHT/UP/DOWN, pode-se navegar através da base de dados de informações

Leia com atenção os comentários do script, que contém mais informações importantes sobre configuração e personalização do sistema. Você pode pegar o código abaixo ou puxá-lo no minigame criado para demonstração. Neste caso, você vai precisar do RTP do RPG Maker XP e descompactar o arquivo.

#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Advanced Analyze System by Blizzard
# Version: 2.2b
# Type: Enemy Scan Window and Skill
# Date: 5.7.2006
# Date v1.1b: 31.8.2006
# Date v1.2b: 23.2.2007
# Date v1.3b: 7.7.2007
# Date v2.0b: 12.7.2007
# Date v2.1b: 6.8.2007
# Date v2.2b: 24.9.2007
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# Compatibility:
#
#   96% compatible with SDK v1.x. 70% compatible with SDK v2.x. May cause
#   incompatibility issues with exotic CBS-es. WILL corrupt your old savegames.
#
#
# Features:
#
#   - make one or more skills to be able to analyze enemies
#   - display of full data of enemies
#   - option to disable different information
#   - integrated support for my "Bestiary" script and option to override it and
#     only add analyzed enemies
#   - press SHIFT/ENTER to change the appearance of the analyze window
#   - use LEFT/RIGHT/UP/DOWN to navigate through the information database
#
# new in v1.1b:
#   - shorter, better and more simple code
#   - fixed the bug where trying to use a skill in the menu caused loss of SP,
#     no matter if the skill was used or could not be used
#   - updates now the spriteset while the Analyze window is visible
#
# new in v1.2b:
#   - improved coding (uses less RAM now and processes faster)
#
# new in v1.3b:
#   - increased compatibility
#
# new in v2.0b:
#   - completely overworked and fixed compatibility issues
#
# new in v2.1b:
#   - added custom info possibility
#
# new in v2.2b:
#   - rewritten conditions using classic syntax to avoid RGSS conditioning bug
#   - improved coding
#
#
# Instructions:
#
# - Explanation:
#
#   This script will allow your characters to retrieve information about
#   enemies during battle and show them in a window. It also has built-in
#   compatibility for my "Bestiary" script and allows adding enemies to it only
#   if enemies were analyzed at least once. This script can easily be used for
#   Pokémon typed games.
#
# - Configuration:
#
#   Configure the part below and make one or more skills, that can analyze
#   enemies. Add the IDs into the array called ANALYZE_IDS and separate them
#   with commas. If you have one or more scripts using dummy elements (e.g. my
#   EQUAP Skills, SephirothSpawn's Limit Break, etc.) be sure to include every
#   dummy element ID in the array called ELM_DUMMIES, also separated by commas.
#   With advanced configuration it is possible to disable different information
#   display, even during the game. Also it can be set up, that an enemy is
#   being rendered unanalyzeable or only partially unanalyzeable (e.g. disable
#   display of extreme element weaknesses for an enemy, etc.). Put this script
#   UNDER my "Bestiary" script if you use it.
#
# - For scripters:
#
#   The variable $game_system.analyzed includes an array of enemy IDs from
#   enemies, that were analyzed at least once during a fight. You can use this
#   array to make your own bestiary script working together with this script
#   and let only analyzed enemies be added into the bestiary. You can refer to
#   the global variable $advanced_analyze to check if this script is there.
#
#
# Important notes:
#
#   You MUST configure the part below if you have scripts that use dummy
#   elements! Do NOT give your enemies MORE than 12 elements/status effects of
#   one resistance type (e.g. 13 or more elements, that are absorbed), because
#   they won't be displayed. If you target anyone else than enemies, the skill
#   will analyze all enemies anyway.
#
#
# If you find any bugs, please report them here:
# http://www.chaosproject.co.nr
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

# basic configuration

ANALYZE_IDS = [81, 82, 83] # IDs of analyzing skills
ELM_DUMMIES = [] # include EVERY dummy element ID that is used by other scripts
STA_DUMMIES = [] # include EVERY dummy status effect ID, that you use
EVASION = 'EVA' # word displayed for Evasion

# set the value below to true to only ADD information of analyzed enemies into
# the bestiary if you use my Bestiary script

$override_bestiary = false

# set this value to true if you want the custom Analyze window information to
# be used in the bestiary as well, this way you use only one information for
# both systems

$override_bestiary_info = false

# enemy IDs from enemies, that can't be analyzed (e.g. bosses)

CANT_ANALYZE = [4] # overrides the IDs below and renders an enemy unanalyzeable

CANT_ANALYZE_BASIC = [3] # HP, SP, EXP, Gold, Item drop + chance
CANT_ANALYZE_STATS = [1] # STR, DEX, INT, AGI
CANT_ANALYZE_EXTSTATS = [1, 3] # ATK, PDEF, MDEF
CANT_ANALYZE_XTRWEAK = [1] # extreme element weakness
CANT_ANALYZE_WEAK = [2] # element weakness
CANT_ANALYZE_RESIST = [2, 3] # element resistance
CANT_ANALYZE_NULLIFY = [2] # element nullification
CANT_ANALYZE_ABSORB = [3] # element absorbtion
CANT_ANALYZE_XTRWEAK_S = [1] # extreme status effect weakness
CANT_ANALYZE_WEAK_S = [2] # status effect weakness
CANT_ANALYZE_RESIST_S = [2, 3] # status effect resistance
CANT_ANALYZE_NULLIFY_S = [2] # status effect nullification
CANT_ANALYZE_ABSORB_S = [3] # status effect absorbtion
CANT_ANALYZE_CUSTOM = [] # custom info

# If a display below is disabled, the appropriate part above will be overriden.
# The values below can also be changed during gameplay by just calling the
# "Call script" event command and changing the values like below
# DO NOT SET EVERYTHING TO true! THIS WILL BUG YOUR ANALYZE SKILL!

# set to true to disable display of basic info
DISABLE_BASIC = false
# set to true to disable display of basic stats
DISABLE_STATS = false
# set to true to disable display of extended stats
DISABLE_EXTSTATS = false
# set to true to disable display of extreme elemental weakness
DISABLE_XTRWEAK = false
# set to true to disable display of elemental weakness
DISABLE_WEAK = false
# set to true to disable display of elemental resistance
DISABLE_RESIST = false
# set to true to disable display of elemental nullification
DISABLE_NULLIFY = false
# set to true to disable display of elemental absorbtion
DISABLE_ABSORB = false
# set to true to disable display of extremeal status effect weakness
DISABLE_XTRWEAK_S = false
# set to true to disable display of status effect weakness
DISABLE_WEAK_S = false
# set to true to disable display of status effect resistance
DISABLE_RESIST_S = false
# set to true to disable display of status effect nullification
DISABLE_NULLIFY_S = false
# set to true to disable display of status effect absorbtion
DISABLE_ABSORB_S = false
# set to false to enable custom display
DISABLE_CUSTOM_ANALYZE = false

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if $DUMMY_ELEMENTS == nil
  $DUMMY_ELEMENTS = ELM_DUMMIES.clone
else
  $DUMMY_ELEMENTS |= ELM_DUMMIES
end
ELM_DUMMIES = nil
if $DUMMY_STATES == nil
  $DUMMY_STATES = STA_DUMMIES.clone
else
  $DUMMY_STATES |= STA_DUMMIES
end
STA_DUMMIES = nil

$advanced_analyze = true

#==============================================================================
# Game_System
#==============================================================================

class Game_System

  attr_accessor :analyze_mode
  attr_accessor :analyzed

  def get_analyze_info(id)
    case id
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Custom Analyze Info Database
#
# Use following template to add custom information about monsters:
#
#    when ID then return "STRING"
#
# ID is the enemy ID and STRING is a string with the information that should be
# displayed. Type all the information into one string, the script will slice
# the text by itself. Note that special characters like a " (double quote)
# need the use of the escape character \ (backslash). If you get and error
# with your string or the character doesn't appear right on the screen, try to
# use the escape character (i.e. for a " it would be \" instead of just ").
# The backslash itself needs an escape character (i.e. \\).
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    when 1 then return "And I thought there were no such things as ghosts..."
    when 2 then return "These creatures are said to be able to have the ability to turn anything they glaze at into stone. If this rumor is true, these creatures can be considered as part of the family of \"Gorgons\"."
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Custom Analyze Info Database
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    end
    return 'Unknown'
  end

  alias init_aas_later initialize
  def initialize
    init_aas_later
    @analyze_mode = 0
    # bestiary support
    @analyzed = []
  end

end

#==============================================================================
# Game_Battler
#==============================================================================

class Game_Battler

  alias skill_effect_aas_later skill_effect
  def skill_effect(user, skill)
    last_sr = self.sr if $crls && self.is_a?(Game_Actor)
    last_hp = self.hp
    result = skill_effect_aas_later(user, skill)
    if ANALYZE_IDS.include?(skill.id)
      self.damage = nil
      self.sr = last_sr if $crls && self.is_a?(Game_Actor)
      self.hp = last_hp
    end
    return result
  end

end

#==============================================================================
# Window_Base
#==============================================================================

class Window_Base

  def slice_text(text, width)
    result, last_word, current_text = [], 0, ''
    (0..text.size).each {|i|
        if text[i, 1] == ' ' || i == text.size
          word = text[last_word, i-last_word]
          if self.contents.text_size("#{current_text} #{word}").width > width
            result.push(current_text)
            current_text = word
          else
            current_text += (current_text == '' ? word : " #{word}")
          end
          last_word = i+1
        end}
    result.push("#{current_text} #{text[last_word, text.size-last_word]}")
    return result
  end

end

#==============================================================================
# Window_Analyze
#==============================================================================

class Window_Analyze < Window_Base

  attr_accessor :mode

  def initialize
    super(0, 0, 576, 224)
    @index_enemy = @index_page = 0
    @d = [DISABLE_BASIC, DISABLE_STATS, DISABLE_EXTSTATS, DISABLE_XTRWEAK,
          DISABLE_WEAK, DISABLE_RESIST, DISABLE_NULLIFY, DISABLE_ABSORB,
          DISABLE_XTRWEAK_S, DISABLE_WEAK_S, DISABLE_RESIST_S,
          DISABLE_NULLIFY_S, DISABLE_ABSORB_S, DISABLE_CUSTOM_ANALYZE]
    @pages = 14 - ((0..13).find_all {|i| @d[i]}).size
    @mode = $game_system.analyze_mode
    self.contents = Bitmap.new(width - 32, height - 32)
    if $fontface != nil
      self.contents.font.name = $fontface
      self.contents.font.size = $fontsize
    elsif $defaultfonttype != nil
      self.contents.font.name = $defaultfonttype
      self.contents.font.size = $defaultfontsize
    end
    self.x, self.y = 320 - self.width / 2, 160 - self.height / 2
    self.visible = self.active = false
    refresh
  end

  def update
    if Input.trigger?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @index_enemy = (@index_enemy + 1) % @enemies.size
      refresh
    elsif Input.trigger?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @index_enemy = (@index_enemy + @enemies.size - 1) % @enemies.size
      refresh
    elsif Input.trigger?(Input::DOWN)
      $game_system.se_play($data_system.cursor_se)
      @index_page = (@index_page + 1) % @pages
      refresh
    elsif Input.trigger?(Input::UP)
      $game_system.se_play($data_system.cursor_se)
      @index_page = (@index_page + @pages - 1) % @pages
      refresh
    end
  end

  def refresh
    case @mode
    when 0 then self.opacity = self.back_opacity = 255
    when 1 then self.back_opacity = 128
    when 2 then self.opacity = 0
    end
    self.contents.clear
    x = 4
    ox = x + 128
    ax = 100
    bx = ax + 144
    @enemies = []
    $game_troop.enemies.each {|enemy| @enemies.push(enemy) if enemy.exist?}
    @enemies.each {|enemy|
        unless $game_system.analyzed.include?(enemy.id)
          $game_system.analyzed.push(enemy.id)
          $game_system.enable(enemy.id) if $bestiary_enabled
        end}
    $game_system.analyzed.sort!
    enemy = @enemies[@index_enemy]
    w = self.width - self.contents.text_size(enemy.name).width
    name = "#{enemy.name}  #{make_battler_state_text(enemy, w, false)}"
    name = "#{@index_enemy+1}.  #{name}" if @enemies.size > 1
    self.contents.draw_text(0, 0, 544, 32, name, 1)
    unless CANT_ANALYZE.include?(enemy.id)
      case @index_page
      when (0 - ((0..0).find_all {|i| @d[i]}).size)
        if enemy.item_id > 0
          drop = $data_items[enemy.item_id]
          t = "#{drop.name} (#{enemy.treasure_prob}% chance)"
        elsif enemy.weapon_id > 0
          drop = $data_weapons[enemy.weapon_id]
          t = "#{drop.name} (#{enemy.treasure_prob}% chance)"
        elsif enemy.armor_id > 0
          drop = $data_armors[enemy.armor_id]
          t = "#{drop.name} (#{enemy.treasure_prob}% chance)"
        end
        self.contents.draw_text(ax, 32, 128, 32, $data_system.words.hp, 2)
        self.contents.draw_text(ax, 64, 128, 32, $data_system.words.sp, 2)
        self.contents.draw_text(ax, 96, 128, 32, 'EXP', 2)
        self.contents.draw_text(ax, 128, 128, 32, $data_system.words.gold, 2)
        self.contents.draw_text(ax, 160, 128, 32, 'Drops', 2)
        unless CANT_ANALYZE_BASIC.include?(enemy.id)
          self.contents.draw_text(bx, 32, 256, 32, "#{enemy.hp} / #{enemy.maxhp}")
          self.contents.draw_text(bx, 64, 256, 32, "#{enemy.sp} / #{enemy.maxsp}")
          self.contents.draw_text(bx, 96, 256, 32, enemy.exp.to_s)
          self.contents.draw_text(bx, 128, 256, 32, enemy.gold.to_s)
          self.contents.draw_text(bx, 160, 256, 32, (drop != nil ? t : 'nothing'))
        else
          (0...5).each {|i|
              self.contents.draw_text(bx, 32 + i*32, 544, 32, 'Cannot analyze this')}
        end
      when (1 - ((0..1).find_all {|i| @d[i]}).size)
        self.contents.draw_text(ax, 32, 128, 32, $data_system.words.str, 2)
        self.contents.draw_text(ax, 64, 128, 32, $data_system.words.dex, 2)
        self.contents.draw_text(ax, 96, 128, 32, $data_system.words.agi, 2)
        self.contents.draw_text(ax, 128, 128, 32, $data_system.words.int, 2)
        unless CANT_ANALYZE_STATS.include?(enemy.id)
          self.contents.draw_text(bx, 32, 256, 32, enemy.str.to_s)
          self.contents.draw_text(bx, 64, 256, 32, enemy.dex.to_s)
          self.contents.draw_text(bx, 96, 256, 32, enemy.agi.to_s)
          self.contents.draw_text(bx, 128, 256, 32, enemy.int.to_s)
        else
          (0...4).each {|i|
              self.contents.draw_text(bx, 32 + i*32, 544, 32, 'Cannot analyze this')}
        end
      when (2 - ((0..2).find_all {|i| @d[i]}).size)
        self.contents.draw_text(ax, 32, 128, 32, $data_system.words.atk, 2)
        self.contents.draw_text(ax, 64, 128, 32, $data_system.words.pdef, 2)
        self.contents.draw_text(ax, 96, 128, 32, $data_system.words.mdef, 2)
        self.contents.draw_text(ax, 128, 128, 32, EVASION, 2)
        unless CANT_ANALYZE_EXTSTATS.include?(enemy.id)
          self.contents.draw_text(bx, 32, 256, 32, enemy.atk.to_s)
          self.contents.draw_text(bx, 64, 256, 32, enemy.pdef.to_s)
          self.contents.draw_text(bx, 96, 256, 32, enemy.mdef.to_s)
          self.contents.draw_text(bx, 128, 256, 32, enemy.eva.to_s)
        else
          (0...4).each {|i|
              self.contents.draw_text(bx, 32 + i*32, 544, 32, 'Cannot analyze this')}
        end
      when (3 - ((0..3).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Extremely efficient elements:')
        draw_elements(enemy, x, 1, CANT_ANALYZE_XTRWEAK.include?(enemy.id))
      when (4 - ((0..4).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Efficient elements:')
        draw_elements(enemy, x, 2, CANT_ANALYZE_WEAK.include?(enemy.id))
      when (5 - ((0..5).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Elemental resistances:')
        draw_elements(enemy, x, 4, CANT_ANALYZE_RESIST.include?(enemy.id))
      when (6 - ((0..6).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Elemental nullifications:')
        draw_elements(enemy, x, 5, CANT_ANALYZE_NULLIFY.include?(enemy.id))
      when (7 - ((0..7).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Elemental absorbtions:')
        draw_elements(enemy, x, 6, CANT_ANALYZE_ABSORB.include?(enemy.id))
      when (8 - ((0..8).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Extremely efficient status effects:')
        draw_states(enemy, x, 1, CANT_ANALYZE_XTRWEAK_S.include?(enemy.id))
      when (9 - ((0..9).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Efficient status effects:')
        draw_states(enemy, x, 2, CANT_ANALYZE_WEAK_S.include?(enemy.id))
      when (10 - ((0..10).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Status effect resistances:')
        draw_states(enemy, x, 4, CANT_ANALYZE_RESIST_S.include?(enemy.id))
      when (11 - ((0..11).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Strong status effect resistances:')
        draw_states(enemy, x, 5, CANT_ANALYZE_NULLIFY_S.include?(enemy.id))
      when (12 - ((0..12).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Status effect immunities:')
        draw_states(enemy, x, 6, CANT_ANALYZE_ABSORB_S.include?(enemy.id))
      when (13 - ((0..13).find_all {|i| @d[i]}).size)
        self.contents.draw_text(x, 32, 544, 32, 'Information:')
        draw_info(enemy, x, CANT_ANALYZE_CUSTOM.include?(enemy.id))
      end
    else
      self.contents.draw_text(0, 64, 544, 32, 'Cannot analyze this enemy', 1)
    end
  end

  def draw_elements(enemy, x, index, check)
    unless check
      elements = []
      (1...$data_system.elements.size).each {|id|
          if !$DUMMY_ELEMENTS.include?(id) &&
              index == $data_enemies[@enemies[@index_enemy].id].element_ranks[id]
            elements.push($data_system.elements[id])
          end}
      elements = ['Nothing'] if elements.size == 0
      elements.each_index {|i|
          self.contents.draw_text(x + i/4*180, 64 + i%4*32, 176, 32, elements[i])}
    else
      self.contents.draw_text(x, 64, 544, 32, 'Cannot analyze this')
    end
  end

  def draw_states(enemy, x, index, check)
    unless check
      states = []
      (1...$data_states.size).each {|id|
          if !$DUMMY_STATES.include?(id) &&
              index == $data_enemies[@enemies[@index_enemy].id].state_ranks[id]
            states.push($data_states[id].name)
          end}
      states = ['Nothing'] if states.size == 0
      states.each_index {|i|
          self.contents.draw_text(x + i/4*180, 64 + i%4*32, 176, 32, states[i])}
    else
      self.contents.draw_text(x, 64, 544, 32, 'Cannot analyze this')
    end
  end

  def draw_info(enemy, x, check)
    unless check
      text = slice_text($game_system.get_analyze_info(enemy.id), 528)
      text.each_index {|i|
          self.contents.draw_text(x, 64 + i*32, 544, 32, text[i])}
    else
      self.contents.draw_text(x, 64, 544, 32, 'Cannot analyze this')
    end
  end

end

#==============================================================================
# Scene_Battle
#==============================================================================

class Scene_Battle

  alias make_skill_action_result_aas_later make_skill_action_result
  def make_skill_action_result
    make_skill_action_result_aas_later
    @analyze_window = Window_Analyze.new if ANALYZE_IDS.include?(@skill.id)
  end

  alias update_phase4_step5_aas_later update_phase4_step5
  def update_phase4_step5
    update_phase4_step5_aas_later
    if @analyze_window != nil
      Graphics.freeze
      @analyze_window.visible = true
      Graphics.transition(10)
      loop do
        Graphics.update
        Input.update
        @analyze_window.update
        @spriteset.update
        $game_screen.update
        if Input.trigger?(Input::A) || Input.trigger?(Input::C)
          $game_system.se_play($data_system.cursor_se)
          Graphics.freeze
          case @analyze_window.mode
          when 0 then @analyze_window.back_opacity = 128
          when 1 then @analyze_window.opacity = 0
          when 2 then @analyze_window.opacity = @analyze_window.back_opacity = 255
          end
          $game_system.analyze_mode = ($game_system.analyze_mode+1) % 3
          @analyze_window.mode = $game_system.analyze_mode
          Graphics.transition(5)
        end
        break if Input.trigger?(Input::B)
      end
      Graphics.freeze
      $game_system.se_play($data_system.cancel_se)
      @analyze_window.dispose
      @analyze_window = nil
      Graphics.transition(10)
    end
  end

end
autor, site, canal ou publisher Site tamanho 213 KB licençaGratuita sistemas operacionais compativeisWindows 98/98SE/Me/2000/XP/Vista/7 download link DOWNLOAD

Observação: se você gostou deste post ou ele lhe foi útil de alguma forma, por favor considere apoiar financeiramente a Gaming Room. Fico feliz só de ajudar, mas a contribuição do visitante é muito importante para que este site continua existindo e para que eu possa continuar provendo este tipo de conteúdo e melhorar cada vez mais. Clique aqui e saiba como. Obrigado!

Deixe um comentário

Inscreva-se na nossa newsletter!