条件により付与・削除・変化するステート

何件か話を掘り返します。いずれも話の発端は、当時、掲示板に参加されていた方のご意見で、クローズせぬまま保留としてあった案件です。細かい思案が必要であることと、時間が経っていて掲示板のやりとりには向かないことから、この場を交えてゆっくり展開していきたいと思います。今や投稿者ご本人がここをご覧になっていない可能性もありますが、どなたでも何か思うところあらば、掲示板にでもご意見をお寄せ下さい。

いずれも案件が進展するかという話はまた別で、私の気持ちを文章として残したい、という程度の意図で書かせていただいています。

最初のエントリは、Kishizさんのステート変化に関する話です。投稿時期は2008年の5月。引用内容は、一部を略したり半角文字を全角にしたりしています。ご了承下さい。

投稿者 : Kishiz

(前略)モンスターの戦術は検討中ということですが、ステートと行動が密接な形で関連していれば(一本化できれば?)、このdesigeonのシステムに合致した独特な戦闘ができるように思えます。

ステートによって全く違う行動を取ったり、HP一定値以下/ターン数/攻撃を受けるなどの条件で自動的にステートが付加/変化したり、ステートによって、一種の「変身」が再現できれば…

(例1:行動&自己ステート付与「力を溜める」から1ターン後必ず行動「渾身の一撃」→ステート解除。「力を溜める」中に10点以上のダメージを受けるとステート解除)

(例2:一度ダメージを受けるとステート「怒り」が付き、攻撃力UP。「怒り」状態からさらにダメージを受けると「激怒」がつき、強力な全体攻撃を放ってくる)

ご一考願えれば幸いです。

この件は、以下の三点に要約して解釈させていただきました。要約しましたがこの案件は、多くの要素が絡む機能ですので、ちょいと文章が長くなります。

  1. ステートによって違う行動を取る
  2. HP変化/戦闘ターン数/攻撃を受けるなどの条件でステート付与/削除/変化する機能
  3. ステートによって「変身」を再現する機能

最初と最後のものについては、その後のバージョンアップで実装されていますので、クローズとさせていただきます。以下は真ん中の件に関するコメントです。

真ん中のものは分解して考えてみます。以下、ボリュームがあるので興味のある方だけお読み下さい。

HPが変化したらステートに影響する

HPなどのパラメータが一定以上に、あるいは一定以下になったらステートを着脱できる、という案は面白いと思います。私も類似の案を持っていまして、そのことに対する一次回答として当時、以下を投稿しました。

管理人 : 熊恭太郎

能力値を条件としてステートを着脱する仕組みは、開発当初から考えているのですが、壁があってやれないでいます。

もっとも大きな壁は速度パフォーマンスです。最大400の能力値を、常時監視するのは速度的にきついです。

HPが変化しうる場面はたくさんあって、動作パフォーマンスへの懸念は変わっていません。仮に能力値の数を二百,変化するステート数を二百と見積もれば、あわせて四万の判定がHP変化のたびに発生することになります(より最適化したプログラムを組むことになりますが、これは最悪の状況を想定した見積もりです)。この懸念は、現在の体感速度を損ねることよりも、将来、RPGツクールのようなイベントフローを実装することになった場合に、現行の機能がボトルネックになることを恐れています。

ただ実際に問題が起きるかどうか、検証をしたわけでもないので、なるべく悪い影響が出ない形で検討していきたいと考えています。動作パフォーマンスへの影響を抑える方法、それと手を入れる範囲のことを考慮すると、適用できる場面は限られてしまうかもしれません。

戦闘ターン数がステートに影響する

戦闘ターン値が切り替わるのは、戦闘ターンの最初です。ということで「戦闘ターン数がステートに影響する」機能は、戦闘ターンの最初、誰もコマンドを入力しない段階でステートを付与・削除・変化させる機能ということになります。前述のHPの件と違って、こちらは判定タイミングが明らかです。

しかし判定の手段と、副次的な機能の提唱がたくさんあって悩みます。正直なところ、「戦闘ターン数」のみを条件としてステートが切り替わる機能を作ることは避けたいです。ゲーム中の「システム資料」をご覧になると分かるのですが(戦闘ターン数も含まれています)、この手の判定材料は無数にあって、「要素Aが条件Bを満たせばステートを付与・削除・変化する」を誰かが思いつくたびに私が機能追加していると無理が来ます。

そのかわり、ステートの変化を「計算手順」によって判定する、ということならできるかもしれません。戦闘ターン数は計算手順から取得できます。これなら、先の「HPがステートに影響する」件もサポートできます。この案は次の項で示します。

ステートへの影響を計算手順によって処理する案

前述の二つ、HP変化と戦闘ターン数に対応できるステート影響案です。

  • ステートへの影響を判定する方法
    • S案1 … 各ステートの付与・削除・変化にそれぞれ計算手順を与え、結果に応じて付与・削除・変化
    • S案2 … 各ステートの計算手順の計算結果をステート累積数の上限とする。ゼロ以下ならステート無効
    • S案3 … 各ステートの計算手順の計算結果をステートの数とする。ゼロ以下ならステート無効
    • S案4 … 各ステートの計算手順の計算結果をステート数に加減算
  • 判定結果がもたらすステートへの影響
    • 付与 … ステートが計算結果の数に達していなければ、その数まで付与
    • 変化 … 計算結果の数のステートを、指定ステートに変化
    • 削除 … ステートが計算結果の数に達していたら、その数まで削除。計算結果がゼロ以下なら全削除
    • 加減算 … 計算結果を現在のステート数に加減算。合計ゼロ以下ならステートなしとなる
  • 判定を行うタイミング
    • T案1 … ターンのはじめや終わりなどの固定タイミングで判定し、ステート数を調整
    • T案2 … ステートが要求されるたびに数を計算。ステートの実数は変えない。変化はできない(S案2,3,4のみ)

T案1の課題はHPの件と同様、どのタイミングで判定用の計算手順を走らせるかです。何らかのパラメータが変化するたびに実行していては負荷が厳しいことが予想されるので、ターンのはじめ、もしくはターンの終わりに、判定が指示されている全ステートについてこの判定を行う、というあたりがせいぜいかなと思います。

面白いのはT案2です。ステート数をダイナミックに計算する案。ステート判定が必要になるたびに「ステート計算手順」を起動します。こちらはHP変化がいつ起きるか、などと考える必要がありません。HPも戦闘ターンも計算手順から読めるので、ステート数の判定が必要になるたびに計算手順でステート数を数えてしまえばいいのです。そのかわり、いつもターンの終わりに実行している定期ステート処理に負荷がかかります。加えて、能力値とステートの相互干渉による「無限ループ」のシナリオバグを避ける必要があって、シナリオを作る側としてはやりづらいかもしれません。

他にも細かいパターンが思いつきますが、この話はこのあたりで。

攻撃を受けたらステート変化する

「攻撃を受けたら」という条件には、複数の解釈があります。コマンドのターゲットとして発動されたとき、それが命中したとき、命中してもダメージがゼロかもしれないこと。選べるようにするなら相応のシナリオ入力が必要で、選べないならどれか一つの条件でしかステート変化しません。

後日のことになりますが、キャラクタがコマンドターゲットされた直後のアクションについては、ステートが付与されたときにコマンドを自動起動する機能が追加されています。原案のステート変化の条件が「命中」ということであれば、これを使えばステート変化するコマンドを対象者が自分に対して自動起動することで、ステートを変化させることができます。この場合、サポートできる条件は「コマンドの命中」だけです。

ということで、攻撃を受けてからのステート変化は一度クローズしたいと思います。もし他の条件でステート変化したいという話があれば、後日あらためてご意見をいただければと思います。