ルールセットの戦闘

このページでは、ルールセットが戦闘にどう関わるかを決めます。battleブロックはMarinaraの戦闘にシートを貸し出し、combatブロックはベスティアリ、盤面、リアクション、対抗判定とともに、ルールセット独自の規則で戦闘全体を解決します。ルールセットの作者向けのページです。始める前に、Game Modeのルールセットを作成するを読んでください。

このページのセクションは次のとおりです。

戦闘への橋渡し: シートをMarinaraの戦闘に貸す

デフォルトでは戦闘はシートを知りません。従来どおりに戦闘者を組み立て、戦闘後もシートのHPが変わらないことがあります。

任意のbattleブロックは、シートの数値を戦闘へ貸し、結果を書き戻すという一方向でこれを変えます。戦闘を独自の規則に従わせるものではありません。 ダイス計算も、誰が誰に何点当てるかもMarinaraの規則です。そのため体力は元の数値ではなく最大値への割合で渡します。シートで半分ならMarinaraが作るHPバーも半分で始めます。HP9のプールを、1撃12ダメージの戦闘へそのまま持ち込みません。

"battle": {
  "health": { "pool": "grit" },
  "energy": { "pool": "luck" },
  "skills": [{ "list": "knacks" }]
}

持ち込むものと持ち帰るもの

開始時、ゲームがシートを持つ各仲間について、体力プールの最大値に対する割合でMarinaraのHPバーの開始位置を決め、エネルギーをMP、各スロットプールをそのレベルのスロット、印付きの行をスキルにします。最大HP、攻撃、防御、速度、レベルはMarinaraの数値のままです。体力プールが0なら倒れた状態で始め、0より大きければHP1未満にはしないため、小さい割合の丸めで倒れることはありません。

終了時、最終HPバーの割合を体力プールの尺度へ戻し、開始時との差をダメージか回復として適用します。エネルギーとスロットは割合でなく個数なのでそのまま戻します。シートのボタンと同じ規則を通し、拒否された変更は強制せず省略して報告します。HPが変わらなかった戦闘では体力の変更を書かないため、往復の変換だけでシート値が変わることはありません。

どちらにも含まれないものは、攻撃ロール、セーヴィングスロー、精神集中、高いコストによる追加効果です。将来の本格的な戦闘システムが読むためにmechanicsへありますが、この橋渡しは適用せず、対応すると称してはいけません。

放棄した戦闘は何も書き戻しません。開始元のメッセージを削除したり、戦闘が終了しなかったりした場合、シートは元のままです。その戦闘は起きなかったことになります。

項目がスキルになる仕組み

カタログ項目のmechanicsブロックは、次のように読み取られます。

coverage.combatは別の指定で、意味も変わりません。戦闘がそのシステムのルールに従う場合だけ設定してください。

Combat: 独自のルールで解決する戦闘

前述のbattleブロックは、計算をMarinaraに任せたままシートの数値を戦闘に貸し出します。任意のcombatブロックは別のもので、独自のルールが戦闘をどう解決するかを定めます。resolutionが判定の種類にパラメーターを渡すのと同じように、Engineが持つ戦闘の種類をパラメーター化し、その中の名称はすべて作者が決めます。種類は3つです。ダイスを合計して数値と比較するattack-vs-defense、戦闘でdice-poolルールセット自身のプールを振って成功を数えるdice-pool(後述の「プールで振る戦闘」を参照)、symbol-poolルールセットのナラティブダイスを振り、残ったシンボルを消費するsymbol-poolです(後述の「シンボルダイスで振る戦闘」を参照)。

combatを宣言するルールセットのゲームは、そのブロックに従って戦います。 パーティーの数値は各自のシートから読み取り、敵は独自のベスティアリか脅威尺度から取り、各ターンを独自のダイスで解決します。キャラクターが消費したものや失ったものは、その都度シートに書き戻すため、戦闘の途中でタブを閉じても何も失われません。戦闘画面も独自の言葉で進行します。攻撃と能力がメニューになり、独自の行動枠と状態を使い、ログには実際の計算が残ります。未対応の内容は「未対応」にまとめています。

"combat": {
  "kind": "attack-vs-defense",
  "health": { "pool": "grit" },
  "defense": { "derived": "guard" },
  "initiative": { "dice": { "count": 2, "sides": 6 }, "modifier": { "abilityMod": "wits" } },
  "attackRoll": { "dice": { "count": 2, "sides": 6 } },
  "economy": { "budgets": [{ "id": "act", "label": "Action", "per": "turn", "count": 1 }] },
  "attacks": [
    {
      "list": "gear",
      "budget": "act",
      "name": "name",
      "toHit": { "ability": { "column": "swing" } },
      "damage": { "dice": { "column": "damage" }, "ability": { "column": "swing" }, "type": { "column": "harm" } }
    }
  ],
  "abilities": [{ "list": "knacks", "budget": "act" }],
  "standard": ["dodge", "help"],
  "conditions": [
    { "condition": "shaken", "effects": ["own-attacks-disadvantage", "ends-on-damage"] },
    { "condition": "pinned", "effects": ["cannot-act", "speed-zero"] }
  ]
}

これがEmber Roadsのブロック全体であり、Ember Roadsのゲームはこのルールで戦います。5eの草案では、同じキーをd20システムに使います。

"combat": {
  "kind": "attack-vs-defense",
  "health": { "pool": "hp" },
  "defense": { "field": "ac" },
  "initiative": { "dice": { "count": 1, "sides": 20 }, "modifier": { "derived": "initiative" } },
  "attackRoll": {
    "dice": { "count": 1, "sides": 20 },
    "advantage": true,
    "naturals": { "max": "critical", "min": "miss" },
    "critical": "double-dice"
  },
  "economy": {
    "budgets": [
      { "id": "action", "label": "Action", "per": "turn", "count": 1 },
      { "id": "bonus", "label": "Bonus action", "per": "turn", "count": 1 },
      { "id": "reaction", "label": "Reaction", "per": "turn", "count": 1 }
    ],
    "movement": { "field": "speed" }
  },
  "abilities": [
    {
      "list": "spells",
      "onlyWhen": "prepared",
      "alwaysWhen": { "column": "level", "equals": 0 },
      "budget": "action",
      "toHit": { "derived": "spell_attack" },
      "saveDifficulty": { "derived": "spell_save_dc" }
    }
  ],
  "concentration": { "text": "concentration", "save": "con_save", "floor": 10, "fromDamage": 0.5 }
}

各キー

  {
    "list": "attacks",
    "budget": "action",
    "name": "name",
    "strikes": { "field": "attacks_per_action" },
    "damage": { "dice": { "column": "damage" } }
  }

Capability API 1.108では、byColumn: { "column": "class", "values": { "cleric": { "toHit": { "derived": "spell_attack_cleric" }, "saveDifficulty": { "derived": "spell_dc_cleric" } }, "wizard": { "toHit": { "derived": "spell_attack_wizard" }, "saveDifficulty": { "derived": "spell_dc_wizard" } } }が行のクラスによって参照を選びます。クレリック(3)/ウィザード(2)なら、クレリックの攻撃を習熟とWisdomから、難易度を「8 + その攻撃」から求め、ウィザードのものは代わりにIntelligenceから求められます。列は出所のリストに存在する必要があり、valuesには、1~20項目を指定します。各項目はどちらの参照も置き換えられます。省略した参照、列の値がない場合、列挙されていない値では、出所自身の参照を保ちます。戦闘、シートの行の要約、Game Masterの要約は、同じ行ごとの数値を読みます。stampとbyColumnはどちらも、schemaVersion 2とcapabilityApi 1.108以降が必要です。

"devil", "label": "devil" }], "field": "race", "default": "humanoid" } のように書きます。クリーチャーは自身のtypeとtagsを指定します。キャラクターの種類は、テキストか選択のフィールドfieldの値が種類の一つならその値、そうでなければdefaultです(5eのキャラクターは人型生物です)。標的の条件は{ "types": [...], "tags": [...] }で、どれか一つが一致すれば通ります。種類もタグもない戦闘員は決して一致しません。これは三か所で使います。ダメージの条項のtargetIsは、一致する標的にだけその条項を与えます(dragon slayerは"plus": [{ "dice": "3d6", "type": "slashing", "targetIs": { "types": ["dragon"] } }]、聖水は{ "dice": "2d6", "type": "radiant", "targetIs": { "types": ["fiend", "undead"] } })。appliesの項目のtargetIsは、一致する標的にだけその状態を付与します。mechanics.targetTypes: { "is": test, "not": test }は、そもそも誰を選べるか、巻き込めるかを示します(Animal Friendshipは{ "is": { "types": ["beast"] } }、Sleepは{ "not": { "types": ["undead"] } })。範囲はtargetTypesが除外する者を素通りします。見込みは、targetIs`の条項を届く標的に対してだけ数え、シートの単純な平均はそれを除外します。戦闘パネルとGMは、各戦闘員の種類とタグを見られます。schemaVersion 2とcapabilityApi 1.168以降が必要です。

"items": true } は、その行動枠を何に使えるかを示します。指定した標準アクション(ルールセット自身のstandardリストのもので、すべての標準アクションがすでにある最初の行動枠では使いません)、単一の打撃による武器攻撃一回(アクションが本来与える打撃の数にかかわらず。クリーチャーなら、ステータスブロックの単一標的の攻撃で、連続攻撃は不可)、アイテムの使用です。アイテムはtrueならどのアイテムも、{ "tags": ["mundane"] }`ならそれらのタグのどれかを持つアイテムだけです(5eのUse an Objectは普通のアイテムの使用で、魔法のアイテムの起動は含みません)。これらは通常消費する行動枠がなくなった後に、持ち主自身のターンにだけ提示されます。付与がリアクションの支払いになることはありません。

own-saves-advantageとその反対の効果は、攻撃と同じくセーヴを2回振って片方を使い、互いに打ち消し合います。own-checks-advantageとその反対の効果は、戦闘が能力値判定を行う場である対抗判定の持ち主側と、戦闘外の判定に同じことをします。resist-allは標的自身の耐性などに加えてあらゆる種類の被害を半減し、同じように脆弱性と相殺します。cannot-target-sourceは、状態を付与した相手に何かを向けることを禁じます。cannot-target-source-side(1.278)は、さらにその相手の側の誰かに向けることも禁じます。ただし、その側が持ち主自身の側なら除きます。cannot-approach-sourceは、移動経路も含め、現在のマスよりその相手に近づくことを禁じます。同じ距離のマスへ迂回する経路は引き続き提示されますが、相手の近くを通って反対側に出る経路は提示されません。

  { "condition": "restrained", "effects": ["own-saves-disadvantage"], "saves": ["dex_save"] }

状態が変えるダメージ(Capability API 1.133)。 damageは持ち主が与えるものを、damage-takenは持ち主が受けるものを変えます。どちらもflat、dice(とminus)、またはtimes: 0.5 | 2を受け付けます。加算は、命中に複数のダメージの条項があっても、攻撃の命中ごとに1回行います。クリティカルは、ルールセットがほかのダイスを倍にするのと同じく、加えたダイスを倍にします。セーヴと自動命中には何も加わりません。timesは加算の後、抵抗の前に命中全体を変え、条項全体にわたって合計を1回切り捨てます。加えた量は、自身のdamageType(省略時は命中の種類)で抵抗を受けます。同じ種類の加算は、抵抗の前にその量に合わさります。

attacksはweapon、spell、any(デフォルト)のいずれかです。攻撃リストの行と装備したアイテムの攻撃は武器で、単一標的のステータスブロックの攻撃判定も武器です。カタログの能力(クリーチャーの呪文発動を含む)とアイテムの使用は、呪文やその他の攻撃です。blow: "melee" | "ranged"は1.118に従うため、間合い内の投擲武器は近接です。abilityは、攻撃判定に選ばれた能力値を指定します。行の能力値か、アイテムが提示する最良の能力値の最初のもの(フィネスを含みます)です。普通のステータスブロックのアクションは能力値を持たず、能力値の制限に一致することはありません。これらのキーとdamageTypeは、ほかの修正値の対象では拒否されます。fromSource: trueはdamage-taken専用で、命中は追跡している状態を付与した者からのものである必要があります。追跡していない状態、段階、アイテムには付与した出所がないため、一致しません。

5eでは、シートでこれらの状態IDを宣言し、combat.conditionsに次の項目を入れます。

  [
    {
      "condition": "divine_favor",
      "modifiers": [{ "to": "damage", "attacks": "weapon", "dice": "1d4", "damageType": "radiant" }]
    },
    {
      "condition": "rage",
      "modifiers": [{ "to": "damage", "attacks": "weapon", "blow": "melee", "ability": "str", "flat": 2 }]
    },
    {
      "condition": "enfeebled",
      "modifiers": [{ "to": "damage", "attacks": "weapon", "ability": "str", "times": 0.5 }]
    },
    {
      "condition": "hunters_mark",
      "modifiers": [{ "to": "damage-taken", "attacks": "weapon", "fromSource": true, "dice": "1d6" }]
    }
  ]

Divine FavorとRageは術者自身に、Ray of EnfeeblementとHunter's Markは標的に付与します。Hexは、マークのdamage-takenの項目をattacks: "any"とdamageType: "necrotic"で使います。段階と、アイテムのworn、carried、要件のotherwiseの効果も、これらの修正値を共有します。攻撃メニューは持ち主自身の加算と倍率だけを数え、標的のマークがそこで約束されることはありません。シートとプロンプトの要約は持ち主自身のダメージの修正値を説明し、戦闘の表示は受けるものも説明します。どちらの対象を使うパッケージも、アイテムが別のカタログファイルにある場合を含め、schemaVersion 2とcapabilityApi 1.133以降が必要です。

状態が変更する数値。 modifiersの各項目は、変更するもの(to)と量を指定します。

checksへの修正値は独自のskillsを、savesへの修正値は独自のsavesを指定でき、状態の指定の代わりにそれで絞り込みます。どちらもmode: "advantage"か"disadvantage"で2回振ることができ、同名の効果と一緒に数えて同じように打ち消し合い、数値の併記は任意です。そのため1つの状態でSneakを難しくし、同時にClimbを易しくできます。この3つのキーにはCapability API 1.53が必要です。

  { "condition": "muddy", "modifiers": [{ "to": "checks", "skills": ["sneak"], "mode": "disadvantage" }] }

固定値は独自の符号を持ち、0は拒否されます。すべての修正値は、変更したロールの横に状態の名前とともにログに表示され(「12 + 5 + 3 (Blessed) = 20」)、メニューの命中率と勝率にも数えます。状態同士は累積しますが、同じ状態が2つあっても1つの状態です。

  "conditions": [
    { "condition": "blessed", "modifiers": [{ "to": "attacks", "dice": "1d4" }, { "to": "saves", "dice": "1d4" }] },
    { "condition": "shielded", "modifiers": [{ "to": "defense", "flat": 5 }] },
    { "condition": "slowed", "modifiers": [{ "to": "speed", "times": 0.5 }, { "to": "defense", "flat": -2 }] }
  ]

trackの代わりに、段階はキャラクターのライブ状態とアイテムを使って計算するderived値を読めます(Capability API 1.54)。誰も印を付ける必要はありません。Ember Roadsは、Bulkを10以上運ぶ者を遅くします。

  {
    "derived": "bulk_carried",
    "at": 10,
    "modifiers": [
      { "to": "speed", "flat": -2 },
      { "to": "checks", "skills": ["sneak"], "flat": -1 }
    ]
  }

キャラクターごとに異なるしきい値(「Strengthの5倍を超える」)は、それを差し引く派生値で表します。-1のscaleで差し引く部分を作り、2つのsumを段階が読みます。

  "levels": [
    { "track": "exhaustion", "at": 1, "effects": ["own-checks-disadvantage"] },
    { "track": "exhaustion", "at": 2, "modifiers": [{ "to": "speed", "times": 0.5 }] },
    { "track": "exhaustion", "at": 3, "effects": ["own-attacks-disadvantage", "own-saves-disadvantage"] },
    { "track": "exhaustion", "at": 4, "modifiers": [{ "to": "health-max", "times": 0.5 }] },
    { "track": "exhaustion", "at": 5, "effects": ["speed-zero"] },
    { "track": "exhaustion", "at": 6, "defeats": true }
  ]

"defeats": trueは、戦闘開始時、誰かが動く前に、持ち主を戦闘から完全に退場させます(Capability API 1.115)。これと、半分にした最大値で失われる体力は、戦闘開始時に1回だけ決着します。ほかのすべての段階は、それが変える数値が読まれるたびに読まれます。

敵もトラックを持ちます(Capability API 1.115)。シートのない敵は、独自のトラックIDで与えられたtracksから始まります。GMが提案するクリーチャーはそれを指定でき("tracks": { "exhaustion": 2 })、戦闘に入れるベスティアリの敵も同じです。クリーチャーのconditionImmunitiesは段階が読むトラックを指定でき、その場合、シートの有無にかかわらず、そのトラックのどの段階も影響しません。消耗に完全耐性を持つ5eのアンデッドと人造がこれにあたります。

修正値、段階、判定の効果にはCapability API 1.45が必要です。

段階には、遭遇の行動枠に対してその段階のクリーチャーをどれだけの価値として数えるかを示すworth(5eでは脅威度ごとの経験値)を指定でき、threatには、対峙するパーティーに対して戦闘に含められる価値を示すbudgetを指定できます(Capability API 1.803)。

Game Masterには、戦闘を書く前に各段階の価値とパーティーの行動枠が伝えられます。Game Masterが作った戦闘の価値がそれを超える場合は、収まるまで、作り出した相手のうち最も価値が高いものの段階を繰り返し下げます。ボスがいる戦闘は、次のステップまで許容されます。ベスティアリのクリーチャーと以前の戦闘から再登場する相手はそのまま数え、物語の戦闘はその作者が決めます。何を下げたかは、戦闘の調整内容に示されます。

状態、ダメージ、魔法に対するセーヴ

to: "saves"の修正値はagainstを持てます。conditions(シートの状態ID)、damage(ダメージの種類)、magic: trueの少なくとも1つが必要です。どれか1つが一致すれば十分で、savesは引き続き、どのセーヴかをAND条件で絞り込みます。この方法で有利を絞り込むには、effectsではなく、修正値のmode: "advantage"を使ってください。これらの修正値は、状態、到達したトラックや派生値の段階、アイテムの効果で機能します。種族の特徴には、シートの種族の選択から値を派生させ、その値が1のときに到達する段階に修正値を付けてください。修正値の例です。

[
  {
    "$comment": "Dwarven Resilience",
    "to": "saves",
    "mode": "advantage",
    "against": { "conditions": ["poisoned"], "damage": ["poison"] }
  },
  { "$comment": "Fey Ancestry", "to": "saves", "mode": "advantage", "against": { "conditions": ["charmed"] } },
  {
    "$comment": "Gnome Cunning",
    "to": "saves",
    "saves": ["int_save", "wis_save", "cha_save"],
    "mode": "advantage",
    "against": { "magic": true }
  }
]

Braveはconditions: ["frightened"]を使います。Magic Resistanceは、クリーチャーのシート由来の段階かトラックの段階で、savesなしでmagic: trueを使います。アクションのappliesは、セーヴが状態を防いでも数えられ、そのダメージはすべてのplusの条項を含みます。ダメージの名前は大文字と小文字を区別せずに照合します。魔法とは1.101の"magical"の性質のことで、カタログのmechanics.qualities(ダメージがなくても)、クリーチャーのアクションのdamage.qualities、武器のアイテムのタグです。呪文はその性質を持つ必要があり、名前やカタログだけでは魔法になりません。saveWhenDamagedやsaveEnds.at: "damaged"を含め、状態を終わらせるセーヴは、その状態だけに対するものです。集中と死亡のセーヴは何に対するものでもありません。戦闘外では、GMのセーヴの要求は構造化された出所や状態を持たないため、againstがそれらの要求に一致することはありません。シート、アイテムの詳細、戦闘の詳細、GMのシートの要約は、これらの制限を示します。schemaVersion 2とcapabilityApi 1.134以降が必要です。

プールで振る戦闘: dice-pool

dice-poolルールセットはダイスを合計せずに成功を数え、その戦闘も同じようにできます。"kind": "dice-pool"には"dice-pool"のresolution.kindが必要で、プール判定と同じようにシートを読みます。ロールが加える数値はすべてダイスの個数で、ロールが対抗する数値はすべて成功数です。 そのため名前を変えるものはありません。

プール方式の戦闘がそれ以外に振るものはpoolブロックです。

"pool": {
  "advantage": true,
  "damageTarget": 6,
  "soak": { "roll": true, "byKind": { "knock": { "abilityMod": "sinew" } } }
}

命中が必要数を超えて得たものと吸収するものは各標的のものなので、ダメージは標的ごとに振ります。打撃の2つ目の節と追加効果は、それぞれ独自の種類のダメージプールで、命中による追加ダイスはありません。メニューはプールを正確に予測します。必要な成功数に届く確率と、最初の標的の吸収後のダメージダイスの価値です。

Gravewatchはこの方法で書かれています。番人は評価値と専門技能を振り、knockはSinewで吸収してtearはまったく吸収せず、1ターンにResolveを1ポイント消費でき、毎ラウンドイニシアチブを振り直します。

逆順の宣言は実装していません。 行動前に全員が遅い順に行動を宣言するシステムもあります。各戦闘員が自分のターンに1つの行動を選ぶ戦闘では、先に宣言しても規則が読むものは何も変わらないため、キーで示すことはありません。

シンボルダイスで振る戦闘: symbol-pool

symbol-poolのルールセットは数値ではなくシンボルを読み、戦闘でも同じことができます。そのためEngineは、アドバンテージで何が得られたかをGame Masterに尋ねずに、戦闘全体を進行します。"kind": "symbol-pool"には、resolution.kindが"symbol-pool"であることが必要で、既存のシンボル判定と同じ方法でシートを読みます。

シンボルの効果はsymbolsブロックで定めます。

"symbols": {
  "damage": { "perSuccess": 1, "counts": "all" },
  "soak": { "all": { "derived": "soak" } },
  "spends": [
    { "id": "boost", "label": "Boost an ally", "by": "attacker", "symbol": "a", "cost": 1, "boost": { "dice": 1, "on": "attacker-ally" } },
    { "id": "crit", "label": "Critical", "by": "attacker", "symbol": "a", "cost": 2, "when": "hit", "critical": true, "condition": { "id": "injured", "on": "target", "rounds": 3 } },
    { "id": "triumph", "label": "Triumphant blow", "by": "attacker", "symbol": "t", "cost": 1, "when": "hit", "critical": true, "damage": 2 },
    { "id": "strain", "label": "Overextend", "by": "target", "symbol": "h", "cost": 2, "track": { "id": "strain", "by": 1, "on": "attacker" } },
    { "id": "setback", "label": "Opening", "by": "target", "symbol": "h", "cost": 1, "setback": { "dice": 1, "on": "attacker" } },
    { "id": "despair", "label": "Weapon slips", "by": "target", "symbol": "d", "cost": 1, "condition": { "id": "disarmed", "on": "attacker" } }
  ]
}

Engineは、プレイヤーと敵のどちらについても、各側が持つシンボルで最も価値の高い効果を得るように消費し、それぞれをログに記します。プレイヤーは代わりに自分で選ぶこともできます。戦闘画面で「Choose my own symbol spends」(シンボルの消費を自分で選ぶ)にチェックを付けると、操作するパーティーメンバーのロールに消費できるものが残った場合、消費を1つずつ選ぶか、残りはEngineの選択に任せるか、それ以上消費しないことを選ぶまで待ちます。選択にはEngineと同じ規則(コスト、max、when、実際に適用できる効果)が適用され、ほかの全員については引き続きEngineが選びます。ルールセットに追加の指定は不要です。誰も消費しないシンボルはロールに残り、Game Masterが語りに使います。メニューの予測は、ロールの全結果を数えます。命中率と、成功数と消費による、吸収後の命中ダメージです。AIはこれに基づき、相手側の消費で受ける損失を差し引いて、各攻撃を評価します。

Game Masterに任せるもの。 消費のコストは武器ごとではなくルールセットで定めるため、独自のクリティカル値を持つ武器も、ルールセット共通の消費として記述します。クリティカル自体の表を振るのはGame Masterの役目です。セーヴ、判定、対抗判定のアドバンテージは、消費で効果を得られません。消費できるのは攻撃ロールだけです。戦闘で難易度ダイスを格上げする仕組みは未実装です。

最低ダメージダイス

プール方式の戦闘では、ExaltedのOverwhelmingのように、高い吸収に対してもダイスを残せます。

"damage": { "minimum": { "derived": "overwhelming" } }

これはcombat.damage.minimumで、攻撃者の現在のシートから読む値参照です。静的な吸収が命中の最初のダメージプールからダイスを除いた後、プールを少なくともこの数まで引き上げます。これは自動成功ではなくダイスの整数個で、切り捨てられ、0とresolution.pool.maxの範囲に収められます。残ったダイスはどれも失敗し得ます。振る吸収は、引き続きダメージのロールの後に成功を減らします。ダイスプールを減らすわけではないため、最低値はそれから成功を守りません。抵抗と完全耐性は引き続き適用されます。イニシアチブを費やす打撃は、武器のダメージや吸収を無視するのと同じく最低値を無視し、イニシアチブを奪う打撃はそれを使います。

武器はitem.attack.damage.minimumで共通の最低値を上書きできます。持ち主に対する同じ値参照か、アイテム自身の数値のステータスの1つを表す{ "stat": "overwhelming" }を受け付けます。0を宣言しても共通の最低値を上書きします。これは、吸収後のダメージ量を保証する既存の武器のfloorとは異なります。追加のダメージの条項や付加効果は、別の最低値を受けません。戦闘の記録とログは、ダイスの横に解決した最低値を示します。combatのキーと武器のキーはどちらも、外部のカタログファイルにある武器を含め、パッケージではCapability API 1.146が必要です。

ひるませる命中

"daze": {
  "over": { "abilityScore": "stamina" },
  "measure": "damage",
  "condition": "dazed",
  "text": "The blow leaves them reeling until their next turn passes."
}

combat.dazeはプール方式の戦闘向けです。overは命中の直前の標的の現在のシートを読みます。1回の命中が、吸収、セーヴ、抵抗の後に、その数値より厳密に多いダメージを与える必要があります。その命中のダメージの条項は合算しますが、別々の命中がひるみに向けて累積することはありません。打撃ごとに印を付けるトラックでは、ダメージを与える命中は1段階と数えます。体力ではなくイニシアチブを奪う打撃は、ひるませられません。measureは現在"damage"だけです。

標的はちょうど次の1ターンを飛ばします。そのターンの前にさらにひるませる命中があっても、飛ばすターンは増えません。飛ばしたターンも、ラウンドの変化やイニシアチブの振り直しを含め、状態の時間やほかのターンの処理を進めます。戦闘を保存して再読み込みしても、保留中の飛ばしは保たれます。conditionがあれば、宣言したシートの状態を指定します。戦闘は、飛ばしたターンが過ぎるか戦闘が終わるまで、それで印を付けます。すでにある状態はそのまま残ります。状態への完全耐性は印を防ぎますが、ターンを飛ばすことは防ぎません。textは任意の描写で、別の効果ではありません。ログとGMの戦闘のコンテキストは、命中と飛ばしを記録します。このキーにはCapability API 1.147が必要です。

標的が負傷の種類を選ぶ

既存のcombat.damageKindsの対応付けにremapを加えます。default、byType、marksはそのままにします。

"damageKinds": {
  "default": "bashing",
  "byType": { "bullet": "lethal", "fire": "aggravated" },
  "marks": "per-point",
  "remap": [
    { "when": { "field": "vampire" }, "from": "lethal", "to": "bashing", "tags": ["firearm"] }
  ]
}

プール方式の戦闘は、まず通常の対応付けで攻撃の種類を選び、次に標的について各remapのwhenを読みます。0でない数値で規則が有効になります。fromとtoはどちらも、体力の負傷トラックの種類である必要があります。最初に一致した規則が採用され、remapは連鎖しません。最大12個まで指定できます。tagsがある場合は、少なくとも1つが攻撃に一致する必要があります。武器はすでにitem.tagsを持ち、カタログのmechanicsとクリーチャーのダメージはすでにqualitiesを持ちます。これらの名前はitems.tagsから来ます。tagsがなければ、その種類のどの攻撃も一致し得ます。新しい攻撃のタグのフィールドは必要ありません。

結果の種類は、吸収と負傷の印の両方を決めます。そのため、火器の致死の命中は、ヴァンパイアに対しては打撃の種類になって打撃の吸収を使います。同じ火器でもほかの者に対してや、刃物でそのヴァンパイアに対しては、通常の種類のままです。攻撃の元のダメージの種類は、抵抗と完全耐性については変わりません。各ダメージの条項は、それ自身の種類と攻撃のタグを使います。戦闘の記録とログは元の種類と対応付けた種類を示し、ダメージの見込みも同じ規則を読みます。シートのない普通のクリーチャーは定数の参照を満たせますが、これらの規則のためのシートの値は提供できません。そのためにはクリーチャーにシートを与えてください。Capability API 1.148が必要なのは新しいremapキーだけで、古いダメージの種類の対応付けは既存の互換性を保ちます。

攻撃で動くイニシアチブ

プールのシステムには、戦闘全体を通じてイニシアチブを数値として保持し、攻撃で動かせるものがあります。ある攻撃方法は標的からそれを奪い、別の方法は攻撃者自身の数値をダメージとして費やし、決まった線まで落ちた者はクラッシュします。dice-poolの戦闘はこれを表せます(Capability API 1.48)。

"initiative": {
  "pool": { "abilityMod": "nerve" },
  "plus": 3,
  "resource": {
    "base": 3,
    "styles": [
      { "id": "press", "label": "Press", "takes": { "gain": 1 } },
      { "id": "telling", "label": "Telling blow", "spends": { "onMiss": [[0, 1], [6, 2], [11, 3]] } }
    ],
    "crash": { "at": 0, "condition": "reeling", "bonus": 5, "recoverAfter": 3 }
  }
}

メニューは各スタイルの見込みを示します。命中率と、奪うスタイルなら奪う量、費やすスタイルなら与える被害です。ステータスパネルは全員の数値を示し、ログはすべての変化とその理由を示します(「Ada gains 5 initiative for crashing Rats, and is on 14.」)。Engineの選択処理は奪う打撃を1ターン先まで評価し、奪ってから費やす場合と、今費やして基準値から再び費やす場合を比べます。

戦闘がmechanicsから読み取るもの

kindはamountがダメージか回復かを決めます。reactionが付いた項目はメニューから除外され、utility項目もターン自体に使えるものを変えない限り除外されます(後述)。attackRollはリストのtoHitを使って標的の防御への判定を行わせ、autoHitはそれを完全に省略します。saveはリストのsaveDifficultyに対して標的自身のセーヴを振り、onSuccessが成功時に半分を受けるかゼロになるかを決めます。targetCountは向けられる標的の数です。攻撃判定をしない能力(全員がセーヴする範囲や、命中するもの)は全員分のダイスを一度だけ振り、各標的への命中判定をするものは命中ごとにダイスを振り直します。appliesは影響を与えるものに状態を付与します。各状態はdurationとしてinstant(独自の時計がなく、何かで解除されるまで残る)、until-save(saveEndsの併記が必要)、{ "rounds": n }のいずれかを持ち、任意のsaveEndsでセーヴと、それをturn-endかturn-startのどちらで繰り返すかを指定します。ラウンドは持ち主自身のターンが終わるごとに減ります。{ "rounds": 1, "at": "turn-start" }はターンが始まるごとに数え、「次の自分のターンの開始まで」を表します。"of": "source"(Capability API 1.119)は、代わりに付与した者のターンを、その者の次のターンから数え、ほかの者について「次の自分のターンの終了まで」を表します。Guiding Boltの{ "duration": { "rounds": 1, "of": "source" }, "endsAfter": "attacked" }は、術者の次のターンの終了前に、その標的に対する次の攻撃判定に有利を与えます。出所が戦闘を離れると、ラウンドは持ち主自身のターンで数えます。戦闘の状態のdelays(Capability API 1.120)は、持ち主が使うものを遅らせます。そのcatalogsのどれかに属し、そのbudgetで支払うアクションはchance.sides面のダイスを振り、chance.atLeast以上ならまだ起こりません。持ち主の次のターンの開始時に、同じ行動枠で完了し、応答も含めて本来どおりに続きます。行動できないか、その行動枠がない場合は失われます。どちらの場合も、支払ったコストは消費されたままです。5eのSlowは"delays": { "catalogs": ["spells"], "budget": "action", "chance": { "sides": 20, "atLeast": 11 } }です。endsAfterは、時計の指定にかかわらず、最初のown-attack(持ち主の次の攻撃判定)、attacked(持ち主に対する次の攻撃判定)、own-save(持ち主の次のセーヴ)の後に状態を解除します。そのため{ "duration": { "rounds": 1 }, "endsAfter": "own-attack" }は「次のターンの終了前に行う次の攻撃まで」を表します。1回の攻撃の間続くものは、ダメージも含めてその攻撃全体の間続き、同じ打撃が新たに付与したものは残ります。どちらにもCapability API 1.45が必要です。temporaryは体力プールに一時ポイントを与えますが、累積せず、大きい方のバッファが残ります。scalesは読み取った値に対応して表が与える追加ダイスで量を増やします。costはシート自身のuseコマンドで支払い、budgetは消費する行動枠を上書きします。

plusはamountに加えて同じ打撃に最大3つの量を追加し、それぞれ独自に振り、種別を持たせます(「and 2d6 fire」)。節は{ "dice": "2d6", "flat": 1, "type": "fire" }の形で、独自のsaveとして{ "save": "con_save", "difficulty": 13, "onSuccess": "none" | "half" }を持つこともできます。アクションがすでに何を要求していても標的がこれを振ります。成功時、noneならその節はゼロ、halfなら半分となり、どちらでも打撃のほかの部分は変わりません。difficultyがなければ、アクション自身のセーヴが使う数値、次いでリストのsaveDifficultyにフォールバックします。クリティカルは最初の量と同じルールで各節のダイスを倍にします。typeがない節は打撃自身の被害の種類を使います。打撃全体は依然として、合計ダメージによる1回の集中判定と、1回の倒れるかどうかの判定です。節を付けるにはamountが必要で、healには付けられません。

{
  "kind": "attack",
  "attackRoll": true,
  "amount": { "dice": "1d8" },
  "damageType": "piercing",
  "plus": [{ "dice": "2d6", "type": "fire" }]
}

3つのキーで、項目がターン自身の行動枠に何をするかを指定します。そのいずれかを宣言するutility項目は、除外せず提示されます。

新しいkind: "rider"の項目は受動的です。誰も実行せず、メニューにも出ず、各期間で最初の条件を満たす命中に、ダメージ節を1つ自動で追加します。riderを持ち、ほかの実行する内容は持ちません。

{
  "kind": "rider",
  "rider": {
    "on": "hit",
    "sources": ["attacks"],
    "requires": { "column": "finesse" },
    "when": ["advantage", "ally-adjacent-no-disadvantage"],
    "oncePer": "turn",
    "amount": { "dice": "1d6" }
  },
  "scales": {
    "from": { "field": "level" },
    "table": [
      [1, 0],
      [3, 1]
    ]
  }
}

sourcesは対象とする攻撃リストを、requiresはその行の真と評価される列を1つ指定します。特定の武器だけで発動する追加効果でも、Engineが武器の意味を知らずに対象を指定できます。どちらも指定しなければ、所有者によるあらゆる命中が対象です。袋から手に持った武器は行ではないため、weapons(Capability API 1.70)で発動するアイテムのタグも指定します。"weapons": { "tags": ["finesse", "ranged"] }は、どちらかのタグを持つ手持ちの武器による命中で、オフハンドの打撃も含めて発動します。weaponsだけを指定すると行では発動せず、行だけを指定すると手持ちの武器では発動しません。whenはいずれか1つを満たせば成立します。advantageは最終的に攻撃判定がどちらに有利だったかを表し、ally-adjacentは攻撃者の立っていて行動可能な味方で、盤面上なら標的から1マス以内、盤面なしならどこにいても該当します。ally-adjacent-no-disadvantage(Capability API 1.126)は、さらに、有利と不利が打ち消し合った後の最終的なロールが不利でないことを求めます。上の例ではSneak Attackにこれを使っています。oncePerはturn(存在するすべてのターンの開始時に更新するため、他者の行動中の打撃にも乗せられる)かroundです。amountは項目自身のscalesで増え、typeは被害の種類で、デフォルトは打撃自身の種類です。

クリーチャー: 戦闘が読み取るベスティアリ

"holds": "creatures"を宣言するカタログは、シートの行ではなく敵を含みます。どのリストにも供給せず、シートエディターの選択画面にも出ません。すべての数値は、combatブロックがすでに宣言しているキーで記述します。クリーチャーを独自の段階の1つに分類するため、combatブロックとthreat尺度が必要です。

{
  "id": "road_trouble",
  "label": "Road trouble",
  "holds": "creatures",
  "filters": [{ "id": "tier", "label": "How bad", "type": "text" }],
  "entries": [
    {
      "id": "rust-jackal",
      "label": "Rust Jackal",
      "summary": "A lean thing that lives on the metal roads.",
      "filters": { "tier": "Pack trouble" },
      "creature": {
        "health": { "dice": "3d6" },
        "defense": 6,
        "initiativeModifier": 1,
        "speed": 16,
        "abilities": { "brawn": 1, "wits": 0, "heart": -1 },
        "tier": "pack",
        "actions": [
          {
            "id": "bite",
            "name": "Bite",
            "budget": "act",
            "toHit": 2,
            "damage": { "dice": "1d6", "flat": 1, "type": "cut" },
            "reach": 2
          },
          {
            "id": "worry",
            "name": "Worry",
            "budget": "act",
            "toHit": 2,
            "damage": { "dice": "1d4", "type": "cut" },
            "applies": [{ "condition": "shaken", "duration": { "rounds": 2 } }]
          },
          {
            "id": "snap_and_worry",
            "name": "Snap and worry",
            "budget": "act",
            "sequence": [
              { "action": "bite", "times": 1 },
              { "action": "worry", "times": 1 }
            ]
          }
        ]
      }
    }
  ]
}

以下は数値を直接使ってクリーチャーを書く方法です。独自のルールセットの言葉でsheetとして書いた場合、health、defense、initiativeModifier、speed、abilities、saves、checks、soak、hardnessはそのシートから取得します(後述の「独自のルールセットの言葉で書くクリーチャー」を参照)。

    {
      "id": "parry",
      "name": "Parry",
      "budget": "reaction",
      "self": true,
      "reaction": { "on": "hit" },
      "applies": [{ "condition": "parrying", "duration": { "rounds": 1 }, "endsAfter": "attacked" }]
    }

クリーチャーのアクションは、heal(ダイス、固定量、またはその両方)でヒットポイントを戻せ、標的の最大値までに制限されます。targets: "ally"は自身を含む自分の側に、targets: "any"はどちらの側にも届きます。targetsがなければ、以前と同じく相手側に届きます。これらのキーにはCapability API 1.121が必要です。回復はdamage、toHit、save、areaを持たず、targetsはselfやsequenceを取らず、連続行動はどちらのキーも持ちません。デーヴァのHealing Touchは次のとおりです。

{
  "id": "healing_touch",
  "name": "Healing Touch",
  "budget": "action",
  "heal": { "dice": "4d8", "flat": 2 },
  "targets": "ally",
  "uses": { "per": "day", "count": 3 }
}

クリーチャーのspellcasting(Capability API 1.123)は、スロットやポイントを消費せずにカタログの呪文を発動します。そのsaveDifficultyとtoHitが呪文の数値を与えます。sheetを持つクリーチャーは、それらを省略してシートの呪文発動の数値を使えます。普通のクリーチャーは、呪文が必要とする数値をすべて与える必要があります。各entryは、mechanicsを持つ既存のカタログの項目を指定します。usesを省略すると無制限です。levelはperCostStepのスケーリングに使う発動レベルで、省略すると項目の基本レベルです。項目は引き続き、行動枠、標的、集中、リアクション、範囲、召喚を与えます。ドライアドの一覧は次のように書けます。これらの呪文IDは説明用で、spellsカタログで用意する必要があります。

"spellcasting": {
  "saveDifficulty": 14,
  "spells": [
    { "entry": "spells/druidcraft" },
    { "entry": "spells/entangle", "uses": { "per": "day", "count": 3 } },
    { "entry": "spells/goodberry", "uses": { "per": "day", "count": 3 } },
    { "entry": "spells/barkskin", "uses": { "per": "day", "count": 1 } },
    { "entry": "spells/pass-without-trace", "uses": { "per": "day", "count": 1 } },
    { "entry": "spells/shillelagh", "uses": { "per": "day", "count": 1 } }
  ]
}

ハッグのカヴンには、spellsと並べて"coven": { "id": "marsh_hags", "size": 3, "within": 30 }を加え、共有する各呪文に"coven": trueを付けます。それらの呪文は、術者の側の立っている戦闘員のうち少なくとも3人がそのカヴンIDを持ち、それぞれ単純なマス距離で術者からルールセットの距離の単位で30以内にいる間だけ提示されます。盤面がなければ、立っているすべてのメンバーを数えます。各呪文の使用回数は、カヴンIDと項目をキーとする、そのカヴン全体で共有する1つのプールです。カヴンのブロックにはカヴンの呪文が必要で、カヴンの呪文にはブロックが必要です。重複する項目は拒否されます。GMが提案するクリーチャーは、脅威の尺度で呪文の一覧を制限できないため、制限を受けるとspellcastingを失います。

5e草案のEngine内のテスト用コピーdocs/development/ruleset-5e-2014.example.jsonには、手書きのクリーチャー五体のベスティアリがあります。連続行動、再充填、状態を伴うセーヴ、抵抗と完全耐性、使用回数制限、固有ポイント、シートとして記述した1体を網羅しています。SRDの完全なベスティアリは、公式の5e (SRD 5.1)パッケージのcatalogs/creatures.jsonです。

独自のルールセットの言葉で書くクリーチャー

クリーチャーは数値を直接書く必要はありません。代わりにキャラクターのシートとまったく同じ形のsheetを与えると、戦闘はパーティーメンバーと同じ方法で構築します。体力、防御、セーヴ、イニシアチブ、速度、リスト上のすべての攻撃と能力は、独自のシートの式から得られます。敵がキャラクターと同じ能力値、スキル、リストを持つルールセットでは、それが何であってもこの方法で表現できます。Ember RoadsのToll Wardenは次のとおりです。

{
  "id": "toll-warden",
  "label": "Toll Warden",
  "creature": {
    "tier": "pack",
    "traits": [{ "name": "Knows the road", "text": "It will not follow anyone past the last milestone." }],
    "sheet": {
      "abilities": { "brawn": 2, "wits": 1, "heart": 1 },
      "skills": { "sway": "trained" },
      "fields": { "calling": "Hauler", "toughness": 3 },
      "lists": {
        "gear": [{ "name": "Toll hook", "swing": "brawn", "damage": "1d6", "harm": "cut" }],
        "knacks": [{ "name": "Hold the Line", "_catalog": "knacks/hold-the-line" }]
      }
    }
  }
}

5eの草案のToll Sergeantは、同じ仕組みをd20シートで表したものです。Armor Class、体力、セーヴ、1アクションで2回の攻撃は、すべて自身のフィールドと攻撃リストに由来します。

作者が用意していない敵

Game Masterが敵を作ると、Engineは何かを振る前にその提案をthreat尺度に収めます。体力は段階の帯域内、防御、命中補正、セーヴ難易度は段階の値より最大2上までとし、最強の1ラウンド(最も強い連続行動か単独アクションを、1体の標的に対して測ったもの)がその段階のdamagePerRound内になるまでダメージを減らします。最初にダイス個数、次に固定値、次に連続行動から打撃1回、最後にダイスの面数を減らし、ゼロにはしません。ルールセットにない名称は削除します。未知のダメージ種別、状態、セーヴと、最初の6つを超えるアクションが対象です。宣言されていない段階は尺度の最下段にフォールバックします。変更はすべて平易な文として返され、ログで内容を説明できます。

作られる敵も、ベスティアリのクリーチャーと同じくsheetとして書けます。これによって、即興の魔術師もスロットと呪文を持てます。Game MasterにはシートのIDと各項目に入る値、戦闘が読むリスト、カタログがそれらに提供する名前を見せるため、呪文は説明するのではなく名前で指定します。大文字・小文字を問わずカタログ項目を名指す行はその項目となり、Game Master自身の値(呪文の準備状態など)を上に重ねます。モデルが書くため、シートは寛容に読み取ります。ルールセットにない名前は削除し、値はフィールドや列に合わせ、シートの横に書かれた数値は使いません。

ボスではない即興のクリーチャーは、ルールセットがそれに開放する範囲に制限されます。カタログフィルターのstartFromは、項目を分類するシートのフィールドを指定します(5eパッケージの呪文リストならclass)。クリーチャーには、そのフィールドの自身の値にフィルターが一致する項目だけを残し、照合方法は選択画面を開くときと同じです。そのためSorcererが呪文リスト全体を持つことはなく、クラスを指定しない者はクラス別カタログから何も得ません。未選択の内容はGame Masterに聞き直さず埋めます。選択した行だけが有効な各リスト(戦闘能力の参照元にonlyWhenがあるもの)について、開放されていて自身のプールで支払える項目から、持っている各プールに対応するものと自由に使えるものを少数ずつ補充します。能力の高いクリーチャーほど多くなります。選ぶ内容は、戦い方にも使う気質と熟達度に寄せます。守備的・支援的なものは味方を支える効果、無謀なものは加害、几帳面・忍耐強いものは敵を抑える効果を選び、熟達するほどリアクション、対抗手段、その他ターンを変えるものを持ちやすくなります。抽選は戦闘自身のシードを使うため、同じ戦闘なら常に同じように埋まります。そのようなリストでGame Masterが名指した行は、選択済みとして扱います。

ボスは例外となり得るため、Game Masterが全体を書きます。何も取り除かず、何も補充しません。

その後、どちらも段階に収めます。

作者自身のベスティアリは制限しません。作者が書いたデータなので、Engineはそのまま受け取ります。

位置: 盤面上の戦闘

ブロックが盤面1マスの距離を定めるまでは、戦闘は想像上で進みます。distanceを宣言するとグリッドで戦えるようになり、移動、間合い、射程、範囲、視線、遮蔽、離れていく相手への打撃が意味を持ち始めます。それぞれの数値は作者が書くもので、Engineが提供するのは盤面だけです。

"distance": { "label": "ft", "perCell": 5 },
"ranged": { "long": "disadvantage", "adjacentFoe": "disadvantage" },
"cover": { "bonus": 2, "threeQuarters": 5, "saves": ["dex_save"], "creatures": true },
"opportunity": { "budget": "reaction" }

Ember Roadsはこの1行だけを宣言します。それ以外が必須ではないことを示す例です。

"distance": { "label": "paces", "perCell": 2 }

マス。 distance.perCellは1マスが独自の単位のいくつ分かを表し、labelはその単位の呼び名です。ブロックの世界のすべての距離、つまりeconomy.movement、クリーチャーのspeed、武器のreachとrange、クリーチャーのアクションのreachとrangeがこの単位です。独自のunits.distanceを宣言するカタログは、自身のperCellでmechanics.rangeとarea.sizeを変換します。宣言しないものはこの設定を使います。ゼロより大きな距離は最も近いマス数に丸め、ゼロにはしないため、数値を指定したものは少なくとも1マス届きます。ゼロは短い距離ではなく、独自の意味を保ちます。mechanics.rangeの0は自分か接触を意味します(他者への接触は隣のマスに届きます)。武器のreachまたはrange列が0の行は、その種類の距離を持ちません。

盤面上で戦うかどうか。 2つの条件を満たす必要があります。ブロックがdistanceを宣言し、プレイヤーのゲームがTactical戦闘スタイルに設定されていることです。Classicスタイル、またはdistanceのないルールセットでは、従来どおり想像上の戦闘となります。誰でも誰にでも向けることができ、以下の内容は一切読み取りません。

ゲームで使えるスタイル。 combat.stylesは、ルールセットを使うゲームで選べる戦闘スタイルをIDで指定します。classic、tactical、またはクライアントが登録したスタイルです(最大8個で、それぞれ1回ずつ、classicとtacticalの少なくとも一方を含めます)。省略すると、従来どおりすべてのスタイルを選べます。規則が盤面を必要とするルールセット(範囲、間合い、遮蔽、挟撃など)は、"styles": ["tactical"]を指定します。New Gameウィザードとゲームの設定にはTacticalだけが表示されるため、戦闘は必ず位置を持ちます。すでに保存済みのゲームがリストにないスタイルを使っている場合、列挙した中でクライアントが描画できる最初のものを使います(列挙した登録済みスタイルを持たないクライアントでは、列挙した最初の組み込みスタイルです)。リストにないスタイルでゲームを作成したり、設定でそのスタイルに切り替えたりすることはできません。進行中の戦闘は、開始時のスタイルを保ちます。このリストは戦闘ディレクターのオン・オフにかかわらず適用されるため、ルールセット上でのMarinara独自のClassicとTacticalの戦闘も制限します。stylesを使うルールセットにはCapability API 1.379が必要です。

"combat": {
  "kind": "attack-vs-defense",
  "styles": ["tactical"],
  "distance": { "label": "feet", "perCell": 5 }
}

プレイヤーの画面。 Tacticalスタイル自身の地形を使って盤面を描きます。各マスはポインターや矢印キーで操作できるボタンで、その場所の種類、誰がいるか、選択途中の操作にとって何を意味するかを示します。歩行ではメニューが提示したマスを光らせ、それぞれに独自の単位でコストを表示し、経路を描きます。その経路上で誰かが攻撃するマスは琥珀色で示し、盤面の下に相手の名前を出します。標的を取る選択肢では、選べる相手を盤面とリストの両方で同時に強調します。areaのある選択肢はマスに向け、ポインターの下のマスには味方も含めて巻き込む相手を表示します。残りの移動量は行動枠の横に、ここでも独自の単位で表示します。画面は測定しません。すべてのマス、コスト、経路、標的、狙い位置はサーバーから送られます。

移動。 1ターンの移動量は、パーティーメンバーならeconomy.movement、クリーチャーなら自身のspeedをperCellで割って切り捨てます。ただし移動可能な限り最低1マスです。所有者自身のターン開始時に補充し、アクションの前、合間、後に使えます。歩き、攻撃し、また歩けます。1マスに入るコストは1で、移動しにくい地形では増えます。この機能が想定するテーブルトップのグリッドに合わせ、8方向すべて同じコストです。味方は通り抜けられますが、誰かの上では止まれません。敵は壁になり、固体のマスには入れず、固体の2マスの角を斜めに抜けることもできません。

ほかの移動方法(Capability API 1.113)。クリーチャーのspeedsは、歩行以外の移動を独自の単位で{ "fly": 60, "swim": 30, "climb": 30, "burrow": 20 }のように示し、"hover": trueは、飛行者が浮いているために動く必要がないことを示します(flyの速度が必要です)。パーティーのメンバーのものは、種族の水泳速度や呪文の飛行速度のように、同じキーの値参照であるeconomy.movementModesを通じてシートから読みます。0はその方法では移動しないことを表します。speedとeconomy.movementは歩行のままです。盤面上では次のとおりです。

各歩は、十分な残りがある最も安い方法で行います。盤面のない戦闘はこれを何も読まず、歩くだけの者は以前とまったく同じく移動します。

飛行の高さ(Capability API 1.114)。ルールセットがcombat.elevation.levelHeightとcombat.distance.perCellを与える盤面では、飛行者はその場でFly upとFly downを提示され、それぞれ飛行の1レベル分のコストがかかります(5フィートのマスで5フィートのレベルなら1マス)。真下の地面から最大20レベル上まで上がれます。上空にいる間は次のとおりです。

自分の高さと同じかそれより高い地面へ飛ぶと、地上の飛行者が崖の上へ飛ぶのと同じく着地します。新しいキーはありません。1.114より前のEngineは飛行者を地上に留めるため、高さに頼るパッケージは1.114を宣言します。

飛行中の状態(Capability API 1.354)。どの盤面でも、飛行者が空中にいるかどうかは個別に保持します。歩行能力がないかhoverを持つ飛行者は、空中から始まります。地上にいるものは、無償のTake offで、上へ飛ぶことで、または飛行でしか行えない一歩(水上や、飛行が歩行より低コストな場所への移動)で離陸します。歩行能力があれば無償のLandで着地でき、ホバリング能力がない場合は、伏せ状態にされる、倒される、移動速度を0にされることでも着地します。Fly downで地面まで下りても、着地するまでは地面の高さで空中に留まります。空中にいる間、クリーチャーの画像には飛行中の画像を使います。規則のほかの部分は、まだこの状態を読みません。

間合いと射程。 武器の行はcombat.attacks[].reachと.rangeから取得します。それぞれ同じリストの列か、全行共通の数値です。

"attacks": [
  {
    "list": "attacks",
    "budget": "action",
    "name": "name",
    "toHit": { "ability": { "column": "ability" } },
    "damage": { "dice": { "column": "damage" } },
    "reach": { "column": "reach" },
    "range": { "normal": { "column": "range" }, "long": { "column": "long_range" } }
  }
]

列が0の行は、その種類の距離を持たないことを示します。通常の剣と投げ斧が同じリストに入る仕組みです。間合いがまったくない行は1マスに届きます。クリーチャーのアクションは自身のreachかrangeを使い、カタログの能力はmechanics.rangeを使います(0は自分か接触で、他者に向ける場合は1マスです)。

両方を持つ行は投擲武器です。間合いの内側では振るい、外側では射撃します。そのため、以下の射撃ルールは手に持って振るうときには適用されません。弓と違い、通り過ぎる相手を打つこともできます。

クリーチャーのアクションは、独自の単位で着弾するareaも持てます。{ "shape": "cone", "size": 15 }のように書き、"friendlyFire": falseなら味方を除外します。これによりブレスは標的数ではなく、盤面上の実際のコーンになります。連続行動は独自の形状を持たず、指定された各アクションが持ちます。盤面のない戦闘は形状を無視してtargetCountを使うため、クリーチャーの項目は両方を持てば、どちらでも正しく表現できます。

形状をどこまで送れるか。 rangeで指定します。100フィート先へ投げる球なら射程を持ちます。射程がなければバーストは置いた場所、つまり実行者自身のマスで発生します。コーンとラインは描く長さの範囲内のどこにでも向けられます。その場合のマスは方向を示すだけだからです。これはクリーチャーだけでなく、カタログ項目のmechanics.areaにも当てはまります。

rangedは、通常のnormal距離を超える射撃や、隣のマスに敵がいるときの射撃の不利益を指定します。どちらも"disadvantage"か"normal"です。ブロックを省略すると、どちらも不利益を受けません。近接の打撃は射撃ではないため、これらのルールは適用されません。自身の間合い内で使う投擲武器も同様です。

範囲。 項目のmechanics.areaは盤面上の実際の形状になり、誰かではなくマスに向けます。targetCountは関係せず、届く数は形状が決めます。項目に"friendlyFire": falseがない限り、そのマスに立つ全員、味方も敵も巻き込みます。

burst, size 2, aimed at X        cone, size 3, aimed right      line, size 3, aimed right
. . . . .                        . . . .                        . . . .
. # # # .                        . . # .                        A # # #
. # X # .                        A # # #                        . . . .
. # # # .                        . . # .
. . . . .                        . . . .

バーストは狙ったマスからサイズ以内のすべてのマスです。コーンは実行者からそのマスの方向へ伸び、各段階で距離と同じ幅になります。ラインは同じ方向へ1マス幅で伸びます。3つとも固体にぶつかると止まります。

項目のmechanics.areaやクリーチャーのアクションのareaのラインは、sizeと同じ単位でwidthを持てます。最低1マスとしてマス単位に丸められます(Capability API 1.128)。たとえば、幅10フィートの60フィートのラインは{ "shape": "line", "size": 60, "width": 10 }です。1マスなら省略します。偶数のマス幅では、追加の列は術者の左側に置かれます。

視線と遮蔽。 両者を結ぶマスの直線を使います。その上に壁や山があれば射撃を遮り、範囲が向こうへ広がることを止め、標的はメニューに出なくなります。水は見通せます。射撃は川を越え、ラインの範囲はその上を進みます。Engine自身の戦闘も同じ視線の判定を使います。

遮蔽は攻撃者の立つ位置から、DMGの任意のグリッド規則の角の線で読みます。攻撃者の最良の角から、標的のマスの各角へ1本ずつ線を引きます。3本か4本が壁や山を通れば四分の三遮蔽です。1本でも壁や山を通るか、遮蔽として意味のある地形(森、廃墟)を通れば半遮蔽です。低い地形だけでは半遮蔽を超えません。攻撃者がまったく見えない標的は完全遮蔽で、メニューに出ません。攻撃に対しては、遮蔽として意味のある地形に立つ標的は、これまでどおり少なくとも半遮蔽を得ます。セーヴについては、効果との間にあるものだけが助けになります。

高さ。 盤面は最大3レベルの高さを持て、位置のあるすべての戦闘は、ルールセットの指定にかかわらず、それに従って歩き、見ます。1レベル上るには1マス余分にかかり、下るにはコストがかかりません。2レベル以上の段差は誰も歩けない崖で(押し上げられることもありません)、両端より高い地面は視線を遮ります。高所から撃ち下ろす場合、間にある低い遮蔽は何も隠しません。ルールセットは、システムが加えるものをelevationで示します(Capability API 1.75。distanceが必要です)。

"elevation": {
  "levelHeight": 5,
  "highGround": "advantage",
  "rangeBonus": 1,
  "falling": { "per": 10, "dice": { "count": 1, "sides": 6 }, "max": 20, "type": "bludgeoning", "prone": "prone" }
}

離れていく相手への打撃。 opportunity.budgetを宣言すると、立っていて行動可能で、その行動枠と近接攻撃手段を持つ敵の間合いから戦闘者が出るとき、歩行はその場で止まり、敵に攻撃するか尋ねます。実行すれば行動枠を消費し、自身のターンに同じ攻撃をした場合とまったく同じく解決します。見送ればコストはありません。どちらでも、歩行は停止した地点から再開し、通った各マスのコストを支払います。打撃で移動者が倒れれば、倒れた場所で歩行を終えます。同じ間合いから経路が何度出ても、歩行全体につき各敵に1回の機会です。disengageは残りのターン中これを防ぎ、opportunityを宣言しないルールセットにはこの仕組み自体がありません。

この問いかけはウィンドウで、戦闘全体を止めます。尋ねられた全員が答えるまで、ほかは何も動きません。パーティーメンバーのウィンドウはプレイヤーが答え、打撃とその隣のPassが表示されます。ほかの者はその操作担当が答え、Game MasterのボスはGame Master自身の判断を通じて答えます。後述の「ウィンドウ」を参照してください。

敵の盤面の使い方。 誰も操作しない敵は、到達可能な各マスと、そこから使える各選択肢を組み合わせて評価し、歩行に対して受ける打撃ごとに減点します。現在地から最善の行動をすでに取れるなら、移動しない方を好みます。何も届かなければ距離を詰め、standardリストにdashがあれば先に疾走します。

表示される拒否理由。 out-of-reach(届く距離より遠い)、no-line-of-sight(固体が間にある)、unreachable(歩行コストを支払えない、または止まれないマス)、bad-cell(形状を向けられない場所に向けた)です。

サーバー側で戦闘がブロックを使う仕組み

ルールセットがcombatを宣言したゲームでは、Engineが従来から使う保存済み戦闘の上で、そのブロックに従って戦闘を解決します。

画面上の表示

戦闘画面は作者の言葉で進みます。メニューは独自の攻撃、能力、対抗判定、列挙した標準アクションで、それぞれ独自の行動枠とプールから何を消費するかを示します。行動順、ラウンド、指定したすべての状態と残りラウンド、一時ポイント、集中、瀕死ルールの2つのカウントを表示します。ログも、「Juno attacks Rust jackal with Road axe: 8 (5 + 3) + 3 = 11 against Guard 6, a hit.」のように、独自の言葉で実際の計算を出力します。受け付けた各アクションはその場でシートに書くため、途中で再読み込みしても正確で、後からGame Masterには数値を再び変更しないよう伝えます。

位置のある戦闘は、ポートレートのステージではなく盤面に描きます。プレイヤーの操作については「位置」を参照してください。盤面、メニュー、ログの距離は、「Juno moves to 4, 6 for 6 paces and has 2 paces left.」のように、すべて独自の単位で表します。

対抗判定: 掴む、押し出す、振りほどく

防御に対する攻撃ではなく、対抗判定となる行動もあります。両者がロールし、結果の良い方が思いどおりにします。誰かを掴む、押し倒すか押しやる、振りほどくは、どれも同じ形なので、ルールセットはそれぞれをデータとして記述します。

"checks": [
  { "id": "brawn", "label": "Brawn", "value": { "abilityMod": "brawn" } },
  { "id": "wits", "label": "Wits", "value": { "abilityMod": "wits" } }
],
"contests": [
  {
    "id": "grab",
    "label": "Grab",
    "budget": "act",
    "attacker": { "checks": ["brawn"] },
    "defender": { "checks": ["brawn", "wits"] },
    "onWin": { "applies": [{ "condition": "held" }] }
  },
  {
    "id": "break_free",
    "label": "Break free",
    "budget": "act",
    "attacker": { "checks": ["brawn", "wits"] },
    "defender": { "checks": ["brawn"] },
    "from": { "holding": "held" },
    "onWin": { "ends": [{ "condition": "held", "on": "actor" }] }
  },
  {
    "id": "shove",
    "label": "Shove back",
    "budget": "act",
    "attacker": { "checks": ["brawn"] },
    "defender": { "checks": ["brawn"] },
    "ties": "attacker",
    "onWin": { "push": 4 }
  }
]

負けても何も起きません。それが掴みの失敗です。

対抗判定は、パッケージ形式のルールセットではCapability API 1.43です。

ウィンドウ: 戦闘を保留する

一部の瞬間には、現在の実行者とは別の者に判断権があります。Engineは代わりに決めず、その者のために戦闘を保留します。この一時停止がウィンドウです。

ウィンドウを開く状況は7つで、そのうち2つはすでに宣言した内容に由来します。

最後の6つは、カタログ項目やクリーチャー自身のアクションが、待つ瞬間を指定して求めるものです。1つのアクションがusedとaimedの両方を開く場合は、まず使用について尋ね、誰も取り消さなければ次に向けられた者に尋ね、両方の回答後に解決します。命中は各ロールが命中するたびに、負傷はアクション全体の終了後に尋ねます。

どの状況で開いた場合も、ウィンドウは次のように動作します。

最初の2つに追加の宣言は不要です。opportunity.budgetがあるルールセットは一方を、signaturePointsがあるベスティアリはもう一方を得ます。どちらもなければ表示されません。

項目がどの瞬間を待つかを指定する。 mechanics.reactionをtrueではなくオブジェクトで書きます。

"reaction": { "on": "aimed", "at": "source", "cancels": true }

budgetも指定してください。なければリストのデフォルトを消費します。リアクションはほとんどの場合、専用の行動枠を使います。これが1ターンに複数回使うことを防ぎます。

コストは誰かに尋ねる前に消費済みです。 キャンセルされたアクションは発生を止められるだけで、購入自体は取り消されません。行動枠とプールはすでに失われています。独自のシステムで返却する場合も、まだ表現できません。

対抗手段は次のように書き、盤面上では自身のrange内の者だけに応じます。

"mechanics": {
  "kind": "utility",
  "range": 8,
  "free": true,
  "cost": [{ "pool": "luck", "amount": 1 }],
  "reaction": { "on": "used", "cancels": true, "against": { "catalogs": ["knacks"] } }
}

届く範囲が限られた対抗手段(Capability API 1.116)。打ち消すusedのリアクションの"upTo": "paid"は、応答自体以下の段階で支払われたものだけを止め、"above": { "check": <value>, "dc": 10 }は、それより高いものでも止めるための、dcにその段階を加えた値に対する判定です。5eのCounterspellは、スロットのレベル以下の呪文を止め、それより上なら10 + 呪文のレベルに対して呪文発動能力値の判定を求め、ほかの呪文と同じく上位発動できます。

"reaction": {
  "on": "used",
  "cancels": true,
  "against": { "catalogs": ["spells"] },
  "upTo": "paid",
  "above": { "check": { "abilityModFromField": "spellcasting_ability" }, "dc": 10 }
}

支払ったものの段階は、それを支払ったプールの段階です。プール自身のlevel(持ち主のシートから読む値。5eのパクト・スロットはウォーロックのスロットのレベルで発動します)があればそれ、なければグループ内の位置で、最初のプールが1です。コストがないものや、グループに属さないプールから支払ったものは段階0なので、そのような対抗手段はどれもそれを止めます。判定は戦闘自身のダイスで、応答者の判定への状態を適用します。dice-poolの戦闘には達成すべき難易度がないため、aboveを拒否します。シートのないクリーチャーは判定を{ "const": n }と書きます。応答が自身より上に届くときはログが段階とロールを示し、それを止めたときは通常の行が続きます。aboveがなければ、より高いものは止まらず、応答のコストは引き続き消費されます。

命中直後の瞬間。 hitの項目で、Shield、Parry、Uncanny Dodgeを表します。攻撃は判定の後で保留され、ダメージを与える前に命中を受けた者に尋ねます。その者が実行したことはその攻撃に反映されます。判定は振り直さず、その時点の防御に対して再確認するため、防御に加算する状態で命中を外れに変えられます。常に命中する出目はそれでも命中します。応答として付与した、1回の攻撃の間続く状態(endsAfter: "attacked")は、ダメージも含めてこの攻撃に適用され、この攻撃で消費されます。「その攻撃のダメージを半減する」は、1回の攻撃に対するresist-allで表します。

"mechanics": {
  "kind": "buff",
  "targets": "self",
  "budget": "reaction",
  "reaction": { "on": "hit" },
  "applies": [{ "condition": "shielded", "duration": { "rounds": 1, "at": "turn-start" } }]
}

攻撃は保留した場所から正確に再開します。残りの標的と、ほかのアクションで構成するクリーチャーのアクションなら残りの部分です。そうした応答を持つ者に命中した各ロールは順番に保留され、ウィンドウが開いている間に保存した戦闘も同じ状態で戻ります。ウィンドウ内で行った攻撃(離れていく相手への打撃、固有アクション、応答)は保留しません。ウィンドウ内で開いたものは別のウィンドウを開かないためです。ログは、ウィンドウが開いたときにロールとその対象値を示し、応答が防御を変えた場合は外れになったかを示します。Engineが操作する敵は、命中を外れに変えられる場合だけ防御手段を使います。

瞬間を指定するパッケージにはCapability API 1.33が、usedやagainstを使うものには1.44が必要です。hitを待つものには1.46が必要です。

名前で1つの呪文に応じる(Capability API 1.117)。againstはcatalogsと並べてentriesを<catalog>/<entry>で指定でき、どちらかが一致すると瞬間が開きます。alsoは、それぞれ独自のagainstを持つ最大3つの別の瞬間で、同じ応答を行います。状態のnoDamageFromは、状態がある間、被害の種類にかかわらず、それらの項目の被害を持ち主に一切与えません。5eのShieldは、攻撃が命中したときと、術者にMagic Missileが向けられたときに使われ、その効果中はMagic Missileが何もしません。

"reaction": {
  "on": "hit",
  "also": [{ "on": "aimed", "against": { "entries": ["spells/magic-missile"] } }]
}
{
  "condition": "shielded",
  "modifiers": [{ "to": "defense", "flat": 5 }],
  "noDamageFrom": ["spells/magic-missile"]
}

打ち消せるのは最初の瞬間だけなので、打ち消すリアクションはalsoを持ちません。項目が指定するカタログは、ルールセットが持つものである必要があります。それに含まれない項目は瞬間を開きません。このように防がれた打撃は、ログでは標的が完全耐性を持つものとして示されます。

一部の打撃にだけ応じる(Capability API 1.118)。hitの瞬間は"blow": "melee"か"blow": "ranged"を指定できます。標的が武器の間合いに立っている間の打撃は近接なので、遠くから投げた短剣は遠隔で、標的の隣で使った同じ短剣は近接です。間合いがあって射程のない武器は常に近接で、射程があって間合いのない武器は常に遠隔です。盤面のない戦闘では、間合いのある武器は手で振るうものとみなします。fallsを除くどの瞬間でも、"seesSource": trueは、持ち主がそれを引き起こした者を見ている間だけ瞬間を開きます。これは盤面上で両者の間に視線があることを意味し(盤面がなければ全員が全員を見ています)、Hideの標準アクションを取った者は、次のターンの開始時にそれが切れるまで決して見えません。5eのParryは両方を使います。

"reaction": { "on": "hit", "blow": "melee", "seesSource": true }

どちらのキーもalsoの瞬間に書けますが、blowはhitの瞬間にだけ書けます。

落下を受け止める(Capability API 1.124)。fallsのリアクション(alsoの中のものを含む)は、段差から落ちるクリーチャーや、地面に落とされた飛行者に、落下がダメージを与えたり伏せ状態にしたりする前に応じます。その射程と標的の側は落下する者に対して確認され、応答はそのクリーチャーに効果を及ぼします。Feather Fallには、項目に次のmechanicsを与え、シートのライブの状態でfeather_fallingを宣言してください。

{
  "kind": "buff",
  "targets": "ally",
  "range": 60,
  "budget": "reaction",
  "cost": [{ "pool": "slots_1", "amount": 1 }],
  "reaction": { "on": "falls" },
  "applies": [{ "condition": "feather_falling", "duration": { "rounds": 10 } }]
}

そのcombat.conditionsの項目は{ "condition": "feather_falling", "fallsSafely": true }です。保持している間、この状態は落下ダメージと、落下が付与する伏せ状態を防ぎます。落下を引き起こした状態は取り除きません。術者自身の落下にだけ応じるにはtargets: "self"を使います。落下には出所の項目がないため、そのリアクションはcancels、blow、seesSource、againstを持てません。単一標的の項目は、各落下について個別に尋ねます。これは着地を解決するもので、ゆっくりとした降下を追跡するわけではありません。

別のクリーチャーのために応じる(Capability API 1.131)。forはデフォルトでselfです。allyは持ち主を除き、anyは持ち主を含みます。どちらも、カタログの距離の単位で必要なwithin以内にいる、標的の側の持ち主に、aimedかhitのときだけ尋ねます。これらのキーは各alsoの瞬間でも機能します。seesSourceは引き続き攻撃者が見えていることを求めます。Protectionは、攻撃のダイスを振る前に出所にown-attacks-disadvantageを付与します。そのthis-actionの持続時間は、アクションが解決するか取り消されると終わります。明示的な出所への射程がなければ、傍観者の応答はその出所に届きます。withinは守られるクリーチャーまでの距離を測ります。シートでprotected_attackを宣言し、その戦闘の状態にその効果を与えてください。

{
  "kind": "debuff",
  "targets": "enemy",
  "budget": "reaction",
  "reaction": { "on": "aimed", "for": "ally", "within": 5, "at": "source", "seesSource": true },
  "applies": [{ "condition": "protected_attack", "duration": "this-action" }]
}

応答を標的に付ける。 at: "target"は攻撃されたクリーチャーに適用され、sourceは攻撃者のままです。Shield Guardianは、アミュレットの着用者を5以内の味方として表します。parryingは防御に+2を与えます。保留した命中は、応答の後でその味方の防御を確認し直します。

{
  "kind": "buff",
  "targets": "ally",
  "range": 5,
  "budget": "reaction",
  "reaction": { "on": "hit", "for": "ally", "within": 5, "at": "target" },
  "applies": [{ "condition": "parrying", "duration": "this-action" }]
}

ターンの開始時。 on: "turn-start"は、項目の標的の側のクリーチャーが射程内でターンを開始したとき、そのクリーチャーが行動する前に尋ねます。そのクリーチャーがsourceです。有害な項目は相手側に、有益な項目は自分の側に応じます。cancels、blow、against、upToは持てません。Unnerving Maskのクリーチャーのアクションは、Wisdomのセーヴを求めます。影響を受けたクリーチャーの時間での1ラウンドはこのターンの間続き、その終わりに切れます(of: "source"は省きます)。

{
  "id": "unnerving_mask",
  "name": "Unnerving Mask",
  "range": 30,
  "budget": "reaction",
  "reaction": { "on": "turn-start", "at": "source", "seesSource": true },
  "save": { "save": "wis_save", "difficulty": 14, "onSuccess": "negates" },
  "applies": [{ "condition": "frightened", "duration": { "rounds": 1 } }]
}

セーヴによる打ち消し。 cancelSave: { save, dc }にはcancelsが必要です。持ち主は通常のセーヴ修正値で振ります。成功すれば打ち消し、失敗すれば元のアクションが解決し、どちらの場合もリアクションを消費します。against.actionsは1~12個のステータスブロックのアクションを指定し、名前全体を大文字と小文字を区別せずに照合します(それぞれ最大80文字)。Rock Catchingは、岩を受け止めることを、殴打ダメージだけでなく、すべてのダメージを含む攻撃全体を打ち消すことで表します。セーヴIDはルールセット独自のものです(ここではdex、同梱の5eの例ではdex_save)。

{
  "on": "aimed",
  "cancels": true,
  "cancelSave": { "save": "dex", "dc": 10 },
  "against": { "actions": ["Rock"] }
}

複数の落下者を受け止める。 targetCountが1より大きいfallsの項目は、1つの打撃や効果で落下する、射程内で標的の側にいる対象となるクリーチャーを提示します。メニューとディレクターは、デフォルトで近い順に数の上限まで対象となる全員を選び、プレイヤーは選択を変えられます。後の落下は別のイベントです。Feather Fallは上と同じfallsSafelyの状態を使います。

{
  "kind": "buff",
  "targets": "ally",
  "targetCount": 5,
  "range": 60,
  "budget": "reaction",
  "reaction": { "on": "falls" },
  "applies": [{ "condition": "feather_falling", "duration": { "rounds": 10 } }]
}

未対応

ルールセットがEngineにできないことを主張しないよう、明記します。