命中精度



武器に命中精度を設定し、通常攻撃時の命中率を操作します。

変更点
2016:03:01
・エネミーの場合、武器がない考慮が漏れていたので修正
・外部フラグ追加
・基本命中精度取得の引数変更

#==============================================================================
# ■ 命中精度 By 貪藻矢射妥←
# 
#   武器に命中精度を設定し、通常攻撃時の命中率を操作
# 
#==============================================================================
# 更新っぽいもの
# 
# 2016:03:01
# ・エネミーの場合、武器がない考慮が漏れていたので修正
# ・外部フラグ追加
# ・基本命中精度取得の引数変更

module DIAMOND
  # 命中率(属性と数値)
  #            S          A          B          C          D
  HIT_RATES = [[55,  75], [56,  80], [57, 100], [58, 150], [59, 180]]
  
  # 命中率(Default)
  # 100固定を推奨
  DEFAULT_HITRATE = 100
  
  #--------------------------------------------------------------------------
  # ● 基本命中精度取得
  #     user : 使用者
  #     flg  : 武器依存かどうか
  #--------------------------------------------------------------------------
  def get_hitrate_base(user, flg = true)
    
    base_hitrate = DEFAULT_HITRATE
    
    if user.is_a?(Game_Actor)
      if flg
        weapon = $data_weapons[user.weapon_id]
        for i in 0...HIT_RATES.size
          if weapon != nil && weapon.element_set.include?(HIT_RATES[i][0])
            base_hitrate =  HIT_RATES[i][1]
          end
        end
      end
      # Luk補正
      if MINTO::RGSS["parameter_addition"]
        return base_hitrate - [user.luk / 20, 5].max
      else
        return base_hitrate
      end
    else
      # Luk補正
      if MINTO::RGSS["parameter_addition"]
        return base_hitrate - [user.luk / 20, 5].max + 5
      else
        return base_hitrate
      end
    end
  end
end

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

class Game_Battler
  include DIAMOND
  include BM
  #--------------------------------------------------------------------------
  # ● 通常攻撃の効果適用
  #     attacker : 攻撃者 (バトラー)
  #--------------------------------------------------------------------------
  def attack_effect(attacker)
    # クリティカルフラグをクリア
    self.critical = false
    # 第一命中判定
    
    if $OuterFlgs["Weapon_HitRate"]
      base_hitrate = get_hitrate_base(attacker)
    else
      base_hitrate = 100
    end
    
    hit_result = (rand(base_hitrate) < attacker.hit)
    # 命中の場合
    if hit_result == true
      # 基本ダメージを計算
      atk = [attacker.atk - self.pdef / 2, 0].max
      self.damage = atk * (20 + attacker.str) / 20
      # 属性修正
      self.damage *= elements_correct(attacker.element_set)
      self.damage /= 100
      # ダメージの符号が正の場合
      if self.damage > 0
        # クリティカル修正
        if rand(100) < 4 * attacker.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        # 防御修正
        if self.guarding?
          self.damage /= 2
        end
      end
      # 分散
      if self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判定
      eva = 8 * self.agi / attacker.dex + self.eva / 80.0
      hit = self.damage < 0 ? 100 : 100 - eva
      
      # Luk補正
      if MINTO::RGSS["parameter_addition"] and attacker.is_a?(Game_Enemy)
        hit = [hit - self.luk / 40.0, 5].max
      end
      
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(base_hitrate) < hit)
    end
    # 命中の場合
    if hit_result == true
      # ステート衝撃解除
      remove_states_shock
      # HP からダメージを減算
      self.hp -= self.damage
      # ステート変化
      @state_changed = false
      states_plus(attacker.plus_state_set)
      states_minus(attacker.minus_state_set)
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      self.damage = MISS_WORD
      # クリティカルフラグをクリア
      self.critical = false
    end
    # メソッド終了
    return true
  end
  #--------------------------------------------------------------------------
  # ● スキルの効果適用
  #     user  : スキルの使用者 (バトラー)
  #     skill : スキル
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)
    # クリティカルフラグをクリア
    self.critical = false
    # スキルの効果範囲が HP 1 以上の味方で、自分の HP が 0、
    # またはスキルの効果範囲が HP 0 の味方で、自分の HP が 1 以上の場合
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
       ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # メソッド終了
      return false
    end
    # 有効フラグをクリア
    effective = false
    # コモンイベント ID が有効の場合は有効フラグをセット
    effective |= skill.common_event_id > 0
    # 第一命中判定
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    
    if $OuterFlgs["Weapon_HitRate"]
      base_hitrate = get_hitrate_base(user)
    else
      base_hitrate = 100
    end
    
    hit_result = (rand(base_hitrate) < hit)
    # 不確実なスキルの場合は有効フラグをセット
    effective |= hit < 100
    # 命中の場合
    if hit_result == true
      # 威力を計算
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # 倍率を計算
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # 基本ダメージを計算
      self.damage = power * rate / 20
      # 属性修正
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # ダメージの符号が正の場合
      if self.damage > 0
        # 防御修正
        if self.guarding?
          self.damage /= 2
        end
      end
      # 分散
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # 第二命中判定
      eva = 8 * self.agi / user.dex + self.eva / 80.0
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      
      # Luk補正
      if MINTO::RGSS["parameter_addition"] and user.is_a?(Game_Enemy)
        hit = [hit - self.luk / 40.0, 5].max
      end
      
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(base_hitrate) < hit)
      # 不確実なスキルの場合は有効フラグをセット
      effective |= hit < 100
    end
    # 命中の場合
    if hit_result == true
      # 威力 0 以外の物理攻撃の場合
      if skill.power != 0 and skill.atk_f > 0
        # ステート衝撃解除
        remove_states_shock
        # 有効フラグをセット
        effective = true
      end
      # HP からダメージを減算
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # ステート変化
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # 威力が 0 の場合
      if skill.power == 0
        # ダメージに空文字列を設定
        self.damage = ""
        # ステートに変化がない場合
        unless @state_changed
          # ダメージに "Miss" を設定
          self.damage = MISS_WORD
        end
      end
    # ミスの場合
    else
      # ダメージに "Miss" を設定
      self.damage = MISS_WORD
    end
    # 戦闘中でない場合
    unless $game_temp.in_battle
      # ダメージに nil を設定
      self.damage = nil
    end
    # メソッド終了
    return effective
  end
end
カスタマイズポイント 薄緑色の部分にて命中精度の属性IDとその命中精度のセットを記述します。 HIT_RATES = [[属性, 命中精度], ...] あとは武器にその属性を設定するだけです。 ※実は2つ以上の命中精度を設定してもエラーを返さないという・・・  (そのうち直します。)

戻る