#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ スキルCP制 - KGC_SkillCPSystem ◆ VX Ace ◆
#_/ ◇ Last update : 2009/09/13 ◇
#_/----------------------------------------------------------------------------
#_/ 戦闘中に使用可能なスキルを限定する機能を追加します。
#_/============================================================================
#_/ 【装備】≪スキル習得装備≫ より下に導入してください。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ☆VXAce RGSS3 「スキルCP制」☆
# EnDlEss DREamER
# URL:[url]http://mitsu-evo.6.ql.bz/[/url]
# 製作者 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[i] = 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[i] = 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[i]
}
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[i] == 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[i] = nil
end
}
@battle_skills = result[0...battle_skill_max]
# CP 不足のスキルを下から順に外す
(battle_skill_max - 1).downto(0) { |i|
@battle_skills[i] = 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[i] != nil
@data << $data_skills[skill_ids[i]]
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