日記/2007-11-29

2007-11-29 (木) 08:58:47
お名前:

父ちゃん情けなくって涙が出てくらぁ。

つーか、自分に対してですが。
なんでこんな基本的なところの設計ミスをしているかなぁ。
自戒の意味も含めて、公開メモ。

  • 報告概要:スキル使用率を最大値にした際に、スキルを使用してくれない。
    • Glenelgではスキルの使用率を「敵タイプごと」に指定できる。
      仕様上、その際の値域は「一切使用しない0〜最大10」となっている。ヘルプ記載もこのとおり。
    • 実際に操作して「スキル使用率を10」にしようとすると、情報ウィンドウには正しく10が設定された旨表示される。
    • ところがこうすると、スキルを一切使ってくれない。
  • 調査結果:設定値保存アルゴリズムの設計ミスによるバグ。
    • 単純に言ってしまうと。
      保存アルゴが「0〜9の値」でしか正しく動いていません。
    • もう少し細かく。
      Glenelgでは設定値の保存の際に、データ文字数削減のために複数の設定値を1つの数値に加工して保存しています。
      具体的には「1桁目はスキルの使用率。2桁目はスキルの使用レベル・・・」というように。
    • ・・・もうお解りですね?
      スキル使用率の記録領域は数値1桁分しか確保していないので、「2桁になる10」は正しく記録できないのです。

・・・情けなくって涙でてくるぜ(笑)
値域の確認なんて、設計の基本中の基本なのに。

・・・ともあれ、どーしたもんか。
直すのは記憶領域のフォーマットをいじれば簡単なんだが、それをやっちゃうと旧設定値との互換性がとれなくなる==ユーザーさんがまた敵ごとの設定をはじめからやり直し、なんだよな。
それはいくらなんでもあんまりだし。
・・・以前に作ったluaフォーマット版を利用するか・・・


実際の使用率について

Glenelgでホムがスキルを使う実際確率は、以下のような式で計算されています。

使用確率 = 残SP率 * RATE値 * 敵ごとの使用率 + 周囲の敵の数 * 3

RATE値はデフォルトで5。
敵ごとの使用率は、まさにユーザーが画面操作で設定する「スキル使用率」の0〜10の値。
つまりスキル使用率10に設定した場合、「53% * SP残量による率」が百分率での使用確率となります。
50%やっとという値は「意外と使わない」ように思えますが、このチェックはAIサイクルごとに実施されますというのが1つのポイント。
もしあるAIサイクルでスキルを使用しなかったとしても、次のAIサイクルにはまたチェックされるのですから、5割を超えているこの設定値では「3AIサイクル」挑戦すれば確率的には使用しておかしくない:あるAIサイクルで使用しなかったとしても、次の2AIサイクルでは使われてもおかしくない。
1AIサイクルは平均すれば150msecくらいですから、「ディレイ明け約0.3秒遅れ以内に使用」というのがおおむねの期待値になります。
まあ実際にはSP値が下がっていることを考慮、6割掛けして「4AIサイクル==0.5秒遅れ以内に使用」というのが実力くらいではないでしょうか。

使用率9にすると5%率が下がって48%基本。
SPが満タンでも2AIサイクルではスキル使用しない確率が増えてきます。

あくまで確率論なので、50%のスキル率だからといって3AIサイクルで確実に使われるというものではありません:50+25+12.5で9割近くはなりますが、それもあくまで確率。
ともあれだからといって、「使用率10」にどれだけ意味があるかはまた微妙ではあります(^^;;


参考:最適化論

よく言われる話で。
「なんでスキル使用を確率にするの?
 SPがあってスキル使用許可している相手になら、100%使ってもいいじゃない?」
・・・というものがあります。

確かにそういう考え方もアリだと思います。
実際、どうせスキルを使うのだったら「敵の体力が少しでも残っている==オーバーキル率が低い」タイミングで使ったほうが、効率がいいはずだし、早くも倒せるはず。
Glenelgでそういう設定をしたければ、ai_option_xx.ini を手で編集してみてください。

ATTACK_AUTOSKILL_RATE = 100

とすれば、「1AIサイクル内での標準スキル使用率が100%」になるので、まず最速タイミングでスキルを使用してくれます。
これで敵ごとのスキル使用率を4以上にすれば、完璧です。
SPが残り1/4になってもスキル率は実質100%以上ですから。

ただまあ、この場合、逆に撃ち過ぎになるように思います。
極端な話、「カプリス2発+殴り」で倒すくらいが適切な相手に対して、3発目を撃ってしまう可能性がそれなりに高い。
そういう意味では「敵ごとに最大n発まで」とかできるのがいいんだけど、それをやると今度はカプリスのランダム性がネックになる。
属性が合わないと、カプリスを何発撃ってもろくに効かないってことが往々にしてあるわけで。
・・・と。どれくらい当たってるかがAIから見えない以上、そこにこだわるまでもないかな・・・ということで、現状がお勧め実装になっているだけです。

AIが勝手に撃つのは少なめにしておいて、 本当にたくさん撃ちたいときは人間が手でフォローしてあげればいい。
AIが撃ちすぎるのを止めるI/Fを作るよりは、こっちのほうがいいかな、って思っています。