=begin ★ 碧の軌跡っぽい戦闘システム - ATボーナスプラグイン - ★ 碧の軌跡っぽい戦闘システムにATボーナス機能を追加します。 ボーナスグラフィックは Graphics/System/ 配下に保存してください。 ● ボーナス ●====================================================== 発生しうるボーナスは以下の9種類です -------------------------------------------------------------------- 行動開始時にHP 10 %回復 -------------------------------------------------------------------- 行動開始時にHP 50 %回復 -------------------------------------------------------------------- 行動開始時にMP 10 %回復 -------------------------------------------------------------------- 行動開始時にMP 50 %回復 -------------------------------------------------------------------- 行動開始時にTP 10 回復 -------------------------------------------------------------------- 行動開始時にTP 50 回復 -------------------------------------------------------------------- クリティカル (ダメージもしくは回復量が 1.5倍) -------------------------------------------------------------------- 完全防御 (ダメージ0, 回復0, キャンセル無効, ステート変化無効, ディレイ無効) -------------------------------------------------------------------- ラッシュ (2回続けて行動可能) ==================================================================== ● お願い ●======================================================== 本スクリプトについて"碧の軌跡っぽい戦闘システム"の開発元である プチレア様 及び さば缶様 に問い合わせることのないようお願い致します。 ==================================================================== ※ 「碧の軌跡っぽい戦闘システム」は開発途中のようです。 その為、本スクリプトの仕様は今後変更される可能性があります。 ver0.11 Last Update : 2012/01/24 01/24 : クリティカルボーナス時にメッセージを表示できるように 01/07 : 試験公開 さば缶様 http://petitrare.com/blog/ ろかん   http://kaisou-ryouiki.sakura.ne.jp/ =end #=================================== # ● 設定箇所 #=================================== module Rokan module Kiseki_Plugin # 各ボーナスの発生しやすさを判断する変数番号 BCV = 10 #----------------------------------------------------------------------------- # 以下の形式で各ボーナスの発生しやすさを定義します。 # 0が設定されたボーナスは発生しなくなります。(発生しやすさは相対評価です) #----------------------------------------------------------------------------- # 変数に格納されている値 => # [ボーナスなし, HP10%回復, HP50%回復, MP10%回復, MP50%回復, # TP10回復, TP50回復, クリティカル, 完全防御, ラッシュ], #----------------------------------------------------------------------------- BOP = { -1 => [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0 => [100, 5, 3, 5, 3, 5, 3, 2, 2, 2], 1 => [ 90, 3, 0, 3, 0, 3, 0, 2, 0, 0], } # クリティカルボーナス時に表示されるメッセージ CriticalBonusText = "クリティカルボーナス!!" end end #=================================== # ここまで #=================================== $rsi ||= {} $rsi["空の軌跡_ATボーナス"] = true class RPG::UsableItem #-------------------------------------------------------------------------- # ● 駆動時間の取得 #-------------------------------------------------------------------------- alias _kiseki_bonus_operate_time operate_time def operate_time(battler) if BonusManager.rash? 0 else _kiseki_bonus_operate_time(battler) end end #-------------------------------------------------------------------------- # ● 硬直時間の取得 #-------------------------------------------------------------------------- alias _kiseki_bonus_stiff_time stiff_time def stiff_time(battler) if BonusManager.rash? 0 else _kiseki_bonus_stiff_time(battler) end end end class << BattleManager #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias _kiseki_bonus_setup setup def setup(troop_id, can_escape = true, can_lose = false) _kiseki_bonus_setup(troop_id, can_escape, can_lose) setup_bonus end #-------------------------------------------------------------------------- # ● ボーナスのセットアップ #-------------------------------------------------------------------------- def setup_bonus BonusManager.clear BonusManager.init_bonus end end class << OrderManager #-------------------------------------------------------------------------- # ● 先頭ユニットを削除し、次のユニットに入れ替えます。 #-------------------------------------------------------------------------- alias _kiseki_bonus_update_top update_top def update_top BonusManager.next_bonus _kiseki_bonus_update_top end #-------------------------------------------------------------------------- # ● 指定のバトラーの順番を遅らせる。 #-------------------------------------------------------------------------- alias _kiseki_bonus_delay_order delay_order def delay_order(battler, value) _kiseki_bonus_delay_order(battler, value) unless BonusManager.full_guard? end end module BonusManager module_function include Rokan::Kiseki_Plugin #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def init_manager @rate_list = [] @bonus_list = [] clear end #-------------------------------------------------------------------------- # ● クリア #-------------------------------------------------------------------------- def clear @rate_list.clear @bonus_list.clear @sprites_listener = nil end #-------------------------------------------------------------------------- # ● クリティカル判定 #-------------------------------------------------------------------------- def critical? get_bonus == 6 && $game_party.in_battle end #-------------------------------------------------------------------------- # ● 完全防御判定 #-------------------------------------------------------------------------- def full_guard? get_bonus == 7 && $game_party.in_battle end #-------------------------------------------------------------------------- # ● ラッシュ判定 #-------------------------------------------------------------------------- def rash? get_bonus == 8 end #-------------------------------------------------------------------------- # ● アクティブなボーナスの取得 #-------------------------------------------------------------------------- def get_bonus @bonus_list[1] end #-------------------------------------------------------------------------- # ● インデックスを指定したボーナスの取得 #-------------------------------------------------------------------------- def get_bonus_with_index(index) @bonus_list[index] end #-------------------------------------------------------------------------- # ● 新たに追加するボーナスの取得 #-------------------------------------------------------------------------- def get_pop_bonus case rand(@rate_list[9].last) when @rate_list[0]; -1 when @rate_list[1]; 0 when @rate_list[2]; 1 when @rate_list[3]; 2 when @rate_list[4]; 3 when @rate_list[5]; 4 when @rate_list[6]; 5 when @rate_list[7]; 6 when @rate_list[8]; 7 when @rate_list[9]; 8 else; -1 end end #-------------------------------------------------------------------------- # ● ボーナスの初期化 #-------------------------------------------------------------------------- def init_bonus init_bonus_rate @bonus_list.clear 10.times{@bonus_list << get_pop_bonus} end #-------------------------------------------------------------------------- # ● ボーナス発生確率の初期化 #-------------------------------------------------------------------------- def init_bonus_rate @rate_list.clear first = last = 0 BOP[$game_variables[BCV]].each_with_index{|value, index| last += value unless value.zero? @rate_list << Range.new(first, last) first = last } end #-------------------------------------------------------------------------- # ● ボーナスを進める #-------------------------------------------------------------------------- def next_bonus @bonus_list.shift @bonus_list << get_pop_bonus @sprites_listener.next_bonus if @sprites_listener end #-------------------------------------------------------------------------- # ● ボーナススプライトを可視化する #-------------------------------------------------------------------------- def sprites_listener=(obj) @sprites_listener = obj end end BonusManager.init_manager class Game_ActionResult #-------------------------------------------------------------------------- # ● ダメージ値のクリティカル補正 #-------------------------------------------------------------------------- def critical_damage_values @hp_damage = (@hp_damage * 1.5).to_i @mp_damage = (@mp_damage * 1.5).to_i @hp_drain = (@hp_drain * 1.5).to_i @mp_drain = (@mp_drain * 1.5).to_i end end class Game_Battler #-------------------------------------------------------------------------- # ● ダメージの処理 #-------------------------------------------------------------------------- alias _kiseki_bonus_execute_damage execute_damage def execute_damage(user) if BonusManager.critical? @result.critical_damage_values elsif BonusManager.full_guard? @result.clear_damage_values @result.cancel = false end _kiseki_bonus_execute_damage(user) end #-------------------------------------------------------------------------- # ● 使用効果[HP 回復] ※再定義 #-------------------------------------------------------------------------- def item_effect_recover_hp(user, item, effect) value = (mhp * effect.value1 + effect.value2) * rec value *= user.pha if item.is_a?(RPG::Item) value *= 1.5 if BonusManager.critical? # 追加 value = value.to_i @result.hp_damage -= value @result.success = true self.hp += value end #-------------------------------------------------------------------------- # ● 使用効果[MP 回復] ※再定義 #-------------------------------------------------------------------------- def item_effect_recover_mp(user, item, effect) value = (mmp * effect.value1 + effect.value2) * rec value *= user.pha if item.is_a?(RPG::Item) value *= 1.5 if BonusManager.critical? # 追加 value = value.to_i @result.mp_damage -= value @result.success = true if value != 0 self.mp += value end #-------------------------------------------------------------------------- # ● 使用効果[TP 増加] ※再定義 #-------------------------------------------------------------------------- def item_effect_gain_tp(user, item, effect) value = effect.value1.to_i value *= 1.5 if BonusManager.critical? # 追加 @result.tp_damage -= value @result.success = true if value != 0 self.tp += value end #-------------------------------------------------------------------------- # ● ステートの付加可能判定 #-------------------------------------------------------------------------- alias _kiseki_bonus_state_addable? state_addable? def state_addable?(state_id) _kiseki_bonus_state_addable?(state_id) && !BonusManager.full_guard? end #-------------------------------------------------------------------------- # ● 使用効果[ステート解除] #-------------------------------------------------------------------------- alias _kiseki_bonus_item_effect_remove_state item_effect_remove_state def item_effect_remove_state(user, item, effect) _kiseki_bonus_item_effect_remove_state(user, item, effect) unless BonusManager.full_guard? end #-------------------------------------------------------------------------- # ● ボーナスによる回復適用 #-------------------------------------------------------------------------- def bonus_recover_effect @result.clear @result.used = (0..5).include?(BonusManager.get_bonus) case BonusManager.get_bonus when 0 self.hp -= @result.hp_damage = -(mhp * 0.1).to_i when 1 self.hp -= @result.hp_damage = -(mhp * 0.5).to_i when 2 self.mp -= @result.mp_damage = -(mmp * 0.1).to_i when 3 self.mp -= @result.mp_damage = -(mmp * 0.5).to_i when 4 self.tp -= @result.tp_damage = -10 when 5 self.tp -= @result.tp_damage = -50 end end end class Bonus < Sprite include Saba::Kiseki #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport, index) super(viewport) @index = index set_bitmap unless @index.zero? if self.bitmap self.x = MARGIN_LEFT + 40 self.y = set_new_y self.z = 4 self.ox = self.bitmap.width / 2 self.oy = self.bitmap.height end self.opacity = 0 end #-------------------------------------------------------------------------- # ● ボーナスIDの取得 #-------------------------------------------------------------------------- def get_bonus BonusManager.get_bonus_with_index(@index) end #-------------------------------------------------------------------------- # ● ビットマップのセット #-------------------------------------------------------------------------- def set_bitmap case get_bonus when 0 self.bitmap = Cache.system("AT_BONUS_HP10") when 1 self.bitmap = Cache.system("AT_BONUS_HP50") when 2 self.bitmap = Cache.system("AT_BONUS_MP10") when 3 self.bitmap = Cache.system("AT_BONUS_MP50") when 4 self.bitmap = Cache.system("AT_BONUS_TP10") when 5 self.bitmap = Cache.system("AT_BONUS_TP50") when 6 self.bitmap = Cache.system("AT_BONUS_CRI") when 7 self.bitmap = Cache.system("AT_BONUS_DUARD") when 8 self.bitmap = Cache.system("AT_BONUS_RASH") end end #-------------------------------------------------------------------------- # ● 移動先の y 座標を設定 #-------------------------------------------------------------------------- def set_new_y @new_y = 32 @new_y += MARGIN_CURRENT_BOTTOM if @index > 1 @new_y += MARGIN_TOP + UNIT_INTERVAL * (@index-1) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update if self.bitmap super update_x update_y update_z update_zoom update_opacity end end #-------------------------------------------------------------------------- # ● x 座標の更新 #-------------------------------------------------------------------------- def update_x end #-------------------------------------------------------------------------- # ● y 座標の更新 #-------------------------------------------------------------------------- def update_y if self.y != @new_y self.y = [self.y - ((@new_y - self.y).abs < 3 ? 1 : 3), @new_y].max flash_top_bonus if @index == 1 && self.y == @new_y end end #-------------------------------------------------------------------------- # ● z 座標の更新 #-------------------------------------------------------------------------- def update_z self.z = @index > 1 ? 4 : 7 end #-------------------------------------------------------------------------- # ● 拡大率の更新 #-------------------------------------------------------------------------- def update_zoom if (get_bonus == -1 || @index.zero?) && !self.zoom_x.zero? self.zoom_x = self.zoom_y -= 0.05 end end #-------------------------------------------------------------------------- # ● 透明度の更新 #-------------------------------------------------------------------------- def update_opacity self.opacity += 12 if self.opacity != 255 end #-------------------------------------------------------------------------- # ● ボーナスを進める #-------------------------------------------------------------------------- def next_bonus @index -= 1 set_new_y unless @index.zero? end #-------------------------------------------------------------------------- # ● 先頭に到達したボーナスをフラッシュさせてみる #-------------------------------------------------------------------------- def flash_top_bonus flash(Color.new(255, 255, 255, 196), 40) end end class Bonus_Spriteset #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport) @viewport = viewport create_bonus end #-------------------------------------------------------------------------- # ● ボーナススプライトの生成 #-------------------------------------------------------------------------- def create_bonus @bonus_sprites = [] 10.times{|i| @bonus_sprites << Bonus.new(@viewport, i)} end #-------------------------------------------------------------------------- # ● ボーナスを1つ進める #-------------------------------------------------------------------------- def next_bonus @bonus_sprites.shift.dispose @bonus_sprites.each{|bonus| bonus.next_bonus} @bonus_sprites << Bonus.new(@viewport, 8) end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose @bonus_sprites.each{|bonus| bonus.dispose} end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update @bonus_sprites.each{|bonus| bonus.update} end end class Spriteset_Battle #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias _kiseki_bonus_initialize initialize def initialize _kiseki_bonus_initialize @bonus_spriteset = Bonus_Spriteset.new(@viewport3) BonusManager.sprites_listener = @bonus_spriteset end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias _kiseki_bonus_update update def update _kiseki_bonus_update @bonus_spriteset.update if @bonus_spriteset end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- alias _kiseki_bonus_dispose dispose def dispose _kiseki_bonus_dispose @bonus_spriteset.dispose end end class Window_BattleLog < Window_Selectable include Rokan::Kiseki_Plugin #-------------------------------------------------------------------------- # ● クリティカルヒットの表示 #-------------------------------------------------------------------------- alias _kiseki_bonus_display_critical display_critical def display_critical(target, item) display_critical_bonus _kiseki_bonus_display_critical(target, item) end #-------------------------------------------------------------------------- # ● クリティカルボーナスの表示 #-------------------------------------------------------------------------- def display_critical_bonus if BonusManager.critical? add_text(CriticalBonusText) wait end end #-------------------------------------------------------------------------- # ● ボーナスによる回復結果の表示 #-------------------------------------------------------------------------- def display_bonus_recover(target) if target.result.used Sound.play_recovery last_line_number = line_number case BonusManager.get_bonus when 0..1 add_text(target.result.hp_damage_text) when 2..3 add_text(target.result.mp_damage_text) when 4..5 add_text(target.result.tp_damage_text) end SceneManager.scene.refresh_status wait wait if line_number > last_line_number back_to(last_line_number) end end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● パーティコマンド選択の開始 #-------------------------------------------------------------------------- alias _kiseki_bonus_start_party_command_selection start_party_command_selection def start_party_command_selection battler = OrderManager.top_unit.battler battler.bonus_recover_effect @log_window.display_bonus_recover(battler) _kiseki_bonus_start_party_command_selection end end