#============================================================================== # ○ステート耐性装備 Ver1.01 # for RGSS2 # 西瓜 / Space not far # http://muspell.raindrop.jp/ # ステートに対する耐性をデフォルトの完全防止より細かく設定することが出来ます。 # また、武器にも耐性の設定ができます。 #============================================================================== # ■更新履歴 # Ver1.02 # ・メモ欄に他のスクリプトの設定項目があった場合動作しなくなる不具合を修正。 # Ver1.01 # ・抵抗しないステートをかけようとするとフリーズするバグを修正。 #============================================================================== # 耐性を設定したい武器または防具のメモに<ステート名,% or - or rank,数値> # と書き込んでください。 # % の場合、数値%分だけそのステートに対する防止確率が上がります。 # ツクール200xと同じ感覚で設定してください。 # - の場合、数値分だけそのステートにかかる確率が下がります。 # rank の場合、数値がプラスなら数値分だけA→B→C...と状態有効度が変わります。 # 数値をマイナスに設定して、弱点ステートを作ることも可能です。 =begin ●メモ設定例 <毒,%,20>  → 毒にかかる確率が(100−20)%になります。   たとえば素の確率が50%なら40%になります。 <暗闇,-,20> → 暗闇にかかる確率が20%減ります。 素の確率が50%なら30%になります。 <麻痺,rank,1> → 麻痺にかかる確率が一段階減ります。 素の有効度がAならBになります。 <抵抗しないけど抵抗> → おまけです。 「抵抗しない」にチェックが入っているステートを受け付けなくなります。 どのタイプの設定にせよ 設定数値が大きいほど状態が効きにくくなると思ってください。 =end # ●注意 # ・<"毒",%,20><"毒",-,25>等のように、一種類の装備に対して # 同じステートの耐性を二つ以上設定することはできません。 # <"毒",%,20><"麻痺",-,25>のように複数のステート耐性を設定するのは # 問題ありません。 # ・内容が違っても同名のステートは一緒に処理されてしまいます。 # もし要望があれば対応策を用意します。 module SNF STATE_GUARD_DIVISION = 0 # 0 => 最も大きい防止%を基準にする 1=> 防止%を加算する STATE_GUARD_MINUS = 1 # 0 => 最も大きい防止値を基準にする 1=> 防止値を加算する # GUARD_DIVISIONが 0 のとき、%の防止設定は重複しません。 # たとえば一つのステートに対して25%の耐性と50%の耐性が設定された時は # 一番大きい50%の耐性が優先されます。 # 1 の時は逆に効果が重複し、25%と50%の場合は # 25 + 50 で 75%となります。 # GUARD_MINUSはそれの−設定にあたります。以下同文。 # よくわからないと思ったらデフォルトのままにしておいてください。 CLASS_STATE_RANK = [100,80,60,40,20,0] # アクターの職業のステート有効度に対応する異常追加確率(%)。 # CLASS_STATE_RANK = [A,B,C,D,E,F] NONNONRESIST = "抵抗しないけど抵抗" # 抵抗しないけど抵抗 end #<ステート名, 減除, 数値> class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● ステートの付加成功率の取得 # state_id : ステート ID #-------------------------------------------------------------------------- def state_probability(state_id) # 変数の初期化 guard_d = 0 guard_m = 0 guard_dm = [] rank = self.class.state_ranks[state_id] if $data_states[state_id].nonresistance # 抵抗しない場合 for weapon in weapons.compact nonnonresistnote = weapon.note.index(SNF::NONNONRESIST) nonnonresist = true if nonnonresistnote != nil end for armor in armors.compact nonnonresistnote = armor.note.index(SNF::NONNONRESIST) nonnonresist = true if nonnonresistnote != nil end if nonnonresist return 0 # だが断る else return 100 end else # 抵抗する場合 for weapon in weapons.compact guard_dm = state_guard(state_id, weapon, guard_d, guard_m, rank) guard_d = guard_dm[0] guard_m = guard_dm[1] rank = guard_dm[2] end for armor in armors.compact guard_dm = state_guard(state_id, armor, guard_d, guard_m, rank) guard_d = guard_dm[0] guard_m = guard_dm[1] rank = guard_dm[2] end rank = 1 if rank < 1 rank = 6 if rank > 6 class_state = [0] + SNF::CLASS_STATE_RANK rate = class_state[rank] result = rate * (100 - guard_d) / 100 - guard_m # 異常率=もとの確率×(100-guard_d)%−guard_m # guard_d、guard_mが高いほど防ぎやすい result = 0 if result < 0 # 0未満の場合0に return result end end def state_guard(state_id, object, guard_d, guard_m, rank) armornote = object.note.scan(/<#{$data_states[state_id].name},(\S+),(\S+)>/) armornote = armornote.flatten if armornote != nil and not armornote.empty? if armornote[0] == "%" # 割合防止 if SNF::STATE_GUARD_DIVISION == 0 # 防止%がより高い場合上書き guard_d = armornote[1].to_i if armornote[1].to_i > guard_d else SNF::STATE_GUARD_DIVISION == 1 # 防止%の加算 guard_d += 100 - armornote[1].to_i end elsif armornote[0] == "-" # 減算防止 if SNF::STATE_GUARD_MINUS == 0 # 防止割合がより高い場合上書き guard_m = armornote[1].to_i if armornote[1].to_i > guard_m else SNF::STATE_GUARD_MINUS == 1 # 防止度の加算 guard_m += armornote[1].to_i end elsif armornote[0] == "rank" # ランク上下 rank += armornote[1].to_i end end return [guard_d, guard_m, rank] end end