#=========================================================================== # # ■敵データ表示機能v2.0(RPG探検隊サイドビュー併用版) # # FF等のライブラみたいな機能です # # こちらはRPG探検隊さんのサイドビューとの併用版になります # サイドビューの仕様上Scene_Battleクラスのselect_memberのみ # 再定義してあります # サイドビュースクリプトよりも下に配置してください # # カスタマイズ項目の説明をよく読んで設定してください # # ・カスタマイズ内の ANARAIZ_EQUIP = [] 等の括弧内は # 任意の数値を(例)[1, 23, 30]のようにカンマで区切って記入してください # # ・v2.0での追加項目 # USE_ANARAIZ_KEY # ターゲットエネミー選択中、任意のボタンを # 押してる間だけ敵データを表示させます # ANARAIZ_SKILL ANARAIZ_ITEM # 所持スキルや所持アイテムを条件にして敵データ表示の有無を設定できます # ADJUST_X ADJUST_Y # 敵データ表示ウィンドウのX座標とY座標を微調整できます # ADJUST_ENEMY # エネミーID個別でウィンドウのX,Y座標を調整できます # #=========================================================================== #============================================================================== # ■ カスタマイズ開始 #============================================================================== module BBL_ENEMY_WEAK # ウィンドウに表示する属性IDです ELEMENT_SET = [ 1, 2, 3, 4, 9, 10, 11, 12 ] # ウィンドウに表示する属性名です # ※データベース側と同じ名称を記入してください # ※ELEMENT_SETと同じ順序で記入してください ELEMENT_NAME = ["格闘", "斬撃", "刺突", "打撃", "炎", "冷気", "雷", "水"] # 弱点、耐性のランクです # "未使用"の部分は編集しないでください ELEMENT_RANKS = ["未使用", "◎", "○", "未使用", "△", "×", "吸"] # ELEMENT_RANKS = ["未使用", "200%", "150%", "未使用", "50%", "0%", "-100%"] # ELEMENT_RANKSを表示する際の文字カラーです # (RED, BLUE, GREEN) ELEMENT_COLOR = ["未使用", Color.new(255, 128, 128), # 200% Color.new(255, 255, 128), # 150% "未使用", # 100% Color.new(128, 255, 128), # 50% Color.new(128, 128, 255), # 0% Color.new(255, 128, 255)] # -100% # ウィンドウに表示する用語です WEAKPOINT_WORD = ["弱点", "耐性", "状態"] # trueにした場合、ターゲットエネミーの選択中 # 任意のボタンが押されてる間だけ敵データを表示します USE_ANARAIZ_KEY = false # USE_ANARAIZ_KEYをtrueにした場合は、ボタンを指定してください # ※Input::の後にボタン名を記入(A,B,C,X,Y,Z,L,R等) ANARAIZ_KEY = Input::L # 任意のスキルやアイテムを敵に使用すると敵のデータが見れるようになります # 一度でもスキル(アイテム)を使用してデータを表示させた敵は # アナライズリストに登録され、以後はスキル(アイテム)を使用しなくても表示されます # true : スキル(アイテム)を使用するまでデータは見えません # false: 最初から敵データが見えます # ※trueにした場合は、任意のスキル(アイテム)の # メモ欄に アナライズ と記入してください ANARAIZ_ENEMY = false # ANARAIZ_ENEMYをtrueにした場合は # パーティメンバーの状態を条件にして敵データ表示の有無を設定できます # ANARAIZ_EQUIP:任意の防具を装備していることが条件 # ANARAIZ_STATE:任意のステートになっていることが条件 # ANARAIZ_SKILL:任意のスキルを所持していることが条件 # ANARAIZ_ITEM :任意のアイテムを所持していることが条件 ANARAIZ_EQUIP = [] # アナライズ可能な防具IDの配列 ANARAIZ_STATE = [] # アナライズ可能なステートIDの配列 ANARAIZ_SKILL = [] # アナライズ可能なスキルIDの配列 ANARAIZ_ITEM = [] # アナライズ可能なアイテムIDの配列 # ウィンドウ内のフォントサイズです FONT_SIZE = 16 # ウィンドウの横幅です # ※縦幅はFONT_SIZEで自動的に変更されます WINDOW_WIDTH = 192 # ウィンドウの透明有無です WINDOW_OPACITY = true # WINDOW_OPACITYをtrueにした場合は背景色を設定できます BACK_COLOR = Color.new(0, 0, 0, 128) # 敵データウィンドウのX座標を微調整できます ADJUST_X = 0 # 敵データウィンドウのY座標を微調整できます ADJUST_Y = 0 # エネミーID個別でウィンドウのX,Y座標を調整できます # ※[[エネミーID, X座標, Y座標],[エネミーID, X座標, Y座標]...] # 例) ADJUST_ENEMY = [[1, 0,-50], #ID1番のエネミーのY座標を-50に微調整 # [5,-10, 20]] #ID5番のエネミーのX座標を-10、Y座標を+20に微調整 ADJUST_ENEMY = [] #-------------------------------------------------------------------------- # ウィンドウに表示する内容です # 表示させたくない内容は false にしてください SHOW_ENEMY_NAME = true # エネミーの名称 SHOW_ENEMY_HP = true # エネミーのHP表示有無 HP_GAUGE_WIDTH = 120 # HPゲージの横幅 ENEMY_HP = [] # 表示させないエネミーのID配列 SHOW_ENEMY_ELEMENT = true # 属性耐性表示有無 ENEMY_ELEMENT = [] # 表示させないエネミーのID配列 NONE_ELEMENT_NAME = "None" # 耐性がC(100%)のみだった場合に表示させる用語 SHOW_ENEMY_STATE = true # エネミーのステート表示有無 STATE_MODE = 1 # ステート表示方法 0:テキスト 1:アイコン ENEMY_STATE = [] # ステートを表示させないエネミーのID配列 NONE_STATE = [] # 表示させないステートIDの配列 #============================================================================== # ■ カスタマイズ終了 #============================================================================== end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク # ラスのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :anaraiz_list # アナライズ済みエネミーIDの配列 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_BBL initialize def initialize initialize_BBL @anaraiz_list = [] end end #============================================================================== # ■ Window_EnemyInfo #============================================================================== class Window_EnemyInfo < Window_Base FONT_SIZE = BBL_ENEMY_WEAK::FONT_SIZE SH = 0 SH += FONT_SIZE * 4 if BBL_ENEMY_WEAK::SHOW_ENEMY_ELEMENT SH += FONT_SIZE + 4 if BBL_ENEMY_WEAK::SHOW_ENEMY_NAME SH += 36 if BBL_ENEMY_WEAK::SHOW_ENEMY_HP SH += 36 if BBL_ENEMY_WEAK::SHOW_ENEMY_STATE HEIGHT = 32 + SH WIDTH = BBL_ENEMY_WEAK::WINDOW_WIDTH #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, WIDTH, HEIGHT) self.opacity = 0 if BBL_ENEMY_WEAK::WINDOW_OPACITY end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(x, y, enemy) self.contents.clear adjust_enemy = BBL_ENEMY_WEAK::ADJUST_ENEMY adjust_x = 0 adjust_y = 0 unless adjust_enemy.empty? for i in 0...adjust_enemy.size if adjust_enemy[i][0] == enemy.enemy_id adjust_x = adjust_enemy[i][1] adjust_y = adjust_enemy[i][2] break end end end self.x = x + adjust_x self.y = y + adjust_y draw_weakpoint(enemy) end #-------------------------------------------------------------------------- # ● エネミーの情報描画 #-------------------------------------------------------------------------- def draw_weakpoint(enemy) enemy_element_skip = false for enemy_id in BBL_ENEMY_WEAK::ENEMY_ELEMENT enemy_element_skip = true if enemy_id == enemy.enemy_id end enemy_state_skip = false for enemy_id in BBL_ENEMY_WEAK::ENEMY_STATE enemy_state_skip = true if enemy_id == enemy.enemy_id end color = BBL_ENEMY_WEAK::BACK_COLOR mode = BBL_ENEMY_WEAK::STATE_MODE self.contents.font.size = FONT_SIZE self.contents.fill_rect(0, 0, 192, HEIGHT, color) if BBL_ENEMY_WEAK::WINDOW_OPACITY enemy_name_width = self.contents.text_size(enemy.name).width element_list = [] element_ranks = $data_enemies[enemy.enemy_id].element_ranks element_name = BBL_ENEMY_WEAK::ELEMENT_NAME for i in 0...element_name.size element_id = element_name[i] element = nil for s in 0...$data_system.elements.size if $data_system.elements[s] == element_id element_list.push(element_ranks[s]) end end end index = 0 n = 0 sx1 = 0 sx2 = 0 sy = 8 self.contents.font.color = normal_color if BBL_ENEMY_WEAK::SHOW_ENEMY_NAME self.contents.draw_text(8, sy, enemy_name_width, FONT_SIZE, enemy.name) sy += FONT_SIZE + 4 end if BBL_ENEMY_WEAK::SHOW_ENEMY_HP draw_actor_hp(enemy, 16, sy, BBL_ENEMY_WEAK::HP_GAUGE_WIDTH) sy += 36 end word = BBL_ENEMY_WEAK::WEAKPOINT_WORD word_width = self.contents.text_size(word.max).width + 8 if BBL_ENEMY_WEAK::SHOW_ENEMY_ELEMENT self.contents.font.color = system_color self.contents.draw_text(8, sy, word_width, FONT_SIZE, word[0]) self.contents.draw_text(8, FONT_SIZE * 2 + sy, word_width, FONT_SIZE, word[1]) self.contents.font.color = normal_color if enemy_element_skip self.contents.draw_text(sx1 + word_width + 8, sy, width + 16, FONT_SIZE, "不明") self.contents.draw_text(sx2 + word_width + 8, FONT_SIZE * 2 + sy, width + 16, FONT_SIZE, "不明") sx1 += 1 sx2 += 2 else weak_name = BBL_ENEMY_WEAK::ELEMENT_RANKS for i in element_list if i != 3 self.contents.font.color = normal_color color = BBL_ENEMY_WEAK::ELEMENT_COLOR[i] width = self.contents.text_size(element_name[index]).width if i < 3 self.contents.draw_text(sx1 + word_width, sy, width + 16, FONT_SIZE, element_name[index], 1) self.contents.font.color = color self.contents.draw_text(sx1 + word_width, FONT_SIZE + sy, width + 16, FONT_SIZE, weak_name[i], 1) sx1 += width + 8 else self.contents.draw_text(sx2 + word_width, FONT_SIZE * 2 + sy, width + 16, FONT_SIZE, element_name[index], 1) self.contents.font.color = color self.contents.draw_text(sx2 + word_width, FONT_SIZE * 3 + sy, width + 16, FONT_SIZE, weak_name[i], 1) sx2 += width + 8 end n += 1 end index += 1 end end none_text = BBL_ENEMY_WEAK::NONE_ELEMENT_NAME none_text_width = self.contents.text_size(none_text).width self.contents.font.color = normal_color if sx1 == 0 self.contents.draw_text(word_width + 8, sy, none_text_width + 16, FONT_SIZE, none_text) end if sx2 == 0 self.contents.draw_text(word_width + 8, FONT_SIZE * 2 + sy, none_text_width + 16, FONT_SIZE, none_text) end sy += FONT_SIZE * 4 end if BBL_ENEMY_WEAK::SHOW_ENEMY_STATE self.contents.font.color = system_color self.contents.draw_text(8, sy, word_width, FONT_SIZE, word[2]) if enemy_state_skip self.contents.font.color = normal_color self.contents.draw_text(word_width + 8, sy, word_width, FONT_SIZE, "不明") else draw_actor_state(enemy, word_width + 8, sy, 0) if mode == 0 draw_actor_state(enemy, word_width + 8, sy, 1) if mode == 1 end end end #-------------------------------------------------------------------------- # ● HP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 幅 #-------------------------------------------------------------------------- def draw_actor_hp(actor, x, y, width = 120) self.contents.font.size = BBL_ENEMY_WEAK::FONT_SIZE self.contents.font.color = system_color enemy_hp_skip = false for enemy_id in BBL_ENEMY_WEAK::ENEMY_HP enemy_hp_skip = true if enemy_id == actor.enemy_id end if enemy_hp_skip self.contents.draw_text(x, y, 30, WLH, Vocab::hp) xr = x + width self.contents.font.color = normal_color self.contents.draw_text(xr - 40, y, 40, WLH, "不明", 2) else draw_actor_hp_gauge(actor, x, y, width) self.contents.draw_text(x, y, 30, WLH, Vocab::hp_a) self.contents.font.color = hp_color(actor) xr = x + width if width < 120 self.contents.draw_text(xr - 40, y, 40, WLH, actor.hp, 2) else self.contents.draw_text(xr - 90, y, 40, WLH, actor.hp, 2) self.contents.font.color = normal_color self.contents.draw_text(xr - 50, y, 10, WLH, "/", 2) self.contents.draw_text(xr - 40, y, 40, WLH, actor.maxhp, 2) end end end #-------------------------------------------------------------------------- # ● HP ゲージの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 幅 #-------------------------------------------------------------------------- def draw_actor_hp_gauge(actor, x, y, width = 120) gw = width * actor.hp / actor.maxhp gc1 = hp_gauge_color1 gc2 = hp_gauge_color2 self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color) self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2) end #-------------------------------------------------------------------------- # ● ステートの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_state(actor, x, y, mode, width = BBL_ENEMY_WEAK::WINDOW_WIDTH) count = 0 sx = 0 self.contents.font.color = normal_color font_size = BBL_ENEMY_WEAK::FONT_SIZE for state in actor.states skip_state = false for none_state in BBL_ENEMY_WEAK::NONE_STATE skip_state = true if none_state == state.id end unless skip_state if mode == 0 width = self.contents.text_size(state.name).width self.contents.draw_text(x + sx, y, width + 8, font_size, state.name) sx += width + 8 elsif mode == 1 draw_icon(state.icon_index, x + 24 * count, y) end count += 1 end end end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● ターゲット選択の開始 #-------------------------------------------------------------------------- alias start_target_selection_BBL start_target_selection def start_target_selection(actor = false) @enemy_element_window = Window_EnemyInfo.new @enemy_element_window.visible = false @last_target_enemy_index = 999 start_target_selection_BBL(actor = false) end #-------------------------------------------------------------------------- # ● ターゲット選択の終了 #-------------------------------------------------------------------------- alias end_target_selection_BBL end_target_selection def end_target_selection end_target_selection_BBL @enemy_element_window.dispose end #-------------------------------------------------------------------------- # ● ターゲット選択 再定義 #-------------------------------------------------------------------------- def select_member(actor = false) # 再定義 members = $game_party.members if actor members = $game_troop.members unless actor loop do update_basic @cursor_flame = 0 if @cursor_flame == 30 @cursor.src_rect.set(0, 0, 32, 32) if @cursor_flame == 29 @cursor.src_rect.set(0, 32, 32, 32) if @cursor_flame == 15 point = @spriteset.set_cursor(actor, @index) @cursor.x = point[0] @cursor.y = point[1] @cursor_flame += 1 update_enemy_element unless actor # 敵データ表示追加分 if Input.trigger?(Input::B) Sound.play_cancel end_target_selection break elsif Input.trigger?(Input::C) Sound.play_decision @active_battler.action.target_index = @index end_target_selection end_skill_selection end_item_selection next_actor break end if Input.repeat?(Input::LEFT) if actor cursor_down(members, actor) if $back_attack cursor_up(members, actor) unless $back_attack else cursor_up(members, actor) if $back_attack cursor_down(members, actor) unless $back_attack end end if Input.repeat?(Input::RIGHT) if actor cursor_up(members, actor) if $back_attack cursor_down(members, actor) unless $back_attack else cursor_down(members, actor) if $back_attack cursor_up(members, actor) unless $back_attack end end cursor_up(members, actor) if Input.repeat?(Input::UP) cursor_down(members, actor) if Input.repeat?(Input::DOWN) end end #-------------------------------------------------------------------------- # ● 対象敵キャラ弱点ウィンドウの更新 #-------------------------------------------------------------------------- def update_enemy_element if @index != nil if BBL_ENEMY_WEAK::USE_ANARAIZ_KEY unless Input.press?(BBL_ENEMY_WEAK::ANARAIZ_KEY) return @enemy_element_window.visible = false else @enemy_element_window.visible = true end end if @index != @last_target_enemy_index @enemy_element_window.visible = false enemy = $game_troop.members[@index] if anaraized?(enemy) || equip_anaraiz? height = @spriteset.enemy_height[@index] / 2 enemy = $game_troop.members[@index] x = enemy.screen_x y = enemy.screen_y ox = BBL_ENEMY_WEAK::ADJUST_X oy = BBL_ENEMY_WEAK::ADJUST_Y @enemy_element_window.visible = true @enemy_element_window.refresh(x + ox, y - (height + 64) + oy, enemy) adjust_enemy_info_window end @last_target_enemy_index = @index end end end #-------------------------------------------------------------------------- # ● ウィンドウ位置調整 #-------------------------------------------------------------------------- def adjust_enemy_info_window adjust_x = @enemy_element_window.x + @enemy_element_window.width adjust_under_y = @enemy_element_window.y + @enemy_element_window.height adjust_top_y = @enemy_element_window.y adjust_s = 0 adjust_s = 14 if BBL_ENEMY_WEAK::WINDOW_OPACITY @enemy_element_window.x -= adjust_x - 544 - adjust_s if adjust_x > 544 if adjust_under_y > 288 @enemy_element_window.y -= adjust_under_y - 288 - adjust_s end end #-------------------------------------------------------------------------- # ● アナライズリストに登録済みか判定 #-------------------------------------------------------------------------- def anaraized?(enemy) return true unless BBL_ENEMY_WEAK::ANARAIZ_ENEMY enemy_id = enemy.enemy_id list = $game_party.anaraiz_list return false if list[0] == nil for i in list return true if enemy_id == i end return false end #-------------------------------------------------------------------------- # ● 戦闘行動の実行 : スキル #-------------------------------------------------------------------------- alias execute_action_skill_BBL execute_action_skill def execute_action_skill execute_action_skill_BBL skill = @active_battler.action.skill if skill.note.include?("アナライズ") targets = @active_battler.action.make_targets list = $game_party.anaraiz_list $game_party.anaraiz_list.push(targets[0].enemy_id) if list[0] == nil for i in list if targets[0].enemy_id == i next else $game_party.anaraiz_list.push(targets[0].enemy_id) end end end end #-------------------------------------------------------------------------- # ● 戦闘行動の実行 : アイテム #-------------------------------------------------------------------------- alias execute_action_item_BBL execute_action_item def execute_action_item execute_action_item_BBL item = @active_battler.action.item if item.note.include?("アナライズ") targets = @active_battler.action.make_targets list = $game_party.anaraiz_list $game_party.anaraiz_list.push(targets[0].enemy_id) if list[0] == nil for i in list if targets[0].enemy_id == i next else $game_party.anaraiz_list.push(targets[0].enemy_id) end end end end #-------------------------------------------------------------------------- # ● アナライズ可能判定 #-------------------------------------------------------------------------- def equip_anaraiz? for actor in $game_party.members for i in BBL_ENEMY_WEAK::ANARAIZ_EQUIP return true if actor.armors.include?($data_armors[i]) end for i in BBL_ENEMY_WEAK::ANARAIZ_STATE return true if actor.state?(i) end for i in BBL_ENEMY_WEAK::ANARAIZ_SKILL return true if actor.skills.include?($data_skills[i]) end end for i in BBL_ENEMY_WEAK::ANARAIZ_ITEM return true if $game_party.items.include?($data_items[i]) end return false end end #============================================================================== # ■ Spriteset_Battle #------------------------------------------------------------------------------ #  バトル画面のスプライトをまとめたクラスです。このクラスは Scene_Battle クラ # スの内部で使用されます。 #============================================================================== class Spriteset_Battle #-------------------------------------------------------------------------- # ● バトラー画像の縦幅取得 #-------------------------------------------------------------------------- def enemy_height result = [] for sprite in @enemy_sprites result.push(sprite.height) end result.reverse! return result end end