#◆◇◆◇◆ 魔物図鑑スクリプト ver 1.05 ◇◆◇◆◇ # 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.05(2011/01/11) イベントで倒したエネミーに非対応だったミスを修正 ○ ver 1.04(2009/12/24) 特定のエネミーを除外する機能を追加 ○ ver 1.03(2009/10/03) 隠れ状態のエネミーを記憶しないように変更 エネミーの撃破数カウントを追加 ○ ver 1.02(2009/08/30) SyntaxError等を修正 ○ ver 1.01(2009/08/30) 単体で起動しなかったミスを修正 ○ ver 1.00(2009/08/16) 公開 ■ 説明 遭遇したことのあるエネミーの詳細なデータを閲覧できるようになります。 また、エネミー毎に図鑑画面の背景と流れるBGMも設定できます。 設定はソース内部を参照してください。 魔物図鑑画面に移行するにはスクリプトで Enemy_Status.start と記入してください。 現在の画面を保持したまま、魔物画面に移行できます。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # 魔物図鑑スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["魔物図鑑スクリプト"] = true end # 魔物図鑑スクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["魔物図鑑スクリプト"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズをここで行います。 #============================================================================== class Utility_Enemies # キーガイドの表記タイプ( "ゲームパッド" / "キーボード" ) Guide_Key = "キーボード" # 図鑑に掲載しないエネミーIDの配列 # ここに入力されたIDのエネミーは図鑑に掲載されません # ただし、名前が未設定のエネミーは自動的に除外されます # Delete_Enemy = [10, 20, 30] Delete_Enemy = [3] #-------------------------------------------------------------------------- # ● 戦闘BGMの再生 #-------------------------------------------------------------------------- def call_battle_bgm # エネミーのIDに応じて分岐 case @enemy.id # エネミーID 1 when 1 # 通常の戦闘曲を演奏 $game_system.bgm_play($game_system.battle_bgm) # エネミーID 2〜3 when 2..3 # 戦闘曲を直接演奏 Audio.bgm_play("Audio/BGM/002-Battle02", 100, 100) # それ以外の敵の場合 else # 通常の戦闘曲を演奏 $game_system.bgm_play($game_system.battle_bgm) end end #-------------------------------------------------------------------------- # ● 戦闘背景の取得 #-------------------------------------------------------------------------- def get_battleback # エネミーのIDに応じて分岐 case @enemy.id # エネミーID 1 when 1 name = "003-Forest01" # エネミーID 2〜3 when 2..3 name = "047-Mine01" # それ以外の敵の場合 else name = "002-Woods01" end # 戦闘背景を返す return RPG::Cache.battleback(name) end end #============================================================================== # ■ Bitmap #------------------------------------------------------------------------------ #  画像そのものを扱う組み込みクラスです。 #============================================================================== class Bitmap #-------------------------------------------------------------------------- # ● キーアイコンの描写 # x : 描写先 X 座標 # y : 描写先 Y 座標 # key : 描写キー #-------------------------------------------------------------------------- def draw_key(x, y, key) # キーアイコンを読み込む icon = RPG::Cache.picture("Keys") # キーに応じて分岐 case key when "A" then rect = Rect.new(24 * 0, 24 * 0, 24, 24) when "B" then rect = Rect.new(24 * 1, 24 * 0, 24, 24) when "C" then rect = Rect.new(24 * 2, 24 * 0, 24, 24) when "X" then rect = Rect.new(24 * 0, 24 * 1, 24, 24) when "Y" then rect = Rect.new(24 * 1, 24 * 1, 24, 24) when "Z" then rect = Rect.new(24 * 2, 24 * 1, 24, 24) when "L" then rect = Rect.new(24 * 0, 24 * 2, 24, 24) when "R" then rect = Rect.new(24 * 1, 24 * 2, 24, 24) end # キーボード表記の場合 if Utility_Enemies::Guide_Key == "キーボード" then # 転送座標をずらす rect.x += 24 * 3 end # 描写範囲を消す self.rect_clear(x, y, 24, 24) # アイコンを描写 self.blt(x, y, icon, rect) end #-------------------------------------------------------------------------- # ● 縁文字描写 # x : 文章の X 座標 # y : 文章の Y 座標 # width : 文章の描写範囲(横幅) # height : 文章の描写範囲(高さ) # text : 文章 # align : アラインメント (0..左揃え、1..中央揃え、2..右揃え) #-------------------------------------------------------------------------- def frame_text(x, y, width, height, text, ag = 0) # 元の色を保存 ori_color = font.color.clone # 縁の色を定義 font.color.set(0, 0, 0) # 縁文字を描写 draw_text(x-1, y, width, height, text, ag) draw_text(x+1, y, width, height, text, ag) draw_text(x, y-1, width, height, text, ag) draw_text(x, y+1, width, height, text, ag) # 本体の色を定義 font.color.set(255, 255, 255) # 本体の文字を描写 draw_text(x, y, width, height, text, ag) # 元の色に戻す font.color = ori_color end #-------------------------------------------------------------------------- # ● 指定範囲のクリア #-------------------------------------------------------------------------- def rect_clear(x, y, width, height) # 対象の範囲を消す rect = Rect.new(x, y, width, height) self.fill_rect(rect, Color.new(0, 0, 0, 0)) end end #============================================================================== # ■ Input #------------------------------------------------------------------------------ #  ゲームパッドやキーボードからの入力情報を扱うモジュールです。 # このモジュールは、原則1フレームに1回更新する必要があります。 #============================================================================== module Input #-------------------------------------------------------------------------- # ● 続けて押されているキー判定を取得 # key : キーコード #-------------------------------------------------------------------------- def self.repeat_key?(key) # 強制アクション実行中の場合 if Game_Scene.data != nil and Game_Scene.data.forcing == true # 現在のキー判定を取得 bool = (@repeat == key) # 強制アクション実行中でない場合 else # 現在のキー判定を取得 bool = self.repeat?(key) end # 予約されているキーが同一キーの場合 if bool and (@repeat == key) # 予約キーをクリア @repeat = nil end # 判定の結果を返す return bool end #-------------------------------------------------------------------------- # ● 新たに押されたキー判定を取得 # key : キーコード #-------------------------------------------------------------------------- def self.trigger_key?(key) # 現在のキー判定を取得 bool = self.trigger?(key) # 予約されているキーが同一キーの場合 if bool and (@trigger == key) # 予約キーをクリア @trigger = nil end # 判定の結果を返す return bool end #-------------------------------------------------------------------------- # ● リピートキーコードの変更 # key : キーコード #-------------------------------------------------------------------------- def self.repeat=(key) @repeat = key end #-------------------------------------------------------------------------- # ● キーコードの変更 # key : キーコード #-------------------------------------------------------------------------- def self.trigger=(key) @trigger = key end end #============================================================================== # ■ Numeric #------------------------------------------------------------------------------ #  数値全般を扱う組み込みクラスです。 #============================================================================== class Numeric #-------------------------------------------------------------------------- # ● 最大値の設定 # max : 求められた最大の数値 #-------------------------------------------------------------------------- def to_max(min, max) if self > max return max elsif self < min return min else return self end end #-------------------------------------------------------------------------- # ● 最大値の設定 # max : 求められた最大の数値 #-------------------------------------------------------------------------- def to_m(max) if self > max return max else return self end end #-------------------------------------------------------------------------- # ● 最小値の設定 # min : 求められた最小の数値 #-------------------------------------------------------------------------- def to_min(min) if self < min return min else return self end end #-------------------------------------------------------------------------- # ● 求めた数値に対するパーセンテージを返す # order : 求められた数値 #-------------------------------------------------------------------------- def rate(order) return 100 if order == 0 return (self * 100) / order end end #============================================================================== # ■ Sprite_BattlerStatus #------------------------------------------------------------------------------ #  エネミーを扱うモジュールです。 # このモジュールは Sprite_Battler クラスに継承されます。 #============================================================================== module Sprite_BattlerStatus #-------------------------------------------------------------------------- # ● コラプスの処理 #-------------------------------------------------------------------------- def collapse # スーパークラスの処理へ移行 super # 有効なエネミーでない場合 unless @battler.is_a?(Game_Enemy) then # メソッドを返す return end # エネミーを記憶 $game_system.enemies_flag[@battler.id] = true # 撃破数を初期化 $game_system.enemies_break[@battler.id] ||= 0 # 撃破数を加算 $game_system.enemies_break[@battler.id] += 1 end end #============================================================================== # ☆ SEPass #------------------------------------------------------------------------------ # 指定されたSEを実際のSEに変換して演奏するモジュールです。 #============================================================================== module SEPass #-------------------------------------------------------------------------- # ● SEの演奏 # title : SEタイトル #-------------------------------------------------------------------------- def self.call(title) case title when "決定" $game_system.se_play(Data_System.data.decision_se) when "キャンセル" $game_system.se_play(Data_System.data.cancel_se) when "ブザー" $game_system.se_play(Data_System.data.buzzer_se) end end end #============================================================================== # ■ Enemy_Status #------------------------------------------------------------------------------ #  図鑑画面の処理を行うモジュールです。 #============================================================================== module Enemy_Status #-------------------------------------------------------------------------- # ● リストの取得 #-------------------------------------------------------------------------- def self.list_window return @list_window end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def self.start @self_active = true # トランジション準備 Graphics.freeze # バックスプライトを作成 @back_sprite = Sprite.new @back_sprite.bitmap = Bitmap.new(640, 480) @back_sprite.bitmap.fill_rect(0, 0, 640, 480, Color.new(0, 0, 0, 160)) # ヘルプウィンドウを作成 @help_window = Window_Multi_Help.new(16, 16, 608, 54) # リストウィンドウを作成 @list_window = Window_Enemies_List.new # 完成度表示 @help_window.set_enemies_conp # トランジション実行 Graphics.transition(20) # メインループ self.main_loop # ウィンドウを解放 @list_window.dispose @help_window.dispose @back_sprite.bitmap.dispose @back_sprite.dispose # トランジション実行 Graphics.transition(20) # 極端な処理落ちを防止する Graphics.frame_reset end #-------------------------------------------------------------------------- # ● メインループ #-------------------------------------------------------------------------- def self.main_loop # 極端な処理落ちを防止する Graphics.frame_reset # 画面が切り替わるまで繰り返す while @self_active == true # 基本情報を更新 self.update_graphic # フレーム更新 self.update end # 基本情報を更新 self.update_graphic # トランジション準備 Graphics.freeze end #-------------------------------------------------------------------------- # ● フレーム更新(基本画面) #-------------------------------------------------------------------------- def self.update_graphic # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def self.update # リストウィンドウを更新 @list_window.update # B ボタンが押された場合 if Input.trigger_key?(12) # SEを演奏 SEPass.call("キャンセル") # 画面を戻す @self_active = false return end # C ボタンが押された場合 if Input.trigger_key?(13) if @list_window.enemy.name == "????" # SEを演奏 SEPass.call("ブザー") return end # SEを演奏 SEPass.call("決定") # トランジション準備 Graphics.freeze # 図鑑本体に切り替え scene = Utility_Enemies.new(@list_window.enemy) # トランジション実行 Graphics.transition(20) return end end end #============================================================================== # ■ Game_System #------------------------------------------------------------------------------ #  システム周りのデータを扱うクラスです。BGM などの管理も行います。このクラス # のインスタンスは $game_system で参照されます。 #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :enemies_flag # エネミー遭遇フラグ attr_accessor :enemies_break # エネミー撃破数 #-------------------------------------------------------------------------- # ● BGM の記憶 #-------------------------------------------------------------------------- def bgm_memorize2 @memorized_bgm2 = @playing_bgm end #-------------------------------------------------------------------------- # ● BGM の復帰 #-------------------------------------------------------------------------- def bgm_restore2 bgm_play(@memorized_bgm2) end end #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :enemies_conp # 図鑑完成度 end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● エネミー 取得 #-------------------------------------------------------------------------- def enemy return Data_Enemies.data[@enemy_id] end end #============================================================================== # ■ Game_DummyEnemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_DummyEnemy < Game_Enemy #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :name # 名前 #-------------------------------------------------------------------------- # ● オブジェクト初期化 # id : エネミーのID #-------------------------------------------------------------------------- def initialize(id) super(1, 0) @enemy_id = id enemy = $data_enemies[@enemy_id] @battler_name = enemy.battler_name @battler_hue = enemy.battler_hue @hp = maxhp @sp = maxsp @hidden = false @immortal = false @name = enemy.name @element_ranks = enemy.element_ranks @state_ranks = enemy.state_ranks end #-------------------------------------------------------------------------- # ● 落とすアイテム画像の取得 #-------------------------------------------------------------------------- def item if enemy.item_id > 0 item = Data_Items.data[enemy.item_id] bitmap = RPG::Cache.icon(item.icon_name) elsif enemy.weapon_id > 0 item = Data_Weapons.data[enemy.weapon_id] bitmap = RPG::Cache.icon(item.icon_name) elsif enemy.armor_id > 0 item = Data_Armors.data[enemy.armor_id] bitmap = RPG::Cache.icon(item.icon_name) else bitmap = Bitmap.new(32, 32) end return bitmap end #-------------------------------------------------------------------------- # ● 落とすアイテムの取得 #-------------------------------------------------------------------------- def item_name if enemy.item_id > 0 name = Data_Items.data[enemy.item_id].name elsif enemy.weapon_id > 0 name = Data_Weapons.data[enemy.weapon_id].name elsif enemy.armor_id > 0 name = Data_Armors.data[enemy.armor_id].name else name = "なし" end return name end #-------------------------------------------------------------------------- # ● 耐性属性文字列の取得 #-------------------------------------------------------------------------- def guard_elements text = [] for i in 1...Data_System.data.elements.size do rate = @element_ranks[i] if rate >= 4 text << Data_System.data.elements[i] end end if text == [] text << "なし" end return text end #-------------------------------------------------------------------------- # ● 弱点属性文字列の取得 #-------------------------------------------------------------------------- def weak_elements text = [] for i in 1...Data_System.data.elements.size do rate = @element_ranks[i] if rate == 1 or rate == 2 text << Data_System.data.elements[i] end end if text == [] text << "なし" end return text end #-------------------------------------------------------------------------- # ● ステート防御判定 # state_id : ステート ID #-------------------------------------------------------------------------- def state_guard?(state_id) return if state_id == nil # 絶対に効かない場合 if self.state_ranks[state_id] == 6 return true else return false end end #-------------------------------------------------------------------------- # ● 無効ステートの取得 #-------------------------------------------------------------------------- def guard_state state = [] for i in 1...Data_States.data.size do if @state_ranks[i] == 6 || state_guard?(i) state.push(Data_States.data[i]) end end return state end end #============================================================================== # ■ Sprite_DummyEnemy #------------------------------------------------------------------------------ #  エネミー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_DummyEnemy < RPG::Sprite #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :battler # バトラー #-------------------------------------------------------------------------- # ● オブジェクト初期化 # viewport : ビューポート # battler : バトラー (Game_Battler) #-------------------------------------------------------------------------- def initialize(viewport, battler = nil) super(viewport) @y_plus = 0 @battler = battler @plus = 1 @zoom_turn = 0.0015 @zoom_count = rand(16) @zoom_puls = 1.0 @shadow_y = 0.35 @_animation_duration = 0 # バトラーの更新 battler_update end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose if self.bitmap != nil self.bitmap.dispose self.bitmap = nil end super end #-------------------------------------------------------------------------- # ● バトラーの更新 #-------------------------------------------------------------------------- def battler_update # ファイル名か色相が現在のものと異なる場合 if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue # ビットマップを取得、設定 @battler_name = @battler.battler_name @battler_hue = @battler.battler_hue self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue) @width = bitmap.width @height = bitmap.height self.ox = @width / 2 self.oy = @height self.x = ((640 - @width) / 2) + self.ox self.y = (320 - @height) end end #-------------------------------------------------------------------------- # ● 基本Y座標の取得 #-------------------------------------------------------------------------- def base_y if @height >= 320 return ((320 - @height) + @height) else return ((288 - @height) + @height) end end #-------------------------------------------------------------------------- # ● フレーム更新(Y座標) #-------------------------------------------------------------------------- def update_y # 各情報を更新する self.y = base_y @zoom_count += 1 if @zoom_count == 16 @zoom_count = 0 @zoom_turn *= -1 end @zoom_puls -= @zoom_turn self.zoom_y = (100 * @zoom_puls) / 100 end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # バトラーの更新 battler_update update_y end end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● システムインクルード #-------------------------------------------------------------------------- include(Sprite_BattlerStatus) # ステータスモジュール end #============================================================================== # ■ Window_Multi_Help #------------------------------------------------------------------------------ #  様々な画面で、解説を表示するウィンドウです。 #============================================================================== class Window_Multi_Help < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y, width, height, h = 32) super(x, y, width, height) self.contents = Bitmap.new(width - 32, height - 32) self.z = 0xffff self.visible = true @base_height = h end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(text = "") end #-------------------------------------------------------------------------- # ● 完成度表示 #-------------------------------------------------------------------------- def set_enemies_conp self.contents.font.color = normal_color self.contents.draw_text(4, 0, 128, 24, "魔物図鑑") self.contents.font.color = system_color self.contents.draw_text(272, 0, 128, 24, "完成度") self.contents.draw_text(352, 0, 64, 24, $game_temp.enemies_conp.to_s) self.contents.draw_text(388, 0, 64, 24, "%") end end #============================================================================== # ■ Window_Enemies_List #------------------------------------------------------------------------------ #  図鑑画面で、敵の一覧を表示するウィンドウです。 #============================================================================== class Window_Enemies_List < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :scroll # スクロールバー attr_accessor :last_index # 最終インデックス #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(16, 70, 608, 392) @column_max = 2 refresh self.index = 0 @last_index = 0 end #-------------------------------------------------------------------------- # ● データの取得 #-------------------------------------------------------------------------- def data return @data end #-------------------------------------------------------------------------- # ● エネミーの取得 #-------------------------------------------------------------------------- def enemy return @data[self.index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] clear = 0 # ループ処理 for i in 1...$data_enemies.size do # エネミーを取得 enemy = Game_DummyEnemy.new(i) # 名前が設定されていないエネミーの場合 if enemy.name == "" or Utility_Enemies::Delete_Enemy.include?(i) then # 次のエネミーへ next end # エネミーの遭遇フラグハッシュを初期化 $game_system.enemies_flag ||= {} # 遭遇済みのエネミーの場合 if $game_system.enemies_flag[enemy.id] == true then # エネミーのデータをプッシュ @data.push(enemy) clear += 1 # 未遭遇のエネミーの場合 else # ダミーデータをプッシュ enemy.name = "????" @data.push(enemy) end end # 項目数を更新 @item_max = @data.size $game_temp.enemies_conp = clear.rate(@item_max) # 項目数に応じたビットマップを作成 self.contents = Bitmap.new(width - 32, row_max * 24) for i in 0...@item_max x = @column_max + i % @column_max * 272 y = (i / @column_max * 24) self.contents.font.color = normal_color draw_item(i, (i == 0)) end end #-------------------------------------------------------------------------- # ● 項目の描写 # index : 項目のインデックス # active : アクティブフラグ #-------------------------------------------------------------------------- def draw_item(index, active) x = @column_max + index % @column_max * 272 y = (index / @column_max * 24) # 描写範囲をクリア self.contents.rect_clear(x + 48, y, 220, 24) # 描写色を設定 if active if @data[index].name != "????" self.contents.font.color = system_color else self.contents.font.color = Color.new(255, 160, 0) end else if @data[index].name != "????" self.contents.font.color = normal_color else self.contents.font.color = disabled_color end end # エネミーを取得 enemy = @data[index] self.contents.draw_text(x, y, 272, 24, enemy.name.to_s, 1) end #-------------------------------------------------------------------------- # ● 先頭の行の取得 #-------------------------------------------------------------------------- def top_row # ウィンドウ内容の転送元 Y 座標を、1 行の高さ 32 で割る return self.oy / 24 end #-------------------------------------------------------------------------- # ● 先頭の行の設定 # row : 先頭に表示する行 #-------------------------------------------------------------------------- def top_row=(row) # row が 0 未満の場合は 0 に修正 if row < 0 row = 0 end # row が row_max - 1 超の場合は row_max - 1 に修正 if row > row_max - 1 row = row_max - 1 end # row に 1 行の高さ 24 を掛け、ウィンドウ内容の転送元 Y 座標とする self.oy = row * 24 end #-------------------------------------------------------------------------- # ● 1 ページに表示できる行数の取得 #-------------------------------------------------------------------------- def page_row_max # ウィンドウの高さから、フレームの高さ 32 を引き、1 行の高さ 24 で割る return (self.height - 32) / 24 end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # ウィンドウがアクティブでない場合 if !self.active self.cursor_rect.empty return end # カーソル位置が 0 未満の場合 if @index < 0 self.cursor_rect.empty return end # 現在の行を取得 row = @index / @column_max # 現在の行が、表示されている先頭の行より前の場合 if row < self.top_row # 現在の行が先頭になるようにスクロール self.top_row = row end # 現在の行が、表示されている最後尾の行より後ろの場合 if row > self.top_row + ((self.page_row_max) - 1) # 現在の行が最後尾になるようにスクロール self.top_row = row - ((self.page_row_max) - 1) end cursor_width = 272 # カーソルの座標を計算 x = @column_max + @index % @column_max * 272 y = (@index / @column_max * 24 - self.oy) # カーソルの矩形を更新 self.cursor_rect.set(x, y, cursor_width + 4, 24) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # 項目が変更された場合 if @last_index != self.index draw_item(@last_index, false) draw_item(self.index, true) @last_index = self.index end end end #============================================================================== # ■ Window_EnemyStatus #------------------------------------------------------------------------------ #  図鑑画面で敵の能力を表示するウィンドウです。 #============================================================================== class Window_EnemyStatus < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(16, 312, 608, 152) self.contents = Bitmap.new(width - 32, height - 32) self.z = 9999 self.opacity = 255 end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose super end #-------------------------------------------------------------------------- # ● リフレッシュ # enemy : エネミー # mode : 描写モード #-------------------------------------------------------------------------- def refresh(enemy, mode) @enemy = enemy self.contents.clear self.contents.draw_key(4, 96, "A") # 用語の描写 draw_word(mode) # ステータスの描写 draw_status(mode) end #-------------------------------------------------------------------------- # ● 用語の描写 # mode : 描写モード #-------------------------------------------------------------------------- def draw_word(mode) bitmap = self.contents self.contents.font.color = system_color case mode when 0 bitmap.draw_text((115 * 0), (24 * 1), 32, 24, $data_system.words.hp) bitmap.draw_text((115 * 0), (24 * 2), 32, 24, $data_system.words.sp) bitmap.draw_text((115 * 1), (24 * 0), 32, 24, "EXP") bitmap.draw_text((115 * 2), (24 * 0), 32, 24, $data_system.words.gold) bitmap.draw_text((115 * 1), (24 * 1), 64, 24, $data_system.words.atk) bitmap.draw_text((115 * 1), (24 * 2), 64, 24, $data_system.words.pdef) bitmap.draw_text((115 * 1), (24 * 3), 64, 24, $data_system.words.mdef) bitmap.draw_text((115 * 2), (24 * 1), 64, 24, $data_system.words.str) bitmap.draw_text((115 * 2), (24 * 2), 64, 24, $data_system.words.dex) bitmap.draw_text((115 * 2), (24 * 3), 64, 24, $data_system.words.agi) bitmap.draw_text((115 * 2), (24 * 4), 64, 24, $data_system.words.int) bitmap.draw_text((115 * 3), (24 * 1), 128, 24, "所持アイテム") bitmap.draw_text((115 * 3), (24 * 0), 128, 24, "撃破数") when 1 bitmap.draw_text((115 * 1), (24 * 0), 32, 24, "EXP") bitmap.draw_text((115 * 2), (24 * 0), 32, 24, $data_system.words.gold) bitmap.draw_text((115 * 3), (24 * 0), 128, 24, "撃破数") bitmap.draw_text(4 + (115 * 0), (24 * 1), 128, 24, "耐性属性") bitmap.draw_text(4 + (115 * 0), (24 * 2), 128, 24, "弱点属性") bitmap.draw_text(4 + (115 * 0), (24 * 3), 128, 24, "無効") when 2 bitmap.draw_text((115 * 1), (24 * 0), 32, 24, "EXP") bitmap.draw_text((115 * 2), (24 * 0), 32, 24, $data_system.words.gold) end end #-------------------------------------------------------------------------- # ● ステータスの描写 # mode : 描写モード #-------------------------------------------------------------------------- def draw_status(mode) right = 96 bitmap = self.contents self.contents.font.color = normal_color self.contents.draw_text(0, 0, 116, 24, @enemy.name, 0) self.contents.draw_text(20, (24 * 4), 100, 24, "切り替え", 2) case mode when 0 # 撃破数を取得 e_break = [$game_system.enemies_break[@enemy.id].to_i, 9999].min bitmap.draw_text(4 + (115 * 0), (24 * 1), 96, 24, @enemy.maxhp.to_s, 2) bitmap.draw_text(4 + (115 * 0), (24 * 2), 96, 24, @enemy.maxsp.to_s, 2) bitmap.draw_text(36 + (115 * 1), (24 * 0), 64, 24, @enemy.exp.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 0), 96, 24, @enemy.gold.to_s, 2) bitmap.draw_text(4 + (115 * 1), (24 * 1), 96, 24, @enemy.atk.to_s, 2) bitmap.draw_text(4 + (115 * 1), (24 * 2), 96, 24, @enemy.pdef.to_s, 2) bitmap.draw_text(4 + (115 * 1), (24 * 3), 96, 24, @enemy.mdef.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 1), 96, 24, @enemy.str.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 2), 96, 24, @enemy.dex.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 3), 96, 24, @enemy.agi.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 4), 96, 24, @enemy.int.to_s, 2) bitmap.blt(4 + (115 * 3), (24 * 2), @enemy.item, @enemy.item.rect) bitmap.draw_text(32 + (115 * 3), (24 * 2), 96, 24, @enemy.item_name) bitmap.draw_text(4 + (115 * 4), (24 * 0), 96, 24, e_break.to_s) when 1 # 撃破数を取得 e_break = [$game_system.enemies_break[@enemy.id].to_i, 9999].min bitmap.draw_text(36 + (115 * 1), (24 * 0), 64, 24, @enemy.exp.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 0), 96, 24, @enemy.gold.to_s, 2) bitmap.draw_text(4 + (115 * 4), (24 * 0), 96, 24, e_break.to_s) for i in 0...@enemy.guard_elements.size text = @enemy.guard_elements[i] bitmap.draw_text(119 + (48 * i), (24 * 1), 48, 24, text, 1) end for i in 0...@enemy.weak_elements.size text = @enemy.weak_elements[i] bitmap.draw_text(119 + (48 * i), (24 * 2), 48, 24, text, 1) end if @enemy.guard_state.size == 0 bitmap.draw_text(119, (24 * 3), 48, 24, "なし", 1) else for i in 0...@enemy.guard_state.size text = @enemy.guard_state[i].name bitmap.draw_text(119 + (48 * i), (24 * 3), 48, 24, text, 1) end end when 2 bitmap.draw_text(36 + (115 * 1), (24 * 0), 64, 24, @enemy.exp.to_s, 2) bitmap.draw_text(4 + (115 * 2), (24 * 0), 96, 24, @enemy.gold.to_s, 2) end end end #============================================================================== # ■ Utility_Enemies #------------------------------------------------------------------------------ #  魔物図鑑画面の処理を行うクラスです。 #============================================================================== class Utility_Enemies #-------------------------------------------------------------------------- # ● オブジェクト初期化 # enemy : エネミー #-------------------------------------------------------------------------- def initialize(enemy) # エネミーを取得 @enemy = enemy # 描写モードを設定 @mode_index = 0 # ビューポートを作成 @viewport = Viewport.new(16, 16, 608, 296) @viewport.z = 99999 # スプライトを作成 @sprite = Sprite.new(@viewport) @sprite.bitmap = Bitmap.new(608, 296) # バックスプライトを作成 @back_sprite = Sprite.new(@viewport) @back_sprite.z = -1 @back_sprite.bitmap = get_battleback # エネミースプライトを作成 @enemy_sprite = Sprite_DummyEnemy.new(@viewport, enemy) @enemy_sprite.update # ステータスウィンドウを作成 @status_window = Window_EnemyStatus.new @status_window.refresh(@enemy, @mode_index) # アイコンを描写 draw_icon main(enemy) end #-------------------------------------------------------------------------- # ● メイン処理 # enemy : エネミー #-------------------------------------------------------------------------- def main(enemy) # BGMを記憶 $game_system.bgm_memorize2 # 戦闘BGMを再生 call_battle_bgm # トランジション実行 Graphics.transition(20) # 極端な処理落ちを防止する Graphics.frame_reset # メインループ main_loop # トランジション準備 Graphics.freeze # BGMを戻す $game_system.bgm_restore2 # 解放 dispose end #-------------------------------------------------------------------------- # ● メインループ #-------------------------------------------------------------------------- def main_loop # トランジション実行 Graphics.transition(20) # 更新フラグをオン @self_active = true # メインループ処理(更新フラグがオンな限り繰り返す) while @self_active == true do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @sprite.bitmap.dispose @sprite.bitmap = nil @sprite.dispose @sprite = nil @status_window.dispose @back_sprite.bitmap.dispose @back_sprite.bitmap = nil @back_sprite.dispose @back_sprite = nil @enemy_sprite.dispose @enemy_sprite = nil @viewport.dispose @viewport = nil end #-------------------------------------------------------------------------- # ● アイコンの描写 #-------------------------------------------------------------------------- def draw_icon @sprite.bitmap.draw_key(8, 264, "L") @sprite.bitmap.draw_key(576, 264, "R") end #-------------------------------------------------------------------------- # ● 表示データの更新 # enemy : エネミー #-------------------------------------------------------------------------- def update_graphic(enemy) @enemy = enemy @back_sprite.bitmap.dispose @back_sprite.bitmap = nil @back_sprite.bitmap = get_battleback @enemy_sprite.battler = enemy @status_window.refresh(@enemy, @mode_index) # 戦闘BGMを再生 call_battle_bgm end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update @enemy_sprite.update # A ボタンが押された場合 if Input.trigger_key?(11) # SEを演奏 SEPass.call("決定") # 描写モードを設定 @mode_index += 1 if @mode_index >= 2 @mode_index = 0 end # ステータスを切り替え @status_window.refresh(@enemy, @mode_index) return end # B ボタンが押された場合 if Input.trigger_key?(12) # SEを演奏 SEPass.call("キャンセル") # 選択画面に戻る @self_active = false return end # L ボタンが押された場合 if Input.trigger_key?(17) or Input.trigger_key?(8) # 最大項目数を取得 size = Enemy_Status.list_window.data.size # ループ処理 loop do # リストインデックスを取得 index = Enemy_Status.list_window.index # インデックスを戻す if Enemy_Status.list_window.index >= 1 Enemy_Status.list_window.index -= 1 else Enemy_Status.list_window.index = size - 1 end # 有効なデータの場合 if Enemy_Status.list_window.enemy.name != "????" # ループから抜ける break end end # 表示データを更新 update_graphic(Enemy_Status.list_window.enemy) return end # R ボタンが押された場合 if Input.trigger_key?(18) or Input.trigger_key?(2) # 最大項目数を取得 size = Enemy_Status.list_window.data.size - 1 # ループ処理 loop do # インデックスを足す if Enemy_Status.list_window.index < size Enemy_Status.list_window.index += 1 else Enemy_Status.list_window.index = 0 end # 有効なデータの場合 if Enemy_Status.list_window.enemy.name != "????" # ループから抜ける break end end # 表示データを更新 update_graphic(Enemy_Status.list_window.enemy) return end end end #============================================================================== # ■ Scene_Battle (分割定義 1) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias :main_minto_RGSS_125 :main def main # ハッシュデータが無効なら初期化 $game_system.enemies_flag ||= {} $game_system.enemies_break ||= {} # 元の処理を実行 main_minto_RGSS_125 # トループを取得 troop = $data_troops[@troop_id] # ループ処理 for i in 0...troop.members.size do # 隠れフラグを取得 hidden = troop.members[i].hidden # 隠れ状態でない場合 unless hidden then # エネミーを記憶 $game_system.enemies_flag[troop.members[i].enemy_id] = true end end end end end