手札自動選択ルーチンの改良
どの程度まで賢い行動をしてくるかがよくわからない。
- 無効な行動をしない事については実装済み。
- 意識不明の対象を優先的に回復するという行動は未実装。
Comments (82)
-
reporter -
reporter 重症時は逃走を優先して行う。実装。
-
reporter 沈黙効果は魔法を使う相手を優先で狙う? 要検証。
-
reporter 検証したが、沈黙効果のターゲットはランダムであると思われる。
-
reporter - marked as minor
ある程度出来上がっているように思われるので優先度を下げる。
-
reporter これはCWには無い思考法ですが、麻痺したキャラクターに対する麻痺治療は優先行動とするべきでは?
その問題点は、ウンディーネ等の行動の正確性が上がって戦闘バランスが変わる事です。様子を見て問題なさそうであれば実装。
-
reporter CWに無い思考法のアイデア。キーコードが適用可能なカードを自動選択するとよいのでは?(例えば鑑定キーコードが有効な敵に盗賊の眼を自動使用するなど)
問題としては、現在でも武器が効かない・魔法が効かない相手を自動選択で判別できるように、どのキーコードが有効かが自動選択で判断できるようになる点でしょうか。また、いわゆるキーコード防御のためのキーコードイベントに引っかかってしまうなど。
-
https://twitter.com/hand_cw/status/528955730271825920/photo/1 雑な検証で申し訳ないですが手札を処理する順序がCW1.28/1.50とCWPyで逆になっていると見受けられます。
-
reporter はじめまして。検証ありがとうございます。
お察しの通りcwpyの計算のいくつかは外部から仕様を推測する形で作成しているので、こうした実験をしていただけると非常に助かります。
敵の行動の変化でバランスがだいぶ変わってしまうようで、戦闘シナリオでは特に問題ですね。β期間中にできるだけ合わせていく事にします。
-
reporter - pull request
#637 - 上の修正をマージしたテスト版
気づくのが遅れてしまい申し訳ないのですが、CardWirthの内部アルゴリズムについていくつもの記事を公開されているHAND様ですね。おそらく、HAND様の検証と記事が無ければ、能力判定分岐をCWに合わせる作業が著しく困難なものになっていたと思います。本当にありがとうございます。
問題の手札選択ルーチンについてですが、単に順序を逆にしただけではカード交換の確率や適性の影響力などで1.50と違いが大きかったため、先ほどHAND様のカードの自動選択についての記事を参考に書き直しました。まだ1.50と数%くらいの差が出ているような感じですが、傾向としてはほとんど同じになったのではないかと思います。よろしければご確認ください。
- pull request
-
reporter - attached selecthand_test.py
-
reporter CWPyから当該アルゴリズム部分を試験用に抜き出したコードを添付しました。
-
ソースを確認して再度実験してみました。 どうもファンブルが無いほうがCW1.50の手札選択に近づくようです。
-
reporter ご確認ありがとうございます。ということは、2D6を振ったあとで判定値を出すために再度振り直しているのですね。今はちょっと時間がないので後で変更します。
ついでながら、1.28以降ではキャラクターの状態によって優先的に選択される行動がいくつかあることがわかっています。私の知る限りですが:
- 意識不明者がいる場合は、回復系の効果を持つキャラクターが最優先で回復を選択する。
- 重症の場合は絶対に逃走を選択する。
そして1.の場合、誰か一人でも意識不明者の回復を選択すると、他の誰かがその意識不明者に重ねて回復をかけることはどうも絶対に無いようです(たぶんバグ)。
意識不明と同じように(それ以上に?)重大な麻痺はさして重要視されてはいないようでした(なので麻痺者にウンディーネが飛んでくるとは限らない)。
-
reporter すいません、言葉の解釈が間違っていますね。ファンブルが無いというのは「1ゾロが出たのでこのカードは選択されない」というのが無い、という意味ですね。
そうであれば、最大のものより22以上適性値が低いカードが絶対選択されないという現象とも整合します(適性が0であればダイス2個で選択値は最大でも12となり、(22/2)*2D6の最小値である13位上になる事は絶対に無い)。
その線で実験して実装を変更してみます。
-
reporter 行動力についてですが、もし行動力が全てのカードに影響するのであれば、アルゴリズム上、影響は全くありません。
しかし、効果時間や召喚獣の使用回数などに対する行動力ボーナスの影響は、技能カードでは発生し、アイテムカードや召喚獣カードでは発生しないことが分かっています。もしも影響があるとすればその線でしょうか。
-
reporter - attached selecthand_test_ver2.py
試行用スクリプトver2を追加。
-
reporter - pull request
#638 - 上の変更をマージしたテスト版
ファンブル無しで試行してみたところ、ツイートされた検証結果と誤差の範囲内で一致するようなので、そのように変更しました。
- pull request
-
reporter 行動力についてですが、もし行動力が全てのカードに影響するのであれば、アルゴリズム上、影響は全くありません。
そんなわけがない……。例えば全体の適性が+10されると、適性が22以上離れていても選択されるようなパターンが発生するかもしれません。
-
reporter 行動力を変化させての試行結果です(各1000回)。どうやら行動力の影響は無さそうです。
全て適性6の場合は行動力が低いほどスキルの選択率が高い傾向が出たように見えましたが、もう1000回ずつ試行したところ誤差と分かりました。
全て同じ適性(6)の場合 行動力-10 exchng: 5 + 7 item 1: 192 + 229 item 2: 189 + 182 item 3: 180 + 183 item 4: 157 + 135 item 5: 145 + 153 skill1: 132 + 111 行動力±0 exchng: 6 + 5 item 1: 222 + 190 item 2: 179 + 176 item 3: 168 + 196 item 4: 166 + 154 item 5: 134 + 147 skill1: 125 + 132 行動力+10 exchng: 6 + 10 item 1: 239 + 230 item 2: 216 + 174 item 3: 159 + 166 item 4: 125 + 132 item 5: 141 + 155 skill1: 114 + 133 適性が異なる場合(skill1のみ19、その他は6) 行動力-10 exchng: 0 item 1: 17 item 2: 17 item 3: 15 item 4: 18 item 5: 10 skill1: 923 行動力±0 exchng: 0 item 1: 25 item 2: 21 item 3: 25 item 4: 19 item 5: 14 skill1: 896 行動力+10 exchng: 0 item 1: 21 item 2: 24 item 3: 14 item 4: 27 item 5: 16 skill1: 898
-
reporter - attached sel_tester.zip
選択テストに使用したシナリオを追加。
-
reporter Issue 189の報告より。
CWではカード効果を個別に、上から順に見て対象の絞り込みを行っているそうです。
これに合わせるかは検討を要します。個人的な考えでは、おそらくバランスはほとんど変わらないと思います。ギミック戦闘などでそのルーチンがシビアに運用される事があるかが問題です。
-
reporter Issue
#189より引用。以下のような理由で効果ごとに判断している件に対応します。確かにバランスが大きく変化するものではないので、その観点からはスルーでも良いと思います。 中毒者を優先的に回復とか、不死者を優先的に攻撃する召喚獣が多少アホの子になりますけれど、 それもまた良し!(笑;アホの子ほどかわいい)
ああ、いえ、すいません、そこまで考えてカードを作っている方がいらっしゃるのであれば話は別です。私の認識が甘かったです。対応した方がいいですね。実は今日くらいに0.12.2をリリースするつもりだったのですが、少し伸ばして対応しましょう。
-
reporter pull request
#741 -
多分1.28以前からだったと思いますが、重傷PCへの優先回復行動があると思います。 簡易ですが検証してみました。
テスト方法:行動不能の敵を用意し、賢者の杖と傷薬を持たせたレベル10PCを 重傷(最大値ダメージ→固定1回復)/負傷(固定50ダメージ、残ゲージ40%程度)/軽傷(固定1ダメージ)にして 20ラウンド自動選択結果を見る。傷薬を選んだ場合、カード交換を選択し直す。
1.50:[重傷]20回すべて傷薬を選んだ/[負傷]賢者の杖1 攻撃10 渾身4 防御2 見切り3/[軽傷]賢者の杖1 傷薬1 攻撃11 渾身5 防御1 見切り1
Py:[重傷]賢者の杖1 攻撃9 渾身6 見切り4/[負傷]攻撃11 渾身4 見切り3 防御2/[軽傷]賢者の杖1 傷薬1 攻撃8 渾身4 見切り5 防御1
※攻撃割合が高いのは適性考慮外で筋力が高く器用さが低いPCを使ってしまったため
以上から意識不明だけではなく重傷時にも回復優先ロジックがあると思われます。 負傷~軽傷時も検証したのは軽微なダメージなのに回復行動が優先選択されがちだと思っていたのですが、 どうも気のせいだったようです。 追記:数字が合っていなかったので修正
-
reporter 検証していただきありがとうございます。意識不明ではなく重症以下が優先行動のトリガーでしたか。行動内容としては、単純に「条件を満たしたら誰かが絶対にその行動を取る」というもので間違いなさそうですね。
調査結果に合わせて重症で回復行動を取るように変更します。
-
reporter と思って実装前に手許で調査してみたのですが、どうも誰かが重傷なら必ず回復行動を取るというわけではなさそうです。重傷の敵と軽傷の敵を並べ、軽傷の敵に傷薬を持たせてみたところ、回復行動を取らない事がしばしばあります。反面、傷薬を使おうとした時は必ず重傷者を対象に選択します。また、重傷と意識不明であれば必ず意識不明者が選択されるようです。
もう少し時間をかけて調べたほうがよさそうです。他の不具合への対処を行ってから再調査します。
-
なるほど、昨日のif分にさらっと追加すればいいのかなと思っていたらそう簡単にはいかないのですね。 かえってタスクを増やしてしまったようで申し訳ないです。 自分の方でも2体のPCでやってみます。
-
reporter 別件が一段落したので詳細に調べてみます。
確率の問題だとしたら、たぶん2D6とかのサイコロが絡んだ計算式で回復行動を選択する確率が計算されているのではないかと思います(CWでは内部的には必ずそういう風に計算するので)。
-
PC2体で今度は片方に傷薬と癒身の法を持たせてやってみました。 重傷者または意識不明者が居る場合はやはり100%(体感で)回復カードが選ばれました。 傷薬と癒身の法どちらが選ばれるかはランダムのようでした。
敵の場合は違うのかと思って同じようにやってみました。 はじめコボルト2体を用意し、片方を最大値→固定1回復で重傷にする付帯能力を持たせ、 片方に使用回数無限にした傷薬を持たせてやってみたところ、 確かに、重傷なのに傷薬を選ばない場合がありました。 ところで、コボルトはHPが低すぎて固定1回復で負傷まで回復する場合がしばしばありました。 なのでHPが多いオークに重傷役を変えたところ、毎回コボルトが傷薬を選んでくれるようになりました。
この結果が示すところは単に重傷・負傷という判定ではなく残HPのパーセンテージで判定している、とかでしょうか…? とりあえず先をこされないよう(笑)書いておきます。
追記:コボルトのHPを段階的に増やして見比べたところ、HP11でほぼ傷薬が選ばれるようになりました。 計算式は知らないのですが、べくとる庵の情報により固定回復1点の振れ幅を1~2と仮定すると条件は「HPが1/10以下」あたりでしょうか。 ただ、HP10の検証をしている時にゲージが1メモリの半分ぐらいの時に回復をせず、1メモリ分ぐらいの時に回復を選んだのが気になります。(ゲージはあまり正確ではない?)
-
reporter 確かに体力の割合によって確率が高まるようです! しかも重傷かどうかは関係がないようです。
レベル8のキャラクターに3枚の傷薬と3枚の緑丸適性のアイテムを交互に持たせて負傷した味方を回復するか実験しました。
傷薬の適性が緑丸(普通)の場合
- 味方の体力10/100 → 選択率:100/100
- 体力20/100 → 選択率:74/100
- 体力21/100 → 選択率:83/100
- 体力:50/100 → 選択率:36/100
- 体力:99/100 → 選択率:19/100
傷薬の適性が黒丸(最悪)の場合
- 体力:1/100 → 選択率:100/100
- 体力:10/100 → 選択率:75/100
- 体力:20/100 → 選択率:8/100
- 体力:50/100 → 選択率:2/100
- 体力:99/100 → 選択率:0/100
- 体力:100/1000 → 選択率:78/100
どうも体力の残量によって回復を選ぶ確率が高まっていく計算式がありそうです。
-
reporter データ追加。どうも残り体力が4割の時の確率が回復以外の効果のカードを使用する確率とほぼ一致しそうです。大雑把にいって次のような考え方になっていると思われます。
- 4割より負傷度が大きいほど回復の確率が上がる
- 4割より負傷度が低いほど回復の確率が下がる
適性が緑丸(普通)の場合
- 体力:10/100 → 選択率:100/100
- 体力:20/100 → 選択率:74/100
- 体力:21/100 → 選択率:83/100
- 体力:30/100 → 選択率:75/100
- 体力:40/100 → 選択率:44/100
- 体力:50/100 → 選択率:36/100
- 体力:99/100 → 選択率:19/100
参考:効果を攻撃に変えた場合の選択確率:47/100
適性が黒丸(最悪)の場合
- 体力:1/100 → 選択率:100/100
- 体力:10/100 → 選択率:75/100
- 体力:20/100 → 選択率:8/100
- 体力:30/100 → 選択率:4/100
- 体力:40/100 → 選択率:1/100
- 体力:50/100 → 選択率:2/100
- 体力:99/100 → 選択率:0/100
- 体力:100/1000 → 選択率:78/100
参考:効果を攻撃に変えた場合の選択確率:1/100
-
reporter データを追加します。
レベル1で全適性値が6のキャラクターが回復アイテムを1枚持っている場合
- 体力: 6% → 選択率:500/500
- 体力: 7% → 選択率:500/500
- 体力: 8% → 選択率:499/500
- 体力: 9% → 選択率:497/500
- 体力:10% → 選択率:486/500
- 体力:11% → 選択率:475/500
- 体力:12% → 選択率:442/500
- 体力:13% → 選択率:448/500
- 体力:14% → 選択率:390/500
- 体力:15% → 選択率:396/500
- 体力:16% → 選択率:362/500
- 体力:17% → 選択率:355/500
- 体力:18% → 選択率:358/500
- 体力:19% → 選択率:339/500
- 体力:20% → 選択率:301/500
- 体力:21% → 選択率:287/500
- 体力:22% → 選択率:285/500
- 体力:23% → 選択率:271/500
- 体力:24% → 選択率:283/500
- 体力:25% → 選択率:238/500
- 体力:30% → 選択率:204/500
- 体力:40% → 選択率:161/500
- 体力:50% → 選択率:124/500
- 体力:70% → 選択率:105/500
- 体力:90% → 選択率:97 /500
参考:攻撃の場合
- 169/500
-
reporter - attached selecthand_test_ver3.py
検証に使ったシナリオです。
開始するとバトルがスタートし、1ラウンド目で500人の回復役が行動を行い、回復カードを使用した回数が記録されて2ラウンド目冒頭で表示されます。
そうして上に書いたデータを得て、今回の件以外の手札選択確率にぴったりと合うテスト用プログラムに体力パラメータを入れる形で色々と手を入れてみているのですが、上のデータに合う計算式はまだ作れていません。
-
reporter - attached 回復テスト.zip
あれ、シナリオの方が消えた。
改めて追加します。
-
HAND氏の「カード交換は適性値-6されている」「適性値22以上離れたカードは選択されなくなる」という情報から、 ふと思いついてXeditorで逃走可に設定、体力5/100、精神的特徴を0、賢者の杖と傷薬を持たせたコボルトの知力の値をバイナリエディタで15以上にしてみました。 すると賢者の杖、混乱、カード交換、逃走以外が選択されなくなりました。知力70前後にすると逃走が絶対選択されることもなくなりました。 これは副次的ですが、体力20/100、知力15にしてみると不正な値にしなくても重傷で逃走が絶対選択されなくなりました。
検証シナリオは、うちのマシンではフリーズしてしまい、データを出せずまたもやふわっとした仮説で申し訳ないですが、 逃走と回復優先処理はHP割合が低下するほど適性値に特定の値が加算されていくようなロジックなのではないでしょうか。 意識不明者への回復の適性値は相当高く設定されているようで傷薬を使わなくなるには知力200前後必要でした。
-
reporter - attached healbonus.png
暗黒騎士様の推定に沿って、データを増やして勾配をグラフにしてみました。試行数は全て500回となっていますが、実際には500を1セットとして複数回実行して結果を平均したものがあります。
適性ボーナス列には、
selecthand_test_ver3.py
で適性値(vocation
)にどの程度の値を足したら表の回復数と一致するか試してみた結果、よく合いそうな値を入れています。見た感じ、どうも三角関数が絡んできそうな勾配になっています。その線でどういう計算式になるか調べてみます。
また、
- 残り32%以下と33%以上に明確な差があり、おそらく33%以上50%未満がその他のカードと同様の選択率になる
- 残り50%未満と50%以上の間に断崖がある。適性ボーナスが整数では計算が合わない。50%以上は計算式が違う?
といったことが分かります。
-
回復テスト.zip、1.20エンジンでパーティー入れ替えながら実験しました。
10戦ほどやってみましたが、 136、169、132、136、198、150、154、077、143、153との値が出ています。
......結構ばらつきがあるみたいですね。 -
reporter 検証ありがとうございます。ばらつきはどうしても出るので、数を稼ぐしかないのですね。ただこれ以上カードを置くとエディタもエンジンも持たないという……。
まだ推定ですが、おそらく適性値ではなく、2D6を振ったあとの判定結果に次のようなボーナス値がついているような感じがします。
- 50%以上 → -1
- 49~33% → 0
- 32~25% → 1
- 24~20% → 2
- 19~16% → 3
- 15~14% → 4
- 13~12% → 5
- 11% → 6
- 10% → 7
- 9% → 8
- ……以降は1%ポイント毎に+1
※ただし、適性値がマイナスの場合は0として扱う。
とりあえずこの線で実装を試作してみます。
-
reporter 複数の負傷者がいる場合、上のボーナス値が1ポイントでも高い負傷者が必ず選択されるようです。ポイントが同じ場合はランダムのように見えます。
-
検証お疲れ様です。 左のキャラクターから順に手札選択をしていくなかで、既に手札選択の終わったキャラクターが回復対象に選んだ負傷者は除外し、手札選択中のキャラクターの時点で最も負傷ポイントが高い対象のポイント(戦闘不能者が複数いる場合はそのポイントが同じなのでランダムになる?)で回復カードの選択判定結果にボーナスをつけるとともに対象も決定すると言う感じですか。
-
reporter pull request #887
逃走も同じようなボーナスがつくようです(ただし全快状態で+3。逃走する敵は多少逃げやすい仕様の模様)。
この変更をマージして明日(今日だけど)辺りβ3を出します。
なお、仕様を合わせたとはいえ、完全に同じにはなっていません。というのは、CWの優先回復ルーチンにはバグらしき挙動があるからです。意識不明者がいて、誰かがその意識不明者を回復しようとしたら、後は何人が回復カードを持っていようとも絶対に追加の回復をかけようとしないという挙動です。おそらく優先選択を重ねて行わないという処理をする時、すでに選択された対象を選択対象群から取り除いてしまっているのではないでしょうか。CWPyではこのような挙動は行わないため、回復テストシナリオではCWよりも回復カードの使用率が高くなります。
全然関係ない話ですが、今のCWPyは1.20エンジンからスキンを作ったり宿を変換したりできます。1.28以降より1.20の外見が好みというような事がある場合はお試しください。
-
遅ればせながら更新&β3リリースお疲れ様です。 思えば自分の杜撰すぎる検証結果に数日掛けで付き合っていただきありがとうございました。
>絶対に追加の回復をかけようとしないという挙動
多分それは仕様ではないかと、個人的には思っています。
1.50でレベル15PCに水精召喚でウンディーネを五体召喚し、他を戦闘不能にして戦闘を開始すると、 ウンディーネはそれぞれ正確に別々の戦闘不能PCを起こしていきます。 Pyだと、同一PCを選ぶ場合があります。あと戦闘不能者が一人でもいて全員が回復アイテムを持ってると全員が戦闘不能者へ向けて回復アイテムを使おうとするようになってしまっているようです。
カードワースは体力が1でも残っていれば行動できるので、 重傷者への回復を重複させるよりも行動可能者を最大限増やそうとするオリジナルのロジックの方が全滅しかけている時などは立て直しやすいです。 とはいえ、仰られたように、この仕様により、たとえば先頭キャラクターが全体回復を使うと全PCが除外リストに入るっぽいですし、 水精召喚が召喚スキルの中でも突出して強くなっているので、合わせるかは長月氏の判断に任せます。
1.20スキン作ってみました。花札っぽい枠が懐かしいですね。 今はもう慣れてしまいましたが、1.28で変更されて途惑った覚えがあります。あの時にPyがあれば…! 昔の宿も探せばあると思いますが、黒歴史に悶えることになりそうなのでやめておきます。
-
reporter あと戦闘不能者が一人でもいて全員が回復アイテムを持ってると全員が戦闘不能者へ向けて回復アイテムを使おうとするようになってしまっているようです。
おっと、それはβ3のバグですね。本来であれば、一度でも回復対象になったキャラクタはボーナス値がつく対象から除外されます(ボーナスが0になる)。ウンディーネの挙動はまさに
1.50でレベル15PCに水精召喚でウンディーネを五体召喚し、他を戦闘不能にして戦闘を開始すると、 ウンディーネはそれぞれ正確に別々の戦闘不能PCを起こしていきます。
こうであるべきです。今から調べて修正します。
「追加の回復をかけようとしない挙動」とは、1人の意識不明者に誰か1人が傷薬を使おうとすると、他の100人が手札一杯に傷薬を持っていても誰も2つめ以降を使わないような挙動を指します。CWPyではそういう状況では追加の回復をかけようとする者が出る、ということです。
1.20スキン作ってみました。花札っぽい枠が懐かしいですね。
個人的に1.28移行で一番違和感があったのがそこでした。カード枠内に画像がぴったり収まっている感がなくなって戸惑うやら……同じく慣れてしまいましたが、今はたまに1.20スキンにして懐かしんだりしています。
-
reporter - pull request
#891 - 上の修正をマージしたテスト版
よりによって意識不明者回復の時に限りボーナスの除外リストをチェックする処理がすっ飛んでいました……。やっぱり夜中の作業はだめですね。
よろしければご確認ください。
- pull request
-
あ、そっちの方でしたか。どうも勘違いしていたようですね。お恥ずかしい。 ウンディーネの対象がバラけているのを確認しました。 戦闘シナリオをよく遊んでいたので挙動が近づいて嬉しいです。
-
reporter ご確認ありがとうございます。
たぶんご指摘がなければ食い違った仕様のままずっと行っていたので、本当に助かりました。また何かありましたらぜひご指摘ください。
-
reporter - pull request
#908
逃走ほどではありませんが、混乱カードも若干選択されやすいようです。
- pull request
-
おお、新たな進展が。
ボーナス値 カード交換 -6 回復効果 -1~ 混乱カード +1 逃走カード +3~
現状まとめるとこんな感じでしょうか。 回避抵抗-10というのも合わせて知力適性というのは強烈なデメリットなんですね。 group ASKも賢者の塔スキルを強くするわけです。
-
reporter すいません、簡単なテストで下のようなデータを得て混乱カードが+1だろうと推測したのですが……
35/100 1.50の選択確率 45/100 ボーナス+2の時の選択確率 34/100 ボーナス+1の時の選択確率 12/100 ボーナス+0の時の選択確率
今もうちょっとちゃんとしたテストを作って数を稼いでみるとこのようになりました。
284/500 1.50
これはほとんどボーナス+0の数値です。試行回数が少なすぎて誤差に惑わされたようです。後で修正を撤回しておきます。お騒がせしました。
-
reporter - attached 選択率テスト.zip
アクションカード選択率のテストシナリオを追加。キーコードによって使用をカウントし500ラウンド目に結果を表示。
-
どうも異なる属性の効果モーションが複数ある場合に無効なカードを選択しない判定に抜けがでるようです。
たとえば敵一体無属性必中、1)神聖属性ダメージ、2)全属性呪縛解除としたスキルは、不浄な存在・呪縛状態ではない敵にはいずれも無効なので、 CWでは選択されませんが、Pyでは選択されて無駄撃ちになります。それぞれ単一モーションにしたスキルでは選択されないのを確認しています。
それと除外リストに入った対象に向けて絶対に回復カードが選択されなくなるバグ?ですが、 やはりバランスが変わってしまうので仕様として実装するか、精度を高める必要があると思います。
回復スキルなどを持たせる場合、通常適性が高いキャストに持たせると思います。 そうなると優先選択がなくても適性が高いため、結構な頻度で回復カードが選ばれてしまい、その上全体回復等で全員が除外リストに入っていたりすると他に重傷者がいるのに手前の軽傷なキャラに回復を重複させてしまうことがありました。さらに癒身の法一発の回復量が高いため、重複回復が過剰である場合も多かったです。
絶対に選ばれないCWの仕様だと、負傷者が全て除外リストに入っている場合、消去法で手札次第では適性が悪くても攻撃カードを選ぶので、攻撃が苦手な回復持ちキャストもHPの削り合いに参加できます。 ですので、現在のPyの実装は味方・敵どちらの場合でも結果的に集団戦のテンポがやや悪くなってしまっているように感じます。
-
reporter どうも異なる属性の効果モーションが複数ある場合に無効なカードを選択しない判定に抜けがでるようです。
ありがとうございます。pull request
#1015で修正しました。属性無効判定と効果無効判定が別々に、それぞれまとめて行われていたのが原因です。それと除外リストに入った対象に向けて絶対に回復カードが選択されなくなるバグ?ですが、 やはりバランスが変わってしまうので仕様として実装するか、精度を高める必要があると思います。
分かりました。とりあえず回復1度毎に優先度を下げてみました。
- pull request
#1016
今は1点ずつ下がりますが、もっと下落幅を大きくすれば、より回復が重ねて選ばれにくくなります。回復量で下がる量が増加すればよりベターですが、今のところ手札選択に効果量で判断している処理はないので保留にします。今後の課題ですね。
- pull request
-
CardWirthPy 0.12.3x Build: 2015-08-20 21:36:27 を使用中に 不思議に思った事があったので軽く検証してみたのですが、 CW1.50では「武器が効かない」相手に渾身の一撃などの無意味な物理攻撃を絶対に仕掛けずにカード交換や防御・見切りを行ったり、攻撃が有効な他の相手を狙うのに対し、 CWPyでは無効相手だろうと構わずぶん殴っていました。1000ラウンドも。
目標キャストの対属性が計算に入っていないのかもしれません。
-
reporter ありがとうございます。
無効判定の書き直しでチェックが抜けていました……。pull request
#1018で修正しました。 -
CardWirthPy 0.12.3x Build: 2015-08-21 20:20:17 にて、 pull request
#1018の修正を確認しました。それともうひとつ気付いた事があるのですが、 CW1.50では『魔法無効化状態の目標に対して構わず魔法攻撃(魔法の矢)などを行う』に対し、 CWPyでは物凄く利口なことにそんな無駄な事はしませんでした。(回復や補助・支援については未検証。)
これが想定したどおりの仕様・挙動でしたら、すみません。
-
reporter ご確認ありがとうございます。
それは……想定通りではありますが、CWの方が想定漏れしているっぽいですね。どうしたもんでしょう。魔法無効化主体のパーティを組んだ時に若干敵が強くなる感じになりますが……(でも魔法無効化主体の豪傑パーティはそれを差し引いても強すぎだったりする)。
-
敵キャストが魔法無効化状態にする技能やアイテムを所持していた場合、 それの抽選確率が上がってしまい戦闘バランスに多少影響するのではないかと思い、 書き込ませていただきました。
私手製の拙作シナリオかつ限定条件下の話で大変申し訳ないのですが、 ギルドにて公開させていただいている連戦シナリオに CW1.50のこの挙動を利用・想定している場面があります。
魔法攻撃のみを行う敵キャスト群を切り抜ける手段のひとつとして、 『PCを魔法無効化(と召喚獣を使用)にしていかに素早く倒しきるか』という事を 想定している戦闘が存在します。
この敵キャストは防御行動の代わりとして、 「賢者の杖に魔法無効化(1R)の機能を持たせたアイテム」を所持させてしまったので、 PCの行動速度次第では召喚獣の魔法攻撃がすべて潰されてしまいました。
Pyの仕様との事ですし、その旨をReadme等に追記する事で対処したいと思います。 お答えいただき、ありがとうございました。
-
reporter この手の問題は繊細で難しいですね。
明らかにバグらしい挙動は、できれば直してしまいたいのですが、それで明らかに問題の出るシナリオがあれば何らかの他の手を打たなければなりません。この「明らかに問題の出る」というのが曲者で、きっちりとした線を引けるようなものではありません。
強い要望があれば互換モードで対応することなども吝かではないのですが……。
-
どこまで互換するのか、の線引きですね。 恥ずかしながら当初はこうした挙動も含め、 CWPyは随時99%互換(モード)に限りなく近づけるものだと思い込んでいました。
今回の問題に限らず仕様の差により、CW1.50ユーザーとCWPyユーザーで シナリオ等の認識が異なってしまうことが考えられますので、 できれば互換モードで対応すべきかもしれません。 そこまで気にするユーザーがどの程度存在するかが、気になるところではありますが。 (労力に見合うかどうか)
私個人としては、(こうした差異を認識している)シナリオ制作者側が 注意文を載せるだけで済むので、無理に対応するほどではないものと思っています。 ただ、CWPy==互換エンジンという認識を額面どおりに受け止めて考えると 『変なところで互換していない』いうことになりますが……。
余談ですが、NPCの回復タイミングについても同じような事が言えるので、 折角 Issue 255を作成していただいたのに何も言えずにいます……。 (現状だと、殆ど個別に対応してもらうような案件なので余計に)
-
>とりあえず回復1度毎に優先度を下げてみました。
おぉ、スマートな解決方法ですね。対応ありがとうございます。 まだちゃんと見れてませんが、しばらくこれで様子をみてみます。
>想定漏れしている
これはまた微妙なところですね…。 魔法無効化状態を無効判定に入れてしまうと敵の魔法使いが魔法を使ってこなくなって無効化している感がなくなるので、あえて入れなかったということも考えられるのではないでしょうか。具体的にはカナン様の魔法をカキーンして「どうだ!」みたいなロマンが(笑)
-
reporter もうちょっと歯切れの悪い言い訳をしてみます。
第一に、「最新のエンジンにあるバグっぽい挙動」は取り扱いが難しいです。というのは、合わせた後で、CWの側でその挙動が修正される事が無いとは言えないからです。例えばNPCの挙動は、1.20から1.50までの変遷の中で次々と変化していきました。毎ラウンド初期化されるバージョンもあったと思います。こうした挙動にいちいち合わせていくべきか(それはCWPyでは仕様変更になります)と考えた時、それによって不具合の出るシナリオが出ない限りは合わせないでいいのではないかという判断が出てきます。
第二に、バランスに関する調節はどこまでが本当に必要なのかよく分からない所があります。例えば1.20→1.28への変化時、手札選択のAIがだいぶ改良されて無効な行動を取らなくなりました。しかしそれによって1.20やもっと前の時代のよくバランスを取られたシナリオ、東方武芸団や塾長戦などがよくないバランスに変わったかというと、全くそんな風には感じられません。
思うにCWでは元々PC側の戦闘能力の幅が広いため、完璧なバランスというものが存在しないのです。全員が回復を持っているパーティがいるかと思えば一人か二人に集約されているパーティもいます。そうした状況の中でベターなバランスになるように丁寧に調節されたシナリオは、多少AIの精度が変わった所でびくともしないのです。これが少々のバランスの変化に対して私が「これはバグらしき挙動を入れてでも合わせるべきか?」と悩んでいる理由の一端です。
いや、しかし判断が難しいです。もし今回の問題に対応するとしたら、「召喚獣は勝手に動くものだから魔法無効化など知ったことではないのだ。だからこれは仕様だ」というような理屈付けが必要になります(でもこの理屈だとPCとかが魔法使うのはなんやねん、という話になっちゃう)。
具体的にはカナン様の魔法をカキーンして「どうだ!」みたいなロマンが(笑)
それかっこいいですね。いっそロマン駆動でもいいかもしれませんね。
-
とはいえ、CWPyの魔法無効化についてはPC側も無駄撃ちをしないので 戦闘行動自動化が捗るのがまたなんとも。割を食っているのは召喚獣だけですね。
どこまで再現すべきか、それが本当に必要なのか(余りにも細かすぎる案件など)、 果たして労力に見合うのか、実際に大きな問題に発展しているのか、ロマンはあるのか、と訊かれたら Python言語の技術力を何一つ持たない私は何も言い返せません。 言う(提案する)事は簡単ですが、実際に行動するのは k4nagatsuki 様なので。 ( k4nagatsuki 様を責めている訳ではありません。)
意見を出しておいてなんですが、今回のことは個々の性格の範疇の問題だと思っています。 たしかに大きな問題に発展している訳では無いので。
これが想定したどおりの仕様・挙動でしたら、すみません。
恥ずかしながら当初はこうした挙動も含め、
それでこのような訊ね方となった次第です。
具体的にはカナン様の魔法をカキーンして「どうだ!」みたいなロマンが(笑)
それかっこいいですね。いっそロマン駆動でもいいかもしれませんね。
その前に殆どの冒険者に鋼鉄の箱(浪漫砲)を向けられて瞬サツされるカナン様……。
-
>理屈付け
カナン様は抵抗力+10の障壁を持っているので抵抗判定の技能は必ず抵抗されますが、PCは構わずに亡者退散を使おうとします。Pyでも同様な挙動でした。 魔法無効化状態は能力修正に類するものという考え方はできませんか?
能力修正のみのカード、たとえば闇に隠れるや見切りは敵が攻撃を仕掛けてこないとラウンドの無駄になる行動です。 魔法無効化状態も敵が魔法攻撃をしてきてなんぼの要素なので、「じゃあ回避の低い奴を狙うか、肉弾戦に切り替えるか」と的確に判断しすぎるのもなと。 (PC側は暴露状態と手動選択でそれができるので、現状PC側にはなんのデメリットもない暴露状態で敵の判断が変わるとかなら面白そうですが)
いや実装したくないような雰囲気なので、自分も無理にとは言いませんが…。それも一つの選択です。
-
reporter うーん、魔法無効は能力修正と違って一目瞭然なんですよね。まあ、武器が効かないとかの属性も見えないけどAIは判断に組み込んできたりするので、その辺の境界もごっちゃになっているのですが。
いや実装したくないような雰囲気なので、自分も無理にとは言いませんが…。それも一つの選択です。
正直に言うとそういう気持ちです。CWの挙動に納得いっていません。バグだろうと思っています。
最後に行動するのは私であると仰っていただいていますが、CWPyは私が支配しているものではありませんので、私の意思が通らなくてもそれはそれでOKです。むしろ合わせるべしという意見が圧倒的であれば私は従うべきだと思います。CWはプラットフォームなので、ユーザや開発者の間で意見が分かれる時は、話し合って合意を取った上で開発を進めるべきです。
とはいえ意見が最後まで合わないこともありますし、そういう時はしまいに「優しい独裁者」が必要という話が出てきます。今のところは不本意ながら私がその立場にあるので(そのうち解消したい)、私を説得できれば勝ちということにもなります。
で、その私はようやく財宝の洞窟をプレイして大変楽しかったので(53Fでさっくり全滅したけど)、NPC回復の挙動の実装に前向きです。魔法無効化から完全に話が逸れてしまいますが、よろしければIssue
#255にご意見をいただければと思います。 -
reporter 魔法無効化について何か手を打つとしたら、次のような妥協の仕方があります。どうでしょうか。
- 召喚獣は1.50のように行動する。すなわち魔法無効化であろうと遠慮無く飛んで行く。
- PCは魔法無効化に対して魔法使用を避ける。どうせプレイヤーに変更されるのでそのような選択は無駄である。
- 敵とNPCは、1.2.のどちらにするか決めなくてはなりません。挙動合わせ重視なら1.でしょう。
-
2は些細な問題ですが、魔法属性のペナルティカードが微妙になるでしょうか。
あちらにも書きましたが、オプション化してしまえば上で挙げられている麻痺回復優先や魔法カード所有者に対する沈黙優先処理、作戦の実装なども視野に入れて合理的な拡張を進めやすいのではないかと思いました。
-
reporter そういえばペナルティがありましたね。それは2.の例外にするべきですね。
-
reporter これから上に書いたような実装を行おうと思いますが、何かありましたらご意見をください(いつでも戻せるので事後でもOK)。
-
reporter pull request #1020で魔法無効化に対する上記の挙動を実装しました。
これで魔法無効化されている人とされていない人が入り交じっている時のサラマンダーやウンディーネがかなり間抜けになりますがご愛嬌。
-
お疲れ様です。
○魔法無効化状態の敵と魔法無効化状態ではない敵がいる時、味方は全体攻撃魔法を選択できる ○敵全員が魔法無効化状態の時、味方は全体攻撃魔法を選択しない ○味方がペナルティの魔法を選んだときは、魔法無効化状態の敵もターゲットに選ばれる ○敵味方の使用者が魔法無効化状態では魔法属性カード(ペナルティ含む)は選択されない ○敵味方の召喚獣は魔法無効化状態で無効化されるのを構わずに動作する
一通り試してみましたが、完璧だと思います…!
テスト過程で気づいたのですが、CWではウンディーネは負傷者が一人しかいないときは、2体以上召喚されていても、1体目の回復で全回復せず、または魔法無効化状態で無効化されても、1体しか発動しないようです。 Pyでは1体目で全回復しても2体目が無駄撃ちされています。
-
reporter ご確認ありがとうございます。
おお、それはたぶん例の「誰か一人が回復した人は他の人は絶対回復しない」問題の応用ですね。召喚獣の発動を拒否してまで断固回復したくないらしい。
例によってバグっぽいので、合わせるかどうかはちょっと考えどころです。
-
「双方」対象の回復モーションで変な挙動をするようなので少し調べてみました。
実験1:効果対象を双方一体にした傷薬を持った味方Aと敵A、意識不明の敵Bを用意して自動選択を見る。 1.50:10/10で両者が敵Bに傷薬改を使用しようとする。 Py:10/10で味方Aは傷薬改を選び続けるが、敵Aはアクションカードを選ぶことがある。(敵Aが傷薬改を選んだのは1/10回。) 実験2:実験1に意識不明の味方Bを加える。 1.50:10/10で両者が敵Bに傷薬改を使用しようとする。味方Bは放置。 Py:10/10で味方Aは敵Bに傷薬改を選び、敵Aは味方Bに傷薬改を選ぶ。 実験3:実験2に意識不明の敵Cを加える。 1.50: 味方A→敵B 9 味方A→敵C 1 味方A→味方B 0 敵A→敵B 6 敵A→敵C 4 敵A→味方B 0 実験4:実験2に傷薬改を持たせた味方C、味方Dを加える。 1.50:味方AとCは必ず敵BとCどちらかに傷薬改を使おうとする。 味方Dは味方Bが残っているのに無視してアクションカードを選択する場合がある。 ただし全く無視されるわけではなく、味方Bに傷薬改を使おうとする場合もあった。体感では半々。 実験5:実験4から敵B、敵Cを削除。 1.50:敵Aを含め、味方Bに誰も傷薬改を使おうとしないラウンドがあった。
まとめ:
-
実験1より、敵側と味方側の除外リストは別々に管理されている(または片方を終えた時にリセットされている)っぽい?
-
実験2、4~5より、双方回復では優先ボーナスは敵側のみで判定され、味方は絶対選ばれないということはないが、意識不明者への理不尽な優先ボーナス(意識不明での+100とHP割合+80前後?が両方ついてる?)は付かなくなるように見える。
- 実験3と全般的な傾向として、手前側が若干選ばれやすい気がする。
元は行動順を味方と敵どちらが先に判定しているかのヒントになるかなと思ったんですが、当てが外れてしまいました。
-
-
reporter ありがとうございます。
なんだかますます仕様バグじみた挙動ですね。使用者の陣営に関わらず絶対にエネミーカードが優先されるのですか……。さすがにここまでくるとトリビアルであまり対応する必要性を感じません。
ここだけちょっと気になったのですが、
Py:10/10で味方Aは敵Bに傷薬改を選び、敵Aは味方Bに傷薬改を選ぶ。
手許で試したところ、味方Aが味方Bを回復し、敵Aが敵Bを回復するという行動も発生しました(これは仕様通り)。そちらの実験でもそうなったのをこのように要約したのか、それとも実際に行動者が必ず敵方陣営を回復対象として選んだのでしょうか?
-
除外リストは分けた方が無難に思いますが、(双方回復スキル・アイテムはそこそこあり、自動選択で敵の回復行動を邪魔してしまうのでPyの仕様を突くというか、そんな感じで戦略に組み込めてしまう) まあこの辺は意見がぶつかってばかりなような気もしますし、自分からは今後は報告にとどめて自粛したいと思います。
そちらの実験でもそうなったのをこのように要約したのか、それとも実際に行動者が必ず敵方陣営を回復対象として選んだのでしょうか?
前文を書いてから「敵Aは味方Bに傷薬改を選ぶ」ということを確認したので意識してなかったというか書き間違いでした。申し訳ないです。 念のため、こちらで再度試したところ味方A→味方B、敵A→敵Bパターン確認できました。
-
reporter ありがとうございます。バグでなくてよかった。
とりあえずこの件は、実際そこまで戦術を詰めたシナリオが出たら対応を考えます。
-
お疲れ様です。恐れ入りますが自シナに関しまして情報提供をさせてください。
この間公開した「絶対にF9してはいけない依頼」でダスキンと戦うルートを選ぶと80人敷き詰めたダスキン(スキルカード10枚持ち)と戦うバトルに突入しますが、この時エネミーの思考ルーチンの影響か、手持ちの環境で13秒ほど待ち時間が発生します。スキルカードを全部外すと待ち時間は解消します(0.2秒ぐらい?)。「敵はどこまで敷き詰められるか」のオーク戦を流用しているので、その時も問題は発生しませんでした。
明らかに特異なケースで大変恐縮ですが、以上報告します。
CardWirthPy 0.12.4 Alpha 4 Build: 2016-02-19 19:40:55 Windows10 Home x64 CPU 2.50GHz メモリ 16GB
-
reporter ありがとうございます。どこが重いのか計測してみたところ、案の定優先行動の判定の部分でした。回復・逃走以外は関係ないのでpull request #1338で優先行動の処理対象外にしてみたところ、だいぶ速くなったようです。
回復持ちが数百人いてほぼ全員がその行動を取るような場合はどうしたもんか。
-
手元の環境で速度が大幅に改善した事を確認しました。AIの話は分からなく、お手をお煩わせする形になって申し訳ないです。ありがとうございました。これ負けバトルなのに…。
-
回復優先ボーナスについて誤りがあったので訂正します。
上記の実験2を再検証した結果、 味方Bが選ばれ続けるという真逆の結果になりました。
条件を色々変えてみたところ、敵のHPを増やした(500)ところで結果が逆転しました。 どころか、HP1のキャストが戦闘不能になっても必ず回復しようとはしないことに気づきました。
つまり、「双方回復では優先ボーナスは敵側のみにつく」というのは間違いでした。
正しくは「戦闘不能になっている者のうち、最大HPがより多い者」が選ばれやすくなっているものと思われます。
XEでHP1000/9999にした重傷エネミーを作り比較したところ、HP0/41の戦闘不能者が優先されたため、
恐らく、負傷時はHPに対する割合というのは合っていて、「戦闘不能ボーナス」のみ100ではなく最大HPをそのまま加算しているものと今は予想しています。(通常はHP30以上あるので22以上の差がつき100%に近くなると錯覚してしまっていた…ということになるでしょうか)
-
reporter pull request #2099
調査ありがとうございます。納得行く結果だと思うので、とりあえず合わせてみました。とりあえずなので、話の行方次第で変更するかもしれません。
今回の変更で最大生命点をボーナス値に使うようにしましたが、少し小細工をしています。
以下が不自然な挙動であると考えたためです。
HP1のキャストが戦闘不能になっても必ず回復しようとはしない
これは「一度回復対象になったキャラクターは絶対回復されない」というのと同じくらいバグらしき挙動です。
50%→33%→…12%~1%と体力が減少するたびに回復の確率が上がっていくのに、0%になった途端にほとんど放置されてしまう事になります。
合わせる必要があるかどうかは改めて考えるとして、今回の変更では、0%の時のボーナスが1%の時を最低でも1ポイント上回るようにしました。
-
reporter このIssueはCWへの仕様合わせが主題になっているので、ルーチンの抜本的改良についてissue #900を立てました。
- Log in to comment
意識不明回復の優先を実装。