#============================================================================== # # ■ステート歩数解除&スリップダメージ □Ver1.00 □製作者:月紳士 # # ・RPGツクールVX用 RGSS2スクリプト # # ※二次配布禁止!配布元には利用規約があります。必ずそちらを見てください。 #------------------------------------------------------------------------------ =begin  このスクリプトは、歩数で解除されるステートと、  ダメージゾーンおよびステートによるスリップダメージの機能を  導入するスクリプトです。 -- ○ステートの歩行解除 ----------------------------------------------------   ステートのメモ欄に <歩数解除:10>   と記入すると、そのステートは指定した数歩くと   メッセージと共に解除されるようになります。   10 の部分が指定歩数です。この例だと10歩目で解除されます。 <歩数解除:10/50>   と拡張して記入すると、歩数指定を平均歩数とした分散度で設定できます。   50 の部分が分散度で、1〜100%で指定します。 指定した%分、平均歩数より多くなったり少なくなったりします。   この例だと、10歩の50%、つまり5歩分のぶれが生じる為、 5〜15歩の内のランダムで解除されます。平均は10歩です。 -- ○スリップダメージ ------------------------------------------------------   スリップダメージは、スリップダメージ・データ の項目で設定されています。 項目、形式を守ることで、内容を変更したり、数を増やしたり出来ます。 @tile_id を設定すると、プレイヤーキャラクターがそのタイルに乗った際に 指定したスリップダメージを受ける、“ダメージゾーン”を作ることが出来ます。 (tile_idについては他所で検索して調べてください) また、設定したスリップダメージは、ステートにも設定することが出来ます。 ステートのメモ欄に <スリップダメージ:毒>   と書くと、そのステートにかかったキャラクターのみ歩行毎ダメージを受けます。   毒 の部分はスリップダメージの @name 名前です。設定した名前を記入します。 <スリップ無効:毒>   と記入すると、同名のスリップダメージを無効化するステートが作れます。   ※ この記入は、装備品に記入して機能させることも可能です。      ステートによるスリップダメージの場合は、   @blank_step を設定することで効果に間隔を持たせることも出来ます。   その他、戦闘時のスリップダメージ処理も、個別に設定出来ます。   詳しくはカスタマイズ項目を参照してください。 =end module Step_And_Slip #============================================================================== # ▽ ステート歩数解除&スリップダメージ・カスタマイズ項目 #============================================================================== REMOVE_WINDOW_STATUS = [0, 2] #→# 歩数解除ステートの解除メッセージが設定されている際の表示方法です。 # = [背景, 表示位置] で設定します。 # 背景 (0:通常 1:暗くする 2:透明) / 表示位置 (0:上 1:中 2:下) SLIP_DAMAGE_ALL_DEAD_MESSAGE = "%sは力尽きた…" #→# マップ上にてスリップダメージやダメージゾーンが原因で # パーティが全滅した際に表示するテキストです。 SLIP_DAMAGE_BATTLE_MESSAGE = "%sは%sの影響を受けた!" #→# 戦闘中にスリップダメージを受けた際に表示するテキストです。 # 最初の %s にターゲットの名前、 # 次の %s にスリップダメージの名前が代入されます。 # 専用の戦闘メッセージが設定されている場合はそちらが使われます。 #-------------------------------------------------------------------------- # ○ スリップダメージ・データ #-------------------------------------------------------------------------- # <各項目説明> # @name # スリップダメージの名前。必須項目。 # # ----フィールド用項目---- # @tile_id # 発動の条件になるタイルID。複数設定可能。 # @hp_damage # フィールド上でのHPへのダメージの設定。 # # [ダメージ量, 計算方式, 戦闘不能の許可] の順に設定。 # # 計算方式 (0:定数 1:現在HP対% 2:最大HP対%) # # 戦闘不能の許可 (0:許可しない 1:許可する) # @mp_damage # フィールド上でのMPへのダメージの設定。 # # [ダメージ量, 計算方式] の順に設定。 # # 計算方式 (0:定数 1:現在MP対% 2:最大MP対%) # @blank_step # ステート時のダメージ間隔。指定歩数置きにダメージ。 # @slip_se # [SE の名前, ボリューム, ピッチ]の順に設定。 # @slip_flash # [赤, 緑, 青, 強さ, 時間] の順に設定。 # # ----- 戦闘時用項目 ----- # @hp_damage_battle # 戦闘中のHPへのダメージ。設定は@hp_damageと同じ。 # @mp_damage_battle # 戦闘中のMPへのダメージ。設定は@mp_damageと同じ。 # @battle_message # 専用の戦闘メッセージ。文章に含む %s はひとつで、 # # ターゲットの名前が代入されるようになっています。 # # 例) = "%sは毒のダメージを受けた!" # @remove_states_shock # このスリップによるHPダメージ時に、付加されている # # 他ステートの“衝撃によるステートの解除”を行うか? # # ------- 必須項目 ------- # set_slip_damage_data # データ登録メソッド呼び出し。項目郡の最後に。必須。 # # ※ デフォルトで設定されているデータも参考にしてください。 #-------------------------------------------------------------------------- def make_slip_damage_data # 毒 @name = "毒" @tile_id = [672] @hp_damage = [5, 0, 0] @blank_step = 3 @slip_se = ["Damage1", 80, 100] @slip_flash = [255, 0, 0, 64, 4] set_slip_damage_data # MP減少 @name = "MP減少" @tile_id = [673] @mp_damage = [10, 0, 0] @slip_flash = [0, 0, 255, 64, 4] set_slip_damage_data # 猛毒 @name = "猛毒" @tile_id = [674] @hp_damage = [10, 2, 1] @slip_se = ["Damage2", 80, 100] @slip_flash = [255, 0, 0, 64, 4] @hp_damage_battle = [10, 0, 1] @mp_damage_battle = [20, 0] @battle_message = "猛毒が%sの体を蝕む!" @remove_states_shock = true set_slip_damage_data end #============================================================================== # △ カスタマイズ項目ここまで #============================================================================== #-------------------------------------------------------------------------- # ○ スリップダメージ・データベース化 #-------------------------------------------------------------------------- def set_slip_damage_data data = Game_Slip_Damage.new data.id = $slip_damage_data.size data.name = @name data.tile_id = @tile_id data.hp_damage = @hp_damage data.mp_damage = @mp_damage data.blank_step = @blank_step data.slip_se = @slip_se data.slip_flash = @slip_flash data.hp_damage_battle = @hp_damage_battle data.mp_damage_battle = @mp_damage_battle data.battle_message = @battle_message data.remove_states_shock = @remove_states_shock $slip_damage_data.push(data) clear_slip_damage_data end #-------------------------------------------------------------------------- # ○ スリップダメージ・データクリア #-------------------------------------------------------------------------- def clear_slip_damage_data @id = 0 @name = "" @tile_id = [] @hp_damage = [] @mp_damage = [] @blank_step = 0 @slip_se = [] @slip_flash = [] @hp_damage_battle = [] @mp_damage_battle = [] @battle_message = "" @remove_states_shock = false end #-------------------------------------------------------------------------- # ○ モジュール機能メソッド定義 #-------------------------------------------------------------------------- module_function :make_slip_damage_data module_function :set_slip_damage_data module_function :clear_slip_damage_data end #============================================================================== # ■ Game_Slip_Damage #------------------------------------------------------------------------------ #  スリップダメージのクラスです。 #============================================================================== class Game_Slip_Damage #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :id attr_accessor :name attr_accessor :tile_id attr_accessor :hp_damage attr_accessor :mp_damage attr_accessor :blank_step attr_accessor :slip_se attr_accessor :slip_flash attr_accessor :hp_damage_battle attr_accessor :mp_damage_battle attr_accessor :battle_message attr_accessor :remove_states_shock #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @id = 0 @name = "" @tile_id = [] @hp_damage = [] @mp_damage = [] @blank_step = 0 @slip_se = [] @slip_flash = [] @hp_damage_battle = [] @mp_damage_battle = [] @battle_message = "" @remove_states_shock = false end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :slip_blank_count #-------------------------------------------------------------------------- # ◎ オブジェクト初期化 #-------------------------------------------------------------------------- alias tig_sas_initialize initialize def initialize tig_sas_initialize @state_steps_count = {} # ステート持続歩数 @slip_blank_count = {} # スリップ間隔 end #-------------------------------------------------------------------------- # ○ ステートによるスリップダメージ取得 #-------------------------------------------------------------------------- def states_slip result = [] states.each do |state| if state.slip_damage_id != 0 if @slip_blank_count.key?(state.slip_damage_id) next if @slip_blank_count[state.slip_damage_id] > 0 end result.push($slip_damage_data[state.slip_damage_id]) end end return result end #-------------------------------------------------------------------------- # ○ 無効化するスリップダメージのリスト取得 #-------------------------------------------------------------------------- def resist_slip_list result = [] objects = states objects += equips.compact if actor? objects.each do |object| list = object.note.scan(/^[<<]スリップ無効[::](\S+)[>>]/).flatten result += list unless list.nil? end return result end #-------------------------------------------------------------------------- # ◎ ステートの付加 # state_id : ステート ID #-------------------------------------------------------------------------- alias tig_sas_add_state add_state def add_state(state_id) tig_sas_add_state(state_id) make_state_steps_count(state_id) if actor? make_slip_blank_count(state_id) if actor? end #-------------------------------------------------------------------------- # ◎ ステートの解除 # state_id : ステート ID #-------------------------------------------------------------------------- alias tig_sas_remove_state remove_state def remove_state(state_id) tig_sas_remove_state(state_id) clear_state_steps_count(state_id) if actor? end #-------------------------------------------------------------------------- # ○ ステート持続歩数の作成 #-------------------------------------------------------------------------- def make_state_steps_count(state_id) state = $data_states[state_id] if state.note[/[<<]歩数解除[::](\d+)[\//::>>]/] step = $1.to_i if state.note[/[<<]歩数解除[::]\d+[\//::](\d+)[>>]/] n = [[$1.to_i, 0].max, 100].min variance = (step * n / 100) step -= variance step += rand(variance * 2) + 1 end @state_steps_count[state_id] = step end end #-------------------------------------------------------------------------- # ○ スリップダメージステートのダメージ間隔作成 #-------------------------------------------------------------------------- def make_slip_blank_count(state_id) state = $data_states[state_id] return if state.slip_damage_id == 0 slip = $slip_damage_data[state.slip_damage_id] if slip.blank_step != 0 @slip_blank_count[slip.id] = slip.blank_step - 1 # エフェクトのタイミングを極力揃える for actor in $game_party.members for i in actor.slip_blank_count.keys @slip_blank_count[slip.id] = [@slip_blank_count[slip.id], actor.slip_blank_count[i]].min end end end end #-------------------------------------------------------------------------- # ○ ステート持続歩数・スリップダメージステートのダメージ間隔の減少 #-------------------------------------------------------------------------- def decrease_state_steps_count for i in @state_steps_count.keys @state_steps_count[i] -= 1 if @state_steps_count[i] > 0 end for i in @slip_blank_count.keys @slip_blank_count[i] -= 1 if @slip_blank_count[i] < 0 @slip_blank_count[i] = $slip_damage_data[i].blank_step - 1 end end end #-------------------------------------------------------------------------- # ○ ステート持続歩数のクリア #-------------------------------------------------------------------------- def clear_state_steps_count(state_id) @state_steps_count.delete(state_id) @slip_blank_count.delete(state_id) end #-------------------------------------------------------------------------- # ○ 歩数解除ステートの解除 #-------------------------------------------------------------------------- def remove_steps_state for id in @state_steps_count.keys if @state_steps_count[id] == 0 state = $data_states[id] remove_state(id) next if state.message4.empty? $game_message.background = Step_And_Slip::REMOVE_WINDOW_STATUS[0] $game_message.position = Step_And_Slip::REMOVE_WINDOW_STATUS[1] $game_message.texts.push(name + state.message4) end end end #-------------------------------------------------------------------------- # ○ スリップダメージの効果適用 #-------------------------------------------------------------------------- def slip_damage_effect_sas(slip) if effect = slip_damage_sas(slip) self.hp -= effect[0] self.mp -= effect[1] return true end return false end #-------------------------------------------------------------------------- # ○ スリップダメージの効果算出 #-------------------------------------------------------------------------- def slip_damage_sas(slip) return nil if resist_slip_list.include?(slip.name) hp_damage = $game_temp.in_battle ? slip.hp_damage_battle : slip.hp_damage mp_damage = $game_temp.in_battle ? slip.mp_damage_battle : slip.mp_damage hp_result = 0 mp_result = 0 if not hp_damage.empty? and self.hp > 0 case hp_damage[1] when 0 ; damage = hp_damage[0] when 1 ; damage = self.hp * hp_damage[0] / 100 + 1 when 2 ; damage = self.maxhp * hp_damage[0] / 100 + 1 end if hp_damage[2] == 0 damage = [self.hp - 1, damage].min end hp_result = damage end if not mp_damage.empty? case mp_damage[1] when 0 ; damage = mp_damage[0] when 1 ; damage = self.mp * mp_damage[0] / 100 + 1 when 2 ; damage = self.maxmp * mp_damage[0] / 100 + 1 end mp_result = damage end return nil if [hp_result, mp_result] == [0, 0] return [hp_result, mp_result] end end #============================================================================== # ■ Game_Party #------------------------------------------------------------------------------ #  パーティを扱うクラスです。ゴールドやアイテムなどの情報が含まれます。このク # ラスのインスタンスは $game_party で参照されます。 #============================================================================== class Game_Party < Game_Unit #-------------------------------------------------------------------------- # ◎ プレイヤーが 1 歩動いたときの処理 #-------------------------------------------------------------------------- alias tig_sas_on_player_walk on_player_walk def on_player_walk tig_sas_on_player_walk # 通常処理 members.each{|actor|actor.decrease_state_steps_count} end #-------------------------------------------------------------------------- # ○ スリップダメージの効果適用 #-------------------------------------------------------------------------- def slip_damage_effect_sas effective = [] for actor in members slips = actor.states_slip slips += $game_map.damage_floor unless $game_temp.in_battle for slip in slips if actor.slip_damage_effect_sas(slip) effective.push(slip.id) end end end # ↓エフェクトを採用するスリップダメージを選別する処理 #  複数のスリップダメージ効果が重なった場合、 #  スリップダメージidの降順で効果を選別します。 #  IDの大きいスリップダメージの効果が優先されます。 effective.uniq! # 重複IDの除去 effective.sort! # IDの整列(昇順) effective.reverse! # IDを降順に逆転 for i in effective se = $slip_damage_data[i].slip_se next if se.empty? # 効果音設定の無いスリップダメージは飛ばす RPG::SE.new(se[0], se[1], se[2]).play break end for i in effective f = $slip_damage_data[i].slip_flash next if f.empty? # フラッシュ設定の無いスリップダメージは飛ばす $game_map.screen.start_flash(Color.new(f[0], f[1], f[2], f[3]), f[4]) break end Graphics.wait(4) unless effective.empty? # ダメージ時のウエイト if all_dead? $game_message.background = Step_And_Slip::REMOVE_WINDOW_STATUS[0] $game_message.position = Step_And_Slip::REMOVE_WINDOW_STATUS[1] text = sprintf(Step_And_Slip::SLIP_DAMAGE_ALL_DEAD_MESSAGE, name) $game_message.texts.push(text) $game_temp.next_scene = "gameover" end end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ◎ 接触(重なり)によるイベント起動判定 #-------------------------------------------------------------------------- alias tig_sas_check_touch_event check_touch_event def check_touch_event result = tig_sas_check_touch_event unless result # イベント起動後以外に解除処理 $game_party.members.each{|actor|actor.remove_steps_state} end return result end #-------------------------------------------------------------------------- # ◎ 移動中でない場合の処理 # last_moving : 直前に移動中だったか #-------------------------------------------------------------------------- alias tig_sas_update_nonmoving update_nonmoving def update_nonmoving(last_moving) return if $game_map.interpreter.running? return if moving? # イベント起動より優先 if last_moving $game_party.slip_damage_effect_sas # イベント前にダメージ処理 end tig_sas_update_nonmoving(last_moving) end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ ダメージ床の取得 #-------------------------------------------------------------------------- def damage_floor result = [] for i in [2, 1, 0] id = @map.data[$game_player.x, $game_player.y, i] result += $slip_damage_data.select{|slip|slip.tile_id.include?(id)} end return result end end #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ #  タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # ◎ 各種ゲームオブジェクトの作成 #-------------------------------------------------------------------------- alias tig_sas_create_game_objects create_game_objects def create_game_objects tig_sas_create_game_objects $slip_damage_data = [Game_Slip_Damage.new] Step_And_Slip::clear_slip_damage_data Step_And_Slip::make_slip_damage_data end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ◎ ステート自然解除 #-------------------------------------------------------------------------- # スリップダメージ処理の割り込み #-------------------------------------------------------------------------- alias tig_sas_remove_states_auto remove_states_auto def remove_states_auto slip_damage_sas tig_sas_remove_states_auto end #-------------------------------------------------------------------------- # ○ スリップダメージ #-------------------------------------------------------------------------- def slip_damage_sas for slip in @active_battler.states_slip if effect = @active_battler.slip_damage_sas(slip) #-- スリップダメージ効果表示 @message_window.clear wait(5) if slip.battle_message.empty? text = sprintf(Step_And_Slip::SLIP_DAMAGE_BATTLE_MESSAGE, @active_battler.name, slip.name) else text = sprintf(slip.battle_message, @active_battler.name) end @message_window.add_instant_text(text) wait(20) #-- HPダメージ処理 if effect[0] > 0 if @active_battler.actor? text = sprintf(Vocab::ActorDamage, @active_battler.name, effect[0]) Sound.play_actor_damage $game_troop.screen.start_shake(5, 5, 10) else text = sprintf(Vocab::EnemyDamage, @active_battler.name, effect[0]) Sound.play_enemy_damage @active_battler.blink = true end @message_window.add_instant_text(text) wait(20) end @active_battler.slip_damage_effect_sas(slip) #-- 死亡時処理 if @active_battler.dead? if @active_battler.actor? next if $data_states[1].message1.empty? text = @active_battler.name + $data_states[1].message1 else next if $data_states[1].message2.empty? text = @active_battler.name + $data_states[1].message2 end @active_battler.perform_collapse @message_window.add_instant_text(text) wait(45) @message_window.clear return end #-- 衝撃によるステート解除処理 if slip.remove_states_shock and effect[0] > 0 @active_battler.clear_action_results @active_battler.remove_states_shock unless @active_battler.removed_states.empty? @message_window.add_instant_text("") end for state in @active_battler.removed_states next if state.message4.empty? text = @active_battler.name + state.message4 @message_window.replace_instant_text(text) end display_removed_states(@active_battler) end #-- MPダメージ処理 if effect[1] > 0 fmt = @active_battler.actor? ? Vocab::ActorLoss : Vocab::EnemyLoss text = sprintf(fmt, @active_battler.name, Vocab::mp, effect[1]) @message_window.add_instant_text(text) wait(20) end wait(25) @message_window.clear end end end end #============================================================================== # ■ RPG::State #============================================================================== class RPG::State #-------------------------------------------------------------------------- # ○ スリップダメージID取得 #-------------------------------------------------------------------------- def slip_damage_id if @slip_damage_id == nil @slip_damage_id = 0 if @note[/[<<]スリップダメージ[::](\S+)[>>]/] $slip_damage_data.each{|slip|@slip_damage_id = slip.id if slip.name == $1} end end return @slip_damage_id end end