查看: 5498|回复: 20

[已经解决] 有个很喜欢的VX脚本,想找VA的版本

[复制链接]
梦石
0
星屑
850
在线时间
160 小时
注册时间
2012-6-3
回帖
89
发表于 2014-8-14 15:35:34 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 白玉楼的台阶 于 2014-8-14 16:47 编辑

这个脚本的大致作用是主角有一类特殊技能,可以在菜单里面像选择装备一样挑选使用,不同的技能消耗不同的CP值,总和不能超过一定数量
http://www.tu265.com/di-bc7cc1115b64c2f457cce8110285a2ea.png
http://www.tu265.com/di-ae1e4c83c66d00517295e27b982a1b7b.png
这是游戏中实际使用的效果
http://www.tu265.com/di-6a1d34d769f0a640a4a5c860348f0ff6.png
这是数据库里面对应技能的设定

下面是完整的脚本

[pre lang="ruby" line="1"]
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ スキルCP制 - KGC_SkillCPSystem ◆ VX ◆
#_/    ◇ Last update : 2009/09/13 ◇
#_/----------------------------------------------------------------------------
#_/  戦闘中に使用可能なスキルを限定する機能を追加します。
#_/============================================================================
#_/ 【装備】≪スキル習得装備≫ より下に導入してください。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

#==============================================================================
# ★ カスタマイズ項目 - Customize ★
#==============================================================================

module KGC
module SkillCPSystem
  # ◆ 登録スキル最大数
  MAX_SKILLS = 3
  # ◆ CP の名称
  VOCAB_CP   = "CP"
  # ◆ CP の名称 (略)
  VOCAB_CP_A = "C"
  # ◆ ステータス画面に CP を表示する
  SHOW_STATUS_CP = true

  # ◆ 消費 CP 既定値
  #  消費 CP 未指定のスキルで使用。
  DEFAULT_CP_COST = 1
  # ◆ CP 上限
  #  (固有 CP などを除いた) 素の状態での CP 上限。
  CP_MAX = 20
  # ◆ CP 下限
  CP_MIN = 1
  # ◆ 補正後の CP 上限
  #  固有 CP や装備品による変動を含めた上限。
  REVISED_CP_MAX = 20
  # ◆ 補正後の CP 下限
  REVISED_CP_MIN = 0
  # ◆ 最大 CP 算出式
  #   level..現在のレベル
  #  自動的に整数変換するので、結果が小数になってもOK。
  CP_CALC_EXP = "level * 0.5 + 1.0"
  # ◆ アクター毎の最大 CP 算出式
  PERSONAL_CP_CALC_EXP = []
  #  ここから下に、アクターごとの最大 CP を
  #   PERSONAL_CP_CALC_EXP[アクター ID] = "計算式"
  #  という書式で指定。
  #  計算式は CP_CALC_EXP と同様の書式。
  #  指定しなかったアクターは CP_CALC_EXP を使用。
  #   <例> ラルフだけ優遇
  # PERSONAL_CP_CALC_EXP[1] = "level * 0.8 + 2.0"

  # ◆ 戦闘テスト時は無効化
  #  true  : 戦闘テスト時は全スキルを使用可能。
  #  false : 戦闘テスト時は (セットしない限り) 使用不可。
  DISABLE_IN_BATTLETEST  = false
  # ◆ 使用不可スキルもセット可能
  SHOW_UNUSABLE_SKILL    = true
  # ◆ 消費 CP 0 のスキルはセットしなくても使用可能
  USABLE_COST_ZERO_SKILL = true
  # ◆ パッシブスキルはセットしないと効果なし
  #  ≪パッシブスキル≫ 導入時のみ有効。
  PASSIVE_NEED_TO_SET    = true
  # ◆ 新規習得スキルを自動的にセット
  #  true  : 習得したスキルを空きスロットにセット。
  #           ※ ≪スキル習得装備≫ で習得したスキルは無効。
  #  false : 習得しただけではセットされない (手動でセット)。
  AUTO_SET_NEW_SKILL     = false
  # ◆ 消費 CP 0 の場合も消費 CP を表示する
  #  true  : 消費 CP 0 でも表示
  #  false : 消費 CP 1 以上の場合のみ表示
  SHOW_ZERO_COST         = false

  # ◆ CP ゲージの色
  #  数値  : \C[n] と同じ色。
  #  Color : 指定した色。 ( Color.new(255, 128, 128) など )
  GAUGE_START_COLOR = 13  # 開始色
  GAUGE_END_COLOR   =  5  # 終了色

  # ◆ CP ゲージに汎用ゲージを使用する
  #  ≪汎用ゲージ描画≫ 導入時のみ有効。
  ENABLE_GENERIC_GAUGE = true
  # ◆ CP ゲージ設定
  #  画像は "Graphics/System" から読み込む。
  GAUGE_IMAGE  = "GaugeCP"  # 画像
  GAUGE_OFFSET = [-23, -2]  # 位置補正 [x, y]
  GAUGE_LENGTH = -4         # 長さ補正
  GAUGE_SLOPE  = 30         # 傾き (-89 ~ 89)

  # ◆ メニュー画面に「スキル設定」コマンドを追加する
  #  追加する場所は、メニューコマンドの最下部です。
  #  他の部分に追加したければ、≪カスタムメニューコマンド≫ をご利用ください。
  USE_MENU_SET_SKILL_COMMAND = true
  # ◆ メニュー画面の「スキル設定」コマンドの名称
  VOCAB_MENU_SET_SKILL       = "设定技能"

  # ◆ 未設定項目の表示文字列
  BLANK_TEXT   = "-  EMPTY  -"
  # ◆ 設定解除の表示文字列
  RELEASE_TEXT = "( 設定解除 )"
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["SkillCPSystem"] = true

module KGC::SkillCPSystem
  module Regexp
    module BaseItem
      # 最大 CP
      MAXCP_PLUS = /<(?:MAX|最大)CP\s*([\-\+]?\d+)>/
      # 登録スキル数
      BATTLE_SKILL_MAX = /<(?:BATTLE_SKILL_MAX|登録スキル数)\s*([\-\+]?\d+)>/i
    end

    module Skill
      # 消費 CP
      CP_COST = /<CP\s*(\d+)>/i
      # 同時セット不可
      EXCLUDE = /<(?:EXCLUDE|同時セット不可)\s*(\d+(?:\s*,\s*\d+)*)>/
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ KGC::Commands
#==============================================================================

module KGC
module Commands
  module_function
  #--------------------------------------------------------------------------
  # ○ MaxCP 補正値の取得
  #     actor_id    : アクター ID
  #     variable_id : 取得した値を代入する変数の ID
  #--------------------------------------------------------------------------
  def get_actor_own_cp(actor_id, variable_id = 0)
    value = $game_actors[actor_id].maxcp_plus
    $game_variables[variable_id] = value if variable_id > 0
    return value
  end
  alias get_own_cp get_actor_own_cp
  #--------------------------------------------------------------------------
  # ○ MaxCP 補正値の変更
  #     actor_id : アクター ID
  #     value    : MaxCP 補正値
  #--------------------------------------------------------------------------
  def set_actor_own_cp(actor_id, value)
    $game_actors[actor_id].maxcp_plus = value
  end
  alias set_own_cp set_actor_own_cp
  #--------------------------------------------------------------------------
  # ○ アクターの MaxCP 補正値の増加
  #     actor_id : アクター ID
  #     value    : 増加量
  #--------------------------------------------------------------------------
  def gain_actor_cp(actor_id, value)
    $game_actors[actor_id].maxcp_plus += value
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数の取得
  #     actor_id : アクター ID
  #     variable_id : 取得した値を代入する変数の ID
  #--------------------------------------------------------------------------
  def get_battle_skill_max(actor_id, variable_id = 0)
    value = $game_actors[actor_id].battle_skill_max
    $game_variables[variable_id] = value if variable_id > 0
    return value
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数の変更
  #     actor_id : アクター ID
  #     value    : 登録可能数
  #--------------------------------------------------------------------------
  def set_battle_skill_max(actor_id, value = -1)
    $game_actors[actor_id].battle_skill_max = value
  end
  #--------------------------------------------------------------------------
  # ○ スキルが登録されているか
  #     actor_id : アクター ID
  #     skill_id : 確認するスキル ID
  #--------------------------------------------------------------------------
  def battle_skill_set?(actor_id, skill_id)
    return $game_actors[actor_id].battle_skill_ids.include?(skill_id)
  end
  #--------------------------------------------------------------------------
  # ○ スキルの登録
  #     actor_id : アクター ID
  #     index    : 登録箇所
  #     skill_id : 登録するスキル ID (nil で解除)
  #--------------------------------------------------------------------------
  def set_battle_skill(actor_id, index, skill_id = nil)
    actor = $game_actors[actor_id]
    if skill_id.is_a?(Integer)
      # 登録
      skill = $data_skills[skill_id]
      return unless actor.battle_skill_settable?(index, skill)  # セット不可

      actor.set_battle_skill(index, skill)
      actor.restore_battle_skill
    else
      # 解除
      actor.remove_battle_skill(index)
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキルの追加登録
  #     actor_id : アクター ID
  #     skill_id : 登録するスキル ID
  #--------------------------------------------------------------------------
  def add_battle_skill(actor_id, skill_id)
    actor = $game_actors[actor_id]
    skill = $data_skills[skill_id]
    return if actor == nil || skill == nil

    actor.add_battle_skill(skill)
  end
  #--------------------------------------------------------------------------
  # ○ スキルの全解除
  #     actor_id : アクター ID
  #--------------------------------------------------------------------------
  def clear_battle_skill(actor_id)
    $game_actors[actor_id].clear_battle_skill
  end
  #--------------------------------------------------------------------------
  # ○ スキル設定画面の呼び出し
  #     actor_index : アクターインデックス
  #--------------------------------------------------------------------------
  def call_set_battle_skill(actor_index = 0)
    return if $game_temp.in_battle
    $game_temp.next_scene = :set_battle_skill
    $game_temp.next_scene_actor_index = actor_index
  end
end
end

class Game_Interpreter
  include KGC::Commands
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Vocab
#==============================================================================

module Vocab
  # CP
  def self.cp
    return KGC::SkillCPSystem::VOCAB_CP
  end

  # CP (略)
  def self.cp_a
    return KGC::SkillCPSystem::VOCAB_CP_A
  end

  # スキル設定
  def self.set_battle_skill
    return KGC::SkillCPSystem::VOCAB_MENU_SET_SKILL
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ スキルCP制のキャッシュを生成
  #--------------------------------------------------------------------------
  def create_skill_cp_system_cache
    @__maxcp_plus = 0
    @__battle_skill_max_plus = 0

    self.note.each_line { |line|
      case line
      when KGC::SkillCPSystem::Regexp::BaseItem::MAXCP_PLUS
        # 最大 CP
        @__maxcp_plus += $1.to_i
      when KGC::SkillCPSystem::Regexp::BaseItem::BATTLE_SKILL_MAX
        # 登録スキル数
        @__battle_skill_max_plus += $1.to_i
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 最大 CP 補正
  #--------------------------------------------------------------------------
  def maxcp_plus
    create_skill_cp_system_cache if @__maxcp_plus == nil
    return @__maxcp_plus
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル数補正
  #--------------------------------------------------------------------------
  def battle_skill_max_plus
    create_skill_cp_system_cache if @__battle_skill_max_plus == nil
    return @__battle_skill_max_plus
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ○ スキルCP制のキャッシュを生成
  #--------------------------------------------------------------------------
  def create_skill_cp_system_cache
    @__cp_cost = KGC::SkillCPSystem::DEFAULT_CP_COST
    @__excluded_skills = []

    self.note.each_line { |line|
      case line
      when KGC::SkillCPSystem::Regexp::Skill::CP_COST
        # 消費 CP
        @__cp_cost = $1.to_i
      when KGC::SkillCPSystem::Regexp::Skill::EXCLUDE
        # 同時セット不可
        $1.scan(/\d+/).each { |num| @__excluded_skills << num.to_i }
        @__excluded_skills.uniq!
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 消費 CP
  #--------------------------------------------------------------------------
  def cp_cost
    create_skill_cp_system_cache if @__cp_cost == nil
    return @__cp_cost
  end
  #--------------------------------------------------------------------------
  # ○ 同時セット不可
  #--------------------------------------------------------------------------
  def excluded_skills
    create_skill_cp_system_cache if @__excluded_skills == nil
    return @__excluded_skills
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルセット済み判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def battle_skill_set?(skill)
    return true
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_writer   :maxcp_plus               # MaxCP 補正値
  #--------------------------------------------------------------------------
  # ○ MaxCP 取得
  #--------------------------------------------------------------------------
  def maxcp
    calc_exp = KGC::SkillCPSystem::PERSONAL_CP_CALC_EXP[self.id]
    if calc_exp == nil
      calc_exp = KGC::SkillCPSystem::CP_CALC_EXP
    end
    n = Integer(eval(calc_exp))
    n = [[n, cp_limit].min, KGC::SkillCPSystem::CP_MIN].max
    n += maxcp_plus + maxcp_plus_equip
    return [[n, revised_cp_limit].min, KGC::SkillCPSystem::REVISED_CP_MIN].max
  end
  #--------------------------------------------------------------------------
  # ○ CP 取得
  #--------------------------------------------------------------------------
  def cp
    return [maxcp - consumed_cp, 0].max
  end
  #--------------------------------------------------------------------------
  # ○ CP 消費量取得
  #--------------------------------------------------------------------------
  def consumed_cp
    n = 0
    battle_skills.compact.each { |skill| n += skill.cp_cost }
    return n
  end
  #--------------------------------------------------------------------------
  # ○ CP 上限取得
  #--------------------------------------------------------------------------
  def cp_limit
    return KGC::SkillCPSystem::CP_MAX
  end
  #--------------------------------------------------------------------------
  # ○ 補正後の CP 上限取得
  #--------------------------------------------------------------------------
  def revised_cp_limit
    return KGC::SkillCPSystem::REVISED_CP_MAX
  end
  #--------------------------------------------------------------------------
  # ○ MaxCP 補正値取得
  #--------------------------------------------------------------------------
  def maxcp_plus
    if @maxcp_plus == nil
      if @own_cp != nil
        @maxcp_plus = @own_cp
        @own_cp = nil
      else
        @maxcp_plus = 0
      end
    end
    return @maxcp_plus
  end
  #--------------------------------------------------------------------------
  # ○ 装備品による MaxCP 補正値取得
  #--------------------------------------------------------------------------
  def maxcp_plus_equip
    n = 0
    equips.compact.each { |item| n += item.maxcp_plus }
    return n
  end
  #--------------------------------------------------------------------------
  # ● スキル取得
  #--------------------------------------------------------------------------
  alias skills_KGC_SkillCPSystem skills
  def skills
    return (skill_cp_restrict? ? restricted_skills : skills_KGC_SkillCPSystem)
  end
  #--------------------------------------------------------------------------
  # ○ スキルを制限するか
  #--------------------------------------------------------------------------
  def skill_cp_restrict?
    if $game_temp.in_battle
      # 戦闘テストでないか、戦闘テストでも制限する場合
      return true unless $BTEST && KGC::SkillCPSystem::DISABLE_IN_BATTLETEST
    end

    return false
  end
  #--------------------------------------------------------------------------
  # ○ スキルを制限
  #--------------------------------------------------------------------------
  def restricted_skills
    result = all_skills
    result.each_with_index { |skill, i|
      # 消費 CP > 0 のスキルを除外
      if !KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL || skill.cp_cost > 0
        result = nil
      end
      # パッシブスキルを除外
      if $imported["PassiveSkill"] && KGC::SkillCPSystem::PASSIVE_NEED_TO_SET
        if skill.passive &&
            (!KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL || skill.cp_cost > 0)
          result = nil
        end
      end
    }
    result.compact!
    # 戦闘スキルを追加
    result |= battle_skills
    result.sort! { |a, b| a.id <=> b.id }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ 全スキル取得
  #--------------------------------------------------------------------------
  def all_skills
    # 一時的に非戦闘中にする
    last_in_battle = $game_temp.in_battle
    $game_temp.in_battle = false

    result = skills_KGC_SkillCPSystem
    if $imported["EquipLearnSkill"]
      result |= (equipment_skills | full_ap_skills)
      result.sort! { |a, b| a.id <=> b.id }
    end

    # 戦闘中フラグを戻す
    $game_temp.in_battle = last_in_battle

    return result
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数取得
  #--------------------------------------------------------------------------
  def battle_skill_max
    @battle_skill_max = -1 if @battle_skill_max == nil
    n = (@battle_skill_max < 0 ?
      KGC::SkillCPSystem::MAX_SKILLS : @battle_skill_max)
    n += equipment_battle_skill_max_plus
    return [n, 0].max
  end
  #--------------------------------------------------------------------------
  # ○ 装備品による登録スキル数補正
  #--------------------------------------------------------------------------
  def equipment_battle_skill_max_plus
    n = 0
    equips.compact.each { |item| n += item.battle_skill_max_plus }
    return n
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数設定
  #--------------------------------------------------------------------------
  def battle_skill_max=(value)
    @battle_skill_max = value
    if @battle_skills == nil
      @battle_skills = []
    else
      @battle_skills = @battle_skills[0...value]
    end
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル ID 取得
  #--------------------------------------------------------------------------
  def battle_skill_ids
    @battle_skills = [] if @battle_skills == nil
    return @battle_skills
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル取得
  #--------------------------------------------------------------------------
  def battle_skills
    result = []
    battle_skill_ids.each { |i|
      next if i == nil           # 無効なスキルは無視
      result << $data_skills
    }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル登録
  #     index : 位置
  #     skill : スキル (nil で解除)
  #--------------------------------------------------------------------------
  def set_battle_skill(index, skill)
    if skill == nil
      @battle_skills[index] = nil
    else
      return unless skill.is_a?(RPG::Skill)  # スキル以外
      return if cp < skill.cp_cost           # CP 不足
      return if KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL && skill.cp_cost == 0

      @battle_skills[index] = skill.id
    end
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル追加登録
  #     skill : スキル
  #--------------------------------------------------------------------------
  def add_battle_skill(skill)
    return unless skill.is_a?(RPG::Skill)  # スキル以外
    skills = battle_skill_ids
    return if skills.include?(skill.id)    # 登録済み
    return if cp < skill.cp_cost           # CP 不足
    return if KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL && skill.cp_cost == 0

    battle_skill_max.times { |i|
      # 空きがあれば登録
      if skills == nil
        set_battle_skill(i, skill)
        break
      end
    }
    restore_battle_skill
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル解除
  #     index : 位置
  #--------------------------------------------------------------------------
  def remove_battle_skill(index)
    @battle_skills[index] = nil
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル全解除
  #--------------------------------------------------------------------------
  def clear_battle_skill
    @battle_skills = []
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルセット可否判定
  #     index : 位置
  #     skill : スキル
  #--------------------------------------------------------------------------
  def battle_skill_settable?(index, skill)
    return false if battle_skill_max <= index  # 範囲外
    return true  if skill == nil               # nil は解除なので OK

    return false if battle_skill_ids.include?(skill.id)  # セット済み

    curr_skill_id = battle_skill_ids[index]
    curr_skill    = (curr_skill_id != nil ? $data_skills[curr_skill_id] : nil)

    # 同時セット不可
    excluded  = excluded_battle_skill_ids
    excluded -= curr_skill.excluded_skills if curr_skill != nil
    return false if excluded.include?(skill.id)

    offset = (curr_skill != nil ? curr_skill.cp_cost : 0)
    return false if self.cp < (skill.cp_cost - offset)  # CP 不足

    return true
  end
  #--------------------------------------------------------------------------
  # ○ Exclude スキル ID 取得
  #--------------------------------------------------------------------------
  def excluded_battle_skill_ids
    result = []
    battle_skills.each { |skill| result |= skill.excluded_skills }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルを修復
  #--------------------------------------------------------------------------
  def restore_battle_skill
    result = battle_skill_ids.clone
    usable_skills = all_skills

    result.each_with_index { |n, i|
      next if n == nil
      # 未修得の場合は解除
      if (usable_skills.find { |s| s.id == n }) == nil
        result = nil
      end
    }
    @battle_skills = result[0...battle_skill_max]
    # CP 不足のスキルを下から順に外す
    (battle_skill_max - 1).downto(0) { |i|
      @battle_skills = nil if maxcp - consumed_cp < 0
    }
  end
  #--------------------------------------------------------------------------
  # ● 装備の変更 (オブジェクトで指定)
  #     equip_type : 装備部位 (0..4)
  #     item       : 武器 or 防具 (nil なら装備解除)
  #     test       : テストフラグ (戦闘テスト、または装備画面での一時装備)
  #--------------------------------------------------------------------------
  alias change_equip_KGC_SkillCPSystem change_equip
  def change_equip(equip_type, item, test = false)
    change_equip_KGC_SkillCPSystem(equip_type, item, test)

    unless test
      restore_battle_skill
      restore_passive_rev if $imported["PassiveSkill"]
    end
  end
  #--------------------------------------------------------------------------
  # ● 装備の破棄
  #     item : 破棄する武器 or 防具
  #    武器/防具の増減で「装備品も含める」のとき使用する。
  #--------------------------------------------------------------------------
  alias discard_equip_KGC_SkillCPSystem discard_equip
  def discard_equip(item)
    discard_equip_KGC_SkillCPSystem(item)

    restore_battle_skill
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ● 経験値の変更
  #     exp  : 新しい経験値
  #     show : レベルアップ表示フラグ
  #--------------------------------------------------------------------------
  alias change_exp_KGC_SkillCPSystem change_exp
  def change_exp(exp, show)
    # 習得したスキルを表示するため、戦闘中フラグを一時的に解除
    last_in_battle = $game_temp.in_battle
    $game_temp.in_battle = false

    change_exp_KGC_SkillCPSystem(exp, show)

    $game_temp.in_battle = last_in_battle
  end

  if KGC::SkillCPSystem::AUTO_SET_NEW_SKILL
  #--------------------------------------------------------------------------
  # ● スキルを覚える
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias learn_skill_KGC_SkillCPSystem learn_skill
  def learn_skill(skill_id)
    learn_skill_KGC_SkillCPSystem(skill_id)

    add_battle_skill($data_skills[skill_id])
  end
  end  # <- if KGC::SkillCPSystem::AUTO_SET_NEW_SKILL

  #--------------------------------------------------------------------------
  # ● スキルを忘れる
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias forget_skill_KGC_SkillCPSystem forget_skill
  def forget_skill(skill_id)
    # 忘れるスキルを戦闘用スキルから削除
    battle_skill_ids.each_with_index { |s, i|
      remove_battle_skill(i) if s == skill_id
    }

    forget_skill_KGC_SkillCPSystem(skill_id)
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルセット済み判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def battle_skill_set?(skill)
    return false unless skill.is_a?(RPG::Skill)  # スキル以外

    return battle_skill_ids.include?(skill.id)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ○ CP の文字色を取得
  #     actor : アクター
  #--------------------------------------------------------------------------
  def cp_color(actor)
    return knockout_color if actor.maxcp > 0 && actor.cp == 0
    return normal_color
  end
  #--------------------------------------------------------------------------
  # ○ CP ゲージの色 1 の取得
  #--------------------------------------------------------------------------
  def cp_gauge_color1
    color = KGC::SkillCPSystem::GAUGE_START_COLOR
    return (color.is_a?(Integer) ? text_color(color) : color)
  end
  #--------------------------------------------------------------------------
  # ○ CP ゲージの色 2 の取得
  #--------------------------------------------------------------------------
  def cp_gauge_color2
    color = KGC::SkillCPSystem::GAUGE_END_COLOR
    return (color.is_a?(Integer) ? text_color(color) : color)
  end
  #--------------------------------------------------------------------------
  # ○ CP の描画
  #     actor : アクター
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #     width : 幅
  #--------------------------------------------------------------------------
  def draw_actor_cp(actor, x, y, width = 120)
    draw_actor_cp_gauge(actor, x, y, width)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 30, WLH, Vocab::cp_a)
    self.contents.font.color = cp_color(actor)
    xr = x + width
    if width < 120
      self.contents.draw_text(xr - 40, y, 40, WLH, actor.cp, 2)
    else
      self.contents.draw_text(xr - 90, y, 40, WLH, actor.cp, 2)
      self.contents.font.color = normal_color
      self.contents.draw_text(xr - 50, y, 10, WLH, "/", 2)
      self.contents.draw_text(xr - 40, y, 40, WLH, actor.maxcp, 2)
    end
    self.contents.font.color = normal_color
  end
  #--------------------------------------------------------------------------
  # ○ CP ゲージの描画
  #     actor : アクター
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #     width : 幅
  #--------------------------------------------------------------------------
  def draw_actor_cp_gauge(actor, x, y, width = 120)
    if KGC::SkillCPSystem::ENABLE_GENERIC_GAUGE && $imported["GenericGauge"]
      # 汎用ゲージ
      draw_gauge(KGC::SkillCPSystem::GAUGE_IMAGE,
        x, y, width, actor.cp, [actor.maxcp, 1].max,
        KGC::SkillCPSystem::GAUGE_OFFSET,
        KGC::SkillCPSystem::GAUGE_LENGTH,
        KGC::SkillCPSystem::GAUGE_SLOPE)
    else
      # デフォルトゲージ
      gw = width * actor.cp / [actor.maxcp, 1].max
      gc1 = cp_gauge_color1
      gc2 = cp_gauge_color2
      self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color)
      self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2)
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Command
#==============================================================================

class Window_Command < Window_Selectable
  unless method_defined?(:add_command)
  #--------------------------------------------------------------------------
  # ○ コマンドを追加
  #    追加した位置を返す
  #--------------------------------------------------------------------------
  def add_command(command)
    @commands << command
    @item_max = @commands.size
    item_index = @item_max - 1
    refresh_command
    draw_item(item_index)
    return item_index
  end
  #--------------------------------------------------------------------------
  # ○ コマンドをリフレッシュ
  #--------------------------------------------------------------------------
  def refresh_command
    buf = self.contents.clone
    self.height = [self.height, row_max * WLH + 32].max
    create_contents
    self.contents.blt(0, 0, buf, buf.rect)
    buf.dispose
  end
  #--------------------------------------------------------------------------
  # ○ コマンドを挿入
  #--------------------------------------------------------------------------
  def insert_command(index, command)
    @commands.insert(index, command)
    @item_max = @commands.size
    refresh_command
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ コマンドを削除
  #--------------------------------------------------------------------------
  def remove_command(command)
    @commands.delete(command)
    @item_max = @commands.size
    refresh
  end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Status
#==============================================================================

if KGC::SkillCPSystem::SHOW_STATUS_CP
class Window_Status < Window_Base
  #--------------------------------------------------------------------------
  # ● 基本情報の描画
  #     x : 描画先 X 座標
  #     y : 描画先 Y 座標
  #--------------------------------------------------------------------------
  alias draw_basic_info_KGC_SkillCPSystem draw_basic_info
  def draw_basic_info(x, y)
    draw_basic_info_KGC_SkillCPSystem(x, y)

    draw_actor_cp(@actor, x, y + WLH * 4)
  end
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_BattleSkillStatus
#------------------------------------------------------------------------------
#   戦闘スキル設定画面で、設定者のステータスを表示するウィンドウです。
#==============================================================================

class Window_BattleSkillStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x     : ウィンドウの X 座標
  #     y     : ウィンドウの Y 座標
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, actor)
    super(x, y, Graphics.width, WLH + 32)
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_actor_name(@actor, 4, 0)
    draw_actor_level(@actor, 140, 0)
    draw_actor_cp(@actor, 240, 0)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_BattleSkillSlot
#------------------------------------------------------------------------------
#   戦闘スキル選択画面で、設定したスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_BattleSkillSlot < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #     actor  : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor)
    super(x, y, width, height)
    @actor = actor
    self.index = 0
    self.active = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    skill_ids = @actor.battle_skill_ids
    @actor.battle_skill_max.times { |i|
      if skill_ids != nil
        @data << $data_skills[skill_ids]
      else
        @data << nil
      end
    }
    @item_max = @data.size
    create_contents
    @item_max.times { |i| draw_item(i) }
  end
  #--------------------------------------------------------------------------
  # ○ 消費 CP 描画判定
  #--------------------------------------------------------------------------
  def cp_cost_show?(skill)
    return true if KGC::SkillCPSystem::SHOW_ZERO_COST

    return (skill.cp_cost > 0)
  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)
      self.contents.draw_text(rect, skill.cp_cost, 2) if cp_cost_show?(skill)
    else
      self.contents.draw_text(rect, KGC::SkillCPSystem::BLANK_TEXT, 1)
    end
  end
  #--------------------------------------------------------------------------
  # ● カーソルを 1 ページ後ろに移動
  #--------------------------------------------------------------------------
  def cursor_pagedown
    return if Input.repeat?(Input::R)
    super
  end
  #--------------------------------------------------------------------------
  # ● カーソルを 1 ページ前に移動
  #--------------------------------------------------------------------------
  def cursor_pageup
    return if Input.repeat?(Input::L)
    super
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    return unless self.active

    if Input.repeat?(Input::RIGHT)
      Sound.play_cursor
      cursor_pagedown
    elsif Input.repeat?(Input::LEFT)
      Sound.play_cursor
      cursor_pageup
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(skill == nil ? "" : skill.description)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_BattleSkillList
#------------------------------------------------------------------------------
#   戦闘スキル選択画面で、設定できるスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_BattleSkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :slot_index               # スロット番号
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #     actor  : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor)
    super(x, y, width, height)
    @actor = actor
    @slot_index = 0
    self.index = 0
    self.active = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = [nil]
    # 選択可能なスキルのみを取得
    @actor.all_skills.each { |skill|
      @data.push(skill) if selectable?(skill)
    }

    @item_max = @data.size
    create_contents
    @item_max.times { |i| draw_item(i) }
  end
  #--------------------------------------------------------------------------
  # ○ スキル選択可否判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def selectable?(skill)
    return false if skill == nil

    # 消費 CP 0 なら常に使用可能な場合
    if KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL && skill.cp_cost == 0
      return false
    end
    # 戦闘時に使用可能ならOK
    return true if skill.battle_ok?
    # 使用不可でもセット可能な場合
    if KGC::SkillCPSystem::SHOW_UNUSABLE_SKILL && skill.occasion == 3
      return true
    end

    return false
  end
  #--------------------------------------------------------------------------
  # ○ 消費 CP 描画判定
  #--------------------------------------------------------------------------
  def cp_cost_show?(skill)
    return true if KGC::SkillCPSystem::SHOW_ZERO_COST

    return (skill.cp_cost > 0)
  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.battle_skill_settable?(@slot_index, skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, skill.cp_cost, 2) if cp_cost_show?(skill)
    else
      self.contents.draw_text(rect, KGC::SkillCPSystem::RELEASE_TEXT, 1)
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    return unless self.active

    if Input.repeat?(Input::RIGHT)
      cursor_pagedown
    elsif Input.repeat?(Input::LEFT)
      cursor_pageup
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(skill == nil ? "" : skill.description)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Map
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● 画面切り替えの実行
  #--------------------------------------------------------------------------
  alias update_scene_change_KGC_SkillCPSystem update_scene_change
  def update_scene_change
    return if $game_player.moving?    # プレイヤーの移動中?

    if $game_temp.next_scene == :set_battle_skill
      call_set_battle_skill
      return
    end

    update_scene_change_KGC_SkillCPSystem
  end
  #--------------------------------------------------------------------------
  # ○ スキル設定画面への切り替え
  #--------------------------------------------------------------------------
  def call_set_battle_skill
    $game_temp.next_scene = nil
    $scene = Scene_SetBattleSkill.new(
      $game_temp.next_scene_actor_index,
      0,
      Scene_SetBattleSkill::HOST_MAP)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Menu
#==============================================================================

class Scene_Menu < Scene_Base
  if KGC::SkillCPSystem::USE_MENU_SET_SKILL_COMMAND
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_command_window_KGC_SkillCPSystem create_command_window
  def create_command_window
    create_command_window_KGC_SkillCPSystem

    return if $imported["CustomMenuCommand"]

    @__command_set_battle_skill_index =
      @command_window.add_command(Vocab.set_battle_skill)
    if @command_window.oy > 0
      @command_window.oy -= Window_Base::WLH
    end
    @command_window.index = @menu_index
  end
  end
  #--------------------------------------------------------------------------
  # ● コマンド選択の更新
  #--------------------------------------------------------------------------
  alias update_command_selection_KGC_SkillCPSystem update_command_selection
  def update_command_selection
    call_set_battle_skill_flag = false
    if Input.trigger?(Input::C)
      case @command_window.index
      when @__command_set_battle_skill_index  # スキル設定
        call_set_battle_skill_flag = true
      end
    end

    # スキル設定画面に移行
    if call_set_battle_skill_flag
      if $game_party.members.size == 0
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      start_actor_selection
      return
    end

    update_command_selection_KGC_SkillCPSystem
  end
  #--------------------------------------------------------------------------
  # ● アクター選択の更新
  #--------------------------------------------------------------------------
  alias update_actor_selection_KGC_SkillCPSystem update_actor_selection
  def update_actor_selection
    if Input.trigger?(Input::C)
      $game_party.last_actor_index = @status_window.index
      Sound.play_decision
      case @command_window.index
      when @__command_set_battle_skill_index  # スキル設定
        $scene = Scene_SetBattleSkill.new(
          @status_window.index,
          @__command_set_battle_skill_index,
          Scene_SetBattleSkill::HOST_MENU)
        return
      end
    end

    update_actor_selection_KGC_SkillCPSystem
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Scene_SetBattleSkill
#------------------------------------------------------------------------------
#   戦闘スキル設定画面の処理を行うクラスです。
#==============================================================================

class Scene_SetBattleSkill < Scene_Base
  #--------------------------------------------------------------------------
  # ○ 定数
  #--------------------------------------------------------------------------
  HOST_MENU   = 0  # 呼び出し元 : メニュー
  HOST_MAP    = 1  # 呼び出し元 : マップ
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor_index : アクターインデックス
  #     menu_index  : コマンドのカーソル初期位置
  #     host_scene  : 呼び出し元 (0..メニュー  1..マップ)
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, menu_index = 0, host_scene = HOST_MENU)
    @actor_index = actor_index
    @menu_index = menu_index
    @host_scene = host_scene
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background

    @actor = $game_party.members[@actor_index]
    create_windows
  end
  #--------------------------------------------------------------------------
  # ○ ウィンドウ作成
  #--------------------------------------------------------------------------
  def create_windows
    @help_window = Window_Help.new
    if $imported["HelpExtension"]
      @help_window.row_max = KGC::HelpExtension::ROW_MAX
    end

    dy = @help_window.height
    @status_window = Window_BattleSkillStatus.new(0, dy, @actor)

    dy += @status_window.height
    @slot_window = Window_BattleSkillSlot.new(
      0,
      dy,
      Graphics.width / 2,
      Graphics.height - dy,
      @actor)
    @slot_window.active = true
    @slot_window.help_window = @help_window

    @list_window = Window_BattleSkillList.new(
      Graphics.width - @slot_window.width,
      dy,
      Graphics.width - @slot_window.width,
      Graphics.height - dy,
      @actor)
    @list_window.help_window = @help_window
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    @help_window.dispose
    @status_window.dispose
    @slot_window.dispose
    @list_window.dispose
  end
  #--------------------------------------------------------------------------
  # ○ 元の画面へ戻る
  #--------------------------------------------------------------------------
  def return_scene
    case @host_scene
    when HOST_MENU
      $scene = Scene_Menu.new(@menu_index)
    when HOST_MAP
      $scene = Scene_Map.new
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    update_window
    if @slot_window.active
      update_slot
    elsif @list_window.active
      update_list
    end
  end
  #--------------------------------------------------------------------------
  # ○ ウィンドウ更新
  #--------------------------------------------------------------------------
  def update_window
    @help_window.update
    @status_window.update
    @slot_window.update
    @list_window.update
  end
  #--------------------------------------------------------------------------
  # ○ ウィンドウ再描画
  #--------------------------------------------------------------------------
  def refresh_window
    @status_window.refresh
    @slot_window.refresh
    @list_window.refresh
  end
  #--------------------------------------------------------------------------
  # ○ 次のアクターの画面に切り替え
  #--------------------------------------------------------------------------
  def next_actor
    @actor_index += 1
    @actor_index %= $game_party.members.size
    $scene = Scene_SetBattleSkill.new(@actor_index, @menu_index, @host_scene)
  end
  #--------------------------------------------------------------------------
  # ○ 前のアクターの画面に切り替え
  #--------------------------------------------------------------------------
  def prev_actor
    @actor_index += $game_party.members.size - 1
    @actor_index %= $game_party.members.size
    $scene = Scene_SetBattleSkill.new(@actor_index, @menu_index, @host_scene)
  end
  #--------------------------------------------------------------------------
  # ○ フレーム更新 (スロットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_slot
    # 選択項目が変化した場合
    if @last_slot_index != @slot_window.index
      @list_window.slot_index = @slot_window.index
      @list_window.refresh
      @last_slot_index = @slot_window.index
    end

    if Input.trigger?(Input::A)
      Sound.play_decision
      # 選択しているスキルを外す
      @actor.remove_battle_skill(@slot_window.index)
      refresh_window
    elsif Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      # リストウィンドウに切り替え
      @slot_window.active = false
      @list_window.active = true
    elsif Input.trigger?(Input::R)
      Sound.play_cursor
      next_actor
    elsif Input.trigger?(Input::L)
      Sound.play_cursor
      prev_actor
    end
  end
  #--------------------------------------------------------------------------
  # ○ フレーム更新 (リストウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_list
    if Input.trigger?(Input::B)
      Sound.play_cancel
      # スロットウィンドウに切り替え
      @slot_window.active = true
      @list_window.active = false
    elsif Input.trigger?(Input::C)
      skill = @list_window.skill
      # セットできない場合
      unless @actor.battle_skill_settable?(@slot_window.index, skill)
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      set_skill(@slot_window.index, skill)
      # スロットウィンドウに切り替え
      @slot_window.active = true
      @list_window.active = false
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキル設定
  #     index : 設定する場所
  #     skill : 設定するスキル
  #--------------------------------------------------------------------------
  def set_skill(index, skill)
    @actor.remove_battle_skill(index)
    if skill != nil
      @actor.set_battle_skill(index, skill)
    end
    refresh_window
  end
end
[/pre]


梦石
0
星屑
850
在线时间
160 小时
注册时间
2012-6-3
回帖
89
 楼主| 发表于 2014-8-14 15:37:05 | 显示全部楼层
本帖最后由 taroxd 于 2014-8-14 15:55 编辑

[pre lang="ruby" line="1"]#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ スキル習得装備 - KGC_EquipLearnSkill ◆ VX ◆
#_/    ◇ Last update : 2009/09/26 ◇
#_/----------------------------------------------------------------------------
#_/  スキルを習得する装備品を作成します。
#_/============================================================================
#_/ 【スキル】≪スキルCP制≫ より上に導入してください。
#_/ 【メニュー】≪拡張装備画面≫ より上に導入してください。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

$data_system = load_data("Data/System.rvdata") if $data_system == nil

#==============================================================================
# ★ カスタマイズ項目 - Customize ★
#==============================================================================

module KGC
module EquipLearnSkill
  # ◆ AP の名称
  #  ゲーム中の表記のみ変化。
  VOCAB_AP     = "AP"
  # ◆ AP のデフォルト値
  #  所持 AP を指定しなかったエネミーの AP。
  DEFAULT_AP   = 1
  # ◆ 装備しただけでは習得しない
  #  true  : AP が溜まるまで使用不能
  #  false : 装備するだけで使用可能
  NEED_FULL_AP = false

  # ◆ リザルト画面での獲得 AP の表示
  #  %s : 獲得した AP
  VOCAB_RESULT_OBTAIN_AP         = "获得 %s 点#{VOCAB_AP} !"
  # ◆ リザルト画面でスキルをマスターした際のメッセージ
  #  %s : アクター名
  VOCAB_RESULT_MASTER_SKILL      = "%sは"
  # ◆ リザルト画面でマスターしたスキルの表示
  #  %s : マスターしたスキルの名前
  VOCAB_RESULT_MASTER_SKILL_NAME = "学得了%s!"

  # ◆ メニュー画面に「AP ビューア」コマンドを追加する
  #  追加する場所は、メニューコマンドの最下部です。
  #  他の部分に追加したければ、≪カスタムメニューコマンド≫ をご利用ください。
  USE_MENU_AP_VIEWER_COMMAND = true
  # ◆ メニュー画面の「AP ビューア」コマンドの名称
  VOCAB_MENU_AP_VIEWER       = "#{VOCAB_AP} 查看"

  # ◆ マスター(完全習得)したスキルの AP 欄
  VOCAB_MASTER_SKILL      = "- MASTER -"
  # ◆ 蓄積 AP が 0 のスキルも AP ビューアに表示
  SHOW_ZERO_AP_SKILL      = false
  # ◆ 蓄積 AP が 0 のスキルの名前を隠す
  MASK_ZERO_AP_SKILL_NAME = false
  # ◆ 蓄積 AP が 0 のスキルに表示する名前
  #  1文字だけ指定すると、スキル名と同じ長さに拡張されます。
  ZERO_AP_NAME_MASK       = "?"
  # ◆ 蓄積 AP が 0 のスキルのヘルプを隠す
  HIDE_ZERO_AP_SKILL_HELP = true
  # ◆ 蓄積 AP が 0 のスキルに表示するヘルプ
  ZERO_AP_SKILL_HELP      = "????????"

  # ◆ 除外装備品配列
  #  配列の添字がアクター ID に対応。
  #  習得装備から除外する武器・防具の ID を配列に格納。
  EXCLUDE_WEAPONS = []  # 武器
  EXCLUDE_ARMORS  = []  # 防具
  # ここから下に定義。
  #  <例>
  #  アクターID:1 は、武器ID:50 と 70 のスキルを習得できない。
  # EXCLUDE_WEAPONS[1] = [50, 70]

  # ◆ 除外スキル配列
  #  配列の添字がアクター ID と対応。
  #  装備では習得不可能にするスキル ID を配列に格納。
  EXCLUDE_SKILLS = []
  #  <例>
  #  アクターID:1 は、スキルID:30 を装備品で習得することはできない。
  # EXCLUDE_SKILLS[1] = [30]
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["EquipLearnSkill"] = true

module KGC::EquipLearnSkill
  module Regexp
    module BaseItem
      # 習得スキル
      LEARN_SKILL = /<(?:LEARN_SKILL|スキル習得)\s*(\d+(?:\s*,\s*\d+)*)>/i
    end

    module Skill
      # 必要 AP
      NEED_AP = /<(?:NEED_AP|必要AP)\s*(\d+)>/i
    end

    module Enemy
      # 所持 AP
      AP = /<AP\s*(\d+)>/i
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ KGC::Commands
#==============================================================================

module KGC
module Commands
  module_function
  #--------------------------------------------------------------------------
  # ○ AP の獲得
  #     actor_id : アクター ID
  #     ap       : 獲得 AP
  #     show     : マスター表示フラグ
  #--------------------------------------------------------------------------
  def gain_actor_ap(actor_id, ap, show = false)
    $game_actors[actor_id].gain_ap(ap, show)
  end
  #--------------------------------------------------------------------------
  # ○ AP の変更
  #     actor_id : アクター ID
  #     skill_id : スキル ID
  #     ap       : AP
  #--------------------------------------------------------------------------
  def change_actor_ap(actor_id, skill_id, ap)
    skill = $data_skills[skill_id]
    return if skill == nil
    $game_actors[actor_id].change_ap(skill, ap)

    $game_actors[actor_id].restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ AP ビューアの呼び出し
  #     actor_index : アクターインデックス
  #--------------------------------------------------------------------------
  def call_ap_viewer(actor_index = 0)
    return if $game_temp.in_battle
    $game_temp.next_scene = :ap_viewer
    $game_temp.next_scene_actor_index = actor_index
  end
end
end

class Game_Interpreter
  include KGC::Commands
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Vocab
#==============================================================================

module Vocab
  # 戦闘終了メッセージ
  ObtainAP              = KGC::EquipLearnSkill::VOCAB_RESULT_OBTAIN_AP
  ResultFullAPSkill     = KGC::EquipLearnSkill::VOCAB_RESULT_MASTER_SKILL
  ResultFullAPSkillName = KGC::EquipLearnSkill::VOCAB_RESULT_MASTER_SKILL_NAME

  # AP
  def self.ap
    return KGC::EquipLearnSkill::VOCAB_AP
  end

  # マスターしたスキル
  def self.full_ap_skill
    return KGC::EquipLearnSkill::VOCAB_MASTER_SKILL
  end

  # AP ビューア
  def self.ap_viewer
    return KGC::EquipLearnSkill::VOCAB_MENU_AP_VIEWER
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ スキル習得装備のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_equip_learn_skill_cache
    @__learn_skills = []

    self.note.each_line { |line|
      if line =~ KGC::EquipLearnSkill::Regexp::BaseItem::LEARN_SKILL
        # スキル習得
        $1.scan(/\d+/).each { |num|
          skill_id = num.to_i
          # 存在するスキルならリストに加える
          @__learn_skills << skill_id if $data_skills[skill_id] != nil
        }
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 習得するスキル ID の配列
  #--------------------------------------------------------------------------
  def learn_skills
    create_equip_learn_skill_cache if @__learn_skills == nil
    return @__learn_skills
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ○ クラス変数
  #--------------------------------------------------------------------------
  @@__masked_name =
    KGC::EquipLearnSkill::ZERO_AP_NAME_MASK  # マスク名
  @@__expand_masked_name = false             # マスク名拡張表示フラグ

  if @@__expand_masked_name != nil
    @@__expand_masked_name = (@@__masked_name.scan(/./).size == 1)
  end
  #--------------------------------------------------------------------------
  # ○ スキル習得装備のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_equip_learn_skill_cache
    @__need_ap = 0

    self.note.each_line { |line|
      if line =~ KGC::EquipLearnSkill::Regexp::Skill::NEED_AP  # 必要 AP
        @__need_ap = $1.to_i
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ マスク名
  #--------------------------------------------------------------------------
  def masked_name
    if KGC::EquipLearnSkill::MASK_ZERO_AP_SKILL_NAME
      if @@__expand_masked_name
        # マスク名を拡張して表示
        return @@__masked_name * self.name.scan(/./).size
      else
        return @@__masked_name
      end
    else
      return self.name
    end
  end
  #--------------------------------------------------------------------------
  # ○ 習得に必要な AP
  #--------------------------------------------------------------------------
  def need_ap
    create_equip_learn_skill_cache if @__need_ap == nil
    return @__need_ap
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Enemy
#==============================================================================

class RPG::Enemy
  #--------------------------------------------------------------------------
  # ○ スキル習得装備のキャッシュ生成
  #--------------------------------------------------------------------------
  def create_equip_learn_skill_cache
    @__ap = KGC::EquipLearnSkill::DEFAULT_AP

    self.note.each_line { |line|
      if line =~ KGC::EquipLearnSkill::Regexp::Enemy::AP  # 所持 AP
        @__ap = $1.to_i
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 所持 AP
  #--------------------------------------------------------------------------
  def ap
    create_equip_learn_skill_cache if @__ap == nil
    return @__ap
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Temp
#==============================================================================

unless $imported["CustomMenuCommand"]
class Game_Temp
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :next_scene_actor_index   # 次のシーンのアクターインデックス
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_KGC_EquipLearnSkill initialize
  def initialize
    initialize_KGC_EquipLearnSkill

    @next_scene_actor_index = 0
  end
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● セットアップ
  #     actor_id : アクター ID
  #--------------------------------------------------------------------------
  alias setup_KGC_EquipLearnSkill setup
  def setup(actor_id)
    setup_KGC_EquipLearnSkill(actor_id)

    @skill_ap = []
  end
  #--------------------------------------------------------------------------
  # ○ 指定スキルの AP 取得
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  def skill_ap(skill_id)
    @skill_ap = [] if @skill_ap == nil
    return (@skill_ap[skill_id] != nil ? @skill_ap[skill_id] : 0)
  end
  #--------------------------------------------------------------------------
  # ○ AP 変更
  #     skill : スキル
  #     ap    : 新しい AP
  #--------------------------------------------------------------------------
  def change_ap(skill, ap)
    @skill_ap = [] if @skill_ap == nil
    @skill_ap[skill.id] = [[ap, skill.need_ap].min, 0].max
  end
  #--------------------------------------------------------------------------
  # ○ マスターしたスキルの表示
  #     new_skills : 新しくマスターしたスキルの配列
  #--------------------------------------------------------------------------
  def display_full_ap_skills(new_skills)
    $game_message.new_page
    text = sprintf(Vocab::ResultFullAPSkill, name)
    $game_message.texts.push(text)
    new_skills.each { |skill|
      text = sprintf(Vocab::ResultFullAPSkillName, skill.name)
      $game_message.texts.push(text)
    }
  end
  #--------------------------------------------------------------------------
  # ○ AP 獲得
  #     ap   : AP の増加量
  #     show : マスタースキル表示フラグ
  #--------------------------------------------------------------------------
  def gain_ap(ap, show)
    last_full_ap_skills = full_ap_skills

    # 装備品により習得しているスキルに AP を加算
    equipment_skills(true).each { |skill|
      change_ap(skill, skill_ap(skill.id) + ap)
    }
    restore_passive_rev if $imported["PassiveSkill"]

    # マスターしたスキルを表示
    if show && last_full_ap_skills != full_ap_skills
      display_full_ap_skills(full_ap_skills - last_full_ap_skills)
    end
  end
  #--------------------------------------------------------------------------
  # ● スキルオブジェクトの配列取得
  #--------------------------------------------------------------------------
  alias skills_KGC_EquipLearnSkill skills
  def skills
    result = skills_KGC_EquipLearnSkill

    # 装備品と AP 蓄積済みのスキルを追加
    additional_skills = equipment_skills | full_ap_skills
    return (result | additional_skills).sort_by { |s| s.id }
  end
  #--------------------------------------------------------------------------
  # ○ 装備品の習得スキル取得
  #     all : 使用不可能なスキルも含める
  #--------------------------------------------------------------------------
  def equipment_skills(all = false)
    result = []
    equips.compact.each { |item|
      next unless include_learnable_equipment?(item)        # 除外装備は無視

      item.learn_skills.each { |i|
        skill = $data_skills
        next unless include_equipment_skill?(skill)          # 除外スキルは無視
        if !all && KGC::EquipLearnSkill::NEED_FULL_AP        # 要蓄積の場合
          next unless skill.need_ap == 0 || ap_full?(skill)    # 未達成なら無視
        end
        result << skill
      }
    }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ スキル習得装備除外判定
  #     item : 判定装備
  #--------------------------------------------------------------------------
  def include_learnable_equipment?(item)
    return false unless item.is_a?(RPG::Weapon) || item.is_a?(RPG::Armor)
    return false unless equippable?(item)

    case item
    when RPG::Weapon  # 武器
      # 除外武器に含まれている場合
      if KGC::EquipLearnSkill::EXCLUDE_WEAPONS[id] != nil &&
          KGC::EquipLearnSkill::EXCLUDE_WEAPONS[id].include?(item.id)
        return false
      end
    when RPG::Armor   # 防具
      # 除外防具に含まれている場合
      if KGC::EquipLearnSkill::EXCLUDE_ARMORS[id] != nil &&
          KGC::EquipLearnSkill::EXCLUDE_ARMORS[id].include?(item.id)
        return false
      end
    end

    return true
  end
  #--------------------------------------------------------------------------
  # ○ 装備品による習得スキル除外判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def include_equipment_skill?(skill)
    # 自身が除外されている場合
    if KGC::EquipLearnSkill::EXCLUDE_SKILLS[id] != nil &&
        KGC::EquipLearnSkill::EXCLUDE_SKILLS[id].include?(skill.id)
      return false
    end

    return true
  end
  #--------------------------------------------------------------------------
  # ○ AP 蓄積済みのスキルを取得
  #--------------------------------------------------------------------------
  def full_ap_skills
    result = []
    (1...$data_skills.size).each { |i|
      skill = $data_skills
      result << skill if ap_full?(skill) && include_equipment_skill?(skill)
    }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ AP 蓄積可能なスキルを取得
  #--------------------------------------------------------------------------
  def can_gain_ap_skills
    result = []
    equips.compact.each { |item|
      next unless include_learnable_equipment?(item)  # 除外装備なら無視

      item.learn_skills.each { |i|
        skill = $data_skills
        next unless include_equipment_skill?(skill)   # 除外スキルなら無視
        result << skill
      }
    }
    return (result - full_ap_skills)              # マスターしたものを除く
  end
  #--------------------------------------------------------------------------
  # ○ AP 蓄積済み判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def ap_full?(skill)
    return false unless skill.is_a?(RPG::Skill)   # スキル以外
    return false if skill.need_ap == 0            # 必要 AP が 0
    return true  if @skills.include?(skill.id)    # 習得済み

    return (skill_ap(skill.id) >= skill.need_ap)
  end
  #--------------------------------------------------------------------------
  # ● スキルの使用可能判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def skill_can_use?(skill)
    return super
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ○ AP の取得
  #--------------------------------------------------------------------------
  def ap
    return enemy.ap
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Troop
#==============================================================================

class Game_Troop < Game_Unit
  #--------------------------------------------------------------------------
  # ○ AP の合計計算
  #--------------------------------------------------------------------------
  def ap_total
    ap = 0
    for enemy in dead_members
      ap += enemy.ap unless enemy.hidden
    end
    return ap
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Command
#==============================================================================

class Window_Command < Window_Selectable
  unless method_defined?(:add_command)
  #--------------------------------------------------------------------------
  # ○ コマンドを追加
  #    追加した位置を返す
  #--------------------------------------------------------------------------
  def add_command(command)
    @commands << command
    @item_max = @commands.size
    item_index = @item_max - 1
    refresh_command
    draw_item(item_index)
    return item_index
  end
  #--------------------------------------------------------------------------
  # ○ コマンドをリフレッシュ
  #--------------------------------------------------------------------------
  def refresh_command
    buf = self.contents.clone
    self.height = [self.height, row_max * WLH + 32].max
    create_contents
    self.contents.blt(0, 0, buf, buf.rect)
    buf.dispose
  end
  #--------------------------------------------------------------------------
  # ○ コマンドを挿入
  #--------------------------------------------------------------------------
  def insert_command(index, command)
    @commands.insert(index, command)
    @item_max = @commands.size
    refresh_command
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ コマンドを削除
  #--------------------------------------------------------------------------
  def remove_command(command)
    @commands.delete(command)
    @item_max = @commands.size
    refresh
  end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_APViewer
#------------------------------------------------------------------------------
#  AP ビューアでスキルを表示するウィンドウです。
#==============================================================================

class Window_APViewer < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #     actor  : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor)
    super(x, y, width, height)
    @actor = actor
    @can_gain_ap_skills = []
    @equipment_skills   = []
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ○ リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    @can_gain_ap_skills = @actor.can_gain_ap_skills
    @equipment_skills   = @actor.equipment_skills(true)

    (1...$data_skills.size).each { |i|
      skill = $data_skills
      @data << skill if include?(skill)
    }
    @item_max = @data.size
    create_contents
    @item_max.times { |i| draw_item(i) }
  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, enable?(skill))
      if @actor.ap_full?(skill) || @actor.skill_learn?(skill)
        # マスター
        text = Vocab.full_ap_skill
      else
        # AP 蓄積中
        text = sprintf("%s %4d/%4d",
          Vocab.ap, @actor.skill_ap(skill.id), skill.need_ap)
      end
      # AP を描画
      self.contents.font.color = normal_color
      self.contents.draw_text(rect, text, 2)
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキルをリストに含めるか
  #     skill : スキル
  #--------------------------------------------------------------------------
  def include?(skill)
    return false if skill.need_ap == 0
    unless KGC::EquipLearnSkill::SHOW_ZERO_AP_SKILL
      # AP が 0 、かつ装備品で習得していない
      if @actor.skill_ap(skill.id) == 0 && !@equipment_skills.include?(skill)
        return false
      end
    end

    return true
  end
  #--------------------------------------------------------------------------
  # ○ スキルを有効状態で表示するかどうか
  #     skill : スキル
  #--------------------------------------------------------------------------
  def enable?(skill)
    return true if @actor.skill_learn?(skill)           # 習得済み
    return true if @actor.ap_full?(skill)               # マスター
    return true if @can_gain_ap_skills.include?(skill)  # AP 蓄積可能

    return false
  end
  #--------------------------------------------------------------------------
  # ○ スキルをマスク表示するかどうか
  #     skill : スキル
  #--------------------------------------------------------------------------
  def mask?(skill)
    return false if @actor.skill_learn?(skill)           # 習得済み
    return false if @actor.skill_ap(skill.id) > 0        # AP が 1 以上
    return false if @can_gain_ap_skills.include?(skill)  # AP 蓄積可能

    return true
  end
  #--------------------------------------------------------------------------
  # ● アイテム名の描画
  #     item    : アイテム (スキル、武器、防具でも可)
  #     x       : 描画先 X 座標
  #     y       : 描画先 Y 座標
  #     enabled : 有効フラグ。false のとき半透明で描画
  #--------------------------------------------------------------------------
  def draw_item_name(item, x, y, enabled = true)
    draw_icon(item.icon_index, x, y, enabled)
    self.contents.font.color = normal_color
    self.contents.font.color.alpha = enabled ? 255 : 128
    self.contents.draw_text(x + 24, y, 172, WLH,
      mask?(item) ? item.masked_name : item.name)
  end
  #--------------------------------------------------------------------------
  # ● カーソルを 1 ページ後ろに移動
  #--------------------------------------------------------------------------
  def cursor_pagedown
    return if Input.repeat?(Input::R)
    super
  end
  #--------------------------------------------------------------------------
  # ● カーソルを 1 ページ前に移動
  #--------------------------------------------------------------------------
  def cursor_pageup
    return if Input.repeat?(Input::L)
    super
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    last_index = @index
    super
    return unless self.active

    if Input.repeat?(Input::RIGHT)
      cursor_pagedown
    elsif Input.repeat?(Input::LEFT)
      cursor_pageup
    end
    if @index != last_index
      Sound.play_cursor
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    if KGC::EquipLearnSkill::HIDE_ZERO_AP_SKILL_HELP && mask?(skill)
      @help_window.set_text(KGC::EquipLearnSkill::ZERO_AP_SKILL_HELP)
    else
      @help_window.set_text(skill == nil ? "" : skill.description)
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Map
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● 画面切り替えの実行
  #--------------------------------------------------------------------------
  alias update_scene_change_KGC_EquipLearnSkill update_scene_change
  def update_scene_change
    return if $game_player.moving?    # プレイヤーの移動中?

    if $game_temp.next_scene == :ap_viewer
      call_ap_viewer
      return
    end

    update_scene_change_KGC_EquipLearnSkill
  end
  #--------------------------------------------------------------------------
  # ○ AP ビューアへの切り替え
  #--------------------------------------------------------------------------
  def call_ap_viewer
    $game_temp.next_scene = nil
    $scene = Scene_APViewer.new($game_temp.next_scene_actor_index,
      0, Scene_APViewer::HOST_MAP)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Menu
#==============================================================================

class Scene_Menu < Scene_Base
  if KGC::EquipLearnSkill::USE_MENU_AP_VIEWER_COMMAND
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_command_window_KGC_EquipLearnSkill create_command_window
  def create_command_window
    create_command_window_KGC_EquipLearnSkill

    return if $imported["CustomMenuCommand"]

    @__command_ap_viewer_index = @command_window.add_command(Vocab.ap_viewer)
    if @command_window.oy > 0
      @command_window.oy -= Window_Base::WLH
    end
    @command_window.index = @menu_index
  end
  end
  #--------------------------------------------------------------------------
  # ● コマンド選択の更新
  #--------------------------------------------------------------------------
  alias update_command_selection_KGC_EquipLearnSkill update_command_selection
  def update_command_selection
    call_ap_viewer_flag = false
    if Input.trigger?(Input::C)
      case @command_window.index
      when @__command_ap_viewer_index  # AP ビューア
        call_ap_viewer_flag = true
      end
    end

    # AP ビューアに移行
    if call_ap_viewer_flag
      if $game_party.members.size == 0
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      start_actor_selection
      return
    end

    update_command_selection_KGC_EquipLearnSkill
  end
  #--------------------------------------------------------------------------
  # ● アクター選択の更新
  #--------------------------------------------------------------------------
  alias update_actor_selection_KGC_EquipLearnSkill update_actor_selection
  def update_actor_selection
    if Input.trigger?(Input::C)
      $game_party.last_actor_index = @status_window.index
      Sound.play_decision
      case @command_window.index
      when @__command_ap_viewer_index  # AP ビューア
        $scene = Scene_APViewer.new(@status_window.index,
          @__command_ap_viewer_index, Scene_APViewer::HOST_MENU)
        return
      end
    end

    update_actor_selection_KGC_EquipLearnSkill
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Scene_APViewer
#------------------------------------------------------------------------------
#   AP ビューアの処理を行うクラスです。
#==============================================================================

class Scene_APViewer < Scene_Base
  HOST_MENU   = 0
  HOST_MAP    = 1
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     actor_index : アクターインデックス
  #     menu_index  : コマンドのカーソル初期位置
  #     host_scene  : 呼び出し元 (0..メニュー  1..マップ)
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, menu_index = 0, host_scene = HOST_MENU)
    @actor_index = actor_index
    @menu_index = menu_index
    @host_scene = host_scene
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @actor = $game_party.members[@actor_index]
    @help_window = Window_Help.new
    if $imported["HelpExtension"]
      @help_window.row_max = KGC::HelpExtension::ROW_MAX
    end
    @status_window = Window_SkillStatus.new(0, @help_window.height, @actor)
    dy = @help_window.height + @status_window.height
    @skill_window = Window_APViewer.new(0, dy,
      Graphics.width, Graphics.height - dy, @actor)
    @skill_window.help_window = @help_window
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    @help_window.dispose
    @status_window.dispose
    @skill_window.dispose
  end
  #--------------------------------------------------------------------------
  # ○ 元の画面へ戻る
  #--------------------------------------------------------------------------
  def return_scene
    case @host_scene
    when HOST_MENU
      $scene = Scene_Menu.new(@menu_index)
    when HOST_MAP
      $scene = Scene_Map.new
    end
  end
  #--------------------------------------------------------------------------
  # ○ 次のアクターの画面に切り替え
  #--------------------------------------------------------------------------
  def next_actor
    @actor_index += 1
    @actor_index %= $game_party.members.size
    $scene = Scene_APViewer.new(@actor_index, @menu_index, @host_scene)
  end
  #--------------------------------------------------------------------------
  # ○ 前のアクターの画面に切り替え
  #--------------------------------------------------------------------------
  def prev_actor
    @actor_index += $game_party.members.size - 1
    @actor_index %= $game_party.members.size
    $scene = Scene_APViewer.new(@actor_index, @menu_index, @host_scene)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    update_menu_background
    @help_window.update
    @skill_window.update
    @status_window.update
    if @skill_window.active
      update_skill_selection
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキル選択の更新
  #--------------------------------------------------------------------------
  def update_skill_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::R)
      Sound.play_cursor
      next_actor
    elsif Input.trigger?(Input::L)
      Sound.play_cursor
      prev_actor
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● メッセージ表示が終わるまでウェイト
  #--------------------------------------------------------------------------
  alias wait_for_message_KGC_EquipLearnSkill wait_for_message
  def wait_for_message
    return if @ignore_wait_for_message  # メッセージ終了までのウェイトを無視

    wait_for_message_KGC_EquipLearnSkill
  end
  #--------------------------------------------------------------------------
  # ● 獲得した経験値とお金の表示
  #--------------------------------------------------------------------------
  alias display_exp_and_gold_KGC_EquipLearnSkill display_exp_and_gold
  def display_exp_and_gold
    @ignore_wait_for_message = true

    display_exp_and_gold_KGC_EquipLearnSkill

    display_ap
    @ignore_wait_for_message = false
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ● レベルアップの表示
  #--------------------------------------------------------------------------
  alias display_level_up_KGC_EquipLearnSkill display_level_up
  def display_level_up
    display_level_up_KGC_EquipLearnSkill

    display_master_equipment_skill
  end
  #--------------------------------------------------------------------------
  # ○ 獲得 AP の表示
  #--------------------------------------------------------------------------
  def display_ap
    ap = $game_troop.ap_total
    if ap > 0
      text = sprintf(Vocab::ObtainAP, ap)
      $game_message.texts.push('\.' + text)
    end
    wait_for_message
  end
  #--------------------------------------------------------------------------
  # ○ マスターしたスキルの表示
  #--------------------------------------------------------------------------
  def display_master_equipment_skill
    ap = $game_troop.ap_total
    $game_party.existing_members.each { |actor|
      last_skills = actor.skills
      actor.gain_ap(ap, true)
    }
    wait_for_message
  end
end
[/pre]
回复

使用道具 举报

梦石
0
星屑
850
在线时间
160 小时
注册时间
2012-6-3
回帖
89
 楼主| 发表于 2014-8-14 15:40:41 | 显示全部楼层
白玉楼的台阶 发表于 2014-8-14 15:37
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ スキル習得 ...

对了,这里是和上面的脚本一起的,技能通过消耗AP值获取……其实这个功能有没有无所谓,不过好像原脚本要搭配这个使用………………我想实现的功能只要有【一类可装备的特殊技能,每个消耗的CP不同,总CP和总共能装备的技能是有限的】即可
如果能在游戏进程中增减技能栏位和CP就更完美了

点评

用脚本框&&善用编辑  发表于 2014-8-14 15:55
回复

使用道具 举报

梦石
0
星屑
250
在线时间
233 小时
注册时间
2013-8-2
回帖
544
发表于 2014-8-14 16:14:46 | 显示全部楼层
首先,图片失效,,,
其次,请简单说明这是什么脚本有什么用
然后,
如果能在游戏进程中增减技能栏位和CP就更完美了

zhe ge ke yi zhao zhe ge ren ---------@VIPArcher  

点评

矮油,找你给他写那个什么增减技能栏什么的  发表于 2014-8-14 16:45
找我做甚?1000+行的脚本。。。我不会做移植啦。  发表于 2014-8-14 16:24
我忘了,我要怎么遗忘。
回复

使用道具 举报

梦石
0
星屑
850
在线时间
160 小时
注册时间
2012-6-3
回帖
89
 楼主| 发表于 2014-8-14 16:52:18 | 显示全部楼层
千夙 发表于 2014-8-14 16:14
首先,图片失效,,,
其次,请简单说明这是什么脚本有什么用
然后,

嗯……这个脚本本身的功能很多,不过我想要的只有:
1.在菜单中增加一个类似【编辑能力】的选项
2.通过【编辑能力】的选项,可以装备若干个技能,这些技能装备的限制条件是“每个技能装备时需要占用一定的cost,总cost不能超过某个数字;能装备的总技能数量也不能超过某个数字”
3.如果可以的话,希望可以在游戏流程中增减能装备的技能总数和cost总数
回复

使用道具 举报

梦石
0
星屑
250
在线时间
233 小时
注册时间
2013-8-2
回帖
544
发表于 2014-8-14 17:00:59 | 显示全部楼层
白玉楼的台阶 发表于 2014-8-14 16:52
嗯……这个脚本本身的功能很多,不过我想要的只有:
1.在菜单中增加一个类似【编辑能力】的选项
2.通过【 ...

是不是让技能有一个空间.然后你有一个总空间.装备技能的空间不能超过总空间.只要在总空间的范围内就可以装备多个技能而且玩家还可以自己编辑已有的技能把它放到总空间里面....?
我忘了,我要怎么遗忘。
回复

使用道具 举报

梦石
0
星屑
850
在线时间
160 小时
注册时间
2012-6-3
回帖
89
 楼主| 发表于 2014-8-14 17:18:16 | 显示全部楼层
千夙 发表于 2014-8-14 17:00
是不是让技能有一个空间.然后你有一个总空间.装备技能的空间不能超过总空间.只要在总空间的范围内就可以 ...

嗯,可以
不过我是希望用这个脚本实现类似于可选择的【特性】【能力】【插件】【符文】【称号】……的效果,
比方说,主角获得了【新兵】【坚毅】【勇猛】【不屈】等等几个特性技能,我用其他脚本让这些技能拥有“习得即可增加能力值”(这个脚本已经搞定了),但是玩家不能同时使用这些特性,只能选择一部分装备上
所以装备在这个空间里面的技能和通常的技能最好区分开来



咱曾经想过几个用事件达成这个目的的方法……但是灰常麻烦,因为那些技能都是“习得即增长能力”,所以不装备的技能不能处于习得状态,必须在开辟一些事件/开关/变量来记录那些技能是可以选择的,然后用一大堆的选择支套选择支,对玩家太不友善了……
或者用第二货币加商店购买,打开商店的时候自动卖出所有特性技能转化为cost……但是商店不能直接卖技能只能卖道具,这样玩家调整装备都要重新使用买到的道具来学习……
回复

使用道具 举报

梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2014-8-14 17:30:04 | 显示全部楼层
本帖最后由 tseyik 于 2014-8-14 17:38 编辑

Ace改版
http://mitsu-evo.6.ql.bz/RGSS3_16.html

[pre lang="ruby" line="1"]#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/    ◆ スキルCP制 - KGC_SkillCPSystem ◆ VX Ace ◆
#_/    ◇ Last update : 2009/09/13 ◇
#_/----------------------------------------------------------------------------
#_/  戦闘中に使用可能なスキルを限定する機能を追加します。
#_/============================================================================
#_/ 【装備】≪スキル習得装備≫ より下に導入してください。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
#    ☆VXAce RGSS3 「スキルCP制」☆
#      EnDlEss DREamER
#     URL:http://mitsu-evo.6.ql.bz/
#     製作者 mitsu-evo
#     Last:2014/5/8
#   KGC様のスキルCP制RGSS3移植版
#     ▼ 素材よりも下に。
#==============================================================================
=begin
5/8:ステータス画面のCPゲージ位置を修正。
メニューコマンドからの挙動を修正。



=end
#==============================================================================
# ★ カスタマイズ項目 - Customize ★
#==============================================================================

module KGC
module SkillCPSystem
  # ◆ 登録スキル最大数
  MAX_SKILLS = 9
  # ◆ CP の名称
  VOCAB_CP   = "CP"
  # ◆ CP の名称 (略)
  VOCAB_CP_A = "C"
  # ◆ ステータス画面に CP を表示する
  SHOW_STATUS_CP = true

  # ◆ 消費 CP 既定値
  #  消費 CP 未指定のスキルで使用。
  DEFAULT_CP_COST = 1
  # ◆ CP 上限
  #  (固有 CP などを除いた) 素の状態での CP 上限。
  CP_MAX = 15
  # ◆ CP 下限
  CP_MIN = 1
  # ◆ 補正後の CP 上限
  #  固有 CP や装備品による変動を含めた上限。
  REVISED_CP_MAX = 20
  # ◆ 補正後の CP 下限
  REVISED_CP_MIN = 0
  # ◆ 最大 CP 算出式
  #   level..現在のレベル
  #  自動的に整数変換するので、結果が小数になってもOK。
  CP_CALC_EXP = "level * 0.6 + 1.0"
  # ◆ アクター毎の最大 CP 算出式
  PERSONAL_CP_CALC_EXP = []
  #  ここから下に、アクターごとの最大 CP を
  #   PERSONAL_CP_CALC_EXP[アクター ID] = "計算式"
  #  という書式で指定。
  #  計算式は CP_CALC_EXP と同様の書式。
  #  指定しなかったアクターは CP_CALC_EXP を使用。
  #   <例> ラルフだけ優遇
  # PERSONAL_CP_CALC_EXP[1] = "level * 0.8 + 2.0"

  # ◆ 戦闘テスト時は無効化
  #  true  : 戦闘テスト時は全スキルを使用可能。
  #  false : 戦闘テスト時は (セットしない限り) 使用不可。
  DISABLE_IN_BATTLETEST  = true
  # ◆ 使用不可スキルもセット可能
  SHOW_UNUSABLE_SKILL    = true
  # ◆ 消費 CP 0 のスキルはセットしなくても使用可能
  USABLE_COST_ZERO_SKILL = true
  # ◆ パッシブスキルはセットしないと効果なし
  #  ≪パッシブスキル≫ 導入時のみ有効。
  PASSIVE_NEED_TO_SET    = true
  # ◆ 新規習得スキルを自動的にセット
  #  true  : 習得したスキルを空きスロットにセット。
  #           ※ ≪スキル習得装備≫ で習得したスキルは無効。
  #  false : 習得しただけではセットされない (手動でセット)。
  AUTO_SET_NEW_SKILL     = true
  # ◆ 消費 CP 0 の場合も消費 CP を表示する
  #  true  : 消費 CP 0 でも表示
  #  false : 消費 CP 1 以上の場合のみ表示
  SHOW_ZERO_COST         = false

  # ◆ CP ゲージの色
  #  数値  : \C[n] と同じ色。
  #  Color : 指定した色。 ( Color.new(255, 128, 128) など )
  GAUGE_START_COLOR = 13  # 開始色
  GAUGE_END_COLOR   =  5  # 終了色

  # ◆ CP ゲージに汎用ゲージを使用する
  #  ≪汎用ゲージ描画≫ 導入時のみ有効。
  ENABLE_GENERIC_GAUGE = true
  # ◆ CP ゲージ設定
  #  画像は "Graphics/System" から読み込む。
  GAUGE_IMAGE  = "GaugeCP"  # 画像
  GAUGE_OFFSET = [-23, -2]  # 位置補正 [x, y]
  GAUGE_LENGTH = -4         # 長さ補正
  GAUGE_SLOPE  = 30         # 傾き (-89 ~ 89)

  # ◆ メニュー画面に「スキル設定」コマンドを追加する
  #  追加する場所は、メニューコマンドの最下部です。
  #  他の部分に追加したければ、≪カスタムメニューコマンド≫ をご利用ください。
  USE_MENU_SET_SKILL_COMMAND = true
  # ◆ メニュー画面の「スキル設定」コマンドの名称
  VOCAB_MENU_SET_SKILL       = "スキル設定"

  # ◆ 未設定項目の表示文字列
  BLANK_TEXT   = "-  EMPTY  -"
  # ◆ 設定解除の表示文字列
  RELEASE_TEXT = "( 設定解除 )"
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

$imported = {} if $imported == nil
$imported["SkillCPSystem"] = true

module KGC::SkillCPSystem
  module Regexp
    module BaseItem
      # 最大 CP
      MAXCP_PLUS = /<(?:MAX|最大)CP\s*([\-\+]?\d+)>/
      # 登録スキル数
      BATTLE_SKILL_MAX = /<(?:BATTLE_SKILL_MAX|登録スキル数)\s*([\-\+]?\d+)>/i
    end

    module Skill
      # 消費 CP
      CP_COST = /<CP\s*(\d+)>/i
      # 同時セット不可
      EXCLUDE = /<(?:EXCLUDE|同時セット不可)\s*(\d+(?:\s*,\s*\d+)*)>/
    end
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ KGC::Commands
#==============================================================================

module KGC
module Commands
  module_function
  #--------------------------------------------------------------------------
  # ○ MaxCP 補正値の取得
  #     actor_id    : アクター ID
  #     variable_id : 取得した値を代入する変数の ID
  #--------------------------------------------------------------------------
  def get_actor_own_cp(actor_id, variable_id = 0)
    value = $game_actors[actor_id].maxcp_plus
    $game_variables[variable_id] = value if variable_id > 0
    return value
  end
  alias get_own_cp get_actor_own_cp
  #--------------------------------------------------------------------------
  # ○ MaxCP 補正値の変更
  #     actor_id : アクター ID
  #     value    : MaxCP 補正値
  #--------------------------------------------------------------------------
  def set_actor_own_cp(actor_id, value)
    $game_actors[actor_id].maxcp_plus = value
  end
  alias set_own_cp set_actor_own_cp
  #--------------------------------------------------------------------------
  # ○ アクターの MaxCP 補正値の増加
  #     actor_id : アクター ID
  #     value    : 増加量
  #--------------------------------------------------------------------------
  def gain_actor_cp(actor_id, value)
    $game_actors[actor_id].maxcp_plus += value
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数の取得
  #     actor_id : アクター ID
  #     variable_id : 取得した値を代入する変数の ID
  #--------------------------------------------------------------------------
  def get_battle_skill_max(actor_id, variable_id = 0)
    value = $game_actors[actor_id].battle_skill_max
    $game_variables[variable_id] = value if variable_id > 0
    return value
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数の変更
  #     actor_id : アクター ID
  #     value    : 登録可能数
  #--------------------------------------------------------------------------
  def set_battle_skill_max(actor_id, value = -1)
    $game_actors[actor_id].battle_skill_max = value
  end
  #--------------------------------------------------------------------------
  # ○ スキルが登録されているか
  #     actor_id : アクター ID
  #     skill_id : 確認するスキル ID
  #--------------------------------------------------------------------------
  def battle_skill_set?(actor_id, skill_id)
    return $game_actors[actor_id].battle_skill_ids.include?(skill_id)
  end
  #--------------------------------------------------------------------------
  # ○ スキルの登録
  #     actor_id : アクター ID
  #     index    : 登録箇所
  #     skill_id : 登録するスキル ID (nil で解除)
  #--------------------------------------------------------------------------
  def set_battle_skill(actor_id, index, skill_id = nil)
    actor = $game_actors[actor_id]
    if skill_id.is_a?(Integer)
      # 登録
      skill = $data_skills[skill_id]
      return unless actor.battle_skill_settable?(index, skill)  # セット不可

      actor.set_battle_skill(index, skill)
      actor.restore_battle_skill
    else
      # 解除
      actor.remove_battle_skill(index)
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキルの追加登録
  #     actor_id : アクター ID
  #     skill_id : 登録するスキル ID
  #--------------------------------------------------------------------------
  def add_battle_skill(actor_id, skill_id)
    actor = $game_actors[actor_id]
    skill = $data_skills[skill_id]
    return if actor == nil || skill == nil

    actor.add_battle_skill(skill)
  end
  #--------------------------------------------------------------------------
  # ○ スキルの全解除
  #     actor_id : アクター ID
  #--------------------------------------------------------------------------
  def clear_battle_skill(actor_id)
    $game_actors[actor_id].clear_battle_skill
  end
  #--------------------------------------------------------------------------
  # ○ スキル設定画面の呼び出し
  #     actor_index : アクターインデックス
  #--------------------------------------------------------------------------
  def call_set_battle_skill(actor_index = 0)
    #return if $game_party.in_battle
    #$game_temp.next_scene = :set_battle_skill
    #$game_temp.next_scene_actor_index = actor_index
    SceneManager.call(Scene_SetBattleSkill)
    Fiber.yield
  end
end
end

class Game_Interpreter
  include KGC::Commands
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Vocab
#==============================================================================

module Vocab
  # CP
  def self.cp
    return KGC::SkillCPSystem::VOCAB_CP
  end

  # CP (略)
  def self.cp_a
    return KGC::SkillCPSystem::VOCAB_CP_A
  end

  # スキル設定
  def self.set_battle_skill
    return KGC::SkillCPSystem::VOCAB_MENU_SET_SKILL
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ スキルCP制のキャッシュを生成
  #--------------------------------------------------------------------------
  def create_skill_cp_system_cache
    @__maxcp_plus = 0
    @__battle_skill_max_plus = 0

    self.note.each_line { |line|
      case line
      when KGC::SkillCPSystem::Regexp::BaseItem::MAXCP_PLUS
        # 最大 CP
        @__maxcp_plus += $1.to_i
      when KGC::SkillCPSystem::Regexp::BaseItem::BATTLE_SKILL_MAX
        # 登録スキル数
        @__battle_skill_max_plus += $1.to_i
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 最大 CP 補正
  #--------------------------------------------------------------------------
  def maxcp_plus
    create_skill_cp_system_cache if @__maxcp_plus == nil
    return @__maxcp_plus
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル数補正
  #--------------------------------------------------------------------------
  def battle_skill_max_plus
    create_skill_cp_system_cache if @__battle_skill_max_plus == nil
    return @__battle_skill_max_plus
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ RPG::Skill
#==============================================================================

class RPG::Skill < RPG::UsableItem
  #--------------------------------------------------------------------------
  # ○ スキルCP制のキャッシュを生成
  #--------------------------------------------------------------------------
  def create_skill_cp_system_cache
    @__cp_cost = KGC::SkillCPSystem::DEFAULT_CP_COST
    # 攻撃・防御設定スキルならコスト0
    @__cp_cost = 0 if @id == 1 or @id == 2
    @__excluded_skills = []

    self.note.each_line { |line|
      case line
      when KGC::SkillCPSystem::Regexp::Skill::CP_COST
        # 消費 CP
        @__cp_cost = $1.to_i
      when KGC::SkillCPSystem::Regexp::Skill::EXCLUDE
        # 同時セット不可
        $1.scan(/\d+/).each { |num| @__excluded_skills << num.to_i }
        @__excluded_skills.uniq!
      end
    }
  end
  #--------------------------------------------------------------------------
  # ○ 消費 CP
  #--------------------------------------------------------------------------
  def cp_cost
    create_skill_cp_system_cache if @__cp_cost == nil
    return @__cp_cost
  end
  #--------------------------------------------------------------------------
  # ○ 同時セット不可
  #--------------------------------------------------------------------------
  def excluded_skills
    create_skill_cp_system_cache if @__excluded_skills == nil
    return @__excluded_skills
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Battler
#==============================================================================

class Game_Battler
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルセット済み判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def battle_skill_set?(skill)
    return true
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_writer   :maxcp_plus               # MaxCP 補正値
  #--------------------------------------------------------------------------
  # ○ MaxCP 取得
  #--------------------------------------------------------------------------
  def maxcp
    calc_exp = KGC::SkillCPSystem::PERSONAL_CP_CALC_EXP[self.id]
    if calc_exp == nil
      calc_exp = KGC::SkillCPSystem::CP_CALC_EXP
    end
    n = Integer(eval(calc_exp))
    n = [[n, cp_limit].min, KGC::SkillCPSystem::CP_MIN].max
    n += maxcp_plus + maxcp_plus_equip
    return [[n, revised_cp_limit].min, KGC::SkillCPSystem::REVISED_CP_MIN].max
  end
  #--------------------------------------------------------------------------
  # ○ CP 取得
  #--------------------------------------------------------------------------
  def cp
    return [maxcp - consumed_cp, 0].max
  end
  #--------------------------------------------------------------------------
  # ○ CP 消費量取得
  #--------------------------------------------------------------------------
  def consumed_cp
    n = 0
    battle_skills.compact.each { |skill| n += skill.cp_cost }
    return n
  end
  #--------------------------------------------------------------------------
  # ○ CP 上限取得
  #--------------------------------------------------------------------------
  def cp_limit
    return KGC::SkillCPSystem::CP_MAX
  end
  #--------------------------------------------------------------------------
  # ○ 補正後の CP 上限取得
  #--------------------------------------------------------------------------
  def revised_cp_limit
    return KGC::SkillCPSystem::REVISED_CP_MAX
  end
  #--------------------------------------------------------------------------
  # ○ MaxCP 補正値取得
  #--------------------------------------------------------------------------
  def maxcp_plus
    if @maxcp_plus == nil
      if @own_cp != nil
        @maxcp_plus = @own_cp
        @own_cp = nil
      else
        @maxcp_plus = 0
      end
    end
    return @maxcp_plus
  end
  #--------------------------------------------------------------------------
  # ○ 装備品による MaxCP 補正値取得
  #--------------------------------------------------------------------------
  def maxcp_plus_equip
    n = 0
    equips.compact.each { |item| n += item.maxcp_plus }
    return n
  end
  #--------------------------------------------------------------------------
  # ● スキル取得
  #--------------------------------------------------------------------------
  alias skills_KGC_SkillCPSystem skills
  def skills
    return (skill_cp_restrict? ? restricted_skills : skills_KGC_SkillCPSystem)
  end
  #--------------------------------------------------------------------------
  # ● スキルの習得済み判定
  #--------------------------------------------------------------------------
  def skill_learn?(skill)
    skill.is_a?(RPG::Skill) && @skills.include?(skill.id)
  end
  #--------------------------------------------------------------------------
  # ○ スキルを制限するか
  #--------------------------------------------------------------------------
  def skill_cp_restrict?
    if $game_party.in_battle
      # 戦闘テストでないか、戦闘テストでも制限する場合
      return true unless $BTEST && KGC::SkillCPSystem::DISABLE_IN_BATTLETEST
    end

    return false
  end
  #--------------------------------------------------------------------------
  # ○ スキルを制限
  #--------------------------------------------------------------------------
  def restricted_skills
    result = all_skills
    result.each_with_index { |skill, i|
      # 消費 CP > 0 のスキルを除外
      if !KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL || skill.cp_cost > 0
        result = nil
      end
      # パッシブスキルを除外
      if $imported["PassiveSkill"] && KGC::SkillCPSystem::PASSIVE_NEED_TO_SET
        if skill.passive &&
            (!KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL || skill.cp_cost > 0)
          result = nil
        end
      end
    }
    result.compact!
    # 戦闘スキルを追加
    result |= battle_skills
    result.sort! { |a, b| a.id <=> b.id }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ 全スキル取得
  #--------------------------------------------------------------------------
  def all_skills
    # 一時的に非戦闘中にする
    #last_in_battle = $game_party.in_battle
    #$game_party.on_battle_end

    result = skills_KGC_SkillCPSystem
    if $imported["EquipLearnSkill"]
      result |= (equipment_skills | full_ap_skills)
      result.sort! { |a, b| a.id <=> b.id }
    end

    # 戦闘中フラグを戻す
    #$game_party.on_battle_start#in_battle = last_in_battle

    return result
  end

  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数取得
  #--------------------------------------------------------------------------
  def battle_skill_max
    @battle_skill_max = -1 if @battle_skill_max == nil
    n = (@battle_skill_max < 0 ?
      KGC::SkillCPSystem::MAX_SKILLS : @battle_skill_max)
    n += equipment_battle_skill_max_plus
    return [n, 0].max
  end
  #--------------------------------------------------------------------------
  # ○ 装備品による登録スキル数補正
  #--------------------------------------------------------------------------
  def equipment_battle_skill_max_plus
    n = 0
    equips.compact.each { |item| n += item.battle_skill_max_plus }
    return n
  end
  #--------------------------------------------------------------------------
  # ○ 登録スキル最大数設定
  #--------------------------------------------------------------------------
  def battle_skill_max=(value)
    @battle_skill_max = value
    if @battle_skills == nil
      @battle_skills = []
    else
      @battle_skills = @battle_skills[0...value]
    end
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル ID 取得
  #--------------------------------------------------------------------------
  def battle_skill_ids
    @battle_skills = [] if @battle_skills == nil
    return @battle_skills
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル取得
  #--------------------------------------------------------------------------
  def battle_skills
    result = []
    battle_skill_ids.each { |i|
      next if i == nil           # 無効なスキルは無視
      result << $data_skills
    }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル登録
  #     index : 位置
  #     skill : スキル (nil で解除)
  #--------------------------------------------------------------------------
  def set_battle_skill(index, skill)
    if skill == nil
      @battle_skills[index] = nil
    else
      return unless skill.is_a?(RPG::Skill)  # スキル以外
      return if cp < skill.cp_cost           # CP 不足
      if KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL && skill.cp_cost == 0
        return
      end

      @battle_skills[index] = skill.id
    end
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル追加登録
  #     skill : スキル
  #--------------------------------------------------------------------------
  def add_battle_skill(skill)
    return unless skill.is_a?(RPG::Skill)  # スキル以外
    skills = battle_skill_ids
    return if skills.include?(skill.id)    # 登録済み
    return if cp < skill.cp_cost           # CP 不足
    return if KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL && skill.cp_cost == 0

    battle_skill_max.times { |i|
      # 空きがあれば登録
      if skills == nil
        set_battle_skill(i, skill)
        break
      end
    }
    restore_battle_skill
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル解除
  #     index : 位置
  #--------------------------------------------------------------------------
  def remove_battle_skill(index)
    @battle_skills[index] = nil
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキル全解除
  #--------------------------------------------------------------------------
  def clear_battle_skill
    @battle_skills = []
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルセット可否判定
  #     index : 位置
  #     skill : スキル
  #--------------------------------------------------------------------------
  def battle_skill_settable?(index, skill)
    return false if battle_skill_max <= index  # 範囲外
    return true  if skill == nil               # nil は解除なので OK

    return false if battle_skill_ids.include?(skill.id)  # セット済み

    curr_skill_id = battle_skill_ids[index]
    curr_skill    = (curr_skill_id != nil ? $data_skills[curr_skill_id] : nil)

    # 同時セット不可
    excluded  = excluded_battle_skill_ids
    excluded -= curr_skill.excluded_skills if curr_skill != nil
    return false if excluded.include?(skill.id)

    offset = (curr_skill != nil ? curr_skill.cp_cost : 0)
    return false if self.cp < (skill.cp_cost - offset)  # CP 不足

    return true
  end
  #--------------------------------------------------------------------------
  # ○ Exclude スキル ID 取得
  #--------------------------------------------------------------------------
  def excluded_battle_skill_ids
    result = []
    battle_skills.each { |skill| result |= skill.excluded_skills }
    return result
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルを修復
  #--------------------------------------------------------------------------
  def restore_battle_skill
    return
=begin
    result = battle_skill_ids.clone
    usable_skills = all_skills

    result.each_with_index { |n, i|
      next if n == nil
      # 未修得の場合は解除
      if (usable_skills.find { |s| s.id == n }) == nil
        result = nil
      end
    }
    @battle_skills = result[0...battle_skill_max]
    # CP 不足のスキルを下から順に外す
    (battle_skill_max - 1).downto(0) { |i|
      @battle_skills = nil if maxcp - consumed_cp < 0
    }
=end
  end
  #--------------------------------------------------------------------------
  # ● 装備の破棄
  #     item : 破棄する武器 or 防具
  #    武器/防具の増減で「装備品も含める」のとき使用する。
  #--------------------------------------------------------------------------
  alias discard_equip_KGC_SkillCPSystem discard_equip
  def discard_equip(item)
    discard_equip_KGC_SkillCPSystem(item)

    restore_battle_skill
    restore_passive_rev if $imported["PassiveSkill"]
  end
  #--------------------------------------------------------------------------
  # ● 経験値の変更
  #     exp  : 新しい経験値
  #     show : レベルアップ表示フラグ
  #--------------------------------------------------------------------------
  alias change_exp_KGC_SkillCPSystem change_exp
  def change_exp(exp, show)
    # 習得したスキルを表示するため、戦闘中フラグを一時的に解除
    #last_in_battle = $game_party.in_battle
    #$game_party.on_battle_end#in_battle = false

    change_exp_KGC_SkillCPSystem(exp, show)

    #$game_party.on_battle_start#in_battle = last_in_battle
  end
  if KGC::SkillCPSystem::AUTO_SET_NEW_SKILL
  #--------------------------------------------------------------------------
  # ● スキルを覚える
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias learn_skill_KGC_SkillCPSystem learn_skill
  def learn_skill(skill_id)
    unless skill_learn?($data_skills[skill_id])
      learn_skill_KGC_SkillCPSystem(skill_id)
      add_battle_skill($data_skills[skill_id])
    end
  end
  end  # <- if KGC::SkillCPSystem::AUTO_SET_NEW_SKILL
  #--------------------------------------------------------------------------
  # ● スキルを忘れる
  #     skill_id : スキル ID
  #--------------------------------------------------------------------------
  alias forget_skill_KGC_SkillCPSystem forget_skill
  def forget_skill(skill_id)
    # 忘れるスキルを戦闘用スキルから削除
    battle_skill_ids.each_with_index { |s, i|
      remove_battle_skill(i) if s == skill_id
    }

    forget_skill_KGC_SkillCPSystem(skill_id)
  end
  #--------------------------------------------------------------------------
  # ○ 戦闘用スキルセット済み判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def battle_skill_set?(skill)
    return false unless skill.is_a?(RPG::Skill)  # スキル以外

    return battle_skill_ids.include?(skill.id)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ○ CP の文字色を取得
  #     actor : アクター
  #--------------------------------------------------------------------------
  def cp_color(actor)
    return knockout_color if actor.maxcp > 0 && actor.cp == 0
    return normal_color
  end
  #--------------------------------------------------------------------------
  # ○ CP ゲージの色 1 の取得
  #--------------------------------------------------------------------------
  def cp_gauge_color1
    color = KGC::SkillCPSystem::GAUGE_START_COLOR
    return (color.is_a?(Integer) ? text_color(color) : color)
  end
  #--------------------------------------------------------------------------
  # ○ CP ゲージの色 2 の取得
  #--------------------------------------------------------------------------
  def cp_gauge_color2
    color = KGC::SkillCPSystem::GAUGE_END_COLOR
    return (color.is_a?(Integer) ? text_color(color) : color)
  end
  #--------------------------------------------------------------------------
  # ○ CP の描画
  #     actor : アクター
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #     width : 幅
  #--------------------------------------------------------------------------
  def draw_actor_cp(actor, x, y, width = 120)
    draw_actor_cp_gauge(actor, x, y, width)
    self.contents.font.color = system_color
    self.contents.draw_text(x, y, 30, line_height, Vocab::cp_a)
    self.contents.font.color = cp_color(actor)
    xr = x + width
    if width < 120
      self.contents.draw_text(xr - 40, y, 40, line_height, actor.cp, 2)
    else
      self.contents.draw_text(xr - 90, y, 40, line_height, actor.cp, 2)
      self.contents.font.color = normal_color
      self.contents.draw_text(xr - 50, y, 10, line_height, "/", 2)
      self.contents.draw_text(xr - 40, y, 40, line_height, actor.maxcp, 2)
    end
    self.contents.font.color = normal_color
  end
  #--------------------------------------------------------------------------
  # ○ CP ゲージの描画
  #     actor : アクター
  #     x     : 描画先 X 座標
  #     y     : 描画先 Y 座標
  #     width : 幅
  #--------------------------------------------------------------------------
  def draw_actor_cp_gauge(actor, x, y, width = 120)
    if KGC::SkillCPSystem::ENABLE_GENERIC_GAUGE && $imported["GenericGauge"]
      # 汎用ゲージ
      draw_gauge(KGC::SkillCPSystem::GAUGE_IMAGE,
        x, y, width, actor.cp, [actor.maxcp, 1].max,
        KGC::SkillCPSystem::GAUGE_OFFSET,
        KGC::SkillCPSystem::GAUGE_LENGTH,
        KGC::SkillCPSystem::GAUGE_SLOPE)
    else
      # デフォルトゲージ
      gw = width * actor.cp / [actor.maxcp, 1].max
      gc1 = cp_gauge_color1
      gc2 = cp_gauge_color2
      self.contents.fill_rect(x, y + line_height - 8, width, 6, gauge_back_color)
      self.contents.gradient_fill_rect(x, y + line_height - 8, gw, 6, gc1, gc2)
    end
  end
end


#==============================================================================
# ■ Window_MenuCommand
#------------------------------------------------------------------------------
#  メニュー画面で表示するコマンドウィンドウです。
#==============================================================================

class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 独自コマンドの追加用
  #--------------------------------------------------------------------------
  alias add_original_commands_KGC_SkillCPSystem add_original_commands
  def add_original_commands
    add_original_commands_KGC_SkillCPSystem
    add_command(Vocab.set_battle_skill, :battle_skill, battle_skill_enabled)
  end
  #--------------------------------------------------------------------------
  # ● スキル設定の有効状態を取得
  #--------------------------------------------------------------------------
  def battle_skill_enabled
    KGC::SkillCPSystem::USE_MENU_SET_SKILL_COMMAND  
  end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Window_Status
#==============================================================================

if KGC::SkillCPSystem::SHOW_STATUS_CP
class Window_Status < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 基本情報の描画
  #     x : 描画先 X 座標
  #     y : 描画先 Y 座標
  #--------------------------------------------------------------------------
  alias draw_basic_info_KGC_SkillCPSystem draw_basic_info
  def draw_basic_info(x, y)
    draw_basic_info_KGC_SkillCPSystem(x, y)

    draw_actor_cp(@actor, x, y + line_height * 1)
  end
end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_BattleSkillStatus
#------------------------------------------------------------------------------
#   戦闘スキル設定画面で、設定者のステータスを表示するウィンドウです。
#==============================================================================

class Window_BattleSkillStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x     : ウィンドウの X 座標
  #     y     : ウィンドウの Y 座標
  #     actor : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, actor)
    super(x, y, Graphics.width, line_height + 32)
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    draw_actor_name(@actor, 4, 0)
    draw_actor_level(@actor, 140, 0)
    draw_actor_cp(@actor, 240, 0)
  end
  #--------------------------------------------------------------------------
  # ● アクターの設定
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_BattleSkillSlot
#------------------------------------------------------------------------------
#   戦闘スキル選択画面で、設定したスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_BattleSkillSlot < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #     actor  : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor)
    super(x, y, width, height)
    @actor = actor
    self.index = 0
    self.active = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    skill_ids = @actor.battle_skill_ids
    @actor.battle_skill_max.times { |i|
      if skill_ids != nil
        @data << $data_skills[skill_ids]
      else
        @data << nil
      end
    }
    @item_max = @data.size
    create_contents
    @item_max.times { |i| draw_item(i) }
  end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 項目数の取得
  #--------------------------------------------------------------------------
  def item_max
    @data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # ● 前回の選択位置を復帰
  #--------------------------------------------------------------------------
  def select_last
    select(@data.index(@actor.last_skill.object) || 0)
  end
  #--------------------------------------------------------------------------
  # ● アクターの設定
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 決定やキャンセルなどのハンドリング処理
  #--------------------------------------------------------------------------
  alias process_handling_KGC_SkillCPSystem process_handling
  def process_handling
    process_handling_KGC_SkillCPSystem
    return unless open? && active
    return call_handler(:remove_slot) if handle?(:remove_slot) && Input.trigger?(:A)
  end
  #--------------------------------------------------------------------------
  # ● 決定処理の有効状態を取得
  #--------------------------------------------------------------------------
  def ok_enabled?
    handle?(:ok)
  end
  #--------------------------------------------------------------------------
  # ● キャンセル処理の有効状態を取得
  #--------------------------------------------------------------------------
  def cancel_enabled?
    handle?(:cancel)
  end
  #--------------------------------------------------------------------------
  # ○ 消費 CP 描画判定
  #--------------------------------------------------------------------------
  def cp_cost_show?(skill)
    return true if KGC::SkillCPSystem::SHOW_ZERO_COST

    return (skill.cp_cost > 0)
  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)
      self.contents.draw_text(rect, skill.cp_cost, 2) if cp_cost_show?(skill)
    else
      self.contents.draw_text(rect, KGC::SkillCPSystem::BLANK_TEXT, 1)
    end
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_item(skill)
    #@help_window.set_text(skill == nil ? "" : skill.description)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Window_BattleSkillList
#------------------------------------------------------------------------------
#   戦闘スキル選択画面で、設定できるスキルの一覧を表示するウィンドウです。
#==============================================================================

class Window_BattleSkillList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :slot_index               # スロット番号
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x      : ウィンドウの X 座標
  #     y      : ウィンドウの Y 座標
  #     width  : ウィンドウの幅
  #     height : ウィンドウの高さ
  #     actor  : アクター
  #--------------------------------------------------------------------------
  def initialize(x, y, width, height, actor)
    super(x, y, width, height)
    @actor = actor
    @slot_index = 0
    self.index = 0
    self.active = false
    refresh
  end
  #--------------------------------------------------------------------------
  # ○ スキルの取得
  #--------------------------------------------------------------------------
  def skill
    return @data[self.index]
  end
  #--------------------------------------------------------------------------
  # ● アクターの設定
  #--------------------------------------------------------------------------
  def actor=(actor)
    return if @actor == actor
    @actor = actor
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 前回の選択位置を復帰
  #--------------------------------------------------------------------------
  def select_last
    select(@data.index(@actor.last_skill.object) || 0)
  end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 項目数の取得
  #--------------------------------------------------------------------------
  def item_max
    @data ? @data.size : 1
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    @data = []
    # 選択可能なスキルのみを取得
    @actor.all_skills.each { |skill|
      @data.push(skill) if selectable?(skill)
    }
    @item_max = @data.size
    create_contents
    @item_max.times { |i| draw_item(i) }
  end
  #--------------------------------------------------------------------------
  # ○ スキル選択可否判定
  #     skill : スキル
  #--------------------------------------------------------------------------
  def selectable?(skill)
    return false if skill == nil

    # 消費 CP 0 なら常に使用可能な場合
    if KGC::SkillCPSystem::USABLE_COST_ZERO_SKILL && skill.cp_cost == 0
      return false
    end
    # 戦闘時に使用可能ならOK
    return true if skill.battle_ok?
    # 使用不可でもセット可能な場合
    if KGC::SkillCPSystem::SHOW_UNUSABLE_SKILL && skill.occasion == 3
      return true
    end

    return false
  end
  #--------------------------------------------------------------------------
  # ○ 消費 CP 描画判定
  #--------------------------------------------------------------------------
  def cp_cost_show?(skill)
    return true if KGC::SkillCPSystem::SHOW_ZERO_COST

    return (skill.cp_cost > 0)
  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.battle_skill_settable?(@slot_index, skill)
      draw_item_name(skill, rect.x, rect.y, enabled)
      self.contents.draw_text(rect, skill.cp_cost, 2) if cp_cost_show?(skill)
    else
      self.contents.draw_text(rect, KGC::SkillCPSystem::RELEASE_TEXT, 1)
    end
  end

  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_item(skill)
    #@help_window.set_text(skill == nil ? "" : skill.description)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# ■ Scene_Menu
#==============================================================================

class Scene_Menu < Scene_MenuBase
  
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_command_window_KGC_SkillCPSystem create_command_window
  def create_command_window
    create_command_window_KGC_SkillCPSystem
    if KGC::SkillCPSystem::USE_MENU_SET_SKILL_COMMAND  
      @command_window.set_handler(:battle_skill,    method(:command_personal))
    end
  end
  #--------------------------------------------------------------------------
  # ● 個人コマンド[決定]
  #--------------------------------------------------------------------------
  alias on_personal_ok_KGC_SkillCPSystem on_personal_ok
  def on_personal_ok
    on_personal_ok_KGC_SkillCPSystem
    case @command_window.current_symbol
    when :battle_skill
      SceneManager.call(Scene_SetBattleSkill)
    end
  end
  #--------------------------------------------------------------------------
  # ● コマンド[スキル設定]
  #--------------------------------------------------------------------------
  def command_set_battle_skill
    SceneManager.call(Scene_SetBattleSkill)
  end
end

#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

#==============================================================================
# □ Scene_SetBattleSkill
#------------------------------------------------------------------------------
#   戦闘スキル設定画面の処理を行うクラスです。
#==============================================================================

class Scene_SetBattleSkill < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ○ 定数
  #--------------------------------------------------------------------------
  HOST_MENU   = 0  # 呼び出し元 : メニュー
  HOST_MAP    = 1  # 呼び出し元 : マップ
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_background
    create_help_window
    create_status_window
    create_slot_window
    create_list_window
  end
  #--------------------------------------------------------------------------
  # ● ヘルプウィンドウの作成
  #--------------------------------------------------------------------------
  def create_help_window
    @help_window = Window_Help.new
    @help_window.viewport = @viewport
  end
  #--------------------------------------------------------------------------
  # ● ステータスウィンドウの作成
  #--------------------------------------------------------------------------
  def create_status_window
    dy = @help_window.height
    @status_window = Window_BattleSkillStatus.new(0, dy, @actor)
  end
  #--------------------------------------------------------------------------
  # ● スロットウィンドウの作成
  #--------------------------------------------------------------------------
  def create_slot_window
    dy = @help_window.height + @status_window.height
    @slot_window = Window_BattleSkillSlot.new(
      0,
      dy,
      Graphics.width / 2,
      Graphics.height - dy,
      @actor)
    @slot_window.activate
    @slot_window.help_window = @help_window
    @slot_window.set_handler(:ok,    method(:on_slot_skill))
    @slot_window.set_handler(:remove_slot,    method(:remove_skill))
    @slot_window.set_handler(:cancel,   method(:return_scene))
    @slot_window.set_handler(:pagedown, method(:next_actor))
    @slot_window.set_handler(:pageup,   method(:prev_actor))
    @slot_window.select_last
  end
  #--------------------------------------------------------------------------
  # ● アクターの切り替え
  #--------------------------------------------------------------------------
  def on_actor_change
    @status_window.actor = @actor
    @slot_window.actor = @actor
    @list_window.actor = @actor
    @slot_window.activate
    refresh_window
  end
  #--------------------------------------------------------------------------
  # ● スキルの選択
  #--------------------------------------------------------------------------
  def on_slot_skill
    Sound.play_ok
    # リストウィンドウに切り替え
    @slot_window.deactivate
    @list_window.activate
  end
  #--------------------------------------------------------------------------
  # ● スキルを外す
  #--------------------------------------------------------------------------
  def remove_skill
    # 選択しているスキルを外す
    Sound.play_ok
    @actor.remove_battle_skill(@slot_window.index)
    refresh_window
  end
  #--------------------------------------------------------------------------
  # ● リストウィンドウの作成
  #--------------------------------------------------------------------------
  def create_list_window
    dy = @help_window.height + @status_window.height
    @list_window = Window_BattleSkillList.new(
      Graphics.width - @slot_window.width,
      dy,
      Graphics.width - @slot_window.width,
      Graphics.height - dy,
      @actor)
    @list_window.help_window = @help_window
    @list_window.set_handler(:ok,    method(:on_set_list_skill))
    @list_window.set_handler(:cancel,   method(:cancel_list_window))
    @list_window.select_last
  end
  #--------------------------------------------------------------------------
  # ● スキルリストからの選択
  #--------------------------------------------------------------------------
  def on_set_list_skill
    skill = @list_window.skill
    # セットできない場合
    unless @actor.battle_skill_settable?(@slot_window.index, skill)
      Sound.play_buzzer
      @slot_window.activate
      @list_window.deactivate
      return
    end
    Sound.play_ok
    set_skill(@slot_window.index, skill)
    # スロットウィンドウに切り替え
    @slot_window.activate
    @list_window.deactivate
  end
  #--------------------------------------------------------------------------
  # ● スキルリストから戻る
  #--------------------------------------------------------------------------
  def cancel_list_window
    Sound.play_cancel
    # スロットウィンドウに切り替え
    @slot_window.activate
    @list_window.deactivate
  end

  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_background
    @help_window.dispose
    @status_window.dispose
    @slot_window.dispose
    @list_window.dispose
  end
  #--------------------------------------------------------------------------
  # ○ ウィンドウ再描画
  #--------------------------------------------------------------------------
  def refresh_window
    @status_window.refresh
    @slot_window.refresh
    @list_window.refresh
  end

  #--------------------------------------------------------------------------
  # ○ スキル設定
  #     index : 設定する場所
  #     skill : 設定するスキル
  #--------------------------------------------------------------------------
  def set_skill(index, skill)
    @actor.remove_battle_skill(index)
    if skill != nil
      @actor.set_battle_skill(index, skill)
    end
    refresh_window
  end

end

[/pre]

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 楼主@你

查看全部评分

回复

使用道具 举报

梦石
0
星屑
250
在线时间
233 小时
注册时间
2013-8-2
回帖
544
发表于 2014-8-14 17:33:21 | 显示全部楼层
但是玩家不能同时使用这些特性,只能选择一部分装备上
所以装备在这个空间里面的技能和通常的技能最好区分开来

这个可以设置两种技能类型貌似可以做到
咱曾经想过几个用事件达成这个目的的方法……但是灰常麻烦,因为那些技能都是“习得即增长能力”

你考虑过称号脚本吗?或者你说搞定了的那个脚本就是称号脚本。。
或者用第二货币加商店购买,打开商店的时候自动卖出所有特性技能转化为cost……但是商店不能直接卖技能只能卖道具,这样玩家调整装备都要重新使用买到的道具来学习……

↑↑我越来越听不懂lz说的什么了。。。。
图片已挂,,,你可以用“附件”来上传图片,,,,,,,
我忘了,我要怎么遗忘。
回复

使用道具 举报

梦石
0
星屑
850
在线时间
160 小时
注册时间
2012-6-3
回帖
89
 楼主| 发表于 2014-8-14 18:54:55 | 显示全部楼层
tseyik 发表于 2014-8-14 17:30
Ace改版
http://mitsu-evo.6.ql.bz/RGSS3_16.html

不好意思,能不能把使用说明也发上来,就是备注栏写什么东西的那段话……

点评

設定在行30至行90左右  发表于 2014-8-14 19:50
备注栏不用写东西,全写在脚本上。见脚本注释(如果你看得懂的话)  发表于 2014-8-14 19:00
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部