属性補正の修正


ツクールXPのデフォルトでは属性防御のついた装備品を装備すると半減効果が得られる・・・となっている。 しかし、コレだとクラスの設定で属性の有効度を『F』(-100)にすると属性防御のついた装備品を装備 するたびにその属性に対して弱くなってしまう。(-100の半減で-50になってしまう。)そこで・・・ こんなの作ってみました。 ※このスクリプトは小さな本屋の改造素材です。 変更点 2007:02:13 ・プログラム総数を減少 2007:02:15 ・カスタマイズポイントの作成+微修正 2009:05:07 ・こっちに● スキルの使用可能判定 は別に不要な気がするので削除  (と、いうかなんでこっちにも入れたんだっけ?)←アンタ以外にわかるか! 2010:10:17 ・エネミー側の処理を追加(今まで忘れていました・・・) 2011:06:04 ・無駄処理を削除 2011:07:01 ・属性防御のみを設定した場合の処理を追加 ・属性防御用ステートでマイナスのみを設定した場合、軽減ではなく、増加するように変更 ・ステートに属性防御が付加されている場合、半減ではなく、軽減に変更 ・物理属性配列/魔法属性配列が逆になっていたバグを修正
#----------------------------------------------------------------------------
# 属性詳細化 Plus By 貪藻矢射妥←
# ちょっとクセがあります・・・多分。
#----------------------------------------------------------------------------
# 原作:     ▼▲▼ XRXS14. 属性防御/弱点詳細化 ▼▲▼
# 原作者:   森穂様、XRXS.様
# HP:       小さな本屋 
# アドレス: http://xrxs.at-ninja.jp/
#
# 改造内容:
# ・XPの仕様(有効度が-100の場合で、属性が防御されている場合、半減されて
#  有効度が-50にになってしまう点)の改良
# ・オマケで沈黙の拡張
# 
# 更新っぽいもの
# 2007:02:13
# ・プログラム総数を減少
# 
# 2007:02:15
# ・カスタマイズポイントの作成+微修正
# 
# 2009:05:07
# ・こっちに● スキルの使用可能判定 は別に不要な気がするので削除
#  (と、いうかなんでこっちにも入れたんだっけ?)←アンタ以外にわかるか!
# 
# 2010:10:17
# ・エネミー側の処理を追加(今まで忘れていました・・・)
# 
# 2011:06:04
# ・無駄処理を削除
#
# 2011:07:01
# ・属性防御のみを設定した場合の処理を追加
# ・属性防御用ステートでマイナスのみを設定した場合、軽減ではなく、増加するように
#  変更
# ・ステートに属性防御が付加されている場合、半減ではなく、軽減に変更
# ・物理属性配列/魔法属性配列が逆になっていたバグを修正

$OuterFlgs = {} if $OuterFlgs == nil
$OuterFlgs["Element_Plus"] = true

module ELE_MM
  MAX =  200
  MIN = -200
  # weakest 物理/魔法
  WEEK_P = 0
  WEEK_M = -100
  # 物理属性配列/魔法属性配列
  P_LIST = [11..15]
  M_LIST = [1..9, 16]
  # 属性防御のみを設定した場合の軽減値
  DEFAULT_GUARD = 15
  # 属性防御判定用
  GRD_ELE_PLUS  = 0  # 属性ダメージ増加
  GRD_ELE_MINUS = 1  # 属性ダメージ反転
  GRD_ELE_NONE  = -1 # デフォルト
  
  def state_guard_ele(result, element_id)
    # ガード用因子設定
    gurd_factor = (100.0 / (100 - DEFAULT_GUARD))
    if result > 0
      # ステートでこの属性が防御されている場合は軽減(属性有効度が正の場合)
      for i in @states
        if $data_states[i].guard_element_set.include?(element_id)
          result /= gurd_factor
        end
      end
    else
      # ステートでこの属性が防御されている場合は軽減(属性有効度が負の場合)
      for i in @states
        if $data_states[i].guard_element_set.include?(element_id)
          result *= gurd_factor
        end
      end
    end
    return Integer(result)
  end
end

class Game_Actor < Game_Battler
  include ELE_MM
  #--------------------------------------------------------------------------
  # ● 属性補正値の取得
  #     element_id : 属性 ID
  #--------------------------------------------------------------------------
  def element_rate(element_id)
    #if element_id < 16
    # 属性有効度に対応する数値を取得
    table = [0,200,150,100,50,0,-100]
    result = table[$data_classes[@class_id].element_ranks[element_id]]
    element_name = $data_system.elements[element_id]
    rate = [0, 0, 0, 0]
    r_flg = [GRD_ELE_NONE, GRD_ELE_NONE, GRD_ELE_NONE, GRD_ELE_NONE]
    t_rate = 0
    
    list = [@armor1_id, @armor2_id, @armor3_id, @armor4_id]

    # 防具でこの属性が防御されている場合の計算
    for h in 0...list.size
      armor = $data_armors[list[h]]
      if armor != nil and armor.guard_element_set.include?(element_id)
        # 属性ダメージ増(減)n%が設定されている場合
        for j in armor.guard_state_set
          if $data_states[j].name =~ /^#{element_name}([0-9]+)(%|%)/
            rate[h] += $1.to_i
            r_flg[h] = GRD_ELE_PLUS
          end
        end
        # 属性ダメージ反転が設定されている場合
        for j in armor.guard_state_set
          if $data_states[j].name =~ /^#{element_name}マイナス/
            # 属性ダメージ反転のみが設定されている場合
            if r_flg[h] == GRD_ELE_NONE
              rate[h] += DEFAULT_GUARD
            # 属性ダメージ増加で反転の場合(属性ダメージ軽減)
            elsif r_flg[h] == GRD_ELE_PLUS
              rate[h] *= -1
            end
            r_flg[h] = GRD_ELE_MINUS
          end
        end
        # 属性ダメージ軽減用ステートが何も設定されていない場合
        if r_flg[h] == GRD_ELE_NONE
          rate[h] -= DEFAULT_GUARD
        end
      end
    end

    for one_rate in rate
      t_rate += one_rate
    end
    
    if result > 0
      result += result * t_rate / 100
    else
      result -= result * t_rate / 100
    end
    
    result = state_guard_ele(result, element_id)
    # メソッド終了
    result = [[result, ELE_MM_MIN].max, ELE_MM_MAX].min
    return result
  end
end

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 属性補正値の取得
  #     element_id : 属性 ID
  #--------------------------------------------------------------------------
  def element_rate(element_id)
    # 属性有効度に対応する数値を取得
    table = [0,200,150,100,50,0,-100]
    result = table[$data_enemies[@enemy_id].element_ranks[element_id]]
    
    result = state_guard_ele(result, element_id)
    # メソッド終了
    return result
  end
end

class Game_Battler
  include ELE_MM
  #--------------------------------------------------------------------------
  # ● 属性修正の計算
  #     element_set : 属性
  #--------------------------------------------------------------------------
  def elements_correct(element_set)
    # 無属性の場合
    if element_set == []
      # 100 を返す
      return 100
    end
    # 与えられた属性の中で最も弱いものを返す
    # ※メソッド element_rate は、このクラスから継承される Game_Actor
    #   および Game_Enemy クラスで定義される
    weakest = -100
    for i in element_set
      # 魔法属性の場合
      for tmp_value in M_LIST
        if tmp_value.is_a?(Range) && tmp_value === i || tmp_value == i
          weakest = [WEEK_M, self.element_rate(i)].max
          #p $data_system.elements[i], weakest
        end
      end
      # 物理属性の場合
      for tmp_value in P_LIST
        if tmp_value.is_a?(Range) && tmp_value === i || tmp_value == i
          weakest = [WEEK_P, self.element_rate(i)].max
          #p $data_system.elements[i], weakest
        end
      end
    end
    return weakest
  end
end
薄赤色で有効度の最大値、最小値の設定ができます。 P_LISTに物理属性の属性のリストを、M_LISTに魔法属性の属性のリストを設定します。 ※範囲指定が可能です。 ・データベースでの設定の例 ※ステートの場合、ステート防御の属性の欄をチェックしても意味は無いです。ステートはあくまで半減です。  (なんだか無駄なところに凝っているような・・・) ちなみに装備品の属性防御で炎-50%、+オートステート(ステートでも属性の炎をチェック)すると 100%ならば(100 - 50) / 2で25%になります。

戻る