#◆◇◆◇◆ レベルアップポップスクリプト ver 1.03 ◇◆◇◆◇ # 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.03(2009/04/29) レイアウトと汎用性を修正 ○ ver 1.02(2009/04/27) 汎用性を向上 ○ ver 1.01(2009/04/26) ウィンドウの消し忘れを修正 ○ ver 1.00(2009/04/25) 公開 ■ 説明 レベルアップした際の詳細な情報を1つずつ素早く表示します。 スキルを習得した場合は習得したスキル名を表示します。 動くリザルトシリーズ、 及びアクティブレベルアップ両シリーズにも対応しています。 両シリーズよりも「下」に導入してください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # レベルアップポップスクリプトを有効化 ( true で有効 / false で無効 ) RGSS["レベルアップポップスクリプト"] = true end # レベルアップポップスクリプトが有効な場合に以降の処理を実行する if MINTO::RGSS["レベルアップポップスクリプト"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズをここで行います。 #============================================================================== module MINTO # パラメータ上昇時のSE(名前、音量、ピッチ) SE_Data = ["Audio/SE/002-System02", 100, 120] # スキル習得時のSE(名前、音量、ピッチ) Skill_SE_Data = ["Audio/SE/157-Skill01", 100, 200] # スキル習得時のメッセージ末尾 LearningMessage = "を習得した!" end #============================================================================== # ■ Object #------------------------------------------------------------------------------ #  全てのクラスのスーパークラス。オブジェクトの一般的な振舞いを定義します。 #============================================================================== class Object #-------------------------------------------------------------------------- # ● 深い複製の作成 #-------------------------------------------------------------------------- def dec # Marshalモジュールを経由して、完全な複製を作成 return Marshal.load(Marshal.dump(self)) end end #============================================================================== # ■ Bitmap #------------------------------------------------------------------------------ #  画像そのものを扱う組み込みクラスです。 #============================================================================== class Bitmap #-------------------------------------------------------------------------- # ● 指定範囲のクリア #-------------------------------------------------------------------------- def rect_clear(x, y, width, height) # 対象の範囲を消す rect = Rect.new(x, y, width, height) self.fill_rect(rect, Color.new(0, 0, 0, 0)) end end #============================================================================== # ■ Window #------------------------------------------------------------------------------ #  ゲーム内の全てのウィンドウのスーパークラスです。 # 内部的には複数のスプライトで構成されています。 #============================================================================== class Window #-------------------------------------------------------------------------- # ● ウィンドウのセンタリング #-------------------------------------------------------------------------- def centering # ウィンドウを画面の中央に配置する self.x = (640 - self.width) / 2 self.y = (480 - self.height) / 2 end end #============================================================================== # ■ Window_BattleStatus #------------------------------------------------------------------------------ #  バトル画面でパーティメンバーのステータスを表示するウィンドウです。 #============================================================================== class Window_BattleStatus < Window_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :level_up_flags # レベルアップフラグ end #============================================================================== # ■ Window_Lvup_Data #------------------------------------------------------------------------------ # Lvup時のデータを表示するウィンドウです。 #============================================================================== class Window_Lvup_Data < Window_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :data # データ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, 512, 192) self.contents = Bitmap.new(width - 32, height - 32) self.z = 10016 self.visible = false @data = {} centering end #-------------------------------------------------------------------------- # ● リフレッシュ # actor : アクター #-------------------------------------------------------------------------- def refresh(actor) x = 160 self.contents.clear # アクター名を描写 self.contents.font.color = normal_color self.contents.draw_text(x * 0, 32 * 0, 224, 32, actor.name) # アクターグラフィックを描写 battler_name = actor.battler_name battler_hue = actor.battler_hue bitmap = RPG::Cache.battler(battler_name, battler_hue) self.contents.blt(336, 0, bitmap, bitmap.rect) # 用語を描写 self.contents.font.color = system_color self.contents.draw_text(x * 0, 32 * 1, 96, 32, "Level") self.contents.draw_text(x * 0, 32 * 2, 96, 32, $data_system.words.hp) self.contents.draw_text(x * 0, 32 * 3, 96, 32, $data_system.words.sp) self.contents.draw_text(x * 1, 32 * 1, 96, 32, $data_system.words.str) self.contents.draw_text(x * 1, 32 * 2, 96, 32, $data_system.words.dex) self.contents.draw_text(x * 1, 32 * 3, 96, 32, $data_system.words.agi) self.contents.draw_text(x * 1, 32 * 4, 96, 32, $data_system.words.int) self.contents.font.color = normal_color # パラメータを描写 for i in 0...@data[actor].size do draw_status(actor, i) end end #-------------------------------------------------------------------------- # ● 能力の描写 # actor : アクター # index : 項目 #-------------------------------------------------------------------------- def draw_status(actor, index) # 描写座標を設定 x = 60 + ((index / 4) * 160) + ((index / 4) * 8) y = 32 + ((index % 4) * 32) # 描写範囲をクリア self.contents.rect_clear(x, y, 48, 32) # 能力値を描写 self.contents.draw_text(x, y, 96, 32, @data[actor][index].to_s) end end #============================================================================== # ■ Window_BattleCenter_Help #------------------------------------------------------------------------------ #  戦闘画面で任意の文章を表示するウィンドウです。 #============================================================================== class Window_BattleCenter_Help < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, 64, 56) self.z = 20000 self.visible = false create_contents @message_duration = 0 @save_text = "" @text = [] @text_y = 0 @text_x = 0 @text_type = 0 @text_index = 0 @text_width = [] @speed = 1 end #-------------------------------------------------------------------------- # ● ウィンドウ内容の作成 #-------------------------------------------------------------------------- def create_contents unless self.contents.nil? self.contents.dispose self.contents = nil end self.contents = Bitmap.new(width - 32, height - 32) end #-------------------------------------------------------------------------- # ● テキスト設定 # text : スプライトに表示する文字列 #-------------------------------------------------------------------------- def set_text(text) # 求められたテキストが無効な場合 if text.to_s == "" then # 表示カウントを設定 @message_duration = 8 # メソッドを終了 return end self.active = true # 終了記号を追加 text += "\\bw" # スプライトを可視状態にする self.visible = true # 各データを初期化 @save_text = "" @text = [] @text_width = [] @text_index = 0 @text_type = 0 @speed = 1 self.pause = false self.opacity = 192 self.contents_opacity = 255 # 表示カウントを設定 @message_duration = 16 # 文字を複製 data = text.dup # 各制御文字を仮変換 data.gsub!(/\\\\/) { "\000" } data.gsub!(/\\[Cc]\[([0-9]+)\]/) { "" } data.gsub!(/\\[Bb][Ww]/) { "" } # ウィンドウのサイズを調節 self.width = 32 + (self.contents.text_size(data).width) self.height = 56 # センター表示 centering # ビットマップを再作成 create_contents refresh(text.dup) end #-------------------------------------------------------------------------- # ● リフレッシュ # text : スプライトに表示する文字列 #-------------------------------------------------------------------------- def refresh(text) # 基本情報を初期化 self.contents.clear self.contents.font.color = normal_color self.contents.font.bold = false self.contents.font.italic = false @text_x = 0 @text_y = 0 # 文章のインデックスを初期化 @text_index = 0 # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # 各制御文字を実際のものに変換 text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } text.gsub!(/\\[Bb][Ww]/) { "\017" } @save_text = text.dup end #-------------------------------------------------------------------------- # ● テキストの更新 #-------------------------------------------------------------------------- def text_update @text = @save_text.split(//) # 無効な文字列の場合 if @text[@text_index] == nil then # メソッドを返す return false end # スプライトを可視状態にする self.visible = true # テキストを取得 c = @text[@text_index] # \\ の場合 if c == "\000" then # 本来の文字に戻す c = "\\" # \C[n] の場合 elsif c == "\001" then # 制御文字を処理 @save_text.sub!(/\[([0-9]+)\]/, "") # 文字色のIDを取得 color = $1.to_i # 文字色のIDが有効な場合 if color >= 0 then # 文字色を変更 self.contents.font.color = text_color(color) end # インデックスを進める @text_index += 1 # メソッドを返す return true # \BW の場合 elsif c == "\017" then # 文章の表示速度を初期化 @speed = 0 # ポーズサインを表示する self.pause = true # ボタン待ちフラグをオン @press = true # インデックスを進める @text_index += 1 # メソッドを返す return true end # 文字を描画 self.contents.draw_text(@text_x, 0, 40, 24, c) # @text_x に描画した文字の幅を加算 @text_x += self.contents.text_size(c).width # インデックスを進める @text_index += 1 return true end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ボタン入力待ちフラグがオンの場合 if @press == true then super # C ボタンが押された場合 if Input.trigger?(Input::C) == true then # ボタン入力待ちフラグをオフ @press = false # ポーズサインを非表示にする self.pause = false # ウィンドウを不可視にする self.visible = false # ボタン入力待ちフラグをオフ @press = false end # メソッドを返す return end # 更新が可能なフレームでない場合 if @speed != 0 and (Graphics.frame_count % @speed != 0) then # メソッドを返す return end # テロップを更新中の場合 if text_update == true then # スピードが 0 の場合 if @speed == 0 then update end # メソッドを返す return else # 文章の表示速度を最速化 @speed = 1 end end end #============================================================================== # ■ Scene_Battle (分割定義 1) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias main_MITO_RGSS_120 main def main # 元の処理を実行 main_MITO_RGSS_120 # レベルアップウィンドウが有効な場合 unless @lvup_window.nil? # レベルアップウィンドウを解放 @lvup_window.dispose # センターヘルプウィンドウを解放 @center_help_window.dispose end end end #============================================================================== # ■ Scene_Battle (分割定義 2) #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- alias start_phase5_MITO_RGSS_120 start_phase5 def start_phase5 @last_skills_array = [] # フラグを設定 @levelup_effect = false # レベルアップウィンドウを作成 @lvup_window = Window_Lvup_Data.new # センターヘルプウィンドウを作成 @center_help_window = Window_BattleCenter_Help.new # ループ処理(パーティー) for i in 0...$game_party.actors.size do # アクターを取得 actor = $game_party.actors[i] # 最終能力値を保存 save_last_parameter(actor) @last_skills_array[i] = [] # ループ処理 for skill in $data_classes[actor.class_id].learnings do # レベル条件を満たしている場合 if skill.level <= actor.level then # 習得スキルに追加 @last_skills_array[i].push(skill.skill_id) end end # 習得スキルに追加 @last_skills_array[i] += actor.skills # 重複する要素を除外 @last_skills_array[i].uniq! end # 元の処理を実行 start_phase5_MITO_RGSS_120 end #-------------------------------------------------------------------------- # ● 最終能力値の記憶 # actor : アクター #-------------------------------------------------------------------------- def save_last_parameter(actor) @lvup_window.data[actor] = [] @lvup_window.data[actor][0] = actor.level @lvup_window.data[actor][1] = actor.maxhp @lvup_window.data[actor][2] = actor.maxsp @lvup_window.data[actor][3] = nil @lvup_window.data[actor][4] = actor.str @lvup_window.data[actor][5] = actor.dex @lvup_window.data[actor][6] = actor.agi @lvup_window.data[actor][7] = actor.int end #-------------------------------------------------------------------------- # ● 現在のパラメータの取得 # actor : アクター # index : 項目 #-------------------------------------------------------------------------- def look_parameter(actor, index) # 項目に応じて分岐 case index when 0 then return actor.level when 1 then return actor.maxhp when 2 then return actor.maxsp when 3 then return nil when 4 then return actor.str when 5 then return actor.dex when 6 then return actor.agi when 7 then return actor.int end end #-------------------------------------------------------------------------- # ● 習得したスキルの表示 # actor : アクター #-------------------------------------------------------------------------- def learning_skills_pop(actor) # 最新のスキル learning_skills = [] # ループ処理 for skill in $data_classes[actor.class_id].learnings do # レベル条件を満たしている場合 if skill.level <= actor.level then # 最新のスキルに追加 learning_skills.push(skill.skill_id) end end # 最新のスキルにアクターのスキルを追加 learning_skills += actor.skills # 重複する要素を除外 learning_skills.uniq! # 習得済みスキルを除外 learning_skills -= @last_skills_array[actor.index] # スキルを習得していない場合 if learning_skills.empty? # メソッドを返す return end # ループ処理 for id in learning_skills do # スキルを取得 skill = $data_skills[id] # 習得MEを演奏 data = MINTO::Skill_SE_Data Audio.se_play(data[0], data[1], data[2]) text = "\\c[1]#{skill.name}\\c[0]#{MINTO::LearningMessage}" # スキル名を表示 @center_help_window.set_text(text) # 表示が終わるまでループ while @center_help_window.visible == true # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # センターヘルプウィンドウを更新 @center_help_window.update end end end #-------------------------------------------------------------------------- # ● レベルアップモーション #-------------------------------------------------------------------------- def level_up_motion # ポップ作成 @pop = Mint_Pop.new # ループ処理(パーティー) for id in 0...$game_party.actors.size do # アクターを取得 actor = $game_party.actors[id] # パラメータウィンドウをリフレッシュ @lvup_window.refresh(actor) # レベルが上がっている場合 if actor.level > @lvup_window.data[actor][0] then # パラメータウィンドウを表示 @lvup_window.visible = true # ループ処理 for i in (0..7) do # 描写座標を設定 x = 168 + ((i / 4) * 160) y = 172 + ((i % 4) * 32) # 上昇したパラメータを読み込む parameter = look_parameter(actor, i) # 結果を収納する string = "+#{parameter.to_i - @lvup_window.data[actor][i].to_i}" # 無効なパラメータの場合 if parameter.nil? then # 次のパラメータへ next end # 上昇後のパラメータを設定 @lvup_window.data[actor][i] = parameter # パラメータウィンドウをリフレッシュ @lvup_window.draw_status(actor, i) # ポップ描写 @pop.string_pop(string, x, y) # ウェイトカウントを設定 wait = i == 7 ? 160 : 6 # ポップSEを演奏 data = MINTO::SE_Data Audio.se_play(data[0], data[1], data[2]) # フレーム更新 wait.times do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # スプライトセットを更新 @spriteset.update # ポップを更新 @pop.update # パラメータウィンドウを更新 @lvup_window.update # 最終インデックスの場合 if i == 7 then # ポーズサインを表示する @lvup_window.pause = true # C ボタンが押された場合 if Input.trigger?(Input::C) == true then # ポーズサインを非表示にする @lvup_window.pause = false # 更新を中断 break end end end end end # 習得したスキルを表示 learning_skills_pop(actor) # ポップを解放 @pop.dispose # パラメータウィンドウを閉じる @lvup_window.visible = false end end #-------------------------------------------------------------------------- # ● フレーム更新 (アフターバトルフェーズ) #-------------------------------------------------------------------------- alias update_phase5_MITO_RGSS_120 update_phase5 def update_phase5 # 元の処理を実行 update_phase5_MITO_RGSS_120 # ウェイトカウントが0の場合 if @phase5_wait_count.zero? == true then # 演出未実行の場合 unless @levelup_effect then # レベルアップモーション level_up_motion # フラグをオンにする @levelup_effect = true end end end end #============================================================================== # ■ Mint_Pop #------------------------------------------------------------------------------ #  数字のスプライト表示を扱うクラスです。 #============================================================================== class Mint_Pop #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @string_pop_sprite = [] @string_pop_duration = [] end #-------------------------------------------------------------------------- # ● ストリングポップ # string : 求められた文字列 # x : X座標 # y : Y座標 #-------------------------------------------------------------------------- def string_pop(string = "", x = 0, y = 0) # string が無効なら処理を終了 return if string == "" # スプライトを生成 string_pop_sprite = Sprite.new # 文字を描写 string_pop_sprite.bitmap = Bitmap.new(96, 40) string_pop_sprite.bitmap.font.size = 17 string_pop_sprite.bitmap.font.color.set(0, 0, 0) string_pop_sprite.bitmap.draw_text(-1, 12-1, 96, 32, string, 1) string_pop_sprite.bitmap.draw_text(+1, 12-1, 96, 32, string, 1) string_pop_sprite.bitmap.draw_text(-1, 12+1, 96, 32, string, 1) string_pop_sprite.bitmap.draw_text(+1, 12+1, 96, 32, string, 1) string_pop_sprite.bitmap.font.color.set(176, 255, 144) string_pop_sprite.bitmap.draw_text(0, 12, 96, 32, string, 1) # 座標データを代入 string_pop_sprite.x = x string_pop_sprite.y = y string_pop_sprite.z = 10032 # 配列の先頭にシフト @string_pop_sprite.unshift(string_pop_sprite) @string_pop_duration.unshift(40) end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose # ループ処理 for i in 0...@string_pop_sprite.size do # 有効なスプライトの場合 unless @string_pop_sprite[i].nil? then # スプライトを解放 @string_pop_sprite[i].bitmap.dispose @string_pop_sprite[i].dispose @string_pop_sprite[i] = nil @string_pop_duration[i] = nil end end # 配列内容をクリア @string_pop_sprite.clear @string_pop_duration.clear end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # 1つでもストリングポップが表示中の場合 if @string_pop_sprite.size > 0 # 表示中のストリングポップを1つずつ処理する for i in 0...@string_pop_sprite.size # ストリングポップを代入 string = @string_pop_sprite[i] # カウントが0の場合 if @string_pop_duration[i] == 0 # 次の処理へ next end # カウントを減らす @string_pop_duration[i] -= 1 # 残りカウントに応じて分岐 case @string_pop_duration[i] when 36..39 string.y -= 4 when 33..37 string.y -= 2 when 32..34 string.y += 2 when 25..32 string.y += 4 end end end end end end