#============================================================================== # ■ RGSS3 行動結果表示時属性弱点&耐性表示 Ver1.00 by 星潟 #------------------------------------------------------------------------------ # バトルログに行動の結果を表示する際 # 最終ダメージにて弱点や耐性の効果でダメージが増減している場合 # 該当する属性(最大倍率)を表示について表示する機能を追加します。 # このスクリプトではデフォルトの属性計算方式しか # 想定していないのでご了承ください。 # (例えば、複合属性の属性倍率を全て適用したり # 1つのアイテム・スキルで複数のアイテム・スキルの効果を発揮するような # 素材スクリプトを導入したゲームへの使用は想定していません) # # ももまる様のXPスタイルバトルを使用されている場合には # 更にポップアップに属性アイコンを追加する機能も追加できます。 # 追加する場合、このスクリプトをXPスタイルバトルよりも下に配置し # 設定項目内のXPSをtrueにしてください。 #============================================================================== module DisplayElementWeaknessAndResist #空のハッシュを作成 FA = {} FE = {} N = {} E = {} #バトルログに表示するか #trueで表示 falseで非表示 BLog = true #アクターが弱点を突かれた際のフォーマットを指定 #最初の%sに対象者の名前、次の%sに属性名が入る FA[:weakness] = "%sには%s属性の効果が大きい!" #アクターが耐性を持っていた際のフォーマットを指定 #最初の%sに対象者の名前、次の%sに属性名が入る FA[:resist] = "%sには%s属性への耐性がある!" #エネミーが弱点を突かれた際のフォーマットを指定 #最初の%sに対象者の名前、次の%sに属性名が入る FE[:weakness] = "%sには%s属性の効果が大きい!" #エネミーが耐性を持っていた際のフォーマットを指定 #最初の%sに対象者の名前、次の%sに属性名が入る FE[:resist] = "%sには%s属性があまり効いていない……。" #弱点・耐性による表示をダメージ表示前に行うか、後に行うか #trueで前 falseで後 Type1 = false #アクターに対して弱点・耐性による表示を行うか #trueで行う falseで行わない Type2 = true #エネミーに対して弱点・耐性による表示を行うか #trueで行う falseで行わない Type3 = true #このスクリプトにおいて #バトルログに属性名を表示する際に用いる属性ID別の表示専用名称を指定 #ここで指定しない属性はデータベースの属性名を参照する #例. #N[1] = "トテモツヨイ物理" #この場合、属性ID1について表示する場合、データベースの設定名に関わらず #トテモツヨイ物理として表示される N[1] = "物理" #★以下、ももまる様のXPスタイルバトル導入時専用の設定★ #XPスタイルバトルのポップアップにアイコンを表示するか #trueで表示 falseで非表示 XPS = false #X座標補正を指定 X = 0 #Y座標補正を指定 Y = -24 #Z座標補正を指定 Z = 0 #ポップアップ用属性別アイコンインデックスを指定 #例. #E[1] = 143 #この場合、属性ID1の対応アイコンインデックスは143となる E[1] = 143 E[2] = 120 E[3] = 96 E[4] = 97 E[5] = 98 E[6] = 99 E[7] = 100 E[8] = 101 E[9] = 102 E[10] = 103 #属性相性が1.0未満、もしくは1.0を超えている場合のみ #属性アイコンを出すようにするか #trueで1.0未満もしくは1.0を超えている場合のみ falseで常時表示 Type4 = true end class Game_BattlerBase #-------------------------------------------------------------------------- # 属性有効度の取得 #-------------------------------------------------------------------------- alias element_rate_display_element_weakness_and_resist element_rate def element_rate(element_id) r = element_rate_display_element_weakness_and_resist(element_id) if @max_rate_in_element_ids @max_rate_in_element_ids.push([element_id,r]) end r end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ダメージ計算 #-------------------------------------------------------------------------- alias make_damage_value_display_element_weakness_and_resist make_damage_value def make_damage_value(user, item) @result.display_element_weakness_and_resist_item = item make_damage_value_display_element_weakness_and_resist(user, item) end #-------------------------------------------------------------------------- # 属性有効度の取得 #-------------------------------------------------------------------------- alias item_element_rate_display_element_weakness_and_resist item_element_rate def item_element_rate(user, item) f = display_element_weakness_and_resist? @max_rate_in_element_ids = [] if f r = item_element_rate_display_element_weakness_and_resist(user, item) if f if !@max_rate_in_element_ids.empty? a = @max_rate_in_element_ids.max_by {|a| a[1]} @result.max_rate_in_element_id = a[0] @result.max_rate_in_element_rate = a[1] end @max_rate_in_element_ids = nil end r end #-------------------------------------------------------------------------- # 弱点・耐性の表示をするか否か #-------------------------------------------------------------------------- def display_element_weakness_and_resist? if actor? DisplayElementWeaknessAndResist::Type2 else DisplayElementWeaknessAndResist::Type3 end end #-------------------------------------------------------------------------- # ダメージの処理 #-------------------------------------------------------------------------- alias execute_damage_display_element_weakness_and_resist execute_damage def execute_damage(user) r = execute_damage_display_element_weakness_and_resist(user) item = @result.display_element_weakness_and_resist_item if item h = @result.hp_damage m = @result.mp_damage t = @result.tp_damage @result.hp_damage_display_element_target = item.damage.to_hp? or h != 0 @result.mp_damage_display_element_target = item.damage.to_mp? or m != 0 @result.tp_damage_display_element_target = t != 0 end r end end class Game_ActionResult attr_accessor :max_rate_in_element_id attr_accessor :max_rate_in_element_rate attr_accessor :hp_damage_display_element_target attr_accessor :mp_damage_display_element_target attr_accessor :tp_damage_display_element_target attr_accessor :display_element_weakness_and_resist_item #-------------------------------------------------------------------------- # クリア #-------------------------------------------------------------------------- alias clear_display_element_weakness_and_resist clear def clear clear_display_element_weakness_and_resist @max_rate_in_element_id = nil @max_rate_in_element_rate = nil @hp_damage_display_element_target = nil @mp_damage_display_element_target = nil @tp_damage_display_element_target = nil @display_element_weakness_and_resist_item = nil end if !DisplayElementWeaknessAndResist::Type1 #-------------------------------------------------------------------------- # 何らかのステータス(能力値かステート)が影響を受けたかの判定 #-------------------------------------------------------------------------- alias status_affected_display_element_weakness_and_resist? status_affected? def status_affected? r = @max_rate_in_element_rate status_affected_display_element_weakness_and_resist? or r && (r < 1.0 or r > 1.0) end end end if DisplayElementWeaknessAndResist::BLog class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ダメージの表示 #-------------------------------------------------------------------------- alias display_damage_display_element_weakness_and_resist display_damage def display_damage(target, item) display_element_weakness_and_resist(target) if DisplayElementWeaknessAndResist::Type1 && !target.result.missed && !target.result.evaded display_damage_display_element_weakness_and_resist(target, item) end #-------------------------------------------------------------------------- # ステート付加の表示 #-------------------------------------------------------------------------- alias display_added_states_display_element_weakness_and_resist display_added_states def display_added_states(target) display_element_weakness_and_resist(target) if !DisplayElementWeaknessAndResist::Type1 && !target.result.missed && !target.result.evaded display_added_states_display_element_weakness_and_resist(target) end #-------------------------------------------------------------------------- # 属性関係の表示 #-------------------------------------------------------------------------- def display_element_weakness_and_resist(target) return unless target.display_element_weakness_and_resist? i = target.result.max_rate_in_element_id if i r = target.result.max_rate_in_element_rate if r type = (r > 1.0 ? :weakness : (r < 1.0 ? :resist : nil)) return unless type n = DisplayElementWeaknessAndResist::N[i] element_name = n ? n : $data_system.elements[i] t = sprintf( (target.actor? ? DisplayElementWeaknessAndResist::FA : DisplayElementWeaknessAndResist::FE)[type], target.name,element_name) DisplayElementWeaknessAndResist::Type1 ? add_text(t) : replace_text(t) wait DisplayElementWeaknessAndResist::Type1 ? back_one : wait_for_effect end end end end end if DisplayElementWeaknessAndResist::XPS class Sprite_PopupBase < Sprite #-------------------------------------------------------------------------- # 初期化 #-------------------------------------------------------------------------- alias initialize_display_element_weakness_and_resist initialize def initialize(data = nil) if data @max_rate_in_element_id = data.max_rate_in_element_id if data.max_rate_in_element_id @max_rate_in_element_rate = data.max_rate_in_element_rate if data.max_rate_in_element_rate end initialize_display_element_weakness_and_resist(data) if @battler && @max_rate_in_element_id && @max_rate_in_element_rate create_element_icon_sprite(self.viewport) end end #-------------------------------------------------------------------------- # 属性アイコンスプライト作成 #-------------------------------------------------------------------------- def create_element_icon_sprite(viewport = nil) return if @max_rate_in_element_rate != @battler.result.element_rate icon_index = DisplayElementWeaknessAndResist::E[@max_rate_in_element_id] return unless icon_index @element_icon_sprite = Sprite.new(viewport) new_bitmap = Bitmap.new(24,24) icon_bitmap = Cache.system("Iconset") rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24) new_bitmap.blt(x, y, icon_bitmap, rect, 255) @element_icon_sprite.bitmap = new_bitmap @element_icon_sprite.ox = 12 update_element_icon_sprite end #-------------------------------------------------------------------------- # ポップアップ消去 #-------------------------------------------------------------------------- alias popup_remove_display_element_weakness_and_resist popup_remove def popup_remove popup_remove_display_element_weakness_and_resist dispose_element_icon_sprite end #-------------------------------------------------------------------------- # 属性アイコンスプライト解放 #-------------------------------------------------------------------------- def dispose_element_icon_sprite return unless @element_icon_sprite @element_icon_sprite.bitmap.dispose @element_icon_sprite.dispose end #-------------------------------------------------------------------------- # 座標更新 #-------------------------------------------------------------------------- alias update_xy_display_element_weakness_and_resist update_xy def update_xy update_xy_display_element_weakness_and_resist update_element_icon_sprite end #-------------------------------------------------------------------------- # 属性アイコンスプライト更新 #-------------------------------------------------------------------------- def update_element_icon_sprite return unless @element_icon_sprite @element_icon_sprite.x = self.x + DisplayElementWeaknessAndResist::X @element_icon_sprite.y = self.y + DisplayElementWeaknessAndResist::Y - self.oy @element_icon_sprite.z = self.z + DisplayElementWeaknessAndResist::Z @element_icon_sprite.opacity = self.opacity @element_icon_sprite.visible = self.visible @element_icon_sprite.update end end class Popup_Data attr_accessor :max_rate_in_element_id attr_accessor :max_rate_in_element_rate #-------------------------------------------------------------------------- # 関連データ削除 #-------------------------------------------------------------------------- def clear_max_rate_in_element @max_rate_in_element_id = nil @max_rate_in_element_rate = nil end #-------------------------------------------------------------------------- # HP ダメージポップアップ #-------------------------------------------------------------------------- alias popup_hp_damage_display_element_weakness_and_resist popup_hp_damage def popup_hp_damage(target, item) if target.result.hp_damage_display_element_target e = target.result.max_rate_in_element_rate if (e && (DisplayElementWeaknessAndResist::Type4 ? e != 1.0 : true)) @max_rate_in_element_id = target.result.max_rate_in_element_id @max_rate_in_element_rate = e end end r = popup_hp_damage_display_element_weakness_and_resist(target, item) clear_max_rate_in_element r end #-------------------------------------------------------------------------- # MP ダメージポップアップ #-------------------------------------------------------------------------- alias popup_mp_damage_display_element_weakness_and_resist popup_mp_damage def popup_mp_damage(target, item) if target.result.mp_damage_display_element_target e = target.result.max_rate_in_element_rate if (e && (DisplayElementWeaknessAndResist::Type4 ? e != 1.0 : true)) @max_rate_in_element_id = target.result.max_rate_in_element_id @max_rate_in_element_rate = e end end r = popup_mp_damage_display_element_weakness_and_resist(target, item) clear_max_rate_in_element r end #-------------------------------------------------------------------------- # TP ダメージポップアップ #-------------------------------------------------------------------------- alias popup_tp_damage_display_element_weakness_and_resist popup_tp_damage def popup_tp_damage(target, item) if target.result.tp_damage_display_element_target e = target.result.max_rate_in_element_rate if (e && (DisplayElementWeaknessAndResist::Type4 ? e != 1.0 : true)) @max_rate_in_element_id = target.result.max_rate_in_element_id @max_rate_in_element_rate = e end end r = popup_tp_damage_display_element_weakness_and_resist(target, item) clear_max_rate_in_element r end end end