カードワース検証:防御ボーナス乗算の仕様
防御ボーナスを重ねるとどうなるのか、調べてみてもはっきりしない。
もどかしい。どこかに検証データがあるのかもしれないが、見つからない。
ならばいっそと思い到り、自分で検証を行い、まとめてみた次第である。
検証の妥当性に興味が無い方は、一番下に結果だけまとめてあるので、そちらを見てほしい。当然ながら内部データの話なので、閲覧は慎重に。
・前提条件
・使用エンジンはCardWirth1.50
・防御ボーナスによる減衰前のダメージ算出として、古山シウ氏のCWダメージ計算機を使用する。
・実験方法
①被験体を用意する。被験体には実験ごとに違った防御ボーナスアイテムを持たせる。
②被験体に効果コンテントによる直値ダメージを与える。死亡していなかった場合、全回復して処理をループ。死亡した場合、処理を停止する。
③被験体のHPと効果コンテントの値を調整し、無限ループしたか、死亡したかによって、被験体が受けた最大ダメージを計測する。
④それによって得られた値と、CWダメージ計算機によって得られる値を比較することで、防御ボーナスが実際に軽減したダメージを算出する。
・実験1
HP8、防御ボーナス+1の被験体に直値4(最大8)の効果コンテントダメージを与える。
さて、最大値8を受けた場合でも防御ボーナスによって、8×0.9=7.2。
最大でも受けるダメージは7となり、無限ループが起きそうなものであるが、実際はどうか?
被験体はあっさりと意識不明になってしまった。
防御ボーナス+1は8ダメージを1点たりと軽減できていない。
※ちなみにCard WirthPY5.1で同実験を行った場合、無限ループとなる。どうやらこの時点で仕様が違うようである。
・実験2
HP10、防御ボーナス+1の被験体に直値5(最大10)の効果コンテントダメージを与える。
防御ボーナス+1が機能していない可能性を消す為に、上記の条件で実験を行う。
最大値10を受けた場合でも、10×0.9=9ダメージとなり、耐えるはずである。
今度は無限ループとなり、もちもちさんは一時間ほったらかしにしても元気にもちもちしていた。
防御ボーナス+1は10ダメージを9ダメージに軽減できた、という事である。
どうやら実ダメージではなく、ダメージ軽減値の側で小数点以下を切り捨てるらしい。
※PY5.1環境においては実ダメージ側で小数点以下を切り捨て
実験1の場合、おそらくこういう事なのだろう。
ダメージ軽減値=8×0.1=0.8 →小数点以下を切り捨てて0。
よって、0ダメージの軽減。
ダメージはそのまま8点となり、HP8のもちもちさんは意識不明になってしまった。
受けるダメージが10未満の場合、防御ボーナス+1は無意味である、と言える。
この結果を受けて、以降はダメージ倍率ではなく、ダメージ軽減率とダメージ軽減値をベースとして検証を進めていく。
・実験3
防御ボーナス+5、防御ボーナス+7の2つを持つ被験体に直値10(最大20)の効果コンテントダメージを与える。
防御ボーナスが乗算された際、軽減率がどうなるかを調べる実験である。
ダメージ軽減率は1-(0.5×0.3)=0.85、となりそうなものだが、
「丸め込みが行われるため、この通りにはならない」
という説がある。本当だろうか?
0.85であるならば20×0.85=17ダメージ軽減で3ダメージ
0.9であるならば20×0.9=18ダメージ軽減で2ダメージ
0.8であるならば20×0.8=16ダメージ軽減で4ダメージ
が、受けうる最大ダメージとなるだろう。
まずは被験体のHPを4として実験をとり行う。
無限ループとなった。つまり、受けうる最大ダメージは4未満である。0.8説は否定される。
次、被験体のHPを3とする。
0.9説であれば無限ループし、0.85説であれば被験体は意識不明になるはずである。
どうなるか?
哀れ、もちもちさんはあっさりと意識不明になってしまった。
最大ダメージは3だった、ということになる。よってダメージ軽減率は0.85。
ダメージ軽減率は小数点第二位まで有効である。
無敵化の事を考えればむしろ、ダメージ倍率が小数点第二位まで有効だから、ダメージ軽減率も必然的に小数点第二位まで有効になる、と考えるべきか。
・実験4
防御ボーナス+2、防御ボーナス+3、防御ボーナス+4の3つを持つ被験体に直値15(最大30)の効果コンテントダメージを与える。
今度は小数点第三位は有効であるか、を調べる実験となる。
もしも小数点第三位が有効であるならば
ダメージ倍率は、0.8×0.7×0.6=0.336となり
ダメージ軽減率は、1-0.336=0.664
ダメージ軽減値は、30×0.664=19.92 小数点以下切り捨てで19
最大ダメージは30-19=11になると予想できる。
小数点第三位が切り捨てられるのであれば、
ダメージ倍率は0.33。ダメージ軽減率は、1-0.33=0.67。
ダメージ軽減値は、30×0.67=20.1 小数点以下切り捨てで20
最大ダメージは30-20=10になると予想できる。
よって、被験体のHPを11にして、実験をとり行う。
結果は無限ループであった。一晩ほったらかしにして、朝起きた後も、もちもちさんは意識不明になることなく元気にもちもちしていた。
どうやら最大ダメージは11未満のようである。
ではHPを10にしてみるとどうだろう。
粘りに粘って、もちもちさんは意識不明になった。
最大ダメージは10であった事が判明した。これにより
ダメージ倍率およびダメージ軽減率の小数点第三位は切り捨てられる事が分かる。
有効なのは小数点第二位までである。
ここまで分かれば、もう充分だ。
・結論
ダメージ倍率=(1-防御ボーナス値A/10)×(1-防御ボーナス値B/10)……
……×(1-防御ボーナス値X/10)
※小数点第二位まで有効。小数点第三位は切り捨てる。
ダメージ軽減率=1-ダメージ倍率
ダメージ軽減値=ダメージ×ダメージ軽減率
※ダメージ軽減値の小数点以下を切り捨て、整数化する
実ダメージ=ダメージ-ダメージ軽減値
※PY5.1環境においてはダメージ×ダメージ倍率の結果から小数点以下を切り捨てて整数化している。
カードワースの戦闘における行動順
カードワースは数値隠蔽を行うことによって、プレイヤーがより物語を楽しめるようにデザインされたコンピューターゲームである。
本稿は内部の数値とゲームの仕様に関して記述しているので、閲覧には十分に注意してほしい。エンジン作者向けの内容となる。
まずはこちらをご覧いただきたい。
HAND氏による、カードワースの戦闘における行動順に関する検証がまとめられている。
結論から言うと、氏はカードワースエンジンの不可解な仕様に阻まれ、完全な仕様解明には至らなかった。
今回はこの不可解な仕様について、氏の検証データに対し、それなりに辻褄の合う仮説が得られたので、ここに記述する。あくまで仮説であることに注意してほしい。
・速度勝負のルール
まずは基本的な仕様を確認しよう。
カードワースの行動速度は敏捷+大胆+乱数(1d6)の値によって決定される。
PCが一人、敵が一人――つまりタイマン戦においては、PCの行動速度≧敵の行動速度が成立する場合、PCが先行となる。
お互いに6面ダイスをふって、その出目と自身のステータスによって、先手後手を決める勝負を行うわけである。本稿ではこれを速度勝負と呼ぶこととする。
ここで重要なのは
左辺:速度勝負を挑まれる側 右辺:速度勝負を挑む側
という構造が存在する事である。
PCの行動速度≧敵の行動速度という式は
速度勝負を挑まれた側の行動速度≧速度勝負を挑む側の行動速度と言い換えられる。
タイマン戦における行動速度差と先行率
敵の(敏捷+大胆)-PCの(敏捷+大胆) 敵の先攻率 -5以下 0% -4 2.8% -3 8.3% -2 16.7% -1 27.8% 0 41.7% 1 58.3% 2 72.2% 3 83.3% 4 91.7% 5 97.2% 6以上 100% 引用:タイマン戦闘におけるHAND氏の検証データ
同速の場合でも敵の先行率は50%とらなず、41.7%となる。
つまり速度勝負を挑まれる側の先行率が高くなる。
ポケモンの先手後手決定のような、公平な勝負ではない。
・不可解な仕様とは
行動速度が敏捷+大胆+乱数(1d6)によって決定し、PCの行動速度≧敵の行動速度の結果によって先手後手が決定する事は、タイマン戦においては立証されている。
上記の表から分かる通り、タイマン戦において敵の敏捷+大胆の値がPCより5以上低い場合、PCに対して先手をとることがない。乱数(1d6)がどんな値をとろうが100%後手となる、というわけである。
しかし、これがPC一人に敵が二人——タイマン戦でなくなった途端、不可解な事が起こる。下の引用を見てほしい。
実験1(Version1.50エンジン)
PC一人と敵2体(敵A、敵B)を並べ、どちらの敵が最も早く行動するかを調べる。
敵Aの(敏捷+大胆)=6、敵Bの(敏捷+大胆)=0に固定し、500ラウンド行動させる。 バトルエリアでの配置は、敵Aが奥、敵Bが手前である。 PCの(敏捷+大胆)を色々変えて実験した結果は以下の通り:
PCの(敏捷+大胆) 敵Aの先攻数 敵Bの先攻数 14 500 0 6 500 0 4 497 3 3 498 2 0 500 0 引用:非タイマン戦闘におけるHAND氏の検証データ
敵Aの敏捷+大胆は6、敵Bの敏捷+大胆は0である。
その差は6であり、乱数1d6がどのような値をとろうとも、絶対に敵Bは敵Aより先に動くことはない、と予想できる。
しかし、表を見て分かるとおり
PCの行動速度が4,3のとき、低確率(約0.5%)で敵Bが敵Aに先行して動いている。
これが問題となった不可解な仕様である。
・カードワースの行動順に対する仮説
ここからが、私の立てた仮説となる。
私はHAND氏の検証データから、カードワースの行動順の判定は以下のアルゴリズムに則って行われていると推測する。
前提条件:戦闘にはPC1,PC2,PC3……PC6、敵1、敵2……敵Xが参加している。
①PC1を暫定的に行動順一位とする。
行動順リストは今、こうなっている。
行動順一位:PC1
行動順二位:未定
行動順三位:未定
行動順四位:未定
・
・
行動順X位:未定
②その後PC2がPC1に対し、行動順一位の座をかけて速度勝負を挑む。お互いに1d6を振り、それを自身の敏捷大胆に加え、その大小を比べる。
PC2の行動速度がPC1より高いのであればPC2が行動順一位、同値か低いのであれば行 動順二位となる。
※仮にここではPC2がPC1に勝ったものとする。
行動順リストは今、こうなっている。
行動順一位:PC2
行動順二位:PC1
行動順三位:未定
行動順四位:未定
・
・
行動順X位:未定
③次はPC3が同じように、行動順一位の座をかけてPC2に速度勝負を挑む。勝てばPC3が行動順一位、PC2とPC1は一つ順位を繰り下げる。
負けた場合、PC3は二位のPC1に速度勝負を挑む。勝てばPC3は行動順二位に割り込み、負ければPC3は行動順三位となる。
暫定行動順一位から順番に速度勝負を挑み、勝てばその順番に割り込み……を誰かに勝つか暫定最下位になるまで行う。
という事である。
※仮にここではPC3がPC2に勝ったものとする。
行動順リストは今、こうなっている。
行動順一位:PC3
行動順二位:PC2
行動順三位:PC1
行動順四位:未定
・
・
行動順X位:未定
③のプロセスをPC4,5,6,敵1……敵Xの順番に、戦闘に参加する全てのキャラが行い、全てのキャラの行動順を決定する。
さて、このアルゴリズムに則って、HAND氏の実験1で起きた不可解な仕様を説明しよう。
前提条件
PC1、敵1、敵2が戦闘に参加している。
PC1の敏捷+大胆が4、敵1の敏捷+大胆が6、敵2の敏捷+大胆は0である。
まず① :PC1が行動順暫定一位となる。
次に② :PC2……は、いないので敵1がPC1に速度勝負を挑む。
PC1はダイスで6を出し行動速度10、敵1はダイスで1を出し行動速度7
PC1が勝利し、敵1は暫定行動順二位に収まる。
次に③ :敵2がPC1に速度勝負を挑む。
PC1はダイスで1を出し行動速度5、敵2はダイスで6を出し、行動速度6
敵2がPC1に勝利し、行動順一位に収まる。PC1と敵1は繰り下げである。
敵1VS敵2の速度勝負は行われない。
結果 :一番遅い敵2が最初に行動、PC1が二番目、一番早い敵1が最後に行動する。
つまり、PC1が敵1に勝ち、PC1が敵2に負けた場合、敵2が最初に行動する、という事が起こるのである。
発生確率は、PC1が敵1に勝つ確率:27.8%×PC1が敵2に負ける確率:2.8%=0.7%となる。
HAND氏の検証データの実測値、0.6%とほぼほぼ一致する。
実験1における不可解な仕様を説明できたと言えよう。
次に、HAND氏の実験2の結果について検討する。
実験2(Version1.50エンジン)
PC一人と敵数体を並べ、どの敵が最も早く行動するかを調べる。
敵Aの(敏捷+大胆)=6、PCの(敏捷+大胆)=14に固定し、500ラウンド行動させる。敵の数とPCの(敏捷+大胆)を変えて実験する。奥から敵A、B、C、D、Eの順で並んでいる。 試行結果は以下の通り:
敵の数 PCの(敏捷+大胆) 敵Aの先攻数 敵Bの先攻数 敵Cの先攻数 敵Dの先攻数 敵Eの先攻数 5 14 66 53 70 117 194 4 0 107 49 128 216 - 3 0 174 105 221 - - 事実としては以下の通り:
- 奥から2番目の敵が最も遅く行動する傾向にある。
- 一番手前の敵が一番早く行動する傾向にある。
引用:非タイマン戦闘におけるHAND氏の検証データ2
問題となっているのは、敵2の最速行動率が最も低いことである。
ここで思い出してほしいのが、行動順は速度勝負を挑まれた側が有利となる
フェアではない方法によって決定されている、という事だ。
敵の数3のケースを見てみよう。
※今回に関してはPCの存在は除外してよい。どのデータも敵と6以上速度が離れており、結果に影響を及ばさないからだ。
敵Aの最速行動率は、敵Bに挑まれて勝つ確率×敵Cに挑まれて勝つ確率となる。
58.3%×58.3%=約33%。データの実測値は約34%。
次、敵Bの最速行動率は敵Aに挑んで勝つ確率×敵Cに挑まれて勝つ確率となる。
重要なのは敵Aとの勝負において敵Bは挑む側であるという事である。
41.7%×58.3%=約24%。データの実測値は約21%。
最後、敵Cの最速行動率は簡単である。一位にいるのが敵A、敵Bにせよ、同速度勝負に勝てばよい。つまりそのまま41.7%。データの実測値は約44%。
HAND氏の実測に近い最速行動率を算出できた。
これが、敵Bの最速行動率が最も低い事のカラクリであると推測する。
気がかりなのはどのデータにおいても、敵Bの最速行動率の実測と試算との間に3%程の差が存在する事である。これを誤差と見るか、それとも何かを見落としているか。
・結論
HAND氏の検証において、問題となった点を解決した行動順アルゴリズムを推論できた。
- カードワースの戦闘における行動順は、PC1~敵1~敵Xの順に暫定的に判定している。
- 行動順は、暫定的に決定された行動順リストの一位から順番に、敏捷+大胆+1d6による速度勝負を都度行う事によって決定される。
あくまで氏の検証から得た推測であり、私個人は何の実験も行っていない事に注意してほしい。このアルゴリズムが、確定的に正しい、または間違っていることを実証する方法を思いつかなかったからである。なるべく楽で、決定的な結果を得られる実験を思いついた際には加筆を行う予定である。
もしかしたらとっくに正しいアルゴリズムが判明しているのかもしれないが……。