601 lines
No EOL
22 KiB
Ruby
601 lines
No EOL
22 KiB
Ruby
#==============================================================================
|
||
# ■ RGSS3 反射処理拡張 Ver1.02 by 星潟
|
||
#------------------------------------------------------------------------------
|
||
# 反射の処理を色々変更します。
|
||
#
|
||
# 1.アイテム/スキル別に反射対象を
|
||
# 「元々の使用者」(通常)か
|
||
# 「使用者側の生存者」(乱反射)か
|
||
# 「反射時効果消滅」か
|
||
# 「ユニット反転反射」(敵対象は味方、味方対象は敵にランダム反射)に変更できます。
|
||
#
|
||
# 2.魔法反射だけでなく、様々なスキルに対し反射を使えるようになります。
|
||
#
|
||
# 3.反射時のダメージ倍率を設定できるようになります。
|
||
#
|
||
# 4.アイテム/スキル別に反射を無視する確率を設定できるようになります。
|
||
# また、反射タイプ別に、アイテム・スキルに反射を無視する確率を
|
||
# 付与する特徴を設定できるようになります。
|
||
#
|
||
# 5.アイテム/スキル別に反射時SEを設定できるようになります。
|
||
#
|
||
# 6.アイテム/スキル別に反射時テキスト(メッセージ)を設定できるようになります。
|
||
#------------------------------------------------------------------------------
|
||
# ★反射対象を変更する場合(例)
|
||
#
|
||
# ☆元々の使用者に反射する場合
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射モード:0>と記入する。
|
||
#
|
||
# ☆元々の使用者側のキャラクターにランダムに反射する場合
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射モード:1>と記入する。
|
||
#
|
||
# ☆反射された際にダメージ/効果を発生させないようにする場合
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射モード:2>と記入する。
|
||
#
|
||
# ☆本来のターゲットの逆側の対象(敵対象は味方、味方対象は敵にランダム反射)に
|
||
# ランダムに反射する場合(回復魔法等への適用を想定)
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射モード:3>と記入する。
|
||
#------------------------------------------------------------------------------
|
||
# ★単純な魔法反射ではない特殊な反射を作成する場合(例)
|
||
#
|
||
# ☆特殊な反射が有効なアイテム/スキルを作成する場合
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射タイプ:1>と記入する。
|
||
# (この場合、反射タイプ1と設定される。0にした場合は未設定と同義になる)
|
||
#
|
||
# ☆特殊な反射特徴を作成する場合
|
||
#
|
||
# --該当の特徴を有する項目のメモ欄に<反射率:1,100>と記入する。
|
||
# (この場合、反射タイプ1と設定されたアイテム/スキルを100%の確率で反射)
|
||
#
|
||
# ☆味方から味方への回復魔法等を反射させ、敵に反射させる場合
|
||
#
|
||
# --上記要領で該当のアイテム/スキルのメモ欄で反射タイプを設定し
|
||
# 反射モードについては3に設定する。
|
||
# そして、反射タイプに応じた反射率を特徴を有する項目のメモ欄で設定する。
|
||
#------------------------------------------------------------------------------
|
||
# ★反射時のダメージ倍率を設定する場合(例)
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射時倍率:30>と記入する。
|
||
# (この場合、反射時のダメージ倍率は30%となる)
|
||
#------------------------------------------------------------------------------
|
||
# ★アイテム/スキルに反射無視率を設定する場合(例)
|
||
#
|
||
# --該当のアイテム/スキルのメモ欄に<反射無視率:25>と記入する。
|
||
# (この場合、該当のアイテム/スキルの反射無視率は25%となる)
|
||
#------------------------------------------------------------------------------
|
||
# ★特徴に反射無視率を設定する場合(例)
|
||
#
|
||
# ☆通常の魔法反射に対して反射無視率を設定する場合
|
||
# --該当の特徴を有する項目のメモ欄に<特徴反射無視率:0,35>と記入する。
|
||
# (この場合、魔法攻撃扱いのアイテム/スキルの反射を35%の確率で無効)
|
||
#
|
||
# ☆特殊な反射に対して反射無視率を設定する場合
|
||
# --該当の特徴を有する項目のメモ欄に<特徴反射無視率:2,75>と記入する。
|
||
# (この場合、反射タイプ2と設定されたアイテム/スキルの反射を75%の確率で無効)
|
||
#------------------------------------------------------------------------------
|
||
# ★アイテム/スキルの反射時SEを変更する場合(例)※反射タイプが1以上の場合のみ有効
|
||
#
|
||
# --<反射時SE:Sword3,100,50>と記入する。
|
||
# (この場合、反射時、Sword3のSEが音量100、ピッチ50で演奏される)
|
||
#------------------------------------------------------------------------------
|
||
# ★アイテム/スキルの反射時メッセージを変更する場合(例)※反射タイプが1以上の場合のみ有効
|
||
#
|
||
# --<反射時TEXT:は攻撃を弾き返した!>と記入する。
|
||
# (この場合、反射時、エリックは攻撃を弾き返した!と表示される)
|
||
#------------------------------------------------------------------------------
|
||
# Ver1.01
|
||
# 反射モードを1つ追加しました。
|
||
# 反射率と反射無視率の計算方法を選べるようになりました。
|
||
# 反射ダメージを与えなかった際、ダメージ処理に不具合が起きる問題を修正しました。
|
||
# 説明文を追加/修正しました。
|
||
# Ver1.02
|
||
# 反射タイプとSE関連の設定ミスを修正しました。
|
||
#==============================================================================
|
||
module REFLECT_CHANGE
|
||
|
||
#反射モード設定用キーワードを設定します。
|
||
|
||
WORD1 = "反射モード"
|
||
|
||
#特殊反射タイプ設定用キーワードを設定します。
|
||
|
||
WORD2 = "反射タイプ"
|
||
|
||
#反射倍率設定用キーワードを設定します。
|
||
|
||
WORD3 = "反射時倍率"
|
||
|
||
#反射無視率用キーワードを設定します。
|
||
|
||
WORD4 = "反射無視率"
|
||
|
||
#特徴の各種特殊反射率キーワードを設定します。
|
||
|
||
WORD5 = "反射率"
|
||
|
||
#特徴の反射無視率用キーワードを設定します。
|
||
|
||
WORD6 = "特徴反射無視率"
|
||
|
||
#アイテム/スキルの特殊反射時SEを設定します。
|
||
|
||
WORD7 = "反射時SE"
|
||
|
||
#アイテム/スキルの特殊反射時テキストを設定します。
|
||
|
||
WORD8 = "反射時TEXT"
|
||
|
||
#デフォルトのアイテム/スキルの特殊反射時テキストを設定します。
|
||
|
||
TEXT = "%sは攻撃を跳ね返した!"
|
||
|
||
#特殊反射時のデフォルトSEを設定します。
|
||
|
||
SE_NAME = "Sword2"
|
||
|
||
#特殊反射時のデフォルトSE音量を設定します。
|
||
|
||
SE_VOLUME = 100
|
||
|
||
#特殊反射時のデフォルトSEピッチを設定します。
|
||
|
||
SE_PITCH = 100
|
||
|
||
#デフォルトの反射モードを設定します。
|
||
#0の場合は通常、1の場合は乱反射、
|
||
#2の場合は反射時効果消滅、3の場合はユニット反転反射になります。
|
||
|
||
DEFAULT_MODE = 3
|
||
|
||
#デフォルトの反射倍率を設定します。
|
||
|
||
DEFAULT_RATE = 100
|
||
|
||
#反射率と反射無視率の計算方法を設定します。
|
||
|
||
#0の場合は反射無視率の計算を行い、反射無視が成立しなかった場合に
|
||
#反射率の計算を行うようにします。
|
||
#(例.反射率200%でも反射無視率100%であれば絶対反射できない)
|
||
#1の場合は、反射率から反射無視率を差し引いた確率で実効反射率を算出します。
|
||
#(例.反射率200%であれば反射無視率100%でも差引100%で絶対反射できる)
|
||
|
||
CALC_TYPE = 0
|
||
|
||
end
|
||
class Scene_Battle < Scene_Base
|
||
#--------------------------------------------------------------------------
|
||
# 魔法反射の発動
|
||
#--------------------------------------------------------------------------
|
||
alias invoke_magic_reflection_reflect_change invoke_magic_reflection
|
||
def invoke_magic_reflection(target, item)
|
||
|
||
#反射時ダメージ倍率の設定。
|
||
|
||
$game_party.reflect_damage_check(item)
|
||
|
||
#反射モードに応じて分岐。
|
||
|
||
case item.reflect_mode
|
||
when 0#使用した敵に反射(通常処理)
|
||
|
||
invoke_magic_reflection_reflect_change(target, item)
|
||
|
||
when 1#敵ランダム反射
|
||
|
||
@log_window.display_reflection(target, item)
|
||
|
||
if @subject.actor?#使用者がアクターか?
|
||
|
||
members_size = $game_party.alive_members.size
|
||
#反射対象がいない時はダメージ倍率を初期化して処理を終了する。
|
||
if members_size == 0
|
||
#反射時ダメージ倍率の初期化。
|
||
$game_party.reflect_damage_rate = 100
|
||
return
|
||
end
|
||
n_target = $game_party.alive_members[rand(members_size)]
|
||
apply_item_effects(n_target, item)
|
||
|
||
else#使用者がエネミーか?
|
||
|
||
members_size = $game_troop.alive_members.size
|
||
#反射対象がいない時はダメージ倍率を初期化して処理を終了する。
|
||
if members_size == 0
|
||
#反射時ダメージ倍率の初期化。
|
||
$game_party.reflect_damage_rate = 100
|
||
return
|
||
end
|
||
n_target = $game_troop.alive_members[rand(members_size)]
|
||
apply_item_effects(n_target, item)
|
||
|
||
end
|
||
|
||
when 2#反射時効果消滅
|
||
|
||
@log_window.display_reflection(target, item)
|
||
$game_party.reflect_damage_rate = 100
|
||
|
||
when 3#ユニット反転ランダム反射
|
||
|
||
@log_window.display_reflection(target, item)
|
||
|
||
if target.actor?#対象がアクターか?
|
||
|
||
members_size = $game_troop.alive_members.size
|
||
#反射対象がいない時はダメージ倍率を初期化して処理を終了する。
|
||
if members_size == 0
|
||
#反射時ダメージ倍率の初期化。
|
||
$game_party.reflect_damage_rate = 100
|
||
return
|
||
end
|
||
n_target = $game_troop.alive_members[rand(members_size)]
|
||
apply_item_effects(n_target, item)
|
||
|
||
else#対象がエネミーか?
|
||
|
||
members_size = $game_party.alive_members.size
|
||
#反射対象がいない時はダメージ倍率を初期化して処理を終了する。
|
||
if members_size == 0
|
||
#反射時ダメージ倍率の初期化。
|
||
$game_party.reflect_damage_rate = 100
|
||
return
|
||
end
|
||
n_target = $game_party.alive_members[rand(members_size)]
|
||
apply_item_effects(n_target, item)
|
||
|
||
end
|
||
end
|
||
end
|
||
end
|
||
class Game_Party < Game_Unit
|
||
attr_accessor :reflect_damage_rate
|
||
#--------------------------------------------------------------------------
|
||
# 反射時ダメージ率の計算
|
||
#--------------------------------------------------------------------------
|
||
def reflect_damage_check(item)
|
||
|
||
#個別設定値を返す。
|
||
|
||
@reflect_damage_rate = item.reflect_damage_rate
|
||
|
||
end
|
||
end
|
||
class Game_Battler < Game_BattlerBase
|
||
#--------------------------------------------------------------------------
|
||
# 反射率の計算
|
||
#--------------------------------------------------------------------------
|
||
alias item_mrf_another_reflect item_mrf
|
||
def item_mrf(user, item)
|
||
|
||
case REFLECT_CHANGE::CALC_TYPE
|
||
when 0
|
||
#反射無視の場合は0を返す。
|
||
|
||
return 0 if user.ex_c_mrf(item) > rand(100)
|
||
|
||
#反射タイプに応じて分岐。
|
||
|
||
if item.reflect_type == 0#反射タイプ未設定の攻撃の場合は通常処理を行う。
|
||
return item_mrf_another_reflect(user, item)
|
||
else#反射タイプが設定してある場合はその値を返す。
|
||
return ex_mrf(item.reflect_type) * 0.01
|
||
end
|
||
|
||
when 1
|
||
|
||
#反射タイプに応じて分岐。
|
||
|
||
if item.reflect_type == 0#反射タイプ未設定の攻撃の場合は通常処理に無視率を引く。
|
||
return item_mrf_another_reflect(user, item) - (user.ex_c_mrf(item) * 0.01)
|
||
else#反射タイプが設定してある場合はその値を返し、無視率を引く。
|
||
return (ex_mrf(item.reflect_type) - user.ex_c_mrf(item))* 0.01
|
||
end
|
||
|
||
end
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 特殊反射率の計算
|
||
#--------------------------------------------------------------------------
|
||
def ex_mrf(type)
|
||
|
||
#初期データを作成。
|
||
|
||
data = 0
|
||
|
||
#各特徴の該当タイプに対する反射率を計算する。
|
||
|
||
feature_objects.each do |f|
|
||
data += f.ex_mrf[type] if f.ex_mrf[type] != nil
|
||
end
|
||
|
||
#反射率を返す。
|
||
|
||
return data
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 反射無視率の計算
|
||
#--------------------------------------------------------------------------
|
||
def ex_c_mrf(item)
|
||
|
||
#初期データを作成。
|
||
|
||
data = 0
|
||
|
||
#アイテム/スキルの反射タイプを取得。
|
||
|
||
type = item.reflect_type
|
||
|
||
#各特徴の該当タイプに対する反射無視率を計算する。
|
||
|
||
feature_objects.each do |f|
|
||
data += f.ex_c_mrf2[type] if f.ex_c_mrf2[type] != nil
|
||
end
|
||
|
||
#アイテム/スキル固有の反射率を加算。
|
||
|
||
data += item.ex_c_mrf1
|
||
|
||
#反射率を返す。
|
||
|
||
return data
|
||
end
|
||
end
|
||
class Game_ActionResult
|
||
#--------------------------------------------------------------------------
|
||
# ダメージ値の作成
|
||
#--------------------------------------------------------------------------
|
||
alias make_damage_reflect_change make_damage
|
||
def make_damage(value, item)
|
||
|
||
#反射時ダメージ倍率未設定の場合は100を返す。
|
||
|
||
$game_party.reflect_damage_rate = 100 if $game_party.reflect_damage_rate == nil
|
||
|
||
#反射ダメージ率が100以外の場合はダメージに反映。
|
||
|
||
if $game_party.reflect_damage_rate != 100
|
||
value *= $game_party.reflect_damage_rate
|
||
value /= 100
|
||
end
|
||
|
||
#本来の処理を実行する。
|
||
|
||
make_damage_reflect_change(value, item)
|
||
|
||
#反射ダメージ率を初期化する。
|
||
|
||
$game_party.reflect_damage_rate = 100
|
||
|
||
end
|
||
end
|
||
class RPG::UsableItem < RPG::BaseItem
|
||
#--------------------------------------------------------------------------
|
||
# 反射モード
|
||
#--------------------------------------------------------------------------
|
||
def reflect_mode
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @reflect_mode if @reflect_mode != nil
|
||
|
||
#メモ欄からデータを取得する。
|
||
|
||
memo = self.note.scan(/<#{REFLECT_CHANGE::WORD1}[::](\S+)>/).flatten
|
||
|
||
#データを取得出来無かった場合は0を返す。
|
||
|
||
@reflect_mode = (memo != nil && !memo.empty?) ? memo[0].to_i : REFLECT_CHANGE::DEFAULT_MODE
|
||
|
||
#データを返す。
|
||
|
||
return @reflect_mode
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 反射タイプ
|
||
#--------------------------------------------------------------------------
|
||
def reflect_type
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @reflect_type if @reflect_type != nil
|
||
|
||
#メモ欄からデータを取得する。
|
||
|
||
memo = self.note.scan(/<#{REFLECT_CHANGE::WORD2}[::](\S+)>/).flatten
|
||
|
||
#データを取得出来無かった場合はデフォルトの値を返す。
|
||
|
||
@reflect_type = (memo != nil && !memo.empty?) ? memo[0].to_i : 0
|
||
|
||
#データを返す。
|
||
|
||
return @reflect_type
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 反射ダメージ率
|
||
#--------------------------------------------------------------------------
|
||
def reflect_damage_rate
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @reflect_damage_rate if @reflect_damage_rate != nil
|
||
|
||
#メモ欄からデータを取得する。
|
||
|
||
memo = self.note.scan(/<#{REFLECT_CHANGE::WORD3}[::](\S+)>/).flatten
|
||
|
||
#データを取得出来無かった場合はデフォルトの値を返す。
|
||
|
||
@reflect_damage_rate = (memo != nil && !memo.empty?) ? memo[0].to_i : REFLECT_CHANGE::DEFAULT_RATE
|
||
|
||
#データを返す。
|
||
|
||
return @reflect_damage_rate
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 反射無視率
|
||
#--------------------------------------------------------------------------
|
||
def ex_c_mrf1
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @ex_c_mrf1 if @ex_c_mrf1 != nil
|
||
|
||
#メモ欄からデータを取得する。
|
||
|
||
memo = self.note.scan(/<#{REFLECT_CHANGE::WORD4}[::](\S+)>/).flatten
|
||
|
||
#データを取得出来無かった場合はデフォルトの値を返す。
|
||
|
||
@ex_c_mrf1 = (memo != nil && !memo.empty?) ? memo[0].to_i : 0
|
||
|
||
#データを返す。
|
||
|
||
return @ex_c_mrf1
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 特殊反射SE
|
||
#--------------------------------------------------------------------------
|
||
def r_se_data
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @r_se_data if @r_se_data != nil
|
||
|
||
#メモ欄からデータを取得する。
|
||
|
||
memo = self.note.scan(/<#{REFLECT_CHANGE::WORD7}[::](\S+),(\S+),(\S+)>/).flatten
|
||
|
||
#データを取得出来無かった場合はfalseを返す。
|
||
|
||
@r_se_data = (memo != nil && !memo.empty? && memo.size == 3) ? [memo[0], memo[1].to_i,memo[2].to_i] : false
|
||
|
||
#データを返す。
|
||
|
||
return @r_se_data
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 特殊反射時テキスト
|
||
#--------------------------------------------------------------------------
|
||
def r_se_text
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @r_se_text if @r_se_text != nil
|
||
|
||
#メモ欄からデータを取得する。
|
||
|
||
memo = self.note.scan(/<#{REFLECT_CHANGE::WORD8}[::](\S+)>/).flatten
|
||
|
||
#データを取得出来無かった場合はデフォルトの値を返す。
|
||
|
||
@r_se_text = (memo != nil && !memo.empty?) ? "%s" + memo[0] : false
|
||
|
||
#データを返す。
|
||
|
||
return @r_se_text
|
||
end
|
||
end
|
||
class RPG::BaseItem
|
||
#--------------------------------------------------------------------------
|
||
# 特徴別の特殊反射率
|
||
#--------------------------------------------------------------------------
|
||
def ex_mrf
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @ex_mrf if @ex_mrf != nil
|
||
|
||
#ハッシュを生成する。
|
||
|
||
@ex_mrf = {}
|
||
|
||
#メモ欄から反射率を設定する。
|
||
|
||
self.note.each_line do |l|
|
||
data = l.scan(/<#{REFLECT_CHANGE::WORD5}[::](\S+),(\S+)>/).flatten
|
||
if data[0] != nil && !data[0].empty? && data.size == 2
|
||
@ex_mrf[data[0].to_i] = 0 if @ex_mrf[data[0].to_i] == nil
|
||
@ex_mrf[data[0].to_i] += data[1].to_i
|
||
end
|
||
end
|
||
|
||
#反射率を返す。
|
||
|
||
return @ex_mrf
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# 特徴別の反射無視率
|
||
#--------------------------------------------------------------------------
|
||
def ex_c_mrf2
|
||
|
||
#キャッシュがある場合はキャッシュを返す。
|
||
|
||
return @ex_c_mrf2 if @ex_c_mrf2 != nil
|
||
|
||
#ハッシュを生成する。
|
||
|
||
@ex_c_mrf2 = {}
|
||
|
||
#メモ欄から特徴別の反射無視率を設定する。
|
||
|
||
self.note.each_line do |l|
|
||
data = l.scan(/<#{REFLECT_CHANGE::WORD6}[::](\S+),(\S+)>/).flatten
|
||
if data[0] != nil && !data[0].empty? && data.size == 2
|
||
@ex_c_mrf2[data[0].to_i] = 0 if @ex_c_mrf2[data[0].to_i] == nil
|
||
@ex_c_mrf2[data[0].to_i] += data[1].to_i
|
||
end
|
||
end
|
||
|
||
#特徴別の反射無視率を返す。
|
||
|
||
return @ex_c_mrf2
|
||
end
|
||
end
|
||
class Window_BattleLog < Window_Selectable
|
||
#--------------------------------------------------------------------------
|
||
# 反射の表示
|
||
#--------------------------------------------------------------------------
|
||
alias display_reflection_reflect_change display_reflection
|
||
def display_reflection(target, item)
|
||
|
||
#反射タイプが0の場合は通常の処理を行う。
|
||
|
||
if item.reflect_type == 0
|
||
display_reflection_reflect_change(target, item)
|
||
else
|
||
|
||
if item.r_se_data != false#反射SEが設定されている場合
|
||
|
||
#設定情報に基づきSEを生成し、演奏する。
|
||
|
||
RPG::SE.new(
|
||
item.r_se_data[0],
|
||
item.r_se_data[1],
|
||
item.r_se_data[2]).play
|
||
|
||
else#反射SEが設定されていない場合
|
||
|
||
#デフォルト設定に基づきSEを生成し、演奏する。
|
||
|
||
RPG::SE.new(
|
||
REFLECT_CHANGE::SE_NAME,
|
||
REFLECT_CHANGE::SE_VOLUME,
|
||
REFLECT_CHANGE::SE_PITCH).play
|
||
|
||
end
|
||
if item.r_se_text != false#反射時テキストが設定されていない場合
|
||
add_text(sprintf(item.r_se_text, target.name))#設定情報に基づきテキストを生成。
|
||
else#反射時テキストが設定されている場合
|
||
add_text(sprintf(REFLECT_CHANGE::TEXT, target.name))#デフォルト設定に基づきテキストを生成。
|
||
end
|
||
wait
|
||
back_one
|
||
end
|
||
end
|
||
end |