#============================================================================== # ■ RGSS3 スキルラーニング Ver1.02a by 星潟 #------------------------------------------------------------------------------ # 敵が使用したスキルを覚える特徴を設定する事が出来るようになります。 # スキルを覚える条件等も設定が可能です。 # なお、アクター側のみの設定しか考慮していません。 #------------------------------------------------------------------------------ # ★特徴(アクター・ステート・装備品等)への設定 #------------------------------------------------------------------------------ # ☆ラーニング可能タイプの設定 # # このスクリプトでは、ラーニングスキルを系統化してある為 # 特徴間でそれぞれラーニング可能なスキルを変える事が出来ます。 # # ラーニング可能タイプを設定する事で、指定したタイプの # ラーニングスキルを覚える事が出来るようになります。 # (※ただし、別途『ラーニング基本成功率』を指定しなければ意味がありません) # # ラーニング可能タイプの設定は、メモ欄に下記のように記入して下さい。 # # <ラーニング可能タイプ:1> # # この場合、タイプ1のラーニングタイプのスキルを # ラーニングする事が出来るようになります。 # # なお、複数指定する場合は下記のように記入して下さい。 # # <ラーニング可能タイプ:1,2,3> # # この場合、タイプ1、タイプ2、タイプ3のラーニングタイプのスキルを # ラーニングする事が出来るようになります。 #------------------------------------------------------------------------------ # ☆ラーニング基本成功率の設定 # # このスクリプトでは、ラーニングタイプ別に基本成功率を # 変化して設定できます。 # # これにより、『特定のスキルのラーニング成功率を上げる装備』等といった # 設定が可能となります。 # # 設定しない場合、基本成功率は全て0の設定となっている為 # ラーニング可能タイプを設定していても # スキルのラーニングは発生する事はありません。 # なお、この項目はその仕様上、1つの特徴に複数の設定が有効となります。 # # ラーニング基本成功率の設定は、メモ欄に下記のように記入して下さい。 # # <ラーニング基本成功率:1,100> # # この場合、タイプ1のラーニング基本成功率を100増加させます。 # 100%を超える成功率を設定する事も可能です。 # (スキル側のラーニング成功率との乗算になる為、意味もあります) #------------------------------------------------------------------------------ # ★ラーニング用スキルへの設定 #------------------------------------------------------------------------------ # ☆ラーニング形式の設定 # # どのタイミングでラーニングするかを指定します。 # 形式1の場合、スキル使用時、自分が効果を受けなくてもラーニング対象となります。 # 形式2の場合、スキル使用時、自分が対象となった場合にラーニング対象となります。 # 形式3の場合、スキル使用時、自分が対象となり # なおかつそのスキルの効果を受けた場合にラーニング対象となります。 # # ラーニング形式の設定は、メモ欄に下記のように記入して下さい。 # # <ラーニング形式:1> # # この場合、ラーニング形式は1に設定されます。 # なお、未設定の場合ラーニング対象スキルとは扱われません。 #------------------------------------------------------------------------------ # ☆ラーニングタイプの設定 # # 特徴で設定したラーニング可能タイプに応じたタイプを指定します。 # # ラーニングタイプの設定は、メモ欄に下記のように記入して下さい。 # # <スキルラーニングタイプ:1> # # この場合、ラーニングタイプは1に設定されます。 # なお、未設定の場合ラーニングタイプは0に自動設定されます。 #------------------------------------------------------------------------------ # ☆ラーニング成功率の設定 # # そのスキルのラーニング成功率を設定します。 # # ラーニング成功率の設定は、メモ欄に下記のように記入して下さい。 # # <ラーニング成功率:50> # # この場合、ラーニング成功率は50に設定されます。 # なお、未設定の場合ラーニング成功率は100に自動設定されます。 #------------------------------------------------------------------------------ # ☆ラーニング条件の設定 # # そのスキルのラーニングに条件を設定します。 # なお、この項目はその仕様上、1つの特徴に複数の設定が有効となります。 # 複数設定してある場合、全ての条件をクリアしなければ # ラーニングが行われる事はありません。 # # ラーニング条件設定は、メモ欄に下記のように記入して下さい。 # # <ラーニング条件:MHP,>=,35> # # この場合、最大HPが35以上の場合にこの条件を満たす事になります。 # # <ラーニング条件:MMP,<=,20> # # この場合、最大MPが20以下の場合にこの条件を満たす事になります。 # # <ラーニング条件:ATK,==,50> # # この場合、攻撃力が50の場合にこの条件を満たす事になります。 # # <ラーニング条件:DEF,>,10> # # この場合、防御力が10より大きい場合にこの条件を満たす事になります。 # # <ラーニング条件:MAT,<,25> # # この場合、魔法力が25より低い場合にこの条件を満たす事になります。 # # <ラーニング条件:MDF,!=,45> # # この場合、魔法防御が45以外の場合にこの条件を満たす事になります。 # # <ラーニング条件:AGI,>=,60> # # この場合、敏捷性が60以上の場合にこの条件を満たす事になります。 # # <ラーニング条件:LUK,<=,70> # # この場合、運が70以下の場合にこの条件を満たす事になります。 # # <ラーニング条件:HP,==,100> # # この場合、HPが100の場合にこの条件を満たす事になります。 # # <ラーニング条件:MP,>,10> # # この場合、MPが10より大きい場合にこの条件を満たす事になります。 # # <ラーニング条件:TP,<,25> # # この場合、TPが25より低い場合にこの条件を満たす事になります。 # # <ラーニング条件:LV,!=,45> # # この場合、レベルが45以外の場合にこの条件を満たす事になります。 # # <ラーニング条件:AID,>=,60> # # この場合、アクターIDが60以上の場合にこの条件を満たす事になります。 # # <ラーニング条件:CID,<=,70> # # この場合、職業IDが70以下の場合にこの条件を満たす事になります。 # # <ラーニング条件:SWT,30,true> # # この場合、スイッチがONの場合にこの条件を満たす事になります。 # # <ラーニング条件:VAR,25,>,10> # # この場合、変数25が10より大きい場合にこの条件を満たす事になります。 # # <ラーニング条件:STT,2,false> # # この場合、ステート2が付与されていない場合にこの条件を満たす事になります。 # # <ラーニング条件:SKL,5,true> # # この場合、スキルID5を習得している場合にこの条件を満たす事になります。 # ただし、特徴の『スキル追加』で追加されているスキルの場合は # 習得扱いにはならないので、注意が必要です。 # (レベルアップによるスキル習得と、イベントコマンドによるスキル習得によって # 追加されたスキルがこの項目での『習得しているスキル』に該当します) # # <ラーニング条件:HPR,>=,75> # # この場合、現在HPの割合が75%以上の場合にこの条件を満たす事になります。 # # <ラーニング条件:MPR,<=,25> # # この場合、現在MPの割合が25%以下の場合にこの条件を満たす事になります。 # # <ラーニング条件:TPR,==,50> # # この場合、現在TPの割合が50%の場合にこの条件を満たす事になります。 #------------------------------------------------------------------------------ # ☆味方から味方へスキルを使った場合のラーニング設定 # # そのスキルを味方が使用した際にラーニングを行うかを設定します。 # # この設定は、メモ欄に下記のように記入して下さい。 # # <味方からもラーニング> # # この場合、味方がそのスキルを使った場合もラーニング対象となります。 # この設定を行わない限り、味方のスキルによるラーニングは発生しません。 #------------------------------------------------------------------------------ # Ver1.01 一部のラーニング条件式の不具合を修正。 # Ver1.02 アイテム使用時にラーニングしようとしてエラーになる不具合を修正。 # Ver1.02a 説明文と仕様の不一致を修正。(説明文側を修正しています) #============================================================================== module BLUE_MAGIC #ラーニング可能タイプを設定する為のキーワードを設定します。 WORD1 = "ラーニング可能タイプ" #ラーニング基本成功率を設定する為のキーワードを設定します。 WORD2 = "ラーニング基本成功率" #スキルのラーニング形式を指定する為のキーワードを設定します。 WORD3 = "ラーニング形式" #スキルのラーニングタイプを設定する為のキーワードを設定します。 WORD4 = "スキルラーニングタイプ" #スキルのラーニング成功率を指定する為のキーワードを設定します。 WORD5 = "ラーニング成功率" #ラーニング条件を指定する為のキーワードを設定します。 WORD6 = "ラーニング条件" #味方が使用した場合でも覚えられるようにする場合のキーワードを設定します。 WORD7 = "味方からもラーニング" #戦闘不能状態のままでも覚えられるようにするかの設定を行います。 #trueの場合 戦闘不能状態でもラーニング可能 #falseの場合 戦闘不能状態ではラーニング不可 DEATH = true #ラーニング時のSEを指定します。 #SEの名前を指定します。 SE_NAME = "Skill2" #SEの音量を指定します。 SE_VOLUME = 80 #SEのピッチを指定します。 SE_PITCH = 100 #ラーニング時にログウィンドウに出力するテキストを設定します。 #(1回目の%sにはラーニングしたキャラクターの名前、 # 2回目の%sにはラーニングしたスキルの名前が入ります) TEXT = "%sは%sをラーニング!" end class Game_BattlerBase #-------------------------------------------------------------------------- # データ別ラーニング条件チェック #-------------------------------------------------------------------------- def learning_condition_ok?(item) #スキルのラーニング条件を取得。 data = item.learning_condition return true if data.empty? #条件をそれぞれ判定。 data.each do |d| case d[0] when 0..7#通常能力値 return false if !learning_condition_check([param(d[0]),d[1],d[2]]) when 8 #現在HP return false if !learning_condition_check([hp,d[1],d[2]]) when 9 #現在MP return false if !learning_condition_check([mp,d[1],d[2]]) when 10 #現在TP return false if !learning_condition_check([tp,d[1],d[2]]) when 11 #レベル return false if !learning_condition_check([level,d[1],d[2]]) when 12 #アクターID return false if !learning_condition_check([id,d[1],d[2]]) when 13 #職業ID return false if !learning_condition_check([class_id,d[1],d[2]]) when 14 #スイッチ return false if !learning_condition_check([$game_switches[d[1]],d[2]]) when 15 #変数 return false if !learning_condition_check([$game_variables[d[1]],d[2],d[3]]) when 16 #ステート return false if !learning_condition_check([state?(d[1]),d[2]]) when 17 #スキル習得状態 return false if !learning_condition_check([skill_learn?($data_skills[d[1]]),d[2]]) when 18 #現在HPの割合 return false if !learning_condition_check([(hp_rate * 100).to_i,d[1],d[2]]) when 19 #現在MPの割合 return false if !learning_condition_check([(mp_rate * 100).to_i,d[1],d[2]]) when 20 #現在TPの割合 return false if !learning_condition_check([(tp_rate * 100).to_i,d[1],d[2]]) end end return true end #-------------------------------------------------------------------------- # ラーニング条件チェック #-------------------------------------------------------------------------- def learning_condition_check(condition_data) if condition_data.size == 2 return condition_data[0] == condition_data[1] elsif condition_data.size == 3 case condition_data[1] when "=="#同じ return condition_data[0] == condition_data[2] when ">="#以上 return condition_data[0] >= condition_data[2] when "<="#以下 return condition_data[0] <= condition_data[2] when ">"#超 return condition_data[0] > condition_data[2] when "<"#未満 return condition_data[0] < condition_data[2] when "!="#以外 return condition_data[0] != condition_data[2] end end return false end #-------------------------------------------------------------------------- # スキル基本ラーニング成功率算出 #-------------------------------------------------------------------------- def blue_magic_learn_rate(type) #ラーニング基本確率を初期化。 rate_data = 0 #特徴別のラーニング基本確率を足す。 feature_objects.each do |f| next if f.blue_magic_learn_rate[type] == nil rate_data += f.blue_magic_learn_rate[type] end #ラーニング基本確率を返す。 return rate_data end #-------------------------------------------------------------------------- # スキルラーニング判定 #-------------------------------------------------------------------------- def blue_magic_learn_check(l_case, item) #戦闘不能時のラーニング許可設定がfalseの時は #戦闘不能の場合はラーニングできない。 return false if !BLUE_MAGIC::DEATH && dead? #ラーニング対象がスキルでない場合はfalseを返す。 return false unless item.is_a?(RPG::Skill) #適切なスキル習得形式でない場合はfalseを返す。 return false unless l_case == item.blue_magic_learn_case #ラーニング実行者がアクターでない場合はfalseを返す。 return false if !self.actor? #習得済みスキルの場合は処理しない。 return false if @skills.include?(item.id) #スキルのラーニングタイプを取得。 l_type = item.blue_magic_skill_learn_type #ラーニング可能タイプ特徴がある場合はラーニング可能アクターとする。 flag = false feature_objects.each do |f| flag = true if f.blue_magic_learn_type.include?(l_type) end return false if !flag #自身のラーニング成功率を算出。 rate1 = blue_magic_learn_rate(l_type).to_f #スキルのラーニング成功率を算出。 rate2 = item.blue_magic_skill_learn_rate.to_f #それぞれのラーニング成功率から、最終的なラーニング成功判定を行う。 rate = rate1 * rate2 / 10000 return false if rate <= rand #スキルラーニング条件を満たしていない場合は処理しない。 return learning_condition_ok?(item) end end class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # ラーニングの表示 #-------------------------------------------------------------------------- def display_learn_blue_magic(target, item) #ラーニングSEを演奏。 RPG::SE.new( BLUE_MAGIC::SE_NAME, BLUE_MAGIC::SE_VOLUME, BLUE_MAGIC::SE_PITCH).play #フォーマットを取得。 fmt = BLUE_MAGIC::TEXT #ラーニングの表示を実行。 add_text(sprintf(fmt, target.name, item.name)) wait wait #一行戻る。 back_one end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # スキル/アイテムの使用 #-------------------------------------------------------------------------- alias use_item_blue_magic use_item def use_item #アイテム/スキルを取得。 item = @subject.current_action.item #不慮の事故に備え、使用者がアクターであり #使用するのはスキルかどうかを先に判定しておく。 flag = @subject.actor? && item.is_a?(RPG::Skill) #本来の処理を実行。 use_item_blue_magic #使用者がアクターで、仲間同士でも覚えられない場合は処理しない。 return if flag && !item.blue_magic_ptm_learn #味方が存在しない場合は処理しない。 return if $game_party.all_members.size == 0 #全ての味方に対し習得判定及び処理を実行。 $game_party.all_members.each do |actor| blue_magic_learn_execute(actor, 1, item) end end #-------------------------------------------------------------------------- # スキル/アイテムの発動 #-------------------------------------------------------------------------- alias invoke_item_blue_magic invoke_item def invoke_item(target, item) #不慮の事故に備え、使用者がアクターであり #使用するのはスキルかどうかを先に判定しておく。 flag = @subject.actor? && item.is_a?(RPG::Skill) #本来の処理を実行。 invoke_item_blue_magic(target, item) #使用者がアクターで、仲間同士でも覚えられない場合は処理しない。 return if flag && !item.blue_magic_ptm_learn #習得判定及び処理を実行。 blue_magic_learn_execute(target, 2, item) end #-------------------------------------------------------------------------- # スキル/アイテムの効果を適用 #-------------------------------------------------------------------------- alias apply_item_effects_blue_magic apply_item_effects def apply_item_effects(target, item) #不慮の事故に備え、使用者がアクターであり #使用するのはスキルかどうかを先に判定しておく。 flag = @subject.actor? && item.is_a?(RPG::Skill) #本来の処理を実行。 apply_item_effects_blue_magic(target, item) #使用者がアクターで、仲間同士でも覚えられない場合は処理しない。 return if flag && !item.blue_magic_ptm_learn #効果が適用された場合のみ習得判定及び処理を実行。 blue_magic_learn_execute(target, 3, item) if target.result.success end #-------------------------------------------------------------------------- # スキルのラーニング処理を実行 #-------------------------------------------------------------------------- def blue_magic_learn_execute(actor, l_case, item) #最終ラーニング判定を実行。 learning_result = actor.blue_magic_learn_check(l_case, item) #成功した場合は習得させ、ログウィンドウに出力する。 if learning_result actor.learn_skill(item.id) @log_window.display_learn_blue_magic(actor, item) end end end class RPG::BaseItem #-------------------------------------------------------------------------- # 特徴のスキルのラーニング可能タイプを取得 #-------------------------------------------------------------------------- def blue_magic_learn_type #キャッシュがある場合はキャッシュを返す。 return @blue_magic_learn_type if @blue_magic_learn_type != nil #ラーニング可能タイプがある場合はキャッシュを返す。 @blue_magic_learn_type = [] #メモ欄からデータを取得する。 memo = self.note.scan(/<#{BLUE_MAGIC::WORD1}[::](\S+)>/).flatten #データを取得出来無かった場合は何もしない。 if memo != nil && !memo.empty? data = memo[0].to_s #カンマで区切り、配列を生成。 data = data.split(/\s*,\s*/) #配列内の数字をラーニング可能タイプ配列に #文字列から数値化して移し替える。 data.each do |i| @blue_magic_learn_type.push(i.to_i) end end #データを返す。 return @blue_magic_learn_type end #-------------------------------------------------------------------------- # 特徴のスキルのタイプ別ラーニング成功率を取得 #-------------------------------------------------------------------------- def blue_magic_learn_rate #キャッシュがある場合はキャッシュを返す。 @blue_magic_learn_rate if @blue_magic_learn_rate != nil #ラーニング基本成功率ハッシュを生成する。 @blue_magic_learn_rate = {} #メモ欄からデータを取得 self.note.each_line do |l| memo = l.scan(/<#{BLUE_MAGIC::WORD2}[::](\S+)>/).flatten #データを取得出来無かった場合は何もしない。 if memo != nil && !memo.empty? data = memo[0].to_s #カンマで区切り、配列を生成。 data = data.split(/\s*,\s*/) #データサイズが2つの場合のみ処理を続行し #配列内の数字をラーニング基本成功率ハッシュに #文字列数値化して移し替える。 if data.size == 2 @blue_magic_learn_rate[data[0].to_i] = 0 if @blue_magic_learn_rate[data[0].to_i] == nil @blue_magic_learn_rate[data[0].to_i] += data[1].to_i end end end #データを返す。 return @blue_magic_learn_rate end end class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # スキル固有のラーニング形式を取得 #-------------------------------------------------------------------------- def blue_magic_learn_case #キャッシュがある場合はキャッシュを返す。 return @blue_magic_learn_case if @blue_magic_learn_case != nil #メモ欄からデータを取得 memo = self.note.scan(/<#{BLUE_MAGIC::WORD3}[::](\S+)>/).flatten #データを取得出来無かった場合は0に設定する。 @blue_magic_learn_case = (memo != nil && !memo.empty?) ? memo[0].to_i : 0 #データを返す。 return @blue_magic_learn_case end #-------------------------------------------------------------------------- # スキル固有のラーニングタイプを取得 #-------------------------------------------------------------------------- def blue_magic_skill_learn_type #キャッシュがある場合はキャッシュを返す。 return @blue_magic_skill_learn_type if @blue_magic_skill_learn_type != nil #メモ欄からデータを取得 memo = self.note.scan(/<#{BLUE_MAGIC::WORD4}[::](\S+)>/).flatten #データを取得出来無かった場合は0に設定する。 @blue_magic_skill_learn_type = (memo != nil && !memo.empty?) ? memo[0].to_i : 0 #データを返す。 return @blue_magic_skill_learn_type end #-------------------------------------------------------------------------- # スキル固有のラーニング成功率を取得 #-------------------------------------------------------------------------- def blue_magic_skill_learn_rate #キャッシュがある場合はキャッシュを返す。 return @blue_magic_skill_learn_rate if @blue_magic_skill_learn_rate != nil #メモ欄からデータを取得 memo = self.note.scan(/<#{BLUE_MAGIC::WORD5}[::](\S+)>/).flatten #データを取得出来無かった場合は100に設定する。 @blue_magic_skill_learn_rate = (memo != nil && !memo.empty?) ? memo[0].to_i : 100 #データを返す。 return @blue_magic_skill_learn_rate end #-------------------------------------------------------------------------- # スキル固有のラーニング条件を取得 #-------------------------------------------------------------------------- def learning_condition #キャッシュがある場合はキャッシュを返す。 return @learning_condition if @learning_condition != nil #ラーニング条件配列を作成。 @learning_condition = [] #メモ欄からデータを取得する。 self.note.each_line do |l| memo = l.scan(/<#{BLUE_MAGIC::WORD6}[::](\S+)>/).flatten #データを取得出来無かった場合は何もしない。 if memo != nil && !memo.empty? data = memo[0].to_s #カンマで区切り、配列を生成。 data = data.split(/\s*,\s*/) #配列内の数字をラーニング条件配列に #文字列から移し替える。 case data[0].to_s when "MHP"#最大HP array = [0, data[1], data[2].to_i] when "MMP"#最大MP array = [1, data[1], data[2].to_i] when "ATK"#攻撃力 array = [2, data[1], data[2].to_i] when "DEF"#防御力 array = [3, data[1], data[2].to_i] when "MAT"#魔法力 array = [4, data[1], data[2].to_i] when "MDF"#魔法防御 array = [5, data[1], data[2].to_i] when "AGI"#敏捷性 array = [6, data[1], data[2].to_i] when "LUK"#運 array = [7, data[1], data[2].to_i] when "HP" #現在HP array = [8, data[1], data[2].to_i] when "MP" #現在MP array = [9, data[1], data[2].to_i] when "TP" #現在TP array = [10, data[1], data[2].to_i] when "LV" #レベル array = [11, data[1], data[2].to_i] when "AID"#アクターID array = [12, data[1], data[2].to_i] when "CID"#職業ID array = [13, data[1], data[2].to_i] when "SWT"#スイッチ data[2] = (data[2] == "true") ? true : false array = [14, data[1].to_i, data[2]] when "VAR"#変数 array = [15, data[1].to_i, data[2], data[3].to_i] when "STT"#ステート data[2] = (data[2] == "true") ? true : false array = [16, data[1].to_i, data[2]] when "SKL"#スキル習得状態 data[2] = (data[2] == "true") ? true : false array = [17, data[1].to_i, data[2]] when "HPR" #現在HPの割合 array = [18, data[1], data[2].to_i] when "MPR" #現在MPの割合 array = [19, data[1], data[2].to_i] when "TPR" #現在TPの割合 array = [20, data[1], data[2].to_i] end @learning_condition.push(array) end end #データを返す。 return @learning_condition end #-------------------------------------------------------------------------- # スキル固有のラーニング形式を取得 #-------------------------------------------------------------------------- def blue_magic_ptm_learn #キャッシュがある場合はキャッシュを返す。 return @blue_magic_ptm_learn if @blue_magic_ptm_learn != nil #メモ欄からデータを取得 memo = self.note.scan(/<#{BLUE_MAGIC::WORD7}[::](\S+)>/).flatten #データを取得出来無かった場合は0に設定する。 @blue_magic_ptm_learn = self.note.include?("<" + BLUE_MAGIC::WORD7 + ">") #データを返す。 return @blue_magic_ptm_learn end end