# ======================================================
#  「派生技スキル」スクリプトver.1.6
# ======================================================
# ■更新履歴
# ver1.6(2011/8/27)
# ・設定項目に「SKILL_CANUSE」を追加。
# 　MP不足などで覚えているけど使用出来ないスキルを、
# 　派生選択時に非表示にできる機能です。
# ・設定項目に「ATTACK_DSKILL」を追加。
# 　アクターの通常攻撃から派生するスキルを設定できます。
# 　使用しない場合は { から } の間に何も記入しないで下さい。
# ver1.5(2011/7/04)
# ・特定のスキルを経由していた場合にのみ派生が発生する、
#   <派生スキルuse_sk:ID1s:ID2s>と経由していない場合に派生する
#   <派生スキルunuse_sk:ID1s:ID2s>という機能を追加。
# ・回数制限をしていない技も回数制限にひっかかっていた不具合を修正。
# ・【重要】派生回数制限のカウント対象が「派生のみの回数」から、
#  　「始動時も含めた回数」に変更されています。
#  　以前の仕様通りの動作をさせる為には回数を1増やして下さい。
# ver1.4(2011/6/27)
# ・１ターンにそのスキルを派生で実行する回数を制限する
#   <派生回数制限:n>という機能を追加。
# ver.1.3(2011/6/25)
# ・派生技として実行する際に対象選択が派生元と同じになる
#   <派生時対象選択不可>という機能追加。
# ・通常スキル選択時にAボタンで派生先一覧が表示される機能を追加。
# ・「未修得スキルは派生先として表示されない設定」の場合、
# 　使えるものが一つも無い場合でも派生選択が始まる不具合を修正。
# ・派生技があるスキルをエネミーが使用した場合エラーが出るのを修正。
#   それに伴いエネミーは派生でしか使えないスキルを普通に使用できるように。
# ・バトルイベントが発生する場合、演出がかぶってしまう不具合を修正。
# ver.1.2(2011/2/27)
# ・派生技選択時の演出に画像ファイルを使用出来る様に。
#   設定項目で使用の有無、ファイル名などを設定して下さい。
# ver.1.1(2011/2/26)
# ・ステート条件で派生する機能を実装。
# ・派生スキル指定を一度に複数可能な形式に変更。
# ・時間制限の有無設定を実装。
# ・ヘルプテキストの表示設定を実装。
# ======================================================
# ■概要
# スキル使用後に特定のスキルを続けて発動できます。
# よくある連続スキル系のスクリプトと違う機能としては、
# ・次のスキルを使うかどうかを使用直前に選択できる。
# ・派生するスキルを複数設定しその中から選択できる。
# ・派生スキルを選択する際に制限時間を設定できる。
# 　(時間までに決定しなかった場合はキャンセルされる。)
# などがあります。
# 
# ■基本的な使い方
# ・元となるスキルのメモ欄に<派生スキル:ID>と書いて下さい。
# 　「ID」の部分には派生させたいスキルのIDを指定して下さい。
# ・複数のスキルへ派生させる場合は、
# 　<派生スキル:IDa,IDb,IDc>と一緒に記入して下さい。
# 　
# ■応用的な使い方
# ・<派生専用スキル>とメモ欄に記入したスキルは、
# 　派生技選択時以外では発動できないようになります。
# ・<派生キャンセル:ID>とメモ欄に記入した場合は、
# 　そのスキルから次の派生へ繋ぐのをキャンセルした場合に、
# 　IDのスキルが自動的に発動します。(MPも強制的に消費されます。)
# 
# ■キーワードまとめ
# （「ID」にsが付いている物は「1,6,8,18」の様に「,」で区切り複数指定可能。）
# <派生スキル:IDs>           :ID等のスキルに派生する。
# <派生スキルif_st:ID1s:ID2s>:ID1等のステート状態の場合にのみID2等へ派生する。
# <派生スキルno_st:ID1s:ID2s>:ID1等のステート状態でない場合にのみID2等へ派生する。
# <派生スキルuse_sk:ID1s:ID2s>:ID1等のスキルを経由している場合のみID2等へ派生する。
# <派生専用スキル>           :派生時にのみ実行可能なスキル。
# <派生キャンセル:ID>        :派生キャンセルした時にIDのスキルが発動する。
# <派生時対象選択不可>       :派生技のターゲットが自動で派生元と同じになる。
# <派生回数制限:n>           :同じターンに「派生で」そのスキルを実行するのを
#                             ｎ回までに制限する。
# 
# ■エイリアスしている箇所
# class Scene_Battle内
# 　execute_action_skill   （戦闘行動の実行 : スキル）
# 　update                 （フレーム更新）
# 　start                  （開始処理）
# 　turn_end               （ターン終了）
# 　process_battle_event   （バトルイベントの処理）
# 　update_skill_selection （スキル選択の更新）
# class Game_Battler内
# 　skill_can_use?         （スキルの使用可能判定）
# 　initialize             （オブジェクト初期化）
# 
# 同じ箇所を再定義やエイリアスしているスクリプトとは
# 競合する可能性があります。
# 

module NukumizuDerivationSkill
  #==================[設定項目ここから]==================
  # 派生先のスキルを未修得の場合はリストに含めない？
  # true   = 覚えているスキルのみ派生。
  # false  = 覚えていないスキルにも派生可能。
  SKILL_INCLUDE      = true
  # 派生先のスキルをMP不足などで使用できない場合はリストに含めない？
  # true   = 現在使用できるスキルのみ派生。
  # false  = 現在使用できないスキルにも派生可能。
  SKILL_CANUSE       = true
  
  # 通常攻撃からの派生するスキルの設定。
  # 表記方法:アクターID =>  [スキルID],
  # 必要なアクターの分だけ設定して下さい。
  ATTACK_DSKILL = {
  1 =>  [83,84,85],
  }
  
  # 派生技選択時にスキルのヘルプテキストを表示する？
  # true = 表示する。 false = 表示しない。
  HELP_TXT      = true
  
  # 派生技選択時の時間制限を有効にする？
  # true   = 時間制限有り（選ばれなかった場合はキャンセル。）
  # false  = 時間制限無し。
  TIME_LIMIT         = true
  # 選択猶予時間　60=1秒
  SELECT_TIME        = 120
  # 残り時間ゲージに使用するウィンドウスキン(Systemフォルダ)
  WINDOW_NAME        = "Window"
  
  # 選択時に表示するテキスト
  START_TEXT         = "派生技発動チャンス！！"
    # テキストの代わりに画像で表示する？
    # true = 表示する。 false = 表示しない。
    START_BITMAP     = false
    # テキストの代わりに表示する画像名(Systemフォルダ)
    START_FRONT        = "dskill_title"
  # 選択時に表示するテキスト背景名(Systemフォルダ)
  START_BACK         = "MessageBack"
  # 選択時の画面の色調変更(赤,緑,青,グレー)
  START_TONE         = Tone.new(-50, -50, -50, -50)
  
  
  # 選択開始時に鳴らすSE(SEフォルダ)
  START_SE_NAME      = "Flash1"
  # 上記SEのボリュームとピッチ
  START_SE_VOLUME    = 80
  START_SE_PITCH     = 100
  #==================[設定項目ここまで]==================
end
$imported = {} if $imported == nil# KGC様のヘルプウィンドウ拡張対応
class Scene_Battle < Scene_Base
  attr_accessor :active_battler
  attr_accessor :select_count
  attr_accessor :derivation_skill_flg
  #--------------------------------------------------------------------------
  # ● 開始処理　　■エイリアス
  #--------------------------------------------------------------------------
  alias dskill_start start
  def start
    dskill_start # 元の処理
    $game_party.dskill_memo_initialize
    $game_troop.dskill_memo_initialize
  end
  #--------------------------------------------------------------------------
  # ● ターン終了　　■エイリアス
  #--------------------------------------------------------------------------
  alias dskill_turn_end turn_end
  def turn_end
    $game_party.dskill_memo_initialize
    $game_troop.dskill_memo_initialize
    dskill_turn_end # 元の処理
  end
  #--------------------------------------------------------------------------
  # ● 派生スキル判定(有効な派生スキルのIDを配列で返す)　■新規
  #--------------------------------------------------------------------------
  def derivation_skill_id(skill)
    return [] if skill == nil
    result = []
    # 通常派生判定
    if skill.note.include?("<派生スキル:")
      memo2 = skill.note.scan(/<派生スキル:(\d+(?:\s*,\s*\d+)*)>/)
      unless memo2 == [] and memo2.empty?
        memo  = []
        $1.scan(/\d+/).each { |num|
        memo.push(num.to_i)}
        for i in memo
          result.push(i)
        end
      end
    end
    # 条件派生判定（ステートが付加されている）
    if skill.note.include?("<派生スキルif_st:")
      skill.note.scan(/<派生スキルif_st:(\d+(?:\s*,\s*\d+)*):(\d+(?:\s*,\s*\d+)*)>/).each{|num|
      for st in num[0].scan(/\d+/)
        if @active_battler.states.include?($data_states[st.to_i]) == true
          ok_flg = true
        else
          ok_flg = false
          break
        end
      end
      if ok_flg == true
        for i in num[1].scan(/\d+/)
          result.push(i.to_i)
        end
      end
      }
    end
    # 条件派生判定（ステートが付加されていない）
    if skill.note.include?("<派生スキルno_st:")
      skill.note.scan(/<派生スキルno_st:(\d+(?:\s*,\s*\d+)*):(\d+(?:\s*,\s*\d+)*)>/).each{|num|
      for st in num[0].scan(/\d+/)
        if @active_battler.states.include?($data_states[st.to_i]) != true
          ok_flg = true
        else
          ok_flg = false
          break
        end
      end
      if ok_flg == true
        for i in num[1].scan(/\d+/)
          result.push(i.to_i)
        end
      end
      }
    end
    # 条件派生判定（その技を経由している）
    if skill.note.include?("<派生スキルuse_sk:")
      skill.note.scan(/<派生スキルuse_sk:(\d+(?:\s*,\s*\d+)*):(\d+(?:\s*,\s*\d+)*)>/).each{|num|
      for use in num[0].scan(/\d+/)
        if @active_battler.dskill_memo[use.to_i] != nil
          ok_flg = true
        else
          ok_flg = false
          break
        end
      end
      if ok_flg == true
        for i in num[1].scan(/\d+/)
          result.push(i.to_i)
        end
      end
      }
    end
    # 条件派生判定（その技を経由していない）
    if skill.note.include?("<派生スキルunuse_sk:")
      skill.note.scan(/<派生スキルunuse_sk:(\d+(?:\s*,\s*\d+)*):(\d+(?:\s*,\s*\d+)*)>/).each{|num|
      for use in num[0].scan(/\d+/)
        if @active_battler.dskill_memo[use.to_i] == nil
          ok_flg = true
        else
          ok_flg = false
          break
        end
      end
      if ok_flg == true
        for i in num[1].scan(/\d+/)
          result.push(i.to_i)
        end
      end
      }
    end
    # 派生回数制限を判定（制限にひっかかるものをresultから削除）
    for i in result
      memo = @active_battler.dskill_memo[i]
      if memo != nil
        limit = $data_skills[i].note.scan(/<派生回数制限:(\d+)>/).flatten
        if limit != []
          if limit[0].to_i <= memo
            result.delete(i)
          end
        end
      end
    end
    return result.sort
  end
  #--------------------------------------------------------------------------
  # ● 派生キャンセルで発動するスキルがある場合IDを返す　■新規
  #--------------------------------------------------------------------------
  def cancel_derivation_skill_id(skill)
    #受け取った「skill」がnilの場合nilを返す
    return nil if skill == nil
    result = skill.note.scan(/<派生キャンセル:(\d+)>/).flatten
    #スキルのメモから発動するIDを返す(キーがない場合はnilを返す)
    return nil if result == []
    return result[0].to_i
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : スキル　■エイリアス
  #--------------------------------------------------------------------------
  alias execute_action_skill_derivation execute_action_skill
  def execute_action_skill
    execute_action_skill_derivation  # 元の処理
    dskill_memo_push(@skill.id)
    # 派生スキルかチェック
    if @active_battler.actor?
      dskill_id = derivation_skill_id(@active_battler.action.skill)
      if dskill_id != []
        @message_window.clear
        @derivation_skill_flg = true
        start_dskill_selection(dskill_id)
        @derivation_skill_flg = nil
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 戦闘行動の実行 : 攻撃　■エイリアス
  #--------------------------------------------------------------------------
  alias execute_action_attack_derivation execute_action_attack
  def execute_action_attack
    execute_action_attack_derivation # 元の処理
    if @active_battler.actor?
      dskill_id = NukumizuDerivationSkill::ATTACK_DSKILL[@active_battler.id]
      if dskill_id != nil
        @message_window.clear
        @derivation_skill_flg = true
        start_dskill_selection(dskill_id)
        @derivation_skill_flg = nil
      end
    end
    
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新　■エイリアス
  #--------------------------------------------------------------------------
  alias derivation_skill_update update
  def update
    if @dskill_window != nil
      update_basic(true)
      update_info_viewport                  # 情報表示ビューポートを更新
      if $game_message.visible
        @info_viewport.visible = false
        @message_window.visible = true
      end
      unless $game_message.visible         # メッセージ表示中以外
        return if judge_win_loss            # 勝敗判定
        update_scene_change
        if @target_enemy_window != nil
          dskill_update_target_enemy_selection     # 対象敵キャラ選択
        elsif @target_actor_window != nil
          dskill_update_target_actor_selection     # 対象アクター選択
        else
          update_dskill_selection            # スキル選択
        end
      end
    else
      derivation_skill_update              # 元の処理
    end
  end
  #--------------------------------------------------------------------------
  # ● バトルイベントの処理　■エイリアス
  #--------------------------------------------------------------------------
  alias derivation_skill_pbevent process_battle_event
  def process_battle_event
    derivation_skill_pbevent if @dskill_window == nil
  end
  #--------------------------------------------------------------------------
  # ● 使用可能な派生スキルが一つでもあるか？　■新規
  #--------------------------------------------------------------------------
  def d_skill_can_use?(skill)
    for id in skill
      if NukumizuDerivationSkill::SKILL_INCLUDE == true
        next unless @active_battler.skills.include?($data_skills[id.to_i])
      end
      return true if @active_battler.skill_can_use?($data_skills[id.to_i])
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● スキル選択の更新　■エイリアス
  #--------------------------------------------------------------------------
  alias update_skill_selection_dskill update_skill_selection
  def update_skill_selection
    if @dskill_window_sub != nil
      @dskill_window_sub.update
      if Input.trigger?(Input::A) or Input.trigger?(Input::B)
        Sound.play_cursor
        # 派生スキルウィンドウ開放
        @dskill_window_sub.dispose
        @dskill_window_sub = nil
        if @help_window_sub != nil
          @help_window_sub.dispose
          @help_window_sub = nil
        end
        @dskill_title.dispose
        @dskill_title = nil
        # 通常スキルウィンドウの透過度戻す
        @skill_window.active = true
        @skill_window.opacity = 255
        @skill_window.contents_opacity = 255
        @skill_window.help_window.opacity = 255
        @skill_window.help_window.contents_opacity = 255
      end
    else
      update_skill_selection_dskill # 元の処理
      if Input.trigger?(Input::A)
        dskill_id = derivation_skill_id(@skill_window.skill)
        if dskill_id != []
          Sound.play_cursor
          # 通常スキルウィンドウの透明度アップ
          @skill_window.active = false
          backopacity = 128
          @skill_window.opacity = backopacity
          @skill_window.contents_opacity = backopacity
          @skill_window.help_window.opacity = backopacity
          @skill_window.help_window.contents_opacity = backopacity
          # 派生スキルウィンドウ作成
          @dskill_title = Window_Skill_Derivation_Title.new(
          0, 56, 544, 56,@skill_window.skill)
          @dskill_window_sub = Window_Skill_Derivation_Sub.new(
          0, 56, 544, 232, @active_battler,dskill_id)
          @help_window_sub = Window_Help.new
          @dskill_window_sub.help_window = @help_window_sub
          
          if $imported["HelpExtension"]
            @help_window_sub.row_max = KGC::HelpExtension::ROW_MAX
          end
          @dskill_title.y = @help_window_sub.height
          @dskill_window_sub.y = @dskill_title.y + @dskill_title.height
          @dskill_window_sub.height = Graphics.height -
            (@help_window_sub.height + @status_window.height)
          @dskill_window_sub.refresh
        else
          Sound.play_buzzer
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 派生スキル選択の開始　■新規
  #--------------------------------------------------------------------------
  def start_dskill_selection(skill)
    return if judge_win_loss
    return if d_skill_can_use?(skill) == false  # スキル使用可能判定(派生スキル専用)
    wait_for_message
    $game_troop.screen.start_tone_change(NukumizuDerivationSkill::START_TONE, 0)
    @dskill_window = Window_Skill_Derivation.new(0, 288, 544, 128, @active_battler,skill)
    # 時間制限が有効な場合のみゲージ表示
    if NukumizuDerivationSkill::TIME_LIMIT == true
      @select_count = 0
      @time_window = Window_Skill_SelectTime.new(152, 242, 240, 42)
    end
    # ヘルプテキストが有効な場合のみ表示
    if NukumizuDerivationSkill::HELP_TXT == true
      @help_window = Window_Help.new
      @dskill_window.help_window = @help_window
      if $imported["HelpExtension"]
        @help_window.row_max = KGC::HelpExtension::ROW_MAX
      end
    end
    Audio.se_play("Audio/SE/" + NukumizuDerivationSkill::START_SE_NAME,
    NukumizuDerivationSkill::START_SE_VOLUME,NukumizuDerivationSkill::START_SE_PITCH)
    @message_window.visible = false
    
    bitmap = Cache.system(NukumizuDerivationSkill::START_BACK)
    @sp = Sprite.new(Viewport.new(0, 0, 544, 416))
    @sp.bitmap = bitmap
    @sp.ox = @sp.bitmap.width / 2
    @sp.oy = @sp.bitmap.height / 2
    @sp.x = 272
    @sp.y = 172
    @sp.y += -24 if NukumizuDerivationSkill::TIME_LIMIT == true
    if NukumizuDerivationSkill::START_BITMAP == true
      bitmap2 = Cache.system(NukumizuDerivationSkill::START_FRONT)
      @sp2 = Sprite.new(@sp.viewport)
      @sp2.bitmap = bitmap2
      @sp2.ox = @sp2.bitmap.width / 2
      @sp2.oy = @sp2.bitmap.height / 2
      @sp2.x = 272
      @sp2.y = 172
      @sp2.y += -24 if NukumizuDerivationSkill::TIME_LIMIT == true
    else
      cl = Font.new
      cl.color = Color.new(255,255,55,255)
      @sp.bitmap.font = (cl)
      @sp.bitmap.draw_text(bitmap.rect, NukumizuDerivationSkill::START_TEXT,1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 派生スキル選択の終了　■新規
  #--------------------------------------------------------------------------
  def end_dskill_selection
    if @dskill_window != nil
      @dskill_window.dispose
      @dskill_window = nil
    end
    if @time_window != nil
      @time_window.dispose
      @time_window = nil
    end
    if @help_window != nil
      @help_window.dispose
      @help_window = nil
    end
    @derivation_skill_flg = nil
    @message_window.visible = true
    @sp.bitmap.dispose   # 画像を消去
    @sp.dispose          # スプライトを消去
    if NukumizuDerivationSkill::START_BITMAP == true
      @sp2.bitmap.dispose   # 画像を消去
      @sp2.dispose          # スプライトを消去
    end
    $game_troop.screen.start_tone_change(Tone.new(0, 0, 0, 0), 0)
  end
  #--------------------------------------------------------------------------
  # ● 派生スキル選択の更新　■新規
  #--------------------------------------------------------------------------
  def update_dskill_selection
    @dskill_window.active = true
    @dskill_window.update
    @help_window.update if NukumizuDerivationSkill::HELP_TXT == true
    @time_window.update if NukumizuDerivationSkill::TIME_LIMIT == true
    if Input.trigger?(Input::B)
      Sound.play_cancel
      # 派生キャンセル発動スキルの判定
      can_skill = cancel_derivation_skill_id(@skill)
      if can_skill != nil
        @skill = $data_skills[can_skill]
        @active_battler.action.set_skill(@skill.id)
        @dskill_window.active = false
        end_dskill_selection
        execute_action_skill
      else
        end_dskill_selection
      end
    elsif Input.trigger?(Input::C)
      @skill = @dskill_window.skill
      @derivation_skill_flg = true
      if @active_battler.skill_can_use?(@skill)
        Sound.play_decision
        @active_battler.action.set_skill(@skill.id)
        if @skill.need_selection? and @skill.note.include?("<派生時対象選択不可>") == false
          # 派生スキルが対象選択必要な場合
          if @skill.for_opponent?
            dskill_start_target_enemy_selection
          else
            dskill_start_target_actor_selection
          end
        else
          # 派生スキル発動
          @dskill_window.active = false
          end_dskill_selection
          execute_action_skill
        end
      else
        Sound.play_buzzer
      end
    elsif NukumizuDerivationSkill::TIME_LIMIT == true
      @select_count += 1
      if @select_count >= NukumizuDerivationSkill::SELECT_TIME
        end_dskill_selection
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 派生スキル使用カウント　■新規
  #--------------------------------------------------------------------------
  def dskill_memo_push(skill_id)
    val = @active_battler.dskill_memo[skill_id]
    if val == nil
      @active_battler.dskill_memo[skill_id] = 1
    else
      @active_battler.dskill_memo[skill_id] += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の開始(派生スキル用)　■新規
  #--------------------------------------------------------------------------
  def dskill_start_target_enemy_selection
    @target_enemy_window = Window_TargetEnemy.new
    @target_enemy_window.y = @dskill_window.y
    @dskill_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の終了(派生スキル用)　■新規
  #--------------------------------------------------------------------------
  def dskill_end_target_enemy_selection
    @target_enemy_window.dispose
    @target_enemy_window = nil
  end
  #--------------------------------------------------------------------------
  # ● 対象敵キャラ選択の更新(派生スキル用)　■新規
  #--------------------------------------------------------------------------
  def dskill_update_target_enemy_selection
    @target_enemy_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_target_enemy_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_enemy_window.enemy.index
      dskill_end_target_enemy_selection
      end_dskill_selection
      execute_action_skill
    end
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター対象選択の開始(派生スキル用)　■新規
  #--------------------------------------------------------------------------
  def dskill_start_target_actor_selection
    @target_actor_window = Window_BattleStatus.new
    @target_actor_window.index = 0
    @target_actor_window.active = true
    @target_actor_window.y = @dskill_window.y
    @dskill_window.active = false
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター選択の終了(派生スキル用)　■新規
  #--------------------------------------------------------------------------
  def dskill_end_target_actor_selection
    @target_actor_window.dispose
    @target_actor_window = nil
  end
  #--------------------------------------------------------------------------
  # ● 対象アクター選択の更新(派生スキル用)　■新規
  #--------------------------------------------------------------------------
  def dskill_update_target_actor_selection
    @target_actor_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      dskill_end_target_actor_selection
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @active_battler.action.target_index = @target_actor_window.index
      dskill_end_target_actor_selection
      end_dskill_selection
      execute_action_skill
    end
  end
end

#==============================================================================
# ■ Game_Battler
#------------------------------------------------------------------------------
# 　バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ
# スのスーパークラスとして使用されます。
#==============================================================================
class Game_Battler
  attr_accessor :dskill_memo       # 同ターン中の派生技の使用回数記録
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化　■エイリアス
  #--------------------------------------------------------------------------
  alias dskill_initialize initialize
  def initialize
    @dskill_memo = {}           # 同ターン中の派生技の使用回数記録
    dskill_initialize           # 元の処理へ戻る
  end
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定　■エイリアス
  #     skill : スキル
  #--------------------------------------------------------------------------
  alias derivation_skill_can_use? skill_can_use?
  def skill_can_use?(skill)
    # 派生スキル選択中以外の場合、派生専用スキルを使用不可に。
    if actor?
      if skill.is_a?(RPG::Skill)
        if skill.note.include?("<派生専用スキル>")
          return false if $scene.class != Scene_Battle
          return false if $scene.derivation_skill_flg == nil
        end
      end
    end
    derivation_skill_can_use?(skill)  #元の処理
  end
end
class Game_Unit
  #--------------------------------------------------------------------------
  # ● 連携関連の変数リセット　　■新規
  # (戦闘開始時と毎ターン終了時に呼び出される)
  #--------------------------------------------------------------------------
  def dskill_memo_initialize
    for member in members
      member.dskill_memo = {}
    end
  end
end
#==============================================================================
# ■ Window_Skill_Derivation　■全て新規
#------------------------------------------------------------------------------
#==============================================================================
class Window_Skill_SelectTime < Window_Base
  def initialize(x, y, width, height)
    super(x, y, width, height)
    self.windowskin = Cache.system(NukumizuDerivationSkill::WINDOW_NAME)
  end
  def update
    return if $scene.class != Scene_Battle
    super
    select_time = NukumizuDerivationSkill::SELECT_TIME
    select_count = $scene.select_count
    gw = width * (select_time - select_count)/select_time
    gc1 = hp_gauge_color1
    gc2 = hp_gauge_color2
    self.contents.fill_rect(0, 0, width, 6, gauge_back_color)
    self.contents.gradient_fill_rect(0, 0, gw, 6, gc1, gc2)
  end
end
class Window_Skill_Derivation < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #     actor  : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor,skill)
    super(x, y, width, height)
    @actor = actor
    @column_max = 2
    @skills = skill
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    for skill in @skills
      # 「覚えてない場合はスキルを飛ばす設定」の場合処理
      if NukumizuDerivationSkill::SKILL_INCLUDE == true
        next unless @actor.skills.include?($data_skills[skill.to_i])
      end
      # 「使用できない場合はスキルを飛ばす設定」の場合処理
      if NukumizuDerivationSkill::SKILL_CANUSE == true
        next unless @actor.skill_can_use?($data_skills[skill.to_i])
      end
      @data.push($data_skills[skill.to_i])
    end
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    skill = @data[index]
    if skill != nil
      rect.width -= 4
      enabled = @actor.skill_can_use?(skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, @actor.calc_mp_cost(skill), 2)
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(skill == nil ? "" : skill.description)
  end
end

class Window_Skill_Derivation_Title < Window_Selectable
  def initialize(x, y, width, height,skill)
    super(x, y, width, height)
    @skill = skill
    refresh
  end
  def refresh
    self.contents.draw_text(0,0,64,24,"派生元：")
    draw_item_name(@skill, 64, 0, true)
  end
end

class Window_Skill_Derivation_Sub < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor,dskills)
    super(x, y, width, height)
    @actor = actor
    @column_max = 2
    @skills = dskills
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    for skill in @skills
      # 「覚えてない場合はスキルを飛ばす設定」の場合処理
      if NukumizuDerivationSkill::SKILL_INCLUDE == true
        next unless @actor.skills.include?($data_skills[skill.to_i])
      end
      @data.push($data_skills[skill.to_i])
    end
    @item_max = @data.size
    create_contents
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    self.contents.clear_rect(rect)
    skill = @data[index]
    if skill != nil
      rect.width -= 4
      draw_item_name(skill, rect.x, rect.y, true)
      self.contents.draw_text(rect, @actor.calc_mp_cost(skill), 2)
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(skill == nil ? "" : skill.description)
  end
end