#◆◇◆◇◆ ☆ 分身回避スクリプト ver 1・01 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin ■ 更新履歴 ○ ver 1.01(2009/07/27) 分身ステートの複数設定に対応 ■ 説明 特定のIDのステートが掛かっている場合、 攻撃を回避した祭に、キャラクターの分身を発生させます。 分身は攻撃アニメ中に発生し、 アニメの終了が近くなるにつれ、分身も弱くなっていきます。 発生する分身の数は任意で変更可能です。 ただし、あまり多くすると重くなるので、 6程度を目安にしてください。 =end #============================================================================== # ☆ MINTO #------------------------------------------------------------------------------ # 様々なフラグを扱うメインモジュールです。 #============================================================================== module MINTO # 分身回避スクリプトを有効化 ( true で有効 / false で無効 ) RGSS["Blink_Sprite"] = true end if MINTO::RGSS["Blink_Sprite"] == true then #============================================================================== # ☆ カスタマイズ #------------------------------------------------------------------------------ # 機能のカスタマイズを行うモジュールです。 #============================================================================== module MINTO # 発生する分身の数(あまり多くすると重くなります) Blink_Sprite = 6 # 分身とみなすステートのIDの配列 Blink_State = [2, 3, 4, 5] end #============================================================================== # ■ Numeric #------------------------------------------------------------------------------ #  数値全般を扱う組み込みクラスです。 #============================================================================== class Numeric #-------------------------------------------------------------------------- # ● 値の調整 # order : 求められた値 # size : 最大サイズ #-------------------------------------------------------------------------- def select(order, size) if self - order <= -1 return size elsif self + order >= size return 0 else return self + order end end #-------------------------------------------------------------------------- # ● 最大値の設定 # 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 #============================================================================== # ■ Sprite #------------------------------------------------------------------------------ #  スプライト表示を扱う組み込みクラスです。 #============================================================================== class Sprite #-------------------------------------------------------------------------- # ● 複製の作成 #-------------------------------------------------------------------------- def copy # 各データをコピー sprite = Sprite.new(self.viewport) sprite.bitmap = self.bitmap.dup if self.bitmap sprite.x = self.x sprite.y = self.y sprite.z = self.z sprite.visible = self.visible sprite.ox = self.ox sprite.oy = self.oy sprite.angle = self.angle sprite.mirror = self.mirror sprite.opacity = self.opacity sprite.blend_type = self.blend_type sprite.color = self.color.dup sprite.src_rect = self.src_rect.dup sprite.zoom_x = self.zoom_x sprite.zoom_y = self.zoom_y return sprite end end #============================================================================== # ■ Game_Battler (分割定義 1) #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :blink_effect # 分身回避フラグ end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● オブジェクト初期化 # viewport : ビューポート # battler : バトラー (Game_Battler) # alias : initialize_Array_Anima #-------------------------------------------------------------------------- alias :initialize_MINTO_Blink :initialize def initialize(viewport, battler = nil) # 元の処理を実行 initialize_MINTO_Blink(viewport, battler) # 分身用のデータを定義 @_blink_duration = 0 @_blink_sprite = [] end #-------------------------------------------------------------------------- # ● 解放 # alias : dispose_MINTO_Real_Shadow #-------------------------------------------------------------------------- alias :dispose_MINTO_Blink :dispose def dispose # 元の処理を実行 dispose_MINTO_Blink # ループ処理 for i in (0...MINTO::Blink_Sprite) do # 分身スプライトが存在する場合 if @_blink_sprite[i] != nil then # 分身スプライトが未解放の場合 if @_blink_sprite[i].disposed? == false then # 分身スプライトを解放 sprite.bitmap.dispose sprite.dispose end end end end #-------------------------------------------------------------------------- # ● 分身回避 #-------------------------------------------------------------------------- def blink_effect # アニメーションを読み込む animation = Data_Animations.data[@battler.animation_id] # アニメの最大フレームを取得(最低32) @_blink_duration = (animation.frame_max * 2).to_min(32) # ループ処理 for i in (0...MINTO::Blink_Sprite) do # バトラーの複製を作成 @_blink_sprite[i] = self.copy # 半透明にする @_blink_sprite[i].opacity = 160 end end #-------------------------------------------------------------------------- # ● フレーム更新(分身回避) #-------------------------------------------------------------------------- def update_blink_effect # 分身カウントが残っている場合 unless @_blink_duration.zero? then # 影が存在する場合 unless @shadow_sprite.nil? then # 影を見えなくする @shadow_sprite.visible = false end # 最大修正値を取得 max_blink = (@_blink_duration.to_m(100) * 3) # ループ処理 for sprite in @_blink_sprite do # バトラーの位置からランダムで位置を取得する amp = (self.bitmap.width * max_blink / 100).to_min(1) # 分身スプライトの位置を初期化 sprite.x = self.x # 分身スプライト用の位置を設定 sprite.x += rand(amp+1) + rand(amp+1) - amp end # 分身カウントを減らす @_blink_duration -= 1 # 分身カウントが 0 になった場合 if @_blink_duration.zero? then # ループ処理 for sprite in @_blink_sprite do # 分身スプライトを解放 sprite.bitmap.dispose sprite.dispose end # 影が存在する場合 unless @shadow_sprite.nil? then # 影を可視状態にする @shadow_sprite.visible = true end end end end #-------------------------------------------------------------------------- # ● フレーム更新 # alias : update_MINTO_Blink #-------------------------------------------------------------------------- alias :update_MINTO_Blink :update def update # バトラーが存在し、且つアニメーションが有効な場合 if @battler != nil and @battler.animation_id != 0 then # 攻撃を回避していている場合 if @battler.animation_hit == false then # ループ処理 for id in MINTO::Blink_State do # ステート 分身 が付加されている場合 if @battler.state?(id) == true then # 分身回避 blink_effect # 分身フラグをクリア @battler.blink_effect = false # ループ終了 break end end end end # 分身を更新 update_blink_effect # 元の処理を実行 update_MINTO_Blink end end end