Monster Book 2

Version 2.0
by Woratana
Release Date: 02/01/2009

RPG Maker Forum

Features

Version 2.0
- Built-in snippet to add 'Monster Book' in the menu's command
- Show enemies' data in Monster Book after player fight with them
- All the texts are editable in setup part
- Call script to clear/complete Monster Book's data
- Call script to show/hide monster's data in Monster Book
- Compare monster's status with the highest level actors in party
- Turn ON switch to stop adding data into Monster Book temporarily
- Choose the monsters you don't want to show their name and data
monbook1.png
monbook2.png
monbook3.png


#===============================================================

  1. ● [VX] ◦ Monster Book II ◦ □

#------------

  1. ◦ by Woratana [moc.liamtoh|anatarow#moc.liamtoh|anatarow]
  2. ◦ Thaiware RPG Maker Community
  3. ◦ Released on: 02/01/2009
  4. ◦ Version: 2.0
  5. ◦ Special Thanks: Momomo~ for interface from Monster Book XP version

#------------

  1. ** FEATURES

#------------

  1. - Built-in snippet to add 'Monster Book' in the menu's command
  2. - Show enemies' data in Monster Book after player fight with them
  3. - All the texts are editable in setup part
  4. - Call script to clear/complete Monster Book's data
  5. - Call script to show/hide monster's data in Monster Book
  6. - Compare monster's status with the highest level actors in party
  7. - Turn ON switch to stop adding data into Monster Book temporarily
  8. - Choose the monsters you don't want to show their name and data

#------------

  1. ** HOW TO USE

#------------

  1. * Call Scene Monster Book by call script:
  2. $scene = Scene_MonsterBook.new
  1. * Complete all enemies' information by call script:
  2. $game_system.set_monbook_complete
  1. * Clear all enemies' information by call script:
  2. $game_system.reset_monbook

#------------

  1. * Show enemy's information by call script:
  2. $game_system.monbook[enemy_id] = true
  1. * Hide enemy's information by call script:
  2. $game_system.monbook[enemy_id] = false
  1. ^ Change 'enemy_id' to ID of enemy you want
  2. ** e.g. $game_system.monbook[10] = true

#===============================================================

module Wora_Monbook

#===============================================================

  1. ** [Setup Part] - Config script in this part

#------------
SHOW_IN_MENU = true # Show Monster Book in Menu Command? (true / false)
MENU_COMMAND = 'MonsterBook' # Menu command name for Monster Book
MENU_INDEX = 4 # Index of menu command you want to insert monster book

TEXT_TITLE = 'Monster Book'
# Monster Book Title (Show at top left of the screen)
TEXT_FOUND = 'Found: '
# Text before number of how many monster are found
TEXT_COMPLETED = 'Completed: '
# Text before percentage of how many monster are found

TEXT_DOT = '.'
# Text show after enemy's ID (e.g. '.' will make '2.' and ')' will make '2)' )

COMPARE_STATUS = true
# Use Compare Status System? It will compare enemy's status with highest level
# actor in party. Show GREEN number if enemy has lower status.
# Show RED-GRAY number if enemy has higher status. (true / false)

NO_RECORD_SWITCH = 10
# If this switch ID turn ON, any monster the player fight with won't be added
# into Monster Book.

NO_DATA_MONSTER = []
# List of IDs of monster you don't want to show name and data on Monster Book
# e.g. [1, 3, 5] will make monster ID 1, 3, and 5 show no data in Monster Book
#===============================================================
end

#===============================================================

  1. ** [Alias] Game_System

#------------
class Game_System
attr_accessor :monbook
alias :wora_monbook_gamsys_ini :initialize
def initialize
wora_monbook_gamsys_ini
create_monbook
end

def create_monbook
@monbook ||= Array.new($data_enemies.size) {false}
end

def set_monbook_complete
@monbook = Array.new($data_enemies.size) {true}
@monbook[0] = false
end

def reset_monbook
@monbook = Array.new($data_enemies.size) {false}
end
end

#===============================================================

  1. ** [Alias] Game_Troop

#------------
class Game_Troop < Game_Unit
alias :wora_monbook_gamtroop_setup :setup
def setup(*args)
wora_monbook_gamtroop_setup(*args)
$game_system.create_monbook
unless $game_switches[Wora_Monbook::NO_RECORD_SWITCH]
@enemies.each {|e| $game_system.monbook[e.enemy_id] = true }
end
end
end

#===============================================================

  1. ** Window_MonsterBHelp

#------------
class Window_MonsterBHelp < Window_Base
include Wora_Monbook

def initialize
super(0, 0, 544, WLH + 32)
# Write Monster Book Title
contents.font.color = system_color
contents.draw_text(0, 0, contents.width, WLH, TEXT_TITLE)
# Calculate found monster & complete percentage
found_count = 0
$game_system.monbook.each {|e| found_count += 1 if e }
percent_count = (found_count * 100) / ($data_enemies.size - 1)
# Collect & Store Text in variables
found_text = found_count.to_s + '/' + ($data_enemies.size - 1).to_s
percent_text = percent_count.to_s + '%'
mid_text = ' | '
right_text = TEXT_FOUND + found_text + mid_text + TEXT_COMPLETED +
percent_text
# Calculate Text Width
found_t_width = contents.text_size(TEXT_FOUND).width
found_width = contents.text_size(found_text).width
percent_t_width = contents.text_size(TEXT_COMPLETED).width
mid_width = contents.text_size(mid_text).width
right_width = contents.text_size(right_text).width
# Write Monster Found & Complete Percentage
contents.font.color = normal_color
contents.draw_text(contents.width - right_width, 0, contents.width, WLH,
TEXT_FOUND)
contents.draw_text(contents.width - right_width + found_t_width +
found_width, 0, contents.width, WLH, mid_text + TEXT_COMPLETED)
contents.font.color = crisis_color
contents.draw_text(contents.width - right_width + found_t_width, 0,
contents.width, WLH, found_text)
contents.draw_text(contents.width - right_width + found_t_width +
found_width + mid_width + percent_t_width, 0, contents.width, WLH,
percent_text)
end
end

#===============================================================

  1. ** Window_MonsterBDetail

#------------
class Window_MonsterBDetail < Window_Base
def initialize(window_temp)
super(window_temp.x, window_temp.y, window_temp.width, window_temp.height)
self.opacity = 0
@win_image = Window_Base.new(self.x, self.y, self.width, self.height)
self.z = @win_image.z + 1
@last_enemy = 0
end

def visible=(bool)
super
@win_image.visible = bool
end

def dispose
@win_image.dispose
super
end

def write_detail(enemy_id)
return if @last_enemy == enemy_id
contents.clear
@win_image.contents.clear
@last_enemy = enemy_id
data = $data_enemies[enemy_id]
# Draw Enemy Graphic
bitmap = Cache.battler(data.battler_name, data.battler_hue)
bw = bitmap.width < 160 ? (160 - bitmap.width) / 2 : 0
bh = contents.height - bitmap.height
@win_image.contents.blt(bw, bh, bitmap, bitmap.rect)
bitmap.dispose
# Write Name
contents.font.color = normal_color
contents.draw_text(0, 0, contents.width, WLH,
data.id.to_s + Wora_Monbook::TEXT_DOT + ' ' + data.name)
# Write Enemy Status
hpx = 120
draw_enemy_stat(data, contents.width - (hpx * 2) - 32, 0, hpx, 'hp')
draw_enemy_stat(data, contents.width - hpx, 0, hpx, 'mp')
draw_enemy_stat(data, contents.width - (hpx * 2) - 32, WLH * 2, hpx, 'atk')
draw_enemy_stat(data, contents.width - hpx, WLH * 2, hpx, 'def')
draw_enemy_stat(data, contents.width - (hpx * 2) - 32, WLH * 3, hpx, 'spi')
draw_enemy_stat(data, contents.width - hpx, WLH * 3, hpx, 'agi')
draw_enemy_stat(data, contents.width - (hpx * 2) - 32, WLH * 4, hpx, 'hit')
draw_enemy_stat(data, contents.width - hpx, WLH * 4, hpx, 'eva')
draw_enemy_stat(data, contents.width - (hpx * 2) - 32, WLH * 6, hpx, 'exp')
draw_enemy_stat(data, contents.width - hpx, WLH * 6, hpx, 'gold')
rect = Rect.new(contents.width - (hpx * 2) - 8, (WLH * 8) - 8, 216,
(WLH * 4) + 16)
contents.fill_rect(rect, Color.new(0,0,0,140))
lsize = 2 # Line Size
lcolor = Color.new(255,255,255,160) # Line Color
contents.fill_rect(rect.x, rect.y, lsize, rect.height, lcolor)
contents.fill_rect(rect.x, rect.y, rect.width, lsize, lcolor)
contents.fill_rect(rect.x + rect.width - lsize, rect.y, lsize,
rect.height, lcolor)
contents.fill_rect(rect.x, rect.y + rect.height - lsize, rect.width,
lsize, lcolor)
contents.font.color = system_color
contents.draw_text(contents.width - (hpx * 2), WLH * 8, 200, WLH,
'Drop Item 1')
draw_enemy_drop(data, 1, contents.width - (hpx * 2), WLH * 9)
contents.font.color = system_color
contents.draw_text(contents.width - (hpx * 2), WLH * 10, 200, WLH,
'Drop Item 2')
draw_enemy_drop(data, 2, contents.width - (hpx * 2), WLH * 11)
end

def draw_enemy_stat(actor, x, y, width, stat)
color1 = system_color
color2 = normal_color
slash = false
# Find highest level actor
if Wora_Monbook::COMPARE_STATUS
hactor = ($game_party.members.sort {|a,b| a.level <=> b.level })
hactor = hactor[hactor.size - 1]
end
case stat
when 'hp'
vocab = Vocab::hp
number = actor.maxhp
hnumber = hactor.maxhp if Wora_Monbook::COMPARE_STATUS
slash = true
when 'mp'
vocab = Vocab::mp
number = actor.maxmp
hnumber = hactor.maxmp if Wora_Monbook::COMPARE_STATUS
slash = true
when 'atk'
vocab = Vocab::atk
number = actor.atk
hnumber = hactor.atk if Wora_Monbook::COMPARE_STATUS
when 'def'
vocab = Vocab::def
number = actor.def
hnumber = hactor.def if Wora_Monbook::COMPARE_STATUS
when 'spi'
vocab = Vocab::spi
number = actor.spi
hnumber = hactor.spi if Wora_Monbook::COMPARE_STATUS
when 'agi'
vocab = Vocab::agi
number = actor.agi
hnumber = hactor.agi if Wora_Monbook::COMPARE_STATUS
when 'hit'
vocab = 'HIT'
number = actor.hit
hnumber = hactor.hit if Wora_Monbook::COMPARE_STATUS
when 'eva'
vocab = 'EVA'
number = actor.eva
hnumber = hactor.eva if Wora_Monbook::COMPARE_STATUS
when 'exp'
vocab = 'EXP'
number = actor.exp
color2 = crisis_color
when 'gold'
vocab = 'Gold'
number = actor.gold
color2 = crisis_color
end
if Wora_Monbook::COMPARE_STATUS and !hnumber.nil?
if hnumber > number # Higher
color2 = power_up_color
elsif hnumber < number # Less
color2 = power_down_color
elsif hnumber == number # Equal
color2 = normal_color
end
end
contents.font.color = color1
contents.draw_text(x, y, 50, WLH, vocab)
xr = x + width
contents.font.color = color2
if slash
contents.draw_text(xr - 95, y, 40, WLH, number, 2)
contents.draw_text(xr - 55, y, 11, WLH, '/', 2)
end
w_ava = slash ? 40 : 80
contents.draw_text(xr - w_ava, y, w_ava, WLH, number, 2)
end

def draw_enemy_drop(actor, drop_id, x, y)
drop = eval('actor.drop_item' + drop_id.to_s)
if drop.kind.zero?
contents.font.color = normal_color
contents.draw_text(x, y, 200, WLH, " -——")
else
case drop.kind
when 1; item = $data_items[drop.item_id]
when 2; item = $data_weapons[drop.weapon_id]
when 3; item = $data_armors[drop.armor_id]
end
draw_item_name(item, x, y)
end
end
end
#===============================================================

  1. ** Scene_MonsterBook

#------------
class Scene_MonsterBook < Scene_Base
def initialize(from_menu = false)
@from_menu = from_menu
end

def start
super
create_menu_background
$game_system.create_monbook
@window_help = Window_MonsterBHelp.new
# Create Monster List
monlist = []
$game_system.monbook.each_index do |i|
next if i == 0 # The first index in $data_enemies is blank
# If player found the monster
if $game_system.monbook[i] and
!Wora_Monbook::NO_DATA_MONSTER.include?(i)
montext = i.to_s + Wora_Monbook::TEXT_DOT + ' ' + $data_enemies[i].name
else # If player haven't found
montext = i.to_s + Wora_Monbook::TEXT_DOT
end
monlist « montext
end
@window_monlist = Window_Command.new(544, monlist, 2)
@window_monlist.y = @window_help.height
@window_monlist.height = Graphics.height - @window_help.height
@window_monlist.active = true
@window_mondetail = Window_MonsterBDetail.new(@window_monlist)
@window_mondetail.visible = false
end

def update
super
if @window_monlist.active
@window_monlist.update
if Input.trigger?(Input::C)
# View monster's detail if found monster
if $game_system.monbook[@window_monlist.index + 1] and
!Wora_Monbook::NO_DATA_MONSTER.include?(@window_monlist.index + 1)
Sound.play_decision
@window_monlist.active = false
@window_monlist.visible = false
@window_mondetail.active = true
@window_mondetail.visible = true
@window_mondetail.write_detail(@window_monlist.index + 1)
else
Sound.play_cancel
end
elsif Input.trigger?(Input::B)
Sound.play_cancel
# Return
$scene = @from_menu ? Scene_Menu.new(Wora_Monbook::MENU_INDEX) :
Scene_Map.new
end
elsif @window_mondetail.active
if Input.trigger?(Input::B)
Sound.play_cancel
@window_monlist.active = true
@window_monlist.visible = true
@window_mondetail.active = false
@window_mondetail.visible = false
end
end
end

def terminate
super
dispose_menu_background
@window_help.dispose
@window_monlist.dispose
@window_mondetail.dispose
end
end

#=============================================================

  1. * Window_Command Insert Tool

#=============================================================
class Window_Command < Window_Selectable
unless method_defined? :wora_cominstool_wincom_ini
alias wora_cominstool_wincom_ini initialize
alias wora_cominstool_wincom_drawitem draw_item
end

#--------
# * [Alias] Initialize
#--------
def initialize(*args)
@disabled_commands = [] # Array to keep track of disabled commands
wora_cominstool_wincom_ini(*args)
end

#--------
# * [Alias] Draw_Item
#--------
def draw_item(*args)
wora_cominstool_wincom_drawitem(*args)
# Set array's index to 1 if command is disabled
@disabled_commands[args[0]] = args[1].nil? || args[1] ? nil : true
end

#--------
# * Insert Command
#--------
def ins_command(index, text)
@commands.insert(index, text) # Insert new commands
@disabled_commands.insert(index, nil)
# Set new height for window
old_disabled_commands = @disabled_commands.dup
self.height = (@commands.size + @column_max - 1) / @column_max * WLH + 32
@item_max = @commands.size # Update @item_max to make refresh works correctly
create_contents # Create new content because window's size changed
refresh # Redraw window's contents
old_disabled_commands.each_index do |i|
if !old_disabled_commands[i].nil?
draw_item(i, false) # Draw commands that disabled before
end
end
end

#--------
# * Add Command
#--------
def add_command(text)
ins_command(@commands.size, text) # Add new command to new index
end
end

#=============================================================

  1. * Add command linked to Monster Book in Menu

#=============================================================
if Wora_Monbook::SHOW_IN_MENU
class Scene_Menu < Scene_Base
#--------------
# * Sort New Command(s)
#
--------------
def wsort_newcommand
@wsorted_command ||= [] # Array to collect sorted commands
wnewcommand = @wnewcommand - @wsorted_command # Remove sorted commands
wnewcommand.sort.each {|i| @menu_index += 1 if @menu_index >= i }
@command_window.index = @menu_index # Set window's index to new index
@wsorted_command = @wsorted_command + @wnewcommand # Add sorted commands
end

#--------------
# * [Alias] Create Command Window
#
--------------
alias wora_menucomorg_scemenu_crecomwin create_command_window
def create_command_window(*args)
wora_menucomorg_scemenu_crecomwin(*args)
# Insert new command
@command_window.ins_command(Wora_Monbook::MENU_INDEX,
Wora_Monbook::MENU_COMMAND)
# Set index to correct one if @menu_index is after/equal to new command
@wnewcommand ||= []
@wnewcommand « Wora_Monbook::MENU_INDEX
wsort_newcommand
end

#--------------
# * [Alias] Update Command Selection
#
--------------
alias wora_menucomorg_scemenu_updcomsel update_command_selection
def update_command_selection(*args)
@menucomorpg_change = false
# If player choose new command
if Input.trigger?(Input::C) and @command_window.index ==
Wora_Monbook::MENU_INDEX
Sound.play_decision
$scene = Scene_MonsterBook.new(true)
else # If player choose index after new command
if Input.trigger?(Input::C) and @command_window.index >
Wora_Monbook::MENU_INDEX
@command_window.index -= 1 # Decrease index to make old update works
@menucomorpg_change = true
end
wora_menucomorg_scemenu_updcomsel(*args)
end
@command_window.index += 1 if @menucomorpg_change # Increase index back
end

#--------------
# * [Alias] Update Actor Selection
#
--------------
alias wora_menucomorg_scemenu_updactsel update_actor_selection
def update_actor_selection(*args)
@menucomorpg_change = false
# If player choose index after new command
if Input.trigger?(Input::C) and @command_window.index >
Wora_Monbook::MENU_INDEX
@command_window.index -= 1 # Decrease index to make old update works
@menucomorpg_change = true
end
wora_menucomorg_scemenu_updactsel(*args)
@command_window.index += 1 if @menucomorpg_change # Increase index back
end
end
end