#============================================================================== # スキル習得装備 ver1.03 #------------------------------------------------------------------------------ #[特徴] # 戦闘でAPを取得して、装備品ごとに設定したスキルを習得する。 # #[装備設定方法] # 装備品のメモ欄に <スキル習得:スキルID,アクターのID> # 複数習得させたい場合は、複数行にわけて記述してください。 # 例) <スキル習得:100,1> # ID1のアクターはID100のスキルを習得可能 # <スキル習得:101,1,2,3> # ID1,2,3のアクターはID101のスキルを習得可能 # <スキル習得:102> # 全アクターはID102のスキルを習得可能 # #[スキル設定方法] # スキルのメモ欄に <必要AP:数値> または <必要AP:数値,アクターID> # 例) <必要AP:100> # 習得にAPが100必要 # <必要AP:50,1> # ID1のアクターの場合、APは50必要(こっちの設定が優先される) # #[エネミー設定方法] # エネミーのメモ欄に # 例) # APを3獲得できる # #[本スクリプトは] # Kamesoft様の『スキル習得装備』を参考にしています。 # URL :http://ytomy.sakura.ne.jp/ # 著作者:TOMY様 # # 作成:ぶちょー # ホム:http://nyannyannyan.bake-neko.net/ # 著作:リードミーとかに私の名前の載せたりするのは任意で。 #============================================================================== #============================================================================== # バージョンアップ情報 # ver1.03 条件分岐でエラーが出るのを修正 # ver1.02 条件分岐のスキル習得済み判定にマスターしたスキルが反映されないのを修正 # ver1.01 戦闘不能中のAP取得判定の設定を追加 # ver1.00 公開 #============================================================================== #============================================================================== # 設定項目 #============================================================================== module Kazari module SkillLearnEquip # APの名称 VOCAB_AP = "AP" # エネミーのAPデフォルト値 # メモ帳で設定しなかった場合、この数値になります。 DEFAULT_AP = 1 # スキル使用判定 # true : APが溜まるまで使用不可能 # false : 装備した時点で使用可能 NEED_FULL_AP = false # リザルト画面での取得APの表示 VOCAB_GAIN_AP = "AP を %d 獲得!" # リザルト画面でのスキルをマスターした際のメッセージ VOCAB_MASTER_SKILL1 = "%sは" VOCAB_MASTER_SKILL2 = "%sをマスターした!" # 戦闘不能中のAP取得判定 # true : 戦闘不能でもAPを取得できる # false : 戦闘不能ではAPを取得できない GAIN_AP_DEAD = true # メニュー画面のコマンド名 VOCAB_COMMAND_NAME = "APビューア" # 蓄積 AP の描画方法 VOCAB_STORE_AP = "AP %4d/%4d" # マスターしたスキルの AP 欄 VOCAB_MASTER_SKILL = "- MASTER -" # 蓄積 AP が 0 のスキルも AP ビューアに表示 SHOW_ZERO_AP_SKILL = true # 蓄積 AP が 0 のスキルの名前を隠す MASK_ZERO_AP_SKILL_NAME = true # 蓄積 AP が 0 のスキルに表示する名前 # 1文字だけ指定すると、スキル名と同じ長さに拡張されます。 ZERO_AP_NAME_MASK = "?" # 蓄積 AP が 0 のスキルのヘルプを隠す HIDE_ZERO_AP_SKILL_HELP = true # 蓄積 AP が 0 のスキルに表示するヘルプ ZERO_AP_SKILL_HELP = "????????" # スキルを習得できない装備 EXCLUDE_WEAPONS = [] # 武器 EXCLUDE_ARMORS = [] # 防具 # EXCLUDE_WEAPONS[1] = [50, 70] # EXCLUDE_ARMORS[1] = [51..60] # ID1のアクターは、武器ID50と70からはスキルを習得できない。 # 防具ID51〜60からはスキルを習得できない。 # 習得できないスキル EXCLUDE_SKILLS = [] #EXCLUDE_SKILLS[1] = [100, 110..120] # ID1のアクターは、スキルID100,110〜120を装備品で習得できない。 end end #============================================================================== # ここまで #============================================================================== $kzr_imported = {} if $kzr_imported == nil $kzr_imported["SkillLearnEquip"] = true module Kazari::SkillLearnEquip module_function def convert_integer_array(array) result = [] array.each_with_index {|list, i| next if list == nil result[i] = [] list.each {|j| case j when Range ; result[i] |= j.to_a when Integer ; result[i] |= [j] end } } result end EXCLUDE_SKILLS_LIST = convert_integer_array(EXCLUDE_SKILLS) EXCLUDE_WEAPONS_LIST = convert_integer_array(EXCLUDE_WEAPONS) EXCLUDE_ARMORS_LIST = convert_integer_array(EXCLUDE_ARMORS) end #============================================================================== # ■ Window_SkillLearnEquip #============================================================================== class Window_SkillLearnEquip < Window_SkillList include Kazari::SkillLearnEquip #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max ; return 1 ; end #-------------------------------------------------------------------------- # ● スキルをリストに含めるかどうか #-------------------------------------------------------------------------- def include?(item) return false if item == nil return false if item.need_ap(@actor.id) == 0 return false if item.stype_id != @stype_id if EXCLUDE_SKILLS_LIST[@actor.id] != nil return false if EXCLUDE_SKILLS_LIST[@actor.id].include?(item.id) end unless SHOW_ZERO_AP_SKILL if @actor.skill_ap(item.id) == 0 && !@equipment_skills.include?(item) return false end end return true end #-------------------------------------------------------------------------- # ● スキルを許可状態で表示するかどうか #-------------------------------------------------------------------------- def enable?(item) return true if @actor.skill_learn?(item) return true if @actor.ap_full?(item) return true if @can_gain_ap_skills.include?(item) return false end #-------------------------------------------------------------------------- # ● スキルをマスク表示するかどうか #-------------------------------------------------------------------------- def mask?(item) return false if @actor.skill_learn?(item) return false if @actor.skill_ap(item.id) > 0 return false if @can_gain_ap_skills.include?(item) return true end #-------------------------------------------------------------------------- # ● スキルリストの作成 #-------------------------------------------------------------------------- def make_item_list @data = [] @can_gain_ap_skills = @actor.can_gain_ap_skills @equipment_skills = @actor.equipment_skills(true) $data_skills.each {|skill| @data << skill if include?(skill) } end #-------------------------------------------------------------------------- # ● アイテム名の描画 #-------------------------------------------------------------------------- def draw_item_name(item, x, y, enabled = true) return unless item draw_icon(item.icon_index, x, y, enabled) change_color(normal_color, enabled) draw_text(x + 24, y, 172, line_height, mask?(item) ? item.masked_name : item.name) end #-------------------------------------------------------------------------- # ● AP蓄積量の描画 #-------------------------------------------------------------------------- def draw_skill_cost(rect, skill) if skill != nil if @actor.ap_full?(skill) || @actor.skill_learn?(skill) text = VOCAB_MASTER_SKILL else text = sprintf(VOCAB_STORE_AP, @actor.skill_ap(skill.id), skill.need_ap(@actor.id)) end change_color(normal_color) draw_text(rect, text, 2) end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help if Kazari::SkillLearnEquip::HIDE_ZERO_AP_SKILL_HELP && item && mask?(item) @help_window.set_text(ZERO_AP_SKILL_HELP) else @help_window.set_text(item == nil ? "" : item.description) end end end #============================================================================== # ■ Scene_SkillApView #============================================================================== class Scene_SkillApView < Scene_Skill include Kazari::SkillLearnEquip #-------------------------------------------------------------------------- # ● アイテムウィンドウの作成 #-------------------------------------------------------------------------- def create_item_window wx = 0 wy = @status_window.y + @status_window.height ww = Graphics.width wh = Graphics.height - wy @item_window = Window_SkillLearnEquip.new(wx, wy, ww, wh) @item_window.actor = @actor @item_window.viewport = @viewport @item_window.help_window = @help_window @item_window.set_handler(:cancel, method(:on_item_cancel)) @command_window.skill_window = @item_window end end #============================================================================== # ■ Scene_Menu #============================================================================== class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_create_command_window create_command_window def create_command_window kzr_skill_learn_equip_create_command_window @command_window.set_handler(:kzr_skill_learn_equip, method(:command_personal)) end #-------------------------------------------------------------------------- # ● 個人コマンド[決定] #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_on_personal_ok on_personal_ok def on_personal_ok case @command_window.current_symbol when :kzr_skill_learn_equip SceneManager.call(Scene_SkillApView) else kzr_skill_learn_equip_on_personal_ok end end end #============================================================================== # ■ Window_MenuCommand #============================================================================== class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # ● 独自コマンドの追加用 #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_add_original_commands add_original_commands def add_original_commands kzr_skill_learn_equip_add_original_commands add_command(Kazari::SkillLearnEquip::VOCAB_COMMAND_NAME, :kzr_skill_learn_equip, main_commands_enabled) end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_setup setup def setup(actor_id) kzr_skill_learn_equip_setup(actor_id) @skill_ap = [] end #-------------------------------------------------------------------------- # ● 指定スキルの AP 取得 #-------------------------------------------------------------------------- def skill_ap(skill_id) @skill_ap = [] if @skill_ap == nil (@skill_ap[skill_id] != nil ? @skill_ap[skill_id] : 0) end #-------------------------------------------------------------------------- # ● AP 変更 #-------------------------------------------------------------------------- def change_ap(skill, ap) @skill_ap = [] if @skill_ap == nil @skill_ap[skill.id] = [[ap, skill.need_ap(id)].min, 0].max end #-------------------------------------------------------------------------- # ● マスターしたスキルの表示 #-------------------------------------------------------------------------- def display_full_ap_skills(new_skills) $game_message.new_page text = sprintf(Kazari::SkillLearnEquip::VOCAB_MASTER_SKILL1, name) $game_message.texts.push(text) new_skills.each {|skill| text = sprintf(Kazari::SkillLearnEquip::VOCAB_MASTER_SKILL2, skill.name) $game_message.texts.push(text) } end #-------------------------------------------------------------------------- # ● AP 獲得 #-------------------------------------------------------------------------- def gain_ap(ap) last_full_ap_skills = full_ap_skills equipment_skills(true).each {|skill| change_ap(skill, skill_ap(skill.id) + ap) } if last_full_ap_skills != full_ap_skills display_full_ap_skills(full_ap_skills - last_full_ap_skills) end end #-------------------------------------------------------------------------- # ● スキルオブジェクトの配列取得 #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_skills skills def skills result = kzr_skill_learn_equip_skills additional_skills = equipment_skills | full_ap_skills (result | additional_skills).sort_by {|s| s.id } end #-------------------------------------------------------------------------- # ● 装備品の習得スキル取得 #-------------------------------------------------------------------------- def equipment_skills(all = false) result = [] equips.compact.each { |item| next unless include_learnable_equipment?(item) item.learn_skills(id).each { |i| skill = $data_skills[i] next unless include_equipment_skill?(skill) if !all && Kazari::SkillLearnEquip::NEED_FULL_AP next unless skill.need_ap(id) == 0 || ap_full?(skill) end result << skill } } return result end #-------------------------------------------------------------------------- # ● スキル習得装備除外判定 #-------------------------------------------------------------------------- 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 Kazari::SkillLearnEquip::EXCLUDE_WEAPONS_LIST[id] != nil && Kazari::SkillLearnEquip::EXCLUDE_WEAPONS_LIST[id].include?(item.id) return false end when RPG::Armor if Kazari::SkillLearnEquip::EXCLUDE_ARMORS[id] != nil && Kazari::SkillLearnEquip::EXCLUDE_ARMORS[id].include?(item.id) return false end end return true end #-------------------------------------------------------------------------- # ● 装備品による習得スキル除外判定 #-------------------------------------------------------------------------- def include_equipment_skill?(skill) if Kazari::SkillLearnEquip::EXCLUDE_SKILLS[id] != nil && Kazari::SkillLearnEquip::EXCLUDE_SKILLS[id].include?(skill.id) return false end return true end #-------------------------------------------------------------------------- # ● AP 蓄積済みのスキルを取得 #-------------------------------------------------------------------------- def full_ap_skills result = [] $data_skills.each {|skill| result << skill if ap_full?(skill) && include_equipment_skill?(skill) } result end #-------------------------------------------------------------------------- # ● AP 蓄積可能なスキルを取得 #-------------------------------------------------------------------------- def can_gain_ap_skills result = [] equips.compact.each {|item| next unless include_learnable_equipment?(item) item.learn_skills(id).each {|i| skill = $data_skills[i] next unless include_equipment_skill?(skill) result << skill } } (result - full_ap_skills) end #-------------------------------------------------------------------------- # ● AP 蓄積済み判定 #-------------------------------------------------------------------------- def ap_full?(skill) return false unless skill.is_a?(RPG::Skill) return false if skill.need_ap(id) == 0 return true if @skills.include?(skill.id) (skill_ap(skill.id) >= skill.need_ap(id)) end end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● APの取得 #-------------------------------------------------------------------------- def ap enemy.ap end end #============================================================================== # ■ Game_Troop #============================================================================== class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # ● 獲得APの合計計算 #-------------------------------------------------------------------------- def ap_total dead_members.inject(0) {|r, enemy| r += enemy.ap } end end #============================================================================== # ■ Game_Interpreter #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ● 条件分岐 #-------------------------------------------------------------------------- alias kzr_skill_learn_command_111 command_111 def command_111 if @params[0] == 4 && @params[2] == 3 actor = $game_actors[@params[1]] @branch[@indent] = actor.skill_learn?($data_skills[@params[3]]) || actor.ap_full?($data_skills[@params[3]]) command_skip if !@branch[@indent] else kzr_skill_learn_command_111 end end end #============================================================================== # ■ BattleManager #============================================================================== class << BattleManager #-------------------------------------------------------------------------- # ● 獲得した経験値の表示 #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_display_exp display_exp def display_exp kzr_skill_learn_equip_display_exp display_ap end #-------------------------------------------------------------------------- # ● 獲得したAPの表示 #-------------------------------------------------------------------------- def display_ap ap_total = $game_troop.ap_total if ap_total > 0 text = sprintf(Kazari::SkillLearnEquip::VOCAB_GAIN_AP, ap_total) $game_message.add('\.' + text) end end #-------------------------------------------------------------------------- # ● 経験値の獲得とレベルアップの表示 #-------------------------------------------------------------------------- alias kzr_skill_learn_equip_gain_exp gain_exp def gain_exp kzr_skill_learn_equip_gain_exp $game_party.all_members.each do |actor| next if actor.dead? && !Kazari::SkillLearnEquip::GAIN_AP_DEAD actor.gain_ap($game_troop.ap_total) end wait_for_message end end #============================================================================== # ■ module RPG #============================================================================== module RPG class EquipItem < BaseItem def learn_skills(actor_id) return @learn_skills[actor_id] if @learn_skills != nil @learn_skills = [[]] all = [] parsonal = {} note.each_line {|line| case line when /<スキル習得:(\d+)>/i ; all << $1.to_i else if line =~ /<スキル習得:\s*(\d+(?:\s*,\s*\d+)*)>/i $1.scan(/\d+/).each_with_index {|num, i| if i == 0 @skill_id = num.to_i else parsonal[num.to_i] = [] if parsonal[num.to_i] == nil parsonal[num.to_i] << @skill_id if $data_skills[@skill_id] != nil end } end end } $data_actors.compact.each do |actor| skills = all skills += parsonal[actor.id] if parsonal[actor.id] != nil skills.uniq! skills.sort! @learn_skills << skills end @learn_skills[actor_id] end end class Skill < UsableItem def masked_name return @masked_name if @masked_name != nil if Kazari::SkillLearnEquip::MASK_ZERO_AP_SKILL_NAME @masked_name = Kazari::SkillLearnEquip::ZERO_AP_NAME_MASK if @masked_name.scan(/./).size == 1 @masked_name = @masked_name * self.name.scan(/./).size end else @masked_name = self.name end return @masked_name end def need_ap(actor_id) @parsonal_need ||= {} return @parsonal_need[actor_id] if @parsonal_need[actor_id] != nil return @need if @need != nil @need = 0 note.each_line {|line| case line when /<必要AP:(\d+),(\d+)>/i if $2.to_i == actor_id @parsonal_need[actor_id] = $1.to_i return @parsonal_need[actor_id] end when /<必要AP:(\d+)>/i @need = $1.to_i end } return @need end end class Enemy < BaseItem def ap return @ap if @ap != nil @ap = Kazari::SkillLearnEquip::DEFAULT_AP note.each_line {|line| case line when //i ; @ap = $1.to_i end } return @ap end end end