オーバードライブ – KGC_OverDrive改造

2010/01/17 | By KUMA | Filed in: RPGツクールVX.

RPGツクールVXの拡張機能「オーバードライブ – KGC_OverDrive 2009/11/1改造1.00版」を公開します。

■仕様

  • これはKGC Software様で公開されている「オーバードライブ」機能2009/11/1版をベースに、
    すべてのオーバードライブゲージを使用した場合の補正を、ダメージ以外に、スキル成功率(命中率)、クリティカル率を補正できるようにします。
  • +続いて”DMG”、”HIT”または”CRI”のどれか一つを追記することで動作します。また、省略した場合は改造前と同じ動作をします。

■ライセンス

■諸注意

  • 本スクリプトはKGC Software様とは一切関係がありません。質問などを氏にするのはご迷惑なので絶対にやめてください。
  • 本スクリプトを使用して何らかの損害が発生してもKUMAは一切責任を負いません。
  • 仕様変更、仕様追加のリクエストへの対応、不具合修正、質問に対する回答など、真摯に対応するかもしれませんが、しないかもしれません。
    どうぞご自身のリスクにおいて、勉強して、改造して、ご自身の望む機能を手に入れてください。
    もちろんKUMAに対し金銭による契約を結んだ上で、保証やサポートのあるコードを手に入れたいということであれば、歓迎いたしますのでご相談ください。
  • クリティカル率の補正対象はGame_Actor, Game_Enemyのcri関数に対しダメージと同じ倍率計算を補填しています。あまり効果を実感できないかもしれません。
    Hit率はGame_Battlerのcalc_hit関数に対して上記と同様の計算をしています。こっちは逆に効きすぎな感があるかも。

というわけで、続きにコード公開

#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ オーバードライブ - KGC_OverDrive ◆ VX ◆
#_/    ◇ Last update : 2009/11/01 ◇
#_/    Jan 17 2010. OverDrive Consume All Boost Type. Edit by KUMA
#_/----------------------------------------------------------------------------
#_/  専用のゲージを消費して使用するスキルを作成します。
#_/  Add KUMA 全ゲージ使う場合に補正をかける対象を、ダメージだけでなく、
#_/           スキルの成功率とクリティカル率も追加しました。
#_/           +続いてDMG、HITまたはCRIを追記することで動作します。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ カスタマイズ項目 - Customize BEGIN ★
#==============================================================================

module KGC
module OverDrive
 # ◆ ドライブゲージ最大値
 #  普通はこのままでOK。微調整したい場合に変更。
 GAUGE_MAX = 100
 # ◆ ドライブゲージ増加量
 #  高いほどゲージが溜まりやすい。
 #  マイナス値を指定すると減少。
 #  「被ダメージ」は、受けたダメージの最大 HP に対する割合で増加量を算出。
 #  (500 だと、最大 HP 相当のダメージで 500 溜まる)
 GAIN_RATE = [
 100,  # 攻撃
 300,  # 被ダメージ
 0,  # 勝利
 0,  # 逃走
 0,  # 孤独
 0,  # 行動
 0,  # 瀕死
 20,  # 防御
 ]  # ← この ] は消さないこと!

 # ◆ ゲージの初期本数
 DEFAULT_GAUGE_NUMBER = 3

 # ◆ デフォルトドライブタイプ
 #   0..攻撃  1..被ダメージ  2..勝利  3..逃走  4..孤独  5..行動
 #   6..瀕死  7..防御
 DEFAULT_ACTOR_DRIVE_TYPE = [0, 1, 6]        # アクター
 DEFAULT_ENEMY_DRIVE_TYPE = [0, 1, 4, 5, 6]  # 敵

 # ◆ ドライブゲージの色
 #  数値  : \C[n] と同じ色。
 #  Color : 指定した色。 ( Color.new(255, 128, 128) など )
 GAUGE_NORMAL_START_COLOR = 14  # 通常時開始色
 GAUGE_NORMAL_END_COLOR   =  6  # 通常時終了色
 GAUGE_MAX_START_COLOR    = 10  # 最大時開始色
 GAUGE_MAX_END_COLOR      =  2  # 最大時終了色

 # ◆ ドライブゲージに汎用ゲージを使用する
 #  ≪汎用ゲージ描画≫ 導入時のみ有効。
 ENABLE_GENERIC_GAUGE = true
 # ◆ ドライブゲージ設定
 #  画像は "Graphics/System" から読み込む。
 GAUGE_IMAGE     = "GaugeOD"     # 通常時画像
 GAUGE_MAX_IMAGE = "GaugeODMax"  # 最大時画像
 GAUGE_OFFSET    = [-23, -2]     # 位置補正 [x, y]
 GAUGE_LENGTH    = -4            # 長さ補正
 GAUGE_SLOPE     = 30            # 傾き (-89 ~ 89)

 # ◆ ドライブゲージの Y 座標補正値
 #  汎用ゲージ未使用の場合に使用。
 #  -8 にすると、HP/MP ゲージと同じ位置になります。
 GAUGE_OFFSET_Y = -8
 # ◆ ゲージ蓄積量の数値表記
 #   0 .. なし  ※ゲージが 2 本以上の場合は非推奨
 #   1 .. 即値 (蓄積量そのまま)
 #   2 .. 割合 --> x%
 #   3 .. 割合 (詳細1) --> x.x%
 #   4 .. 割合 (詳細2) --> x.xx%
 #   5 .. 蓄積済み本数
 GAUGE_VALUE_STYLE = 2
 # ◆ ゲージ蓄積量のフォントサイズ
 #  大きくしすぎると名前に被ります。
 GAUGE_VALUE_FONT_SIZE = 14

 # ◆ 死亡(HP 0)時にドライブゲージを 0 にする
 EMPTY_ON_DEAD = true

 # ◆ ドライブゲージを表示しないアクター
 #  ゲージを隠すアクターのIDを配列に格納。
 HIDE_GAUGE_ACTOR = []
 # ◆ 非戦闘時はドライブゲージを隠す
 HIDE_GAUGE_NOT_IN_BATTLE = false
 # ◆ オーバードライブスキル未修得ならゲージを隠す
 HIDE_GAUGE_NO_OD_SKILLS  = false
 # ◆ ゲージを隠している場合はゲージを増加させない
 NOT_GAIN_GAUGE_HIDING    = true

 # ◆ ゲージ不足のときはオーバードライブスキルを隠す
 HIDE_SKILL_LACK_OF_GAUGE = true

 # ◆ ドライブゲージ名
 GAUGE_NAME = "ドライブゲージ"
 # ◆ ドライブゲージ変動アイテム使用時のメッセージ
 OD_GAIN_MESSAGE = {
 :drain_a   => "%sは%sを奪われた!",  # 吸収: アクター
 :drain_e   => "%sの%sを奪った!",    # 吸収: 敵
 :loss_a    => "%sの%sが減った!",    # 減少: アクター
 :loss_e    => "%sの%sが減った!",    # 減少: 敵
 :recover_a => "%sの%sが増えた!",    # 増加: アクター
 :recover_e => "%sの%sが増えた!",    # 増加: 敵
 }
end
end

#==============================================================================
# ☆ カスタマイズ項目終了 - Customize END ☆
#==============================================================================

$imported = {} if $imported == nil
$imported["OverDrive"] = true

module KGC::OverDrive
 # ドライブタイプ
 module Type
 ATTACK  = 0  # 攻撃
 DAMAGE  = 1  # 被ダメージ
 VICTORY = 2  # 勝利
 ESCAPE  = 3  # 逃走
 ALONE   = 4  # 孤独
 ACTION  = 5  # 行動
 FATAL   = 6  # 瀕死
 GUARD   = 7  # 防御
 end

 # 蓄積量表記
 module ValueStyle
 NONE         = 0  # なし
 IMMEDIATE    = 1  # 即値
 RATE         = 2  # 割合
 RATE_DETAIL1 = 3  # 割合 (詳細1)
 RATE_DETAIL2 = 4  # 割合 (詳細2)
 NUMBER       = 5  # 蓄積済み本数
 end

 module Regexp
 module UsableItem
 # ドライブゲージ増加
 OD_GAIN = /<(?:OD_GAIN|(?:OD|ドライブ)ゲージ増加)\s*([\+\-]?\d+)>/i
 end

 module Skill
 # オーバードライブ
 OVER_DRIVE = /<(?:OVER_DRIVE|オーバードライブ)\s*(\d+)?(\+)?(DMG|HIT|CRI)?>/i
 # ゲージ増加率
 OD_GAIN_RATE =
 /<(?:OD_GAIN_RATE|(?:OD|ドライブ)ゲージ増加率)\s*(\d+)[%%]?>/i
 end
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ KGC::Commands
#==============================================================================

module KGC
module Commands
 module_function
 #--------------------------------------------------------------------------
 # ○ アクターのドライブゲージの増減
 #     actor_id : アクター ID (-1 : パーティ全体)
 #     value    : 増加量 (マイナスも可)
 #--------------------------------------------------------------------------
 def gain_actor_od_gauge(actor_id, value)
 if actor_id == -1
 # 生存メンバー全員のゲージを操作
 $game_party.existing_members.each { |actor|
 next unless actor.can_gain_overdrive?
 actor.overdrive += value
 }
 else
 actor = $game_actors[actor_id]
 actor.overdrive += value if actor != nil && actor.exist?
 end
 end
 #--------------------------------------------------------------------------
 # ○ エネミーのドライブゲージの増減
 #     enemy_index : エネミー index (-1 : 全体)
 #     value       : 増加量 (マイナスも可)
 #--------------------------------------------------------------------------
 def gain_enemy_od_gauge(enemy_index, value)
 if enemy_index == -1
 # 生存エネミー全員のゲージを操作
 $game_troop.existing_members.each { |enemy|
 enemy.overdrive += value
 }
 else
 enemy = $game_troop.members[enemy_index]
 enemy.overdrive += value if enemy != nil && enemy.exist?
 end
 end
 #--------------------------------------------------------------------------
 # ○ アクターのドライブゲージの取得
 #     actor_id    : アクター ID
 #     variable_id : 戻り値を格納する変数 ID
 #--------------------------------------------------------------------------
 def get_actor_od_gauge(actor_id, variable_id = 0)
 actor = $game_actors[actor_id]
 n = (actor != nil ? actor.overdrive : 0)
 if variable_id > 0
 $game_variables[variable_id] = n
 end
 return n
 end
 #--------------------------------------------------------------------------
 # ○ エネミーのドライブゲージの取得
 #     enemy_index : エネミー index
 #     variable_id : 戻り値を格納する変数 ID
 #--------------------------------------------------------------------------
 def get_enemy_od_gauge(enemy_index, variable_id = 0)
 enemy = $game_troop.members[enemy_index]
 n = (enemy != nil ? enemy.overdrive : 0)
 if variable_id > 0
 $game_variables[variable_id] = n
 end
 return n
 end
 #--------------------------------------------------------------------------
 # ○ アクターのドライブゲージの本数を設定
 #     actor_id : アクター ID (-1 : パーティ全体)
 #     number   : ゲージ本数
 #--------------------------------------------------------------------------
 def set_actor_od_gauge_number(actor_id, number)
 if actor_id == -1
 # メンバー全員の本数を設定
 $game_party.members.each { |actor|
 actor.drive_gauge_number = 3
 }
 else
 actor = $game_actors[actor_id]
 actor.drive_gauge_number = number if actor != nil
 end
 end
 #--------------------------------------------------------------------------
 # ○ エネミーのドライブゲージの本数を設定
 #     enemy_index : エネミー index (-1 : 全体)
 #     number   : ゲージ本数
 #--------------------------------------------------------------------------
 def set_enemy_od_gauge_number(enemy_index, number)
 if enemy_index == -1
 # 生存エネミー全員の本数を設定
 $game_troop.members.each { |enemy|
 enemy.drive_gauge_number = number
 }
 else
 enemy = $game_troop.members[enemy_index]
 enemy.drive_gauge_number = number if enemy != nil
 end
 end
 #--------------------------------------------------------------------------
 # ○ アクターのドライブゲージが最大か判定
 #     actor_id : アクター ID
 #--------------------------------------------------------------------------
 def actor_od_gauge_max?(actor_id)
 actor = $game_actors[actor_id]
 return false if actor == nil
 return actor.overdrive == actor.max_overdrive
 end
 #--------------------------------------------------------------------------
 # ○ エネミーのドライブゲージが最大か判定
 #     enemy_index : エネミー index
 #--------------------------------------------------------------------------
 def enemy_od_gauge_max?(enemy_index)
 enemy = $game_troop.members[enemy_index]
 return false if enemy == nil
 return enemy.overdrive == enemy.max_overdrive
 end
 #--------------------------------------------------------------------------
 # ○ アクターのドライブタイプの変更
 #     actor_id : アクター ID (-1 : パーティ全体)
 #     types    : ドライブタイプの配列 (省略時 : 初期化)
 #--------------------------------------------------------------------------
 def set_actor_drive_type(actor_id, types = nil)
 if actor_id == -1
 # メンバー全員のドライブタイプを変更
 $game_party.members.each { |actor|
 actor.drive_type = types
 }
 else
 actor = $game_actors[actor_id]
 actor.drive_type = types if actor != nil
 end
 end
 #--------------------------------------------------------------------------
 # ○ エネミーのドライブタイプの変更
 #     enemy_index : エネミー index (-1 : 全体)
 #     types       : ドライブタイプの配列 (省略時 : 初期化)
 #--------------------------------------------------------------------------
 def set_enemy_drive_type(enemy_index, types = nil)
 if enemy_index == -1
 # エネミー全員のドライブタイプを変更
 $game_troop.members.each { |enemy|
 enemy.drive_type = types
 }
 else
 enemy = $game_troop.members[enemy_index]
 enemy.drive_type = types if enemy != nil
 end
 end
end
end

class Game_Interpreter
 include KGC::Commands
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::UsableItem
#==============================================================================

class RPG::UsableItem < RPG::BaseItem
 #--------------------------------------------------------------------------
 # ○ オーバードライブのキャッシュ生成
 #--------------------------------------------------------------------------
 def create_overdrive_cache
 @__od_gain = 0

 self.note.each_line { |line|
 case line
 when KGC::OverDrive::Regexp::UsableItem::OD_GAIN
 # ドライブゲージ増加
 @__od_gain = $1.to_i
 end
 }
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ増加量
 #--------------------------------------------------------------------------
 def od_gain
 create_overdrive_cache if @__od_gain == nil
 return @__od_gain
 end
 #--------------------------------------------------------------------------
 # ○ ドライブスキルであるか
 #--------------------------------------------------------------------------
 def overdrive
 return false
 end
 alias overdrive? overdrive
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
 #--------------------------------------------------------------------------
 # ○ オーバードライブのキャッシュ生成
 #--------------------------------------------------------------------------
 def create_overdrive_cache
 super

 @__is_overdrive   = false
 @__od_cost        = KGC::OverDrive::GAUGE_MAX
 @__od_consume_all = false
 @__od_gain_rate   = 100
 # Add OverDrive Consume All Boost Type by KUMA
 @__od_consume_all_boost_type = "DMG"

 self.note.each_line { |line|
 case line
 when KGC::OverDrive::Regexp::Skill::OVER_DRIVE
 # オーバードライブ
 @__is_overdrive   = true
 @__od_cost        = $1.to_i if $1 != nil
 @__od_consume_all = ($2 != nil)
 # Add OverDrive Consume All Boost Type by KUMA
 @__od_consume_all_boost_type = $3 if (@__od_consume_all && $3 != nil)
 when KGC::OverDrive::Regexp::Skill::OD_GAIN_RATE
 # ゲージ増加率
 @__od_gain_rate = $1.to_i
 end
 }

 # ドライブスキルでなければ、ゲージ消費量 0
 unless @__is_overdrive
 @__od_cost = 0
 end
 end
 #--------------------------------------------------------------------------
 # ○ ドライブスキルであるか
 #--------------------------------------------------------------------------
 def overdrive
 create_overdrive_cache if @__is_overdrive == nil
 return @__is_overdrive
 end
 alias overdrive? overdrive
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ消費量
 #--------------------------------------------------------------------------
 def od_cost
 create_overdrive_cache if @__od_cost == nil
 return @__od_cost
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ全消費か
 #--------------------------------------------------------------------------
 def od_consume_all
 create_overdrive_cache if @__od_consume_all == nil
 return @__od_consume_all
 end
 alias od_consume_all? od_consume_all
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ全消費のboost type取得
 #--------------------------------------------------------------------------
 def od_consume_all_boost_type
 create_overdrive_cache if @__od_consume_all_boost_type == nil
 return @__od_consume_all_boost_type
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ増加率
 #--------------------------------------------------------------------------
 def od_gain_rate
 create_overdrive_cache if @__od_gain_rate == nil
 return @__od_gain_rate
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Vocab
#==============================================================================

module Vocab
 # ドライブゲージ名
 def self.overdrive
 return KGC::OverDrive::GAUGE_NAME
 end

 # アクター側メッセージ
 ActorODDrain    = KGC::OverDrive::OD_GAIN_MESSAGE[:drain_a]
 ActorODLoss     = KGC::OverDrive::OD_GAIN_MESSAGE[:loss_a]
 ActorODRecovery = KGC::OverDrive::OD_GAIN_MESSAGE[:recover_a]

 # 敵側メッセージ
 EnemyODDrain    = KGC::OverDrive::OD_GAIN_MESSAGE[:drain_e]
 EnemyODLoss     = KGC::OverDrive::OD_GAIN_MESSAGE[:loss_e]
 EnemyODRecovery = KGC::OverDrive::OD_GAIN_MESSAGE[:recover_e]
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
 #--------------------------------------------------------------------------
 # ● 公開インスタンス変数
 #--------------------------------------------------------------------------
 attr_writer   :drive_type               # ドライブタイプ
 attr_reader   :od_damage                # 行動結果: ドライブダメージ
 #--------------------------------------------------------------------------
 # ● 行動効果の保持用変数をクリア
 #--------------------------------------------------------------------------
 alias clear_action_results_KGC_OverDrive clear_action_results
 def clear_action_results
 clear_action_results_KGC_OverDrive

 @od_damage = 0
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ量取得
 #--------------------------------------------------------------------------
 def overdrive
 @overdrive = 0 if @overdrive == nil
 return @overdrive
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージの操作
 #--------------------------------------------------------------------------
 def overdrive=(value)
 @overdrive = [[value, max_overdrive].min, 0].max
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ最大量取得
 #--------------------------------------------------------------------------
 def max_overdrive
 return KGC::OverDrive::GAUGE_MAX * drive_gauge_number
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ Max 判定
 #--------------------------------------------------------------------------
 def overdrive_max?
 return (overdrive == max_overdrive)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ本数取得
 #--------------------------------------------------------------------------
 def drive_gauge_number
 if @drive_gauge_number == nil
 @drive_gauge_number = KGC::OverDrive::DEFAULT_GAUGE_NUMBER
 end
 return @drive_gauge_number
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ本数の操作
 #--------------------------------------------------------------------------
 def drive_gauge_number=(value)
 @drive_gauge_number = [value, 1].max
 end
 #--------------------------------------------------------------------------
 # ○ ドライブタイプの取得
 #--------------------------------------------------------------------------
 def drive_type
 return []
 end
 #--------------------------------------------------------------------------
 # ○ ドライブスキル習得済み判定
 #--------------------------------------------------------------------------
 def overdrive_skill_learned?
 return true
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ表示判定
 #--------------------------------------------------------------------------
 def od_gauge_visible?
 return false
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ増加可否判定
 #--------------------------------------------------------------------------
 def can_gain_overdrive?
 return true
 end
 #--------------------------------------------------------------------------
 # ○ 攻撃時増加判定
 #--------------------------------------------------------------------------
 def drive_attack?
 return drive_type.include?(KGC::OverDrive::Type::ATTACK)
 end
 #--------------------------------------------------------------------------
 # ○ 被ダメージ時増加判定
 #--------------------------------------------------------------------------
 def drive_damage?
 return drive_type.include?(KGC::OverDrive::Type::DAMAGE)
 end
 #--------------------------------------------------------------------------
 # ○ 勝利時増加判定
 #--------------------------------------------------------------------------
 def drive_victory?
 return drive_type.include?(KGC::OverDrive::Type::VICTORY)
 end
 #--------------------------------------------------------------------------
 # ○ 逃走時増加判定
 #--------------------------------------------------------------------------
 def drive_escape?
 return drive_type.include?(KGC::OverDrive::Type::ESCAPE)
 end
 #--------------------------------------------------------------------------
 # ○ 孤独時増加判定
 #--------------------------------------------------------------------------
 def drive_alone?
 return drive_type.include?(KGC::OverDrive::Type::ALONE)
 end
 #--------------------------------------------------------------------------
 # ○ 行動時増加判定
 #--------------------------------------------------------------------------
 def drive_action?
 return drive_type.include?(KGC::OverDrive::Type::ACTION)
 end
 #--------------------------------------------------------------------------
 # ○ 瀕死時増加判定
 #--------------------------------------------------------------------------
 def drive_fatal?
 return drive_type.include?(KGC::OverDrive::Type::FATAL)
 end
 #--------------------------------------------------------------------------
 # ○ 防御時増加判定
 #--------------------------------------------------------------------------
 def drive_guard?
 return drive_type.include?(KGC::OverDrive::Type::GUARD)
 end
 #--------------------------------------------------------------------------
 # ● ステートの付加
 #     state_id : ステート ID
 #--------------------------------------------------------------------------
 alias add_state_KGC_OverDrive add_state
 def add_state(state_id)
 add_state_KGC_OverDrive(state_id)

 reset_overdrive_on_dead if dead?
 end
 #--------------------------------------------------------------------------
 # ○ スキルの消費ドライブゲージ計算
 #     skill : スキル
 #--------------------------------------------------------------------------
 def calc_od_cost(skill)
 return 0 unless skill.is_a?(RPG::Skill)

 return skill.od_cost
 end
 #--------------------------------------------------------------------------
 # ● スキルの使用可能判定
 #     skill : スキル
 #--------------------------------------------------------------------------
 alias skill_can_use_KGC_OverDrive? skill_can_use?
 def skill_can_use?(skill)
 return false unless skill_can_use_KGC_OverDrive?(skill)

 return false if calc_od_cost(skill) > overdrive
 return true
 end
 #--------------------------------------------------------------------------
 # ● スキルまたはアイテムによるダメージ計算
 #     user : スキルまたはアイテムの使用者
 #     obj  : スキルまたはアイテム
 #    結果は @hp_damage または @mp_damage に代入する。
 #--------------------------------------------------------------------------
 alias make_obj_damage_value_KGC_OverDrive make_obj_damage_value
 def make_obj_damage_value(user, obj)
 # Mod OverDrive Consume All Boost Type by KUMA
 # make_obj_damage_value_KGC_OverDrive(user, obj)
 bkboost = user.cri_boost
 if (obj.is_a?(RPG::Skill) &&
 obj.overdrive? && obj.od_consume_all? &&
 obj.od_consume_all_boost_type == "CRI")
 user.cri_boost = ([user.overdrive * 1000 / obj.od_cost, 1000].max / 1000)
 end
 make_obj_damage_value_KGC_OverDrive(user, obj)
 user.cri_boost = bkboost

 apply_od_consume_all_for_damage(user, obj)
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ全消費時の効果の適用
 #     user : スキルまたはアイテムの使用者
 #     obj  : スキルまたはアイテム
 #    結果は @hp_damage または @mp_damage に代入する。
 #--------------------------------------------------------------------------
 def apply_od_consume_all_for_damage(user, obj)
 return unless obj.is_a?(RPG::Skill)
 return unless obj.overdrive? && obj.od_consume_all?

 # 余剰消費量に応じて強化 (例: 最低消費量 1000 でゲージが 1200 なら 1.2 倍)
 rate = [user.overdrive * 1000 / obj.od_cost, 1000].max
 # Mod OverDrive Consume All Boost Type by KUMA
 # @hp_damage = @hp_damage * rate / 1000
 # @mp_damage = @mp_damage * rate / 1000
 if obj.od_consume_all_boost_type == "DMG"
 @hp_damage = @hp_damage * rate / 1000
 @mp_damage = @mp_damage * rate / 1000
 end
 end
 #--------------------------------------------------------------------------
 # ● 最終命中率の計算
 #     user : 攻撃者、スキルまたはアイテムの使用者
 #     obj  : スキルまたはアイテム (通常攻撃の場合は nil)
 #             Add OverDrive Consume All Boost Type by KUMA
 #--------------------------------------------------------------------------
 alias calc_hit_KGC_OverDrive_kuma calc_hit
 def calc_hit(user, obj = nil)
 hit = calc_hit_KGC_OverDrive_kuma(user, obj)
 return hit unless obj.is_a?(RPG::Skill)
 return hit unless obj.overdrive? && obj.od_consume_all?
 return hit unless obj.od_consume_all_boost_type == "HIT"
 
 # 余剰消費量に応じて強化 (例: 最低消費量 1000 でゲージが 1200 なら 1.2 倍)
 rate = [user.overdrive * 1000 / obj.od_cost, 1000].max
 return (hit * rate / 1000)
 end
 #--------------------------------------------------------------------------
 # ● ダメージの反映
 #     user : スキルかアイテムの使用者
 #    呼び出し前に @hp_damage、@mp_damage、@absorbed が設定されていること。
 #--------------------------------------------------------------------------
 alias execute_damage_KGC_OverDrive execute_damage
 def execute_damage(user)
 execute_damage_KGC_OverDrive(user)

 increase_overdrive(user)
 increase_overdrive_by_item(user)
 end
 #--------------------------------------------------------------------------
 # ○ 死亡時ドライブゲージ初期化処理
 #--------------------------------------------------------------------------
 def reset_overdrive_on_dead
 return unless KGC::OverDrive::EMPTY_ON_DEAD

 self.overdrive = 0
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ増加処理
 #     attacker : 攻撃者
 #--------------------------------------------------------------------------
 def increase_overdrive(attacker = nil)
 return unless attacker.is_a?(Game_Battler)  # 攻撃者がバトラーでない
 return unless actor? ^ attacker.actor?      # 攻撃側と防御側が同じ
 return if hp_damage == 0 && mp_damage == 0  # ダメージなし

 increase_attacker_overdrive(attacker)
 increase_defender_overdrive(attacker)
 reset_overdrive_on_dead if dead?
 end
 #--------------------------------------------------------------------------
 # ○ 攻撃側のドライブゲージ増加処理
 #     attacker : 攻撃者
 #--------------------------------------------------------------------------
 def increase_attacker_overdrive(attacker)
 return unless can_gain_overdrive?
 return unless attacker.drive_attack?  # ドライブタイプ「攻撃」なし

 od_gain = KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::ATTACK]
 if attacker.action.kind == 1
 rate = attacker.action.skill.od_gain_rate  # スキルの倍率を適用
 od_gain = od_gain * rate / 100
 if rate > 0
 od_gain = [od_gain, 1].max
 elsif rate < 0
 od_gain = [od_gain, -1].min
 end
 end
 attacker.overdrive += od_gain
 end
 #--------------------------------------------------------------------------
 # ○ 防御側のドライブゲージ増加処理
 #     attacker : 攻撃者
 #--------------------------------------------------------------------------
 def increase_defender_overdrive(attacker)
 return unless can_gain_overdrive?
 return unless self.drive_damage?  # ドライブタイプ「ダメージ」なし

 rate = KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::DAMAGE]
 od_gain = 0
 od_gain += hp_damage * rate / maxhp if hp_damage > 0
 od_gain += mp_damage * rate / maxmp if mp_damage > 0 && maxmp > 0
 if rate > 0
 od_gain = [od_gain, 1].max
 elsif rate < 0
 od_gain = [od_gain, -1].min
 end
 self.overdrive += od_gain
 end
 #--------------------------------------------------------------------------
 # ○ アイテムによるドライブゲージ増加処理
 #     user : 使用者
 #--------------------------------------------------------------------------
 def increase_overdrive_by_item(user = nil)
 return unless user.is_a?(Game_Battler)
 return unless can_gain_overdrive?

 if user.action.skill?
 obj = user.action.skill
 elsif user.action.item?
 obj = user.action.item
 else
 return
 end
 @od_damage = -obj.od_gain
 self.overdrive -= @od_damage
 end
 #--------------------------------------------------------------------------
 # ● スキルの効果適用
 #     user  : スキルの使用者
 #     skill : スキル
 #--------------------------------------------------------------------------
 alias skill_effect_KGC_OverDrive skill_effect
 def skill_effect(user, skill)
 skill_effect_KGC_OverDrive(user, skill)

 # アイテムでスキルを発動した場合はゲージ消費判定を無視
 if $imported["ReproduceFunctions"] && $game_temp.exec_skill_on_item
 return
 end
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
 # Add OverDrive Consume All Boost Type by KUMA
 attr_accessor :cri_boost
 #--------------------------------------------------------------------------
 # ● セットアップ
 #     actor_id : アクター ID
 #--------------------------------------------------------------------------
 alias setup_KGC_OverDrive setup
 def setup(actor_id)
 setup_KGC_OverDrive(actor_id)

 @overdrive  = 0
 @drive_type = nil
 # Add OverDrive Consume All Boost Type by KUMA
 @cri_boost = 1
 end
 #--------------------------------------------------------------------------
 # ○ ドライブタイプの取得
 #--------------------------------------------------------------------------
 def drive_type
 unless @drive_type.is_a?(Array)
 return KGC::OverDrive::DEFAULT_ACTOR_DRIVE_TYPE
 end
 return @drive_type
 end
 #--------------------------------------------------------------------------
 # ○ ドライブスキル習得済み判定
 #--------------------------------------------------------------------------
 def overdrive_skill_learned?
 result = false
 # 一時的に戦闘中フラグを解除
 last_in_battle = $game_temp.in_battle
 $game_temp.in_battle = false

 self.skills.each { |skill|
 if skill.overdrive?
 result = true
 break
 end
 }
 $game_temp.in_battle = last_in_battle
 return result
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ増加可否判定
 #--------------------------------------------------------------------------
 def can_gain_overdrive?
 if KGC::OverDrive::NOT_GAIN_GAUGE_HIDING
 # 非表示
 return false unless od_gauge_visible_l?
 end
 if KGC::OverDrive::HIDE_GAUGE_NO_OD_SKILLS
 # 未修得
 return false unless overdrive_skill_learned?
 end

 return true
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ表示判定
 #--------------------------------------------------------------------------
 def od_gauge_visible?
 return false unless od_gauge_visible_l?
 return false unless can_gain_overdrive?

 return true
 end
 #--------------------------------------------------------------------------
 # ○ ゲージ表示判定 (簡易版)
 #--------------------------------------------------------------------------
 def od_gauge_visible_l?
 # 戦闘中非表示
 if KGC::OverDrive::HIDE_GAUGE_NOT_IN_BATTLE && !$game_temp.in_battle
 return false
 end
 # 非表示
 return false if KGC::OverDrive::HIDE_GAUGE_ACTOR.include?(self.id)

 return true
 end
 #--------------------------------------------------------------------------
 # ● クリティカル率の取得
 #             Add OverDrive Consume All Boost Type by KUMA
 #--------------------------------------------------------------------------
 alias cri_KGC_OverDrive_kuma cri
 def cri
 return (cri_KGC_OverDrive_kuma * @cri_boost)
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
 # Add OverDrive Consume All Boost Type by KUMA
 attr_accessor :cri_boost
 #--------------------------------------------------------------------------
 # ● オブジェクト初期化
 #     index    : 敵グループ内インデックス
 #     enemy_id : 敵キャラ ID
 #--------------------------------------------------------------------------
 alias initialize_KGC_OverDrive initialize
 def initialize(index, enemy_id)
 initialize_KGC_OverDrive(index, enemy_id)

 @overdrive  = 0
 @drive_type = nil
 # Add OverDrive Consume All Boost Type by KUMA
 @cri_boost = 1
 end
 #--------------------------------------------------------------------------
 # ○ ドライブタイプの取得
 #--------------------------------------------------------------------------
 def drive_type
 unless @drive_type.is_a?(Array)
 return KGC::OverDrive::DEFAULT_ENEMY_DRIVE_TYPE
 end
 return @drive_type
 end
 #--------------------------------------------------------------------------
 # ● クリティカル率の取得
 #             Add OverDrive Consume All Boost Type by KUMA
 #--------------------------------------------------------------------------
 alias cri_KGC_OverDrive_kuma cri
 def cri
 return (cri_KGC_OverDrive_kuma * @cri_boost)
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base < Window
 #--------------------------------------------------------------------------
 # ○ ドライブゲージの通常時の色 1 の取得
 #--------------------------------------------------------------------------
 def od_gauge_normal_color1
 color = KGC::OverDrive::GAUGE_NORMAL_START_COLOR
 return (color.is_a?(Integer) ? text_color(color) : color)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージの通常時の色 2 の取得
 #--------------------------------------------------------------------------
 def od_gauge_normal_color2
 color = KGC::OverDrive::GAUGE_NORMAL_END_COLOR
 return (color.is_a?(Integer) ? text_color(color) : color)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージの最大時の色 1 の取得
 #--------------------------------------------------------------------------
 def od_gauge_max_color1
 color = KGC::OverDrive::GAUGE_MAX_START_COLOR
 return (color.is_a?(Integer) ? text_color(color) : color)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージの最大時の色 2 の取得
 #--------------------------------------------------------------------------
 def od_gauge_max_color2
 color = KGC::OverDrive::GAUGE_MAX_END_COLOR
 return (color.is_a?(Integer) ? text_color(color) : color)
 end
 #--------------------------------------------------------------------------
 # ● 名前の描画
 #     actor : アクター
 #     x     : 描画先 X 座標
 #     y     : 描画先 Y 座標
 #--------------------------------------------------------------------------
 alias draw_actor_name_KGC_OverDrive draw_actor_name
 def draw_actor_name(actor, x, y)
 draw_actor_od_gauge(actor, x, y, 108)

 draw_actor_name_KGC_OverDrive(actor, x, y)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージの描画
 #     actor : アクター
 #     x     : 描画先 X 座標
 #     y     : 描画先 Y 座標
 #     width : 幅
 #--------------------------------------------------------------------------
 def draw_actor_od_gauge(actor, x, y, width = 120)
 return unless actor.od_gauge_visible?

 n = actor.overdrive % KGC::OverDrive::GAUGE_MAX
 n = KGC::OverDrive::GAUGE_MAX if actor.overdrive_max?

 if KGC::OverDrive::ENABLE_GENERIC_GAUGE && $imported["GenericGauge"]
 # 汎用ゲージ
 file = (actor.overdrive_max? ?
 KGC::OverDrive::GAUGE_MAX_IMAGE : KGC::OverDrive::GAUGE_IMAGE)
 draw_gauge(file,
 x, y, width, n, KGC::OverDrive::GAUGE_MAX,
 KGC::OverDrive::GAUGE_OFFSET,
 KGC::OverDrive::GAUGE_LENGTH,
 KGC::OverDrive::GAUGE_SLOPE)
 else
 # デフォルトゲージ
 gw = width * n / KGC::OverDrive::GAUGE_MAX
 gc1 = (gw == width ? od_gauge_max_color1 : od_gauge_normal_color1)
 gc2 = (gw == width ? od_gauge_max_color2 : od_gauge_normal_color2)
 self.contents.fill_rect(x, y + WLH + KGC::OverDrive::GAUGE_OFFSET_Y,
 width, 6, gauge_back_color)
 self.contents.gradient_fill_rect(
 x, y + WLH + KGC::OverDrive::GAUGE_OFFSET_Y, gw, 6, gc1, gc2)
 end

 draw_actor_od_gauge_value(actor, x, y, width)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブゲージ蓄積量の描画
 #     actor : アクター
 #     x     : 描画先 X 座標
 #     y     : 描画先 Y 座標
 #     width : 幅
 #--------------------------------------------------------------------------
 def draw_actor_od_gauge_value(actor, x, y, width = 120)
 text = ""
 value = actor.overdrive * 100.0 / KGC::OverDrive::GAUGE_MAX
 case KGC::OverDrive::GAUGE_VALUE_STYLE
 when KGC::OverDrive::ValueStyle::IMMEDIATE
 text = actor.overdrive.to_s
 when KGC::OverDrive::ValueStyle::RATE
 text = sprintf("%d%%", actor.overdrive * 100 / KGC::OverDrive::GAUGE_MAX)
 when KGC::OverDrive::ValueStyle::RATE_DETAIL1
 text = sprintf("%0.1f%%", value)
 when KGC::OverDrive::ValueStyle::RATE_DETAIL2
 text = sprintf("%0.2f%%", value)
 when KGC::OverDrive::ValueStyle::NUMBER
 text = "#{actor.overdrive / KGC::OverDrive::GAUGE_MAX}"
 else
 return
 end

 last_font_size = self.contents.font.size
 new_font_size  = KGC::OverDrive::GAUGE_VALUE_FONT_SIZE
 self.contents.font.size = new_font_size
 self.contents.draw_text(
 x, y + WLH + KGC::OverDrive::GAUGE_OFFSET_Y - new_font_size / 2,
 width, new_font_size, text, 2)
 self.contents.font.size = last_font_size
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Skill
#==============================================================================

if KGC::OverDrive::HIDE_SKILL_LACK_OF_GAUGE

class Window_Skill < Window_Selectable
 #--------------------------------------------------------------------------
 # ○ スキルをリストに含めるかどうか
 #     skill : スキル
 #--------------------------------------------------------------------------
 unless $@
 alias include_KGC_OverDrive? include? if method_defined?(:include?)
 end
 def include?(skill)
 return false if skill == nil

 if defined?(include_KGC_OverDrive?)
 return false unless include_KGC_OverDrive?(skill)
 end

 if skill.overdrive?
 return (@actor.calc_od_cost(skill) <= @actor.overdrive)
 else
 return true
 end
 end

if method_defined?(:include_KGC_OverDrive?)
 #--------------------------------------------------------------------------
 # ● リフレッシュ
 #--------------------------------------------------------------------------
 def refresh
 @data = []
 for skill in @actor.skills
 next unless include?(skill)
 @data.push(skill)
 if skill.id == @actor.last_skill_id
 self.index = @data.size - 1
 end
 end
 @item_max = @data.size
 create_contents
 for i in 0...@item_max
 draw_item(i)
 end
 end
end

end  # <-- class
end  # <-- if KGC::OverDrive::HIDE_SKILL_LACK_OF_GAUGE

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Skill
#==============================================================================

class Scene_Skill < Scene_Base
 #--------------------------------------------------------------------------
 # ● スキルの使用 (味方対象以外の使用効果を適用)
 #--------------------------------------------------------------------------
 alias use_skill_nontarget_KGC_OverDrive use_skill_nontarget
 def use_skill_nontarget
 consume_od_gauge

 use_skill_nontarget_KGC_OverDrive
 end
 #--------------------------------------------------------------------------
 # ○ スキル使用時のドライブゲージ消費
 #--------------------------------------------------------------------------
 def consume_od_gauge
 if @skill.od_consume_all?
 @actor.overdrive = 0
 else
 @actor.overdrive -= @actor.calc_od_cost(@skill)
 end
 end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
 #--------------------------------------------------------------------------
 # ● 戦闘終了
 #     result : 結果 (0:勝利 1:逃走 2:敗北)
 #--------------------------------------------------------------------------
 alias battle_end_KGC_OverDrive battle_end
 def battle_end(result)
 increase_overdrive_on_battle_end(result)

 battle_end_KGC_OverDrive(result)
 end
 #--------------------------------------------------------------------------
 # ○ 戦闘終了時のドライブゲージ増加処理
 #     result : 結果 (0:勝利 1:逃走 2:敗北)
 #--------------------------------------------------------------------------
 def increase_overdrive_on_battle_end(result)
 case result
 when 0  # 勝利
 od_gain = KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::VICTORY]
 $game_party.existing_members.each { |actor|
 actor.overdrive += od_gain if actor.drive_victory?
 }
 when 1  # 逃走
 od_gain = KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::ESCAPE]
 $game_party.existing_members.each { |actor|
 actor.overdrive += od_gain if actor.drive_escape?
 }
 end
 end
 #--------------------------------------------------------------------------
 # ● 戦闘行動の実行
 #--------------------------------------------------------------------------
 alias execute_action_KGC_OverDrive execute_action
 def execute_action
 increase_overdrive_on_action

 execute_action_KGC_OverDrive
 end
 #--------------------------------------------------------------------------
 # ○ 行動時のドライブゲージ増加処理
 #--------------------------------------------------------------------------
 def increase_overdrive_on_action
 battler = @active_battler
 od_gain = 0
 unit = (battler.actor? ? $game_party : $game_troop)

 # 孤独戦闘
 if battler.drive_alone? && unit.existing_members.size == 1
 od_gain += KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::ALONE]
 end
 # 行動
 if battler.drive_action?
 od_gain += KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::ACTION]
 end
 # 瀕死
 if battler.drive_fatal? && battler.hp < battler.maxhp / 4
 od_gain += KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::FATAL]
 end
 # 防御
 if battler.drive_guard? && battler.action.kind == 0 &&
 battler.action.basic == 1
 od_gain += KGC::OverDrive::GAIN_RATE[KGC::OverDrive::Type::GUARD]
 end
 battler.overdrive += od_gain
 end
 #--------------------------------------------------------------------------
 # ● 戦闘行動の実行 : スキル
 #--------------------------------------------------------------------------
 alias execute_action_skill_KGC_OverDrive execute_action_skill
 def execute_action_skill
 execute_action_skill_KGC_OverDrive

 consume_od_gauge
 end
 #--------------------------------------------------------------------------
 # ○ スキル使用時のドライブゲージ消費
 #--------------------------------------------------------------------------
 def consume_od_gauge
 return unless @active_battler.action.skill?

 skill = @active_battler.action.skill
 if skill.od_consume_all?
 @active_battler.overdrive = 0
 else
 @active_battler.overdrive -= @active_battler.calc_od_cost(skill)
 end
 end
 #--------------------------------------------------------------------------
 # ● ダメージの表示
 #     target : 対象者
 #     obj    : スキルまたはアイテム
 #--------------------------------------------------------------------------
 alias display_damage_KGC_OverDrive display_damage
 def display_damage(target, obj = nil)
 display_damage_KGC_OverDrive(target, obj)

 return if target.missed || target.evaded
 display_od_damage(target, obj)
 end
 #--------------------------------------------------------------------------
 # ○ ドライブダメージ表示
 #     target : 対象者
 #     obj    : スキルまたはアイテム
 #--------------------------------------------------------------------------
 def display_od_damage(target, obj = nil)
 return if target.dead?
 return if target.od_damage == 0
 if target.absorbed                      # 吸収
 fmt = target.actor? ? Vocab::ActorODDrain : Vocab::EnemyODDrain
 text = sprintf(fmt, target.name, Vocab::overdrive)
 elsif target.od_damage > 0              # ダメージ
 fmt = target.actor? ? Vocab::ActorODLoss : Vocab::EnemyODLoss
 text = sprintf(fmt, target.name, Vocab::overdrive)
 else                                    # 回復
 fmt = target.actor? ? Vocab::ActorODRecovery : Vocab::EnemyODRecovery
 text = sprintf(fmt, target.name, Vocab::overdrive)
 Sound.play_recovery
 end
 @message_window.add_instant_text(text)
 wait(30)
 end
end


Tags: , , ,

2 comments on “オーバードライブ – KGC_OverDrive改造

  1. worldk より:

    なんかclass Game_Battlerのトコで
    顔文字に化けてますな

  2. KUMA より:

    WordPressの設定を修正しました。
    指摘ありがとー。