#============================================================================== # ■熟練度システム for RGSS3 Ver1.02-β # □作成者 kure # # 導入位置 # 併用化ベーススクリプトと同時に使用する場合は本体及びオプションスクリプトより下 # # ・熟練度の非表示 #  スキルのメモ欄に「<熟練度非表示>」と記入 # #=============================================================================== $kure_base_script = {} if $kure_base_script == nil $kure_integrate_script = {} if $kure_integrate_script == nil $kure_base_script[:Mastery] = 100 $kure_integrate_script[:Mastery] = 100 p "熟練度システム" #-------------------------------------------------------------------------- # ★ 設定項目(各設定の値を変更してください) #-------------------------------------------------------------------------- module KURE module Mastery #スキル熟練度の設定--------------------------------------------------------- #熟練度最大値 SKILL_MAX_MASTERY = 100 #スキルへの威力反映度 #熟練度1につき、増加するダメージを%で設定、少数での指定可 SM_DAMAGE_EFFECT = 0.1 #属性熟練度の設定----------------------------------------------------------- #熟練度最大値 ELEMENT_MAX_MASTERY = 100 #スキルへの威力反映度 #熟練度1につき、増加するダメージを%で設定、少数での指定可 EM_DAMAGE_EFFECT = 0.1 #武器熟練度の設定----------------------------------------------------------- #熟練度最大値 WEAPON_MAX_MASTERY = 100 #スキルへの威力反映度 #熟練度1につき、増加するダメージを%で設定、少数での指定可 WM_DAMAGE_EFFECT = 0.1 #武器タイプ熟練度の設定----------------------------------------------------- #熟練度最大値 WEAPON_TYPE_MAX_MASTERY = 100 #スキルへの威力反映度 #熟練度1につき、増加するダメージを%で設定、少数での指定可 TM_DAMAGE_EFFECT = 0.1 end end #============================================================================== # ■ RPG::Skill(再定義) #============================================================================== class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # ☆ 必要属性熟練度の定義(追加定義) #-------------------------------------------------------------------------- def need_skill_element_mastery need = [] ; cheak_note = @note while cheak_note do cheak_note.match(/<必要属性熟練度\s?(\d+)\s?,\s?(\d+)\s?>/) need.push([$1.to_i, $2.to_i]) if $1 && $2 cheak_note = $' end return need end #-------------------------------------------------------------------------- # ☆ 必要武器熟練度の定義(追加定義) #-------------------------------------------------------------------------- def need_skill_weapon_mastery return 0 unless @note @note.match(/<必要装備熟練度\s?(\d+)\s?>/) return 0 unless $1 return $1.to_i end #-------------------------------------------------------------------------- # ☆ 必要武器タイプ熟練度の定義(追加定義) #-------------------------------------------------------------------------- def need_skill_weapon_type_mastery need = [] ; cheak_note = @note while cheak_note do cheak_note.match(/<必要装備タイプ熟練度\s?(\d+)\s?,\s?(\d+)\s?>/) need.push([$1.to_i, $2.to_i]) if $1 && $2 cheak_note = $' end return need end end #============================================================================== # ■ RPG::BaseItem #============================================================================== class RPG::BaseItem #-------------------------------------------------------------------------- # ● データベースのidを返す(装備品個別管理より引き継ぎ) #-------------------------------------------------------------------------- def database_id return @id end #-------------------------------------------------------------------------- # ☆ 熟練度描画不要の定義(追加定義) #-------------------------------------------------------------------------- def not_draw_mastery @note.include?("<熟練度非表示>") end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 熟練度の初期設定(追加定義) #-------------------------------------------------------------------------- def init_mastery_list @mastery_skill_list ||= [] @mastery_element_list ||= [] @mastery_weapon_list ||= [] @mastery_weapon_type_list ||= [] end #-------------------------------------------------------------------------- # ● 熟練度の加算処理(追加定義) #-------------------------------------------------------------------------- def add_mastery(item) init_mastery_list return unless item.is_a?(RPG::Skill) id = item.id element = [item.damage.element_id] element = apply_elements(self, item) if $kure_base_script[:base_A] element = basic_element_list(self, item) if $kure_integrate_script[:integrate] skill_data = [id, element] weapon_id_list = weapons.compact.collect{|obj| obj.database_id} weapon_type_list = weapons.compact.collect{|obj| obj.wtype_id} weapon_data = [weapon_id_list, weapon_type_list] add_weapon_mastery(item, weapon_data) add_skill_mastery(item, skill_data) end #-------------------------------------------------------------------------- # ● スキル熟練度の加算(追加定義) #-------------------------------------------------------------------------- def add_skill_mastery(item, data) add_mastery_value(0, data[0], 1) if item.damage.element_id >= 0 data[1].each{|id| add_mastery_value(1, id, 1)} end end #-------------------------------------------------------------------------- # ● 武器の熟練度の加算(追加定義) #-------------------------------------------------------------------------- def add_weapon_mastery(item, data) return if item.damage.element_id >= 0 data[0].each{|id| add_mastery_value(2, id, 1)} data[1].each{|id| add_mastery_value(3, id, 1)} end #-------------------------------------------------------------------------- # ● 熟練度の定数加算(追加定義) #-------------------------------------------------------------------------- def add_mastery_value(type, id, value) init_mastery_list case type when 0 skill_id = @mastery_skill_list.find{|obj| obj[0] == id} @mastery_skill_list.push([id, value]) unless skill_id if skill_id skill_id[1] = [skill_id[1] + value, max_mastery_value(0, id)].min skill_id[1] = [skill_id[1],0].max end when 1 element_id = @mastery_element_list.find{|obj| obj[0] == id} @mastery_element_list.push([id, value]) unless element_id if element_id element_id[1] = [element_id[1] + value, max_mastery_value(1, id)].min element_id[1] = [element_id[1],0].max end when 2 weapon_id = @mastery_weapon_list.find{|obj| obj[0] == id} @mastery_weapon_list.push([id, value]) unless weapon_id if weapon_id weapon_id[1] = [weapon_id[1] + value, max_mastery_value(2, id)].min weapon_id[1] = [weapon_id[1],0].max end when 3 type_id = @mastery_weapon_type_list.find{|obj| obj[0] == id} @mastery_weapon_type_list.push([id, value]) unless type_id if type_id type_id[1] = [type_id[1] + value, max_mastery_value(3, id)].min type_id[1] = [type_id[1],0].max end end end #-------------------------------------------------------------------------- # ● 熟練度の最大値の取得(追加定義) #-------------------------------------------------------------------------- def max_mastery_value(type, id) init_mastery_list case type when 0 ; return KURE::Mastery::SKILL_MAX_MASTERY when 1 ; return KURE::Mastery::ELEMENT_MAX_MASTERY when 2 ; return KURE::Mastery::WEAPON_MAX_MASTERY when 3 ; return KURE::Mastery::WEAPON_TYPE_MAX_MASTERY end end #-------------------------------------------------------------------------- # ● 熟練度の取得(追加定義) #-------------------------------------------------------------------------- def mastery_value(type, id) init_mastery_list case type when 0 #該当スキルIDの熟練度を返す result = @mastery_skill_list.find{|obj| obj[0] == id} value = result ? result[1] : 0 return value when 1 #該当属性IDの熟練度を返す result = @mastery_element_list.find{|obj| obj[0] == id} value = result ? result[1] : 0 return value when 2 #該当IDの武器熟練度を返す result = @mastery_weapon_list.find{|obj| obj[0] == id} value = result ? result[1] : 0 return value when 3 #該当武器タイプIDの熟練度を返す result = @mastery_weapon_type_list.find{|obj| obj[0] == id} value = result ? result[1] : 0 return value end end #-------------------------------------------------------------------------- # ● 熟練度を満たしているか?(追加定義) #-------------------------------------------------------------------------- def enough_mastery?(skill) init_mastery_list weapon_id_list = weapons.compact.collect{|obj| obj.database_id} weapon_type_list = weapons.compact.collect{|obj| obj.wtype_id} #必要装備熟練度 if skill.need_skill_weapon_mastery != 0 weapon_id_list.each do |id| weapon_id = @mastery_weapon_list.find{|obj| obj[0] == id} return false unless weapon_id return false if weapon_id[1] < skill.need_skill_weapon_mastery end end #必要装備タイプ熟練度 skill.need_skill_weapon_type_mastery.each do |data| type_id = @mastery_weapon_type_list.find{|obj| obj[0] == data[0]} return false unless type_id return false if type_id[1] < data[1] end #必要属性熟練度 skill.need_skill_element_mastery.each do |data| element = @mastery_element_list.find{|obj| obj[0] == data[0]} return false unless element return false if element[1] < data[1] end return true end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ● 熟練度補正の取得(追加定義) #-------------------------------------------------------------------------- def mastery_rate(user, item) return 1 unless user.actor? value = 1 element = $kure_base_script[:base_A] ? apply_elements(self, item) : [item.damage.element_id] #スキルの熟練度の適用 value += (user.mastery_value(0, item.id) * KURE::Mastery::SM_DAMAGE_EFFECT).to_f / 100 #属性攻撃(属性熟練度を適用) if item.damage.element_id >= 0 element.each do |id| value += (user.mastery_value(1, id) * KURE::Mastery::EM_DAMAGE_EFFECT).to_f / 100 end end #通常攻撃(武器熟練度、タイプ熟練度を適用) if item.damage.element_id < 0 weapon_id_list = user.weapons.compact.collect{|obj| obj.database_id} weapon_type_list = user.weapons.compact.collect{|obj| obj.wtype_id} weapon_id_list.each do |w_id| value += (user.mastery_value(2, w_id) * KURE::Mastery::WM_DAMAGE_EFFECT).to_f / 100 end weapon_type_list.each do |t_id| value += (user.mastery_value(3, t_id) * KURE::Mastery::TM_DAMAGE_EFFECT).to_f / 100 end end return value end #-------------------------------------------------------------------------- # ☆ スキル使用コストの支払い可能判定(エイリアス再定義) #-------------------------------------------------------------------------- alias k_mastery_before_skill_cost_payable? skill_cost_payable? def skill_cost_payable?(skill) return false if actor? && !enough_mastery?(skill) k_mastery_before_skill_cost_payable?(skill) end #-------------------------------------------------------------------------- # ● スキル/アイテムの使用(エイリアス再定義) #-------------------------------------------------------------------------- alias k_mastery_before_use_item use_item def use_item(item) add_mastery(item) if actor? k_mastery_before_use_item(item) end #-------------------------------------------------------------------------- # ☆ スキル/アイテムの属性修正値を取得(エイリアス再定義) #-------------------------------------------------------------------------- alias k_mastery_before_item_element_rate item_element_rate def item_element_rate(user, item) k_mastery_before_item_element_rate(user, item) * mastery_rate(user, item) end end #============================================================================== # ■ Game_Interpreter #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ☆ 熟練度を増加(追加定義) #-------------------------------------------------------------------------- def actor_add_mastery(actor_id, type, id, value) $game_actors[actor_id].add_mastery_value(type, id, value) end end #============================================================================== # ■ Window_Base #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● アイテム名の描画(エイリアス再定義) #-------------------------------------------------------------------------- alias k_mastery_before_draw_item_name draw_item_name def draw_item_name(item, x, y, enabled = true, width = 172) draw_item_mastery_value(item, x, y, enabled, width) k_mastery_before_draw_item_name(item, x, y, enabled, width) end #-------------------------------------------------------------------------- # ● 熟練度の描画(エイリアス再定義) #-------------------------------------------------------------------------- def draw_item_mastery_value(item, x, y, enabled = true, width = 172) return if !item.is_a?(RPG::Weapon) && !item.is_a?(RPG::Skill) return if item.not_draw_mastery #if SceneManager.scene_is?(Scene_Equip) or SceneManager.scene_is?(Scene_Skill) actor = $game_party.menu_actor return unless actor type = 0 if item.is_a?(RPG::Skill) type = 2 if item.is_a?(RPG::Weapon) rate = actor.mastery_value(type, item.database_id).to_f / actor.max_mastery_value(type, item.database_id) draw_gauge(x, y, width, rate, mp_gauge_color1, mp_gauge_color2) #end end end