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

Bestiário VX

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

Bestiário VX

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

[box class=titlebg]
Para que serve o script
[/box]
Esse script diciona um bestíario que deve ser chamado por eventos.
Copie o script e cole-o acima do main. Para chamá-lo crie um evento e use o seguinte comando em chamar scripts: $scene = Scene_Bestiary.new

[box class=titlebg]
Script
[/box]
#==============================================================================
# ** Bestiary
#------------------------------------------------------------------------------
#  © Dargor, 2008
#  31/08/08
#  Version 1.5
#------------------------------------------------------------------------------
#  VERSION HISTORY:
#   - 1.0 (21/05/08), Initial release
#   - 1.1 (21/05/08), Minor bugs fixed
#   - 1.2 (24/05/08), Reseted Bestiary bug fixed
#   - 1.3 (01/06/08), Minor changes to the windows visibility/opacity
#   - 1.4 (04/06/08), Bug fixed with cursor width
#   - 1.5 (31/08/08), Compatible with Crissaegrim ABS
#------------------------------------------------------------------------------
#  INSTRUCTIONS:
#   1) Paste the script above main
#   2) Edit the Vocab variables
#   2) Edit the constants in the Bestiary module
#==============================================================================
 
#==============================================================================
#  ** Bestiary Configuration
#==============================================================================
 
module Bestiary
  # Enemies that won't appear in the bestiary
  Excluded_Enemies = [31]
  # 'Real' Elements, displayed in the bestiary
  Elements = [9,10,11,12,13,14,15,16]
  # 'Real' Elements Icon Index
  Element_Icons = { 9  => 104,
                    10 => 105,
                    11 => 106,
                    12 => 107,
                    13 => 108,
                    14 => 109,
                    15 => 110,
                    16 => 111,
                  }
  # Play a BG' in the bestiary
  Play_BGM = true
  # BGM List based on enemy ID
  BGM = { 19 => 'Battle7',
          20 => 'Battle7',
          21 => 'Battle7',
          22 => 'Battle7',
          23 => 'Battle7',
          24 => 'Battle7',
          25 => 'Battle8',
          26 => 'Battle8',
          27 => 'Battle8',
          28 => 'Battle8',
          29 => 'Battle8',
          30 => 'Battle9'
        }
  # Default BGM name
  BGM.default = 'Battle1'
  # Use Action Battle System
  # Set this to true ONLY if you are using Crissaegrim ABS
  Use_ABS = false
end
 
# Vocabulary
Vocab::Hit = 'Hit Rate'
Vocab::Eva = 'Evasion'
Vocab::Exp = 'EXP'
Vocab::UnknownEnemy = '??????'
Vocab::UnknownDrop  = '??????'
 
#==============================================================================
# ** Game_System
#------------------------------------------------------------------------------
#  This class handles system-related data. Also manages vehicles and BGM, etc.
# The instance of this class is referenced by $game_system.
#==============================================================================
 
class Game_System
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :new_enemy
  attr_accessor :enemy_encountered
  attr_accessor :enemy_defeated
  attr_accessor :enemy_drops
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias dargor_vx_bestiary_system_initialize initialize
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @new_enemy = []
    @enemy_encountered = []
    @enemy_defeated = []
    @enemy_drops = []
    for i in 1...$data_enemies.size
      @new_enemy[i] = true
      @enemy_encountered[i] = 0
      @enemy_defeated[i] = 0
      @enemy_drops[i] = [false, false]
    end
    dargor_vx_bestiary_system_initialize
  end
end
 
#==============================================================================
# ** Game_Troop
#------------------------------------------------------------------------------
#  This class handles enemy groups and battle-related data. Also performs
# battle events. The instance of this class is referenced by $game_troop.
#==============================================================================
 
class Game_Troop < Game_Unit
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias dargor_vx_bestiary_troop_setup setup
  alias dargor_vx_bestiary_troop_make_drop_items make_drop_items
  #--------------------------------------------------------------------------
  # * Setup
  #     troop_id : troop ID
  #--------------------------------------------------------------------------
  def setup(troop_id)
    dargor_vx_bestiary_troop_setup(troop_id)
    for member in troop.members
      next if $data_enemies[member.enemy_id] == nil
      enemy = Game_Enemy.new(@enemies.size, member.enemy_id)
      $game_system.enemy_encountered[member.enemy_id] += 1
    end
  end
  #--------------------------------------------------------------------------
  # * Create Array of Dropped Items
  #--------------------------------------------------------------------------
  def make_drop_items
    drop_items = []
    for enemy in dead_members
      for di in [enemy.drop_item1, enemy.drop_item2]
        next if di.kind == 0
        next if rand(di.denominator) != 0
        index = [enemy.drop_item1, enemy.drop_item2].index(di)
        $game_system.enemy_drops[enemy.enemy_id][index] = true
        if di.kind == 1
          drop_items.push($data_items[di.item_id])
        elsif di.kind == 2
          drop_items.push($data_weapons[di.weapon_id])
        elsif di.kind == 3
          drop_items.push($data_armors[di.armor_id])
        end
      end
    end
    return drop_items
  end
end
 
#==============================================================================
# ** Game_Enemy
#------------------------------------------------------------------------------
#  This class handles enemy characters. It's used within the Game_Troop class
# ($game_troop).
#==============================================================================
 
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias dargor_vx_bestiary_enemy_perform_collapse perform_collapse
  #--------------------------------------------------------------------------
  # * Perform Collapse
  #--------------------------------------------------------------------------
  def perform_collapse
    dargor_vx_bestiary_enemy_perform_collapse
    if $game_temp.in_battle and dead?
      $game_system.enemy_defeated[@enemy_id] += 1
    end
  end
end
 
#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================
 
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :encountered
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias dargor_vx_bestiary_event_initialize initialize
  alias dargor_vx_bestiary_event_update update
  if Bestiary::Use_ABS
    alias dargor_vx_bestiary_event_kill_enemy kill_enemy
  end
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(map_id, event)
    dargor_vx_bestiary_event_initialize(map_id, event)
    @encountered = false
    @defeated = false
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    if self.methods.include?('kill_enemy') && Bestiary::Use_ABS
      if @in_battle && !@encountered
        $game_system.enemy_encountered[@enemy_id] += 1
        @encountered = true
      end
    end
    dargor_vx_bestiary_event_update
  end
  #--------------------------------------------------------------------------
  # * Kill enemy
  #--------------------------------------------------------------------------
  def kill_enemy
    if self.methods.include?('kill_enemy') && Bestiary::Use_ABS && !@defeated
      @defeated = true
      $game_system.enemy_defeated[@enemy_id] += 1
      $game_system.enemy_drops[@enemy_id][0] = true
      $game_system.enemy_drops[@enemy_id][1] = true
      dargor_vx_bestiary_event_kill_enemy
    end
  end
end
 
#==============================================================================
# ** Window_Base
#------------------------------------------------------------------------------
#  This is a superclass of all windows in the game.
#==============================================================================
 
class Window_Base < Window
  #--------------------------------------------------------------------------
  # * Get HP Text Color
  #     enemy : enemy
  #--------------------------------------------------------------------------
  def hp_color(actor)
    return normal_color if actor.is_a?(RPG::Enemy)
    return knockout_color if actor.hp == 0
    return crisis_color if actor.hp < actor.maxhp / 4
    return normal_color
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy MAXHP
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #     width : Width
  #--------------------------------------------------------------------------
  def draw_enemy_maxhp(enemy, x, y, width = 120)
    draw_enemy_hp_gauge(enemy, x, y, width)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 30, WLH, Vocab::hp)
    self.contents.font.color = hp_color(enemy)
    last_font_size = self.contents.font.size
    xr = x + width
    self.contents.font.color = normal_color
    self.contents.draw_text(xr - 80, y, 80, WLH, enemy.maxhp, 2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy HP gauge
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #     width : Width
  #--------------------------------------------------------------------------
  def draw_enemy_hp_gauge(enemy, x, y, width = 120)
    gw = width
    gc1 = hp_gauge_color1
    gc2 = hp_gauge_color2
    self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color)
    self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy MAXMP
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #     width : Width
  #--------------------------------------------------------------------------
  def draw_enemy_maxmp(enemy, x, y, width = 120)
    draw_enemy_mp_gauge(enemy, x, y, width)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 30, WLH, Vocab::mp)
    self.contents.font.color = hp_color(enemy)
    last_font_size = self.contents.font.size
    xr = x + width
    self.contents.font.color = normal_color
    self.contents.draw_text(xr - 80, y, 80, WLH, enemy.maxmp, 2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy MP gauge
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #     width : Width
  #--------------------------------------------------------------------------
  def draw_enemy_mp_gauge(enemy, x, y, width = 120)
    gw = width
    gc1 = mp_gauge_color1
    gc2 = mp_gauge_color2
    self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color)
    self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy Parameters
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #     type  : Type of parameters (0-7)
  #--------------------------------------------------------------------------
  def draw_enemy_parameter(enemy, x, y, type)
    case type
    when 0
      parameter_name = Vocab::atk
      parameter_value = enemy.atk
    when 1
      parameter_name = Vocab::def
      parameter_value = enemy.def
    when 2
      parameter_name = Vocab::spi
      parameter_value = enemy.spi
    when 3
      parameter_name = Vocab::agi
      parameter_value = enemy.agi
    when 4
      parameter_name = Vocab::Hit
      parameter_value = enemy.hit
    when 5
      parameter_name = Vocab::Eva
      parameter_value = enemy.eva
    when 6
      parameter_name = Vocab::Exp
      parameter_value = enemy.exp
    when 7
      parameter_name = Vocab::gold
      parameter_value = enemy.gold
    end
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 120, WLH, parameter_name)
    self.contents.font.color = normal_color
    parameter_value = "#{parameter_value}%" if [4,5].include?(type)
    self.contents.draw_text(x + 100, y, 56, WLH, parameter_value, 2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy Drop
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #--------------------------------------------------------------------------
  def draw_enemy_drop(enemy,x,y)
    self.contents.font.color = system_color
    self.contents.draw_text(x,y,220,WLH,'Items Dropped')
    drops = []
    drops_index = []
    drops << enemy.drop_item1 unless enemy.drop_item1.kind == 0
    drops << enemy.drop_item2 unless enemy.drop_item2.kind == 0
    drops_index << 0 unless enemy.drop_item1.kind == 0
    drops_index << 1 unless enemy.drop_item2.kind == 0
    for i in 0...drops.size
      drop = drops[i]
      index = drops_index[i]
      case drop.kind
      when 1
        item = $data_items[drop.item_id]
      when 2
        item = $data_weapons[drop.weapon_id]
      when 3
        item = $data_armors[drop.armor_id]
      end
      if $game_system.enemy_drops[enemy.id][index]
        draw_item_name(item,x,y + (i+1) * WLH)
        probability = 100 / drop.denominator
        self.contents.draw_text(x,y + (i+1) * WLH,220,WLH, "#{probability}%",2)
      else
        self.contents.font.color = normal_color
        self.contents.draw_text(x+26,y + (i+1) * WLH,220,WLH,Vocab::UnknownDrop)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy Encountered
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #--------------------------------------------------------------------------
  def draw_enemy_encountered(enemy,x,y)
    self.contents.font.color = system_color
    self.contents.draw_text(x,y,120,WLH,'Encountered')
    times = $game_system.enemy_encountered[enemy.id]
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 120,y,36,WLH,times,2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy Defeated
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #--------------------------------------------------------------------------
  def draw_enemy_defeated(enemy,x,y)
    self.contents.font.color = system_color
    self.contents.draw_text(x,y,120,WLH,'Defeated')
    times = $game_system.enemy_defeated[enemy.id]
    self.contents.font.color = normal_color
    self.contents.draw_text(x + 120,y,36,WLH,times,2)
  end
  #--------------------------------------------------------------------------
  # * Draw Enemy Weakness
  #     enemy : enemy
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #--------------------------------------------------------------------------
  def draw_enemy_weakness(enemy,x,y)
    enemy = Game_Enemy.new(0, enemy.id)
    self.contents.font.color = system_color
    self.contents.draw_text(x,y,120,WLH,'Weakness')
    weakness = []
    for element_id in Bestiary::Elements
      weakness << element_id if enemy.element_rate(element_id) > 100
    end
    for i in 0...weakness.size
      element_id = weakness[i]
      x = 144 * (i % 2)
      y2 = WLH * (i / 2)
      icon_index = Bestiary::Element_Icons[element_id]
      draw_icon(icon_index,x,y2 + (y + WLH))
      element = $data_system.elements[element_id]
      self.contents.font.color = normal_color
      self.contents.draw_text(x+26,y2 + (y + WLH),120,WLH,element)
    end
  end
end
 
#==============================================================================
# ** Window_EnemyStatus
#------------------------------------------------------------------------------
#  This window displays full status specs on the bestiary screen.
#==============================================================================
 
class Window_EnemyStatus < Window_Base
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    super(0,0,544,416)
  end
  #--------------------------------------------------------------------------
  # * Setup
  #     enemy : enemy
  #     id    : bestiary id
  #--------------------------------------------------------------------------
  def setup(enemy, id)
    @enemy = enemy
    @id = id
    $game_system.new_enemy[enemy.id] = false
    refresh
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    bitmap = Cache.battler(@enemy.battler_name, @enemy.battler_hue)
    self.contents.blt(0,32,bitmap,bitmap.rect)
    self.contents.font.color = normal_color
    self.contents.draw_text(0,0,272,WLH,"#{@id}: #{@enemy.name}")
    draw_enemy_maxhp(@enemy,272,WLH * 1,156)
    draw_enemy_maxmp(@enemy,272,WLH * 2,156)
    for i in 0..7
      draw_enemy_parameter(@enemy, 304, WLH * 3 + (WLH * i), i)
    end
    draw_enemy_drop(@enemy,272,WLH * 11)
    draw_enemy_encountered(@enemy,272,WLH * 14)
    draw_enemy_defeated(@enemy,272,WLH * 15)
    draw_enemy_weakness(@enemy,0,WLH * 11)
  end
end
 
#==============================================================================
# ** Window_EnemyList
#------------------------------------------------------------------------------
#  This window displays full status specs on the bestiary screen.
#==============================================================================
 
class Window_EnemyList < Window_Selectable
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     x     : draw spot x-coordinate
  #     y     : draw spot y-coordinate
  #--------------------------------------------------------------------------
  def initialize(x,y)
    super(x,y,544,360)
    @column_max = 2
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # * Enemy
  #--------------------------------------------------------------------------
  def enemy
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # * Enemies
  #--------------------------------------------------------------------------
  def enemies
    return @data
  end
  #--------------------------------------------------------------------------
  # * Refresh
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @data = []
    for item in $data_enemies
      next if Bestiary::Excluded_Enemies.include?(item.id)
      @data << item
    end
    @data.compact!
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # * Draw Item
  #     index : index
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    item = @data[index]
    if item != nil
      rect.width -= 4
      if $game_system.enemy_encountered[item.id] > 0
        if $game_system.new_enemy[item.id]
          self.contents.font.color = power_up_color
        else
          self.contents.font.color = normal_color
        end
        self.contents.draw_text(rect, "#{index+1}:#{item.name}")
      else
        self.contents.font.color = normal_color
        text = "#{index+1}:#{Vocab::UnknownEnemy}"
        x = rect.x
        y = rect.y
        width = rect.width
        height = rect.height
        bitmap = self.contents
        color1 = Color.new(255,0,0)
        color2 = Color.new(0,255,0)
        self.contents.draw_text(rect, "#{index+1}:#{Vocab::UnknownEnemy}")
      end
    end
  end
end
#==============================================================================
# ** Scene_Bestiary
#------------------------------------------------------------------------------
#  This class performs the bestiary screen processing.
#==============================================================================
 
class Scene_Bestiary < Scene_Base
  #--------------------------------------------------------------------------
  # * Start processing
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @last_bgm = RPG::BGM.last
    @help_window = Window_Help.new
    @list_window = Window_EnemyList.new(0,56)
    @status_window = Window_EnemyStatus.new
    @status_window.visible = false
    encountered = 0
    for enemy in @list_window.enemies
      if $game_system.enemy_encountered[enemy.id] > 0
        encountered += 1
      end
    end
    completion1 = "#{encountered}/#{@list_window.enemies.size}"
    completion2 = (encountered * 100) / @list_window.enemies.size
    @help_window.set_text("Completion: #{completion1}(#{completion2}%)")
  end
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  def terminate
    super
    $game_message.texts = []
    dispose_menu_background
    @help_window.dispose
    @list_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update Processing
  #--------------------------------------------------------------------------
  def update
    super
    if @status_window.visible
      update_status_selection
      return
    end
    if @list_window.active
      @list_window.update
      update_list_selection
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Update Status Selection
  #--------------------------------------------------------------------------
  def update_status_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @status_window.visible = false
      @list_window.visible = true
      @help_window.visible = true
      @last_bgm.play
      return
    end
    if Input.trigger?(Input::L) or Input.repeat?(Input::L)
      Sound.play_cursor
      loop do
        @list_window.index = (@list_window.index + 1)
        @list_window.index %= @list_window.enemies.size
        break if $game_system.enemy_encountered[@list_window.index+1] > 0
      end
      process_status_window(@list_window.enemy, @list_window.index+1)
    end
    if Input.trigger?(Input::R) or Input.repeat?(Input::R)
      Sound.play_cursor
      loop do
        @list_window.index = (@list_window.index - 1) % @list_window.enemies.size
        break if $game_system.enemy_encountered[@list_window.index+1] > 0
      end
      process_status_window(@list_window.enemy, @list_window.index+1)
    end
  end
  #--------------------------------------------------------------------------
  # * Update List Selection
  #--------------------------------------------------------------------------
  def update_list_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      unless $game_system.enemy_encountered[@list_window.enemy.id] > 0
        Sound.play_buzzer
        return
      end
      process_status_window(@list_window.enemy, @list_window.index+1)
    end
  end
  #--------------------------------------------------------------------------
  # * Process Status Window
  #--------------------------------------------------------------------------
  def process_status_window(enemy, index)
    if Bestiary::Play_BGM
      bgm_name = Bestiary::BGM[enemy.id]
      if bgm_name.nil?
        bgm = RPG::BGM.new(Bestiary::BGM.default)
        bgm.play
      else
        bgm = RPG::BGM.new(bgm_name)
        bgm.play
      end
    end
    @status_window.setup(enemy, index)
    @status_window.visible = true
    @list_window.visible = false
    @help_window.visible = false
    @list_window.draw_item(index-1)
  end
end


[box class=titlebg]
Imagens
[/box]


[box class=titlebg]
Download
[/box]

[box class=titlebg]
Créditos e Avisos
[/box]
Criador : Dargor