Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

[Request]Menu System

kk I'm seriosuly desperate for this.
I have a Beastiary script, but I want that Beastiary option to be inside the menu system, in easier words,
I want a option in the menu system from RMVX that allows me to choose Beastiary. Thanks alot and please someone answer me...

Code:
#==============================================================================
# ** Bestiary
#------------------------------------------------------------------------------
#  © Dargor, 2008
#  04/06/08
#  Version 1.4
#------------------------------------------------------------------------------
#  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
#------------------------------------------------------------------------------
#  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 = [100]
  # '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'
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

#==============================================================================
# ** 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
        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

theres the Beastiary if you need it...
Note: It's NOT mine.

khmp: Please place code within code tags. You can delete this line when you see it.
 
Thanks for supplying the besitary script, always post the scripts related to your request, 9/10 times us scripters might need it for something. Okay, this is actually very simple, only a couple lines need to be added/changed to the menu.

First method you need to look for is Scene_Menu's "create_command_window" method. Here, you'll see an s1, s2, s3, etc... add another one, (I made s6 = "Bestiary" and made s7 the "End Game" command.) Don't forget, where it says...

@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7]) #<--place the extra command.

Last thing you need to do in Scene_Menu, is go to the "update_command_selection" section, and change it. Again, move Scene_End down one, change the "when" statement to "when 6", then write in

when 5
  $scene = Scene_Bestiary.new


Next, in the bestiary script, go into Scene_Bestiary and hotsearch for this line...

"$scene = Scene_Map.new"

and replace with...

"$scene = Scene_Menu.new(#)" the # is the index of the command that you cancel out to. In my example case, you'd exit back to 5.

Please don't overwrite your whole menu with this, its just a couple methods overwritten, however you can copy these methods over the existing ones if you'd like. Here's the code, just place it somewhere appropriate below the Scene_Menu (like in your "Materials" section)

Afterwords, open the bestiary script and hotsearch for this line...

"$scene = Scene_Map.new"

and replace with...

"$scene = Scene_Menu.new(#)"
The # is the index of the command that you cancel out to. In my example case, you'd exit back to 5.

Code:
class Scene_Menu
  #--------------------------------------------------------------------------
  # * Create Command Window
  #--------------------------------------------------------------------------
  def create_command_window
    s1 = Vocab::item
    s2 = Vocab::skill
    s3 = Vocab::equip
    s4 = Vocab::status
    s5 = Vocab::save
    s6 = "Besitary"
    s7 = Vocab::game_end
    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7])
    @command_window.index = @menu_index
    if $game_party.members.size == 0          # If number of party members is 0
      @command_window.draw_item(0, false)     # Disable item
      @command_window.draw_item(1, false)     # Disable skill
      @command_window.draw_item(2, false)     # Disable equipment
      @command_window.draw_item(3, false)     # Disable status
    end
    if $game_system.save_disabled             # If save is forbidden
      @command_window.draw_item(4, false)     # Disable save
    end
  end
  #--------------------------------------------------------------------------
  # * Update Command Selection
  #--------------------------------------------------------------------------
  def update_command_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      $scene = Scene_Map.new
    elsif Input.trigger?(Input::C)
      if $game_party.members.size == 0 and @command_window.index < 4
        Sound.play_buzzer
        return
      elsif $game_system.save_disabled and @command_window.index == 4
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      case @command_window.index
      when 0      # Item
        $scene = Scene_Item.new
      when 1,2,3  # Skill, equipment, status
        start_actor_selection
      when 4      # Save
        $scene = Scene_File.new(true, false, false)
      when 5      # Bestiary
        $scene = Scene_Bestiary.new
      when 6      # End Game
        $scene = Scene_End.new
      end
    end
  end
end
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top