#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ スキル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[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_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[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 不足 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[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 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 #-------------------------------------------------------------------------- # ● 装備の変更 (オブジェクトで指定) # 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[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 #-------------------------------------------------------------------------- # ○ 消費 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
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ スキル習得装備 - 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[i] 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[i] 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[i] 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[i] @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
白玉楼的台阶 发表于 2014-8-14 15:37
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆ スキル習得 ...
如果能在游戏进程中增减技能栏位和CP就更完美了
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ #_/ ◆ スキル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
但是玩家不能同时使用这些特性,只能选择一部分装备上
所以装备在这个空间里面的技能和通常的技能最好区分开来
咱曾经想过几个用事件达成这个目的的方法……但是灰常麻烦,因为那些技能都是“习得即增长能力”
或者用第二货币加商店购买,打开商店的时候自动卖出所有特性技能转化为cost……但是商店不能直接卖技能只能卖道具,这样玩家调整装备都要重新使用买到的道具来学习……
#------------------------------------------------------------------------------ # 常に効果が発動するスキル #============================================================================== # # ■パッシブスキル Ver 1.01 2013/2/18 # # 使い方:( ここに追加 )以下、main以上のところにコピーする。 # # 1.適当なクラスの特徴リストにスキルの発動効果を設定する。(例:最大HP*150%) # 2.パッシブスキルとなるスキルの属性を設定する。(初期は16番目。変更可) # 3.そのスキルの速度の数値を先ほどのクラスのIDに設定する。 # # これで所持しているだけで効果が発動するパッシブスキルが作れます。 # 詳しい解説はブログに掲載しています。 # #・バグの報告や質問、要望がありましたらこちらへお願いします。 # # Gossum magazine [url]http://gossum.blog.fc2.com/[/url] # #============================================================================== # この数値の属性IDがパッシブスキルとなります。 GOSS_PASSIVE_ID = 16 # 戦闘中のウィンドウでもパッシブスキルを表示するならtrue GOSS_PASSIVE_FLAG = false class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 全ての特徴オブジェクトの配列取得 #-------------------------------------------------------------------------- alias goss_feature_objects feature_objects def feature_objects all = goss_feature_objects return all if @avoid_nest == true @avoid_nest = true for skill in skills if skill.damage.element_id == GOSS_PASSIVE_ID all += [$data_classes[skill.speed]] end end @avoid_nest = false return all end end #============================================================================== # ■ Window_BattleSkill #------------------------------------------------------------------------------ # バトル画面で、使用するスキルを選択するウィンドウです。 #============================================================================== class Window_BattleSkill < Window_SkillList #-------------------------------------------------------------------------- # ● スキルをリストに含めるかどうか #-------------------------------------------------------------------------- def include?(item) if item.damage.element_id == GOSS_PASSIVE_ID GOSS_PASSIVE_FLAG else super(item) end end end
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |