#◆◇◆◇◆ ☆ ボイス管理スクリプト ver 1・02 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # ※ 開発者用・ボイス演奏機構 必須 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.02(2010/12/28) 演奏可能ボイスを増設 ○ ver 1.01 アクセサの設定ミスを修正 ※ 注意事項! このスクリプト素材には 開発者用・ボイス演奏機構 の導入が必須となります。 ■ 説明 開発者用・ボイス演奏機構用のサポートスクリプトです。 このスクリプトを導入することにより、 バトラー毎の音声の管理、及び自動演奏が可能になります。 ボイスが存在しない場合は処理をキャンセルします。 設定できる音声のアクションは ・通常攻撃 ・ダメージ残りHP50%以上 ・ダメージ残りHP49%以下 ・ダメージ残りHP25%以下 ・戦闘不能 ・戦闘開始 ※ アクターのみ ・戦闘終了 ※ アクターのみ ・復活 ・スキル使用 ・アイテム使用 ※ アクターのみ ・その他 となっております。 条件となるアクションが実行された段階で、 設定されているボイスを自動的に演奏します。 その際、候補が2つ以上存在すれば、 その中からランダムに選択して演奏します。 ■ 備考 その他 のボイスのみランダム演奏を行いません。 その他 のボイスは指定されたIDのボイスを演奏します。 演奏にはアニメーションの任意のフレームに、 特殊ボイス実行 という名前のSEを実行してください。 そのタイミングでその他のボイスを演奏します。 ボイスのIDにはフラッシュの強さを使用します。 例 SE 特殊ボイス実行 フラッシュの強さ 1 現在行動中のバトラーのID_1のその他で設定したボイスを演奏します。 対象ボイスが存在しない場合はキャンセルされます。 また、ボイス演奏中のみ しゃべっているバトラーのグラフィックを変更することも出来ます。 @voice[1]["通常攻撃"][0] = "Battler01_Attack01\\gr[攻]" という風に指定ファイル名の後に \\gr[任意の文字列]の制御文字を設定してください。 例えば \\gr[攻] なら対象バトラーの戦闘グラフィックの最後に 攻 の字が付いたグラフィックにしゃべっている最中のみ変更します。 しゃべり終わったら元のグラフィックに戻ります。 ※ 音声ファイル本体に制御文字は設定しないでください。 演奏がされなくなります。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # ボイス管理スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["ボイス管理スクリプト"] = true end # ボイス管理スクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["ボイス管理スクリプト"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズを行うモジュールです。 #============================================================================== module System_VoiceData #-------------------------------------------------------------------------- # ● ボイスデータの設定 #-------------------------------------------------------------------------- def self.setup_voice_data # 戦闘ボイスが存在するアクター、 # もしくはエネミーの分だけ設定してください。 # 記入例 # @voice[バトラー管理ID][ボイスタイプ][候補ID] = "ボイスファイル名" # 必ず配列式で記入してください。 # 候補が複数存在する場合はランダムになります。 # (その他 で設定されたボイスは除く) # エネミーの場合は実際のIDに1000を足した値が管理IDとなります。 @voice = {} # 必要なデータを初期化 self.initialize # アクター 1 の設定 @voice[1]["通常攻撃"][0] = "Battler01_Attack01" @voice[1]["通常攻撃"][1] = "Battler01_Attack02" @voice[1]["通常攻撃"][2] = "Battler01_Attack03" @voice[1]["通常攻撃"][3] = "Battler01_Attack04" @voice[1]["ダメージ残りHP50%以上"][0] = "Battler01_Damage01_01" @voice[1]["ダメージ残りHP50%以上"][1] = "Battler01_Damage01_02" @voice[1]["ダメージ残りHP50%以上"][2] = "Battler01_Damage01_03" @voice[1]["ダメージ残りHP50%以上"][3] = "Battler01_Damage01_04" @voice[1]["ダメージ残りHP49%以下"][0] = "Battler01_Damage02_01" @voice[1]["ダメージ残りHP49%以下"][1] = "Battler01_Damage02_02" @voice[1]["ダメージ残りHP49%以下"][2] = "Battler01_Damage02_03" @voice[1]["ダメージ残りHP25%以下"][0] = "Battler01_Damage03_01" @voice[1]["ダメージ残りHP25%以下"][1] = "Battler01_Damage03_02" @voice[1]["戦闘不能"][0] = "Battler01_Dead01" @voice[1]["戦闘不能"][1] = "Battler01_Dead02" @voice[1]["戦闘開始"][0] = "Battler01_BattleStart01" @voice[1]["戦闘開始"][1] = "Battler01_BattleStart02" @voice[1]["戦闘開始"][2] = "Battler01_BattleStart03" @voice[1]["戦闘開始"][3] = "Battler01_BattleStart04" @voice[1]["戦闘終了"][0] = "Battler01_BattleWin01" @voice[1]["戦闘終了"][1] = "Battler01_BattleWin02" @voice[1]["戦闘終了"][2] = "Battler01_BattleWin03" @voice[1]["戦闘終了"][3] = "Battler01_BattleWin04" @voice[1]["復活"][0] = "Battler01_Revival01" @voice[1]["スキル使用"][0] = "Battler01_Skill01" @voice[1]["アイテム使用"][0] = "Battler01_Skill01" @voice[1]["その他"][0] = "Battler01_EX01" @voice[1]["その他"][1] = "Battler01_EX02" @voice[1]["その他"][2] = "Battler01_EX03" @voice[1]["その他"][3] = "Battler01_EX04" # アクター 2 の設定 @voice[2]["通常攻撃"][0] = "Battler02_Attack01" @voice[2]["通常攻撃"][1] = "Battler02_Attack02" @voice[2]["通常攻撃"][2] = "Battler02_Attack03" @voice[2]["通常攻撃"][3] = "Battler02_Attack04" @voice[2]["ダメージ残りHP50%以上"][0] = "Battler02_Damage01_01" @voice[2]["ダメージ残りHP50%以上"][1] = "Battler02_Damage01_02" @voice[2]["ダメージ残りHP50%以上"][2] = "Battler02_Damage01_03" @voice[2]["ダメージ残りHP50%以上"][3] = "Battler02_Damage01_04" @voice[2]["ダメージ残りHP49%以下"][0] = "Battler02_Damage02_01" @voice[2]["ダメージ残りHP49%以下"][1] = "Battler02_Damage02_02" @voice[2]["ダメージ残りHP49%以下"][2] = "Battler02_Damage02_03" @voice[2]["ダメージ残りHP25%以下"][0] = "Battler02_Damage03_01" @voice[2]["ダメージ残りHP25%以下"][1] = "Battler02_Damage03_02" @voice[2]["戦闘不能"][0] = "Battler02_Dead01" @voice[2]["戦闘不能"][1] = "Battler02_Dead02" @voice[2]["戦闘開始"][0] = "Battler02_BattleStart01" @voice[2]["戦闘開始"][1] = "Battler02_BattleStart02" @voice[2]["戦闘開始"][2] = "Battler02_BattleStart03" @voice[2]["戦闘開始"][3] = "Battler02_BattleStart04" @voice[2]["戦闘終了"][0] = "Battler02_BattleWin01" @voice[2]["戦闘終了"][1] = "Battler02_BattleWin02" @voice[2]["戦闘終了"][2] = "Battler02_BattleWin03" @voice[2]["戦闘終了"][3] = "Battler02_BattleWin04" @voice[2]["復活"][0] = "Battler02_Revival01" @voice[2]["スキル使用"][0] = "Battler02_Skill01" @voice[2]["アイテム使用"][0] = "Battler02_Skill01" @voice[2]["その他"][0] = "Battler02_EX01" @voice[2]["その他"][1] = "Battler02_EX02" @voice[2]["その他"][2] = "Battler02_EX03" @voice[2]["その他"][3] = "Battler02_EX04" # エネミー 1 の設定 @voice[1001]["通常攻撃"][0] = "Battler1001_Attack01" @voice[1001]["通常攻撃"][1] = "Battler1001_Attack02" @voice[1001]["通常攻撃"][2] = "Battler1001_Attack03" @voice[1001]["通常攻撃"][3] = "Battler1001_Attack04" @voice[1001]["ダメージ残りHP50%以上"][0] = "Battler1001_Damage01_01" @voice[1001]["ダメージ残りHP50%以上"][1] = "Battler1001_Damage01_02" @voice[1001]["ダメージ残りHP50%以上"][2] = "Battler1001_Damage01_03" @voice[1001]["ダメージ残りHP50%以上"][3] = "Battler1001_Damage01_04" @voice[1001]["ダメージ残りHP49%以下"][0] = "Battler1001_Damage02_01" @voice[1001]["ダメージ残りHP49%以下"][1] = "Battler1001_Damage02_02" @voice[1001]["ダメージ残りHP49%以下"][2] = "Battler1001_Damage02_03" @voice[1001]["ダメージ残りHP25%以下"][0] = "Battler1001_Damage03_01" @voice[1001]["ダメージ残りHP25%以下"][1] = "Battler1001_Damage03_02" @voice[1001]["戦闘不能"][0] = "Battler1001_Dead01" @voice[1001]["戦闘不能"][1] = "Battler1001_Dead02" @voice[1001]["スキル使用"][0] = "Battler1001_Skill01" @voice[1001]["その他"][0] = "Battler1001_EX01" @voice[1001]["その他"][1] = "Battler1001_EX02" @voice[1001]["その他"][2] = "Battler1001_EX03" @voice[1001]["その他"][3] = "Battler1001_EX04" end #-------------------------------------------------------------------------- # ● ボイスデータの取得 #-------------------------------------------------------------------------- def self.voice # ボイスデータを返す return @voice end #-------------------------------------------------------------------------- # ● データ初期化 #-------------------------------------------------------------------------- def self.initialize # ループ処理 (0...Data_Actors.data.size).each do |i| @voice[i] = {} @voice[i]["通常攻撃"] = [] @voice[i]["ダメージ残りHP50%以上"] = [] @voice[i]["ダメージ残りHP49%以下"] = [] @voice[i]["ダメージ残りHP25%以下"] = [] @voice[i]["戦闘不能"] = [] @voice[i]["戦闘開始"] = [] @voice[i]["戦闘終了"] = [] @voice[i]["復活"] = [] @voice[i]["スキル使用"] = [] @voice[i]["アイテム使用"] = [] @voice[i]["その他"] = [] end # ループ処理 (0...Data_Enemies.data.size).each do |i| @voice[1000 + i] = {} @voice[1000 + i]["通常攻撃"] = [] @voice[1000 + i]["ダメージ残りHP50%以上"] = [] @voice[1000 + i]["ダメージ残りHP49%以下"] = [] @voice[1000 + i]["ダメージ残りHP25%以下"] = [] @voice[1000 + i]["戦闘開始"] = [] @voice[1000 + i]["戦闘終了"] = [] @voice[1000 + i]["戦闘不能"] = [] @voice[1000 + i]["復活"] = [] @voice[1000 + i]["スキル使用"] = [] @voice[1000 + i]["アイテム使用"] = [] @voice[1000 + i]["その他"] = [] end end end #============================================================================== # ☆ Voice_Sprite_Battler #------------------------------------------------------------------------------ # Sprite_Battlerクラス用のボイス実行モジュールです。 #============================================================================== module Voice_Sprite_Battler #-------------------------------------------------------------------------- # ● SEとフラッシュのタイミング処理 # timing : タイミングデータ (RPG::Animation::Timing) # hit : ヒットフラグ #-------------------------------------------------------------------------- def animation_process_timing(timing, hit) # 条件が ヒット で攻撃がミスだった場合か、 # 条件が ミス で攻撃がヒットだった場合 if(timing.condition == 1 and hit == false) or (timing.condition == 2 and hit == true) then # メソッドを返す return end # SE名が 特殊ボイス実行 の場合 if timing.se.name == "特殊ボイス実行" then # 特殊ボイスのIDを取得(フラッシュの強さ) voice_id = timing.flash_color.alpha # 特殊ボイスを実行 $scene.active_battler.extra_voice(voice_id) # それ以外のSE名の場合 else # スーパークラスを実行 (継承先の処理に移行する) super(timing, hit) end end #-------------------------------------------------------------------------- # ● 出現の処理 #-------------------------------------------------------------------------- def appear # スーパークラスを実行(継承先の処理に移行する) super # 復活の場合 if @revival_voice == true then # 復活ボイスを実行 @battler.action_voice("復活") @revival_voice = nil end end #-------------------------------------------------------------------------- # ● コラプスの処理 #-------------------------------------------------------------------------- def collapse # スーパークラスを実行(継承先の処理に移行する) super # 戦闘不能ボイスを実行 @battler.action_voice("戦闘不能") # 復活ボイスを許可 @revival_voice = true end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # スーパークラスを実行(継承先の処理に移行する) super # バトラーが無効な場合 if @battler == nil then # メソッドを返す return end # グラフィック一時変更中の場合 if @battler.graphic_supposing != nil then # しゃべり終わっている場合 if @battler.voice_playing? == false then # グラフィックを戻す @battler.battler_name = @battler.battler_ori_name.dup # 保存用のグラフィック名をクリア @battler.battler_ori_name = nil # グラフィック一時変更中フラグを無効にする @battler.graphic_supposing = nil end end # ダメージ表示フラグが有効な場合 if @battler.damage_pop == true then # ダメージが 1 以上の場合 if @battler.damage.to_i >= 1 then # HP残存率に応じて分岐 case @battler.hp * 100 / @battler.maxhp when 50...100 # ダメージボイス 1 を実行 @battler.action_voice("ダメージ残りHP50%以上") when 25...49 # ダメージボイス 2 を実行 @battler.action_voice("ダメージ残りHP49%以下") when 0...24 # ダメージボイス 2 を実行 @battler.action_voice("ダメージ残りHP25%以下") end end end end end #============================================================================== # ■ Array #------------------------------------------------------------------------------ #  配列全般を扱う組み込みクラスです。 #============================================================================== class Array #-------------------------------------------------------------------------- # ● 要素をランダムに返す #-------------------------------------------------------------------------- def get_rand return self[rand(self.size)] end end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :battler_ori_name # バトラー オリジナルファイル名 attr_accessor :graphic_supposing # グラフィックの一時変更フラグ attr_accessor :battler_name # バトラー ファイル名 #-------------------------------------------------------------------------- # ● アクションに応じたボイスの実行 # action : 要求されたボイスのアクション #-------------------------------------------------------------------------- def action_voice(action) # 自身に要求されたボイスが存在する場合 if System_VoiceData.voice[self.belong_id][action].size >= 1 then # ボイスの実行が可能な場合(沈黙などで無い場合) if self.voice_play_can_use? == true then # 対象ボイスを取得 @voice_file = System_VoiceData.voice[belong_id][action].get_rand.dup # 必要ならグラフィックを変える graphic_change_supposing # 対象ボイスを実行 self.voice_play(@voice_file) end end end #-------------------------------------------------------------------------- # ● 特殊ボイスの実行 # voice_id : 要求された特殊ボイスのID #-------------------------------------------------------------------------- def extra_voice(voice_id) # 特殊ボイスを取得 @voice_file = System_VoiceData.voice[belong_id]["その他"][voice_id].dup # ボイスが存在する場合 if @voice_file != nil then # 必要ならグラフィックを変える graphic_change_supposing # 特殊ボイスを実行 self.voice_play(@voice_file) end end #-------------------------------------------------------------------------- # ● グラフィックの一時的な変更 #-------------------------------------------------------------------------- def graphic_change_supposing # ファイル名からグラフィック名を抜き取る @voice_file.gsub!(/\\[Gg][Rr]\[(.+?)\]/) { "" } # グラフィックの変更が可能な場合 if $1.to_s != "" # 元のグラフィック名を記憶 self.battler_ori_name ||= self.battler_name.dup # グラフィックを一時的に変更 self.battler_name = self.battler_ori_name + $1 # グラフィック一時変更中フラグを有効にする self.graphic_supposing = true end end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 所属IDの取得 #-------------------------------------------------------------------------- def belong_id return self.id end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 所属IDの取得 #-------------------------------------------------------------------------- def belong_id return 1000 + self.id end end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● システムインクルード #-------------------------------------------------------------------------- include(Voice_Sprite_Battler) # ボイス実行モジュール end #============================================================================== # ■ Scene_Battle (分割定義 1) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :active_battler # アクティブバトラー #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias :main_Voice_Play :main def main # ボイス演奏機構を初期化 System_Voice.initialize # 元の処理を実行 main_Voice_Play # ボイス演奏機構を初期化 System_Voice.initialize end end #============================================================================== # ■ Scene_Battle (分割定義 2) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias :start_phase5_Voice_Play :start_phase5 def start_phase5 # アクター収納用の仮配列 actors = [] # ループ処理 $game_party.actors.each do |actor| # 存在している場合 if actor.exist? == true then # ボイスの実行が可能な場合 if actor.voice_play_can_use? == true then # 配列に収納 actors.push(actor) end end end # 候補となるアクターが1人でも存在する場合 if actors.size >= 1 then # ランダムに戦闘終了ボイスを実行 actors.get_rand.action_voice("戦闘終了") end # 元の処理を実行 start_phase5_Voice_Play end end #============================================================================== # ■ Scene_Battle (分割定義 4) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アクターコマンドウィンドウのセットアップ #-------------------------------------------------------------------------- alias :phase3_setup_command_window_Voice_Play :phase3_setup_command_window def phase3_setup_command_window # 元の処理を実行 phase3_setup_command_window_Voice_Play # インスタンス変数にフラグを設定 @battle_start ||= {} # ボイス未実行の場合 if @battle_start[@active_battler.belong_id] == nil then # 実行済みフラグを設定 @battle_start[@active_battler.belong_id] = true # 戦闘開始時のボイスを実行 @active_battler.action_voice("戦闘開始") end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 4 : 対象側アニメーション) #-------------------------------------------------------------------------- alias :update_phase4_step4_Voice_Play :update_phase4_step4 def update_phase4_step4 # 元の処理を実行 update_phase4_step4_Voice_Play # 行動者のアクションに応じて分岐 case @active_battler.current_action.kind # 基本行動 when 0 then # 行動が通常攻撃の場合 if @active_battler.current_action.basic.zero? then # 通常攻撃のボイスを実行 @active_battler.action_voice("通常攻撃") end # スキル when 1 then # スキルのボイスを実行 @active_battler.action_voice("スキル使用") # スキルのIDに応じて分岐(予約機能) #case @active_battler.current_action.skill_id # スキル1 #when 1 then #end # アイテム when 2 then # アイテムのボイスを実行 @active_battler.action_voice("アイテム使用") end end end System_VoiceData.setup_voice_data end