#===============================================================
# ? [VX] ? Monster Book II ? ?
#--------------------------------------------------------------
# ? by Woratana [woratana@hotmail.com]
# ? Thaiware RPG Maker Community
# ? Released on: 02/01/2009
# ? Version: 2.0
# ? Special Thanks: Momomo~ for interface from Monster Book XP version
#--------------------------------------------------------------
# ** FEATURES
#--------------------------------------------------------------
# - 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
#--------------------------------------------------------------
# ** HOW TO USE
#--------------------------------------------------------------
# * Call Scene Monster Book by call script:
# $scene = Scene_MonsterBook.new
# * Complete all enemies' information by call script:
# $game_system.set_monbook_complete
# * Clear all enemies' information by call script:
# $game_system.reset_monbook
#--------------------------------------------------------------
# * Show enemy's information by call script:
# $game_system.monbook[enemy_id] = true
# * Hide enemy's information by call script:
# $game_system.monbook[enemy_id] = false
# ^ Change 'enemy_id' to ID of enemy you want
# ** e.g. $game_system.monbook[10] = true
#===============================================================
module Wora_Monbook
#===============================================================
# ** [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
#===============================================================
# ** [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
#===============================================================
# ** [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
#===============================================================
# ** 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
#===============================================================
# ** 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
#===============================================================
# ** 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
#=============================================================
# * 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
#=============================================================
# * 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