行動と効果と効果内容 - kjirou/hello-adventurers-core GitHub Wiki

🗺️ 行動と効果と効果内容の概要

  • 戦闘や冒険の中核となる処理は、クリーチャーに対して繰り返し多様な作用を与えることである
  • その枠組みとして、行動・効果・効果内容という概念を定義している
    • 加えて、効果グループという単位もある
  • 大まかには、行動は効果を生成し、効果は範囲と対象を決定し、効果内容は作用を与える、という役割である

🤔 行動と効果と効果内容の存在意義

  • 「効果による対象への作用」の処理をなるべく独立させて、仕様を単純にするため
  • クリーチャー・パーティ・罠・固有イベント等の複数の主体により効果が生まれるので、それぞれが効果の作用を定義すると、結果的に仕様が複雑になる

✍️ 各概念の整理

  • Action(行動)
    • TypeScript の型名は FieldAction
    • 行動者や照準を引数に取り実行し、1つ以上の効果を生成する
      • 行動者は、クリーチャーだけではなく、パーティ・罠・固有イベント・その他システム都合の何か、等の様々なものがなり得る
  • Effect Group(効果グループ)
    • 連鎖効果を反映する際の複製する枠組み、効果リストを内包する
    • 通常は1つのみで、「行動は効果リストを持つ」という関係だと思って良い
      • 仕様書内でも基本的には省略する
  • Effect(効果)
    • TypeScript の型名は FieldEffect
    • 範囲を持ち、行動者の位置と照準を引数に効果の対象を決定する
      • 対象は、クリーチャー・オブジェクト・床・空間・パーティのいずれか
    • 独立したアニメーションを持ち、前後のアニメーションを引数に、実行するアニメーションを決定する
      • 前後のアニメーションが必要なのは、例えば「剣で切る」アニメーションを連続で行うなら、1回目もしくは両方ともより短いものにした方が良いからである
    • 例えば、「連続攻撃」「攻撃後に追加効果で炎攻撃」のような表現は、複数の効果により表現する
  • Effect Content(効果内容)
    • TypeScript の型名は FieldEffectContent
    • 対象への作用を定義する
    • 基本的には、効果1につき効果内容1になるようにする
      • 複数の内容の組み合わせでしか表現できないときに複数効果内容を設定する
        • 例えば、火の魔法は敵にダメージを与えつつ、床を燃焼状態にするとか

👀 各概念の詳細

Action(行動)

  • データ定義上のプロパティ
    • 名前
    • 略称
    • 魔法フラグ
      • 効果生成に際し魔法的な行動を伴うものか
        • あくまで行動に対しての種別で、それで生成された効果に魔法と非魔法の違いは設けない
    • 武器使用種別
      • 使用 or 不使用 or 任意使用
      • 複数の武器を装備していると、行動選択時にどの武器を使うかのプルダウン的なものが添えられる
    • 照準種別
      • 近接(体の移動と武器や手による接触を伴う形態) or 投射(投射物を発射する形態) or 射撃(投射より正確で速い上位互換)
      • 魔法ならデフォルトで投射、非魔法ならデフォルトで近接
    • 照準可能射程
    • 複数照準フラグ
    • 非推奨照準可能射程
    • 行動関係性種別
      • 敵対 or 友好 or 中立
      • 以下の影響がある
        • A)照準可能なマスの強調表示が変わる
          • 敵対なら敵フィールドのみを強調表示する、友好は味方フィールドのみ、中立は両方
          • 強調表示してないマスも薄く範囲表示されており、視認は可能にする
        • B)敵対行動フラグへ変換して効果へ渡す
          • 敵対なら常に True、友好なら常に False、中立なら対象が敵味方どちらかで True or False
          • 効果側で解説
    • 効果リスト
    • タグ
  • インスタンス生成に必要な引数
    • (インスタンス生成しなさそう)

Effect(効果)

  • データ定義上のプロパティ
    • 名前?
    • Contact Form(接触形態)
      • 発揮した効果がどのように対象に接触して影響を及ぼすか
        • 空間なら同マスに存在するオブジェクトへ同時に影響を与えることができる
        • ゲーム的に違いは軽微、データモデリング上の整理で作った
      • 種類
        • 対象指定: 対象を照準して当てることで影響を及ぼす
        • 空間: 空間へ影響を及ぼす、その結果対象を巻き込む形で影響を及ぼす
    • 範囲
    • 効果内容設定
      • 敵対 or 友好のどちらか一方または両方が、内部へ効果内容リストを持つ設定
        • type 効果内容設定 = { 敵対: 効果内容[]} | { 友好: 効果内容[]} | | { 敵対: 効果内容[], 友好: 効果内容[]}
      • 先頭から影響を反映する。必ず連続で解決し、対象は先の効果内容の結果を反映した状態で後続へ渡される。
      • 効果リストで表現するのと比べて以下の違いがある
        • A)個別のアニメーションを持たない
          • 例えば、「炎攻撃でダメージを与えつつ炎上デバフを与える」ならアニメーションは炎が燃える感じの1つなので、効果内容リストに2つ含めた方が自然
        • B)割り込みが入らない
          • 効果実行後は、反撃などの反応行動による効果が割り込みで差し込まれることがあるが、効果内容リストは必ず連続して実行する
    • タグ
    • アニメーション
  • インスタンス生成に必要な引数
    • 行動者ID?
    • 行動ID?
    • 名前
      • 効果アニメーション中やログに表示される名前
      • 基本的には、以下のような最終表示になる
        • 行動が効果1つのみを持つ場合: "{行動名}"
        • 行動が複数効果を持つ場合: "{行動名} {効果名}"
        • 効果のみの場合: "{効果名}"
          • 反撃などは効果中に効果を差し込むのでこれになる
      • 効果.名前 データ定義は省略可なので、その場合は一定のルールで生成する
        • 効果内容がダメージなら属性種別の名称(斬撃・熱とか)、デバフ・バフなら状態修正種別名、回復なら一律 "回復" になるなど
    • 選択された照準マス
    • 武器使用フラグ
    • 敵対行動フラグ
      • True or False
      • 効果内容のどちらを使うかを決定する際に参照する
        • True: 敵対設定があれば優先してそれを使う、なければ友好設定を使う
        • False: 友好設定があれば優先してそれを使う、なければ敵対設定を使う
      • 例えば、「狂戦士化」のような利益・不利益のある効果の場合、味方にかければ抵抗判定が生じさせず、敵にかければ抵抗判定が生じさせたい
        • この場合は、効果内容設定に敵対・友好両方設定しておくと、立場に応じて効果が変化する
  • 補足
    • 行動から独立できる必要があるため、必要な値は値コピーする
      • 存在すれば、行動者IDや行動IDも渡す
      • 集計やロギングに使うかもしれない

Effect Content(効果内容)

前提・補足

  • 以下の対象種別によりデータ定義上のプロパティセットが分岐する
    • Object(オブジェクト)
    • Floor(床)
    • Air(空気)

オブジェクト種別のプロパティ

  • データ定義上のプロパティ
    • 参照主要能力値リスト
      • 0 個以上の Str・Agi・Int
    • 内容設定: 以下いずれか一つ
      • ダメージ設定
        • 攻撃特性設定
          • ダメージ属性リスト
            • 0 個以上の斬撃・打撃・刺突・熱・冷気・電撃・酸・震動・無
          • 攻撃特性強度
            • 0 以上の整数
        • ダメージ強度修正
          • 0% 以上
      • デバフ設定
        • デバフ種別
        • デバフ種類別設定
          • 効果量・効果時間など
        • デバフ強度修正
          • 0% 以上
        • 抵抗時参照主要能力値リスト
          • 0 個以上の Str・Agi・Int
      • 回復設定
        • 効果量・効果時間など
      • バフ設定
        • デバフ種別
        • デバフ種類別設定
          • 効果量・効果時間など
        • デバフ強度修正
          • 0% 以上
      • 移動設定
        • 方向とマス数
        • デバフ強度修正
          • 0% 以上
  • インスタンス生成に必要な引数
    • (インスタンス生成しなさそう)

床種別のプロパティ

  • 状態修正
    • 1 個

空気種別のプロパティ

  • 状態修正
    • 1 個

🗣️ 補足・Tips

各種省略記法

  • スキル詳細や行動詳細の定義時に可能な省略記法
  • {A}@{B}
    • B + B / 5 * A依存の回復強度orバフ強度 を算出する式
      • A = Str or Agi or Int
      • B = 1 以上の整数
    • 例えば、Int@15なら、15 + 3Int回復強度orバフ強度 になる
    • 主要能力値依存で値がスケールする回復効果・バフ効果の値を定義するときの基本的な式として使う

フレンドリーファイア時にダメージを減らさないでいいのか?

  • 敵対フラグがFalseのときにダメージ減少補正は不要かという論点
  • 結論は不要、ただし以下のように仕様やデータ定義に制約が必要
    • A)自傷やフレンドリーファイアを行う利益を無くす
      • 例えば、「睡眠を攻撃で解除」のような仕様を作らない
    • B)敵陣のフィールドへ友好的なオブジェクトが存在しないようにする
      • 例えば、「敵陣へ回転するブレードのオブジェクトがダメージを与える」ような仕様を作らない
        • 床・空気の状態修正で表現する