#◆◇◆◇◆ アクティブ・バトルステータス2 RTAB ver 1.04 ◇◆◇◆◇ # 全マスタースクリプト共通スクリプト # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと # リアルタイム・アクティブバトル(RTAB) ver 1.16 # 配布元・サポートURL(歯車の城) # http://members.jcom.home.ne.jp/cogwheel/ # by ショウ =begin ※ 動作確認はRTAB本体(ver 1.16)と本スクリプトのみで行っています。 それ以外のRTAB関連のスクリプト(※1)との併用は保障しかねます。 RTAB本体の真下か、 可能な限り近いで且つ、RTAB本体よりも下の位置においてください。 ※1 みんとのお部屋のRTAB対応スクリプトは除きます。 ■ 更新履歴 ○ ver 1.04(2010/03/30) 戦闘中の入れ替えに非対応だったミスを修正 ○ ver 1.03(2009/01/11) 描写関係のミスを修正 ○ ver 1.02(2009/12/29) 致命的なエラーを修正 ○ ver 1.01(2009/12/01) ウィンドウの消し忘れを修正 ○ ver 1.00(2009/11/29) 公開 ■ 説明 アクティブ・バトルステータスの後継版です。 見た目をコンパクトにし、 バトラーの表示を引き立てます。 数値も前作同様にカシャカシャ表示されます。 画像はサンプルのものを使用していただいて構いません。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # アクティブ・バトルステータス2を有効化 ( true で有効 / false で無効 ) RGSS["アクティブ・バトルステータス2"] = true end # アクティブ・バトルステータス2が有効な場合に以降の処理を実行する if MINTO::RGSS["アクティブ・バトルステータス2"] == true then #============================================================================== # ■ 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 #-------------------------------------------------------------------------- # ● 求めた数値に対するパーセンテージを返す # order : 求められた数値 #-------------------------------------------------------------------------- def rate(order) return 100 if order == 0 return (self * 100) / order end end #============================================================================== # ■ Sprite #------------------------------------------------------------------------------ #  スプライト表示を扱う組み込みクラスです。 #============================================================================== class Sprite #-------------------------------------------------------------------------- # ● 座標の設定 #-------------------------------------------------------------------------- def rect_set(x, y, z = 100) self.x = x if x self.y = y if y self.z = z if z 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 #-------------------------------------------------------------------------- # ● 縁文字描写 # x : 文章の X 座標 # y : 文章の Y 座標 # width : 文章の描写範囲(横幅) # height : 文章の描写範囲(高さ) # text : 文章 # align : アラインメント (0..左揃え、1..中央揃え、2..右揃え) #-------------------------------------------------------------------------- def frame_text(x, y, width, height, text, ag = 0) # 元の色を保存 ori_color = font.color.clone # 縁の色を定義 font.color.set(0, 0, 0) # 縁文字を描写 draw_text(x-1, y, width, height, text, ag) draw_text(x+1, y, width, height, text, ag) draw_text(x, y-1, width, height, text, ag) draw_text(x, y+1, width, height, text, ag) # 元の色に戻す font.color = ori_color # 本体の文字を描写 draw_text(x, y, width, height, text, ag) end end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :last_hp # 最終HP attr_accessor :last_hp2 # 最終HP2 attr_accessor :last_hp3 # 最終HP3 attr_accessor :last_sp # 最終SP attr_accessor :last_sp2 # 最終SP2 attr_accessor :last_sp3 # 最終SP3 end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :status # ステータス #-------------------------------------------------------------------------- # ● HP の変更 # hp : 新しい HP #-------------------------------------------------------------------------- def hp=(hp) super(hp) @last_hp = @last_hp2 @last_hp2 = @hp end #-------------------------------------------------------------------------- # ● SP の変更 # sp : 新しい SP #-------------------------------------------------------------------------- def sp=(sp) super(sp) @last_sp = @last_sp2 @last_sp2 = @sp end end #============================================================================== # ■ Window_DetailsStatus #------------------------------------------------------------------------------ #  バトル画面でアクターのステータスを個々に表示するウィンドウです。 #============================================================================== class Window_DetailsStatus < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor, id, x) @status_id = id super(x, 320 + id * 26, 160, 164) self.contents = Bitmap.new(width - 32, height - 32) self.opacity = 0 self.back_opacity = 0 refresh(actor, false) end #-------------------------------------------------------------------------- # ● 名前の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_name(actor, x, y) self.contents.font.color = normal_color self.contents.draw_text(x, y, 120, 24, actor.name) end #-------------------------------------------------------------------------- # ● HP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_hp(actor, x, y, width = 144) end #-------------------------------------------------------------------------- # ● SP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_sp(actor, x, y, width = 144) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(actor, level_up_flags = false) self.contents.clear case @status_id when 0 draw_actor_name(actor, 4, 48) self.contents.font.size = 15 self.contents.font.color = Color.new(255, 160, 0) self.contents.frame_text(4, 64, 48, 24, $data_system.words.hp) self.contents.font.color = Color.new(0, 192, 255) self.contents.frame_text(4 + 72, 64, 128, 24, $data_system.words.sp) self.contents.font.size = Font.default_size when 4 draw_actor_atg(actor, 64, 0, 64) end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_ABS_light update def update # 元の処理を実行 update_ABS_light if $game_party.actors[@status_id] $game_party.actors[@status_id].status.active_refresh end end end #============================================================================== # ■ Window_BattleStatus #------------------------------------------------------------------------------ #  バトル画面でパーティメンバーのステータスを表示するウィンドウです。 #============================================================================== class Window_BattleStatus < Window_Base #-------------------------------------------------------------------------- # ● ステートの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_state(actor, x, y, width = 120) text = make_battler_state_text(actor, width, true) self.contents.font.color = actor.hp == 0 ? knockout_color : normal_color self.contents.draw_text(x, y, width, 24, text) end #-------------------------------------------------------------------------- # ● ステータスの更新 #-------------------------------------------------------------------------- def update_status # ループ処理 for i in (0...$game_party.actors.size) do # アクターを取得 actor = $game_party.actors[i] if @status[actor].nil? @status[actor] = ViewData_BattleStatus.new(actor, i) actor.status = @status[actor] end end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose for window in @actor_window window.dispose end # ピクチャー数値を解放 for status in @status.keys do @status[status].dispose end super end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- alias refresh_ABS_light refresh def refresh(number = 0) if self.contents == nil self.contents = Bitmap.new(width - 32, height - 32) end # ステータスを初期化 if @status.nil? then @status = {} update_status end # 元の処理を実行 refresh_ABS_light for number in 0...$game_party.actors.size do x = number * 160 + 4 # 描写範囲をクリア self.contents.rect_clear(x, 108, 160, 24) # アクターを取得 actor = $game_party.actors[number] self.contents.font.size = 15 if @status[actor].nil? and actor != nil @status[actor] = ViewData_BattleStatus.new(actor, number) actor.status = @status[actor] end draw_actor_state(actor, x, 108, 64) self.contents.font.size = Font.default_size end for status in @status.keys do @status[status].active_visible end end end #============================================================================== # ■ ViewData_BattleStatus #------------------------------------------------------------------------------ #  戦闘時にHPなどの表示を管理するクラスです。 #============================================================================== class ViewData_BattleStatus #-------------------------------------------------------------------------- # ● 定数 #-------------------------------------------------------------------------- WIDHT = -2 # 横幅調節値 HEIGHT = 24 # 1カラーの高さ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(actor, index, view_port = nil) @actor = actor @actor.last_hp = @actor.hp @actor.last_hp2 = @actor.hp @actor.last_hp3 = @actor.hp @actor.last_sp = @actor.sp @actor.last_sp2 = @actor.sp @actor.last_sp3 = @actor.sp @index = index @plus = 16 @base_x = actor.screen_x @base_y = 24 @height = 24 @rect = 24 # スプライトを作成 @sprite = Sprite.new(view_port) # ビットマップを設定 @sprite.bitmap = Bitmap.new(160, 160) # 座標を設定 @sprite.rect_set(@base_x - 64, 372, 255) # ピクチャーの読み込み @bitmap = RPG::Cache.picture("Number_B") # HPとMPを初期描写 draw_number(0, @actor.hp, @actor.hp.rate(@actor.maxhp)) draw_number(1, @actor.sp, @actor.sp.rate(@actor.maxsp)) end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @bitmap.dispose @bitmap = nil @sprite.bitmap.dispose @sprite.bitmap = nil @sprite.dispose @sprite = nil end #-------------------------------------------------------------------------- # ● ゲージの描写 # rect : 描写先の情報 # width : 本体ゲージの幅 # bitmap : 使用するビットマップ(Bitmap) # color : 使用するカラーインデックス #-------------------------------------------------------------------------- def draw_gauge(rect, width, color, bitmap) # ゲージの読み込み gauge = RPG::Cache.picture("gauge_set") # ループ処理 for index in 0..rect.height do # 描写先の座標を計算 gauge_x = rect.x# + (7 - index) gauge_y = rect.y + index # 空ゲージの描写範囲を計算 dest_rect = Rect.new(gauge_x, gauge_y, rect.width, 1) # 空ゲージの転送範囲を計算 src_rect = Rect.new(0, 0, 100, 1) bitmap.stretch_blt(dest_rect, gauge, src_rect, 96) end # ゲージの幅を計算 rate = (rect.width * width / 100).to_max(0, 100) # ループ処理 for index in 1...rect.height do # 描写先の座標を計算 gauge_x = rect.x# + (6 - index) gauge_y = rect.y + index # 本体ゲージの描写範囲を計算 dest_rect = Rect.new(gauge_x, gauge_y, rate, 1) # 本体ゲージの転送範囲を計算 src_rect = Rect.new(0, color + 1, 100, 1) bitmap.stretch_blt(dest_rect, gauge, src_rect, 128) end end #-------------------------------------------------------------------------- # ● ピクチャー描写 #-------------------------------------------------------------------------- def draw_text(x, y, number, color) x += 2 # ピクチャーの基本の横幅を取得する width_base = 14#@bitmap.width / 10.0 # 求められた数字を一文字ずつ配列にする array = number.to_s.split(//) # ループ処理 for i in (0...array.size) do # 描写座標を計算 draw_x = array[i].to_i * width_base draw_y = HEIGHT * color # 描写座標を取得する rect = Rect.new(draw_x, draw_y, width_base, HEIGHT) # 数字を描写 @sprite.bitmap.blt(x + (i * (width_base + WIDHT)), y + 4, @bitmap, rect) end end #-------------------------------------------------------------------------- # ● 色の取得 # rate : 現在の割合 #-------------------------------------------------------------------------- def get_color(rate) case rate when 0..25 c = 2 when 26..50 c = 3 when 100 c = 0 else c = 1 end return c end #-------------------------------------------------------------------------- # ● HPのリフレッシュ #-------------------------------------------------------------------------- def hp_refresh # HPと最終HPが異なる場合 if @actor.hp != @actor.last_hp3 # 最終HPと現在HPの差を求める gap = (@actor.last_hp - @actor.hp) # 差がない場合 if gap.zero? then # 最終HPに現在HPを代入 @actor.last_hp = @actor.hp.to_i @actor.last_hp2 = @actor.hp.to_i # 表示を更新 draw_number(0, @actor.hp, @actor.hp.rate(@actor.maxhp)) # メソッドを返す return end # 差分を差分の絶対値で割った数で最終HPを引く @actor.last_hp3 -= gap / (gap.abs).to_m(40) # ゲージ減少中の場合 if gap >= 1 then # 表現上の最低値をアクターの本来のHPに設定 @actor.last_hp3 = @actor.last_hp3.to_min(@actor.hp) # ゲージ増加中の場合 else # 表現上の最高値をアクターの本来のHPに設定 @actor.last_hp3 = @actor.last_hp3.to_m(@actor.hp) end # 表示を更新 draw_number(0, @actor.last_hp3, @actor.last_hp3.rate(@actor.maxhp)) end end #-------------------------------------------------------------------------- # ● SPのリフレッシュ #-------------------------------------------------------------------------- def sp_refresh # SPと最終SPが異なる場合 if @actor.sp != @actor.last_sp3 # 最終SPと現在SPの差を求める gap = (@actor.last_sp - @actor.sp) # 差がない場合 if gap.zero? then # 最終SPに現在SPを代入 @actor.last_sp = @actor.sp.to_i @actor.last_sp2 = @actor.sp.to_i # 表示を更新 draw_number(1, @actor.sp, @actor.sp.rate(@actor.maxsp)) # メソッドを返す return end # 差分を差分の絶対値で割った数で最終SPを引く @actor.last_sp3 -= gap / (gap.abs).to_m(40) # ゲージ減少中の場合 if gap >= 1 then # 表現上の最低値をアクターの本来のSPに設定 @actor.last_sp3 = @actor.last_sp3.to_min(@actor.sp) # ゲージ増加中の場合 else # 表現上の最高値をアクターの本来のSPに設定 @actor.last_sp3 = @actor.last_sp3.to_m(@actor.sp) end # 表示を更新 draw_number(1, @actor.last_sp3, @actor.last_sp3.rate(@actor.maxsp)) end end #-------------------------------------------------------------------------- # ● 可視状態の更新 #-------------------------------------------------------------------------- def active_visible @sprite.visible = ($game_party.actors.include?(@actor)) end #-------------------------------------------------------------------------- # ● アクティブリフレッシュ #-------------------------------------------------------------------------- def active_refresh hp_refresh sp_refresh @sprite.visible = ($game_party.actors.include?(@actor)) # 座標を設定 @base_x = @actor.screen_x @sprite.rect_set(@base_x - 64, 372, 255) end #-------------------------------------------------------------------------- # ● 値の描写 #-------------------------------------------------------------------------- def draw_number(type, number, rate) x = (72 * type) y = @base_y - 1 + (@height * 1) # 対象の範囲を消す @sprite.bitmap.rect_clear(x, y, 72, @rect) # ゲージを描写 refresh_gauge(number, rate, type) # 値を描写 draw_text(x, y - 4, number, get_color(rate)) end #-------------------------------------------------------------------------- # ● ゲージの描写 #-------------------------------------------------------------------------- def refresh_gauge(value, rate, type) # 描写座標を計算 x = 8 + (80 * type) y = 6 + ((@base_y + 10) + (@height * 1)) rect = Rect.new(x, y, 50, 4) rate = (100 * rate / 100).to_max(0, 100) draw_gauge(rect, rate, type, @sprite.bitmap) end end end