ステート詳細化 Plus


・防具にステート%防御を設定していない場合の処理を追加 ・ステート変化の処理で防具にステート防御が設定されている場合、本処理が走らないバグを修正 ※このスクリプトは小さな本屋の改造素材です。 変更点 2011:07:01 ・ステートバリア実装
#----------------------------------------------------------------------------
# ステート詳細化 Plus By 貪藻矢射妥←
# ちょっとクセがあります・・・多分。
#----------------------------------------------------------------------------
# 原作:     ▼▲▼ XRXS18. ステート防御/有効度詳細化 ver.2 ▼▲▼
# 原作者:   森穂様、XRXS.様
# HP:       小さな本屋 
# アドレス: http://xrxs.at-ninja.jp/
#
# 改造内容:
# ・防具にステート%防御を設定していない場合の処理を追加
# ・ステート変化の処理で防具にステート防御が設定されている場合、本処理が
#  走らないバグを修正
#============================================================================
# 更新っぽいもの
# 2011:07:01
# ・ステートバリア実装

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

#==============================================================================
# カスタマイズポイント (最大と最小)
#==============================================================================
module XRXS18
  STATE_RATE_MAX =  100
  STATE_RATE_MIN =    0
  
  # 有効なステートとして使うステート一覧。
  USE_STATE = [1..18]
  DEFAULT_RATE = 0.8
  
  # ステートバリア設定
  # [[バリア用ステートID, [ガードするステートID]], ... ]
  STATE_GUARD_STATE = [[261, [  2,  3,  6,  7,  8, 18]], 
                       [262, [  2,  3,  6,  7,  8, 18,  4,  9, 15, 16, 11, 12]], 
                       [263, [  2,  3,  6,  7,  8, 18,  4,  9, 15, 16, 11, 12, 
                                5, 10, 13, 14,  1, 17]]]
end

#==============================================================================
# ■ Game_Actor
#------------------------------------------------------------------------------
#  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors)
# の内部で使用され、Game_Party クラス ($game_party) からも参照されます。
#==============================================================================
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● ステート防御判定
  #     state_id : ステート ID
  #--------------------------------------------------------------------------
  def state_guard?(state_id)
    return state_percent(state_id)
  end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
#  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の
# 内部で使用されます。
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● ステート防御判定
  #     state_id : ステート ID
  #--------------------------------------------------------------------------
  def state_guard?(state_id)
    return 100
  end
end

#==============================================================================
# ■ Game_Battler
#==============================================================================
class Game_Battler
  include XRXS18
  #--------------------------------------------------------------------------
  # ○ ステート有効度の取得
  #--------------------------------------------------------------------------
  def state_percent(state_id)
    effect_percent = [0,100,80,60,40,20,0][self.state_ranks[state_id]]
    state_name = $data_states[state_id].name
    # ステートセットを取得
    plus_state_set  = []
    minus_state_set = []
    for k in self.states
      plus_state_set  += $data_states[k].plus_state_set
      minus_state_set += $data_states[k].minus_state_set
    end
    if self.is_a?(Game_Actor)
      weapon_list = [@weapon_id]
      armor_list  = [@armor1_id, @armor2_id, @armor3_id, @armor4_id, @armor5_id, 
                     @armor6_id, @armor7_id]
      # もし盾に武器を装備していたら除外
      if @armor1_buki
        armor_list.delete_at(0)
        weapon_list.push(@armor1_id)
      end
      
      for id in weapon_list#self.weapon_ids
        if id >= 1
          plus_state_set  += $data_weapons[id].plus_state_set
          minus_state_set += $data_weapons[id].minus_state_set
        end
      end
      for id in armor_list#self.armor_ids
        if id >= 1
          minus_state_set += $data_armors[id].guard_state_set
        end
      end
    # エネミーの場合
    else
      weapon_list = []
      armor_list  = []
    end
    # 計算
    
    # 防具にステート%防御が設定されている場合は確率減少
    for id in plus_state_set
      if $data_states[id].name =~ /^#{state_name}([0-9]+)(%|%)/
        effect_percent += $1.to_i
      end
    end
    for id in minus_state_set
      if $data_states[id].name =~ /^#{state_name}([0-9]+)(%|%)/
        effect_percent -= $1.to_i
      end
    end
    
    # 防具にステート%防御が設定されていない場合
    if effect_percent == [0,100,80,60,40,20,0][self.state_ranks[state_id]]
      for k in armor_list#self.armor_ids
        armor = $data_armors[k]
        next if armor == nil
        for j in armor.guard_state_set 
          if $data_states[j] != nil
            #if j <= 18
            for tmp_value in USE_STATE
              if tmp_value.is_a?(Range) && tmp_value === j || tmp_value == j
                if $data_states[j].name.clone == state_name.clone
                  effect_percent *= DEFAULT_RATE
                  effect_percent = Integer(effect_percent)
                end
              end
            end
          end
        end
      end
    end
    
    # ステートバリアの場合
    for s_g_s in STATE_GUARD_STATE
      st_br_id = s_g_s[0]
      guard_id = s_g_s[1]
      if self.states.include?(st_br_id)
        if guard_id.include?(state_id)
          effect_percent = 0
        end
      end
    end
    
    return [[effect_percent, STATE_RATE_MIN].max, STATE_RATE_MAX].min
  end
  #--------------------------------------------------------------------------
  # ● ステート変化 (+) の適用 [再定義]
  #--------------------------------------------------------------------------
  def states_plus(plus_state_set)
    # 有効フラグをクリア
    effective = false
    # ループ (付加するステート)
    for i in plus_state_set
      # このステートが防御されていない場合
      unless self.state_guard?(i) == 0
        # このステートがフルでなければ有効フラグをセット
        effective |= self.state_full?(i) == false
        # ステートが [抵抗しない] の場合
        if $data_states[i].nonresistance
          # ステート変化フラグをセット
          @state_changed = true
          # ステートを付加
          add_state(i)
        # このステートがフルではない場合
        elsif self.state_full?(i) == false
          # ステート有効度を確率に変換し、乱数と比較
          if rand(100) < self.state_percent(i)
            # ステート変化フラグをセット
            @state_changed = true
            # ステートを付加
            add_state(i)
          end
        end
      end
    end
    # メソッド終了
    return effective
  end
end
薄赤色で有効度の最大値、最小値の設定ができます。 USE_STATEにステートとして使用するIDの設定を行います。 ※範囲指定が可能です。 薄橙色の部分でステートバリアのステートIDと防御するステートIDの配列を設定します。

戻る