#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ モンスター図鑑 - KGC_MonsterGuide ◆
#_/ ◇ Last update : 2008/01/10 ◇
#_/----------------------------------------------------------------------------
#_/ モンスター図鑑を作成します。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================
module KGC
# ◆図鑑画面背景透過
# true にすると、マップ画面が透けて見える。
MG_BACK_TRANSPARENT = true
# ◆図鑑から隠す敵
# 図鑑から隠したい敵のIDを配列に格納。
# <例> MG_HIDE_ENEMIES = [2, 4, 8, 16, 32]
MG_HIDE_ENEMIES = [1,192,193,194,195,201,202,203,204,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,229,238,239,240,241,242,243]
# ◆属性耐性を調べる範囲(属性ID)
MG_ELEMENT_RANGE = 1..8
# ◆弱点属性文字色
MG_WEEK_COLOR = Color.new(255, 128, 128)
# ◆耐性属性文字色
MG_RESIST_COLOR = Color.new(128, 128, 255)
# ◆カーソル移動で表示内容更新
# false にすると、C ボタンを押すまで再描画しない。
# (重く感じない場合は true のままでOK)
MG_MOVE_REFRESH = true
# ◆変身前の敵も撃破
# false にすると、変身前の敵は撃破したと見なされない。
MG_ORIGINAL_DEFEAT = true
# ◆通し番号を描画
MG_SERIAL_NUMBER = true
# ◆通し番号をリストの並び順にする
# true にすると、IDを無視して表示順の番号を付ける。
MG_SERIAL_FOLLOW = true
# ◆敵の並び順
# 表示する敵のIDを、表示したい順に配列に格納。
# .. や ... を使用した範囲指定も可能。
# 指定しなかった敵、または MG_HIDE_ENEMIES に指定した敵は表示しない。
# (この機能を使用しない場合は nil)
MG_ENEMY_ORDER = nil
# MG_ENEMY_ORDER = [1..5, 8..13, 6, 7, 14, 15]
# ↑使用例
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
$imported = {} if $imported == nil
$imported["MonsterGuide"] = true
#--------------------------------------------------------------------------
# ● モンスター図鑑呼び出し
#--------------------------------------------------------------------------
def call_monster_guide
# プレイヤーの姿勢を矯正
$game_player.straighten
# モンスター図鑑画面に切り替え
$scene = Scene_MonsterGuide.new(true)
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
module MonsterGuide
#--------------------------------------------------------------------------
# ● 遭遇状態設定
#--------------------------------------------------------------------------
def self.encountered(id, flag)
$game_system.enemy_encountered[id] = flag
end
#--------------------------------------------------------------------------
# ● 撃破状態設定
#--------------------------------------------------------------------------
def self.defeated(id, flag)
$game_system.enemy_defeated[id] = flag
end
#--------------------------------------------------------------------------
# ● 図鑑リセット
#--------------------------------------------------------------------------
def self.reset
$game_system.enemy_encountered.clear
$game_system.enemy_defeated.clear
end
#--------------------------------------------------------------------------
# ● 図鑑完成
#--------------------------------------------------------------------------
def self.complete
(1..$data_enemies.size).each { |i|
self.encountered(i, true)
self.defeated(i, true)
}
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_System
#==============================================================================
class Game_System
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :enemy_encountered # 遭遇済みフラグ
attr_accessor :enemy_defeated # 撃破済みフラグ
attr_accessor :weapon_got
attr_accessor :armor_got
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias initialize_KGC_MonsterGuide initialize
def initialize
initialize_KGC_MonsterGuide
@enemy_encountered = []
@enemy_defeated = []
@weapon_got = []
@armor_got = []
end
def equip_count
n = 0
for i in $game_system.weapon_got + $game_system.armor_got
n += 1 if i==true
end
return n
end
def equip_all
n = 0
for i in $data_weapons + $data_armors
n += 1 if (i != nil and i.icon_name != "")
end
return n
end
#--------------------------------------------------------------------------
# ● エネミー存在チェック
#--------------------------------------------------------------------------
def enemy_exist?(enemy_id)
return $data_enemies[enemy_id] != nil && $data_enemies[enemy_id].name != ""
end
#--------------------------------------------------------------------------
# ● 存在する敵の種類数取得
#--------------------------------------------------------------------------
def all_enemies_count
n = 0
# 存在する敵の種類数を取得
(1...$data_enemies.size).each { |i|
if enemy_exist?(i) && !KGC::MG_HIDE_ENEMIES.include?(i)
n += 1
end
}
return n
end
#--------------------------------------------------------------------------
# ● 撃破した敵の種類数取得
#--------------------------------------------------------------------------
def defeated_enemies_count
n = 0
# 撃破した敵の種類数を取得
(1...$data_enemies.size).each { |i|
if enemy_exist?(i) && @enemy_encountered[i] &&
@enemy_defeated[i] && !KGC::MG_HIDE_ENEMIES.include?(i)
n += 1
end
}
return n
end
#--------------------------------------------------------------------------
# ● モンスター図鑑完成度の取得
#--------------------------------------------------------------------------
def monster_guide_completion
num = all_enemies_count
if num > 0
return defeated_enemies_count * 100 / num
else
return 0
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :original_id # 変身前のID
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# troop_id : トループ ID
# member_index : トループメンバーのインデックス
#--------------------------------------------------------------------------
alias initialize_KGC_MonsterGuide initialize
def initialize(troop_id, member_index)
initialize_KGC_MonsterGuide(troop_id, member_index)
@original_id = []
# 遭遇済みフラグをオン
unless @hidden
$game_system.enemy_encountered[@enemy_id] = true
end
end
#--------------------------------------------------------------------------
# ● 変身
# enemy_id : 変身先のエネミー ID
#--------------------------------------------------------------------------
alias transform_KGC_MonsterGuide transform
def transform(enemy_id)
# 変身前のIDを保存
@original_id.push(@enemy_id)
transform_KGC_MonsterGuide(enemy_id)
# 変身後の敵も遭遇済みにする
$game_system.enemy_encountered[@enemy_id] = true
end
#--------------------------------------------------------------------------
# ● 隠れ状態設定
#--------------------------------------------------------------------------
def hidden=(value)
[url=home.php?mod=space&uid=292300]@Hidden[/url] = value
# 出現した場合は遭遇済みフラグをオン
unless @hidden
$game_system.enemy_encountered[@enemy_id] = true
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Window_MonsterGuideTop
#------------------------------------------------------------------------------
# モンスター図鑑画面で、完成度を表示するウィンドウです。
#==============================================================================
class Window_MonsterGuideTop < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 0, 240, 96)
self.contents = Bitmap.new(width - 32, height - 32)
self.opacity = 0
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
text = "#{$game_system.defeated_enemies_count}/#{$game_system.all_enemies_count}"
self.contents.draw_text(110, 0, width - 32, 32, text)
text = "#{$game_system.monster_guide_completion}%"
self.contents.draw_text(110, 32, width - 32, 32, text)
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Window_MonsterGuideLeft
#------------------------------------------------------------------------------
# モンスター図鑑画面で、モンスター一覧を表示するウィンドウです。
#==============================================================================
class Window_MonsterGuideLeft < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 96, 227, 352)
self.index = 0
self.opacity = 0
refresh
end
#--------------------------------------------------------------------------
# ● 選択モンスターの取得
#--------------------------------------------------------------------------
def item
return @data[self.index]
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
if self.contents != nil
self.contents.dispose
self.contents = nil
end
@data = []
# 存在するエネミーを取得
if KGC::MG_ENEMY_ORDER == nil
# ID順
(1...$data_enemies.size).each { |i|
if $game_system.enemy_exist?(i) && !KGC::MG_HIDE_ENEMIES.include?(i)
@data.push($data_enemies[i])
end
}
else
# 指定順
KGC::MG_ENEMY_ORDER.each { |i|
if i.is_a?(Range) # 範囲指定の場合
i.each { |j|
if $game_system.enemy_exist?(j) && !KGC::MG_HIDE_ENEMIES.include?(j)
@data.push($data_enemies[j])
end
}
else # 直接指定の場合
if $game_system.enemy_exist?(i) && !KGC::MG_HIDE_ENEMIES.include?(i)
@data.push($data_enemies[i])
end
end
}
end
# 項目数が 0 でなければビットマップを作成し、全項目を描画
@item_max = @data.size
if @item_max > 0
self.contents = Bitmap.new(width - 32, row_max * 32)
for i in 0...@item_max
draw_item(i)
end
end
end
#--------------------------------------------------------------------------
# ● 項目の描画
# index : 項目番号
#--------------------------------------------------------------------------
def draw_item(index)
enemy = @data[index]
# 撃破していれば通常文字色に、そうでなければ無効文字色に設定
if $game_system.enemy_defeated[enemy.id]
self.contents.font.color = normal_color
else
self.contents.font.color = disabled_color
end
x = 4
y = index * 32
rect = Rect.new(x, y, self.width - 40, 32)
self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
# 遭遇していれば名前、遭遇していなければ?を描画
if KGC::MG_SERIAL_NUMBER
s_num = KGC::MG_SERIAL_FOLLOW ? (index + 1) : enemy.id
end
if $game_system.enemy_encountered[enemy.id]
if KGC::MG_SERIAL_NUMBER
text = sprintf("%03d: %s", s_num, enemy.name)
else
text = enemy.name
end
self.contents.draw_text(x, y, self.width - 40, 32, text)
else
if KGC::MG_SERIAL_NUMBER
text = sprintf("%03d: %s", s_num, "??????")
self.contents.draw_text(x, y, self.width - 40, 32, text)
else
self.contents.draw_text(x, y, self.width - 40, 32, "??????")
end
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Window_MonsterGuideRight
#------------------------------------------------------------------------------
# モンスター図鑑画面で、ステータスを表示するウィンドウです。
#==============================================================================
class Window_MonsterGuideRight < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(240, 0, 400, 480)
self.contents = Bitmap.new(width - 32, height - 32)
self.opacity = 0
end
#--------------------------------------------------------------------------
# ● リフレッシュ
# enemy : エネミー
# show_status : ステータス表示
#--------------------------------------------------------------------------
def refresh(enemy, show_status = true)
self.contents.clear
# 遭遇していない場合はNo data
unless $game_system.enemy_encountered[enemy.id]
self.contents.font.color = disabled_color
self.contents.draw_text(0, 100, 368, 32, "- No Data -", 1)
return
end
# バトラー画像を描画
bitmap = RPG::Cache.battler(enemy.battler_name, enemy.battler_hue)
cw = bitmap.width >> 1
self.contents.blt(184 - cw, 0, bitmap, bitmap.rect)
# ステータス非表示の場合は戻る
return unless show_status
# 撃破済みの場合、詳細情報を描画
if $game_system.enemy_defeated[enemy.id]
draw_status(enemy)
# 撃破していない場合
else
self.contents.font.color = disabled_color
self.contents.draw_text(0, 100, 368, 32, "- Not Defeated -", 1)
end
end
#--------------------------------------------------------------------------
# ● ステータス描画
# enemy : エネミー
#--------------------------------------------------------------------------
def draw_status(enemy)
# 値を描画
self.contents.font.color = normal_color
enemy = Difficulty.get_revised_enemy(enemy) if $imported["BattleDifficulty"]
if $game_switches[94] == true
self.contents.draw_text( 48, 224-30, 64, 32, (enemy.maxhp/2).to_s, 2)
else
self.contents.draw_text( 48, 224-30, 64, 32, enemy.maxhp.to_s, 2)
end
self.contents.draw_text(170, 224-30, 64, 32, enemy.maxsp.to_s, 2)
self.contents.draw_text(292, 224-30, 64, 32, (enemy.str*8/10).to_s, 2)
self.contents.draw_text( 48, 256-30, 64, 32, (enemy.dex*8/10).to_s, 2)
self.contents.draw_text(170, 256-30, 64, 32, (enemy.agi*8/10).to_s, 2)
self.contents.draw_text(292, 256-30, 64, 32, (enemy.int*8/10).to_s, 2)
self.contents.draw_text( 48, 288-30, 64, 32, (enemy.atk*8/10).to_s, 2)
self.contents.draw_text(170, 288-30, 64, 32, (enemy.pdef*8/10).to_s, 2)
self.contents.draw_text(292, 288-30, 64, 32, (enemy.mdef*8/10).to_s, 2)
self.contents.draw_text( 0, 384-30, 144, 32, (3*enemy.exp).to_s, 2)
self.contents.draw_text(184, 384-30, 144, 32, enemy.gold.to_s, 2)
# 弱点属性描画
text = ""
KGC::MG_ELEMENT_RANGE.each { |i|
# 有効度が A,B ならば弱点属性追加
if enemy.element_ranks[i] < 3
text += "/" if text != ""
text += $data_system.elements[i]
end
}
self.contents.font.color = KGC::MG_WEEK_COLOR.dup
self.contents.draw_text(104, 320-30, 264, 32, text)
# 耐性属性描画
text = ""
KGC::MG_ELEMENT_RANGE.each { |i|
# 有効度が D,E,F ならば耐性属性追加
if enemy.element_ranks[i] > 3
text += "/" if text != ""
text += $data_system.elements[i]
end
}
self.contents.font.color = KGC::MG_RESIST_COLOR.dup
self.contents.draw_text(104, 352-30, 264, 32, text)
self.contents.font.color = normal_color
item2_id = 0
weapon2_id = 0
armor2_id = 0
if enemy.treasure2 != ""
case enemy.treasure2[0,1]
when "W"
weapon2_id = enemy.treasure2[/[0-9]+/].to_i
when "A"
armor2_id = enemy.treasure2[/[0-9]+/].to_i
when "I"
item2_id = enemy.treasure2[/[0-9]+/].to_i
end
end
no_rareitem = 0
if item2_id > 0
icon2 = RPG::Cache.icon($data_items[item2_id].icon_name)
text2 = $data_items[item2_id].name
rareitem = 1
elsif weapon2_id > 0
icon2 = RPG::Cache.icon($data_weapons[weapon2_id].icon_name)
text2 = $data_weapons[weapon2_id].name
rareitem = 1
elsif armor2_id > 0
icon2 = RPG::Cache.icon($data_armors[armor2_id].icon_name)
text2 = $data_armors[armor2_id].name
rareitem = 1
else
icon2 = Bitmap.new(24, 24)
text2 = ""
end
if enemy.item_id > 0
icon = RPG::Cache.icon($data_items[enemy.item_id].icon_name)
text = $data_items[enemy.item_id].name
elsif enemy.weapon_id > 0
icon = RPG::Cache.icon($data_weapons[enemy.weapon_id].icon_name)
text = $data_weapons[enemy.weapon_id].name
elsif enemy.armor_id > 0
icon = RPG::Cache.icon($data_armors[enemy.armor_id].icon_name)
text = $data_armors[enemy.armor_id].name
else
icon = Bitmap.new(24, 24)
text = "No Item." if rareitem == 0
end
self.contents.blt(130, 420-30, icon, Rect.new(0, 0, 24, 24))
self.contents.draw_text(155 , 416-30, 204, 32, text)
if rareitem == 1
self.contents.blt(130, 415, icon2, Rect.new(0, 0, 24, 24))
self.contents.draw_text(155 , 412, 204, 32, text2)
self.contents.font.color = text_color(6)
self.contents.draw_text(65 , 412, 204, 32, "(稀有!)")
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_MonsterGuide
#------------------------------------------------------------------------------
# モンスター図鑑画面の処理を行うクラスです。
#==============================================================================
class Scene_MonsterGuide
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# map_call : マップからの呼び出しフラグ
#--------------------------------------------------------------------------
def initialize(map_call = false)
@map_call = map_call
end
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
# スプライトセット作成
@state_com = Sprite.new
@state_com.bitmap = RPG::Cache.title("图鉴.jpg")
@state_com.z = 10
@spriteset = Spriteset_Map.new if !KGC::MG_BACK_TRANSPARENT
# 図鑑ウィンドウを作成
@guide_top_window = Window_MonsterGuideTop.new
@guide_left_window = Window_MonsterGuideLeft.new
@guide_left_window.y += 10
@guide_right_window = Window_MonsterGuideRight.new
@guide_right_window.y += 10
# ステータス表示
@show_status = true
# エネミーオブジェクトを指定
enemy = @guide_left_window.item
# 情報描画
@guide_right_window.refresh(enemy, @show_status)
# トランジション実行
Graphics.transition
# メインループ
loop {
Graphics.update
Input.update
update
if $scene != self
break
end
}
# トランジション準備
Graphics.freeze
# ウィンドウを解放
@spriteset.dispose if !KGC::MG_BACK_TRANSPARENT
@guide_top_window.dispose
@guide_left_window.dispose
@guide_right_window.dispose
@state_com.dispose
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# ウィンドウを更新
@state_com.update
@guide_top_window.update
@guide_left_window.update
@guide_right_window.update
# B ボタンが押された場合
if Input.trigger?(Input::B)
# キャンセル SE を演奏
$game_system.se_play($data_system.cancel_se)
# マップから呼び出された場合
if @map_call
# マップ画面に切り替え
$scene = Scene_Menu.new(4)
else
# メニュー画面に切り替え
if $imported["MenuAlter"]
index = KGC::MA_COMMANDS.index(11)
if index != nil
$scene = Scene_Menu.new(index)
else
$scene = Scene_Menu.new
end
else
$scene = Scene_Menu.new(@menu_index)
end
end
return
end
# A ボタンが押された場合
if Input.trigger?(Input::A)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# ステータス表示を切り替え
@show_status = !@show_status
# 情報更新
update_info
return
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# 決定 SE を演奏
$game_system.se_play($data_system.decision_se)
# 情報更新
update_info
return
end
if KGC::MG_MOVE_REFRESH && @last_index != @guide_left_window.index
# インデックス保存
@last_index = @guide_left_window.index
# 情報更新
update_info
return
end
end
#--------------------------------------------------------------------------
# ● 情報更新
#--------------------------------------------------------------------------
def update_info
# エネミーオブジェクトを指定
enemy = @guide_left_window.item
# 情報描画
@guide_right_window.refresh(enemy, @show_status)
end
end