The RPG Maker Resource Kit

RMRK RPG Maker Creation => VX => VX Scripts Database => Topic started by: modern algebra on August 18, 2009, 05:06:27 PM

Title: Monster Catalogue
Post by: modern algebra on August 18, 2009, 05:06:27 PM
Monster Catalogue
Version: 1.0b
Author: modern algebra
Date: August 21, 2009

Version History



Description


This script allows you to create multiple monster catalogues that shows a small information window on any monsters you have encountered (and have included in the particular catalogue). As with all my Catalogue scripts, you can make many different catalogues. Want a catalogue that shows all monsters? That can be done. Want a catalogue that only shows Undead monsters? That can be done too. You can also turn auto encounter to off and manually set when monsters should show up, or you could turn the show all option on for a catalogue and have it reveal all monsters included in the catalogue. The choice is yours to make :)

Features


Screenshots

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg188.imageshack.us%2Fimg188%2F1126%2Fmonstercatscreen.png&hash=e20299f9b0bc149bf6ee9297ea6577169461dd93)

Instructions

Please see the header and the editable regions for instructions on using this script

Script


Please note that this script requires the Catalogue Base (http://rmrk.net/index.php/topic,34376.0.html) script. Bitmap Addons (http://rmrk.net/index.php/topic,32286.0.html) is recommended.


Code: [Select]
#==============================================================================
#    Monster Catalogue
#    Version: 1.0b
#    Author: modern algebra (rmrk.net)
#    Date: August 21, 2009
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Description:
#
#    This script allows you to create a monster catalogue that shows a small
#   information window on any monsters you have encountered (if you have auto
#   encounter ON. You could also manually alter which monsters have been
#   "encountered" if you wish to set different conditions on their inclusion in
#   the catalogues. As with all my Catalogue scripts, you can make many
#   many different catalogues. Want a catalogue that shows all monsters? That
#   can be done. Want a catalogue that only shows Undead monsters? That can be
#   done too.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Instructions:
#
#    This script REQUIRES the Catalogue_Base script, and Bitmap Addons is
#   recommended. Both can be found in the RMVX Scripts Database of RMRK.
#
#    Place this script above Main and below Catalogue Base (which should itself
#   be below Materials). For instructions on setting up new catalogues and
#   other configuration options, please see the editable regions at lines 122,
#   157, and 252.
#
#    To call a catalogue screen, use this code:
#
#      $scene = Scene_Catalogue.new (id)
#
#    By default, the all enemies catalogue has an ID of 20, and this is because
#   I didn't want it to interfere if you also have the Items Catalogue. Remember
#   that NO catalogue can have the same ID as another, even if they are
#   different scripts. So, by default, to call the all enemies catalogue, the
#   code is:
#
#      $scene = Scene_Catalogue.new (20)
#
#  To manually "encounter" an enemy without having to actually fight the
# monster, you can use the code in a Call Script:
#
#    encounter_monster (monster_id)
#      monster_id : the ID of the monster to encounter
#
#    Some Enemy data can be set in the notebox.
#
#      SPECIES
#  In order to make monster collection a little more interesting, it is
# possible to give an enemy a species now. It is purely cosmetic. If you wish
# to get rid of it altogether, then go down to lines 163 and 127 and change
# the name to "" and icon to 0. Those are the default species settings.
# However, you can change species settings on an individual enemy basis by
# putting these codes in the note box of the enemy:
#
#    \species["<name>"]
#      name : the name of the species.
#    \species_icon[<index>]
#      index : the icon index for the species
#
#  Example:
#    \species[Undead]
#    \species_icon[112]
#
#      ICON
#  In order to make the monster list a little more interesting looking, you can
# give them individual icons to show up in that list. If you do not give them
# an individual icon, then it will default to showing the species icon. The
# code to put in the notes box is:
#
#    \icon[<index>]
#      index : the index of the icon you want to use.
#
#  Example:
#    \icon[1]
#
#  Note: if you want to keep a species icon, but don't want any icons to show
#   up next to the monster's name in the list, than you can manually set the
#   icon to blank with the code: \icon[0]
#
#      DESCRIPTION
#  Another feature to make the screens a little more interesting is that you
# can give monsters individual descriptions. If you don't give them a
# description, than it will default to the value at line 166. The code to put in
# the note box is:
#
#    \description[<text>]
#      text : the description text. Don't worry about extending past one line.
#
#  Example:
#    \description[It may be blind,
#     but it's still a dangerous
#     foe]
#
#      CATALOGUE Y
#  This is something purely cosmetic. By default, the monster battler is drawn
# at about 48 pixels in the catalogue window. This allows you to change that
# y value if you so desire. It can make for a nice effect with maybe flying
# creatures appearing a little over the border, for instance, or anything like
# that really. It's very unnecessary though, and I recommend you not altering
# it. The code to put in the note box is:
#  
#    \cat_y[<new_y>]
#      new_y : the y position for the battler in the catalogue window
#
#  Example:
#    \cat_y[16]
#==============================================================================\

#==============================================================================
# *** ModernAlgebra
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new constants - CM_DEFAULT_SPECIES_ICON
#==============================================================================

module ModernAlgebra
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # ** CONSTANTS
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  #  EDITABLE REGION A
  #``````````````````````````````````````````````````````````````````````````
  #  Read the instructions surrounding each constant to see what it does.
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  # The icon for whatever you set as the default species
  CM_DEFAULT_SPECIES_ICON = 196
  # Truth value of whether monsters should be visible once they are first
  #  fought against or whether it should be done manually.
  CM_AUTO_ENCOUNTER_MONSTERS = true
  # All colours set up as: [Red, Green, Blue[, Alpha]]
  CM_MONSTERSPECIES_COLOUR = [160, 160, 160] # Colour of Monster Race
  CM_MONSTERCARD_RIM_COLOUR = [105, 105, 255, 255] # Colour of Card Border
  CM_MONSTERCARD_RIMSHADOW_COLOUR = [0, 0, 0] # Shadow of Card Border
  #  Icons to represent elements of items in the Item Card. Every element MUST
  # have an icon. If you have set this up in CI_ITEM_ELEMENT_ICONS, you can
  # delete it here.
  CI_ITEM_ELEMENT_ICONS = [132, 2, 4, 14, 16, 12, 138, 137, 104, 105, 106, 107,
                           108, 109, 110, 111]
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #  END EDITABLE REGION A
  #//////////////////////////////////////////////////////////////////////////
end

#==============================================================================
# *** Vocab
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new constants : GI_EVASION; GI_HIT_RATIO; CM_DEFAULT_RACE
#==============================================================================

module Vocab
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # ** CONSTANTS
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  #  EDITABLE REGION B
  #``````````````````````````````````````````````````````````````````````````
  #  Read the instructions surrounding each constant to see what it does.
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  # If a species name is not set in the enemy's note box, it will show up
  #  as the following for defualt.
  CM_DEFAULT_SPECIES_NAME = "Monster"
  # If a description is not set in an enemy's note box, this is the description
  #  it will have.
  CM_DEFAULT_MONSTER_DESCRIPTION = "A fearsome foe"
  # These are the letter ranks for a monster's element efficiency.
  CM_ELEMENT_RANKS = ["A", "B", "C", "D", "E", "F"]
  # All constants prefaced by GI are also present in the Grid Inventory script
  #  and in the Item & Skill Catalogue script; if you have either of those
  #  scripts, it is recommended that you delete any of the constants with GI
  #  preface in this script (Monster Catalogue).
  # THe label for stats
  GI_STATS = "Stats"
  # The label for the evasion stat of armors
  GI_EVASION = "Evasion"
  # The label for the hit stat of skills & weapons
  GI_HIT_RATIO = "Hit Ratio"
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #  END EDITABLE REGION B
  #//////////////////////////////////////////////////////////////////////////
end

#==============================================================================
# ** RPG::Enemy
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new method - ma_species
#==============================================================================

class RPG::Enemy
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Species Name
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def ma_species_name
    if @species_name == nil
      @species_name = self.note[/\\SPECIES\[(.*?)\]/i] != nil ? $1 : Vocab::CM_DEFAULT_SPECIES_NAME
    end
    return @species_name
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Species Icon
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def ma_species_icon
    if @species_icon == nil
      @species_icon = self.note[/\\SPECIES_ICON\[(\d+)\]/i] != nil ? $1.to_i : ModernAlgebra::CM_DEFAULT_SPECIES_ICON
    end
    return @species_icon
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * ICON
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def icon_index
    if @ma_icon == nil
      @ma_icon = self.note[/\\ICON\[(\d+)\]/i] != nil ? $1.to_i : ma_species_icon
    end
    return @ma_icon
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * ICON
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def description
    if @ma_desc == nil
      @ma_desc = self.note[/\\DESCRIPTION\[(.*?)\]/i] != nil ? $1 : Vocab::CM_DEFAULT_MONSTER_DESCRIPTION
    end
    return @ma_desc
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Catalogue Y
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def catalogue_y
    @ma_cat_y = (self.note[/\\CAT_Y\[(\d+)\]/i] != nil ? $1.to_i : 32) if @ma_cat_y == nil
    return @ma_cat_y
  end
end

#==============================================================================
# ** Data Catalogues
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#==============================================================================

class Data_Catalogues
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malgbr_monstcatlg_intlz_5bc2 initialize
  def initialize (*args)
    malgbr_monstcatlg_intlz_5bc2 (*args) # Run Original Method
    #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    #  EDITABLE REGION C
    #``````````````````````````````````````````````````````````````````````
    #  These are the setup options for making catalogues. It can be sort of
    # complicated, so I will go into detail here.
    #
    #  A catalogue object can be made with the following code:
    #
    #    @data[<id>] = Catalogue_Monster.new ("<name>", [<objects>], <show_all>)
    #      id       : this is the ID of this catalogue. When you open a
    #        catalogue, this is how you reference the catalogue you want to
    #        open. No two catalogues can EVER possess the same ID.
    #      name     : this is the name of the catalogue, as it appears in the
    #        catalogue scene when you open this catalogue. Defaults to
    #        "Catalogue"
    #      objects  : this is the array of monster IDs that  belong to this
    #        catalogue and will show up (if encountered) when the catalogue is
    #        open.  Defaults to []
    #      show_all : this is the truth value on whether encountered arrays
    #        are ignored. If true, then all objects in the catalogue,
    #        regardless of whether they've been encountered, will show up
    #        when this particular catalogue is opened. Note that it will
    #        show all objects of THIS catalogue, which is to say that it
    #        will only show them if they are set as objects belonging. It
    #        DOESN'T mean that all monsters ever will show up, unless those
    #        are the objects setup. Defaults to false
    #
    #  The default monster catalogues are:
    #
    #    20 => Name: Enemies; Objects: All enemiesin database; shows only
    #      encountered enemies in its group. It is called by:
    #
    #            $scene = Scene_Catalogue.new (20)
    #``````````````````````````````````````````````````````````````````````
    # * EXAMPLES
    #    monsters = [1, 2, 3, 4, 7, 8, 9]
    #    @data[22] = Catalogue_Monster.new ("Random Baddies", monsters, true)
    #
    #      this will make a catalogue that will include the enemies with IDs
    #     1, 2, 3, 4, 7, 8, & 9. It is named "Random Baddies", and it will
    #     always show all the monsters it includes regardless of whether
    #     they have been encountered because show_all is true. It's ID is 22,
    #     so it can be called by:
    #              $scene = Scene_Catalogue.new (22)
    #
    #    monsters = [2, 3, 6, 11, 14, 15, 18, 19, 27]
    #    @data[23] = Catalogue_Monster.new ("Flying Enemies", monsters)
    #
    #      this will make a catalogue that will include the enemies with IDs
    #     2, 3, 6, 11, 14, 15, 18, 19, & 27. It is named "Flying Enemies",
    #     and it will only show the monsters it includes if they have been
    #     encountered by the party. It's ID is 23, so it can be called by:
    #              $scene = Scene_Catalogue.new (23)
    #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    all_monsters = []
    for i in 1...$data_enemies.size do all_monsters.push (i) end
    @data[20] = Catalogue_Monster.new ("Enemies", all_monsters)
    undead = [11, 12, 17, 26]
    @data[21] = Catalogue_Monster.new ("Undead", undead)
    #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    #  END EDITABLE REGION C
    #//////////////////////////////////////////////////////////////////////
  end
end

#==============================================================================
# ** Game_Party
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#    new public instance variable - encountered_monsters
#==============================================================================

class Game_Party
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader   :encountered_monsters
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias algbamorn_init_monstrcatlg_6jb1 initialize
  def initialize (*args)
    @encountered_monsters = []
    algbamorn_init_monstrcatlg_6jb1 (*args) # Run Original Method
  end
end

#==============================================================================
# ** Game Interpreter
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new method - encounter_monster
#==============================================================================

class Game_Interpreter
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Encounter Monster
  #    monster_id : the ID of the monster to encounter
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def encounter_monster (monster_id)
    $game_party.encountered_monsters.push (monster_id) unless $game_party.encountered_monsters.include? (monster_id)
  end
end

#==============================================================================
# ** Catalogue_Monster
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    modified super methods - card; object; object_help_text; include?
#==============================================================================

class Catalogue_Monster < Catalogue_Base
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Card
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def card
    return Window_MonsterCard
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object
  #    index : index of the object in @objects
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def object (index)
    return nil if index == nil || @objects[index] == nil
    return $data_enemies[@objects[index]]
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Help Text
  #    index : index of the object in @objects
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def object_help_text (index)
    return "" if object (index) == nil
    return object (index).description
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Include?
  #    index : index of the object in @objects
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def include? (index)
    return true if @show_all
    return $game_party.encountered_monsters.include? (@objects[index])
  end
end

#==============================================================================
# ** Window MonsterCard
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This window displays all relevant information about a monster
#==============================================================================

class Window_MonsterCard < Window_CatalogueCard
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Refresh
  #    placement : the item placement
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def refresh (index)
    super
    draw_border
    return if @object == nil
    draw_monster_name (8, 4)
    draw_monster_species (8, 32)
    # Calculate room all other stats will take
    item_stats, stat_names = get_monster_stats
    y = draw_stats_box (6, contents.width - 12, item_stats.size)
    height = y - @object.catalogue_y
    draw_monster_battler (0, @object.catalogue_y, contents.width, height)
    draw_stats_signifier (30, y)
    draw_monster_stats (12, y + (WLH / 2), contents.width - 24, item_stats, stat_names)
    draw_monster_elements (contents.width - 32, 4)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Border
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_border
    # Choose Colours for Frame
    rim = Color.new(*ModernAlgebra::CM_MONSTERCARD_RIM_COLOUR)
    shadow = Color.new(*ModernAlgebra::CM_MONSTERCARD_RIMSHADOW_COLOUR)
    # Draw the frame
    cb_outline_rect (1, 1, contents.width - 1, contents.height - 1, shadow, 1, 1)
    cb_outline_rect (0, 0, contents.width - 1, contents.height - 1, rim, 1, 1)
    # Other Lines
    contents.fill_rect (1, 31, contents.width - 2, 1, rim)
    contents.fill_rect (2, 32, contents.width - 4, 1, shadow)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Name
  #    x, y : the coordinates to draw on
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_name (x, y)
    contents.font.color = normal_color
    contents.draw_text (x, y, 200, WLH, @object.name)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Species
  #    x, y : the coordinates to draw on
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_species (x, y)
    # Draw the species icon
    draw_icon (@object.ma_species_icon, x, y)
    contents.font.color = Color.new (*ModernAlgebra::CM_MONSTERSPECIES_COLOUR)
    contents.draw_text (x + 24, y, contents.width / 2, WLH, @object.ma_species_name)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Stats Box
  #    x     : the x coordinate for the stats
  #    width : the amount of space it can take horizontally
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_stats_box (x, width, size)
    # Draw Box
    box_size = ((size / 2) + 1)*WLH
    y = contents.height - 8 - box_size
    cb_outline_rect (x, y, contents.width - 2*x, box_size)
    return y
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Stats Signifier
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_stats_signifier (x, y)
    # Clear place for signifier
    tw = contents.text_size (Vocab::GI_STATS).width
    contents.clear_rect (x, y, tw + 4, 2)
    contents.font.color = system_color
    contents.draw_text (x + 2, y - (WLH / 2), tw + 2, WLH, Vocab::GI_STATS)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Stats
  #    x     : the x coordinate for the stats
  #    width : the amount of space it can take horizontally
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_stats (x, y, width, item_stats, stat_names)
    room_width = (contents.width - x*2 - 10) / 2
    for i in 0...item_stats.size
      tw = contents.text_size (item_stats[i].to_s).width
      x_actual = x + (room_width + 10)*(i % 2)
      # Draw Signifier Text
      contents.font.color = system_color
      contents.draw_text (x_actual, y + (i / 2)*WLH, room_width - tw - 4, WLH, stat_names[i])
      contents.font.color = normal_color
      contents.draw_text (x_actual, y + (i / 2)*WLH, room_width, WLH, item_stats[i].to_s, 2)
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Battler
  #     x, y    : the coordinates to draw on
  #     enabled : truth value of whether it should be drawn opaque or not
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_battler (x, y, width, height)
    bmp = Cache.battler (@object.battler_name, @object.battler_hue)
    src_rect = bmp.rect.dup
    opac_rect = Rect.new (0, 0, src_rect.width, 0)
    draw_opac_rect = false
    # If it will overlap
    # Take the centre of the bitmap if too large
    if width < src_rect.width
      src_rect.x = (src_rect.width - width) / 2
      opac_rect.x = src_rect.x
      src_rect.width = width
    else # Centre battler
      x += (width - src_rect.width) / 2
    end
    # Take the centre of the bitmap if too large
    if height < src_rect.height
      opac_rect.y = height
      opac_rect.height = src_rect.height - height
      src_rect.height = height
      draw_opac_rect = true
    else # Centre battler
      y += (height - src_rect.height) / 2
    end
    contents.blt (x, y, bmp, src_rect)
    contents.blt (x, y + opac_rect.y, bmp, opac_rect, 128) if draw_opac_rect
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Elements
  #    x, y : coordinates to draw onto
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_elements (x, y)
    contents.font.color = system_color
    for i in 1...@object.element_ranks.xsize
      next if @object.element_ranks[i] == 3
      draw_icon (ModernAlgebra::CI_ITEM_ELEMENT_ICONS[i - 1], x, y, false)
      # Draw Rank
      rank = Vocab::CM_ELEMENT_RANKS[@object.element_ranks[i] - 1]
      contents.draw_text (x, y, 24, 24, rank, 1)
      x -= 24
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Get Monster Stats
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def get_monster_stats
    item_stats, stat_names = [], []
    # HP and MP
    item_stats.push (@object.maxhp, @object.maxmp)
    stat_names.push (Vocab.hp, Vocab.mp)
    # Get all parameters
    item_stats.push (@object.atk, @object.def, @object.agi, @object.spi)
    stat_names.push (Vocab.atk, Vocab.def, Vocab.agi, Vocab.spi)
    item_stats.push (@object.hit, @object.eva)
    stat_names.push (Vocab::GI_HIT_RATIO, Vocab::GI_EVASION)
    return item_stats, stat_names
  end
end

#==============================================================================
# ** Scene Battle
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#==============================================================================

class Scene_Battle
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malgbra_catmonster_start_5hg2 start
  def start (*args)
    if ModernAlgebra::CM_AUTO_ENCOUNTER_MONSTERS
      array = $game_party.encountered_monsters
      $game_troop.members.each { |enemy| array.push (enemy.enemy_id) unless array.include? (enemy.enemy_id) }
    end
    malgbra_catmonster_start_5hg2 (*args) # Run Original Method
  end
end

Credit



Support


Please post in this topic for support. Do not PM me.

FAQs


Spoiler for Reveal only after monster defeat:
You can use this code to have it appear only after defeating the monster. Go to line 556 of the script and replace this:

Code: [Select]
#==============================================================================
# ** Scene Battle
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#==============================================================================

class Scene_Battle
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malgbra_catmonster_start_5hg2 start
  def start (*args)
    if ModernAlgebra::CM_AUTO_ENCOUNTER_MONSTERS
      array = $game_party.encountered_monsters
      $game_troop.members.each { |enemy| array.push (enemy.enemy_id) unless array.include? (enemy.enemy_id) }
    end
    malgbra_catmonster_start_5hg2 (*args) # Run Original Method
  end
end

with this:

Code: [Select]
#==============================================================================
# ** Game_Enemy
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - hp=
#==============================================================================

class Game_Enemy
  alias mdalg_killhp_enmy_encntr_moncatlg_0kh3 hp=
  def hp= (*args)
    mdalg_killhp_enmy_encntr_moncatlg_0kh3 (*args) # Run Original Method
    if self.hp <= 0 # If killed
      # Add as encountered
      $game_party.encountered_monsters.push (self.enemy_id) unless $game_party.encountered_monsters.include? (self.enemy_id)
    end
  end
end

Known Compatibility Issues

No known compatibility issues.

With Omegazonian's Roguelike battle system (ORBS), it is necessary to use the Reveal only upon monster defeat patch in the FAQ spoiler


Creative Commons License
This script by modern algebra is licensed under a Creative Commons Attribution-Non-Commercial-Share Alike 2.5 Canada License.
Title: Re: Monster Catalogue
Post by: Grafikal on August 18, 2009, 05:30:15 PM
Oh holy crap. This is badass MA. I love this.
Title: Re: Monster Catalogue
Post by: modern algebra on August 18, 2009, 05:58:01 PM
Thanks!

I have a feeling I made it too hard to configure though :(
Title: Re: Monster Catalogue
Post by: Grafikal on August 18, 2009, 07:04:38 PM
I'll have to check it out when I get home.
Title: Re: Monster Catalogue
Post by: bluebogle on August 25, 2009, 09:24:47 PM
I bet this is going to be followed up with many more questions, but here goes..
Warning, I'm a total scripting noob, so any suggestions I am open to.

Ok, so I copied and pasted the scripts for Catalogue Base and this one (I don't need icons, or would rather wait before complicating it anymore) below the materials script in the master script list, with the Catalogue Base first, and then another line for this script (should they have been in the same script window, or separate with one above the other which is what I have now)

Now what do I do from this point to actually make this work in the game. I can bring up a blank catalogue by putting the line "$scene = Scene_Catalogue.new (20)" as an event script, but how do I make it come up in my general menu or link it to an in game item like a "book" item or something. I'm happy with either option.

Also (I may be getting ahead of myself here) I inserted the lines:

monsters = [31, 32, 33, 34, 35]
@data[22] = Catalogue_Monster.new ("My Monsters", monsters)

under the lines:

   all_monsters = []
    for i in 1...$data_enemies.size do all_monsters.push (i) end
    @data[20] = Catalogue_Monster.new ("Enemies", all_monsters)
    undead = [11, 12, 17, 26]
    @data[21] = Catalogue_Monster.new ("Undead", undead)

The numbers listed are monsters I've added into the enemy tab in the database..

I can only imagine this has at least a few problems, but I'm doing my best here with no scripting or programing knowledge what so ever. If I'm just missing some basic facts that I can learn from some Scripting 101 tutorial, then please suggest one so I can learn more about this. Otherwise, if there are some easy explanations that can help, I'm all ears.

Below is the full script pasted in the spoiler tab in case that helps. Thanks!!
Spoiler for:
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Description:
#
#    This script allows you to create a monster catalogue that shows a small
#   information window on any monsters you have encountered (if you have auto
#   encounter ON. You could also manually alter which monsters have been
#   "encountered" if you wish to set different conditions on their inclusion in
#   the catalogues. As with all my Catalogue scripts, you can make many
#   many different catalogues. Want a catalogue that shows all monsters? That
#   can be done. Want a catalogue that only shows Undead monsters? That can be
#   done too.
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Instructions:
#
#    This script REQUIRES the Catalogue_Base script, and Bitmap Addons is
#   recommended. Both can be found in the RMVX Scripts Database of RMRK.
#
#    Place this script above Main and below Catalogue Base (which should itself
#   be below Materials). For instructions on setting up new catalogues and
#   other configuration options, please see the editable regions at lines 122,
#   157, and 252.
#
#    To call a catalogue screen, use this code:
#
#      $scene = Scene_Catalogue.new (id)
#
#    By default, the all enemies catalogue has an ID of 20, and this is because
#   I didn't want it to interfere if you also have the Items Catalogue. Remember
#   that NO catalogue can have the same ID as another, even if they are
#   different scripts. So, by default, to call the all enemies catalogue, the
#   code is:
#
#      $scene = Scene_Catalogue.new (20)
#
#  To manually "encounter" an enemy without having to actually fight the
# monster, you can use the code in a Call Script:
#
#    encounter_monster (monster_id)
#      monster_id : the ID of the monster to encounter
#
#    Some Enemy data can be set in the notebox.
#
#      SPECIES
#  In order to make monster collection a little more interesting, it is
# possible to give an enemy a species now. It is purely cosmetic. If you wish
# to get rid of it altogether, then go down to lines 163 and 127 and change
# the name to "" and icon to 0. Those are the default species settings.
# However, you can change species settings on an individual enemy basis by
# putting these codes in the note box of the enemy:
#
#    \species["<name>"]
#      name : the name of the species.
#    \species_icon[<index>]
#      index : the icon index for the species
#
#  Example:
#    \species[Undead]
#    \species_icon[112]
#
#      ICON
#  In order to make the monster list a little more interesting looking, you can
# give them individual icons to show up in that list. If you do not give them
# an individual icon, then it will default to showing the species icon. The
# code to put in the notes box is:
#
#    \icon[<index>]
#      index : the index of the icon you want to use.
#
#  Example:
#    \icon[1]
#
#  Note: if you want to keep a species icon, but don't want any icons to show
#   up next to the monster's name in the list, than you can manually set the
#   icon to blank with the code: \icon[0]
#
#      DESCRIPTION
#  Another feature to make the screens a little more interesting is that you
# can give monsters individual descriptions. If you don't give them a
# description, than it will default to the value at line 166. The code to put in
# the note box is:
#
#    \description[<text>]
#      text : the description text. Don't worry about extending past one line.
#
#  Example:
#    \description[It may be blind,
#     but it's still a dangerous
#     foe]
#
#      CATALOGUE Y
#  This is something purely cosmetic. By default, the monster battler is drawn
# at about 48 pixels in the catalogue window. This allows you to change that
# y value if you so desire. It can make for a nice effect with maybe flying
# creatures appearing a little over the border, for instance, or anything like
# that really. It's very unnecessary though, and I recommend you not altering
# it. The code to put in the note box is:

#    \cat_y[<new_y>]
#      new_y : the y position for the battler in the catalogue window
#
#  Example:
#    \cat_y[16]
#==============================================================================\

#==============================================================================
# *** ModernAlgebra
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new constants - CM_DEFAULT_SPECIES_ICON
#==============================================================================

module ModernAlgebra
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # ** CONSTANTS
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  #  EDITABLE REGION A
  #``````````````````````````````````````````````````````````````````````````
  #  Read the instructions surrounding each constant to see what it does.
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  # The icon for whatever you set as the default species
  CM_DEFAULT_SPECIES_ICON = 196
  # Truth value of whether monsters should be visible once they are first
  #  fought against or whether it should be done manually.
  CM_AUTO_ENCOUNTER_MONSTERS = true
  # All colours set up as: [Red, Green, Blue[, Alpha]]
  CM_MONSTERSPECIES_COLOUR = [160, 160, 160] # Colour of Monster Race
  CM_MONSTERCARD_RIM_COLOUR = [105, 105, 255, 255] # Colour of Card Border
  CM_MONSTERCARD_RIMSHADOW_COLOUR = [0, 0, 0] # Shadow of Card Border
  #  Icons to represent elements of items in the Item Card. Every element MUST
  # have an icon. If you have set this up in CI_ITEM_ELEMENT_ICONS, you can
  # delete it here.
  CI_ITEM_ELEMENT_ICONS = [132, 2, 4, 14, 16, 12, 138, 137, 104, 105, 106, 107,
                           108, 109, 110, 111]
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #  END EDITABLE REGION A
  #//////////////////////////////////////////////////////////////////////////
end

#==============================================================================
# *** Vocab
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new constants : GI_EVASION; GI_HIT_RATIO; CM_DEFAULT_RACE
#==============================================================================

module Vocab
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # ** CONSTANTS
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  #  EDITABLE REGION B
  #``````````````````````````````````````````````````````````````````````````
  #  Read the instructions surrounding each constant to see what it does.
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  # If a species name is not set in the enemy's note box, it will show up
  #  as the following for defualt.
  CM_DEFAULT_SPECIES_NAME = "Monster"
  # If a description is not set in an enemy's note box, this is the description
  #  it will have.
  CM_DEFAULT_MONSTER_DESCRIPTION = "A fearsome foe"
  # These are the letter ranks for a monster's element efficiency.
  CM_ELEMENT_RANKS = ["A", "B", "C", "D", "E", "F"]
  # All constants prefaced by GI are also present in the Grid Inventory script
  #  and in the Item & Skill Catalogue script; if you have either of those
  #  scripts, it is recommended that you delete any of the constants with GI
  #  preface in this script (Monster Catalogue).
  # THe label for stats
  GI_STATS = "Lore"
  # The label for the evasion stat of armors
  GI_EVASION = "Evasion"
  # The label for the hit stat of skills & weapons
  GI_HIT_RATIO = "Hit Ratio"
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #  END EDITABLE REGION B
  #//////////////////////////////////////////////////////////////////////////
end

#==============================================================================
# ** RPG::Enemy
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new method - ma_species
#==============================================================================

class RPG::Enemy
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Species Name
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def ma_species_name
    if @species_name == nil
      @species_name = self.note[/\\SPECIES\[(.*?)\]/i] != nil ? $1 : Vocab::CM_DEFAULT_SPECIES_NAME
    end
    return @species_name
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Species Icon
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def ma_species_icon
    if @species_icon == nil
      @species_icon = self.note[/\\SPECIES_ICON\[(\d+)\]/i] != nil ? $1.to_i : ModernAlgebra::CM_DEFAULT_SPECIES_ICON
    end
    return @species_icon
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * ICON
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def icon_index
    if @ma_icon == nil
      @ma_icon = self.note[/\\ICON\[(\d+)\]/i] != nil ? $1.to_i : ma_species_icon
    end
    return @ma_icon
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * ICON
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def description
    if @ma_desc == nil
      @ma_desc = self.note[/\\DESCRIPTION\[(.*?)\]/i] != nil ? $1 : Vocab::CM_DEFAULT_MONSTER_DESCRIPTION
    end
    return @ma_desc
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Catalogue Y
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def catalogue_y
    @ma_cat_y = (self.note[/\\CAT_Y\[(\d+)\]/i] != nil ? $1.to_i : 32) if @ma_cat_y == nil
    return @ma_cat_y
  end
end

#==============================================================================
# ** Data Catalogues
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#==============================================================================

class Data_Catalogues
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias malgbr_monstcatlg_intlz_5bc2 initialize
  def initialize (*args)
    malgbr_monstcatlg_intlz_5bc2 (*args) # Run Original Method
    #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    #  EDITABLE REGION C
    #``````````````````````````````````````````````````````````````````````
    #  These are the setup options for making catalogues. It can be sort of
    # complicated, so I will go into detail here.
    #
    #  A catalogue object can be made with the following code:
    #
    #    @data[<id>] = Catalogue_Monster.new ("<name>", [<objects>], <show_all>)
    #      id       : this is the ID of this catalogue. When you open a
    #        catalogue, this is how you reference the catalogue you want to
    #        open. No two catalogues can EVER possess the same ID.
    #      name     : this is the name of the catalogue, as it appears in the
    #        catalogue scene when you open this catalogue. Defaults to
    #        "Catalogue"
    #      objects  : this is the array of monster IDs that  belong to this
    #        catalogue and will show up (if encountered) when the catalogue is
    #        open.  Defaults to []
    #      show_all : this is the truth value on whether encountered arrays
    #        are ignored. If true, then all objects in the catalogue,
    #        regardless of whether they've been encountered, will show up
    #        when this particular catalogue is opened. Note that it will
    #        show all objects of THIS catalogue, which is to say that it
    #        will only show them if they are set as objects belonging. It
    #        DOESN'T mean that all monsters ever will show up, unless those
    #        are the objects setup. Defaults to false
    #
    #  The default monster catalogues are:
    #
    #    20 => Name: Enemies; Objects: All enemiesin database; shows only
    #      encountered enemies in its group. It is called by:
    #
    #            $scene = Scene_Catalogue.new (20)
    #``````````````````````````````````````````````````````````````````````
    # * EXAMPLES
    #    monsters = [1, 2, 3, 4, 7, 8, 9]
    #    @data[22] = Catalogue_Monster.new ("Random Baddies", monsters, true)
    #
    #      this will make a catalogue that will include the enemies with IDs
    #     1, 2, 3, 4, 7, 8, & 9. It is named "Random Baddies", and it will
    #     always show all the monsters it includes regardless of whether
    #     they have been encountered because show_all is true. It's ID is 22,
    #     so it can be called by:
    #              $scene = Scene_Catalogue.new (22)
    #
    #    monsters = [2, 3, 6, 11, 14, 15, 18, 19, 27]
    #    @data[23] = Catalogue_Monster.new ("Flying Enemies", monsters)
    #
    #      this will make a catalogue that will include the enemies with IDs
    #     2, 3, 6, 11, 14, 15, 18, 19, & 27. It is named "Flying Enemies",
    #     and it will only show the monsters it includes if they have been
    #     encountered by the party. It's ID is 23, so it can be called by:
    #              $scene = Scene_Catalogue.new (23)
    #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    all_monsters = [31, 32, 33, 34, 35]
    for i in 1...$data_enemies.size do all_monsters.push (i) end
    @data[20] = Catalogue_Monster.new ("Enemies", all_monsters)
    undead = [11, 12, 17, 26]
    @data[21] = Catalogue_Monster.new ("Undead", undead)
    monsters = [31, 32, 33, 34, 35]
    @data[22] = Catalogue_Monster.new ("My Monsters", monsters)
    #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
    #  END EDITABLE REGION C
    #//////////////////////////////////////////////////////////////////////
  end
end

#==============================================================================
# ** Game_Party
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#    new public instance variable - encountered_monsters
#==============================================================================

class Game_Party
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Public Instance Variables
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  attr_reader   :encountered_monsters
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Initialization
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias algbamorn_init_monstrcatlg_6jb1 initialize
  def initialize (*args)
    @encountered_monsters = []
    algbamorn_init_monstrcatlg_6jb1 (*args) # Run Original Method
  end
end

#==============================================================================
# ** Game Interpreter
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    new method - encounter_monster
#==============================================================================

class Game_Interpreter
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Encounter Monster
  #    monster_id : the ID of the monster to encounter
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def encounter_monster (monster_id)
    $game_party.encountered_monsters.push (monster_id) unless $game_party.encountered_monsters.include? (monster_id)
  end
end

#==============================================================================
# ** Catalogue_Monster
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    modified super methods - card; object; object_help_text; include?
#==============================================================================

class Catalogue_Monster < Catalogue_Base
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Card
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def card
    return Window_MonsterCard
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object
  #    index : index of the object in @objects
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def object (index)
    return nil if index == nil || @objects[index] == nil
    return $data_enemies[@objects[index]]
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Object Help Text
  #    index : index of the object in @objects
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def object_help_text (index)
    return "" if object (index) == nil
    return object (index).description
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Include?
  #    index : index of the object in @objects
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def include? (index)
    return true if @show_all
    return $game_party.encountered_monsters.include? (@objects[index])
  end
end

#==============================================================================
# ** Window MonsterCard
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  This window displays all relevant information about a monster
#==============================================================================

class Window_MonsterCard < Window_CatalogueCard
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Refresh
  #    placement : the item placement
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def refresh (index)
    super
    draw_border
    return if @object == nil
    draw_monster_name (8, 4)
    draw_monster_species (8, 32)
    # Calculate room all other stats will take
    item_stats, stat_names = get_monster_stats
    y = draw_stats_box (6, contents.width - 12, item_stats.size)
    height = y - @object.catalogue_y
    draw_monster_battler (0, @object.catalogue_y, contents.width, height)
    draw_stats_signifier (30, y)
    draw_monster_stats (12, y + (WLH / 2), contents.width - 24, item_stats, stat_names)
    draw_monster_elements (contents.width - 32, 4)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Border
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_border
    # Choose Colours for Frame
    rim = Color.new(*ModernAlgebra::CM_MONSTERCARD_RIM_COLOUR)
    shadow = Color.new(*ModernAlgebra::CM_MONSTERCARD_RIMSHADOW_COLOUR)
    # Draw the frame
    cb_outline_rect (1, 1, contents.width - 1, contents.height - 1, shadow, 1, 1)
    cb_outline_rect (0, 0, contents.width - 1, contents.height - 1, rim, 1, 1)
    # Other Lines
    contents.fill_rect (1, 31, contents.width - 2, 1, rim)
    contents.fill_rect (2, 32, contents.width - 4, 1, shadow)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Name
  #    x, y : the coordinates to draw on
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_name (x, y)
    contents.font.color = normal_color
    contents.draw_text (x, y, 200, WLH, @object.name)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Species
  #    x, y : the coordinates to draw on
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_species (x, y)
    # Draw the species icon
    draw_icon (@object.ma_species_icon, x, y)
    contents.font.color = Color.new (*ModernAlgebra::CM_MONSTERSPECIES_COLOUR)
    contents.draw_text (x + 24, y, contents.width / 2, WLH, @object.ma_species_name)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Stats Box
  #    x     : the x coordinate for the stats
  #    width : the amount of space it can take horizontally
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_stats_box (x, width, size)
    # Draw Box
    box_size = ((size / 2) + 1)*WLH
    y = contents.height - 8 - box_size
    cb_outline_rect (x, y, contents.width - 2*x, box_size)
    return y
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Stats Signifier
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_stats_signifier (x, y)
    # Clear place for signifier
    tw = contents.text_size (Vocab::GI_STATS).width
    contents.clear_rect (x, y, tw + 4, 2)
    contents.font.color = system_color
    contents.draw_text (x + 2, y - (WLH / 2), tw + 2, WLH, Vocab::GI_STATS)
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Stats
  #    x     : the x coordinate for the stats
  #    width : the amount of space it can take horizontally
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_stats (x, y, width, item_stats, stat_names)
    room_width = (contents.width - x*2 - 10) / 2
    for i in 0...item_stats.size
      tw = contents.text_size (item_stats.to_s).width
      x_actual = x + (room_width + 10)*(i % 2)
      # Draw Signifier Text
      contents.font.color = system_color
      contents.draw_text (x_actual, y + (i / 2)*WLH, room_width - tw - 4, WLH, stat_names)
      contents.font.color = normal_color
      contents.draw_text (x_actual, y + (i / 2)*WLH, room_width, WLH, item_stats.to_s, 2)
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Battler
  #     x, y    : the coordinates to draw on
  #     enabled : truth value of whether it should be drawn opaque or not
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_battler (x, y, width, height)
    bmp = Cache.battler (@object.battler_name, @object.battler_hue)
    src_rect = bmp.rect.dup
    opac_rect = Rect.new (0, 0, src_rect.width, 0)
    draw_opac_rect = false
    # If it will overlap
    # Take the centre of the bitmap if too large
    if width < src_rect.width
      src_rect.x = (src_rect.width - width) / 2
      opac_rect.x = src_rect.x
      src_rect.width = width
    else # Centre battler
      x += (width - src_rect.width) / 2
    end
    # Take the centre of the bitmap if too large
    if height < src_rect.height
      opac_rect.y = height
      opac_rect.height = src_rect.height - height
      src_rect.height = height
      draw_opac_rect = true
    else # Centre battler
      y += (height - src_rect.height) / 2
    end
    contents.blt (x, y, bmp, src_rect)
    contents.blt (x, y + opac_rect.y, bmp, opac_rect, 128) if draw_opac_rect
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Draw Monster Elements
  #    x, y : coordinates to draw onto
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def draw_monster_elements (x, y)
    contents.font.color = system_color
    for i in 1...@object.element_ranks.xsize
      next if @object.element_ranks == 3
      draw_icon (ModernAlgebra::CI_ITEM_ELEMENT_ICONS[i - 1], x, y, false)
      # Draw Rank
      rank = Vocab::CM_ELEMENT_RANKS[@object.element_ranks - 1]
      contents.draw_text (x, y, 24, 24, rank, 1)
      x -= 24
    end
  end
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Get Monster Stats
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  def get_monster_stats
    item_stats, stat_names = [], []
    # HP and MP
    item_stats.push (@object.maxhp, @object.maxmp)
    stat_names.push (Vocab.hp, Vocab.mp)
    # Get all parameters
    item_stats.push (@object.atk, @object.def, @object.agi, @object.spi)
    stat_names.push (Vocab.atk, Vocab.def, Vocab.agi, Vocab.spi)
    item_stats.push (@object.hit, @object.eva)
    stat_names.push (Vocab::GI_HIT_RATIO, Vocab::GI_EVASION)
    return item_stats, stat_names
  end
end

#==============================================================================
# ** Scene Battle
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - initialize
#==============================================================================

#==============================================================================
# ** Game_Enemy
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - hp=
#==============================================================================

class Game_Enemy
  alias mdalg_killhp_enmy_encntr_moncatlg_0kh3 hp=
  def hp= (*args)
    mdalg_killhp_enmy_encntr_moncatlg_0kh3 (*args) # Run Original Method
    if self.hp <= 0 # If killed
      # Add as encountered
      $game_party.encountered_monsters.push (self.enemy_id) unless $game_party.encountered_monsters.include? (self.enemy_id)
    end
  end
end
Title: Re: Monster Catalogue
Post by: bluebogle on August 26, 2009, 01:14:02 AM
An update, I just put an event item in the game map that will bring up the monster's I killed list when activated. So I guess my real question is, how can I make this work through an item in my inventory?

edit: and now I have just learned about the wonderful world of common events. Sorry for the bother, I think I can figure it out from here.
Title: Re: Monster Catalogue
Post by: modern algebra on August 26, 2009, 02:19:33 AM
Good to hear :)

And yeah, having the item call a common event with the scene call in it is the way to go.
Title: Re: Monster Catalogue
Post by: shaz on August 26, 2009, 10:57:57 AM
ooh - pretty!
Title: Re: Monster Catalogue
Post by: bluebogle on August 29, 2009, 04:06:55 AM
Ok, I have a new problem. It seemed to be working for a while, and then I put it on a new map, and when I try to call it up through an item with a common event for the script, it gives me this error:

????? 'Window_Base'? 158??? NoMethodError ????????
undefined method ' ' for nil:NilClass

If I use it without first killing any monsters, it works fine as a blank menu page, but after I kill something, it gives that error. Any ideas?

Thanks!
Title: Re: Monster Catalogue
Post by: modern algebra on August 29, 2009, 01:11:51 PM
My best guess at this point is an inappropriate argument for your icon. What did you put as either the icon or the species icon for the monster or monsters that should show up. By that, I mean what do their noteboxes look like?
Title: Re: Monster Catalogue
Post by: bluebogle on August 29, 2009, 06:16:35 PM
Thanks! It was because I'd added some new elements, and hadn't assigned icon values to them. Figuring it all out has also given me the courage to try to mess with the icon settings a little more. Thanks for pointing me in the right direction. Now if only I hadn't implemented that 5000 item icon list into the game  :D

I may have more questions, but if not, thanks again for the help and the awesome scripts!
Title: Re: Monster Catalogue
Post by: modern algebra on August 29, 2009, 06:43:01 PM
Oh, yeah, that would do it too :) I should have a more visible warning.

I'm glad you figured it out.
Title: Re: Monster Catalogue
Post by: otaku-dono on January 11, 2010, 03:00:01 AM
Would it be possible to include a count of how many of a specific monster has been defeated, so you can get items etc. when you defeat a set number of that monster?
Title: Re: Monster Catalogue
Post by: modern algebra on January 11, 2010, 05:17:11 PM
It doesn't count them in its current state, but I could certainly script in a feature easily enough. Would you want it to show up on the card? If yes, where?
Title: Re: Monster Catalogue
Post by: Eternal on January 11, 2010, 06:27:35 PM
It was a pain to read all the text, the picture just made me drool, it looks so amazing o.O
Title: Re: Monster Catalogue
Post by: Deity on January 11, 2010, 07:52:22 PM
I agree to the comments of the others, this Monster Catalogue looks really good.

Greets
Deity
Title: Re: Monster Catalogue
Post by: otaku-dono on January 15, 2010, 05:09:25 AM
It doesn't count them in its current state, but I could certainly script in a feature easily enough. Would you want it to show up on the card? If yes, where?
Maybe just above the stats box would be good if you could. I'd appreciate it a lot.
Title: Re: Monster Catalogue
Post by: MaxMatsu on January 21, 2010, 12:29:29 AM
'sup again, well, the game says there is an error with line ''281:    @catalogue = $data_catalogues[catalogue_id]'' in the catalouge base, however, when I tried in another test game, it did work. Now what does this line do or something? The possible causes are new scripts, or the new iconset. It worked before, and this ''error'' only appears when the player opens the catalogue.
Title: Re: Monster Catalogue
Post by: modern algebra on January 21, 2010, 12:32:08 AM
Well, that's not really enough info. What type of error was it? Was it a nil error?

My guess is that you have some title screen script or something that modifies Scene_Title and is overwriting create_data_objects.

Try putting the Catalogue_Base script beneath all your other custom scripts, but still above Main and see if that fixes it.
Title: Re: Monster Catalogue
Post by: MaxMatsu on January 21, 2010, 01:34:09 AM
Looks like I solved it... I don't really know how but I did. Thanks anyway.
Title: Re: Monster Catalogue
Post by: Eternal on January 23, 2010, 01:32:43 PM
In the corner where it states the element weaknesses (I believe that's what it does, right?), wouldn't it be smarter to actually show a number in percent, since not everyone might know what the different letters mean (I know I always forget anyway, and I'm making the games for my friends who've never used any rpg- or game makers :P)?
Title: Re: Monster Catalogue
Post by: wonderjosh on February 22, 2010, 06:35:20 PM
There wouldn't be a way to make it show up in BigEd781' Final Fantasy IX Menu would there? Preferably just above the ATB options. I've tried tinkering around with lines of script but I can't seem to figure it out.

Oh, and I put the script above Main but under the Main Process heading? Or above Main but within the Materials section? The latter makes more sense to me, but I just want to get it right haha.

EDIT: Figured I'd post BigEd781' Final Fantasy IX Menu script if that helps! Hopefully someone can lend a guy a hand?

Spoiler for:
=begin                 
                          BigEd781' Final Fantasy IX Menu
            Credit to PainHurt at rpgmakervx.net for most of the graphics
=end

module FF9_Config 
   
  # set this to 'true' if you would like to use a cusotm background image
  USE_CUSTOM_BACK = false
  # the name of the custom background image, without the file extension (no .png)
  BACK_NAME = 'StoneBackground'
  # if you set this to 'true', you must be using the enhanced
  # Window class script that I posted:  You can get that script here:
  # http://www.rpgmakervx.net/index.php?showtopic=8042&hl=
  # this will make the provided FF9 windowskin look really good.
  USE_TILED_WINDOW = false
 
  # When this is set to 'true', the menu cirsor will animate back and forth.
  # When set to 'false', it will stay in place
  ANIMATE_CURSOR = false
 
  # When set to 'true', four background panels are always drawn.
  # When set to 'false', a panel is only drawn for each party member
  DRAW_FOR_ALL = true
 
  # the name of the font used in the menu. 
  # use 'Font.default_name' for the default font.  Try 'Centaur' for a nice, smaller font.
  DEFAULT_FONT = Font.default_name
 
  # set this to true to enable the font above for all windows.
  # also sets the back_opacity to 255 for all windows. 
  # I recommend setting this to 'true' to maintain a consistent look.
  USE_FOR_ALL = true
 
  # the icon id for your gold window portion of the menu, 194 by default.
  GOLD_ICON_ID = 194
 
end

if FF9_Config::USE_FOR_ALL   
 
  Font.default_name = FF9_Config::DEFAULT_FONT
 
  class Window_Base < Window
   
    alias :eds_pre_ff9_menu_base_initialize :initialize
    def initialize(*args)
      eds_pre_ff9_menu_base_initialize(*args) 
      self.stretch = false if FF9_Config::USE_TILED_WINDOW
      self.back_opacity = 255
    end
   
  end
 
end

class Window_Base < Window
 
  CAPTION_COLOR = Color.new(255,255,255)#(228, 228, 228)
  CAPTION_HEIGHT = 12
  X_OFFSET = 16
  Y_OFFSET = -5
 
  alias :eds_pre_window_caption_intialize :initialize
  def initialize(*args)     
    eds_pre_window_caption_intialize(*args)   
    @caption_sprite = Sprite_Base.new(self.viewport)
    create_caption_bitmap(1, CAPTION_HEIGHT)       
    @caption_sprite.x = self.x + X_OFFSET
    @caption_sprite.y = self.y + Y_OFFSET
    @caption_sprite.z = self.z + 1
  end
 
  def x=(value)
    super
    @caption_sprite.x = value + X_OFFSET unless @caption_sprite.nil?
  end
 
  def y=(value)
    super
    @caption_sprite.y = value + Y_OFFSET unless @caption_sprite.nil?
  end
 
  def z=(value)
    super
    @caption_sprite.z = value + 1 unless @caption_sprite.nil?
  end
 
  def caption=(text)
    return unless text.is_a?(String)
    return if text.empty?
    @caption = text
    width = @caption_sprite.bitmap.text_size(@caption).width
    create_caption_bitmap(width, CAPTION_HEIGHT)   
    draw_caption
  end 
 
  def create_caption_bitmap(w, h)
    @caption_sprite.bitmap = Bitmap.new(w, h)   
    @caption_sprite.bitmap.font.size = 12
    @caption_sprite.bitmap.font.color = CAPTION_COLOR
    @caption_sprite.bitmap.font.bold = true 
  end
 
  def draw_caption
    unless @caption.nil?
      h = @caption_sprite.bitmap.height
      w = @caption_sprite.bitmap.width
      rect = Rect.new( 0, h / 2, w, h / 4 )
      @caption_sprite.bitmap.fill_rect(rect, Color.new(0, 0, 0, 96))     
      @caption_sprite.bitmap.draw_text(@caption_sprite.src_rect, @caption)     
    end
  end
 
  alias :eds_pre_caption_window_dispose :dispose
  def dispose
    eds_pre_caption_window_dispose
    @caption_sprite.dispose
  end
 
  def find_window_width(text)             
    return Bitmap.new(544, 416).text_size(text).width + 32
  end   
 
end

class Window_TimeGold < Window_Base 
   
  def initialize(x, y) 
    width = find_window_width("9999999")
    width = 140 if width < 140
    super(x, y, width, WLH + 58)   
    self.back_opacity = 255
    self.stretch = false if FF9_Config::USE_TILED_WINDOW
    self.contents.font.name = FF9_Config::DEFAULT_FONT
    self.caption = "TIME & #{Vocab.gold}"
    @time_icon = Cache.picture('Timer') 
    @intern_frame_count = 0
    refresh
  end
 
  def draw_time
    sec = (Graphics.frame_count / 60) % 60
    min = (Graphics.frame_count / 3600) % 60
    hrs = Graphics.frame_count / 216000   
    self.contents.font.color = Color.new(255, 255, 255)   
    time = "%02d:%02d:%02d" % [hrs, min, sec]
    self.contents.draw_text(0, 0, self.contents.width, WLH, time, 2)   
  end 
 
  def refresh
    self.contents.clear
    self.contents.blt(0, 0, @time_icon, @time_icon.rect)
    draw_icon(FF9_Config::GOLD_ICON_ID, 2, WLH) 
    draw_currency_value($game_party.gold, 0, WLH, self.contents.width)
    draw_time
  end
 
  def draw_currency_value(value, x, y, width)
    gold_text = Vocab.gold
    cx = contents.text_size(gold_text[0,1]).width
    self.contents.font.color = normal_color
    self.contents.draw_text(x, y, width - cx - 2, WLH, value, 2)
    self.contents.font.color = system_color
    # just print the first character of Vocab::gold
    self.contents.draw_text(x, y, width, WLH, gold_text[0,1], 2)
  end
 
  def update
    super
    @intern_frame_count += 1
    return if (@intern_frame_count % 60) != 0         
    refresh
  end
 
  def find_window_width(text)             
    return Bitmap.new(544, 416).text_size(text).width + 80
  end
 
end

class Window_MenuLocation < Window_Base
 
  def initialize(x, y)
    @map_name = load_data("Data/MapInfos.rvdata")[$game_map.map_id].name
    width = find_window_width(@map_name)
    super(x, y, width, WLH + 32)   
    self.stretch = false if FF9_Config::USE_TILED_WINDOW
    self.contents.font.name = FF9_Config::DEFAULT_FONT
    self.back_opacity = 255
    self.caption = "LOCATION"
    refresh
  end
 
  def refresh
    self.contents.clear   
    self.contents.draw_text(0, 0, self.contents.width, WLH,  @map_name, 1)
  end
 
  def find_window_width(text)             
    return Bitmap.new(544, 416).text_size(text).width + 48
  end
 
end

class Window_Command < Window_Selectable
 
  alias :eds_pre_ff9_menu_win_command_init :initialize
  def initialize(*args)
    @font_name = Font.default_name   
    eds_pre_ff9_menu_win_command_init(*args)   
  end
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear   
    self.contents.font.name = @font_name
    for i in 0...@item_max
      draw_item(i)
    end
  end
 
  def font_name=(name)
    @font_name = name   
  end
 
end

class Window_Uses < Window_Base 
 
  def initialize(right, y, item)   
    @remaining_text = "Remaining: #{$game_party.item_number(item)}"
    w = 160
    x = right ? (544 - w) : 0   
    super(x, y, w, WLH + 32)   
    self.stretch = false if FF9_Config::USE_TILED_WINDOW
    self.contents.font.name = FF9_Config::DEFAULT_FONT
    refresh
  end
 
  def item=(item)   
    return unless item.is_a?(RPG::Item)
    @remaining_text = "Remaining: #{$game_party.item_number(item)}"     
    refresh
  end
 
  def visible=(value)
    super
    refresh if value
  end
 
  def refresh
    self.contents.clear
    self.contents.draw_text(self.contents.rect, @remaining_text, 1)
  end
 
end

class Window_SkillUses < Window_Base 
 
  def initialize(right, y, actor, skill)   
    @remaining_text = make_info_string(actor, skill)
    w = 182
    x = right ? (544 - w) : 0       
    super(x, y, w, WLH + 32) 
    self.stretch = false if FF9_Config::USE_TILED_WINDOW
    self.contents.font.name = FF9_Config::DEFAULT_FONT
    refresh
  end
 
  def make_info_string(actor, skill)
    return if actor.nil? || skill.nil?
    cost = actor.calc_mp_cost(skill)
    return "Unlimited" if cost < 1
    return "Remaining: #{actor.mp / cost}"
  end
 
  def set_skill(actor, skill)
    return if actor.nil? || skill.nil?
    return unless skill.is_a?(RPG::Skill)
    @remaining_text = make_info_string(actor, skill)   
    refresh
  end
 
  def visible=(value)
    super
    refresh if value
  end
 
  def refresh   
    self.contents.clear
    self.contents.draw_text(self.contents.rect, @remaining_text, 1)
  end
 
end

class Window_MenuStatus < Window_Selectable
   
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, 452, 352)     
    @bg_image = Cache.picture('FF9_MenuBar') 
    @arrow_image = Cache.picture('Pointer')
    create_arrow_sprites
    @sprite_last_draw_x = 0
    @sprite_inc_x = 1
    @intern_frame_count = 0   
    self.stretch = false if FF9_Config::USE_TILED_WINDOW
    self.contents.font.name = FF9_Config::DEFAULT_FONT
    self.opacity = 0   
    self.z = 99       
    self.active = false
    self.index = -1
    refresh
  end
  #--------------------------------------------------------------------------
  # * create_arrow_sprites
  #--------------------------------------------------------------------------
  def create_arrow_sprites 
    @arrow_sprites = []
    for i in 0..3
      @arrow_sprites << Sprite.new
      @arrow_sprites.bitmap = Bitmap.new(@arrow_image.width + 7, @arrow_image.height)
      @arrow_sprites.x = self.x
      @arrow_sprites.y = (i * 80) + self.y + 40     
      @arrow_sprites.z = 999       
    end
  end
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @item_max = $game_party.members.size
    draw_background_windows if FF9_Config::DRAW_FOR_ALL
    for actor in $game_party.members
      x = 104
      y = actor.index * 80     
      y_offset = 6     
      draw_background_window(0, y) unless FF9_Config::DRAW_FOR_ALL
      draw_actor_face(actor, 19, y + 4, 73)
      draw_actor_name(actor, x, y + y_offset)
      draw_actor_class(actor, x + 125, y + y_offset) if actor.states.empty?
      draw_actor_level(actor, x, y + WLH * 1)     
      draw_actor_state(actor, x + 125, y + y_offset)
      draw_actor_hp(actor, x, ((y) + (WLH * 2) - 5))
      draw_actor_mp(actor, x + 125, ((y) + (WLH * 2) - 5))
    end
  end 
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #--------------------------------------------------------------------------
  def update_cursor             
    if @index < 0             
      #refactor into update arrow method
      @arrow_sprites.each { |sprite| sprite.bitmap.clear }
      return
    end
    @intern_frame_count += 1
    return unless (@intern_frame_count % 5) == 0
    if @sprite_last_draw_x >= 7     
      @sprite_inc_x = -1
    elsif @sprite_last_draw_x <= 0
      @sprite_inc_x = 1
    end
    update_arrow_sprites
  end
  #--------------------------------------------------------------------------
  # * update_arrow_sprites
  #--------------------------------------------------------------------------
  def update_arrow_sprites   
    @arrow_sprites.each { |sprite| sprite.bitmap.clear }   
    if @index == 99   # all selected       
      return unless (@intern_frame_count % 10) == 0
      draw_arrow_sprites(@arrow_sprites, false)     
    else
      draw_arrow_sprites([@arrow_sprites[@index]], FF9_Config::ANIMATE_CURSOR)     
    end
  end
  #--------------------------------------------------------------------------
  # * draw_arrow_sprites
  #--------------------------------------------------------------------------
  def draw_arrow_sprites(sprites, animated=true)
    for sprite in sprites         
      image_x = animated ? @sprite_last_draw_x + @sprite_inc_x : 0
      @sprite_last_draw_x = image_x           
      sprite.bitmap.blt(image_x, 0, @arrow_image, @arrow_image.rect)
    end
  end
  #--------------------------------------------------------------------------
  # * y=
  #--------------------------------------------------------------------------
  def y=(value)
    super
    unless @arrow_sprites.nil?
      for i in 0..3
        @arrow_sprites.y = (i * 80) + value + 40
      end
    end
  end
  #--------------------------------------------------------------------------
  # * x=
  #--------------------------------------------------------------------------
  def x=(value)
    super
    unless @arrow_sprites.nil?
      @arrow_sprites.each { |sprite| sprite.x = value }
    end
  end
  #--------------------------------------------------------------------------
  # * draw_background_windows
  #--------------------------------------------------------------------------
  def draw_background_windows 
    self.contents.blt(0, 0, @bg_image, @bg_image.rect)   
    self.contents.blt(0, 80, @bg_image, @bg_image.rect)   
    self.contents.blt(0, 160, @bg_image, @bg_image.rect)   
    self.contents.blt(0, 240, @bg_image, @bg_image.rect)   
  end 
  #--------------------------------------------------------------------------
  # * draw_background_window (single)
  #--------------------------------------------------------------------------
  def draw_background_window(x, y)
    self.contents.blt(x, y, @bg_image, @bg_image.rect)   
  end
  #--------------------------------------------------------------------------
  # * visible
  #--------------------------------------------------------------------------
  def visible=(value)
    super
    @arrow_sprites.each { |sprite| sprite.visible = value }
  end
  #--------------------------------------------------------------------------
  # * dispose
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_win_stat_dispose :dispose
  def dispose
    eds_pre_ff9_win_stat_dispose
    @arrow_sprites.each { |sprite| sprite.dispose }
  end
 
  def enable_cursor?(rect=nil)
    # for compatibility with the improved command window
    return false
  end   
 
end

class Scene_Menu
     
  #--------------------------------------------------------------------------
  # * create_menu_background (only if USE_CUSTOM_BACK == true)
  #--------------------------------------------------------------------------
  if FF9_Config::USE_CUSTOM_BACK
   
    def create_menu_background
      @menuback_sprite = Sprite.new
      @menuback_sprite.bitmap = Cache.picture(FF9_Config::BACK_NAME)
      @menuback_sprite.color.set(16, 16, 16, 128)
      update_menu_background
    end
   
  end
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #--------------------------------------------------------------------------   
  def create_command_window
    s1 = Vocab::item
    s2 = Vocab::skill
    s3 = Vocab::equip
    s4 = Vocab::status
    s5 = Vocab::save
    s6 = Vocab::game_end
    # just changed the width of the window here
    @command_window = Window_Command.new(132, [s1, s2, s3, s4, s5, s6])
    @command_window.index = @menu_index
    @command_window.stretch = false if FF9_Config::USE_TILED_WINDOW
    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     
    # new stuff here   
    @command_window.font_name = FF9_Config::DEFAULT_FONT
    @command_window.x = 528 - @command_window.width
    @command_window.y = 16
    @command_window.back_opacity = 255
  end
  #--------------------------------------------------------------------------
  # * This method is intended to fix some compatibility problems
  #   that scripts run into when they change the command window
  #   in some way.  So, we let them override "create_command_window"
  #   and we simply don't call it from the "start" method.
  #   Instead, we call this method which does some extra checking.
  #--------------------------------------------------------------------------
  def eds_create_command_window
    create_command_window
    old_commands = @command_window.commands
    return if old_commands == [ Vocab::item,
                                Vocab::skill,
                                Vocab::equip,
                                Vocab::status,
                                Vocab::save,
                                Vocab::game_end ]

    # so we know that the default command window is not being used
    # we don't want to create another window, so we manually resize it
    # before the player can see. 
    long = ''
    # dynamically size the width based on the longest command
    old_commands.each { |command| long = command if command.length > long.length }
    # set the index to -1 so that the rectangle disappears.
    # if we don't do this, you can see the selection rectangle resize.
    @command_window.index = -1
    @command_window.width = @command_window.contents.text_size(long).width + 42
    @command_window.contents = Bitmap.new( @command_window.width - 32,
                                           @command_window.height - 32 )   
    @command_window.font_name = FF9_Config::DEFAULT_FONT
    @command_window.x = 528 - @command_window.width
    @command_window.y = 16
    @command_window.back_opacity = 255       
    @command_window.refresh
    @command_window.index = @menu_index
  end
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    #call this method for compatibility
    eds_create_command_window
    @gold_window = Window_TimeGold.new(372, 342)
    @gold_window.y -= @gold_window.height
    @gold_window.x = 528 - @gold_window.width
    @status_window = Window_MenuStatus.new(0, 12)
    @location_window = Window_MenuLocation.new(0, 0)
    @location_window.x = 528 - @location_window.width 
    @location_window.y = 398 - @location_window.height
  end
 
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_menu_terminate :terminate
  def terminate
    eds_pre_ff9_menu_scene_menu_terminate
    @location_window.dispose
  end
 
end

class Scene_Item < Scene_Base
 
  #--------------------------------------------------------------------------
  # * start
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_item_start :start
  def start       
    eds_pre_ff9_menu_scene_item_start
    @target_window.y = 58   
    @uses_window = Window_Uses.new(true, @help_window.height, nil)
    @uses_window.visible = false
  end 
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #   - right-align flag ignored
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_win_stat_show_target_window :show_target_window
  def show_target_window(right) 
    @uses_window.item = @item_window.item
    @uses_window.visible = true   
    @item_window.visible = false   
    @item_window.active = false   
    @target_window.visible = true
    @target_window.active = true 
    @viewport.rect.set(0, 0, 544, 416)
    @viewport.ox = 0
  end
  #--------------------------------------------------------------------------
  # * hide_target_window
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_item_hide_target_window :hide_target_window
  def hide_target_window
    eds_pre_ff9_menu_scene_item_hide_target_window 
    @uses_window.visible = false unless @uses_window.nil?
    @item_window.visible = true       
  end
  #--------------------------------------------------------------------------
  # * determine_target
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_item_determine_target :determine_target
  def determine_target   
    eds_pre_ff9_menu_scene_item_determine_target
    @uses_window.item = @item_window.item
  end   
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_item_terminate :terminate
  def terminate
    eds_pre_ff9_menu_scene_item_terminate
    @uses_window.dispose
  end
 
end

class Scene_Skill < Scene_Base
 
  #--------------------------------------------------------------------------
  # * start
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_skill_start :start
  def start       
    eds_pre_ff9_menu_scene_skill_start
    @target_window.y = 58         
    @uses_window = Window_SkillUses.new(true, @help_window.height, nil, nil)
    @uses_window.visible = false
  end 
  #--------------------------------------------------------------------------
  # * OVERWRITTEN
  #   - right-align flag ignored
  #--------------------------------------------------------------------------
  def show_target_window(right)
    @uses_window.set_skill($game_party.members[@actor_index], @skill_window.skill)
    @uses_window.visible = true
    @status_window.visible = false
    @skill_window.visible = false
    @skill_window.active = false   
    @target_window.visible = true
    @target_window.active = true 
    @viewport.rect.set(0, 0, 544, 416)
    @viewport.ox = 0
  end
  #--------------------------------------------------------------------------
  # * hide_target_window
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_skill_hide_target_window :hide_target_window
  def hide_target_window
    eds_pre_ff9_menu_scene_skill_hide_target_window 
    @uses_window.visible = false unless @uses_window.nil?
    @skill_window.visible = true
    @status_window.visible = true
  end
  #--------------------------------------------------------------------------
  # * determine_target
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_skill_determine_target :determine_target
  def determine_target   
    eds_pre_ff9_menu_scene_skill_determine_target
    @uses_window.set_skill($game_party.members[@actor_index], @skill_window.skill)
  end   
  #--------------------------------------------------------------------------
  # * Termination Processing
  #--------------------------------------------------------------------------
  alias :eds_pre_ff9_menu_scene_item_terminate :terminate
  def terminate
    eds_pre_ff9_menu_scene_item_terminate
    @uses_window.dispose
  end
 
end
Title: Re: Monster Catalogue
Post by: GorgonBull35 on June 22, 2010, 09:42:41 PM
Hey modern algebra, I'm a total scripting noob and need some help. I have two problems actually... One is when I go go into my game and start a fight I get a message that reads:

Script 'Monster Dialogue' line 574: NoMethodError occured
undefined method 'include?' for nil:Nil Class.

and when I try to open up the Monster Catalogue as an item I get this message:

Script 'Monster Dialogue' line 393: NoMethodError occured
undefned method 'include?' for nil:Nil Class

This may be the same problem but I decided to post both in case its different, if you have an answer please respond. Thank You!
Title: Re: Monster Catalogue
Post by: modern algebra on June 22, 2010, 11:03:21 PM
It's probably an incompatibility. Put the Monster Catalogue below any other scripts you have but still above Main. Alternatively, it might be that you are loading a save game you made before adding this script. That might do it too.
Title: Re: Monster Catalogue
Post by: GorgonBull35 on June 23, 2010, 02:26:55 AM
 Thanks, it's because I'm loading a save file from before.  :-[
Title: Re: Monster Catalogue
Post by: Shiroiyuki on June 23, 2010, 08:45:27 PM
Would it be possible to include a count of how many of a specific monster has been defeated, so you can get items etc. when you defeat a set number of that monster?

This, but like they did in FFXII perhaps....where the number of individual monsters were tabbed (and extra pages of info became unlocked after certain requirements were met), and a little bar kept track of overall progress in the catalogue.
Title: Re: Monster Catalogue
Post by: m3aga1n on July 08, 2011, 11:51:24 PM
in my game it brings up the error "Script 'Monster Catalogue' line 363: typeerror occurred. undefined superclass ` catalogue base'" :(
Title: Re: Monster Catalogue
Post by: modern algebra on July 09, 2011, 12:48:09 AM
Please note that this script requires the Catalogue Base (http://rmrk.net/index.php/topic,34376.0.html) script. Bitmap Addons (http://rmrk.net/index.php/topic,32286.0.html) is recommended.

Did you grab the Catalogue Base script from that link?
Title: Re: Monster Catalogue
Post by: m3aga1n on July 10, 2011, 02:57:13 PM
yes I did.
Title: Re: Monster Catalogue
Post by: modern algebra on July 10, 2011, 04:54:02 PM
And you made sure that it is above the Monster Catalogue in order in the Script Editor.

So it should be:

Catalogue Base
Monster Catalogue

and not:

Monster Catalogue
Catalogue Base
Title: Re: Monster Catalogue
Post by: fenicearcana on September 02, 2011, 12:16:28 PM
Hi, Modern!
I'm a Fan of your scripts XD i'm using already the ATS 3.0c and the Monster Catalogue and they are really awesome.
I've just a question if you could help me out^^

i...emm... i AM a complete noob on scripting, so i'm trying to compile the catalogue and until now i figured out how to add monster to catalogue, but about their description. Each monster in any one catalogue has the same description?
This means i must make to say 100 catalogue if i want 100 different description under each monster? I cannot find the "spot" where add the personal description for each monster. or is the description unique for each catalogue?
Thanks again for your awesome works, and for your time, Modern Algebra ^^
Title: Re: Monster Catalogue
Post by: fenicearcana on September 02, 2011, 12:39:28 PM
Uh...enmmm sorry Algebra...is my fault. My english lack a bit, so i noticed only now this part...



#    By default, the all enemies catalogue has an ID of 20, and this is because
#   I didn't want it to interfere if you also have the Items Catalogue. Remember
#   that NO catalogue can have the same ID as another, even if they are
#   different scripts. So, by default, to call the all enemies catalogue, the
#   code is:
#
#      $scene = Scene_Catalogue.new (20)
#
#  To manually "encounter" an enemy without having to actually fight the
# monster, you can use the code in a Call Script:
#
#    encounter_monster (monster_id)
#      monster_id : the ID of the monster to encounter
#
#    Some Enemy data can be set in the notebox.
#
#      SPECIES
#  In order to make monster collection a little more interesting, it is
# possible to give an enemy a species now. It is purely cosmetic. If you wish
# to get rid of it altogether, then go down to lines 163 and 127 and change
# the name to "" and icon to 0. Those are the default species settings.
# However, you can change species settings on an individual enemy basis by
# putting these codes in the note box of the enemy:
#
#    \species["<name>"]
#      name : the name of the species.
#    \species_icon[<index>]
#      index : the icon index for the species
#
#  Example:
#    \species[Undead]
#    \species_icon[112]
#
#      ICON
#  In order to make the monster list a little more interesting looking, you can
# give them individual icons to show up in that list. If you do not give them
# an individual icon, then it will default to showing the species icon. The
# code to put in the notes box is:
#
#    \icon[<index>]
#      index : the index of the icon you want to use.
#
#  Example:
#    \icon[1]
#
#  Note: if you want to keep a species icon, but don't want any icons to show
#   up next to the monster's name in the list, than you can manually set the
#   icon to blank with the code: \icon[0]
#
#      DESCRIPTION
#  Another feature to make the screens a little more interesting is that you
# can give monsters individual descriptions. If you don't give them a
# description, than it will default to the value at line 166. The code to put in
# the note box is:
#
#    \description[<text>]
#      text : the description text. Don't worry about extending past one line.
#
#  Example:
#    \description[It may be blind,
#     but it's still a dangerous
#     foe]
#
#      CATALOGUE Y
#  This is something purely cosmetic. By default, the monster battler is drawn
# at about 48 pixels in the catalogue window. This allows you to change that
# y value if you so desire. It can make for a nice effect with maybe flying
# creatures appearing a little over the border, for instance, or anything like
# that really. It's very unnecessary though, and I recommend you not altering
# it. The code to put in the note box is:

#    \cat_y[<new_y>]
#      new_y : the y position for the battler in the catalogue window
#
#  Example:
#    \cat_y[16]

so i must add the description in the notebox under the enemies text-note heheheeh XD figured out!

Anyway i really like your works, they are easy to understand and to use, and seldom have problems. i just cant use the ATS 3.0c in his full glory since i cant figure out some issues, but is ok...i will try again and again to fully understand how can i configure it XD

Thanks for your Works and Time, i really appreciate it! ^^
Title: Re: Monster Catalogue
Post by: fenicearcana on September 02, 2011, 12:50:04 PM
A last question, if you can answer when you have time ^^
Is there a way to make the description box to contain more words?
It has around a line of description...it would be very nice to add more, and more, also maybe a little histori of the species...i'm asking to much, or it is possible to configure longer description, somehow? ^^
Thanks again...i'm gratefoul.
Title: Re: Monster Catalogue
Post by: Infinate X on September 02, 2011, 05:03:30 PM
This is a great script, but I have a question about it. How hard would it be to make this an actor catalogue? I need one for my game since all the actors are the same as the monsters, and it would probably be easier to use.

EDIT:

@fenicearcana

I'm not good with scripting either, but I think I can increase the size of the description :D I fixed the Advanced Text System name box to use more then 5 letters (took me hours D:). I'm also making a script where I added 5 extra armour options, which involved me resizing a few windows and having just one coloumn for armours, in the select box. This shouldn't be too hard.

EDIT2: This script is more complicaated then anything I've edited before :( All I found was the desciption definition, and I don't know enough to work with that.

@MA

Do you want me to post the ATS edit I made? I remember how it didn't grow enough when I used large names, so I spent a few hours trying to figure it out and it works. I just tested it by puting "Over Six Letters" then I added tolololll and it still worked.

Here's a screenshot:
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi1085.photobucket.com%2Falbums%2Fj426%2FRPGMakerVX52%2FExtraLargeNameBoxATS.png&hash=b305451d84e877c8e40df59dcf9b146ec96109a3)
Title: Re: Monster Catalogue
Post by: fenicearcana on September 02, 2011, 07:38:56 PM
Cool, yes, if you can post it, i will appreciate ^^

Today, programming, i've found a BIG problem...
Now that i've the Monter catalogue in my game, it crash on site where it didnt crash before...

the problem is, when i use a variable to check the number of any item in the inventory, it say:

Script 'Game_Interpreter' line 750:NoMethodError occurred. undefined method '[]' for nil:NilClass

The line 750 is:       actor = $game_actors[@parameters[1]]
I really dont know what it means...something about exp? why exp?

This happen anytime i use something like:

Contol Variables [00xx:wood carried]=[wood] in inventary

the full input is
Contol Variables [00xx:wood carried]=[wood] in inventary
  Conditional Branch: Variable [00xx:wood carried] >= 80
    Text: "You are carring much Wood! Beware, anything over 99 units will be
         discarded!"
    Else: Nothing

Doesent matter if i use a Action Button or Parallel Event.

I've tried to change the variable position, the item position and number, nothing...
it still crash when i check the variable. I've also tried to change the icon XD
Seems if i dont want to trow away my game, i must forget about using the Monter Catalogue...what a shame...i liked so much, but i cant find a way to solve that crash... i've plenty of Quests like "find X number of Y and bring to me" so i need to use variables that way...

Any ideas to solve it? ^^

Thanks for your time, anyway, is cool chat abaut our games like that eheheh XD

PS: i'm using VX, just to say ^^
Title: Re: Monster Catalogue
Post by: fenicearcana on September 02, 2011, 07:57:38 PM
i've tried to delete the Monster Catalogue...the ATS 3....the Omega journal quest...
i've deleted any script i've added...but that error show anyway...what does this means?
then is not scripts fault...maybe i've used to much variables in the whole game and it got bugged and mad? O.o
i just cant understand...i've never messed up with anything strange aside adding some script in the right area and now suddently the game crash if i try to count the item in the inventory of the party...
If i cant fix this i think i've lost tre month of game-creating...how sad -.-
Title: Re: Monster Catalogue
Post by: modern algebra on September 02, 2011, 09:22:07 PM
No, it's an error in the default scripts. Go to command_122 of Game_Interpreter and replace the whole method with the following:

Code: [Select]
  def command_122
    value = 0
    case @params[3]  # Operand
    when 0  # Constant
      value = @params[4]
    when 1  # Variable
      value = $game_variables[@params[4]]
    when 2  # Random
      value = @params[4] + rand(@params[5] - @params[4] + 1)
    when 3  # Item
      value = $game_party.item_number($data_items[@params[4]])
    when 4
      actor = $game_actors[@params[4]]
      if actor != nil
        case @params[5]
        when 0  # Level
          value = actor.level
        when 1  # Experience
          value = actor.exp
        when 2  # HP
          value = actor.hp
        when 3  # MP
          value = actor.mp
        when 4  # Maximum HP
          value = actor.maxhp
        when 5  # Maximum MP
          value = actor.maxmp
        when 6  # Attack
          value = actor.atk
        when 7  # Defense
          value = actor.def
        when 8  # Spirit
          value = actor.spi
        when 9  # Agility
          value = actor.agi
        end
      end
    when 5  # Enemy
      enemy = $game_troop.members[@params[4]]
      if enemy != nil
        case @params[5]
        when 0  # HP
          value = enemy.hp
        when 1  # MP
          value = enemy.mp
        when 2  # Maximum HP
          value = enemy.maxhp
        when 3  # Maximum MP
          value = enemy.maxmp
        when 4  # Attack
          value = enemy.atk
        when 5  # Defense
          value = enemy.def
        when 6  # Spirit
          value = enemy.spi
        when 7  # Agility
          value = enemy.agi
        end
      end
    when 6  # Character
      character = get_character(@params[4])
      if character != nil
        case @params[5]
        when 0  # x-coordinate
          value = character.x
        when 1  # y-coordinate
          value = character.y
        when 2  # direction
          value = character.direction
        when 3  # screen x-coordinate
          value = character.screen_x
        when 4  # screen y-coordinate
          value = character.screen_y
        end
      end
    when 7  # Other
      case @params[4]
      when 0  # map ID
        value = $game_map.map_id
      when 1  # number of party members
        value = $game_party.members.size
      when 2  # gold
        value = $game_party.gold
      when 3  # steps
        value = $game_party.steps
      when 4  # play time
        value = Graphics.frame_count / Graphics.frame_rate
      when 5  # timer
        value = $game_system.timer / Graphics.frame_rate
      when 6  # save count
        value = $game_system.save_count
      end
    end
    for i in @params[0] .. @params[1]   # Batch control
      case @params[2]  # Operation
      when 0  # Set
        $game_variables[i] = value
      when 1  # Add
        $game_variables[i] += value
      when 2  # Sub
        $game_variables[i] -= value
      when 3  # Mul
        $game_variables[i] *= value
      when 4  # Div
        $game_variables[i] /= value if value != 0
      when 5  # Mod
        $game_variables[i] %= value if value != 0
      end
      if $game_variables[i] > 99999999    # Maximum limit check
        $game_variables[i] = 99999999
      end
      if $game_variables[i] < -99999999   # Minimum limit check
        $game_variables[i] = -99999999
      end
    end
    $game_map.need_refresh = true
    return true
  end
Title: Re: Monster Catalogue
Post by: fenicearcana on September 02, 2011, 09:50:52 PM
Thanks, i've relpied in the other post...i'm a bit chaotic when facing trouble and i'm not very skilled with forum chatting :P
But thanks, you saved my hard work and give me the hope in the future *_*
Title: Re: Monster Catalogue
Post by: Darkrai1276 on October 14, 2011, 09:17:13 PM
i have a problem, any time i kill a monster more than once it duplicates, why is this, for instance i killed 3 slimes and 3 slimes are appearing in the catalog  :'(
Title: Re: Monster Catalogue
Post by: modern algebra on October 14, 2011, 10:05:42 PM
That shouldn't happen and doesn't by default. I suspect that it is conflicting with another script, possibly one which varies the stats of monsters or, for whatever reasons, assigns monsters unique IDs.
Title: Re: Monster Catalogue
Post by: Tetosan on January 19, 2012, 08:00:16 PM
Hey

can i also add this as an Menu Option somehow?
i tried around a bit but it keeps erroring XD

i somehow doesn't want to add it as an Item or on-Map event but a Menu option ><

only menu Scripts i'm using is a Party Script and a Status Screen modifier
Title: Re: Monster Catalogue
Post by: D&P3 on February 05, 2012, 03:33:36 PM
Quote
can i also add this as an Menu Option somehow?
i tried around a bit but it keeps erroring XD

i somehow doesn't want to add it as an Item or on-Map event but a Menu option ><

only menu Scripts i'm using is a Party Script and a Status Screen modifier

What exactly do you mean 'as a menu option'?

If your asking to get this put into the main menu as a selectable option, then, which menu are you using (Custom or Original)?


Or do you mean you want the menu to be activated from an item (Like a monster's book or something like that)?
Title: Re: Monster Catalogue
Post by: Tetosan on February 05, 2012, 03:40:20 PM
as said the only thing that affects the Menu for me is the Reserve Party (by Modern Algebra)

other than that there's a Save menu and Status modification but they don't affect the design of the menu at all
Title: Re: Monster Catalogue
Post by: D&P3 on February 05, 2012, 03:42:40 PM
So... does that mean you got it working or do you still need help?
Title: Re: Monster Catalogue
Post by: Tetosan on February 05, 2012, 03:48:34 PM
well i asked if there's a way to make it appear in the Menu like the party thing does, i didn't accomplish that yet sadly.
Title: Re: Monster Catalogue
Post by: D&P3 on February 05, 2012, 04:22:28 PM
Open up your script editor and under 'materials' but above 'main' create a new script and input this code.

Code: [Select]
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
#  This class performs the menu screen processing.
#==============================================================================

class Scene_Menu < Scene_Base
  alias MA_MON_CAT_CMMDWINDOW_9hgy create_command_window
  #--------------------------------------------------------------------------
  # * Create Command Window
  #--------------------------------------------------------------------------
  def create_command_window
    s1 = Vocab::item
    s2 = Vocab::skill
    s3 = Vocab::equip
    s4 = Vocab::status
    s5 = "Monster Catalogue"
    s6 = Vocab::save
    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(5, false)     # Disable save
    end
  end
  #--------------------------------------------------------------------------
  # * Update Command Selection
  #--------------------------------------------------------------------------
  alias MA_MON_CAT_UPDATE_9hgy 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
        $scene = Scene_Catalogue.new (20)
      when 5      # Save
        $scene = Scene_File.new(true, false, false)
      when 6      # End Game
        $scene = Scene_End.new
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Start Actor Selection
  #--------------------------------------------------------------------------
  def start_actor_selection
    @command_window.active = false
    @status_window.active = true
    if $game_party.last_actor_index < @status_window.item_max
      @status_window.index = $game_party.last_actor_index
    else
      @status_window.index = 0
    end
  end
  #--------------------------------------------------------------------------
  # * End Actor Selection
  #--------------------------------------------------------------------------
  def end_actor_selection
    @command_window.active = true
    @status_window.active = false
    @status_window.index = -1
  end
  #--------------------------------------------------------------------------
  # * Update Actor Selection
  #--------------------------------------------------------------------------
  def update_actor_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_actor_selection
    elsif Input.trigger?(Input::C)
      $game_party.last_actor_index = @status_window.index
      Sound.play_decision
      case @command_window.index
      when 1  # skill
        $scene = Scene_Skill.new(@status_window.index)
      when 2  # equipment
        $scene = Scene_Equip.new(@status_window.index)
      when 3  # status
        $scene = Scene_Status.new(@status_window.index)
      end
    end
  end
end

This is for the default menu however, so if you start using a custom menu, it may need to be updated to include your other menu items.

Edit: I forgot to mention that you could change the name of the option on line 17
Code: [Select]
#    s5 = "Monster Catalogue"  < Replace the text in " "
                     
Title: Re: Monster Catalogue
Post by: Tetosan on February 05, 2012, 04:31:26 PM
Thanks :3 it works now :3
Title: Re: Monster Catalogue
Post by: D&P3 on February 05, 2012, 05:33:44 PM
I don't know about everyone else, but I think that something like a database (or catalogue) should be an item or book in your inventory.

If that is your aim and you don't know how to do this, just download this demo here:
Monster Catalogue Item (http://www.sendspace.com/file/2ig8ps)

and copy the item 'Monster Catalogue' and the common event 'Monster Catalogue' to your game.

Make sure you set the common event in the item info to the same one your using for the monster catalogue.
Title: Re: Monster Catalogue
Post by: Tetosan on February 05, 2012, 09:15:10 PM
In the game i'm making the Main character has the Ability to remember all Monsters that were defeated at least once ^^
so a book wouldn't be right for me.. if the menu wouldn't work now it would actually be a Skill by now :<
Title: Re: Monster Catalogue
Post by: D&P3 on February 05, 2012, 09:44:32 PM
Ah. Don't worry, I was referring to everyone.
Title: Re: Monster Catalogue
Post by: evstellar on September 04, 2012, 04:03:31 PM
Hey Algebra, I'm using yanfly's script that adds new stats, and i was wondering if you could add something to the script that makes these new stats displayed along with the others
Title: Re: Monster Catalogue
Post by: modern algebra on September 08, 2012, 02:01:21 PM
Assuming by that you mean YEM New Battle Stats and not some previous version, that try pasting the following code into its own slot below the Monster Catalogue:

Code: [Select]
#==============================================================================
# ** Window MonsterCard
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#  Summary of Changes:
#    aliased method - get_monster_stats
#==============================================================================

class Window_MonsterCard
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  # * Get Monster Stats
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  alias mamcdexres_gtmonsterstats_7uc2 get_monster_stats
  def get_monster_stats(*args)
    item_stats, stat_names = mamcdexres_gtmonsterstats_7uc2(*args)
    # Dex
    if $imported["DEX Stat"]
      item_stats.push (@object.dex)
      stat_names.push (YEM::STATS::DEX::VOCAB)
    end
    # Res
    if $imported["RES Stat"]
      item_stats.push (@object.res)
      stat_names.push (YEM::STATS::RES::VOCAB)
    end
    return item_stats, stat_names
  end
end

I have not tested that, but give it a shot.
Title: Re: Monster Catalogue
Post by: evstellar on September 20, 2012, 06:05:35 PM
I tested it and it works fine! Thanks a ton Algebra!  ;D
Title: Re: Monster Catalogue
Post by: Valentine on November 21, 2014, 10:44:29 AM
Its possible to add "?????????" for all unknown monsters?

Example:

01 - Demon
02 - Poisen Slime
03 - ?????????????????
04 - ?????????????????
05 - Ghost
06 - ?????????????????
...........
Title: Re: Monster Catalogue
Post by: modern algebra on November 21, 2014, 11:26:25 PM
No, not currently.
Title: Re: Monster Catalogue
Post by: backpack39 on December 04, 2014, 01:43:58 AM
I have a question:
What or where is this notebox that is mentioned in the beginning?