【RGSS3】改変命中率計算上での回避不能ステート

せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by せくもん » 2019年5月31日(金) 22:36

いつもお世話になっております。

現在製作中のゲームで命中率と回避率の計算を一本化する為に
Game_Battler 468行目以降を下記のように改変しました。

#--------------------------------------------------------------------------
# ● スキル/アイテムの命中率計算
#--------------------------------------------------------------------------
def item_hit(user, item)
rate = item.success_rate * 0.01 # 成功率を取得
rate += (user.atk + user.luk + self.def) * 0.01 if item.physical? # 物理攻撃:命中率を加算
rate += (user.mat + user.luk + self.mdf) * 0.01 if item.magical? # 魔法攻撃:命中率を加算
rate -= (self.atk + self.agi) * 0.01 if item.physical? # 物理攻撃の回避率
rate -= (self.mat + self.agi) * 0.01 if item.magical? # 魔法攻撃の回避率
return rate # 計算した命中率を返す
end
#--------------------------------------------------------------------------
# ● スキル/アイテムの回避率計算
#--------------------------------------------------------------------------
def item_eva(user, item)
return 0
end

これにより、敏捷性や運を変動させる装備品やスキルの重要度はかなり上がったのですが
回避不能ステートの作り方が分からず行き詰ってしまいました。
『眠りや麻痺の時は命中率1%のスキルでも必中する』状態にするためには
どの様に手を加えたらよろしいでしょうか?

ぽんぽこねるそん
記事: 53
登録日時: 2018年10月26日(金) 12:24

Re: 【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by ぽんぽこねるそん » 2019年5月31日(金) 23:43

せくもんさん、こんにちは。

ステートの行動制約が「行動できない」のステートになっているときに
絶対に被弾するようにするなら

コード: 全て選択

class Game_Battler < Game_BattlerBase
  alias immovable_item_hit item_hit
  def item_hit(user, item)
    movable? ? immovable_item_hit(user, item) : 1
  end
  alias immovable_item_eva item_eva
  def item_eva(user, item)
    movable? ? immovable_item_eva(user, item) : 0
  end
end

こんな感じです。
行動はできるけど絶対に被弾してしまうようなステートにしたいなら

コード: 全て選択

class Game_Battler < Game_BattlerBase
  alias absolutely_item_hit item_hit
  def item_hit(user, item)
    absolutely_hit? ? 1 : absolutely_item_hit(user, item)
  end
  alias absolutely_item_eva item_eva
  def item_eva(user, item)
    absolutely_hit? ? 0 : absolutely_item_eva(user, item)
  end
  def absolutely_hit?
    feature_objects.any? {|item| item.note.include?("<絶対被弾>")}
  end
end

こんな感じでステートのメモ欄に

コード: 全て選択

<絶対被弾>

と記述してください。
(下のスクリプトはステート以外の特徴を持つオブジェクトに記述しても機能します)
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by せくもん » 2019年6月03日(月) 23:21

ぽんぽこねるそん様、ご返答ありがとうございます。
下のスクリプトを使用する事でガード時やかばうの時も回避不能に出来るようになりました。

ところで、こちらのスクリプトに手を加える事で『絶対攻撃失敗』や
『物理攻撃や魔法攻撃を一時的に必中状態にする』ステートなどが作れそうな気がするんですけど
よろしければコードの詳細を教えて頂けませんでしょうか?
absolutely_hit? ?の後の0や1で強制的に0%や100%の状態を作り出している
…という認識でよろしいのでしょうか?
ぽんぽこねるそん
記事: 53
登録日時: 2018年10月26日(金) 12:24

Re: 【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by ぽんぽこねるそん » 2019年6月04日(火) 23:35

せくもんさん、こんにちは。
まずスクリプトの修正があるのでお手数ですが差し替えをお願いします。
そのままだと絶対命中する状態だと味方の失敗率のあるスキル/アイテムまで
絶対に命中するようになってしまっていたので
対象が味方のものは元の命中率/回避率になるように修正しました。

コード: 全て選択

class Game_Battler < Game_BattlerBase
  alias absolutely_item_hit item_hit
  def item_hit(user, item)
    absolutely_hit?(item) ? 1 : absolutely_item_hit(user, item)
  end
  alias absolutely_item_eva item_eva
  def item_eva(user, item)
    absolutely_hit?(item) ? 0 : absolutely_item_eva(user, item)
  end
  def absolutely_hit?(item)
    item.for_opponent? && feature_objects.any? {|item| item.note.include?("<絶対被弾>")}
  end
end


それでコードの詳細ですが
absolutely_hit?(item)で
スキル/アイテムの敵かつ自身の特徴を持つオブジェクトのいずれかのメモ欄の中に<絶対被弾>
という文字列があるか判定しています。

コード: 全て選択

absolutely_hit?(item) ? 1 : absolutely_item_hit(user, item)


コード: 全て選択

if absolutely_hit?(item)
  1
else
  absolutely_item_hit(user, item)
end

と同じです。
条件を満たしていれば1をそうでなければ元の結果を返しています。
命中と回避は1で絶対成功0で絶対失敗になります。

『絶対攻撃失敗』や『物理攻撃や魔法攻撃を一時的に必中状態にする』は
使用者・対象者どちらの状態なのでしょうか?
(攻撃が失敗してしまうようになってしまうのか攻撃が効かなくなるのか)
前者なら使用者に対して同じような感じでやればいいです。
こんな感じです。

コード: 全て選択

class Game_Battler < Game_BattlerBase
  alias user_failure_item_hit item_hit
  def item_hit(user, item)
    user.absolutely_failure? ? 0 : user_failure_item_hit(user, item)
  end
  def absolutely_failure?
    feature_objects.any? {|item| item.note.include?("<絶対失敗>")}
  end
end


こんな感じでよろしいでしょうか。
つたない説明で申し訳ないです。
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by せくもん » 2019年6月05日(水) 22:46

ぽんぽこねるそん様、ご返答ありがとうございます。
教えて頂いた詳細を元に注釈を加えてみました。

class Game_Battler < Game_BattlerBase
alias absolutely_item_hit item_hit # 計算した命中率を無視
def item_hit(user, item) # 相手の命中率
absolutely_hit?(item) ? 1 : absolutely_item_hit(user, item) # 100%にする
end
alias absolutely_item_eva item_eva # 計算した回避率を無視
def item_eva(user, item) # 自分の回避率
absolutely_hit?(item) ? 0 : absolutely_item_eva(user, item) # 0%にする
end
def absolutely_hit?(item) # 条件を満たした場合、上記処理を実行
item.for_opponent? && feature_objects.any? {|item| item.note.include?("<絶対被弾>")} # 相手が敵&メモ欄に記載
end
end

この様な認識で間違いないでしょうか?


『絶対攻撃失敗』についてはこちらの説明不足でしたね、すいません。
ディフォルトにある『暗闇ステート』の上位互換で『攻撃が失敗してしまうようになる』を想定していました。
ですから、後から書いて頂いたコードで問題ありません。
どうもありがとうございます。
ぽんぽこねるそん
記事: 53
登録日時: 2018年10月26日(金) 12:24

Re: 【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by ぽんぽこねるそん » 2019年6月07日(金) 00:50

うーん、何か微妙に違うような気がします。
説明を付けるとすると

コード: 全て選択

class Game_Battler < Game_BattlerBase
  alias absolutely_item_hit item_hit#元の処理を退避
  def item_hit(user, item)#スキル/アイテムの命中率計算を再定義
   #条件を満たした場合1をそうでない場合元の処理の結果を返す
    absolutely_hit?(item) ? 1 : absolutely_item_hit(user, item)
  end
  alias absolutely_item_eva item_eva#元の処理を退避
  def item_eva(user, item)#スキル/アイテムの回避率計算を再定義
   #条件を満たした場合0をそうでない場合元の処理の結果を返す
    absolutely_hit?(item) ? 0 : absolutely_item_eva(user, item)
  end
  def absolutely_hit?(item)#スキル/アイテムが必ず当たる状態か判定
   #スキル/アイテムの効果範囲が敵かつメモ欄に記述がある場合真を返す
    item.for_opponent? && feature_objects.any? {|item| item.note.include?("<絶対被弾>")}
  end
end

こんな感じです。
item.for_opponent?は相手が敵かどうかではなく
スキル/アイテムの効果範囲を調べています。
(使用者が敵かどうかだと混乱している味方に攻撃された時に困るので)
再定義した処理は条件に関わらず実行されて
条件を満たしていたら1なり0をそうでなかったら元の処理の結果を返します。
(条件を満たした場合は計算した値を無視するのではなく計算せずに1なり0を返しています)
せくもん
記事: 72
登録日時: 2018年6月09日(土) 21:48

Re: 【RGSS3】改変命中率計算上での回避不能ステート

投稿記事by せくもん » 2019年6月10日(月) 22:21

ぽんぽこねるそん様、ご返答ありがとうございます。

スクリプトを勉強しながらゲームを制作しているので
分かりやすく解説頂いて、とても助かりました。

どうもありがとうございます。

“VX / Ace:質問” へ戻る