#◆◇◆◇◆ アクティブレベルアップVX ver 1.25 ◇◆◇◆◇ # 開発者用・高速数字描写機構 ver 1.11 以降必須 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.25(2012/07/21) KGC Software(現Kamesoft)さんの獲得経験値&ゴールド変化に対応 ○ ver 1.24(2012/03/03) 確保人数を減らすと顔グラの表示がおかしくなるミスを修正 ○ ver 1.23(2009/12/14) 未完のダンボールさんの[戦闘後に台詞入れ]に対応 ○ ver 1.22(2009/07/12) イベントで負けるとハマるミスを修正 ○ ver 1.21(2009/06/14) イベントで勝利するとハマるミスを修正 ○ ver 1.20(2009/05/31) 他サイトさんのレベル限界突破に対応 ○ ver 1.19(2009/05/23) 顔グラフィックの算出が誤っていたミスを修正 ○ ver 1.18(2009/05/15) KGC Softwareさんの[ドロップアイテム拡張]に対応 ドロップ表記のミスを修正 ○ ver 1.17(2009/04/22) 戦闘終了メッセージを表示 ○ ver 1.16(2009/03/02) グラフィックの変更に対応 ○ ver 1.15(2009/02/22) KGC Softwareさんの[モンスター図鑑]に対応 レイアウトを微修正 ○ ver 1.14(2009/02/17) 修正と入手アイテム表示を統一化 ○ ver 1.13(2009/02/17) 確保人数未満のPTでエラー落ちするミスを修正 ○ ver 1.12(2009/02/16) バトル中断が無視されるミスを修正 NewSkill表示ミスを修正 処理を軽処理化 ○ ver 1.11(2009/02/15) 他サイトさんの戦闘メンバー拡張に対応 他、細かい仕様を変更 ○ ver 1.10(2009/02/15) KGCさんとの併用に係わるミスを修正 ○ ver 1.09(2009/02/14) KGC Softwareさんの[スキル習得装備]に対応 URL http://ytomy.sakura.ne.jp/ ○ ver 1.08(2009/02/13) 全滅などでハマってしまうミスを修正 ○ ver 1.07(2009/02/13) RPG探検隊さんとの併用を考慮 ○ ver 1.06(2009/02/13) 汎用性を向上、演出も微強化 ○ ver 1.05(2009/02/11) 入れ替えに不対応だったミスを修正 ○ ver 1.04(2009/02/10) 戦闘不能メンバーが表示されないミスを修正 ゲージ加算SEを追加 ○ ver 1.03(2009/02/07) グラフィック関連のミスを修正 ○ ver 1.02(2009/01/31) 勝利以外の戦闘終了で落ちるミスを修正 ○ ver 1.01(2009/01/27) NewSkillの表示フラグが間違っていたミスを修正 ○ ver 1.00(2009/01/25) 公開 ■ 説明 なるべく下の方にセクションを作成し、 本スクリプトを導入してください。 戦闘終了時のリザルト表示を カシャカシャEXP獲得表示に変更します。 ゲージもアクティブで変動し、 いっぱいになったらレベルアップします。 また、その際は専用のグラフィックに変更されます。 画像はサンプルのものを使用していただいて構いません。 演出はCボタン(Enterキー)でカットできます。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # アクティブレベルアップVXを有効化 ( true で有効 / false で無効 ) RGSS["Active_Lv_UpVX"] = true end # アクティブレベルアップVXが有効な場合に以降の処理を実行する if MINTO::RGSS["Active_Lv_UpVX"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズをここで行います。 #============================================================================== module MINTO # 使用する顔グラグラフィックファイル名 # Face_Name[ID] = ["通常時のファイル末尾名", "LVUP時のファイル末尾名"] # すべてピクチャーフォルダを参照します。 # ※ ファイル名は機械的に参照します。 # たとえば、Face_Name[1] = ["普", "笑"]と設定し、 # ファイル名がActor1でインデックスが0の場合、 # 実際のファイル名は Actor1_0普, Actor1_0笑 となります。 # 原則、全アクター分設定してください。 # nil の場合は「現在の設定グラフィック」を参照します。 Face_Name = [] # 変更しない Face_Name[1] = [nil, nil] Face_Name[2] = [nil, nil] Face_Name[3] = [nil, nil] Face_Name[4] = [nil, nil] Face_Name[5] = [nil, nil] Face_Name[6] = [nil, nil] Face_Name[7] = [nil, nil] Face_Name[8] = [nil, nil] Face_Name[9] = [nil, nil] Face_Name[10] = [nil, nil] Face_Name[11] = [nil, nil] Face_Name[12] = [nil, nil] # 確保するメンバーサイズ # 他サイトさんの戦闘メンバー拡張スクリプトを導入している場合は、 # その最大数を設定してください Max_Size = 4 # 演出用の最終レベル #(他サイトさんのレベル限界変更スクリプトを導入している場合は、 # その最終値を入力してください) Final_Level = 99 # 空EXPゲージの名前 Base_EXP_Gauge = "gauge" # 本体EXPゲージの名前 A_EXP_Gauge = "gauge_exp2" # 演出時間フレーム #(1秒間が基本的に60フレームです。 # ただし、入手EXPがそれ未満の場合はEXP分のフレーム時間になります) LVUP_Frame = 300 # ゲージ加算SE([ファイル名, ボリューム, ピッチ) # ※ マシンスペックが高くないと、おそらく処理落ちします # 不要な場合はSE名に "" を設定してください Gauge_SE = ["Decision1", 80, 400] # LVUP時に鳴らすSE([ファイル名, ボリューム, ピッチ) LVUP_SE = ["Up", 100, 150] #-------------------------------------------------------------------------- # ● KGC Softwareスクリプトの検索 # key : スクリプトキー #-------------------------------------------------------------------------- def self.search_kgc(key) # 指定されたスクリプトが有効かどうか調べる $imported != nil and $imported[key] == true end end #============================================================================== # ■ MINTO_Number #------------------------------------------------------------------------------ #  ピクチャーよる数字の表示を扱うモジュールです。 # このモジュールは数値の高速描写に特化したモジュールとなっています。 #============================================================================== module MINTO_Number #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- WIDHT = -4 # 横幅調節値 HEIGHT = 24 # 1カラーの高さ #-------------------------------------------------------------------------- # ● 数字の描写 # x : 描写先 X 座標 # y : 描写先 Y 座標 # number : 描写する数字 # bitmap : 使用するビットマップ # color : 使用するカラーインデックス # text : 使用する画像ファイル名 #-------------------------------------------------------------------------- def self.draw_number(x, y, number, bitmap, color = 0, text = "String02") # ピクチャーの読み込み picture = Cache.picture(text) # ピクチャーの基本の横幅を取得する width_base = picture.width / 10.0 # 求められた数字を一文字ずつ配列にする array = number.to_s.split(//) # ループ処理(イテレータ) (0...array.size).each do |i| # 描写座標を計算 draw_x = array[i].to_i * width_base draw_y = HEIGHT * color # 描写座標を取得する rect = Rect.new(draw_x, draw_y, width_base, HEIGHT) # 数字を描写 bitmap.blt(x + (i * (width_base + WIDHT)), y + 4, picture, rect) end end end #============================================================================== # ■ Mint_Gauge_System_Active #------------------------------------------------------------------------------ #  ピクチャーゲージのスプライト表示を扱うクラスです。 # このクラスはゲージの高速再描写に特化したクラスとなっています。 #============================================================================== class Mint_Gauge_System_Active #-------------------------------------------------------------------------- # ● オブジェクト初期化 # gauge : ゲージ画像 #-------------------------------------------------------------------------- def initialize(x, y, z = 500, type = 0) # 空ゲージを読み込む gauge_base = Cache.picture(MINTO::Base_EXP_Gauge) # 空ゲージ用のスプライトを作成 @sprite_gauge_base = Sprite.new # 座標を設定 @sprite_gauge_base.x = x @sprite_gauge_base.y = y @sprite_gauge_base.z = z # スプライトを作成 @sprite = @sprite_gauge_base.dup @sprite.x -= 16 @sprite.y -= 16 @sprite.z += 1 @sprite.bitmap = Bitmap.new(64, 32) @sprite.bitmap.font.color.set(0, 200, 250) # 空ゲージを描写 @sprite_gauge_base.bitmap = gauge_base # 本体ゲージを読み込む @gauge = gauge_initialize(type) # 本体ゲージ用の配列を作成 @sprite_gauge = [Sprite.new] (1..6).each do |i| # 本体ゲージ用のスプライトを作成 @sprite_gauge[i] = Sprite.new # 座標を設定 @sprite_gauge[i].x = (x - i) + 8 @sprite_gauge[i].y = y + i @sprite_gauge[i].z = z end end #-------------------------------------------------------------------------- # ● ゲージ用ビットマップの作成 #-------------------------------------------------------------------------- def gauge_initialize(type) # タイプに応じて分岐 case type when 0 # ゲージの読み込み gauge = Cache.picture(MINTO::A_EXP_Gauge) end # 本体ゲージ用のスプライトを作成 sprite_gauge = [] (1..100).each do |i| # 本体ゲージ用のビットマップを作成 sprite_gauge[i] = Bitmap.new(i, 1) # 本体ゲージ用の描写範囲を計算 dest_rect = Rect.new(0, 0, i, 1) sprite_gauge[i].stretch_blt(dest_rect, gauge, gauge.rect) end return sprite_gauge end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose # スプライトを解放 for s in @sprite_gauge s.dispose end @sprite_gauge_base.bitmap.dispose @sprite_gauge_base.dispose @sprite.bitmap.dispose @sprite.dispose end #-------------------------------------------------------------------------- # ● 縁文字描写 #-------------------------------------------------------------------------- def draw_frame_text(x, y, width, height, text, ag = 0) # 元の色を保存 ori_color = @sprite.bitmap.font.color.clone # 縁の色を定義 @sprite.bitmap.font.color.set(0, 0, 0) # 縁文字を描写 @sprite.bitmap.draw_text(x-1, y, width, height, text, ag) @sprite.bitmap.draw_text(x+1, y, width, height, text, ag) @sprite.bitmap.draw_text(x, y-1, width, height, text, ag) @sprite.bitmap.draw_text(x, y+1, width, height, text, ag) # 元の色に戻す @sprite.bitmap.font.color = ori_color # 本体の文字を描写 @sprite.bitmap.draw_text(x, y, width, height, text, ag) end #-------------------------------------------------------------------------- # ● 可視状態の取得 #-------------------------------------------------------------------------- def visible # 先頭の可視状態を返す return @sprite_gauge[1].visible end #-------------------------------------------------------------------------- # ● 可視状態の変更 # visible : 新しい可視状態 #-------------------------------------------------------------------------- def visible=(visible) # 可視状態の変更(イテレータ) (1..6).each{|i| @sprite_gauge[i].visible = visible} @sprite_gauge_base.visible = visible end #-------------------------------------------------------------------------- # ● レートの設定 # rate : ゲージの減少率 #-------------------------------------------------------------------------- def set_rate(rate) rate = [[rate, 100].min, 0].max # ゲージを実際に描写 @sprite_gauge[1].bitmap = @gauge[rate] @sprite_gauge[2].bitmap = @gauge[rate] @sprite_gauge[3].bitmap = @gauge[rate] @sprite_gauge[4].bitmap = @gauge[rate] @sprite_gauge[5].bitmap = @gauge[rate] @sprite_gauge[6].bitmap = @gauge[rate] end end #============================================================================== # ■ Object #------------------------------------------------------------------------------ #  全てのクラスのスーパークラス。オブジェクトの一般的な振舞いを定義します。 #============================================================================== class Object #-------------------------------------------------------------------------- # ● 深い複製の作成 #-------------------------------------------------------------------------- def deep_copy # Marshalモジュールを経由して、完全な複製を作成 return Marshal.load(Marshal.dump(self)) end end #============================================================================== # ■ Numeric #------------------------------------------------------------------------------ #  数値全般を扱う組み込みクラスです。 #============================================================================== class Numeric #-------------------------------------------------------------------------- # ● 最大値の設定 # max : 求められた最大の数値 #-------------------------------------------------------------------------- def to_max(min, max) if self > max return max elsif self < min return min else return self end end #-------------------------------------------------------------------------- # ● 最大値の設定 # max : 求められた最大の数値 #-------------------------------------------------------------------------- def to_m(max) if self > max return max else return self end end #-------------------------------------------------------------------------- # ● 最小値の設定 # min : 求められた最小の数値 #-------------------------------------------------------------------------- def to_min(min) if self < min return min else return self end end end #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :after_battle_phase # アフターバトルフェーズ中フラグ end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● EXPリストの取得 #-------------------------------------------------------------------------- def exp_list return @exp_list end #-------------------------------------------------------------------------- # ● ゲージ用のEXP_NEXT の取得 #-------------------------------------------------------------------------- def minto_next_exp(lv, exp) exp_rate = @exp_list[lv+1] - @exp_list[lv] next_exp = @exp_list[lv+1] - exp rate = (next_exp * 100) / exp_rate if @exp_list[lv+1] == 0 rate = 100 end return 100 - rate end #-------------------------------------------------------------------------- # ● 次のレベルまでの EXP 取得 #-------------------------------------------------------------------------- def next_rest_exp2(lv, exp) return @exp_list[lv+1] > 0 ? (@exp_list[lv+1] - exp) : 0 end #-------------------------------------------------------------------------- # ○ AP 獲得(KGC[EquipLearnSkill]再定義) # ap : AP の増加量 # show : マスタースキル表示フラグ #-------------------------------------------------------------------------- def gain_ap(ap, show) # 最終スキルを記憶 last_full_ap_skills = full_ap_skills # 装備品により習得しているスキルに AP を加算 equipment_skills(true).each do |skill| # APの変更 change_ap(skill, skill_ap(skill.id) + ap) end # マスタースキル表示フラグが有効で、且つスキル要素が異なっている場合 if show == true and (last_full_ap_skills != full_ap_skills) then # メソッドを返す(スキル習得) return true end # メソッドを返す(スキル未習得) return false end #-------------------------------------------------------------------------- # ○ マスターしたスキルの表示(KGC[EquipLearnSkill]再定義) # new_skills : 新しくマスターしたスキルの配列 #-------------------------------------------------------------------------- def display_full_ap_skills(new_skills) # 無効化(処理を行わない) return end end #============================================================================== # ■ Game_Troop #------------------------------------------------------------------------------ #  敵グループおよび戦闘に関するデータを扱うクラスです。バトルイベントの処理も # 行います。このクラスのインスタンスは $game_troop で参照されます。 #============================================================================== class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # ● ドロップアイテムの配列作成) # forcing : 強制フラグ #-------------------------------------------------------------------------- def make_drop_items(forcing = false) # 配列を作成 drop_items = [] # 強制フラグがオフの場合 if forcing == false then # メソッドを返す return drop_items end # ループ処理 for enemy in dead_members do # 無効なエネミーの場合 if enemy == nil then # 次の候補へ next end # ドロップアイテム群を取得 drop_items_array = [enemy.drop_item1, enemy.drop_item2] # ループ処理 for i in 0...2 do # ドロップアイテムを取得 drop_item = drop_items_array[i] # 無効なアイテムの場合 if drop_item.kind == 0 then # 次の候補へ next end # ドロップアイテムを入手していない場合 if rand(drop_item.denominator) != 0 then # 次の候補へ next end # ドロップアイテムの種別に応じて分岐 case drop_item.kind # アイテム when 1 then # ドロップアイテムを入手 drop_items.push($data_items[drop_item.item_id]) # 武器 when 2 then # ドロップアイテムを入手 drop_items.push($data_weapons[drop_item.weapon_id]) # 防具 when 3 then # ドロップアイテムを入手 drop_items.push($data_armors[drop_item.armor_id]) end # KGC[モンスター図鑑]が有効な場合 if MINTO.search_kgc("EnemyGuide") == true then # ドロップ済みフラグをセット KGC::Commands.set_enemy_item_dropped(enemy.enemy.id, i) end end # KGC[ドロップアイテム拡張]が有効な場合 if MINTO.search_kgc("ExtraDropItem") == true then # ループ処理(KGCアイテムドロップ拡張) for ex_index in 0...enemy.extra_drop_items.size do # 拡張ドロップアイテムを取得 extra_drop = enemy.extra_drop_items[ex_index] # 無効な種類の場合 if extra_drop.kind.zero? then # 次の候補へ next end # 入手確率で指定されている場合 if extra_drop.drop_prob >= 1 then # 入手出来なかった場合 unless extra_drop.drop_prob > rand(100) then # 次の候補へ next end # 入手分母で指定されている場合 else # 入手出来なかった場合 unless (rand(extra_drop.denominator)).zero? # 次の候補へ next end end # 拡張ドロップアイテムの種別に応じて分岐 case extra_drop.kind # アイテム when 1 then # ドロップアイテムを入手 drop_items.push($data_items[extra_drop.item_id]) # 武器 when 2 then # ドロップアイテムを入手 drop_items.push($data_weapons[extra_drop.weapon_id]) # 防具 when 3 then # ドロップアイテムを入手 drop_items.push($data_armors[extra_drop.armor_id]) end # KGC[モンスター図鑑]が有効な場合 if MINTO.search_kgc("EnemyGuide") == true then # ドロップ済みフラグをセット KGC::Commands.set_enemy_item_dropped(enemy.enemy.id, ex_index + 2) end end end end # 入手したアイテムを返す return drop_items end end #============================================================================== # ■ Window_BattleMessage #------------------------------------------------------------------------------ #  戦闘中に表示するメッセージウィンドウです。通常のメッセージウィンドウの機能 # に加え、戦闘進行のナレーションを表示する機能を持ちます。 #============================================================================== class Window_BattleMessage < Window_Message #-------------------------------------------------------------------------- # ● 可視状態の変更 # visible : 新しい可視状態 #-------------------------------------------------------------------------- def visible=(visible) # アフターバトルフェーズ中の場合 if $game_temp.after_battle_phase == true then # スーパークラスを実行(文章の無効化) super(visible) # メッセージを不可視にする $game_message.visible = false # メッセージとそれに係わるフラグを無効化 $game_message.texts.clear # アフターバトルフェーズ中でない場合 else # スーパークラスを実行(通常の処理) super(visible) end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias :update_Active_Lv_UpVX :update def update # 元の処理を実行 update_Active_Lv_UpVX # アフターバトルフェーズ中の場合 if $game_temp.after_battle_phase == true then # ウィンドウを可視状態にする self.visible = true end end end #============================================================================== # ■ Window_BattleResult #------------------------------------------------------------------------------ #  バトル終了時に、獲得した EXP やゴールドなどを表示するウィンドウです。 #============================================================================== class Window_BattleResult < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # exp : EXP # gold : ゴールド # treasures : トレジャー #-------------------------------------------------------------------------- def initialize(exp, gold, treasures, ap = 0) super(272, 0, 272, 416) self.opacity = 255 self.z = 0x270f # 各データを保管 @exp = [exp, 999999].min @gold = [gold, 999999].min @ap = ap @puls = 0 @items = {} # 文字の表示形式を調節 self.contents.font.italic = true # テキストの配列を作成 text_array = ["EXP", $data_system.terms.gold] # APが0以外の場合 if @ap != 0 then # 用語[AP]を追加 text_array << "AP" @puls = 48 end # ループ処理 for i in 0...text_array.size do # テキストを取得 text = text_array[i] # テキスト表示 frame_text(4, 8 + 50 * i, 224, 25, text, system_color) # アンダーライン描写 self.contents.fill_rect(4, 40 + 50 * i, 224, 1, system_color) end # 文字の表示形式を戻す self.contents.font.italic = false # 入手アイテムが1つでも存在する場合 if treasures.to_a != [] then # ループ処理 for item in treasures do # 無効な個数の場合 if @items[item] == nil then # 個数を初期化 @items[item] = 0 end # 個数を加算 @items[item] += 1 # アイテムを入手 $game_party.gain_item(item, 1) end # 重複するアイテムを削除 treasures.uniq! # トレジャー用のテキストを表示 frame_text(4, 24 * 4 + @puls, 256, 24, "入手アイテム", system_color) # 入手アイテム名のY座標 y = 24 * 5 + @puls # ループ処理 for item in treasures do # 入手アイテムを描写 draw_item_name(item, 4, y) y += 24 end end refresh end #-------------------------------------------------------------------------- # ● 縁文字描写 #-------------------------------------------------------------------------- def frame_text(x, y, width, height, text, color, ag = 0) self.contents.font.color.set(0, 0, 0) self.contents.font.shadow = false self.contents.draw_text(x-1, y, width, height, text, ag) self.contents.draw_text(x+1, y, width, height, text, ag) self.contents.draw_text(x, y-1, width, height, text, ag) self.contents.draw_text(x, y+1, width, height, text, ag) self.contents.font.color = color self.contents.draw_text(x, y, width, height, text, ag) end #-------------------------------------------------------------------------- # ● アイテム名の描画 # item : アイテム # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_item_name(item, x, y) # 無効なアイテムの場合 if item == nil then # メソッドを返す return end # アイテムのアイコンを描写 draw_icon(item.icon_index, x, y, true) # アイテム名を縁取りして描写 frame_text(x + 28, y, 224, 24, item.name, normal_color) # 対象アイテムを2つ以上入手している場合 if @items[item] >= 2 then # アイテムの入手個数を描写 frame_text(-24, y, 224, 24, "×", normal_color, 2) frame_text(0, y, 224, 24, @items[item].to_s, normal_color, 2) end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.openness = 1 $scene.active_gauge_window.openness = 1 $scene.active_gauge_window.visible = true # 16フレーム待つ 16.times do # ウィンドウを開く self.openness += 16 $scene.active_gauge_window.openness += 16 # ゲーム画面を更新 Graphics.update end # EXPを描写 MINTO_Number.draw_number(96, 4, @exp, self.contents, 1) # ゴールドを描写 MINTO_Number.draw_number(96, 52, @gold, self.contents, 1) # APが0以外の場合 if @ap != 0 then # APを描写 MINTO_Number.draw_number(96, 100, @ap, self.contents, 1) end # ゲージウィンドウをリフレッシュ $scene.active_gauge_window.refresh_exp end end #============================================================================== # ■ Window_Active_Exp #------------------------------------------------------------------------------ #  獲得したEXPに応じて、ゲージを変動させるウィンドウです。 #============================================================================== class Window_Active_Exp < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 # exp : EXP #-------------------------------------------------------------------------- def initialize(exp, skills) super(0, 0, 272, 416) @exp = exp # EXP表示用の配列を作成 @text = [] # LV表示用の配列を作成 @lv = [] # EXPゲージ用の配列 @exp_gauge = [] # スキル保存用の配列 @skills = [] # ループ処理 for i in 0...$game_party.members.size do # 配列を初期化 @skills[i] = [] # ループ処理 for id in 0...skills[i].size do # スキルが有効な場合 if skills[i] != nil and skills[i][id] != nil then # 最終スキルの配列の複製を作成 @skills[i] << skills[i][id].id end end end # 演出スキップフラグをクリア @skip = false self.opacity = 255 self.z = 9999 # スプライトを作成 @sprite = Sprite.new # スプライトのビットマップを作成 @sprite.bitmap = Bitmap.new(width - 32, height - 32) # スプライトのデータを設定 @sprite.x = self.x + 16 @sprite.y = self.y + 16 @sprite.z = 10000 # グラフィック用のスプライトを作成 @sprite2 = @sprite.dup @sprite2.z = 9999 @sprite2.bitmap = Bitmap.new(width - 32, height - 32) end #-------------------------------------------------------------------------- # ● プラス座標の取得 #-------------------------------------------------------------------------- def puls_y return (96.0 * (4.0 / MINTO::Max_Size.to_f)).to_i end #-------------------------------------------------------------------------- # ● 修正座標の取得 # y : Y座標 #-------------------------------------------------------------------------- def y_pass(y) return (y * (4.0 / MINTO::Max_Size.to_f)).to_i end #-------------------------------------------------------------------------- # ● スプライトの作成 #-------------------------------------------------------------------------- def sprite_set # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # アクターを取得 actor = $game_party.members[i] # 座標を取得 y = i * puls_y # アクター名を描写 frame_text(96, y, 116, 24, actor.name, normal_color) # 用語を描写 frame_text(64, y + y_pass(32), 64, 24, "LV", system_color, 2) frame_text(64, y + y_pass(66), 64, 24, "NEXT", system_color, 2) end end #-------------------------------------------------------------------------- # ● 顔グラフィックの描画 # face_name : 顔グラフィック ファイル名 # face_index : 顔グラフィック インデックス # x : 描画先 X 座標 # y : 描画先 Y 座標 # size : 表示サイズ #-------------------------------------------------------------------------- def draw_face(face_name, face_index, x, y, size = puls_y) rect = Rect.new(0, 0, 0, 0) rect.x = (face_index % 4 * 96 + (96 - 96) / 2) rect.y = (face_index / 4 * 96 + (96 - 96) / 2) rect.width = 96 rect.height = 96 # 対象の範囲を消す @sprite2.bitmap.fill_rect(x, y, puls_y, puls_y, Color.new(0, 0, 0, 0)) @sprite2.bitmap.blt(x, y, Cache.face(face_name), rect) end #-------------------------------------------------------------------------- # ● グラフィックの作成 # actor : アクター # x : 描写先のX座標 # y : 描写先のY座標 # index : インデックス # type : 描写タイプ #-------------------------------------------------------------------------- def graphic_set(actor, x, y, index, type) # 顔グラフィックの配列 face = [] # 顔グラフィック末尾名が有効な場合 unless MINTO::Face_Name[actor.id][type].nil? then # ファイル名を作成 file_name = "#{actor.face_name}_#{actor.face_index}" # ファイル末尾名を取得 file_name += MINTO::Face_Name[actor.id][type] # 顔グラフィックを読み込む face[index] = Cache.picture(file_name) # 対象の範囲を消す rect = Rect.new(x, y, puls_y, puls_y) @sprite2.bitmap.fill_rect(rect, Color.new(0, 0, 0, 0)) # 顔グラフィックを描写 @sprite2.bitmap.blt(x, y, face[index], Rect.new(0, 0, puls_y, puls_y)) # 顔グラフィック末尾名が無効な場合 else # 現在の設定グラフィックを描写 draw_face(actor.face_name, actor.face_index, x, y) end end #-------------------------------------------------------------------------- # ● 縁文字描写 #-------------------------------------------------------------------------- def frame_text(x, y, width, height, text, color, ag = 0) @sprite.bitmap.font.color.set(0, 0, 0) @sprite.bitmap.font.shadow = false @sprite.bitmap.draw_text(x-1, y, width, height, text, ag) @sprite.bitmap.draw_text(x+1, y, width, height, text, ag) @sprite.bitmap.draw_text(x, y-1, width, height, text, ag) @sprite.bitmap.draw_text(x, y+1, width, height, text, ag) @sprite.bitmap.font.color = color @sprite.bitmap.draw_text(x, y, width, height, text, ag) end #-------------------------------------------------------------------------- # ● リフレッシュEXP #-------------------------------------------------------------------------- def refresh_exp # 可視フラグをオン self.visible = true # 用語を描写 sprite_set # 更新フレーム数を作成 thyme = @exp < MINTO::LVUP_Frame ? @exp.abs : MINTO::LVUP_Frame rate_p = @exp < MINTO::LVUP_Frame ? @exp.abs : MINTO::LVUP_Frame # EXPの配列 exp = [] # LVの配列 last_lv = [] # 最終EXPの配列 last_exp = [] # レベルアップフラグ level_up = [] # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| actor = $game_party.members[i] # 座標を取得 x = 160 y = i * puls_y # LV表示用のピクチャー数字を作成 @lv[i] = Mint_Picture_Number.new(x + 16, y + y_pass(46), 2, 10000) # NEXT_EXP表示用のピクチャー数字を作成 @text[i] = Mint_Picture_Number.new(x, y + y_pass(82), 6, 10000) # EXPゲージを作成 @exp_gauge[i] = Mint_Gauge_System_Active.new(x - 16, y + y_pass(102), 9999) # 最終LevelとEXPを代入 last_lv[i] = $scene.last_level[i].to_i last_exp[i] = $scene.last_exp[i].to_i # EXPの獲得が可能な場合 if $game_party.existing_members.include?(actor) then # 基本経験値を計算 actor_exp = @exp # 経験値2倍の場合 if actor.double_exp_gain # 基本経験値を加算 actor_exp *= 2 end # KGC 獲得経験値&ゴールド変化 が有効な場合 if MINTO.search_kgc("VariableExpGold") # 基本経験値を加算 actor_exp *= actor.exp_gain_rate actor_exp /= 100 end # 入手EXPがLVUP_Frame以上なら、LVUP_Frameで割ってその余りを求める if actor_exp > MINTO::LVUP_Frame then last_exp[i] += actor_exp % MINTO::LVUP_Frame end end # グラフィックを描写 graphic_set(actor, 0, y, actor.id, 0) end # 更新フレームがなくなるまで繰り返す thyme.times do # グラフィックをクリア @sprite2.bitmap.clear # Cボタンが押された場合 if Input.trigger?(Input::C) # スキップフラグをオン @skip = true end # スキップしない場合 if @skip != true then # ゲージ加算SEが有効な場合 if MINTO::Gauge_SE[0] != "" then # SEデータを代入 data = MINTO::Gauge_SE # ゲージ加算SEを演奏 Audio.se_play("Audio/SE/#{data[0]}", data[1], data[2]) end end # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # アクターを代入 actor = $game_party.members[i] # EXPの獲得が可能な場合 if $game_party.existing_members.include?(actor) then # 基本経験値を計算 actor_exp = @exp # 経験値2倍の場合 if actor.double_exp_gain # 基本経験値を加算 actor_exp *= 2 end # KGC 獲得経験値&ゴールド変化 が有効な場合 if MINTO.search_kgc("VariableExpGold") # 基本経験値を加算 actor_exp *= actor.exp_gain_rate actor_exp /= 100 end # 描写用のEXPを加算 last_exp[i] += (actor_exp / rate_p) end # NEXT_EXPを取得 next_p = actor.next_rest_exp2(last_lv[i], last_exp[i]) # NEXT_EXPが文字列ではない場合 if next_p.is_a?(Numeric) then # 最低値を0に設定 next_p = next_p.to_min(0) # アクターのマザーデータを取得 d_actor = $data_actors[actor.id] # 最終レベルを代入 final_level = MINTO::Final_Level # レベルアップが可能な場合 # (NEXT_EXPが0で且つ、最終レベルがMAXレベル未満の場合) if next_p == 0 and last_lv[i] < final_level then # 描写用のLVを加算 last_lv[i] += 1 # スキル習得判定 for skill in actor.class.learnings do # レベル条件を満たしている場合 if last_lv[i] >= skill.level then # 最終スキルに存在しない場合 unless @skills[i].include?(skill.skill_id) then # 最終スキルに保存 @skills[i].push(skill.skill_id) # NewSkill表示 @lv[i].string_pop("NewSkill", -64, y_pass(-32)) end end end # スキップしない場合 if @skip != true then # SEデータを代入 data = MINTO::LVUP_SE # SEを演奏する Audio.se_play("Audio/SE/#{data[0]}", data[1], data[2]) end # 限界レベルを取得 last_lv[i] = [last_lv[i], final_level].min # LVUP表示 @lv[i].string_pop("lvup", y_pass(-64)) # レベルアップフラグを設定 level_up[i] = true end # レベルアップが有効な場合 if level_up[i] == true then # グラフィックを描写 graphic_set(actor, 0, (i * puls_y), actor.id, 1) else # グラフィックを描写 graphic_set(actor, 0, (i * puls_y), actor.id, 0) end end # ゲージの長さを算出 n = actor.next_rest_exp2(last_lv[i], last_exp[i]) rate = actor.minto_next_exp(last_lv[i], last_exp[i]).to_max(0, 100) # ゲージを更新 @exp_gauge[i].set_rate(rate) # NEXT_EXPを描写 @text[i].set_text(n.to_min(0)) # 最終レベルを描写 @lv[i].set_text(last_lv[i]) # LVUP表示を更新 @lv[i].update end # スキップフラグがオフの場合 if @skip == false then # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update end end # 必須ウェイトタイム(変更しない) thyme = 0 # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # LVUP表示カウントを取得する count = @lv[i].string_pop_duration[0].to_i # thyme より count の方が高ければ thyme を上書き if count > thyme then thyme = count end end # 必須ウェイトタイムが1以上の限り更新する while thyme >= 1 do # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # LVUP表示を更新 @lv[i].update end # カウントを減らす thyme -= 1 # ゲーム画面を更新 Graphics.update end # 入力情報を更新 Input.update end #-------------------------------------------------------------------------- # ● フレーム更新(スキル習得) # learning_skill : 新たにスキルを習得したかどうかのフラグ #-------------------------------------------------------------------------- def update_skill(learning_skill) # SkillLearningSE演奏フラグ learning = 0 # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # アクターを代入 actor = $game_party.members[i] # EXPの獲得が可能な場合 if $game_party.existing_members.include?(actor) then # スキル数が増えている場合 if learning_skill[actor] == true then # SkillLearning表示 @lv[i].string_pop("learning", -64, y_pass(-32)) # SEを演奏する learning = 1 end end end # 一人でもスキルを習得した場合 if learning == 1 then # SEデータを代入 data = MINTO::LVUP_SE # SEを演奏する Audio.se_play("Audio/SE/#{data[0]}", data[1], data[2]) end # 必須ウェイトタイム(変更しない) thyme = 0 # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # LVUP表示カウントを取得する count = @lv[i].string_pop_duration[0].to_i # thyme より count の方が高ければ thyme を上書き if count > thyme then thyme = count end end # ループ処理(必須ウェイトタイム) thyme.times do # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # LVUP表示を更新 @lv[i].update end # ゲーム画面を更新 Graphics.update end # 入力情報を更新 Input.update end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose # ループ処理 for sprite in @text + @lv + @exp_gauge do # 特殊スプライトを解放 sprite.dispose end # スプライトを解放 @sprite.bitmap.dispose @sprite.dispose @sprite2.bitmap.dispose @sprite2.dispose # スーパークラスを実行 super end end #============================================================================== # ■ Scene_Base #------------------------------------------------------------------------------ #  ゲーム中のすべてのシーンのスーパークラスです。 #============================================================================== class Scene_Base #-------------------------------------------------------------------------- # ● 勝利の処理(未完のダンボール[戦闘後に台詞入れ]再定義) #-------------------------------------------------------------------------- def process_victory_plus_talk end #-------------------------------------------------------------------------- # ● 獲得した経験値とお金の表示(未完のダンボール[戦闘後に台詞入れ]再定義) #-------------------------------------------------------------------------- def display_exp_and_gold_fast end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :last_exp # 最終EXP attr_reader :last_level # 最終レベル attr_reader :last_skills # 最終スキルの配列 attr_reader :active_battler attr_accessor :active_gauge_window # ゲージウィンドウ #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- alias :terminate_Active_Lv_UpVX :terminate def terminate # アクティブゲージウィンドウが有効な場合 if @active_gauge_window != nil then # アクティブゲージウィンドウを解放 @active_gauge_window.dispose # バトルリザルトウィンドウを解放 @result_window.dispose end # 元の処理を実行 terminate_Active_Lv_UpVX end #-------------------------------------------------------------------------- # ● 戦闘終了 # result : 結果 (0:勝利 1:逃走 2:敗北) #-------------------------------------------------------------------------- alias :battle_end_Active_Lv_UpVX :battle_end def battle_end(result) # バトルイベント実行中の場合 if $game_troop.interpreter.running? == true then case result # バトル中断の場合 when 1 # 元の処理を実行 battle_end_Active_Lv_UpVX(result) # アフターバトルフェーズ中フラグをオフにする $game_temp.after_battle_phase = false # 敗北の場合 when 2 # 元の処理を実行 battle_end_Active_Lv_UpVX(result) # アフターバトルフェーズ中フラグをオフにする $game_temp.after_battle_phase = false # メソッドを返す return end end # 戦闘勝利の場合 if result == 0 then # 100フレーム待つ 100.times do # ゲーム画面を更新 Graphics.update # スプライトセットを更新 @spriteset.update end # アフターバトルフェーズの開始 start_after_battle_phase # Cボタンが押されるまで繰り返す while (Input.trigger?(13) == false) do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # スプライトセットを更新 @spriteset.update end # KGC[スキル習得装備]が有効な場合 if MINTO.search_kgc("EquipLearnSkill") == true then # AP加算(KGC[スキル習得装備]) display_master_equipment_skill(true) # スキル習得表示 @active_gauge_window.update_skill(@learning) # Cボタンが押されるまで繰り返す while (Input.trigger?(13) == false) do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # スプライトセットを更新 @spriteset.update end end end # 元の処理を実行 battle_end_Active_Lv_UpVX(result) # アフターバトルフェーズ中フラグをオフにする $game_temp.after_battle_phase = false end #-------------------------------------------------------------------------- # ● 勝利の処理 #-------------------------------------------------------------------------- alias :process_victory_Active_Lv_UpVX :process_victory def process_victory # アフターバトルフェーズ準備 reservation_after_battle_phase # 元の処理を実行 process_victory_Active_Lv_UpVX end #-------------------------------------------------------------------------- # ● 勝利の処理(未完のダンボール[戦闘後に台詞入れ]再定義) #-------------------------------------------------------------------------- alias :process_victory_plus_talk_Active_Lv_UpVX :process_victory_plus_talk def process_victory_plus_talk # アフターバトルフェーズ準備 reservation_after_battle_phase # 元の処理を実行 process_victory_plus_talk_Active_Lv_UpVX end #-------------------------------------------------------------------------- # ● 獲得した経験値とお金の表示 #-------------------------------------------------------------------------- alias :display_exp_and_gold_Active_Lv_UpVX :display_exp_and_gold def display_exp_and_gold # 戦闘勝利メッセージを取得 text = sprintf(Vocab::Victory, $game_party.name) # 戦闘勝利メッセージを表示 $game_message.texts.push('\.\>' + text) # 20フレーム(3分の1秒)待つ wait(20) # 入力情報を更新 Input.update # アフターバトルフェーズ中フラグをオンにする $game_temp.after_battle_phase = true # 元の処理を実行 display_exp_and_gold_Active_Lv_UpVX end #-------------------------------------------------------------------------- # ● 獲得した経験値とお金の表示(未完のダンボール[戦闘後に台詞入れ]再定義) #-------------------------------------------------------------------------- def display_exp_and_gold_fast # 元の処理を実行 display_exp_and_gold end #-------------------------------------------------------------------------- # ○ マスターしたスキルの表示(KGC[EquipLearnSkill]再定義) # forcing : 強制フラグ #-------------------------------------------------------------------------- def display_master_equipment_skill(forcing = false) # KGC[スキル習得装備]が無効な場合 if MINTO.search_kgc("EquipLearnSkill") == false then # メソッドを返す return end # AP加算済みの場合 if @gain_ap == true then # メソッドを返す return end # 強制されていない場合 if forcing == false then # メソッドを返す return end # スキル習得フラグのハッシュ @learning = {} # APを取得 ap = $game_troop.ap_total # ループ処理(パーティー) $game_party.existing_members.each do |actor| # AP加算 @learning[actor] = actor.gain_ap(ap, true) end # AP加算済みフラグをオンにする @gain_ap = true end #-------------------------------------------------------------------------- # ● アフターバトルフェーズの準備 #-------------------------------------------------------------------------- def reservation_after_battle_phase # 最終EXPとレベルを初期化 @last_exp = [] @last_level = [] # 最終スキルの配列 @last_skills = [] # パーティー人数分だけ繰り返す(イテレータ) (0...$game_party.members.size).each do |i| # アクターを取得 actor = $game_party.members[i] # 最終EXPを保存 @last_exp[i] = actor.exp.to_i # 最終レベルを保存 @last_level[i] = actor.level.to_i # 最終スキルの取得 @last_skills[i] = actor.skills.deep_copy end # リザルトデータを記憶 @exp = $game_troop.exp_total @gold = $game_troop.gold_total @drop_items = $game_troop.make_drop_items(true) @ap = 0 # KGC[スキル習得装備]が有効な場合 if MINTO.search_kgc("EquipLearnSkill") == true then # APを記憶 @ap = $game_troop.ap_total end end #-------------------------------------------------------------------------- # ● アフターバトルフェーズの開始 #-------------------------------------------------------------------------- def start_after_battle_phase # アクティブゲージウィンドウを作成 @active_gauge_window = Window_Active_Exp.new(@exp, @last_skills) # バトルリザルトウィンドウを作成 @result_window = Window_BattleResult.new(@exp, @gold, @drop_items, @ap) end end end