#◆◇◆◇◆ RTAB・コンフィグ・システム ver 1.10 ◇◆◇◆◇ # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと # リアルタイム・アクティブバトル(RTAB) Ver 1.10 # 配布元・サポートURL # http://members.jcom.home.ne.jp/cogwheel/ # by ショウ =begin 更新履歴 1.10 ヘルプウィンドウの名前が、 歯車の城さんのメニュー改造のものと被っていたので変更。 (ヘルプが被って見えなくなるため) レイアウトも若干修正。 みんとのお部屋のマスタースクリプトは要りません RTAB本体より、下に導入してください なお、このスクリプトの質問及びサポートは みんとのお部屋までお願いします なお、コンフィグ画面の呼び出しは $scene = Scene_Customize.new と入力してください =end #============================================================================== # ■ Game_System #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :battle_speed # 戦闘速度 attr_accessor :battle_active # アクティブ attr_accessor :battle_camera # カメラ稼動 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_MINT_RTAB_Customize initialize def initialize # 元の処理を実行 initialize_MINT_RTAB_Customize @battle_speed = 150 @battle_active = 2 @battle_camera = true end end #============================================================================== # ■ Window_Customize #============================================================================== class Window_Customize < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(160, 176, 320, 128) @column_max = 1 refresh self.index = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if self.contents != nil self.contents.dispose self.contents = nil end @data = [] @element = [] # 習得しているスキルを取得 get_data get_element # 項目数が0でなければ項目を描画 @item_max = @data.size if @item_max > 0 self.contents = Bitmap.new(width - 32, row_max * 32) for i in 0...@item_max draw_item(i) end end end #-------------------------------------------------------------------------- # ● 描写する項目を取得 #-------------------------------------------------------------------------- def get_data data = [ "バトルスピード", "アクティブ", "カメラ稼動"] @data = data end #-------------------------------------------------------------------------- # ● 項目のデータを取得 #-------------------------------------------------------------------------- def get_element case $game_system.battle_active when 1 active = "ウェイト" when 2 active = "セミアクティブ" else active = "フルアクティブ" end if $game_system.battle_camera camera = "ON" else camera = "OFF" end data = [$game_system.battle_speed.to_s, active, camera] @element = data end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) item = @data[index] deta = @element[index] x = 0 y = index * 32 self.contents.draw_text(x, y, 288, 32, item, 0) self.contents.draw_text(x, y, 288, 32, deta, 2) end #-------------------------------------------------------------------------- # ● ヘルプテキスト取得 #-------------------------------------------------------------------------- def help_text(index) case index when 0 text = "戦闘速度を変更します。速度は数値が低いほど速くなります。(推奨:150)" when 1 text = "戦闘の時間の流れ方を変更します。" else text = "戦闘中のカメラの稼動、不稼動を変更します。" end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help text = help_text(self.index) @help_window.set_text(text) end end #============================================================================== # ■ Window_Command2 #============================================================================== class Window_Command2 < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(width, commands) # コマンドの個数からウィンドウの高さを算出 super(0, 0, width, commands.size * 32 + 32) @item_max = commands.size @commands = commands self.contents = Bitmap.new(width - 32, @item_max * 32) refresh self.index = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_item(i, normal_color) end end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index, color) self.contents.font.color = color self.contents.font.size = 20 rect = Rect.new(4, 32 * index, self.contents.width - 8, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.draw_text(rect, @commands[index]) end #-------------------------------------------------------------------------- # ● 項目の無効化 #-------------------------------------------------------------------------- def disable_item(index) draw_item(index, disabled_color) end #-------------------------------------------------------------------------- # ● ヘルプテキスト取得 #-------------------------------------------------------------------------- def help_text(index) case index when 0 text = "セミアクティブに加え、ターゲット選択時にも時間が停止します。初級者向け。" when 1 text = "スキルやアイテムウインドウを開いた場合のみ時間が停止します。(推奨)" else text = "常に時間が流れます。上級者向け。" end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help text = help_text(self.index) @help_window.set_text(text) end end #============================================================================== # ■ Window_Help_RTAB #============================================================================== class Window_Help_RTAB < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 416, 640, 64) self.contents = Bitmap.new(width - 32, height - 32) self.pause = false end #-------------------------------------------------------------------------- # ● テキスト設定 #-------------------------------------------------------------------------- def set_text(text, align = 1) # テキストとアラインメントの少なくとも一方が前回と違っている場合 if text != @text or align != @align # テキストを再描画 self.contents.clear self.contents.font.color = normal_color width = self.width - 40 # 改行の判定文字 split = " " text1 = text.split(/#{split}/)[0].to_s text2 = text.split(/#{split}/)[1].to_s text3 = text.split(/#{split}/)[2].to_s text4 = text.split(/#{split}/)[3].to_s text5 = text.split(/#{split}/)[4].to_s self.contents.draw_text(4, 0, width, 32, text1, align) self.contents.draw_text(4, 32, width, 32, text2, align) self.contents.draw_text(4, 64, width, 32, text3, align) self.contents.draw_text(4, 96, width, 32, text4, align) self.contents.draw_text(4, 128, width, 32, text5, align) @text = text @align = align end self.visible = true end end #============================================================================== # ■ Scene_Customize #============================================================================== class Scene_Customize #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # スプライトセットを作成 #@spriteset = Spriteset_Map.new # ウィンドウを作成 @help_window = Window_Help_RTAB.new @main_window = Window_Customize.new @main_window.refresh @dummy_window = Window_Base.new(480,176,100,64) @dummy_window.visible = false @number_window = Window_InputNumber.new(3) @number_window.x = 480 @number_window.y = 176 @number_window.visible = false @number_window.active = false command = ["ウェイト", "セミアクティブ", "フルアクティブ"] camera_command = ["ON", "OFF"] @command_window = Window_Command2.new(160, command) @command_window.x = 480 @command_window.y = 208 @command_window.visible = false @command_window.active = false @camera_window = Window_Command.new(120, camera_command) @camera_window.x = 480 @camera_window.y = 240 @camera_window.visible = false @camera_window.active = false # ヘルプウィンドウを関連付け @main_window.help_window = @help_window @command_window.help_window = @help_window # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # スプライトセットを解放 #@spriteset.dispose # ウィンドウを解放 @help_window.dispose @main_window.dispose @number_window.dispose @dummy_window.dispose @command_window.dispose @camera_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウを更新 if @main_window.active @main_window.update update_main return end if @number_window.active @number_window.update update_number return end if @command_window.active @command_window.update update_command return end if @camera_window.active @camera_window.update update_camera return end end #-------------------------------------------------------------------------- # ● フレーム更新 (メインウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_main # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) # メニュー画面に切り替え $scene = Scene_Menu.new(6) return end # C ボタンが押された場合 if Input.trigger?(Input::C) # インデックスを取得 @index = @main_window.index # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) case @index when 0 @number_window.active = true @number_window.visible = true @dummy_window.visible = true @main_window.active = false when 1 @command_window.active = true @command_window.visible = true @main_window.active = false when 2 @camera_window.active = true @camera_window.visible = true @main_window.active = false when 3 @camera_window.active = true @camera_window.visible = true @main_window.active = false end return end end #-------------------------------------------------------------------------- # ● フレーム更新 (数値入力ウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_number # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @number_window.active = false @number_window.visible = false @dummy_window.visible = false @main_window.active = true return end # C ボタンが押された場合 if Input.trigger?(Input::C) # 数値を取得して代入 $game_system.battle_speed = @number_window.number $game_system.battle_speed = 1 if @number_window.number == 0 # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @number_window.active = false @number_window.visible = false @dummy_window.visible = false @main_window.active = true @main_window.refresh return end end #-------------------------------------------------------------------------- # ● フレーム更新 (コマンドウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_command # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @command_window.active = false @command_window.visible = false @main_window.active = true return end # C ボタンが押された場合 if Input.trigger?(Input::C) # インデックスを取得して代入 case @command_window.index when 0 $game_system.battle_active = 1 when 1 $game_system.battle_active = 2 when 2 $game_system.battle_active = 3 end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @command_window.active = false @command_window.visible = false @main_window.active = true @main_window.refresh return end end #-------------------------------------------------------------------------- # ● フレーム更新 (カメラ切り替えウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_camera # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play($data_system.cancel_se) @camera_window.active = false @camera_window.visible = false @main_window.active = true return end # C ボタンが押された場合 if Input.trigger?(Input::C) # インデックスを取得して代入 case @camera_window.index when 0 $game_system.battle_camera = true when 1 $game_system.battle_camera = false end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @camera_window.active = false @camera_window.visible = false @main_window.active = true @main_window.refresh return end end end #============================================================================== # 以下、歯車の城・ショウ様製作のRTAB部分 ver 1.07 現在 #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● ATB基礎セットアップ #-------------------------------------------------------------------------- def atb_setup # ATB初期化 # speed : バトルスピード決定。値が小さいほど早い # @active : アクティブ度設定 # 3 : 常にアクティブ状態 # 2 : スキル・アイテム選択中のみアクティブゲージが止まる # 1 : 2の状態に加え、ターゲット選択時もウェイトが掛かる # 0 : 1の状態に加え、コマンド入力時にもウェイトが掛かる # @action : 他人が行動中に自分も行動を起こすことを許すか # 3 : 自分が行動不能でない限り限り許す # 2 : 自分がダメージを受けていない限り許す # 1 : 2の状態に加え、ターゲットが行動していない限り許す # 0 : 行動を許さない。順番に行動し終えるまで待つ # @anime_wait : trueにするとバトルアニメ・ダメージ表示中はウェイトが掛かる # @damage_wait : ダメージ表示待ち時間(単位はフレーム) # @enemy_speed : 敵の思考速度。1なら即時行動。 # 1フレーム毎に、1/@enemy_speedの確率で行動を起こす # @force : 強制アクションでスキル使用時の強制具合 # 2:スキルは全て詠唱せず、必ず即時実行 # 1:単独スキルは詠唱し、連携スキルのみ即時実行 # 0:全スキル詠唱を行うだけ # ($scene.force = x とすることにより、通常イベントのスクリプトから変更可能) # @drive : カメラ駆動ON/OFF。trueで駆動ON、falseで駆動OFF # @scroll_time : スクリーン移動に要する基本時間 # @zoom_rate = [i, j] : エネミーのズーム率 # i が画面最上部に配置した時の拡大率 # j が画面最下部に配置した時の拡大率 # 1 倍としたいときも、1.0 と必ず小数で設定すること speed = $game_system.battle_speed @active = $game_system.battle_active @action = 2 @anime_wait = true @damage_wait = 10 @enemy_speed = 40 @force = 2 @drive = $game_system.battle_camera @scroll_time = 15 @zoom_rate = [0.2, 1.0] @help_time = 40 @escape == false @camera = nil @max = 0 @turn_cnt = 0 @help_wait = 0 @action_battlers = [] @synthe = [] @spell_p = {} @spell_e = {} @command_a = false @command = [] @after_wait = [40, 0] @party = false for battler in $game_party.actors + $game_troop.enemies spell_reset(battler) battler.at = battler.agi * rand(speed / 2) battler.damage_pop = {} battler.damage = {} battler.damage_sp = {} battler.critical = {} battler.recover_hp = {} battler.recover_sp = {} battler.state_p = {} battler.state_m = {} battler.animation = [] if battler.is_a?(Game_Actor) @max += battler.agi end end @max *= speed @max /= $game_party.actors.size for battler in $game_party.actors + $game_troop.enemies battler.atp = 100 * battler.at / @max end end end