スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

web拍手 by FC2   

[RGSS]多段攻撃

使い方は → こちら

[RGSS]多段攻撃
多段攻撃、多段ヒットスキル、クイックトリガーといったものを作成できます。

スクリーンショット サムネイルクリックで拡大画像が見られます。
rgss_tadan.jpg

プログラムは続きにあります。

=begin
===============================================================================
  ☆★☆★☆★☆★ 多段攻撃 ★☆★☆★☆★☆
=============================================================================== 

 製作・開発:STERS
  クイックトリガーのアイデア:ルルベル様

  Page::http://stersblog.blog15.fc2.com/

導入方法------------------------------------------------------------------

    このスクリプトを Scene_Debug より下 Main より上に
   新しく作ったセクションにコピペして入れてください。
    
--------------------------------------------------------------------------

これを導入することで
多段攻撃
ができるようになります。

使い方--------------------------------------------------------------------
1.まずはこのスクリプトを導入してください。

2.設定項目を編集してください

3.設定項目にて作ったスキルを作成し、
  アクターに覚えさせる。

--------------------------------------------------------------------------
                          ~ 説明 ~

あるひとつのスキルを数回連続( 設定項目で指定 )で
発動する( SP消費は1回のみ )ため威力を大きくすると、
大変なことになります。

しかし「1つのアニメの中で、何発も実行する」を
作る場合には、多段ヒットさせるのに使うアニメ(標準では[剣技4みたいなの])を
1ヒットさせたい場面(一発の攻撃をさせたい部分)で切り離し、
別のアニメにして、たくさんのアニメを作ります。
(別のアニメにつながっているように見えるように作ります。)

その後「アニメ指定」の欄で、
"スキル"=>[1,"max"],[2,"max"],[3,"max"],[4,"max"],[5,"max"]
みたいに設定します。
すると、5つのアニメをタイミングよく繋げて見せられます。


A A A A A  →  B A A A A  →  C B A A A  →  
D C B A A  →  E D C B A  →  F E D C B
となっているアニメがあるなら、
「→」の部分で分割するとできます。

--------------------------------------------------------------------------

ある程度の知識さえあれば
「ランダムヒット」や「ランダムアニメ」も作れます。

--------------------------------------------------------------------------
=end
#==============================================================================
# ★ 設定項目
#==============================================================================
class Scene_Battle
  
  #
  #  「ウェイト」では「"MAX"("max")」を指定すると、
  #   アニメのフレーム数だけウェイトを行います
  #
  #   そこに、さらにウェイトをかけたい場合は、
  #   「"MAX+5"」などと、やってください。
  #    (この場合は「アニメのフレーム数」+「5」フレームのウェイトをかけます)
  #
  #   四則演算(+-*/)が使用できます。
  #   (括弧の中の記号のみ。それ以外だとエラーが出ます。)
  #
  #   通常は、数値を指定してください。
  #
  
  # 多段攻撃アニメ
  #   ( 多段攻撃スキル判定 )
  #  スキル名=>[[ウェイト,アニメID],[ウェイト,アニメID]...]... としてください。
  TADAN_HIT_ANIME = {
    "2連斬り"=>[["max",105],["max",107]],
    "3連斬り"=>[["max",105],["max",107],["max",108]],
    "4連斬り"=>[["max",105],["max",106],["max",108],["max",107]],
    "真4連斬り"=>[["max",105],["max",106],["max",108],["max",107]],
  }
    
  # クイックトリガースキルの指定
  #        (クイックトリガースキル判定)
  #    スキル名=>[秒数,アニメ].....と指定してください。
  #
  # ちなみに、連打ボーナスはなし。
  KUICK_TRIGGER = {
    "気合連斬"=>[5,105],
  }
  
  # 多段攻撃アクター
  #    (多段攻撃アクター判定)
  #  アクター名=>[ウェイト,アニメID,アニメID....]としてください。
  #
  # ここで、指定したアクターは必ず、ここで指定した回数は通常攻撃します。
  #  (さらに、武器指定で、連続攻撃が重なる場合は、2つを足した数だけ連続攻撃。)
  #
  # ちなみに、連打ボーナスはなし。
  TADAN_HIT_ACTOR = {}
  
  # 多段攻撃武器
  #    (多段攻撃武器判定)
  #  武器=>[ウェイト,アニメID,アニメID....]としてください。
  #
  # ここで、指定した武器を装備するとは必ず、ここで指定した回数は通常攻撃します。
  #  (さらに、アクター指定で、連続攻撃が重なる場合は、2つを足した数だけ連続攻撃。)
  #
  # ちなみに、連打ボーナスはなし。
  TADAN_HIT_WEAPON = {}
  
  # トータルダメージの表示
  TADAN_HIT_TOTAL_DAMAGE = true
  
  # 連打ボーナスをつけるか? (スキルのみ)
  #   (「クイックトリガー」とは違う)
  #   ( あるキーを連打して、
  #                それでボーナスとしてnヒットプラス )
  TADAN_HIT_RENDA_BOUNS = true
  
  # 連打ボーナス・クイックトリガー用のキー
  TADAN_HIT_RENDA_KEY = Input::X
  
  # どれほどやったらボーナスが出るか?
  #   (アニメーションのフレーム数 ÷ ここの数値) 以上でボーナス発生
  TADAN_HIT_RENDA_COUNT = 2
  
  # ボーナスは何発か?
  #    nil にすると目標値を超えた分だけ
  TADAN_HIT_BOUNS_COUNT = nil
  
#==============================================================================
# ■ Scene_Battle
#==============================================================================
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias tadan_hit_main main unless $@
  def main
    tadan_hit_wait_get
    tadan_hit_main
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  #--------------------------------------------------------------------------
  alias tadan_hit_update_phase4_step2 update_phase4_step2 unless $@
  def update_phase4_step2
    $tadan_hit_total_damage = false
    unless @active_battler.current_action.forcing
      if @active_battler.restriction == 2 or @active_battler.restriction == 3
        @active_battler.current_action.kind = 0
        @active_battler.current_action.basic = 0
      end
      if @active_battler.restriction == 4
        $game_temp.forcing_battler = nil
        @phase4_step = 1
        return
      end
    end
    @target_battlers = []
    if @active_battler.current_action.kind == 1 and tadan_hit_skill_get != false
      make_skill_action_result
      return
    end
    tadan_hit_update_phase4_step2
  end
  #--------------------------------------------------------------------------
  # ★ 多段ヒットスキルを探す
  #--------------------------------------------------------------------------
  def tadan_hit_skill_get
    s = $data_skills[@active_battler.current_action.skill_id]
    return false if s == nil
    return TADAN_HIT_ANIME[s.name] != nil ? TADAN_HIT_ANIME[s.name] : false
  end
  #--------------------------------------------------------------------------
  # ★ クイックトリガースキルを探す
  #--------------------------------------------------------------------------
  def tadan_hit_kucik_skill_get
    s = $data_skills[@active_battler.current_action.skill_id]
    return false if s == nil
    return KUICK_TRIGGER[s.name] != nil ? KUICK_TRIGGER[s.name] : false
  end
  #--------------------------------------------------------------------------
  # ★ 多段攻撃アクターを探す
  #--------------------------------------------------------------------------
  def tadan_hit_actor_get
    s = $data_actors[@active_battler.id]
    return false if s == nil
    return false if @active_battler.class == Game_Enemy
    return TADAN_HIT_ACTOR[s.name] != nil ? TADAN_HIT_ACTOR[s.name] : false
  end
  #--------------------------------------------------------------------------
  # ★ 多段攻撃武器を探す
  #--------------------------------------------------------------------------
  def tadan_hit_weapon_get
    s = $data_weapons[@active_battler.weapon_id]
    return false if s == nil
    return false if @active_battler.class == Game_Enemy
    return false if $data_weapons[@active_battler.weapon_id] == nil
    return TADAN_HIT_WEAPON[s.name] != nil ? TADAN_HIT_WEAPON[s.name] : false
  end
  #--------------------------------------------------------------------------
  # ★ ウェイトを取得する
  #--------------------------------------------------------------------------
  def tadan_hit_wait_get
    TADAN_HIT_ANIME.each_value{|hit|
      hit.each{|h|
        r = /max(([-+*\/])([0-9])*)*/i
        unless h[0] =~r
          h[0] = $data_animations[h[1]].frame_max
          next
        end
        r2 = /([-+*\/])/i
        s = h[0]
        s.gsub!(/max/i){""}
        b = []
        e = ""
        s.scan(/\G(([-+*\/])([0-9])+)/){|a|
          a[0].scan(/\G./){|d|
            b.push(d) if d =~ r2
            e += d unless d =~ r2
          }
          b.push(e.to_i)
          e = ""
        }
        h[0] = $data_animations[h[1]].frame_max
        c = 0
        b.each{|a|
          c += 1
          next if c % 2 == 0
          h[0] += b[c] if a == "+"
          h[0] -= b[c] if a == "-"
          h[0] *= b[c] if a == "*"
          h[0] /= b[c] if a == "/"
        }
      }
    }
    TADAN_HIT_ACTOR.each_value{|hit|
      hit.each{|h|
        r = /max(([-+*\/])([0-9])*)*/i
        unless h[0] =~r
          h[0] = $data_animations[h[1]].frame_max
          next
        end
        r2 = /([-+*\/])/i
        s = h[0]
        s.gsub!(/max/i){""}
        b = []
        e = ""
        s.scan(/\G(([-+*\/])([0-9])+)/){|a|
          a[0].scan(/\G./){|d|
            b.push(d) if d =~ r2
            e += d unless d =~ r2
          }
          b.push(e.to_i)
          e = ""
        }
        h[0] = $data_animations[h[1]].frame_max
        c = 0
        b.each{|a|
          c += 1
          next if c % 2 == 0
          h[0] += b[c] if a == "+"
          h[0] -= b[c] if a == "-"
          h[0] *= b[c] if a == "*"
          h[0] /= b[c] if a == "/"
        }
      }
    }
    TADAN_HIT_WEAPON.each_value{|hit|
      hit.each{|h|
        r = /max(([-+*\/])([0-9])*)*/i
        unless h[0] =~r
          h[0] = $data_animations[h[1]].frame_max
          next
        end
        r2 = /([-+*\/])/i
        s = h[0]
        s.gsub!(/max/i){""}
        b = []
        e = ""
        s.scan(/\G(([-+*\/])([0-9])+)/){|a|
          a[0].scan(/\G./){|d|
            b.push(d) if d =~ r2
            e += d unless d =~ r2
          }
          b.push(e.to_i)
          e = ""
        }
        h[0] = $data_animations[h[1]].frame_max
        c = 0
        b.each{|a|
          c += 1
          next if c % 2 == 0
          h[0] += b[c] if a == "+"
          h[0] -= b[c] if a == "-"
          h[0] *= b[c] if a == "*"
          h[0] /= b[c] if a == "/"
        }
      }
    }
  end
  #--------------------------------------------------------------------------
  # ● 基本アクション 結果作成
  #--------------------------------------------------------------------------
  alias tadan_hit_make_basic_action_result make_basic_action_result unless $@
  def make_basic_action_result
    @return_flag = false
    @damage = 0
    if @active_battler.current_action.basic == 0
      anime = tadan_hit_actor_get
      if anime != false
        @phase4_step = 6
        tadan_hit_attack_target
        for ani in anime
          break if @target_battlers.size < 1
          tadan_hit_attack(ani)
        end
        @return_flag = true
      end
      if tadan_hit_weapon_get != false
        anime = tadan_hit_weapon_get
        @phase4_step = 6
        tadan_hit_attack_target
        for ani in anime
          break if @target_battlers.size < 1
          tadan_hit_attack(ani)
        end
        @return_flag = true
      end
      if @return_flag
        for target in @target_battlers
          target.hp -= @damage
          @spriteset.update
        end
        return
      end
      tadan_hit_make_basic_action_result
      return
    end
    tadan_hit_make_basic_action_result
    return
  end
  #--------------------------------------------------------------------------
  # ★ 多段ヒット攻撃ターゲットけっていよう
  #--------------------------------------------------------------------------
  def tadan_hit_attack_target
    if @active_battler.is_a?(Game_Enemy)
      if @active_battler.restriction == 3
        target = $game_troop.random_target_enemy
      elsif @active_battler.restriction == 2
        target = $game_party.random_target_actor
      else
        index = @active_battler.current_action.target_index
        target = $game_party.smooth_target_actor(index)
      end
    end
    if @active_battler.is_a?(Game_Actor)
      if @active_battler.restriction == 3
        target = $game_party.random_target_actor
      elsif @active_battler.restriction == 2
        target = $game_troop.random_target_enemy
      else
        index = @active_battler.current_action.target_index
        target = $game_troop.smooth_target_enemy(index)
      end
    end
    @target_battlers = [target]
  end
  #--------------------------------------------------------------------------
  # ★ 多段ヒット攻撃表示用
  #--------------------------------------------------------------------------
  def tadan_hit_attack(id)
    return if @target_battlers.size < 1
    @animation2_id = id[1]
    for target in @target_battlers
      next if target.class == Array or target == nil
      attack_damage(target,@active_battler)
    end
    @active_battler.white_flash = true
    for target in @target_battlers
      next if target.class == Array or target == nil
      target.animation_id = @animation2_id
      target.animation_hit = (target.damage != "Miss")
    end
    for target in @target_battlers
      next if target.class == Array or target == nil
      if target.damage != nil
        target.damage_pop = true
      end
    end
    for i in 0...id[0]
      Graphics.update
    end
  end
  #--------------------------------------------------------------------------
  # ★ 通常攻撃ダメージ処理用メソッド
  #--------------------------------------------------------------------------
  def attack_damage(target,active)
    last_hp = target.hp
    target.attack_effect(active)
    @damage += last_hp - target.hp
    return
  end
  #--------------------------------------------------------------------------
  # ● スキルアクション 結果作成
  #--------------------------------------------------------------------------
  alias tadan_hit_make_skill_action_result make_skill_action_result unless $@
  def make_skill_action_result
    anime = tadan_hit_skill_get
    if anime == false
      anime2 = tadan_hit_kucik_skill_get
      if anime2 != false
        for i in 0...10
          Graphics.update
        end
        @damage = 0
        tadan_hit_kuick_tigger(anime2)
        @rimit.bitmap.dispose
        @rimit.dispose
        $tadan_hit_total_damage = true
        for target in @target_battlers
          target.damage_pop = true
          target.damage = @damage
        end
        for i in 0...10
          Graphics.update
        end
        return
      end
      tadan_hit_make_skill_action_result
      return
    end
    return if anime == nil
    @skill = $data_skills[@active_battler.current_action.skill_id]
    @help_window.set_text(@skill.name, 1)
    @active_battler.sp -= @skill.sp_cost
    @renda_bouns = 0
    @phase4_step = 6
    @damage = 0
    @status_window.update
    set_target_battlers(@skill.scope)
    for i in 0...10
      Graphics.update
    end
    for ani in anime
      c = 0
      for target in @target_battlers
        c += 1 if target.hp0?
      end
      return if @target_battlers.size == c
      return if @target_battlers.size == 0
      Input.update if TADAN_HIT_RENDA_BOUNS
      tadan_hit_skill_result(ani)
    end
    @phase4_step = 6
    unless TADAN_HIT_RENDA_BOUNS or
      $data_animations[@animation2_id].frame_max / TADAN_HIT_RENDA_COUNT <= @renda_bouns
      $tadan_hit_total_damage = true
      for target in @target_battlers
        target.damage_pop = true
        target.damage = @damage
      end
      for i in 0...10
        Graphics.update
      end
      return
    end
    count = 0
    set_target_battlers(@skill.scope)
    loop do
      break if @target_battlers.size < 1
      if TADAN_HIT_BOUNS_COUNT != nil
        break if TADAN_HIT_BOUNS_COUNT <= count
      else
        break unless $data_animations[@animation2_id].frame_max / TADAN_HIT_RENDA_COUNT <= @renda_bouns - 1 
      end
      for ani in anime
        tadan_hit_skill_result(ani,true)
        @renda_bouns -= 1
        if TADAN_HIT_BOUNS_COUNT != nil
          count += 1
          break if TADAN_HIT_BOUNS_COUNT <= count
        end
        break unless $data_animations[@animation2_id].frame_max / TADAN_HIT_RENDA_COUNT <= @renda_bouns
      end
    end
    $tadan_hit_total_damage = true
    for target in @target_battlers
      target.damage_pop = true
      target.damage = @damage
    end
    for i in 0...10
      Graphics.update
    end
  end
  #--------------------------------------------------------------------------
  # ★ スキルダメージ処理用メソッド
  #--------------------------------------------------------------------------
  def skill_damage(target,active,skill)
    last_hp = target.hp
    target.skill_effect(active, skill)
    @damage += last_hp - target.hp
    return
  end
  #--------------------------------------------------------------------------
  # ★ 多段ヒットスキル用スキルリザルト
  #--------------------------------------------------------------------------
  def tadan_hit_skill_result(id,renda=false)
    @renda_bouns += 1 if TADAN_HIT_RENDA_BOUNS and Input.trigger?(TADAN_HIT_RENDA_KEY) and !renda
    @animation2_id = id[1]
    return if @target_battlers == nil or @target_battlers.size < 1 or
              @target_battlers[0].class == Array or @target_battlers[0] == nil
    for target in @target_battlers
      next if target.class == Array or target == nil
      skill_damage(target,@active_battler, @skill)
    end
    @active_battler.white_flash = true
    for target in @target_battlers
      next if target.class == Array or target == nil
      target.animation_id = @animation2_id
      target.animation_hit = (target.damage != "Miss")
    end
    for target in @target_battlers
      next if target.class == Array or target == nil
      if target.damage != nil
        target.damage_pop = true
      end
    end
    for i in 0...id[0]
      Graphics.update
      if TADAN_HIT_RENDA_BOUNS
        Input.update
        @renda_bouns += 1 if Input.trigger?(TADAN_HIT_RENDA_KEY) and !renda
      end
      @spriteset.update
    end
  end
  #--------------------------------------------------------------------------
  # ★ クイックトリガー用メソッド
  #--------------------------------------------------------------------------
  def tadan_hit_kuick_tigger(anime)
    id = anime[1]
    @frame_count = 0
    @skill = $data_skills[@active_battler.current_action.skill_id]
    @help_window.set_text(@skill.name, 1)
    @active_battler.sp -= @skill.sp_cost
    @renda_bouns = 0
    @renda_count = 0
    @phase4_step = 6
    @rimit_time = anime[0] * Graphics.frame_rate * 100
    @rimit = Sprite.new
    b = Bitmap.new(1,1)
    width = b.text_size("残り10.00秒").width
    b.dispose
    @rimit.bitmap = Bitmap.new(width, 40)
    @rimit.x = 640 - @rimit.bitmap.width
    @rimit.y = @help_window.height + 10
    kuick_trigger_rimit_time
    @status_window.update
    set_target_battlers(@skill.scope)
    c = 0
    while(@rimit_time > 0)
      return if @target_battlers.size < 1
      Graphics.update
      Input.update
      @spriteset.update
      kuick_trigger_rimit_time
      c += 1
      if Input.trigger?(TADAN_HIT_RENDA_KEY)
        kuick_trigger_anime(id)
        c = 0
        for target in @target_battlers
          next if target.hp > 0
          c += 1
        end
        return if @target_battlers.size == c
      end
      Graphics.frame_reset
    end
  end
  #--------------------------------------------------------------------------
  # ★ クイックトリガー用ダメージ処理メソッド
  #--------------------------------------------------------------------------
  def kuick_trigger_anime(id)
    @animation2_id = id
    for target in @target_battlers
      next if target.class == Array or target == nil
      skill_damage(target,@active_battler, @skill)
    end
    @active_battler.white_flash = true
    for target in @target_battlers
      next if target.class == Array or target == nil
      target.animation_id = @animation2_id
      target.animation_hit = (target.damage != "Miss")
    end
    for target in @target_battlers
      next if target.class == Array or target == nil
      if target.damage != nil
        target.damage_pop = true
      end
    end
  end
  #--------------------------------------------------------------------------
  # ★ クイックトリガー用残り時間表示メソッド
  #--------------------------------------------------------------------------
  def kuick_trigger_rimit_time
    @rimit_time -= 200 if @rimit_time > 0
    return if @total_sec == @rimit_time / Graphics.frame_rate
    @rimit.bitmap.clear
    @total_sec = @rimit_time / Graphics.frame_rate
    sec = @total_sec / 100
    sec %= 60
    sec_100 = @total_sec % 100
    text = sprintf("残り%2d.%02d秒", sec, sec_100)
    @rimit.bitmap.font.color.set(0,0,0)
    @rimit.bitmap.draw_text(1,0,@rimit.bitmap.width,32,text,1)
    @rimit.bitmap.draw_text(0,1,@rimit.bitmap.width,32,text,1)
    @rimit.bitmap.draw_text(1,1,@rimit.bitmap.width,32,text,1)
    @rimit.bitmap.draw_text(-1,0,@rimit.bitmap.width,32,text,1)
    @rimit.bitmap.draw_text(0,-1,@rimit.bitmap.width,32,text,1)
    @rimit.bitmap.draw_text(-1,-1,@rimit.bitmap.width,32,text,1)
    @rimit.bitmap.font.color.set(255,255,255)
    @rimit.bitmap.draw_text(0,0,@rimit.bitmap.width,32,text,1)
    Graphics.frame_reset
  end
end
class RPG::Sprite
  alias tadan_hit_damage damage unless $@
  def damage(value, critical)
    tadan_hit_damage(value, critical)
    if $tadan_hit_total_damage == true
      @_damage_sprite.bitmap.font.size = 20
      @_damage_sprite.bitmap.font.color.set(0, 0, 0)
      @_damage_sprite.bitmap.draw_text(-1, -1, 160, 20, "TOTAL DAMAGE", 1)
      @_damage_sprite.bitmap.draw_text(+1, -1, 160, 20, "TOTAL DAMAGE", 1)
      @_damage_sprite.bitmap.draw_text(-1, +1, 160, 20, "TOTAL DAMAGE", 1)
      @_damage_sprite.bitmap.draw_text(+1, +1, 160, 20, "TOTAL DAMAGE", 1)
      @_damage_sprite.bitmap.font.color.set(255, 255, 255)
      @_damage_sprite.bitmap.draw_text(0, 0, 160, 20, "TOTAL DAMAGE", 1)
      Graphics.frame_reset
    end
  end
end

web拍手 by FC2   

コメントの投稿


非公開コメント

コメント

STERS's Development Room

STERSの開発室っぽい何か。


プロフィール

Name:STERS
Unity3D/C#/PHP/js/C++/VB
などを勉強中です

[STERS's Room]
[ファイル置き場]

カテゴリー
最近の記事
最近のコメント
カレンダー
04 ≪│2017/05│≫ 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
RSSリンクの表示
ブログ内Google検索
Google
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。