確率との戦いと戦いにおける確率

アイテム図鑑を埋めれば、真のエンディングが現れる・・・
そんな噂を信じ、アイテムを狩り続けて残りはひとつ。

【火竜の逆鱗】

氷竜の逆鱗も雷竜の逆鱗も結構すぐ出たんだが、なぜか火竜だけ出ない。
25回くらい倒したけど出ない。

もういいや。かげろうです。
世界樹、面白かったけどかゆいところに手が届かないゲームだね。
竜を倒すのにバード必須。一から育て直し。
だったらラスボス撃破後でいいから経験値10倍装備みたいなのくれ。
ホーリーギフト?なにそれおいしいの?

あと、迷宮内でワープがやたら頻発するのもどうかと思った。
どういう原理だよ。

つーかね、アイテム欄3段目は全部条件ドロップにしとけよ!!
10ターン撃破で逆鱗入手とかだったら頑張るから!!


というわけで、今日は逆鱗にちなんで「確率」をテーマにします。
せめて自分が作るゲームでは
プレイヤーが確率に翻弄されるようなことの無いよう。

RGSS2講座、第二回目は『確率を操る』


1.逃走成功率

最初に逃走成功率から。
大半のRPGって、逃走できるかどうかに、確率が使われていますよね。
たしかにダンジョンに潜って生きるか死ぬかの状況で、
一か八か「逃げる」を選択、かろうじて逃げ延びたが次はわからない・・・
このハラハラ感はありだと思います。

でも例えば、全然死ぬ心配のないダンジョンとか、
あえて相手に戦いを仕掛けに行っている場合とか、
あきらかに100%逃げられてしかるべき状況ってありますよね。

どうぞ、100%逃げられる仕様にしてください。

まず「Scene_Battle」の
「●逃走成功率の作成」および「●逃走の処理」を見ます。
逃走成功率

#--------------------------------------------------------------------------
# ● 逃走成功率の作成
#--------------------------------------------------------------------------
def make_escape_ratio
 actors_agi = $game_party.average_agi
 enemies_agi = $game_troop.average_agi

 @escape_ratio = 150 - 100 * enemies_agi / actors_agi
end

まず赤い2行を見ましょう。
actors_agi = $game_party.average_agi
enemies_agi = $game_troop.average_agi

「average」とは平均。つまり、
味方の敏捷性の平均(=actors_agi)と
敵の敏捷性の平均(=enemies_agi)を計算しているのです。

そして青い行。これが今回の肝、逃走成功確率です。
@escape_ratio = 150 - 100 * enemies_agi / actors_agi
つまり
150 - ( 100 × ( 敵の敏捷性の平均 ÷ 味方の敏捷性の平均 )
これが、ツクールVXにおける逃走成功率の算出式です。


続いて、逃走の処理を見てみましょう。

#--------------------------------------------------------------------------
# ● 逃走の処理
#--------------------------------------------------------------------------
def process_escape
 @info_viewport.visible = false
 @message_window.visible = true
 text = sprintf(Vocab::EscapeStart, $game_party.name)
 $game_message.texts.push(text)
 if $game_troop.preemptive
   success = true
 else
   success = (rand(100) < @escape_ratio)
 end

 Sound.play_escape
 if success
   wait_for_message
   battle_end(1)
 else
   @escape_ratio += 10
   $game_message.texts.push('\.' + Vocab::EscapeFailure)
   wait_for_message
   $game_party.clear_actions
   start_main
 end
end


まずは赤い部分。
if $game_troop.preemptive
  success = true
else
  success = (rand(100) < @escape_ratio)
end


「preemptive」は「先制の」
つまり、上2行は『先制攻撃だったら100%逃走可能』という意味です。
問題は、先制攻撃じゃない場合。

@escape_ratioは先ほど求めた逃走成功率。
rand(100)は、「0~99までのランダムな値」です。

rand(100) より @escape_ratio の方が大きければ success = true になります。
つまり、先ほどの計算で逃走成功率が100以上であれば、
100%逃走することが可能だというわけです。

さらに、青い行を見てみます。
@escape_ratio += 10
これは何をしているのかというと、
なんと、逃げられなかった場合に逃走成功率を10UPしています。
この仕様は知らなかった人が多いのではないでしょうか。
つまり、どれだけ敏捷性に差があろうと、ツクールVXのデフォ仕様では
11回逃走を試みれば100%逃走可能なのです。


ここまでの話を簡単にまとめると、
『味方の敏捷性の平均が敵の2倍以上あれば100%逃走可能』
『味方の敏捷性の平均が敵の3分の2以下であれば100%逃走不可能』
『ただし逃走に失敗しても成功率が上がり、11回で確実に逃走できる』
ということになります。

3分の2以下であれば100%逃走不可能って結構鬼畜じゃね

つーわけで、どんどん変えましょう。
@escape_ratio = 150 - 100 * enemies_agi / actors_agi
↑この部分を、自由に変えちゃえばいいのです。

例:
@escape_ratio = 100  #常に100%逃走可能
@escape_ratio = 50   #常に50%逃走可能

#敏捷が敵の2倍で100%、同等で50%、半分で25%
@escape_ratio = 50 * actors_agi / enemies_agi

こんなもんが妥当なところでしょうか。
ただ、敏捷性だけでは面白くないので、今回は
初心者にオススメのとっておきテクニックを紹介します。

◆スイッチor変数を使う

$game_switches[]でスイッチが、
$game_variables[]で変数が使用可能です。
これを利用することで、
「特定のスイッチがオンの時のみ100%逃走可能」
「逃走率をそのまま特定の変数にする」
というようなアクロバティックな設定が可能です。

例:基本はデフォ通りだが、スイッチ1がオンの時だけ100%逃走可能
if $game_switches[1] == false
 @escape_ratio = 150 - 100 * enemies_agi / actors_agi
else
 @escape_ratio = 100
end

例:変数1の値をそのまま逃走率にする
@escape_ratio = $game_variables[1]

これで、運用の幅が広がったのではないでしょうか。
特に変数を利用する場合、他のイベントと組み合わせれば、
「ターン経過で逃走率が増加」
「逃走率がUPするアイテム」
等の仕様も作れるはずです。

もちろんこの場合、スイッチ1や変数1は空けておいてください。
言うまでもないですが、
$game_switches[2]にすればスイッチ2になります。



と、ここまで書いたところでさば缶さんに
ほぼ同様のスクリプトがあるのを発見。

今日の講座一体なんだったんだ


というわけで続きます。
次回は命中率、回避率、クリティカル率、エンカウント率などを
やれるところまで。

かげろうでした。


※注意:ブログの性質上スクリプトに全角スペースを乱用していますが、実際のスクリプト内で全角スペースを使用するとだいたいエラーの原因になります。半角スペースを使いましょう。


RGSS2講座目次

RGSS2講座第3回
スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR