状態修正 - kjirou/hello-adventurers-core GitHub Wiki

🗺️ 状態修正の概要

  • Modifier(状態修正)
  • クリーチャー等の能力値や振る舞いを変更する効果を付与する枠組み
    • いわゆるバフ・デバフ
  • 大半は戦闘中に一時的に付与するもの

🤔 状態修正の存在意義

  • 戦闘の進行を多様にして、プレイヤーによる情報分析と意思決定ができる箇所を増やす
  • パーティメンバーの組み合わせの相性を作る

📁 プロパティ

付与対象別の種別

  • 以下の状態修正を付与する対象別に、大きくプロパティも振る舞いも変わる
    • オブジェクト
    • パーティ
    • 空気
    • ダンジョンカード
  • それぞれで共通している振る舞いは、重複時処理だけかもしれない

オブジェクトの状態修正のプロパティ

  • クリーチャーを含むフィールドのマス目上のオブジェクト(正式名称はフィールドオブジェクト)に付与する状態修正
  • データ定義上のプロパティ
    • 状態修正ID
    • 名称
    • アイコン
    • 様態種別, Condition Kind
      • 付与 or 体勢
      • 何の変化を発生しているのか
      • 解除時の条件で使用する
    • 効果内容設定
      • 例えば、単にいくつかの整数の範囲が決まっていればいいのであれば、それぞれminとmaxの定義のみ
      • 個別具体的。状態修正を生み出す状態修正とかだと複雑になる。
        • 状態修正を生み出す状態修正だと、中にデバフ強度も保持することになる
    • 解除レベル
      • 解除の困難度合い
    • 重複時処理種別
      • 同種別の状態修正が複数個同時に付与された時にどういう合算をするか
      • 個別に効果発揮・効果量が高い値のみ反映・一定のルールで合算される、など
    • 消費回数設定
      • 設定がある場合は、発動毎に1回消費して、0回になると解除
        • 実際に減少する時点は、発動条件が、行動に付随・効果に付随・被行動に付随・被効果に付随、など多様なのでそれに従って多様である
      • 設定が無い場合は、効果時間なら無制限に作用する
  • インスタンス生成時に必要な値
    • バフ時の効果内容算出式
      • FieldEffect(効果)から渡される
      • バフ強度として使う主要能力値の種類・バフ強度が効果内容のどの点数にどの比率で反映されるか
      • 例えば、依存する主要能力値はInt・効果量はバフ強度 x 5%・効果時間は バフ強度/3、など
      • バフ時とデバフ時の効果内容算出式が両方ある時は、敵対関係ならデバフ設定を使い、友好関係ならバフ設定を使う
        • 狂戦士化などの利益と不利益を持つものへ両方設定する
    • デバフ時の効果内容算出式
      • FieldEffect(効果)から渡される
      • デバフ強度として使う主要能力値の種類・デバフ強度とデバフ抵抗強度による効果内容の算出式を設定する
      • 詳細は、戦闘のドキュメントを参照
    • バフ強度
      • 発動者から算出される
        • 発動者はほぼクリーチャー、しかしオブジェクトや罠などの非オブジェクトもある
      • 元は主要能力値の値
    • デバフ強度
      • 発動者から算出される
      • 元はBEPの値
    • デバフ抵抗強度
      • 対象者のオブジェクトから算出される
      • 元はRPの値
  • インスタンスのプロパティ
    • 状態修正インスタンスID
    • 状態修正種別
    • 役割種別
      • バフ or デバフ
      • バフとして付与すればバフ、デバフとして付与すればデバフ
    • 効果時間設定
      • 戦闘ターンまたは冒険ターン
      • 冒険ターンの場合は戦闘中は永続
    • 効果内容

パーティの状態修正のプロパティ

  • パーティ単位で付与するバフ・デバフ
    • 抵抗できない
      • 対象がパーティだから抵抗の仕組みを作るのが難しいし、そんなに種類もないだろうから複雑な仕組みは不要
  • 重複時処理は、常に重複する
    • 合算種別を設定した方がクリーチャーのものと整合するけど、合算処理はユーザーの認知負荷が大きいのでやめた方が良さそう
    • UI上の表現を含めると、デザインや実装も手間がかかるし
  • データ定義上のプロパティ
    • 状態修正ID
    • 名称
    • アイコン
    • 効果内容設定
      • パーティだから、クリーチャーやマスの位置などを持てないので、能力値を上下するような単純なものだけになる
  • インスタンス生成時に必要な値
    • 効果内容算出式
    • 強度
      • オブジェクトのバフと同じような主要能力値依存の値
  • インスタンスのプロパティ
    • 状態修正インスタンスID
    • 状態修正種別
    • 効果時間
    • 効果内容

床・空気の状態修正のプロパティ

  • 床と空気は別の付与対象種別だが、同じ振る舞いなのでまとめる
  • マス目は1つの床と1つの空気を持ち、床も空気も1つのみ状態修正を持てる
    • 後で設定した内容で抵抗判定無く上書きできる
    • 補助的な仕組みなので、直感で理解できるようにして複雑にしすぎないこと!
  • データ定義上のプロパティ
    • 状態修正ID
    • 名称
    • アイコン
    • 効果内容設定
      • オブジェクトに影響を与える定義はできないので、基本的に何かの効果を生む状態修正になる
      • 例えば「毒の沼」「毒の雲」などだと、毎ターンに毒デバフを発動する
  • インスタンス生成時に必要な値
    • 効果内容算出式
    • 強度
      • オブジェクトのバフと同じような主要能力値依存の値
  • インスタンスのプロパティ
    • 状態修正インスタンスID
    • 状態修正種別
    • 効果時間
    • 効果内容

ダンジョンカードの状態修正のプロパティ

  • ダンジョンカードの影響を修正する作用
    • パーティの状態修正同様に、抵抗判定を作れない・作れても過度という理由で、抵抗判定はない
  • 重複時処理は、常に重複する
  • データ定義上のプロパティ
    • 状態修正ID
    • 名称
    • アイコン
    • 効果内容設定
  • インスタンス生成時に必要な値
    • 効果内容算出式
    • 強度
      • オブジェクトのバフと同じような主要能力値依存の値
  • インスタンスのプロパティ
    • 状態修正インスタンスID
    • 状態修正種別
    • 効果時間
      • 1冒険ターン or 山札シャッフルまで or 永続 のいずれか
    • 効果内容

👼 友好的な状態修正(バフ)付与の処理

  • 友好的な状態修正を Buff(バフ) と呼ぶ
  • バフを付与する場合は、バフ強度と効果内容が比例する
  • 効果量の例:
    • バフ強度 * 3%
  • 効果時間の例:
    • バフ強度/3(切り上げ) ターン

👿 敵対的な状態修正(デバフ)付与の処理

  • 敵対的な状態修正を Debuff(デバフ) と呼ぶ
  • デバフを付与する場合は、発動者のデバフ強度と対象者のRPによる、抵抗判定が生じる
  • 抵抗判定
    • デバフ強度がRPに対してどのくらいかの比率で結果が決まる
      • 100%超を成功と呼び標準以上の結果になり、100%以下を失敗と呼び標準未満の結果になる
      • 200%超なら最大の効果を発揮、50%以下なら最小の効果を発揮
    • 判定の結果、効果時間が 0 ターンになった場合は、付与自体が失敗する
    • 効果量・効果時間の例
      • Min:0, Max:1, 標準:1 の場合
        • 100<比率 = 1
        • 比率<=100 = 0
      • Min:0, Max:3, 標準:2 の場合
        • 200<比率 = 3
        • 100<比率<=200 = 2
        • 50<比率<=100 = 1
        • 比率<=50 = 0
      • Min:0, Max:5, 標準:3 の場合
        • 200<比率 = 5
        • 150<比率<=200 = 4
        • 100<比率<=150 = 3
        • 75<比率<=100 = 2
        • 50<比率<=75 = 1
        • 比率<=50 = 0
    • 成功時と効果分布処理
      • 効果のパターンが1つの時は、常に効果は同じ
      • 効果のパターンが2つの時は、100%超から200%以下と200%超で効果が分岐する
      • 効果のパターンが3つ以上の時は、100%超から200%以下の100%の幅をパターン-1の数に対して等間隔に配布し、200%超はパターンの最大値
    • 失敗時の効果分布処理
      • 効果のパターンが1つの時は、常に効果は同じ
      • 効果のパターンが2つの時は、50%超から100%以下と50%以下で効果が分岐する
      • 効果のパターンが3つ以上の時は、50%超から100%以下の50%の幅をパターン-1の数に対して等間隔に配布し、50%以下はパターンの最小値
    • 標準値を省略した場合は、(最小+最大)/2切り上げ がデフォルト値
  • 防御特性補正
    • デバフの種類には、関連する防御特性が設定されているものがある
      • 設定がある場合は、1つだけ
    • その場合、対象がその防御特性を持つ場合、デバフ強度へ-(防御特性)%の補正が掛かる

🔢 重複時処理

概要

  • 同じ様な状態修正を複数付与した時に、どの様な挙動になるかの定義
    • 例えば、毒効果なら付与した状態修正が全て独立して機能するが、弱体化ならもっとも高い値の1つだけが有効になるなど
  • 大きく種別で処理や必要なプロパティが分かれる

プロパティ

  • 共通プロパティ
    • 状態修正重複判定ID?
      • 重複とみなす状態修正へ設定する
      • 設定は必要最小限にする
  • 重複時処理種別とそれ毎のプロパティ
    • 重複
      • それぞれが独立した状態修正として作用する
      • 状態修正付与時も、状態修正参照時も特別な処理無し
    • 制限
      • 同種間で、最も高い値のみが反映される
      • 状態修正付与時は処理無し、状態修正参照時に特別な処理有り
      • 値が高いものを優先して適用する
        • 攻撃力30%減を1ターン・攻撃力20%減を2ターン付与していたら、1ターン目は30%が反映されて2ターン目は20%が反映される
      • 同値もしくは下位互換の状態修正インスタンスは削除する
        • 攻撃力30%減を1ターン・攻撃力30%減を2ターン付与していたら、前者は付与時に削除される
    • 合算
      • マージして1つにしたり、より強度の高いものへ変化する
      • 状態修正付与時に特別な処理有り、状態修正参照時は合算種別による
      • 下記別セクションで詳細

合算種別の詳細

  • 合算はさらに種別があり、それぞれで処理が異なる
  • 合算種別
    • 整数効果量/制限
      • 効果量が正の数と負の数を含む整数である場合
      • 効果量の数値・効果量の上下方向・効果時間の長短があるので、それをどう合算するか
        • 例えば、+1/3T と -2/2T や +10%/2T と +20%/1T の合算をどうするか
      • ルール
        • 効果量の正負が異なる場合
          • 効果量は差分の値になる、効果時間は正負の勝った側の効果時間
          • 0 になったら状態修正消滅
        • 効果量の正負が同じ場合
          • 重複時処理の制限と同じ挙動
    • 昇格
      • 別の状態修正へ変化する
      • 効果量・効果時間は多い方へ統合する
        • 効果量の代わりに変化させているので、効果量は設定がないことが多い
    • 更新
      • 状態修正インスタンスのプロパティを更新する
      • 設定外の効果量・効果時間は多い方へ統合する
        • 効果量を加算・効果時間は無し、というパターンが多そう

📉 効果時間の自然減少

戦闘ターンの場合

  • 味方・敵の各パーティの行動全体の終了時に、行動が終わったパーティメンバーやマス目付与されている状態修正の効果時間が 1 減少する
    • オブジェクト・パーティ・床・空気の状態修正が対象
      • 味方への 1 ターンの状態修正付与は、付与したターンが終わったら消える
      • 敵への 1 ターンの状態修正付与は、敵パーティが 1 ターン行動したら消える

冒険ターンの場合

  • 冒険ターン終了時に 1 減少

💉 バフの解除とデバフの治癒

  • 敵対行動としてバフを解除したり、友好行動としてデバフを治癒する時に、どういう単位と順番で処理するか
    • 行動次第であるが、通常は解除・治癒できる個数が決まっているため
    • 単位は、種類
      • 例えば、「弱体化」と「毒」がそれぞれ複数個付与されている時は、2 単位となる
    • 順番は、付与された時点が新しい順
  • 解除レベルにより、解除の困難さが異なる
    • 1 = 通常はこれ、全ての解除効果で解除できる
    • 2 = 仲間側のすぐ解除されたくない冒険ターンをまたぐバフや、罠によるデバフなどへ設定
    • 3 = システム上解除させたくないもの、非常に特異な方法で解除できるかもしれない

😨 潜在的な問題

重複時処理の「制限」の振る舞いが何かとわかりにくい

  • 同種の効果内容の強度が異なるものが複数付与されていた時、そのまま状態修正リストとして表示すると、どの値が有効かわかりにくい
    • 少なくともグルーピングして表示する必要がある
    • 工夫しても一定のわかりにくさは残る
  • 何が同種かがわかりにくい
    • 状態修正重複判定IDをたくさん設定してしまうと、何が同種が一見してわからなくなる
    • あまり状態修正の種類を増やさないことが大事
      • 基本的に、強化関係にある状態修正しかグルーピングしなさそうではある
        • Elonaの 朦朧 → 混濁 みたいな

デバフの最終的な効果がわかりにくい

  • 抵抗判定の処理が複雑なので、具体的な結果がわかりにくい
  • 一般的なプレビュー機能とUndo機能である程度カバーできるが、式の詳細がわかる配慮は別途必要

🗣️ 補足・Tips

状態修正インスタンスの個数に依存した仕組みを作らない

  • プレイヤーには重複処理後の状態修正の種類のみを基本的には意識させたいので、状態修正インスタンスの個数はいかなる処理に対しても使わない
  • 使うなら状態修正の種類の個数のみ

「転倒」「防御」などの影響が強度依存ではない状態修正の役割

  • 強度依存にしない場合、こういう特徴が生まれる
    • 一定の成果になる
      • 弱い強度が反映されない利益と強い強度が反映されない不利益を併せ持つ
    • 上記の結果だが、影響がわかりやすい
  • 主にバフ・デバフが補助的なアタッカーやタンクが持つ状態修正に設定する
    • バフ・デバフの専門家ではないので、あまり効果が高くなっても他職を食ってしまう