HOME
ツクール
RGSS
テクニック
ゲーム紹介
制作中のゲーム
ダウンロード
掲示板
ブログ
EnDREss DREamERブログ
PCパーツ・ソフト通販(仮)
DIYチューンブログ
リンク
スキルレベルシステム改
コンセプト
悠斗の玩具系駄文日記 別館様「スキルレベルシステム」の若干の機能追加
挿入位置
▼ 個別武器コマンドより上。もしくは素材上部に。
完成すると
敵にもスキルレベルを設定可能。
戦闘中スキル使用時に「ファイア 1」など昔のFF2みたくスキルレベルが表示される。
更新履歴
3/1:エラー落ちを修正。 ========== 2013年 ============================================================ 11/26:Game_Enemyの競合対策修正。 11/2:エラー落ち修正。 3/16:装備拡張:武器拡張追加併用時の重量システム敏捷性補正修正。挿入位置変更。 3/11:エラー落ち修正 3/6:ステート変化スキル(ダメージ0限定)の能力補正・命中のレベル補正の機能追加 ========== 2012年 ============================================================ 9/13:個別武器コマンドの修正に対応。 6/18:エラーで落ちるのを修正。 1/5:単体運用での威力補正されない現象やスキル使用時のメッセージ表示修正。 ========== 2011年 ============================================================ 9/21:一部のスキルでエラーが発生するのを修正。 9/3:敵のスキルレベルを設定していない場合にレベルが0だったのを1に設定。 6/27:KGC様「連携スキル」に対応。 6/11:オリジナルのスクリプト修正に対応。 エネミーのスキルレベルのダメージ増加に対応していなかったエラーを修正 ========== 2009年 ============================================================
*悠斗の玩具系駄文日記 別館様の「スキルレベルシステム」改変素材です。
#============================================================================== # ?VX RGSS2 「スキルレベルシステム改」? # EnDlEss DREamER # URL:http://mitsu-evo.6.ql.bz/ # 製作者 mitsu-evo # Last:2013/3/1 # 悠斗の玩具系駄文日記様の「スキルレベルシステム」に # 敵キャラのスキルもレベルに対応させた改変素材です。 # ▼ 個別武器コマンドより下。 # 追加機能 # 1.敵にもスキルレベルの設定が可能。(個別設定は不可) # 2.スキル名にスキルレベルを追加表示。(「ファイア 1」など) # 3.敵キャラメモ欄に
でスキルレベルを設定。 # 4.ステート変化スキル(ダメージ0限定)の能力補正・命中のレベル補正 #============================================================================== # 悠斗の玩具系駄文日記 別館 # URL:http://www.geocities.jp/nobu4891/index.html # 管理人:水無月悠斗 様 # ▼ 同素材使用方法と同じ。 # 無設定及び無記入でスキルレベルを1に設定 #============================================================================== =begin 3/1:エラー落ちを修正。 悠斗の玩具系駄文日記 mainの近くに設置 ================================================================================ <イベントでスキルをレベルアップさせる> イベントなどでスキルをレベルアップさせる場合、下記のスクリプトを実行してください。 ○単体用 $ex_skilllevel.lvup(アクターID, スキルID, レベル) ○全体用 $ex_skilllevel.lvup_all(アクターID, レベル) 単体用を使用すると、指定したアクターの1つのスキルだけをレベルアップできます。 全体用を使用すると、指定したアクターの所持するスキル全て(未修得のものは除く) をレベルアップします。 それぞれ、指定したレベルが上限を超えていた場合、上限に設定したレベルになります。 また、↓の式を設定しており、なおかつ指定レベルを超えた場合、スキルを習得しますが 、画面上では表示されませんので注意してください。 ================================================================================ <新しいスキルを習得させるには> スキルレベルの上昇で新しいスキルを習得させるには、スキルのメモに下記のような式を 書きます。 5=002 5+002:5=003 この式の内容は下記の通りです。 必要レベル=習得するスキルID 必要レベル+他必要スキルID:必要レベル=習得するスキルID 理論上、"+"を挟むことでいくつでも必要スキルを指定することは可能ですが、 処理の遅延を招く恐れがあります。 また、管理も大変になるので、2〜3つに留めておくのが無難と思われます。 ================================================================================ ============================================================================== ■ Ex_SkillLevel ------------------------------------------------------------------------------ スキルレベルを扱うクラスです。 スキルを使用する度に経験値を獲得し、スキルレベルをアップさせます。 スキルのメモ欄にデータを記載することで特定のレベル以上で 新しいスキルを習得させることが出来ます。 なお、新スキルを習得するのに必要なスキルは複数指定可能です。 (C)水無月悠斗.2008 ■更新履歴 2008/01/20 Ver.1.0 2008/02/06 Ver.1.1 必要経験値を満たしてもレベルアップしない不具合を修正。 2008/02/17 Ver.1.2 コピペのみで動作するように修正。 2008/02/25 Ver.1.3 ヘルプウィンドウ拡張を使用中か判定するよう修正。 2008/03/07 Ver.1.4 何も書かずに改行されているとエラーになるバグを修正。 2008/03/16 Ver.1.5 必要スキル複数指定にバグがあったのを修正。 2008/04/16 Ver.1.6 上限レベルを超えてしまう不具合を修正。 2008/04/17 Ver.1.6.1 ver.1.6が不完全だったので追加修正。 2008/04/20 Ver.1.7 イベント用レベルアップコマンド追加。競合しないよう修正。 2009/05/16 Ver.1.7.1 回復スキルの回復量が上昇しないバグを修正。 ============================================================================== =end $ed_rgss2 = {} if $ed_rgss2 == nil $ed_rgss2["ed_skill_level"] = true $imported = {} if $imported == nil module ExSkill SkillGet = "新しいスキルを習得!" Enemy_skill_lv = "skill_level" #
で敵のスキルレベル取得 PHYSICAL_SKILL_SHOW = false # 物理スキル使用時にスキルレベル表示 MAGIC_SKILL_SHOW = true # 魔法スキル使用時にスキルレベル表示 end class Ex_SkillLevel #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :next_exp # 必要経験値 attr_accessor :atk_up # 攻撃力上昇値 attr_accessor :flg # 習得フラグ attr_accessor :max_lv # 最大レベル #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @max_lv = 16 # ここをいじると最大レベルを変更できます。 @next_exp = Array.new(@max_lv+2) @atk_up = Array.new(@max_lv+2) make_next_exp end #-------------------------------------------------------------------------- # ● 必要経験値セット #-------------------------------------------------------------------------- def make_next_exp @next_exp[1] = @next_exp[@max_lv+1] = -1 @next_exp[1] = 2 @atk_up[1] = 1.0 exp_up = 1.0 # 必要経験値上昇倍率 for i in 2..@max_lv @next_exp[i] = @next_exp[i-1] + 1#(@next_exp[i-1] / 2) + (2 * exp_up) @next_exp[i] = @next_exp[i].truncate @atk_up[i] = @atk_up[i-1] + 0.1 exp_up += 0.1 end end #-------------------------------------------------------------------------- # ● スキルレベル上昇 #-------------------------------------------------------------------------- def update(actor, skill) @actor = actor @skill = skill @flg = false if $imported["CooperationSkill"] == true return if @actor.is_a?(Game_CooperationBattler) end slv = @actor.skill_lv[@skill.id] if @next_exp[slv+1] != -1 @actor.skill_exp[@skill.id] += 1 if @actor.skill_exp[@skill.id] >= @next_exp[slv+1] @actor.skill_lv[@skill.id] += 1 @actor.skill_exp[@skill.id] = 0 get_new_skill end end end #-------------------------------------------------------------------------- # ● 次Lvまでの経験値を返す #-------------------------------------------------------------------------- def next_exp?(lv) return @next_exp[lv+1] end #-------------------------------------------------------------------------- # ● 攻撃力上昇値を返す #-------------------------------------------------------------------------- def atk?(lv) lv = 1 if lv == nil return @atk_up[lv] end #-------------------------------------------------------------------------- # ● 習得フラグを返す #-------------------------------------------------------------------------- def flg? return @flg end #-------------------------------------------------------------------------- # ● スキル習得判定 # s : スキルID #-------------------------------------------------------------------------- def got_skill(s) # 既に習得済みか? for skl in @actor.skills if skl.id == s return end end @flg = true @actor.learn_skill(s) return end #-------------------------------------------------------------------------- # ● 新スキル習得 #-------------------------------------------------------------------------- def get_new_skill if @skill.is_a?(RPG::Skill) if not @skill.note.empty? for s in @skill.note.split(/\r\n/) unless s == "" or s[/\s*=\s*/] == nil s_flg = false # w[0] = 必要レベル w[1] = 習得スキル w = s.split(/\s*=\s*/) x = w[0].split(/\s*+\s*/) # 1文字ずつに切り分け # ちょっと無駄っぽい。 xs = ["","","","","","","","","","","","","","","","","",""] i = 0 j = 0 # 切り分けたノートのデータを正規表現に直す # データは「数値、記号、数値、記号…」となる。 loop do if x[i] == nil break end if x[i] == "+" or x[i] == ":" xs[j+1] = x[i] j += 2 i += 1 end xs[j] = xs[j] + x[i] i += 1 end loop_last = j skl_id = @skill.id l_flg = 0 i = 0 loop do if i > loop_last break end if xs[i+1] == "+" or xs[i+1] == "" l_flg = 1 else l_flg = 0 end case l_flg when 0 skl_id = xs[i].to_i when 1 if @actor.skill_lv[skl_id] >= xs[i].to_i s_flg = true else s_flg = false break end end i += 2 end if s_flg == true got_skill(w[1].to_i) end end end end end end #-------------------------------------------------------------------------- # ● イベント用スキルレベルアップ # id : アクターID # skill : スキルID # lv : レベル #-------------------------------------------------------------------------- def lvup(id, skl, lv) for actor in $game_party.members break if actor.id == id end lv = @max_lv if lv > @max_lv for skill in actor.skills break if skill.id == skl end if lv >= actor.skill_lv[skill.id] actor.skill_lv[skill.id] = lv actor.skill_exp[skill.id] = 0 @actor = actor @skill = skill get_new_skill end end #-------------------------------------------------------------------------- # ● イベント用スキルレベルアップ(全) # id : アクターID # lv : レベル #-------------------------------------------------------------------------- def lvup_all(id, lv) for actor in $game_party.members break if actor.id == id end lv = @max_lv if lv > @max_lv for skill in actor.skills if lv >= actor.skill_lv[skill.id] actor.skill_lv[skill.id] = lv actor.skill_exp[skill.id] = 0 @actor = actor @skill = skill get_new_skill end end end end # Game_Battler 再定義 class Game_Battler =begin #-------------------------------------------------------------------------- # ● 攻撃力の取得 #-------------------------------------------------------------------------- alias ex_sklv_atk atk def atk if $imported["LimitBreak"] n = [[base_atk + @atk_plus, 1].max, parameter_limit].min n = state_param_rate(0, n) n = [[Integer(n), 1].max, parameter_limit].min else n = [[base_atk + @atk_plus, 1].max, 999].min n = state_param_rate(0, n) n = [[Integer(n), 1].max, 999].min end return n end =end #-------------------------------------------------------------------------- # ● 防御力の取得 #-------------------------------------------------------------------------- def def if $imported["LimitBreak"] n = [[base_def + @def_plus, 1].max, parameter_limit].min n = state_param_rate(1, n) n = [[Integer(n), 1].max, parameter_limit].min else n = [[base_def + @def_plus, 1].max, 999].min n = state_param_rate(1, n) n = [[Integer(n), 1].max, 999].min end return n end #-------------------------------------------------------------------------- # ● 精神力の取得 #-------------------------------------------------------------------------- def spi if $imported["LimitBreak"] n = [[base_spi + @spi_plus, 1].max, parameter_limit].min n = state_param_rate(2, n) n = [[Integer(n), 1].max, parameter_limit].min else n = [[base_spi + @spi_plus, 1].max, 999].min n = state_param_rate(2, n) n = [[Integer(n), 1].max, 999].min end return n end #-------------------------------------------------------------------------- # ● 装備拡張:武器拡張追加の補正敏捷性取得 #-------------------------------------------------------------------------- def revision_agi_param a = 0 @revision_agi_plus ||= 0 if $ed_rgss2["ed_equip_extension"] and KGC::EquipExtension::WEIGHT and self.is_a?(Game_Actor) a = @revision_agi_plus end if $imported["LimitBreak"] n = [[base_agi + @agi_plus + a, 1].max, parameter_limit].min else n = [[base_agi + @agi_plus + a, 1].max, 999].min end return n end =begin #-------------------------------------------------------------------------- # ● 敏捷性の取得 #-------------------------------------------------------------------------- def agi if $imported["LimitBreak"] n = revision_agi_param n = state_param_rate(3, n) n = [[Integer(n), 1].max, parameter_limit].min else n = revision_agi_param n = state_param_rate(3, n) n = [[Integer(n), 1].max, 999].min end return n end =end #-------------------------------------------------------------------------- # ● スキルの効果適用 # user : スキルの使用者 # skill : スキル #--------------------------------------------------------------------------. alias ex_sklv_skill_effect skill_effect def skill_effect(user, skill) @slv_user = user ex_sklv_skill_effect(user, skill) end #-------------------------------------------------------------------------- # ● ステートの付加 # state_id : ステート ID #-------------------------------------------------------------------------- alias ex_sklv_add_state add_state def add_state(state_id) state = $data_states[state_id] # ステートデータを取得 return if state == nil # データが無効? return if state_ignore?(state_id) # 無視するべきステート? # 使用者のスキルレベル slv = 1 if @slv_user and @slv_user.action.skill? and not @slv_user.is_a?(Game_CooperationBattler) slv = @slv_user.skill_lv[@slv_user.action.skill.id] end maxlv = $ex_skilllevel.max_lv # 最大スキルレベル unless state?(state_id) # このステートが付加されていない? lv_rate = [] # レベル補正後の補正%設定配列 lv_rate << state.atk_rate + slv * (state.atk_rate / maxlv) lv_rate << state.def_rate + slv * (state.def_rate / maxlv) lv_rate << state.spi_rate + slv * (state.spi_rate / maxlv) lv_rate << state.agi_rate + slv * (state.agi_rate / maxlv) state_id_rate(state.id, lv_rate) end ex_sklv_add_state(state_id) end #-------------------------------------------------------------------------- # ● ステートの解除 # state_id : ステート ID #-------------------------------------------------------------------------- alias ex_sklv_remove_state remove_state def remove_state(state_id) return unless state?(state_id) # このステートが付加されていない? @state_id_rate ||= [[100,100,100,100]] @state_id_rate[state_id] = [] # 変化値を削除。 ex_sklv_remove_state(state_id) end #-------------------------------------------------------------------------- # ● スキルレベルによる能力変化値取得 #-------------------------------------------------------------------------- def state_id_rate? @state_id_rate ||= [[100,100,100,100]] @state_id_rate end #-------------------------------------------------------------------------- # ● スキルレベルによる能力変化値設定 #-------------------------------------------------------------------------- def state_id_rate(id,array) @state_id_rate ||= [[100,100,100,100]] @state_id_rate[id] = array end #-------------------------------------------------------------------------- # ● 能力別にステート変化値を計算 #-------------------------------------------------------------------------- def state_param_rate(type,n) @state_id_rate ||= [[100,100,100,100]] for state in states if @state_id_rate[state.id] != nil next if @state_id_rate[state.id][type] == nil n *= @state_id_rate[state.id][type] / 100.0 else case type when 0 n *= state.atk_rate / 100.0 when 1 n *= state.def_rate / 100.0 when 2 n *= state.spi_rate / 100.0 when 3 n *= state.agi_rate / 100.0 end end end return n end #-------------------------------------------------------------------------- # ● 状態変化スキルか? #-------------------------------------------------------------------------- def state_skill?(obj) return false unless obj.base_damage == 0 return false if obj.plus_state_set.empty? and obj.minus_state_set.empty? return true end #-------------------------------------------------------------------------- # ● スキルレベルによるステートスキル命中算出 #-------------------------------------------------------------------------- def state_lv_hit(battler,obj) return obj.hit if battler.action.skill == nil a = obj.hit * battler.spi / 100 return a unless $scene.is_a?(Scene_Battle) b = battler.skill_lv[battler.action.skill.id] * (obj.hit / $ex_skilllevel.max_lv) return a + b end #-------------------------------------------------------------------------- # ● 最終命中率の計算 # user : 攻撃者、スキルまたはアイテムの使用者 # obj : スキルまたはアイテム (通常攻撃の場合は nil) #-------------------------------------------------------------------------- alias ex_sklv_calc_hit calc_hit def calc_hit(user, obj = nil) hit = ex_sklv_calc_hit(user, obj) hit = state_lv_hit(user, obj) if obj.is_a?(RPG::Skill) and state_skill?(obj) return Integer(hit) end #-------------------------------------------------------------------------- # ● ダメージの反映 # user : スキルかアイテムの使用者 # 呼び出し前に @hp_damage、@mp_damage、@absorbed が設定されていること。 #-------------------------------------------------------------------------- alias ex_sklv_execute_damage execute_damage def execute_damage(user) skl_dmg_up = 1.0 # スキルダメージ補正 if user.action.skill.is_a?(RPG::Skill) # スキルか判定 if $imported["CooperationSkill"] == true if user.is_a?(Game_CooperationBattler) slv = 1 else slv = user.skill_lv[user.action.skill.id] end else slv = user.skill_lv[user.action.skill.id] end skl_dmg_up = $ex_skilllevel.atk?(slv) skl_dmg_up = 1.0 if skl_dmg_up == nil @hp_damage *= skl_dmg_up if @hp_damage != 0 @hp_damage = @hp_damage.truncate if @hp_damage != 0 @mp_damage *= skl_dmg_up if @mp_damage != 0 @mp_damage = @mp_damage.truncate # end end ex_sklv_execute_damage(user) end end # Game_Actor 再定義 class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :skill_lv # スキルレベル attr_accessor :skill_exp # スキル経験値 #-------------------------------------------------------------------------- # ● セットアップ # actor_id : アクター ID #-------------------------------------------------------------------------- alias setup_ori setup def setup(actor_id) setup_ori(actor_id) @skill_lv = [] @skill_exp = [] skill_id = 1 loop do @skill_lv[skill_id] = 1 @skill_exp[skill_id] = 0 if $data_skills[skill_id] == nil break end skill_id += 1 end end end # Game_Enemy 再定義 機能追加ヶ所 class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :skill_lv # スキルレベル #-------------------------------------------------------------------------- # ● オブジェクト初期化 # index : 敵グループ内インデックス # enemy_id : 敵キャラ ID #-------------------------------------------------------------------------- alias initialize_ori initialize def initialize(index, enemy_id) initialize_ori(index, enemy_id) enemy_skill_level end #-------------------------------------------------------------------------- # ● 敵のスキルレベル取得 #-------------------------------------------------------------------------- def enemy_skill_level @skill_lv = [] enemy_note = enemy.note.scan(/<#{ExSkill::Enemy_skill_lv}[::](\d+)>/) enemy_note = enemy_note.flatten skill_level = enemy_note[0].to_i skill_level = 1 if skill_level == 0 for action in enemy.actions if skill_level != nil @skill_lv[action.skill_id] = skill_level else @skill_lv[action.skill_id] = 1 end end end end # Window_Skill 再定義 # ※ここはKGCソフトウェアさんの「ヘルプウィンドウ拡張」と併用してください。 class Window_Skill < Window_Selectable #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help return if skill == nil slv = @actor.skill_lv[skill.id] nexp = $ex_skilllevel.next_exp?(slv) mslv = "スキルLv:" + slv.to_s if nexp != -1 mslv = mslv + " スキルExp: " + @actor.skill_exp[skill.id].to_s + "/" + nexp.to_s else mslv = mslv + " スキルExp: MAX" end unless $imported["HelpExtension"] @help_window.set_text(skill == nil ? "" : skill.description + mslv) else @help_window.set_text(skill == nil ? "" : skill.description + "\\n" + mslv) end end end # Scene_Title 再定義 class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # ● 各種ゲームオブジェクトの作成 #-------------------------------------------------------------------------- alias create_game_objects_ori create_game_objects def create_game_objects create_game_objects_ori $ex_skilllevel = Ex_SkillLevel.new end end # Scene_Skill 再定義 class Scene_Skill < Scene_Base #-------------------------------------------------------------------------- # ● スキルの使用 (味方対象以外の使用効果を適用) #-------------------------------------------------------------------------- alias use_skill_nontarget_ori use_skill_nontarget def use_skill_nontarget use_skill_nontarget_ori $ex_skilllevel.update(@actor, @skill) if $ex_skilllevel.flg? == true Sound.play_use_item @skill_window.refresh end end end # Scene_Battle 再定義 class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● スキルレベルシステムの処理 #-------------------------------------------------------------------------- def skill_lv_exec(before=true) skill = @active_battler.action.skill return if skill == nil # スキル名にスキルレベル表示処理 massage_back = Marshal.load(Marshal.dump(skill.message1)) unless before skill.message1 = massage_back if @active_battler.actor? $ex_skilllevel.update(@active_battler, skill) if $ex_skilllevel.flg? == true #Audio.se_play("Audio/SE/ED_必殺発動", 80, 100) @message_window.add_instant_text(ExSkill::SkillGet) wait(60) end end return end if $imported["CooperationSkill"] == true if @active_battler.is_a?(Game_CooperationBattler) != true if skill.atk_f < skill.spi_f # 物理関係度が精神関係度より小さいスキル if ExSkill::MAGIC_SKILL_SHOW and skill.message1 =~ skill.name skill.message1[/#{skill.name}/] = skill.name + " " + @active_battler.skill_lv[skill.id].to_s end else # 精神関係度が大きいスキル if ExSkill::PHYSICAL_SKILL_SHOW and skill.physical_attack != true and skill.message1 =~ skill.name skill.message1[/#{skill.name}/] = skill.name + " " + @active_battler.skill_lv[skill.id].to_s end end end else if skill.atk_f < skill.spi_f # 物理関係度が精神関係度より小さいスキル if ExSkill::MAGIC_SKILL_SHOW and skill.message1 =~ skill.name skill.message1[/#{skill.name}/] = skill.name + " " + @active_battler.skill_lv[skill.id].to_s end else # 精神関係度が大きいスキル if ExSkill::PHYSICAL_SKILL_SHOW and skill.physical_attack != true and skill.message1 =~ skill.name skill.message1[/#{skill.name}/] = skill.name + " " + @active_battler.skill_lv[skill.id].to_s end end end end alias execute_action_skill_ex execute_action_skill #-------------------------------------------------------------------------- # ● 戦闘行動の実行 : スキル #-------------------------------------------------------------------------- def execute_action_skill skill_lv_exec execute_action_skill_ex skill_lv_exec(false) end end
Copyright (C)
永遠の夢に向かって
. All Rights Reserved.
テンプレートのpondt
リサーチ