rebf-gaiden/Scripts/RGSS3_.rb
2025-04-26 17:06:34 -05:00

413 lines
No EOL
17 KiB
Ruby
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#==============================================================================
# ■ RGSS3 アイテム・スキル使用者ステート・能力変化 Ver2.00 by 星潟
#------------------------------------------------------------------------------
# アイテム・スキル使用前後に使用者へステート・能力強化/弱体を付与/解除します。
#------------------------------------------------------------------------------
# ★使用例(付与の場合)
#
# アイテム・スキルのメモ欄に
# <使用者ステート:2,50>
# ……と書き込む事で、50の確率で2の番号のステートが付与されます。
# 数字の部分を変える事で付与されるステートや確率を変える事が出来ます。
#
# アイテム・スキルのメモ欄に
# <使用者強化:2,5,7,25>
# ……と書き込む事で、25の確率で
# 攻撃力強化が5段階分付与され、7ターン持続します。
#
# アイテム・スキルのメモ欄に
# <使用者弱体:3,2,4,75>
# ……と書き込む事で、75の確率で
# 防御力弱体が2段階分付与され、4ターン持続します。
#
# つまり、ステートの場合設定数時は1つで、ステート番号を指し
# 能力強化・弱体の場合は、最初の数字が能力の番号、
# 2番目の数字が変化する段階、3番目の数字が持続ターン数という事です。
# <使用者ステート:2>、<使用者強化:2,5,7>、<使用者弱体:3,2,4> 等。
# 確率部分を省略する事も出来ます。その場合は100として扱われます
#------------------------------------------------------------------------------
# ★使用例(解除の場合)
#
# アイテム・スキルのメモ欄に
# <使用者ステート解除:4,75>
# ……と書き込む事で、75の確率でID4のステートが解除されます。
# 数字の部分を変える事で付与されるステートや確率を変える事が出来ます。
#
# アイテム・スキルのメモ欄に
# <使用者強化解除:0,33>
# ……と書き込む事で、33の確率で最大HP強化が解除されます。
#
# アイテム・スキルのメモ欄に
# <使用者弱体解除:1,90>
# ……と書き込む事で、90の確率で最大MP弱体が解除されます。
#
# つまり、ステート・能力強化/弱体解除共通で、最初の値で効果を指定し
# 2番目の数字で確率を指定します。
# <使用者ステート:2>、<使用者強化:2,5,7>、<使用者弱体:3,2,4> 等。
# 確率部分を省略する事も出来ます。その場合は100として扱われます
#------------------------------------------------------------------------------
# ※強化・弱体はスクリプトで拡張していない限り、通常2段階分しか存在しません。
#------------------------------------------------------------------------------
# 能力値の番号はそれぞれ以下のように設定されています。
#
# 0……最大HP
# 1……最大MP
# 2……攻撃力
# 3……防御力
# 4……魔法力
# 5……魔法防御
# 6……敏捷性
# 7……運
#
# なお、8以上の数値を入れるとエラーを吐きます。
#
# 行を分けてそれぞれ設定する事で複数のステートを設定する事が出来ます。
# なお、戦闘不能・逃走(隠れている状態)状態では付与/解除されません。
# (戦闘不能ステートも付与する事が出来ますが
# 戦闘不能ステートが付与された時点で
# 以降のステート付与・能力強化・能力弱体は全てスキップされます)
#------------------------------------------------------------------------------
# それぞれ、キーワードの前に発動前と記入する事で
# スキルのターゲットに効果が発生する前に使用者に効果を与える事が出来ます。
# 例.<発動前使用者ステート:2,50>
# 行動前に50の確率で2の番号のステートが付与されます。
#------------------------------------------------------------------------------
# Ver2.00
# - 全体的に処理を見直しました。
# - アイテム画面やスキル画面でも効果を発揮するように機能を拡張しました。
# - スキル発動後だけでなく、発動前に効果を発生させる機能を追加しました。
# - ステートや強化・弱体の付与/解除の確率部分や
# 強化・弱体の段階やターン数の部分にスクリプト文が使えるようになりました。
# (ただしスペースが使えないので注意)
#==============================================================================
module ChangeSelfState
#空のハッシュを用意。(後で使用・変更しないでください)
W = {}
#空の配列を用意。(変更しないでください)
WF = []
#ステート付与用のメモ欄用設定ワードを設定します。
WF[0] = "使用者ステート"
#能力強化付与用のメモ欄用設定ワードを設定します。
WF[1] = "使用者強化"
#能力弱体付与用のメモ欄用設定ワードを設定します。
WF[2] = "使用者弱体"
#ステート解除用のメモ欄用設定ワードを設定します。
WF[3] = "使用者ステート解除"
#能力強化解除用のメモ欄用設定ワードを設定します。
WF[4] = "使用者強化解除"
#能力弱体解除用のメモ欄用設定ワードを設定します。
WF[5] = "使用者弱体解除"
#発動前化の為の追加キーワードを設定します。
BW = "発動前"
#既にそのステートが付与されている場合もステートを再度付与するかを設定します。
#trueにした場合、効果時間を上書きします。
#falseにした場合、処理をスキップします。
R_ADN1 = true
#既にその強化や弱体が最大まで付与されている場合も付与するかを設定します。
#trueにした場合、効果時間を上書きします。
#falseにした場合、処理をスキップします。
R_ADN2 = true
#使用者ステート・能力強化/弱体の付与及び解除が発生した際に
#メッセージウィンドウに表示するかどうかを設定します。
#trueで表示、falseで非表示です。
MESSDS = true
#発動前に付与効果が発生した場合のウェイトを設定。
WAIT = 15
#発動前化のキーワードも含めたキーワード配列を作成。
WF.each_with_index {|t,i| W[i] = BW + t;W[i + 6] = t}
end
class Scene_Base
#--------------------------------------------------------------------------
# 使用者ステート付与
#--------------------------------------------------------------------------
def self_is_state_a(user, id ,type)
return if !user.state_addable?(id)
return if $data_states[id].restriction > 0 && type
user.add_state(id)
user.perform_collapse_effect if user.death_state?
if ChangeSelfState::MESSDS
begin
wait(ChangeSelfState::WAIT) if type
refresh_status
@log_window.display_added_states(user)
wait(ChangeSelfState::WAIT) unless type
rescue
end
end
user.result.added_states = []
end
#--------------------------------------------------------------------------
# 使用者強化付与
#--------------------------------------------------------------------------
def self_is_buff_a(user, id, level, turn ,type)
n = eval(level).to_i
return unless n > 0
t = [eval(turn),1].max
n.times { user.add_buff(id, t);break if user.buff_max?(id)}
if ChangeSelfState::MESSDS && user.result.added_buffs.include?(id)
begin
wait(ChangeSelfState::WAIT) if type
refresh_status
@log_window.display_buffs(user, [id], Vocab::BuffAdd)
wait(ChangeSelfState::WAIT) unless type
rescue
end
end
user.result.added_buffs.delete(id)
user.result.removed_buffs.delete(id)
end
#--------------------------------------------------------------------------
# 使用者弱体付与
#--------------------------------------------------------------------------
def self_is_debuff_a(user, id, level, turn ,type)
n = eval(level).to_i
return unless n > 0
t = [eval(turn),1].max
n.times { user.add_debuff(id, t);break if user.debuff_max?(id)}
if ChangeSelfState::MESSDS && user.result.added_debuffs.include?(id)
begin
wait(ChangeSelfState::WAIT) if type
refresh_status
@log_window.display_buffs(user, [id], Vocab::DebuffAdd)
wait(ChangeSelfState::WAIT) unless type
rescue
end
end
user.result.added_debuffs.delete(id)
user.result.removed_buffs.delete(id)
end
#--------------------------------------------------------------------------
# 使用者ステート解除
#--------------------------------------------------------------------------
def self_is_state_r(user, id ,type)
user.remove_state(id)
if ChangeSelfState::MESSDS && user.result.removed_states.include?(id)
begin
wait(ChangeSelfState::WAIT) if type
refresh_status
@log_window.display_removed_states(user)
wait(ChangeSelfState::WAIT) unless type
rescue
end
end
user.result.removed_states = []
end
#--------------------------------------------------------------------------
# 使用者強化解除
#--------------------------------------------------------------------------
def self_is_buff_r(user, id ,type)
user.remove_buff(id)
if ChangeSelfState::MESSDS && user.result.removed_buffs.include?(id)
begin
wait(ChangeSelfState::WAIT) if type
refresh_status
@log_window.display_buffs(user, [id], Vocab::BuffRemove)
wait(ChangeSelfState::WAIT) unless type
rescue
end
end
user.result.removed_buffs.delete(id)
end
#--------------------------------------------------------------------------
# 使用者弱体解除
#--------------------------------------------------------------------------
def self_is_debuff_r(user, id ,type)
user.remove_buff(id)
if ChangeSelfState::MESSDS && user.result.removed_buffs.include?(id)
begin
wait(ChangeSelfState::WAIT) if type
refresh_status
@log_window.display_buffs(user, [id], Vocab::BuffRemove)
wait(ChangeSelfState::WAIT) unless type
rescue
end
end
user.result.removed_buffs.delete(id)
end
#--------------------------------------------------------------------------
# ログ追加モード切り替え
#--------------------------------------------------------------------------
def log_add_mode(type)
end
#--------------------------------------------------------------------------
# ログ行数取得
#--------------------------------------------------------------------------
def afterstate_line_number_get
0
end
#--------------------------------------------------------------------------
# ログ行数巻き戻し
#--------------------------------------------------------------------------
def afterstate_log_return(n)
end
#--------------------------------------------------------------------------
# ログ消去
#--------------------------------------------------------------------------
def afterstate_log_clear
end
end
class Scene_ItemBase < Scene_MenuBase
#--------------------------------------------------------------------------
# アイテムをアクターに対して使用
#--------------------------------------------------------------------------
alias use_item_to_actors_afterstate use_item_to_actors
def use_item_to_actors
use_item_to_actors_afterstate
user.ba_item_self_effect(item,false)
end
end
class Scene_Battle < Scene_Base
#--------------------------------------------------------------------------
# スキル/アイテムの使用
#--------------------------------------------------------------------------
alias use_item_afterstate use_item
def use_item
i = @subject.current_action.item
use_item_afterstate
return if @subject == nil or !@subject.alive?
@subject.result.clear_status_effects
@subject.ba_item_self_effect(i,false)
end
#--------------------------------------------------------------------------
# ターン終了
#--------------------------------------------------------------------------
alias turn_end_delete_action_result turn_end
def turn_end
turn_end_delete_action_result
all_battle_members.each {|m| m.result.clear}
end
#--------------------------------------------------------------------------
# ログ追加モード切り替え
#--------------------------------------------------------------------------
def log_add_mode(type)
@log_window.log_add_mode = type
end
#--------------------------------------------------------------------------
# ログ行数取得
#--------------------------------------------------------------------------
def afterstate_line_number_get
@log_window.line_number
end
#--------------------------------------------------------------------------
# ログ行数巻き戻し
#--------------------------------------------------------------------------
def afterstate_log_return(n)
wait(ChangeSelfState::WAIT)
@log_window.back_to(n)
end
#--------------------------------------------------------------------------
# ログ消去
#--------------------------------------------------------------------------
def afterstate_log_clear
@log_window.clear
end
end
class Window_BattleLog < Window_Selectable
attr_accessor :log_add_mode
#--------------------------------------------------------------------------
# 文章の置き換え
#--------------------------------------------------------------------------
alias replace_text_change_add replace_text
def replace_text(text)
@log_add_mode ? add_text(text) : replace_text_change_add(text)
end
end
class Game_Battler < Game_BattlerBase
#--------------------------------------------------------------------------
# スキル/アイテムの使用
#--------------------------------------------------------------------------
alias use_item_afterstate use_item
def use_item(item)
use_item_afterstate(item)
ba_item_self_effect(item,true)
end
#--------------------------------------------------------------------------
# 使用者効果適用
#--------------------------------------------------------------------------
def ba_item_self_effect(item, type)
h = item.change_self_state
begin
SceneManager.scene.afterstate_log_clear if !type && [6,7,8,9,10,11].any? {|i| !h[i].empty?}
ln1 = SceneManager.scene.afterstate_line_number_get
rescue
end
SceneManager.scene.log_add_mode(true)
h[0 + (type ? 0 : 6)].each {|e|
next if !ChangeSelfState::R_ADN1 && state?(e[0])
SceneManager.scene.self_is_state_a(self, e[0] ,type) if eval(e[1]) > rand(100)}
return unless alive?
h[1 + (type ? 0 : 6)].each {|e|
next if !ChangeSelfState::R_ADN2 && buff_max?(e[0])
SceneManager.scene.self_is_buff_a(self, e[0], e[1], e[2] ,type) if eval(e[3]) > rand(100)}
h[2 + (type ? 0 : 6)].each {|e|
next if !ChangeSelfState::R_ADN2 && debuff_max?(e[0])
SceneManager.scene.self_is_debuff_a(self, e[0], e[1], e[2] ,type) if eval(e[3]) > rand(100)}
h[3 + (type ? 0 : 6)].each {|e|
SceneManager.scene.self_is_state_r(self, e[0] ,type) if state?(e[0]) && eval(e[1]) > rand(100)}
h[4 + (type ? 0 : 6)].each {|e|
SceneManager.scene.self_is_buff_r(self, e[0] ,type) if buff?(e[0]) && eval(e[1]) > rand(100)}
h[5 + (type ? 0 : 6)].each {|e|
SceneManager.scene.self_is_debuff_r(self, e[0] ,type) if debuff?(e[0]) && eval(e[1]) > rand(100)}
SceneManager.scene.log_add_mode(nil)
begin
SceneManager.scene.afterstate_log_return(ln1) if ln1 != SceneManager.scene.afterstate_line_number_get
rescue
end
end
end
class RPG::UsableItem < RPG::BaseItem
#--------------------------------------------------------------------------
# 使用者効果
#--------------------------------------------------------------------------
def change_self_state
@change_self_state ||= create_change_self_state
end
#--------------------------------------------------------------------------
# 使用者効果ハッシュ作成
#--------------------------------------------------------------------------
def create_change_self_state
h = {}
12.times {|i| h[i] = []}
self.note.each_line do |l|
12.times {|i| t = /<#{ChangeSelfState::W[i]}[:](\S+)>/ =~ l ? $1.to_s : ""
next if t.empty?
a = t.split(/\s*,\s*/)
case i % 6
when 1..2;d = [a[0].to_i,a[1].to_s,a[2].to_s,a[3] ? a[3].to_s : "100"] if a.size > 2
else;d = [a[0].to_i,a[1] ? a[1].to_s : "100"] unless a.empty?
end
h[i].push(d)}
end
h
end
end