#============================================================================== # 経験値消費でスキル修得スクリプト + スキルレベル ver1.21 #------------------------------------------------------------------------------ #[特徴] # 「経験値消費でスキル修得」にスキルレベルを追加します。 # #[スキル設定方法] # スキルのメモ欄に <必要スキル:ID,LV> と書くと、 # ID のスキルが LV 以上でないと覚えることができません。 # 複数書くと、そのすべてを満たす必要があります。 # #[仕様変更] # LEARN_SKILL_HIDE(修得したスキルは表示しない)の設定が、 # 『最大レベルまで上げたスキル』は表示しないの設定になります。 # # SKILL_LEARN(修得したスキルの表示方法)の設定が、 # 最大レベルまで上げたときに表示されるようになります。 # # 作成:ぶちょー # ホム:http://nyannyannyan.bake-neko.net/ # 著作:自分で作ったとか言わないで>< # 改造はご自由にどうぞ。 # リードミーとかに私の名前の載せたりするのは任意で。 #============================================================================== #============================================================================== # バージョンアップ情報 # ver1.21 修得済みのスキルが修得画面で表示されないのを修正 # ver1.20 スキル画面でスキルレベルが表示されないのを修正 # レベルアップで覚えたスキルがレベル0 なのを修正(レベル1 になるように) # ver1.10 ダメージの補正方法を修正 # ver1.00 公開 #============================================================================== #============================================================================== # 設定項目 #============================================================================== module Kazari module LearnSkillExp # スキルの色 # COLOR4 : 最大レベルまで上げたスキル COLOR4 = Color.new(64, 64, 255) # 修得条件を満たしていないスキルを非表示にするなら true DIS_SKILL = true # DIS_SKILL が false のとき(修得条件を満たしていないスキルも表示する場合) # 該当スキルの必要経験値の場所に表示する文字 DIS_EXP = "非条件" # ダメージ強化率 # 1レベル上げたときのダメージの増加率 # ダメージ = ダメージ * (1 + DAMAGE_RATE * スキルレベル) DAMAGE_RATE = 0.1 # レベル10でダメージが2倍になる計算 # スキルのメモ欄に <ダメージ増加率:数値> と書くと、個別に設定できます。 # 消費MP増加率 # 1レベル上げたときの消費MPの増加率 # 消費MP = 消費MP * (1 + MP_RATE * スキルレベル) MP_RATE = 0.1 # レベル10で消費MPが2倍になる計算 # スキルのメモ欄に <消費MP増加率:数値> と書くと、個別に設定できます。 # 必要経験値増加率 # 1レベル上げたときの必要経験値の増加率 # 必要経験値 = 必要経験値 * (1 + EXP_RATE * スキルレベル) EXP_RATE = 1 # スキルのメモ欄に <必要経験値増加率:数値> と書くと、個別に設定できます。 # スキルの最大レベル # デフォルトの設定。 MAX_SKILL_LEVEL = 10 # スキルのメモ欄に <最大スキルレベル:数値> と書くと、個別に設定できます。 # 最大レベルが 1 のスキルにレベルを表示しないなら true LEVEL_ONE = true # スキル名の描画方法 SKILL_NAME = "%s Lv %d" # %s にスキル名。%d にレベル # スキルの詳細設定 # スキルID => [基本ダメージ, 打撃関係度, 精神関係度, 消費MP, 必要経験値], # 省略すると、上記で設定した増加率を元に計算します。 SKILL = { 1 => [[1, 110, 0, 5, 10], # レベル1 [1, 120, 0, 5, 20], # レベル2 [1, 130, 0, 6, 30], # レベル3 [1, 140, 0, 6, 40], # レベル4 [1, 150, 0, 7, 50], # レベル5 [1, 160, 0, 7, 60], # レベル6 [1, 170, 0, 8, 70], # レベル7 [1, 180, 0, 8, 80], # レベル8 [1, 190, 0, 9, 90], # レベル9 [1, 200, 0, 9, 100], # レベル10 ], } end end #============================================================================== # ここまで #============================================================================== #============================================================================== # ■ Scene_Battle #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● スキル選択の開始 #-------------------------------------------------------------------------- alias learn_skill_exp_start_skill_selection start_skill_selection def start_skill_selection learn_skill_exp_start_skill_selection $game_temp.skill_level = @active_battler.skill_level end #-------------------------------------------------------------------------- # ● 次に行動するべきバトラーの設定 #-------------------------------------------------------------------------- alias learn_skill_exp_set_next_active_battler set_next_active_battler def set_next_active_battler learn_skill_exp_set_next_active_battler if @active_battler if @active_battler.actor? $game_temp.skill_level = @active_battler.skill_level end end end end #============================================================================== # ■ Scene_LearnSkillExp #============================================================================== class Scene_LearnSkillExp < Scene_Base #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- alias skill_level_start start def start skill_level_start $game_temp.skill_level = @actor.skill_level end end #============================================================================== # ■ Window_LearnSkill #============================================================================== class Window_LearnSkill < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @data = [] skill_list = [] skill_list += ACTOR_LEARN[@actor.id] if ACTOR_LEARN[@actor.id] skill_list += CLASS_LEARN[@actor.class_id] if CLASS_LEARN[@actor.class_id] for skill in @actor.skills skill_list.push(skill.id) end skill_list.uniq! skill_list.sort! for skill_id in skill_list skill = $data_skills[skill_id] next if skill == nil next if LEARN_SKILL_HIDE && @actor.skill_level_max?(skill) next if DIS_SKILL && ! @actor.satisfy_level?(skill) @data.push(skill) end @item_max = @data.size create_contents for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(index) self.contents.clear_rect(rect) skill = @data[index] if skill != nil rect.width -= 4 draw_skill_name(skill, rect.x, rect.y) if @actor.skill_level_max?(skill) && ! LEARN_SKILL_HIDE text = SKILL_LEARN elsif ! @actor.satisfy_level?(skill) && ! DIS_SKILL text = DIS_EXP else text = sprintf(NEED_EXP, @actor.calc_need_exp(skill)) end self.contents.draw_text(rect, text, 2) end end #-------------------------------------------------------------------------- # ● スキル名の描画 #-------------------------------------------------------------------------- def draw_skill_name(skill, x, y) draw_icon(skill.icon_index, x, y) plus = 1 if @actor.skill_level_max?(skill) color = COLOR4 plus = 0 elsif @actor.skill_can_learn?(skill) color = COLOR1 else color = COLOR2 end if skill.max_level == 1 && LEVEL_ONE text = skill.name else text = sprintf(SKILL_NAME, skill.name, @actor.skill_level[skill.id] + plus) end self.contents.font.color = color self.contents.draw_text(x + 24, y, 172, WLH, text) end end #============================================================================== # ■ Window_Skill #============================================================================== class Window_Skill < Window_Selectable include Kazari::LearnSkillExp #-------------------------------------------------------------------------- # ● スキル名の描画 #-------------------------------------------------------------------------- def draw_item_name(skill, x, y, enabled) if skill != nil draw_icon(skill.icon_index, x, y, enabled) if skill.max_level == 1 && LEVEL_ONE text = skill.name else text = sprintf(SKILL_NAME, skill.name, @actor.skill_level[skill.id]) end self.contents.font.color.alpha = enabled ? 255 : 128 self.contents.font.color = normal_color self.contents.draw_text(x + 24, y, 172, WLH, text) end end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler include Kazari::LearnSkillExp #-------------------------------------------------------------------------- # ● スキルまたはアイテムによるダメージ計算 #-------------------------------------------------------------------------- alias learn_skill_exp_make_obj_damage_value make_obj_damage_value def make_obj_damage_value(user, obj) learn_skill_exp_make_obj_damage_value(user, obj) if user.actor? && obj.is_a?(RPG::Skill) unless SKILL[@id] if obj.note.include?("ダメージ増加率") rate = obj.note.scan(/^<ダメージ増加率:(.+)>/im).to_s.to_f else rate = DAMAGE_RATE end damage_rate = (1 + rate * user.skill_level[obj.id]) @hp_damage = (@hp_damage * damage_rate).to_i @mp_damage = (@mp_damage * damage_rate).to_i end end end end #============================================================================== # ■ Game_Actor #============================================================================== class Game_Actor < Game_Battler include Kazari::LearnSkillExp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :skill_level #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- alias learn_skill_exp_setup setup def setup(actor_id) @skill_level = [] for i in 1..$data_skills.size @skill_level[i] = 0 end learn_skill_exp_setup(actor_id) end #-------------------------------------------------------------------------- # ● 必要経験値の計算 #-------------------------------------------------------------------------- def calc_need_exp(skill) memo = skill.note.scan(/<#{"必要経験値"}(\d+):(\d+)>/) memo = memo.flatten if memo[0].to_i == @actor_id need_exp = memo[1].to_i else memo = skill.note.scan(/<#{"必要経験値:"}(\d+)>/) memo = memo.flatten need_exp = memo[0].to_i end if SKILL[skill.id] need_exp = SKILL[skill.id][@skill_level[skill.id]][4] else if skill.note.include?("必要経験値増加率") rate = skill.note.scan(/^<必要経験値増加率:(.+)>/im).to_s.to_f else rate = EXP_RATE end need_exp *= (1 + rate * @skill_level[skill.id]) end return Integer(need_exp) end #-------------------------------------------------------------------------- # ● スキルの修得可能判定 #-------------------------------------------------------------------------- def skill_can_learn?(skill) return false if skill_level_max?(skill) return false unless satisfy_level?(skill) if LEARN_FLAG usable_exp = @exp else usable_exp = @exp - @exp_list[@level] end return usable_exp >= calc_need_exp(skill) end #-------------------------------------------------------------------------- # ● スキルのレベルが最大かどうかの判定 #-------------------------------------------------------------------------- def skill_level_max?(skill) return skill.max_level == @skill_level[skill.id] end #-------------------------------------------------------------------------- # ● 修得条件を満たしているかどうかの判定 #-------------------------------------------------------------------------- def satisfy_level?(skill) memo = skill.note.scan(/<#{"必要スキル:"}(\d+),(\d+)>/) memo = memo.flatten if memo != nil && ! memo.empty? for i in 0...memo.size id = memo[i].to_i i += 1 level = memo[i].to_i return false if @skill_level[id] < level end return true else return true end end #-------------------------------------------------------------------------- # ● スキルを覚える #-------------------------------------------------------------------------- def learn_skill(skill_id) unless skill_learn?($data_skills[skill_id]) @skills.push(skill_id) @skills.sort! @skill_level[skill_id] = 1 end end #-------------------------------------------------------------------------- # ● スキルの修得(経験値消費) #-------------------------------------------------------------------------- def learning_skill(skill) @skill_level[skill.id] += 1 if skill_learn?(skill) learn_skill(skill.id) need_exp = calc_need_exp(skill) gain_exp(-need_exp, false) end end #============================================================================== # ■ Game_Temp #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :skill_level #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias learn_skill_exp_initialize initialize def initialize learn_skill_exp_initialize @skill_level = [] for i in 1..$data_skills.size @skill_level[i] = 0 end end end module RPG class Skill < UsableItem include Kazari::LearnSkillExp attr_accessor :max_level alias skill_learn_exp_initialize initialize def initialize skill_learn_exp_initialize end def base_damage return SKILL[@id] ? SKILL[@id][level][0] : @base_damage end def atk_f return SKILL[@id] ? SKILL[@id][level][1] : @atk_f end def spi_f return SKILL[@id] ? SKILL[@id][level][2] : @spi_f end def mp_cost if SKILL[@id] cost = SKILL[@id][level][3] else cost = @mp_cost if @note.include?("消費MP増加率") rate = @note.scan(/^<消費MP増加率:(.+)>/im).to_s.to_f else rate = MP_RATE end cost *= (1 + rate * level) end return Integer(cost) end def max_level max_level = MAX_SKILL_LEVEL if @note.include?("最大スキルレベル") max_level = @note.scan(/^<最大スキルレベル:(.+)>/im).to_s.to_i end return max_level end def level level = $game_temp.skill_level[@id] return [level - 1, 0].max end end end