S
P
戦
闘
不
能
概要
『ス○ー○ーシャ○3』のように、SPが無くなった場合も戦闘不能扱いになります。
スクリーンショット
HPは満タンなのに皆さん死亡。
更新履歴
2009/08/23
≪ステートアイコン表示≫ に対応。
2005/04/11
処理を多少効率化。
他サイトとの併用性向上。
2005/03/15
SPで死んだ場合は全滅にならないバグを修正。
2005/03/13
新規作成。
スクリプト
KGC_SPDeath
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ SP戦闘不能 - KGC_SPDeath ◆ #_/ ◇ Last update : 2009/08/23 ◇ #_/---------------------------------------------------------------------------- #_/ SPが0になったときも戦闘不能扱いになります。 #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ $imported = {} if $imported == nil $imported["SPDeath"] = true #============================================================================== # ■ RPG::State #============================================================================== class RPG::State #-------------------------------------------------------------------------- # ● 名前の取得 #-------------------------------------------------------------------------- def name return @name.gsub(/\[.*\]/) {""} end #-------------------------------------------------------------------------- # ● オリジナル名取得 #-------------------------------------------------------------------------- def original_name return @name end #-------------------------------------------------------------------------- # ● SP戦闘不能判定 #-------------------------------------------------------------------------- def zero_sp return @name =~ /\[SP0\]/i end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_Battler (分割定義 1) #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● HP の変更 # hp : 新しい HP #-------------------------------------------------------------------------- def hp=(hp) @hp = [[hp, maxhp].min, 0].max # 戦闘不能を付加または解除 for i in 1...$data_states.size next unless $data_states[i].zero_hp if self.hp0? add_state(i) else remove_state(i) end end end #-------------------------------------------------------------------------- # ● SP の変更 # sp : 新しい SP #-------------------------------------------------------------------------- def sp=(sp) @sp = [[sp, maxsp].min, 0].max # SP戦闘不能を付加または解除 if self.maxsp > 0 for i in 1...$data_states.size next unless $data_states[i].zero_sp if self.sp0? add_state(i) else remove_state(i) end end end end #-------------------------------------------------------------------------- # ● 戦闘不能判定 #-------------------------------------------------------------------------- def dead? return (@hp == 0 || (self.maxsp > 0 && @sp == 0)) && !@immortal end #-------------------------------------------------------------------------- # ● 存在判定 #-------------------------------------------------------------------------- def exist? return !@hidden && ((@hp > 0 && self.maxsp > 0 && @sp > 0) || @immortal) end #-------------------------------------------------------------------------- # ● SP 0 判定 #-------------------------------------------------------------------------- def sp0? return !@hidden && self.maxsp > 0 && @sp == 0 end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_Battler (分割定義 2) #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● ステートの付加 # state_id : ステート ID # force : 強制付加フラグ (オートステートの処理で使用) #-------------------------------------------------------------------------- alias add_state_KGC_SPDeath add_state def add_state(state_id, force = false) return if $data_states[state_id] == nil unless force for i in @states if $data_states[i].minus_state_set.include?(state_id) && !$data_states[state_id].minus_state_set.include?(i) return end end end # このステートが付加されていない場合 unless state?(state_id) # SP戦闘不能効果を持つ場合 if $data_states[state_id].zero_sp # SP を 0 に変更 @sp = 0 end end # 元の処理を実行 add_state_KGC_SPDeath(state_id, force) end #-------------------------------------------------------------------------- # ● ステートの解除 # state_id : ステート ID # force : 強制解除フラグ (オートステートの処理で使用) #-------------------------------------------------------------------------- alias remove_state_KGC_SPDeath remove_state def remove_state(state_id, force = false) # このステートが付加されている場合 if state?(state_id) # 強制付加されたステートで、かつ解除が強制ではない場合は戻る return if @states_turn[state_id] == -1 && !force # 現在の SP が 0 かつ SP戦闘不能効果を持つ場合 if @sp == 0 && $data_states[state_id].zero_sp # 他にSP戦闘不能効果を持つステートがあるかどうか判定 zero_sp = false for i in @states zero_sp = true if i != state_id && $data_states[i].zero_sp end # SP戦闘不能を解除してよければ、SP を 1 に変更 @sp = 1 unless zero_sp end end # 元の処理を実行 remove_state_KGC_SPDeath(state_id, force) end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_Battler (分割定義 3) #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● アイテムの効果適用 # item : アイテム #-------------------------------------------------------------------------- alias item_effect_KGC_SPDeath item_effect def item_effect(item) # 対象が戦闘不能の味方で、SP回復量が設定されている場合 if (item.scope == 5 || item.scope === 6) && (item.recover_sp_rate > 0 || item.recover_sp > 0) # クリティカルフラグをクリア self.critical = false # 自分が生存している場合は戻る unless dead? return false end # 有効フラグをクリア effective = false # コモンイベント ID が有効の場合は有効フラグをセット effective |= item.common_event_id > 0 # 命中判定 hit_result = (rand(100) < item.hit) # 不確実なスキルの場合は有効フラグをセット effective |= item.hit < 100 # 命中の場合 if hit_result # 回復量を計算 recover_hp = maxhp * item.recover_hp_rate / 100 + item.recover_hp recover_sp = maxsp * item.recover_sp_rate / 100 + item.recover_sp # 属性修正 recover_hp *= elements_correct(item.element_set) recover_hp /= 100 recover_sp *= elements_correct(item.element_set) recover_sp /= 100 # 分散 if item.variance > 0 and recover_hp.abs > 0 amp = [recover_hp.abs * item.variance / 100, 1].max recover_hp += rand(amp+1) + rand(amp+1) - amp end if item.variance > 0 and recover_sp.abs > 0 amp = [recover_sp.abs * item.variance / 100, 1].max recover_sp += rand(amp+1) + rand(amp+1) - amp end # HP 回復量の符号を反転し、ダメージの値に設定 self.damage = -recover_hp # HP および SP を回復 last_hp = self.hp last_sp = self.sp self.hp += recover_hp self.sp += recover_sp effective |= self.hp != last_hp effective |= self.sp != last_sp # ステート変化 @state_changed = false effective |= states_plus(item.plus_state_set) effective |= states_minus(item.minus_state_set) # パラメータ上昇値が有効の場合 if item.parameter_type > 0 and item.parameter_points != 0 # パラメータで分岐 case item.parameter_type when 1 # MaxHP @maxhp_plus += item.parameter_points when 2 # MaxSP @maxsp_plus += item.parameter_points when 3 # 腕力 @str_plus += item.parameter_points when 4 # 器用さ @dex_plus += item.parameter_points when 5 # 素早さ @agi_plus += item.parameter_points when 6 # 魔力 @int_plus += item.parameter_points end # 有効フラグをセット effective = true end # HP 回復率と回復量が 0 の場合 if item.recover_hp_rate == 0 and item.recover_hp == 0 # ダメージに空文字列を設定 self.damage = "" # SP 回復率と回復量が 0、パラメータ上昇値が無効の場合 if item.recover_sp_rate == 0 and item.recover_sp == 0 and (item.parameter_type == 0 or item.parameter_points == 0) # ステートに変化がない場合 unless @state_changed # ダメージに "Miss" を設定 self.damage = "Miss" end end end # ミスの場合 else # ダメージに "Miss" を設定 self.damage = "Miss" end # 戦闘中でない場合 unless $game_temp.in_battle # ダメージに nil を設定 self.damage = nil end # メソッド終了 return effective end return item_effect_KGC_SPDeath(item) end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_Party #============================================================================== class Game_Party #-------------------------------------------------------------------------- # ● 全滅判定 #-------------------------------------------------------------------------- def all_dead? # パーティ人数が 0 人の場合 return false if self.actors.size == 0 # 誰かが生存している場合 for actor in self.actors return false unless actor.dead? end # 全滅 return true end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Window_Base #============================================================================== unless $imported["StateIcon"] class Window_Base < Window #-------------------------------------------------------------------------- # ● ステートの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_state(actor, x, y, width = 120) text = make_battler_state_text(actor, width, true) self.contents.font.color = actor.dead? ? knockout_color : normal_color self.contents.draw_shadow_text(x, y, width, 32, text) end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_Battle (分割定義 4) #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● スキルまたはアイテムの対象側バトラー設定 # scope : スキルまたはアイテムの効果範囲 #-------------------------------------------------------------------------- alias set_target_battlers_KGC_SPDeath set_target_battlers def set_target_battlers(scope) # 行動側バトラーがアクターの場合 if @active_battler.is_a?(Game_Actor) # 効果範囲で分岐 case scope when 5 # 味方単体 (HP 0) index = @active_battler.current_action.target_index actor = $game_party.actors[index] @target_battlers << actor if actor != nil && actor.dead? return when 6 # 味方全体 (HP 0) for actor in $game_party.actors @target_battlers << actor if actor != nil && actor.dead? end return end end # 元の処理を実行 set_target_battlers_KGC_SPDeath(scope) end end
使用法
ステート名[SP0]
というステートを作成します。(<例>
戦闘不能[SP0]
)
このステートは「HP 0 の状態とみなす」と同様の効果を持ち、SPが 0 になった際に自動的に付加されます。
逆にこのステートを付加した場合、SPが 0 になり死亡します。
SPによる戦闘不能を解除する場合は、HPによる戦闘不能を解除する場合とは逆に「SP回復率(量)」を指定します。
そして「効果範囲」をHP0の味方にし、「ステート変化」で
〜[SP0]
を解除するように設定すればOKです。