#==============================================================================
# ★ スペシャルアタック+特殊スキル
# 作成・配布元:misty_rain(http://kilisamenosekai.web.fc2.com/)
# ver:1.3 作成(2014/10/13) 
#
# スペシャルアタックに指定されたスキルIDのスキルが使われた時、
# 特殊な入力をさせ、その結果で威力を補正します
# 
#   スペシャルアタック1:連打
#     制限時間内に特定のボタンを連打し、その連打回数でダメージを補正します。
#   スペシャルアタック2:ランダムコマンド入力
#     制限時間内に指定されるボタンを入力し、その成否でダメージを補正します。
#   スペシャルアタック3:ジャストヒット
#     ゲージ中に1個ある☆の位置でボタン押下し、その成否でダメージを補正します。
#   ☆からずれていても小当たりとして設定できます。
#   ゲージは制限時間内なら何度も動きます。
#   スペシャルアタック4:ジャストヒットN
#     ゲージ中に複数ある☆の位置でボタン押下し、その成否回数でダメージを補正します。
#   ☆にぴったり合っていないとカウントされません。
#   ゲージは一度通り過ぎたら終わります。
#   ☆の数より多く押下しても無効です(連射対策)。
#
# ver1.0:公開(2011/01/06)
# ver1.1:ダメージへの反映を後から変更しやすく(2012/03/22)
# ver1.2:バグ修正(2012/06/15)
# ver1.3:メニューでヒールすると落ちるバグ修正(2014/10/15)
#
#==============================================================================
# ■ MR_SPECIAL_ATTACK_CUSTOM
#------------------------------------------------------------------------------
#  自由にカスタマイズしてください
#==============================================================================
module MR_SPECIAL_ATTACK_CUSTOM
  # 連打対象スキルID=>[制限時間(秒),最低レート,1打レート,最高レート]
  RENDA_INFO = {
    8=>[5,0,1,100]
  }
  # 連打するボタン
  RENDA_BTN = :C
  # 連打スキル制限時間表示のメッセージ1
  RENDA_MSG_TIME1 = "连续按下决定键! 剩余 "
  # 連打スキル制限時間表示のメッセージ2
  RENDA_MSG_TIME2 = " 秒"
  # 連打回数表示時のメッセージ1
  RENDA_MSG_RET1 = ""
  # 連打回数表示時のメッセージ2
  RENDA_MSG_RET2 = "x"
 
  # ランダムコマンド入力対象
  #   スキルID=>[制限時間(秒),失敗時レート,成功時レート,入力数]
  RNDCMD_INFO = {
    8=>[3,0,100,5]
  }
  # ランダムコマンド入力キー
  RNDCMD_KEYS = [:DOWN,:LEFT,:RIGHT,:UP]
  # ランダムコマンド入力キー表示文字(全角一文字推奨)
  RNDCMD_KEY_OUTS = ["↓","←","→","↑"]
  # ランダムコマンド入力キー表示文字間
  RNDCMD_KEY_OUTS_SPACE = "  "
  # ランダムコマンド入力一つ成功
  RNDCMD_KEY_OUTS_OK = "○"
  # ランダムコマンド入力スキル制限時間表示のメッセージ1
  RNDCMD_MSG_TIME1 = "按指示按下按键! 剩余"
  # ランダムコマンド入力スキル制限時間表示のメッセージ2
  RNDCMD_MSG_TIME2 = "秒"
  # ランダムコマンド入力成功時のメッセージ
  RNDCMD_MSG_RET_OK = "HIT!"
  # ランダムコマンド入力失敗時のメッセージ
  RNDCMD_MSG_RET_NG = "MISS"
 
  # ジャストヒット入力対象
  #   スキルID=>[制限時間(秒),失敗時レート,ヒット時レート,ジャストヒット時レート,
  #               速さ,ゲージ長,ジャストヒット位置,ヒット許可数左,ヒット許可数右]
  JSTHIT_INFO = {
    1=>[1,50,100,150,2,21,11,4,4],
    61=>[1,25,135,200,2,21,13,2,2],
    63=>[1,0,0,300,2,21,14,0,0]
 
  }
  # ジャストヒットで押下するボタン
  JSTHIT_BTN = :C
  # ジャストヒットスキル制限時間表示のメッセージ1
  JSTHIT_MSG_TIME1 = "在☆的位置按下决定键! 剩余"
  # ジャストヒットスキル制限時間表示のメッセージ2
  JSTHIT_MSG_TIME2 = "秒"
  # ジャストヒットゲージ_ミス_オフ
  JSTHIT_GAGE_MISS_OFF= "-"
  # ジャストヒットゲージ_ミス_オン
  JSTHIT_GAGE_MISS_ON= "|"
  # ジャストヒットゲージ_ヒット_オフ
  JSTHIT_GAGE_HIT_OFF= "○"
  # ジャストヒットゲージ_ヒット_オン
  JSTHIT_GAGE_HIT_ON= "●"
  # ジャストヒットゲージ_ジャストヒット_オフ
  JSTHIT_GAGE_JUSTHIT_OFF= "☆"
  # ジャストヒットゲージ_ジャストヒット_オン
  JSTHIT_GAGE_JUSTHIT_ON= "★"
  # ジャストヒット時のメッセージ
  JSTHIT_JUST_HIT = "SMAAAAASH!"
  # ヒット時のメッセージ
  JSTHIT_HIT = "NICE!"
  # ヒット時のメッセージ
  JSTHIT_MISS = "MISS"
 
  # ジャストヒットN入力対象
  #   スキルID=>[最低レート,1ヒット加算レート,速さ,ゲージ長]
  JSTHITN_INFO = {
    8=>[100,50,4,30]
  }
  # ジャストヒットNヒット位置定義
  #   スキルID=>[ヒット位置1,ヒット位置2,ヒット位置3・・・]
  JSTHITN_HIT_INFO = {
    8=>[5,10,15,25,28]
  }
  # ジャストヒットNで押下するボタン
  JSTHITN_BTN = :C
  # ジャストヒットNスキル制限時間表示のメッセージ
  JSTHITN_MSG_TIME = "在恰当的时机按下决定键!"
  # ジャストヒットNゲージ_ミス_オフ
  JSTHITN_GAGE_MISS_OFF = "-"
  # ジャストヒットNゲージ_ミス_オン
  JSTHITN_GAGE_MISS_ON = "□"
  # ジャストヒットNゲージ_ヒット_オフ
  JSTHITN_GAGE_JUSTHIT_OFF = "☆"
  # ジャストヒットNゲージ_ヒット_オン
  JSTHITN_GAGE_JUSTHIT_ON = "■"
  # ヒット数のメッセージ
  JSTHITN_HIT = "x"
 
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 連打一打
  #--------------------------------------------------------------------------
  def se_renda
    RPG::SE.new("cursverti", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド入力OK
  #--------------------------------------------------------------------------
  def se_rndcmd_ok
    RPG::SE.new("item_streak_2", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド入力NG
  #--------------------------------------------------------------------------
  def se_rndcmd_ng
    RPG::SE.new("Buzzer1", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒット入力大当たり
  #--------------------------------------------------------------------------
  def se_jsthit_justhit
    RPG::SE.new("item_streak_1", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒット入力小当たり
  #--------------------------------------------------------------------------
  def se_jsthit_hit
    RPG::SE.new("item_streak_2", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒット入力ミス
  #--------------------------------------------------------------------------
  def se_jsthit_miss
    RPG::SE.new("Buzzer1", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットN入力当たり
  #--------------------------------------------------------------------------
  def se_jsthitn_hit
    RPG::SE.new("item_streak_2", 100, 100).play
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットN入力ミス
  #--------------------------------------------------------------------------
  def se_jsthitn_miss
    RPG::SE.new("Buzzer1", 100, 100).play
  end
end
#==============================================================================
# ■ MR_SPECIAL_ATTACK
#------------------------------------------------------------------------------
#  定数
#==============================================================================
module MR_SPECIAL_ATTACK
  # 
  TYPE_NONE = 0
  TYPE_RENDA = 1
  TYPE_RNDCMD = 2
  TYPE_JSTHIT = 3
  TYPE_JSTHITN = 4
 
  FRAME_RATE = 60
end
#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
#  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス
# は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。
#==============================================================================
 
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● ダメージ計算 再定義
  #--------------------------------------------------------------------------
  def make_damage_value(user, item, ssr = nil)
    value = item.damage.eval(user, self, $game_variables)
    value *= item_element_rate(user, item)
    value *= pdr if item.physical?
    value *= mdr if item.magical?
    value *= rec if item.damage.recover?
    # ↓追加
    #p "ダメージ = " + value.to_s
    #p " スペシャルアタックレート = " + $special_attack_rate.to_s
    value = sp_attack_to_damage(user,item,value,ssr)
    #p "ダメージ反映結果 = " + value.to_s
    # ↑追加
    value = apply_critical(value) if @result.critical
    value = apply_variance(value, item.damage.variance)
    value = apply_guard(value)
    @result.make_damage(value.to_i, item)
  end
  #--------------------------------------------------------------------------
  # ● ダメージにスペシャルアタック反映
  #--------------------------------------------------------------------------
  def sp_attack_to_damage(user,item,value,ssr)
    ret = value
    # スペシャルアタックの反映
    if $special_attack_rate == nil
      $special_attack_rate = 100
    end
    ret = (ret * $special_attack_rate) / 100
    return ret
  end
end
#==============================================================================
# ■ Scene_Battle
#------------------------------------------------------------------------------
#  バトル画面の処理を行うクラスです。
#==============================================================================
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  alias mr_ac0201_start start
  def start
    mr_ac0201_start
    init_special_attack
    # スペシャルアタックによるアタックレート
    $special_attack_rate = 100
  end
  #--------------------------------------------------------------------------
  # ● スペシャルアタック関連変数(メンバ)の初期化
  #--------------------------------------------------------------------------
  def init_special_attack
    @special_attack = false
    @special_type = MR_SPECIAL_ATTACK::TYPE_NONE
    @special_id = 0
    @special_frm_cnt = 0
    @special_ret = 0
 
    @renda_times = 0
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の処理 再定義
  #--------------------------------------------------------------------------
  def process_action
    return if scene_changing?
    # ↓追加
    if @special_attack == true
      process_special_attack
      return
    end
    # ↑追加
    if !@subject || !@subject.current_action
      @subject = BattleManager.next_subject
    end
    return turn_end unless @subject
    if @subject.current_action
      @subject.current_action.prepare
      if @subject.current_action.valid?
        # ↓追加
        if @special_attack == false \
         and @subject.current_action.item.is_a?(RPG::Skill )
          id = @subject.current_action.item.id
          chk = MR_SPECIAL_ATTACK_CUSTOM::RENDA_INFO[id]
          if chk != nil
            #p "連打スキル開始"
            @special_id = id
            @special_frm_cnt = 0
            @special_type = MR_SPECIAL_ATTACK::TYPE_RENDA
            @special_attack = true
            process_special_attack
            return
          else
            chk = MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[id]
            if chk != nil
              #p "ランダムコマンド入力スキル開始"
              @special_id = id
              @special_frm_cnt = 0
              @special_type = MR_SPECIAL_ATTACK::TYPE_RNDCMD
              @special_attack = true
              process_special_attack
              return
            else
              chk = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[id]
              if chk != nil
                #p "ジャストヒット入力スキル開始"
                @special_id = id
                @special_frm_cnt = 0
                @special_type = MR_SPECIAL_ATTACK::TYPE_JSTHIT
                @special_attack = true
                process_special_attack
                return
              else
                chk = MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[id]
                if chk != nil
                  #p "ジャストヒットN入力スキル開始"
                  @special_id = id
                  @special_frm_cnt = 0
                  @special_type = MR_SPECIAL_ATTACK::TYPE_JSTHITN
                  @special_attack = true
                  process_special_attack
                  return
                end
              end
            end
          end
        end
        # ↑追加
        @status_window.open
        execute_action
        # ↓追加
        $special_attack_rate = 100
        # ↑追加
      end
      @subject.remove_current_action
    end
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 再定義
  #--------------------------------------------------------------------------
  def execute_action(flg = true)
    @subject.sprite_effect_type = :whiten
    # ↓変更
    #use_item
    # "○○の攻撃!"はスペシャルアタック後で表示するのは不自然な気がするので消す
    use_item(flg)
    # ↑変更
    @log_window.wait_and_clear
  end
  #--------------------------------------------------------------------------
  # ● スキル/アイテムの使用 再定義 
  #--------------------------------------------------------------------------
  def use_item(flg = true)
    item = @subject.current_action.item
    # ↓変更
    #@log_window.display_use_item(@subject, item)
    # "○○の攻撃!"はスペシャルアタック後で表示するのは不自然な気がするので消す
    if flg == true
      @log_window.display_use_item(@subject, item)
    end
    # ↑変更
    @subject.use_item(item)
    refresh_status
    targets = @subject.current_action.make_targets.compact
    show_animation(targets, item.animation_id)
    targets.each {|target| item.repeats.times { invoke_item(target, item) } }
  end
  #--------------------------------------------------------------------------
  # ● スペシャルアタックの処理
  #--------------------------------------------------------------------------
  def process_special_attack
    case(@special_type)
    when MR_SPECIAL_ATTACK::TYPE_NONE
      @special_attack = false
    when MR_SPECIAL_ATTACK::TYPE_RENDA
      process_special_attack_renda
    when MR_SPECIAL_ATTACK::TYPE_RNDCMD
      process_special_attack_rndcmd
    when MR_SPECIAL_ATTACK::TYPE_JSTHIT
      process_special_attack_jsthit
    when MR_SPECIAL_ATTACK::TYPE_JSTHITN
      process_special_attack_jsthitn
    else
      @special_attack = false
    end
    if @special_frm_cnt % MR_SPECIAL_ATTACK::FRAME_RATE == 0
      #p "スペシャルアタック中!:" \
      #  + (@special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE).to_s
    end
    if @special_attack == false
      process_special_attack_end
    end
  end
  #--------------------------------------------------------------------------
  # ● スペシャルアタックの終了処理
  #--------------------------------------------------------------------------
  def process_special_attack_end
    #p "終了" 
    init_special_attack
    # 戦闘行動の処理後半と同じ処理
    @status_window.open
    # "○○の攻撃!"はスペシャルアタック後で表示するのは不自然な気がするので消す
    execute_action(false)
    $special_attack_rate = 100
    @subject.remove_current_action
    process_action_end unless @subject.current_action
  end
  #--------------------------------------------------------------------------
  # ▲▲▲スペシャルアタック1:連打▲▲▲
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  # ● 連打の出力先クリア
  #--------------------------------------------------------------------------
  def renda_output_clear
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● 連打の出力 スキル発動メッセージ
  #--------------------------------------------------------------------------
  def renda_output_display_use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
  end
  #--------------------------------------------------------------------------
  # ● 連打の出力
  #--------------------------------------------------------------------------
  def renda_output(str)
    @log_window.add_text(str)
  end
  #--------------------------------------------------------------------------
  # ● 連打の処理
  #--------------------------------------------------------------------------
  def process_special_attack_renda
    # フレームと残り秒数の取得
    t_limit = MR_SPECIAL_ATTACK_CUSTOM::RENDA_INFO[@special_id][0]
    t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
    # 1秒ごとの処理
    if @special_frm_cnt % MR_SPECIAL_ATTACK::FRAME_RATE == 0
      renda_output_clear
      renda_output_display_use_item
      renda_output(MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_TIME1 \
        + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_TIME2)
      renda_output(MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_RET1 + \
        @renda_times.to_s + MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_RET2)
      # 初回の処理
      if @special_frm_cnt == 0
        @renda_times = 0
      end
    end
    @special_frm_cnt = @special_frm_cnt + 1
    # 一打の処理
    if Input.trigger?(MR_SPECIAL_ATTACK_CUSTOM::RENDA_BTN)
      @renda_times = @renda_times + 1
      se_renda
      renda_output_clear
      renda_output_display_use_item
      renda_output(MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_TIME1 \
        + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_TIME2)
      renda_output(MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_RET1 + \
        @renda_times.to_s + MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_RET2)
      #p "連打!" + @renda_times.to_s
    end
    # 制限時間経過事(終了)の処理
    if (@special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE) == t_limit
      renda_output_clear
      renda_output(MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_RET1 + \
        @renda_times.to_s + MR_SPECIAL_ATTACK_CUSTOM::RENDA_MSG_RET2)
      # 最低レート
      @special_ret = MR_SPECIAL_ATTACK_CUSTOM::RENDA_INFO[@special_id][1]
      #p "最低レート:" + @special_ret.to_s
      # 連打数の反映
      a = MR_SPECIAL_ATTACK_CUSTOM::RENDA_INFO[@special_id][2]
      a = a * @renda_times
      @special_ret = @special_ret + a
      #p "連打数反映:" + @special_ret.to_s
      # 最高レート
      b = MR_SPECIAL_ATTACK_CUSTOM::RENDA_INFO[@special_id][3]
      if @special_ret > b
        @special_ret = b
        #p "最高レートを突破した為、修正:" + @special_ret.to_s
      end
      #p "結果:" + @special_ret.to_s
      $special_attack_rate = @special_ret
      @special_attack = false
    end
  end
  #--------------------------------------------------------------------------
  # ▲▲▲スペシャルアタック2:ランダムコマンド▲▲▲
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  # ● ランコマの出力先クリア
  #--------------------------------------------------------------------------
  def rndcmd_output_clear
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● ランコマの出力 スキル発動メッセージ
  #--------------------------------------------------------------------------
  def rndcmd_output_display_use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
  end
  #--------------------------------------------------------------------------
  # ● ランコマの出力
  #--------------------------------------------------------------------------
  def rndcmd_output(str)
    @log_window.add_text(str)
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド決定処理
  #--------------------------------------------------------------------------
  def rndcmd_desc(t)
    @rndcmds = []
    @rndcmds_txt = ""
    for i in 0...t
      j = rand(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_KEYS.size)
      @rndcmds.push(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_KEYS[j])
      @rndcmds_txt = @rndcmds_txt + \
        MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_KEY_OUTS[j] + \
        MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_KEY_OUTS_SPACE
    end
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド入力状況初期化
  #--------------------------------------------------------------------------
  def rndcmd_input_init
    @rndcmds_input_ok = 0
    @rndcmds_input_txt = ""
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド入力状況OK追加
  #--------------------------------------------------------------------------
  def rndcmd_input_ok
    # フレームと残り秒数の取得
    t_limit = MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[@special_id][0]
    t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
    se_rndcmd_ok
    @rndcmds_input_ok = @rndcmds_input_ok + 1
    @rndcmds_input_txt = @rndcmds_input_txt + \
      MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_KEY_OUTS_OK + \
      MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_KEY_OUTS_SPACE
    rndcmd_output_clear
    rndcmd_output_display_use_item
    rndcmd_output(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_TIME1 \
      + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_TIME2)
    rndcmd_ret_output
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド入力状況NG
  #--------------------------------------------------------------------------
  def rndcmd_input_ng
    # フレームと残り秒数の取得
    t_limit = MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[@special_id][0]
    t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
    se_rndcmd_ng
    rndcmd_input_init
    rndcmd_output_clear
    rndcmd_output_display_use_item
    rndcmd_output(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_TIME1 \
      + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_TIME2)
    rndcmd_ret_output
  end
  #--------------------------------------------------------------------------
  # ● ランダムコマンド、成否状況出力処理
  #--------------------------------------------------------------------------
  def rndcmd_ret_output
    rndcmd_output(@rndcmds_txt)
    rndcmd_output(@rndcmds_input_txt)
  end
  #--------------------------------------------------------------------------
  # ● ランコマの処理
  #--------------------------------------------------------------------------
  def process_special_attack_rndcmd
    # フレームと残り秒数の取得
    t_limit = MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[@special_id][0]
    t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
    # 1秒ごとの処理
    if @special_frm_cnt % MR_SPECIAL_ATTACK::FRAME_RATE == 0
      # 初回の処理
      if @special_frm_cnt == 0
        rndcmd_desc(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[@special_id][3])
        rndcmd_input_init
      end
      rndcmd_output_clear
      rndcmd_output_display_use_item
      rndcmd_output(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_TIME1 \
        + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_TIME2)
      rndcmd_ret_output
    end
    @special_frm_cnt = @special_frm_cnt + 1
    # 一打の処理
    if Input.trigger?(@rndcmds[@rndcmds_input_ok])
      rndcmd_input_ok
      #p "成功!" + @rndcmds_input_ok.to_s
    else
      if Input.trigger?(:DOWN)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:UP)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:RIGHT)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:LEFT)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:A)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:B)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:C)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:X)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:Y)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:Z)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:L)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:R)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:Shift)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:CTRL)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      elsif Input.trigger?(:ALT)
        rndcmd_input_ng
        #p "失敗" + @rndcmds_input_ok.to_s
      end
    end
    # 制限時間経過事(終了)、または全部入力終了時の処理
    if (@special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE) == t_limit \
      or @rndcmds_input_ok == @rndcmds.size
      rndcmd_output_clear
      # 成功時
      if @rndcmds_input_ok == @rndcmds.size
        rndcmd_output(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_RET_OK)
        # 成功レート
        @special_ret = MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[@special_id][2]
        #p "成功レート:" + @special_ret.to_s
      else
        # 失敗時  
        rndcmd_output(MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_MSG_RET_NG)
        # 失敗レート
        @special_ret = MR_SPECIAL_ATTACK_CUSTOM::RNDCMD_INFO[@special_id][1]
        #p "失敗レート:" + @special_ret.to_s
      end
      #p "結果:" + @special_ret.to_s
      $special_attack_rate = @special_ret
      @special_attack = false
    end
  end
  #--------------------------------------------------------------------------
  # ▲▲▲スペシャルアタック3:ジャストヒット▲▲▲
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  # ● ジャスヒの出力先クリア
  #--------------------------------------------------------------------------
  def jsthit_output_clear
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● ジャスヒの出力 スキル発動メッセージ
  #--------------------------------------------------------------------------
  def jsthit_output_display_use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
  end
  #--------------------------------------------------------------------------
  # ● ジャスヒの出力
  #--------------------------------------------------------------------------
  def jsthit_output(str)
    @log_window.add_text(str)
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒット入力状況初期化
  #--------------------------------------------------------------------------
  def jsthit_input_init
    t_limit = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][0]
    t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
    @jsthit_cnt = 0
    @jsthit_pos = 1
    jsthit_output_clear
    jsthit_output_display_use_item
    jsthit_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_MSG_TIME1 \
      + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_MSG_TIME2)
    jsthit_gage_output
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットゲージ進行処理
  #--------------------------------------------------------------------------
  def jsthit_count
    # 速さ
    if @jsthit_cnt == MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][4]
      if @jsthit_pos == MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][5]
        @jsthit_pos = 1
      else
        @jsthit_pos = @jsthit_pos + 1
      end
      @jsthit_cnt = 0
      t_limit = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][0]
      t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
      jsthit_output_clear
      jsthit_output_display_use_item
      jsthit_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_MSG_TIME1 \
        + t_zan.to_s + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_MSG_TIME2)
      jsthit_gage_output
    else
      @jsthit_cnt = @jsthit_cnt + 1
    end
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットゲージ出力処理
  #--------------------------------------------------------------------------
  def jsthit_gage_output
    @jsthits_txt = ""
    # ゲージ長
    for i in 1..MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][5]
      if i == @jsthit_pos
        # ジャストヒット位置
        if i == MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6]
          @jsthits_txt = @jsthits_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_GAGE_JUSTHIT_ON
        # ヒット
        elsif (MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6] \
          - MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][7])  <= i \
        and i <= (MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6] \
          + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][8])
          @jsthits_txt = @jsthits_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_GAGE_HIT_ON
        else
          @jsthits_txt = @jsthits_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_GAGE_MISS_ON
        end
      else
        # ジャストヒット位置
        if i == MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6]
          @jsthits_txt = @jsthits_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_GAGE_JUSTHIT_OFF
        # ヒット
        elsif (MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6] \
          - MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][7])  <= i \
        and i <= (MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6] \
          + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][8])
          @jsthits_txt = @jsthits_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_GAGE_HIT_OFF
        else
          @jsthits_txt = @jsthits_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_GAGE_MISS_OFF
        end
      end
 
    end
    jsthit_output(@jsthits_txt)
  end
  #--------------------------------------------------------------------------
  # ● ジャスヒの処理
  #--------------------------------------------------------------------------
  def process_special_attack_jsthit
    # フレームと残り秒数の取得
    t_limit = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][0]
    t_zan = t_limit - @special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE
    # 1秒ごとの処理
    if @special_frm_cnt % MR_SPECIAL_ATTACK::FRAME_RATE == 0
      # 初回の処理
      if @special_frm_cnt == 0
        jsthit_input_init
      end
    end
    jsthit_count
    @special_frm_cnt = @special_frm_cnt + 1
    # 制限時間経過事(終了)、または全部入力終了時の処理
    if (@special_frm_cnt / MR_SPECIAL_ATTACK::FRAME_RATE) == t_limit \
      or Input.trigger?(MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_BTN)
      jsthit_output_clear
      # ジャストヒット位置
      if @jsthit_pos == MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6]
        jsthit_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_JUST_HIT)
        se_jsthit_justhit
        # ジャストヒットレート
        @special_ret = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][3]
        p "ジャストヒットレート:" + @special_ret.to_s
      # ヒット
      elsif (MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6] \
        - MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][7]) <= @jsthit_pos \
      and @jsthit_pos <= (MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][6] \
        + MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][8])
        jsthit_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_HIT)
        se_jsthit_hit
        # ヒットレート
        @special_ret = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][2]
        #p "ヒットレート:" + @special_ret.to_s
      else
        se_jsthit_miss
        jsthit_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_MISS)
        # 失敗レート
        @special_ret = MR_SPECIAL_ATTACK_CUSTOM::JSTHIT_INFO[@special_id][1]
        #p "失敗レート:" + @special_ret.to_s
      end
      jsthit_gage_output
      #p "結果:" + @special_ret.to_s
      $special_attack_rate = @special_ret
      @special_attack = false
    end
  end
 
  #--------------------------------------------------------------------------
  # ▲▲▲スペシャルアタック4:ジャストヒットN▲▲▲
  #--------------------------------------------------------------------------
  #--------------------------------------------------------------------------
  # ● ジャスヒNの出力先クリア
  #--------------------------------------------------------------------------
  def jsthitn_output_clear
    @log_window.clear
  end
  #--------------------------------------------------------------------------
  # ● ジャスヒNの出力 スキル発動メッセージ
  #--------------------------------------------------------------------------
  def jsthitn_output_display_use_item
    item = @subject.current_action.item
    @log_window.display_use_item(@subject, item)
  end
  #--------------------------------------------------------------------------
  # ● ジャスヒNの出力
  #--------------------------------------------------------------------------
  def jsthitn_output(str)
    @log_window.add_text(str)
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットN入力状況初期化
  #--------------------------------------------------------------------------
  def jsthitn_input_init
    @jsthitn_cnt = 0
    @jsthitn_hitcnt = 0
    @jsthitn_pos = 1
    @jsthitn_pushcnt = 0
    @jsthitn_hitted = []
    jsthitn_output_clear
    jsthitn_output_display_use_item
    jsthitn_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_MSG_TIME)
    jsthitn_gage_output
    @jsthitn_next_hit = 999
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットNゲージ進行処理
  #--------------------------------------------------------------------------
  def jsthitn_count
    # 速さ
    if @jsthitn_cnt == MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][2]
      if @jsthitn_pos != MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][3]
        @jsthitn_pos = @jsthitn_pos + 1
      end
      @jsthitn_cnt = 0
      jsthitn_output_clear
      jsthitn_output_display_use_item
      jsthitn_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_MSG_TIME)
      jsthitn_gage_output
    else
      @jsthitn_cnt = @jsthitn_cnt + 1
    end
  end
  #--------------------------------------------------------------------------
  # ● ジャストヒットNゲージ出力処理
  #--------------------------------------------------------------------------
  def jsthitn_gage_output
    @jsthitns_txt = ""
    # ゲージ長
    j = 999
    for k in 0...MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id].size
      if MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][k] >= @jsthitn_pos \
        and j > k
        j = k
        #p "#{j.to_s]"
      end
    end
    e = @jsthitn_pos + 29
    if e > MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][3]
      e = MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][3]
    end
    for i in @jsthitn_pos..e 
      if i == @jsthitn_pos
        # ヒットN位置
        if i == MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][j]
          j = j + 1
          @jsthitns_txt = @jsthitns_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_GAGE_JUSTHIT_ON
        else
          @jsthitns_txt = @jsthitns_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_GAGE_MISS_ON
        end
      else
        # ヒットN位置
        if i == MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][j]
          j = j + 1
          @jsthitns_txt = @jsthitns_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_GAGE_JUSTHIT_OFF
        else
          @jsthitns_txt = @jsthitns_txt + MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_GAGE_MISS_OFF
        end
      end
    end
    jsthitn_output(@jsthitns_txt)
  end
  #--------------------------------------------------------------------------
  # ● ジャスヒNの処理
  #--------------------------------------------------------------------------
  def process_special_attack_jsthitn
    # 1秒ごとの処理
    if @special_frm_cnt % MR_SPECIAL_ATTACK::FRAME_RATE == 0
      # 初回の処理
      if @special_frm_cnt == 0
        jsthitn_input_init
      end
    end
    # 押下時の処理
    if Input.trigger?(MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_BTN)
      #p MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id].size.to_s
      jsthitn_next_hit_time = 999
      jsthitn_next_hit = 999
      for k in 0...MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id].size
        if jsthitn_next_hit_time > MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][k] \
          and MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][k] >= @jsthitn_pos
          jsthitn_next_hit = k
          jsthitn_next_hit_time = MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][k]
        end
      end
      #p "次のヒット:" + MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][jsthitn_next_hit].to_s
      #p "#{@jsthitn_pos.to_s}"
      if @jsthitn_pos == \
        MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id][jsthitn_next_hit]
        #p "入力成功"
        se_jsthitn_hit
        @jsthitn_hitted.push @jsthitn_pos
        jsthitn_output_clear
        jsthitn_output_display_use_item
        jsthitn_output(MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_MSG_TIME)
        jsthitn_gage_output
        @jsthitn_hitcnt = @jsthitn_hitcnt + 1
        @jsthitn_pushcnt = @jsthitn_pushcnt + 1
      else
        #p "入力失敗"
        @jsthitn_pushcnt = @jsthitn_pushcnt + 1
        se_jsthitn_miss
      end
    end
    jsthitn_count
    @special_frm_cnt = @special_frm_cnt + 1
    # ゲージ終了時、またはヒット数よりたくさん押した場合の処理
    if @jsthitn_pos == MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][3] \
      or @jsthitn_pushcnt >= MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT_INFO[@special_id].size
      @jsthitn_pos = 0
      jsthitn_output_clear
      jsthitn_output(@jsthitn_hitcnt.to_s + MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_HIT)
 
      # 最低レート
      @special_ret = MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][0]
      #p "最低レート:" + @special_ret.to_s
      # 成功数の反映
      a = MR_SPECIAL_ATTACK_CUSTOM::JSTHITN_INFO[@special_id][1]
      a = a * @jsthitn_hitcnt
      @special_ret = @special_ret + a
      #p "成功数反映:" + @special_ret.to_s
      #p "結果:" + @special_ret.to_s
      $special_attack_rate = @special_ret
      @special_attack = false
 
    end
  end
end