#============================================================================== # 食べるスクリプト ver1.40 #------------------------------------------------------------------------------ # [導入上の注意] # HPダメージの表示とMPダメージの表示を再定義しているので、 # できるだけ上の方に追加した方がいいです。 # # [設定方法] # ◆ スキル ◆ # スキルのメモ欄に <食べる> と書く。と、それが食べるスキルになる。 # # ◆ エネミー ◆ # 敵キャラのメモ欄に下記の文章を書く。 # : 食べるとHPが最大HPの50%回復する。 ※ 省略可 # : 食べるとMPが50回復する。 ※ HPは回復しなくなる。 # 両方書くと、両方とも回復します。 # 数値の部分は省略すると、( のようにした場合 ) # 下記の設定項目で設定した数値で計算されます。 # 数値に「%」をつけると割合回復になります。マイナスを指定することも可能です。 # # : idのステートが付与される。 # : idのステートが解除される。 # 複数書けば、たくさん付与したり、たくさん解除したりできます。 # # : idに対応の数値、paraに上昇値を入れてください。 # 複数書けば、たくさんアップします。 # idは # 1 : MaxHP # 2 : MaxMP # 3 : 攻撃力 # 4 : 防御力 # 5 : 精神力 # 6 : 敏捷性 # # : 食べたエネミーをアイテムに変化させます。 # kind には、アイテムなら 1 、武器なら 2 、防具なら 3 を入れてください。 # id にはそのアイテムのIDを入れてください。 # per にはアイテムに変化する確率を入れてください。省略すると100%になります。 # # : エネミーを食べることで、スキルを覚えることができます。 # id にはスキルのIDを入れてください。 # per にはスキルを修得できる確率を入れてください。省略すると100%になります。 # # : 食べられないエネミーになります。 # #『%s「うまい!」』のところに書いた文が表示されます。 # %sのところには「食べる」を実行したアクターの名前が表示されます。 # 名前を表示したくない場合は、%sは省略すれば大丈夫です。 # # # 作成:ぶちょー # ホム:http://nyannyannyan.bake-neko.net/ # 著作:自分で作ったとか言わないで>< # 改造はご自由にどうぞ。 # リードミーとかに私の名前の載せたりするのは任意で。 #============================================================================== #============================================================================== # バージョンアップ情報 # ver1.40 食べるに成功したとき、アニメーションを流せることが可能に。 # 再定義していたところをエイリアスに修正(競合の可能性が減りました)。 # ver1.31 命中回避の計算が正常に行われていないのを修正。 # ver1.30 エネミーを食べることで、スキルを覚えさせることが可能に。 # アイテム変化の設定をしていなかった場合、エラーが出ていたのを修正。 # メッセージの表示方法を再考しました。 # ver1.20 食べたエネミーをアイテムに化けさせることが可能に。 # コラプスが2重に行われてしまう不具合の修正。 # ver1.10 なんかいろいろ修正しました。 # ver1.00 公開 #============================================================================== #============================================================================== # 設定項目 #============================================================================== module Kazari module EAT # HPやMPが回復したときに表示される文章 PLUS = "%sの%sが %s 回復した!" # HPやMPにダメージを受けたときに表示される文章 MINUS = "%sの%sが %s 減った!" # エネミーの残りHPがこの数値パーセント以下だと食べられます。 REST_HP = 25 # 最大HP×この数値÷100のHPが回復します(エネミーに詳細設定しなかった場合です) HP_P = 50 # 最大MP×この数値÷100のHPが回復します(エネミーに詳細設定しなかった場合です) MP_P = 50 # 食べてHPが減った際、死んでしまうかどうかのフラグ EAT_TO_DEATH = false # 割合回復する際、「食べる」を実行したアクターの最大HPを参考にするか(true) # 食べられたエネミーの最大HPを参考にするか(false)のフラグ USER = true # 食べてHPやMPが回復した時に回復の音を鳴らすか鳴らさないかのフラグ SOUND = true # エネミーがアイテムに変化したときに表示される文章 CHANGE_ITEM = "%sが%sに変化した!" # エネミーがアイテムに変化したとき、メッセージ表示するかどうかのフラグ CHANGE_FLAG = true # スキルを修得したときに表示される文章 LEARN_SKILL = "%sは%sを覚えた!" # スキルを修得したしたとき、メッセージ表示するかどうかのフラグ SKILL_FLAG = true # 食べるのに成功したときに流すアニメーションのID # nil : アニメーションを流さない #EAT_ANIMATION = nil EAT_ANIMATION = 56 # 食べるのに成功したときに 戦闘不能 のメッセージを流すかどうかのフラグ # ※ 戦闘不能のメッセージ:ステート1が付与されたときのメッセージのこと EATEN_FLAG = false end end #============================================================================== # ここまで #============================================================================== #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base include Kazari::EAT #-------------------------------------------------------------------------- # ● クリティカルヒットの表示 を間借り #-------------------------------------------------------------------------- alias eat_display_critical display_critical def display_critical(target, obj = nil) display_eaten(@active_battler, target, obj) eat_display_critical(target, obj) end #-------------------------------------------------------------------------- # ● ダメージの表示 を間借り #-------------------------------------------------------------------------- alias eat_display_damage display_damage def display_damage(target, obj = nil) eat_display_damage(target, obj) display_enemy_to_item(@active_battler, target, obj) display_enemy_to_skill(@active_battler, target, obj) end #-------------------------------------------------------------------------- # ● 失敗の表示 を間借り #-------------------------------------------------------------------------- alias eat_display_failure display_failure def display_failure(target, obj) unless @active_battler.eaten eat_display_failure(target, obj) else wait(30) @message_window.clear end end #-------------------------------------------------------------------------- # ● HP ダメージ表示 #-------------------------------------------------------------------------- alias eat_display_hp_damage display_hp_damage def display_hp_damage(target, obj = nil) return if @active_battler.eaten eat_display_hp_damage(target, obj) end #-------------------------------------------------------------------------- # ● MP ダメージ表示 #-------------------------------------------------------------------------- alias eat_display_mp_damage display_mp_damage def display_mp_damage(target, obj = nil) return if @active_battler.eaten eat_display_mp_damage(target, obj) end #-------------------------------------------------------------------------- # ● 食べた結果の表示 #-------------------------------------------------------------------------- def display_eaten(actor, target, obj = nil) return unless actor.eaten if obj != nil && obj.note.include?("食べる") enemy = $data_enemies[target.enemy_id] text = enemy.note.scan(/^/i).to_s if text != "" @message_window.add_instant_text(sprintf(text, actor.name)) wait(20) end end display_animation([target], EAT_ANIMATION) if EAT_ANIMATION damage = actor.hp_damage if damage != 0 actor.hp += damage if damage < 0 damage *= -1 fmt = MINUS Sound.play_actor_damage if SOUND else fmt = PLUS Sound.play_recovery if SOUND end text = sprintf(fmt, actor.name, Vocab::hp, damage) @message_window.add_instant_text(text) wait(30) end damage = actor.mp_damage if damage != 0 actor.mp += damage if damage < 0 damage *= -1 fmt = MINUS Sound.play_actor_damage if SOUND else fmt = PLUS Sound.play_recovery if SOUND end text = sprintf(fmt, actor.name, Vocab::mp, damage) @message_window.add_instant_text(text) wait(30) end end #-------------------------------------------------------------------------- # ● エネミーのアイテム変化の表示とアイテム入手 #-------------------------------------------------------------------------- def display_enemy_to_item(actor, target, obj = nil) return unless actor.eaten if obj != nil && obj.note.include?("食べる") enemy = $data_enemies[target.enemy_id] memo = enemy.note.scan(/<#{"eat_to_item:"}(\d+),(\d+),?(\d+)?>/) return if memo.empty? # アイテム変化しないエネミーだったらリターン memo = memo.flatten kind = memo[0].to_i id = memo[1].to_i per = memo[2] != nil ? memo[2].to_i : 100 if rand(100) < per case kind when 1 ; item = $data_items[id] when 2 ; item = $data_weapons[id] when 3 ; item = $data_armors[id] end return if item == nil # 存在しないアイテムだったらリターン $game_party.gain_item(item, 1) if CHANGE_FLAG if @message_window.line_number > 3 # メッセージ欄が埋まったらクリアする @message_window.clear end text = sprintf(CHANGE_ITEM, target.name, item.name) @message_window.add_instant_text(text) wait(30) end end end end #-------------------------------------------------------------------------- # ● スキルの修得とその表示 #-------------------------------------------------------------------------- def display_enemy_to_skill(actor, target, obj = nil) return unless actor.eaten if obj != nil && obj.note.include?("食べる") enemy = $data_enemies[target.enemy_id] memo = enemy.note.scan(/<#{"eat_to_skill:"}(\d+),?(\d+)?>/) return if memo.empty? # スキル修得のできないエネミーだったらリターン memo = memo.flatten id = memo[0].to_i per = memo[1] != nil ? memo[1].to_i : 100 if rand(100) < per skill = $data_skills[id] return if skill == nil # 存在しないスキルだったらリターン return if actor.skills.include?(skill) # そのスキルを覚えていたらリターン actor.learn_skill(id) if SKILL_FLAG if @message_window.line_number > 3 # メッセージ欄が埋まったらクリアする @message_window.clear end text = sprintf(LEARN_SKILL, actor.name, skill.name) @message_window.add_instant_text(text) wait(30) end end end end #-------------------------------------------------------------------------- # ● 付加されたステートの表示(食べられたバトラーの変化) #-------------------------------------------------------------------------- alias target_display_added_states display_added_states def display_added_states(target, obj = nil) if EATEN_FLAG target_display_added_states(target, obj) return end for state in target.added_states if target.actor? next if state.message1.empty? text = target.name + state.message1 else next if state.message2.empty? text = target.name + state.message2 end if state.id == 1 # 戦闘不能 target.perform_collapse end unless state.id == 1 || ! EATEN_FLAG @message_window.replace_instant_text(text) wait(20) else @message_window.back_to(@message_window.line_number - 1) end end end #-------------------------------------------------------------------------- # ● 付加されたステートの表示(アクティブバトラーの変化) #-------------------------------------------------------------------------- alias active_display_added_states display_added_states def display_added_states(target, obj = nil) active_display_added_states(target, obj) if obj != nil && obj.note.include?("食べる") for state in @active_battler.added_states if @active_battler.actor? next if state.message1.empty? text = @active_battler.name + state.message1 else next if state.message2.empty? text = @active_battler.name + state.message2 end if state.id == 1 # 戦闘不能 @active_battler.perform_collapse end text = sprintf(text, state_rate(@active_battler, state)) if @message_window.line_number > 3 # メッセージ欄が埋まったらクリアする wait(30) @message_window.clear end @message_window.add_instant_text(text) wait(20) end end end #-------------------------------------------------------------------------- # ● 解除されたステートの表示 #-------------------------------------------------------------------------- alias eat_display_removed_states display_removed_states def display_removed_states(target, obj = nil) eat_display_removed_states(target, obj) if obj != nil && obj.note.include?("食べる") for state in @active_battler.removed_states next if state.message4.empty? text = @active_battler.name + state.message4 if @message_window.line_number > 3 # メッセージ欄が埋まったらクリアする wait(30) @message_window.clear end @message_window.add_instant_text(text) wait(20) end end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler include Kazari::EAT #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :eaten # 行動結果: 食べるフラグ #-------------------------------------------------------------------------- # ● 行動効果の保持用変数をクリア #-------------------------------------------------------------------------- alias eat_clear_action_results clear_action_results def clear_action_results eat_clear_action_results @eaten = false end #-------------------------------------------------------------------------- # ● 食べる効果の計算 #-------------------------------------------------------------------------- def make_obj_eaten_effect(target, obj) if obj.note.include?("食べる") # 食べるの場合 actor = USER ? self : target memo = $data_enemies[target.enemy_id].note if memo.include?("/i) if $3 @hp_damage = actor.maxhp * $2.to_i / 100 else @hp_damage = $2.to_i end @hp_damage *= -1 if $1 end else @hp_damage = actor.maxhp * HP_P / 100 end if memo.include?("/i) if $3 @mp_damage = actor.maxhp * $2.to_i / 100 else @mp_damage = $2.to_i end end @mp_damage *= -1 if $1 else @mp_damage = actor.maxmp * MP_P / 100 end unless memo.include?(" maxhp * REST_HP / 100 || $data_enemies[self.enemy_id].note.include?("") @evaded = true # 食べるのに失敗したら、避けられたことにする return else eat_skill_effect(user, skill) return if @missed || @evaded || @skipped user.make_obj_eaten_effect(self, skill) user.eat_apply_state_changes($data_enemies[self.enemy_id]) user.eat_status_up($data_enemies[self.enemy_id]) # ↓食べられたエネミーに戦闘不能を付与 add_state(1) @added_states.push(1) @added_states.uniq! end else eat_skill_effect(user, skill) end end #-------------------------------------------------------------------------- # ● ステート変化の適用 #-------------------------------------------------------------------------- def eat_apply_state_changes(enemy) plus = [] minus = [] # エネミーのメモ欄から付与するステートと解除するステートを読み取る memo = enemy.note.scan(/eat_add_state:((?:\d+,\s?)*(?:\d+))/i).to_s.split(/,\s?/) if memo != nil && ! memo.empty? for i in 0...memo.size do plus.push(memo[i].to_i) end end memo = enemy.note.scan(/eat_rem_state:((?:\d+,\s?)*(?:\d+))/i).to_s.split(/,\s?/) if memo != nil && ! memo.empty? for i in 0...memo.size do minus.push(memo[i].to_i) end end for i in plus # ステート変化 (+) next if state_resist?(i) # 無効化されている? next if dead? # 戦闘不能? next if i == 1 and @immortal # 不死身? if state?(i) # すでに付加されている? @remained_states.push(i) # 変化しなかったステートを記録 next end add_state(i) # ステートを付加 @added_states.push(i) # 付加したステートを記録 end for i in minus # ステート変化 (-) next unless state?(i) # 付加されていない? remove_state(i) # ステートを解除 @removed_states.push(i) # 解除したステートを記録 end for i in @added_states & @removed_states @added_states.delete(i) # 付加と解除の両方に記録されている @removed_states.delete(i) # ステートがあれば両方削除する end end #-------------------------------------------------------------------------- # ● ステータスアップの適用 #-------------------------------------------------------------------------- def eat_status_up(enemy) id = [] para = [] # エネミーのメモ欄から変化するステータスを読みとる memo = enemy.note.scan(/<#{"status_up:"}(\d+),(\d+)>/) memo = memo.flatten if memo != nil && ! memo.empty? for i in 0...memo.size if i % 2 == 0 id.push(memo[i].to_i) else para.push(memo[i].to_i) end end end for i in 0..id.size case id[i] when 1 # MaxHP @maxhp_plus += para[i] when 2 # MaxMP @maxmp_plus += para[i] when 3 # 攻撃力 @atk_plus += para[i] when 4 # 防御力 @def_plus += para[i] when 5 # 精神力 @spi_plus += para[i] when 6 # 敏捷性 @agi_plus += para[i] end end end end