Controls & camera

Shooter layers

shooter-layers · an adoption of Control options, version 2

Tests included

Use in your package

The first button opens the authoring tool with these answers and numbers already filled in. You still add the rules and tuning of your own game.

What is in the zip file

The zip file holds the adoption and its acceptance tests. In the authoring tool, choose Add contract and pick this zip file. If you edit your package outside the authoring tool, unpack the zip file in your package folder. The files of the zip file go into contracts/.

The contract that this adoption uses

This contract covers which physical inputs produce each action on every platform. It also covers complete input methods, named control presets, remapping, press styles, simpler alternatives, and device-motion inputs. This contract does not cover action prompts, input timing help, the choice between actions that share one input, or event order. The Action legibility contract covers action prompts and the choice between actions that share one input, the Input forgiveness contract covers input timing help, and the Event resolution contract covers event order.

Read the full Control options contract →

Questions

The supplied answer is marked on each question. Pick other answers to see what changes. Nothing is saved here: the zip file and the authoring tool use the supplied answers.

By default, how can players change the controls?

Asked when
the platform control sets list has at least one row.
If not asked
With no platform control set, this adoption makes no default remapping promise.
Choices for By default, how can players change the controls?
The controls cannot be changed in the game. A puzzle game always keeps rotate on the space bar.

No player-facing setting changes an action's physical input or press style.

Existing controls can only exchange actions. A platformer can swap jump and dash, but an unused button cannot receive either action.

A supported binding can exchange its current action with another supported binding; no action can move independently to an otherwise unused input.

Players can choose only between presets. An action game offers the presets Default and Alternate, and no single button can be changed.

The player may select a complete declared preset but cannot change one binding independently inside that preset. The platform offers at least two presets whose availability is starting-and-selectable or player-selectable.

Any action can move to any supported input. A strategy game can move end turn from Enter to an unused mouse button.

Every covered action can be assigned independently to any supported remappable input, including an otherwise unassigned input; conflicts are resolved visibly before use.

Supplied answer Both the input and the press style can change. An adventure game can move interact to another button and change a hold into one press.

Every covered action can change to a supported input and to any press style that its cited platform rule offers for that action.

Why this is asked

A platform may offer fixed controls, presets, or free changes. This answer is the default answer. A platform row can choose another answer.

By default, what happens when an action needs a demanding press?

Asked when
the platform control sets list has at least one row.
If not asked
With no platform control set, this adoption makes no default demanding-input promise.
Choices for By default, what happens when an action needs a demanding press?
No action needs a demanding press. A card game plays a selected card with one ordinary activation.

No covered binding requires timed, held, rapid, repeated, double, simultaneous, directional-sequence, or device-motion input as its only route to the action.

Every demanding press has a distinct simpler route with no setting change. A repair game offers a separate tap button beside its hold-to-repair control.

Every covered demanding binding has a declared alternative that performs the same action without configuration.

Supplied answer A setting can make the press easier. A racing game can change a held pit command into one ordinary press.

A player-facing setting replaces each covered demanding press with a declared easier press style before play uses the binding.

The demanding press remains required. A rhythm special still needs two buttons together and has no simpler route from this contract.

The covered demanding binding has no simpler alternative or press-style setting promised by this adoption.

Why this is asked

A hold, rapid presses, a double press, or a button combination can stop a player from using an action that the player knows. This answer is the default answer.

Numbersno numbers

This contract has no numbers to set.

Rules1 rule

A rule is a check between the numbers. Validation reports a rule that fails.

  • Controls that let players change a press style cannot also require every demanding press exactly as written.

    Forbidden when Remapping default is Action and press style, and Demanding input default is Required as written.

Lists4 lists

Each list holds the rows this adoption supplies. A list can be empty.

Platform control sets

platform-control-sets

IdPlatform declared inMethods declared inInput method coverageRemappingSettings rule declared in
handheldplatforms.handheldcontrols.handheld-gamepadone-method-covers-alluse-game-defaultcontrols.handheld-control-options

Control presets

control-presets

This adoption declares no control presets.

Action bindings

action-bindings

IdPlatform control setPresetContext declared inAction declared inPhysical input declared inAction inputPress styleMotion useDemanding input
handheld-aim-stickhandheld—play.on-footcombat.aimcontrols.right-stick—continuous-axisno-motionno-demanding-presses
handheld-aim-tilthandheld—play.on-footcombat.aimcontrols.device-tilt—gestureoptional-motionno-demanding-presses
handheld-ads-triggerhandheld—play.on-footcombat.aim-down-sightscontrols.right-trigger—holdno-motionuse-game-default
handheld-vehicle-boosthandheld—play.in-vehiclevehicle.boostcontrols.right-trigger—pressno-motionno-demanding-presses

Simpler inputs

simpler-inputs

This adoption declares no simpler inputs.

Test inputsscope and seeds

Some tests need a scope or seeds from the adoption before they can run.

This adoption supplies no test inputs. Every test uses its default inputs.

Acceptance tests64 tests apply

The contract comes with 64 tests. A test that runs once per row is counted once for each row. Tests that do not apply to these answers are still listed, with the reason.

control-options-vocabulary

control options uses control sets, presets, bindings, action inputs, and demanding inputs

scenarioonce

Applies to shooter-layers.

A control set is the complete current mapping for one platform and input method. A preset is an immutable named source set that can become current. A binding joins one physical input and press style to one candidate action. One physical activation emits one action input carrying every matched binding's action. A demanding input is a timed, held, rapid, repeated, double, simultaneous, input-sequence, or required-device-motion input.

Test steps and diagnostics
Given

the shooter-layers adoption and its cited control rules

When
  • the control path is identified from platform selection through physical activation
Then
  • a control set is the complete current mapping for one platform and input method
  • a preset is an immutable named source set that can become current
  • a binding joins one physical input and press style to one candidate action
  • one physical activation emits one action input carrying every matched binding's action
  • a demanding input is a timed, held, rapid, repeated, double, simultaneous, input-sequence, or required-device-motion input
Diagnostics
  • shooter-layers-current-set
  • shooter-layers-action-input-log

platform-row-selects-exactly-when-cited · handheld

handheld is selected exactly for its cited platform and devices

scenarioper platform-control-sets row

Applies to the handheld row.

Platform row handheld is the one selected row exactly on the platform, edition, and supported devices at platforms.handheld. It is not selected where that citation excludes it. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

platform-control-set row handheld and the Fixed platform rule at platforms.handheld

When
  • the game runs on each cited platform, edition, and supported device combination and on the nearest combination the citation excludes
Then
  • handheld is the one selected row for every combination the citation covers
  • handheld is not selected for a combination the citation excludes
  • the test leaves the covered combinations to platforms.handheld and restates nothing from it
Diagnostics
  • shooter-layers-platform-selection

starting-control-set-follows-platform-rule · handheld

handheld starts with the control set chosen by its cited rule

scenarioper platform-control-sets row

Applies to the handheld row.

On first play for handheld, the complete starting control set comes from controls.handheld-control-options, and every first binding lookup reads it as current. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

a first play on platform row handheld and the Fixed settings rule at controls.handheld-control-options

When
  • the current set is first established
Then
  • the complete starting control set is the one selected through controls.handheld-control-options
  • every first binding lookup reads that current set
  • the test restates nothing from the cited rule
Diagnostics
  • shooter-layers-current-set

preset-selection-copies-complete-set

preset Row.id becomes current through its cited route

scenarioper control-presets row

Does not apply to shooter-layers: control-presets has no rows.

input-method-coverage-holds · handheld

handheld input methods cover its actions as promised

scenarioper platform-control-sets row

Applies to the handheld row.

Audit class: observer-judged. An observer, not the running game, judges this in each preset-derived current set handheld can make current. For every action bound on the platform, under the complete methods and any required switch at controls.handheld-gamepad: the one complete method named by the citation performs every action bound on the platform without another method. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

platform row handheld, every action bound on that platform, and the complete methods and any required switch at controls.handheld-gamepad

When
  • in each preset-derived current set the platform can make current, an observer performs every action bound on the platform using the named method or methods
Then
  • the one complete method named by the citation performs every action bound on the platform without another method
  • an observer, not the running game, judges this
  • the test restates nothing from the cited rule
Diagnostics
  • shooter-layers-handheld-observer-result

remapping-fixed-override

Row.id keeps fixed bindings by its row answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: no row in platform-control-sets matches remapping fixed bindings.

remapping-fixed-default

Row.id keeps fixed bindings by the default answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: remapping default is action and press style, not fixed bindings.

remapping-swap-override

Row.id permits only exchanges by its row answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: no row in platform-control-sets matches remapping swap only.

remapping-swap-default

Row.id permits only exchanges by the default answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: remapping default is action and press style, not swap only.

remapping-presets-override

Row.id permits only preset selection by its row answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: no row in platform-control-sets matches remapping presets only.

remapping-presets-default

Row.id permits only preset selection by the default answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: remapping default is action and press style, not presets only.

remapping-free-override

Row.id permits free assignment by its row answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: no row in platform-control-sets matches remapping any action any input.

remapping-free-default

Row.id permits free assignment by the default answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: remapping default is action and press style, not any action any input.

remapping-press-style-override

Row.id permits input and press-style changes by its row answer

scenarioper platform-control-sets row

Does not apply to shooter-layers: no row in platform-control-sets matches remapping action and press style.

remapping-press-style-default · handheld

handheld permits input and press-style changes by the default answer

scenarioper platform-control-sets row

Applies to the handheld row.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the default answer: every covered action can move to every supported remappable input and use every press style offered for it; the new combination performs the action and the old one does not. After an accepted change, the contract makes each binding row's promises follow its action to the input the current set assigns. An unsupported choice is refused. Each accepted complete result becomes current for every later lookup. Offered choices and the route stay at controls.handheld-control-options; the test restates nothing from it.

Test steps and diagnostics
Given

each covered action, each supported remappable input, each press style offered for that action by controls.handheld-control-options, and one unsupported choice

When
  • an observer changes the input and offered press style, performs the action with the new combination, then attempts the unsupported choice
Then
  • every supported input change and every offered press-style change is accepted
  • the new binding and press style perform the action and the old combination does not
  • after an accepted change, each binding row's promises follow its action to the input the current set assigns
  • the unsupported choice is refused and leaves the current set unchanged
  • every accepted complete result becomes current for every later lookup
  • an observer, not the running game, judges this
Diagnostics
  • shooter-layers-handheld-observer-result
  • shooter-layers-change-log
  • shooter-layers-setting-state
  • shooter-layers-current-set
  • shooter-layers-action-input-log

binding-scope-follows-current-set · handheld-aim-stick

handheld-aim-stick exists in its declared control-set scope

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

Binding handheld-aim-stick belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to handheld's base or freely remappable set. It exists throughout the selected control set, or only in the cited context where the row names one. For a preset or context that the row does not name, this test checks nothing.

Test steps and diagnostics
Given

binding handheld-aim-stick on platform row handheld

When
  • the current set is inspected across its reachable control-set and play contexts
Then
  • the binding belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to the platform's base or freely remappable set
  • the binding exists throughout the selected control set, or only in the cited context where the row names one
  • for a preset or context that the row does not name, this test checks nothing
Diagnostics
  • shooter-layers-current-set
  • shooter-layers-match-trace

binding-scope-follows-current-set · handheld-aim-tilt

handheld-aim-tilt exists in its declared control-set scope

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

Binding handheld-aim-tilt belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to handheld's base or freely remappable set. It exists throughout the selected control set, or only in the cited context where the row names one. For a preset or context that the row does not name, this test checks nothing.

Test steps and diagnostics
Given

binding handheld-aim-tilt on platform row handheld

When
  • the current set is inspected across its reachable control-set and play contexts
Then
  • the binding belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to the platform's base or freely remappable set
  • the binding exists throughout the selected control set, or only in the cited context where the row names one
  • for a preset or context that the row does not name, this test checks nothing
Diagnostics
  • shooter-layers-current-set
  • shooter-layers-match-trace

binding-scope-follows-current-set · handheld-ads-trigger

handheld-ads-trigger exists in its declared control-set scope

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

Binding handheld-ads-trigger belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to handheld's base or freely remappable set. It exists throughout the selected control set, or only in the cited context where the row names one. For a preset or context that the row does not name, this test checks nothing.

Test steps and diagnostics
Given

binding handheld-ads-trigger on platform row handheld

When
  • the current set is inspected across its reachable control-set and play contexts
Then
  • the binding belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to the platform's base or freely remappable set
  • the binding exists throughout the selected control set, or only in the cited context where the row names one
  • for a preset or context that the row does not name, this test checks nothing
Diagnostics
  • shooter-layers-current-set
  • shooter-layers-match-trace

binding-scope-follows-current-set · handheld-vehicle-boost

handheld-vehicle-boost exists in its declared control-set scope

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

Binding handheld-vehicle-boost belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to handheld's base or freely remappable set. It exists throughout the selected control set, or only in the cited context where the row names one. For a preset or context that the row does not name, this test checks nothing.

Test steps and diagnostics
Given

binding handheld-vehicle-boost on platform row handheld

When
  • the current set is inspected across its reachable control-set and play contexts
Then
  • the binding belongs to its named preset while that preset is current, where the row names one; otherwise it belongs to the platform's base or freely remappable set
  • the binding exists throughout the selected control set, or only in the cited context where the row names one
  • for a preset or context that the row does not name, this test checks nothing
Diagnostics
  • shooter-layers-current-set
  • shooter-layers-match-trace

binding-matches-cited-performance · handheld-aim-stick

handheld-aim-stick matches only its cited continuous-axis performance

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

For handheld-aim-stick, when the cited axis is performed in its cited range and direction under controls.right-stick, one action input carries the action at combat.aim. The nearest non-matching performance emits nothing from this binding. The test names both addresses and restates nothing from them.

Test steps and diagnostics
Given

binding handheld-aim-stick, action combat.aim, and the physical input, device, and performance at controls.right-stick

When
  • the cited axis is performed in its cited range and direction in the current platform, device, method, and set, then the nearest non-matching performance is attempted
Then
  • the matching performance emits one action input carrying the action at combat.aim
  • the non-matching performance emits nothing from this binding
  • the test leaves the physical details to controls.right-stick and restates nothing from it
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-matches-cited-performance · handheld-aim-tilt

handheld-aim-tilt matches only its cited gesture performance

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

For handheld-aim-tilt, when the cited gesture completes under controls.device-tilt, one action input carries the action at combat.aim. The nearest non-matching performance emits nothing from this binding. The test names both addresses and restates nothing from them.

Test steps and diagnostics
Given

binding handheld-aim-tilt, action combat.aim, and the physical input, device, and performance at controls.device-tilt

When
  • the cited gesture completes in the current platform, device, method, and set, then the nearest non-matching performance is attempted
Then
  • the matching performance emits one action input carrying the action at combat.aim
  • the non-matching performance emits nothing from this binding
  • the test leaves the physical details to controls.device-tilt and restates nothing from it
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-matches-cited-performance · handheld-ads-trigger

handheld-ads-trigger matches only its cited hold performance

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

For handheld-ads-trigger, when the cited input is held for its cited completion under controls.right-trigger, one action input carries the action at combat.aim-down-sights. The nearest non-matching performance emits nothing from this binding. The test names both addresses and restates nothing from them.

Test steps and diagnostics
Given

binding handheld-ads-trigger, action combat.aim-down-sights, and the physical input, device, and performance at controls.right-trigger

When
  • the cited input is held for its cited completion in the current platform, device, method, and set, then the nearest non-matching performance is attempted
Then
  • the matching performance emits one action input carrying the action at combat.aim-down-sights
  • the non-matching performance emits nothing from this binding
  • the test leaves the physical details to controls.right-trigger and restates nothing from it
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-matches-cited-performance · handheld-vehicle-boost

handheld-vehicle-boost matches only its cited press performance

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

For handheld-vehicle-boost, when the cited input is pressed under controls.right-trigger, one action input carries the action at vehicle.boost. The nearest non-matching performance emits nothing from this binding. The test names both addresses and restates nothing from them.

Test steps and diagnostics
Given

binding handheld-vehicle-boost, action vehicle.boost, and the physical input, device, and performance at controls.right-trigger

When
  • the cited input is pressed in the current platform, device, method, and set, then the nearest non-matching performance is attempted
Then
  • the matching performance emits one action input carrying the action at vehicle.boost
  • the non-matching performance emits nothing from this binding
  • the test leaves the physical details to controls.right-trigger and restates nothing from it
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-context-settles-at-accepted-moment · handheld-aim-stick

the context of handheld-aim-stick is decided at the accepted moment

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

For handheld-aim-stick, the physical match remains provisional until the accepted moment. Its action is a candidate only when the context at play.on-foot holds then. This test names the address, restates nothing from it, and checks nothing about how an accepted moment is shifted.

Test steps and diagnostics
Given

a physical performance matching handheld-aim-stick whose context is cited at play.on-foot

When
  • the input is accepted once while the cited context holds and once while it does not
Then
  • the match remains provisional until the accepted moment
  • the action at combat.aim is a candidate only when the cited context holds at that moment
  • this test restates nothing from play.on-foot and checks nothing about how an accepted moment is shifted
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-context-settles-at-accepted-moment · handheld-aim-tilt

the context of handheld-aim-tilt is decided at the accepted moment

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

For handheld-aim-tilt, the physical match remains provisional until the accepted moment. Its action is a candidate only when the context at play.on-foot holds then. This test names the address, restates nothing from it, and checks nothing about how an accepted moment is shifted.

Test steps and diagnostics
Given

a physical performance matching handheld-aim-tilt whose context is cited at play.on-foot

When
  • the input is accepted once while the cited context holds and once while it does not
Then
  • the match remains provisional until the accepted moment
  • the action at combat.aim is a candidate only when the cited context holds at that moment
  • this test restates nothing from play.on-foot and checks nothing about how an accepted moment is shifted
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-context-settles-at-accepted-moment · handheld-ads-trigger

the context of handheld-ads-trigger is decided at the accepted moment

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

For handheld-ads-trigger, the physical match remains provisional until the accepted moment. Its action is a candidate only when the context at play.on-foot holds then. This test names the address, restates nothing from it, and checks nothing about how an accepted moment is shifted.

Test steps and diagnostics
Given

a physical performance matching handheld-ads-trigger whose context is cited at play.on-foot

When
  • the input is accepted once while the cited context holds and once while it does not
Then
  • the match remains provisional until the accepted moment
  • the action at combat.aim-down-sights is a candidate only when the cited context holds at that moment
  • this test restates nothing from play.on-foot and checks nothing about how an accepted moment is shifted
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-context-settles-at-accepted-moment · handheld-vehicle-boost

the context of handheld-vehicle-boost is decided at the accepted moment

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

For handheld-vehicle-boost, the physical match remains provisional until the accepted moment. Its action is a candidate only when the context at play.in-vehicle holds then. This test names the address, restates nothing from it, and checks nothing about how an accepted moment is shifted.

Test steps and diagnostics
Given

a physical performance matching handheld-vehicle-boost whose context is cited at play.in-vehicle

When
  • the input is accepted once while the cited context holds and once while it does not
Then
  • the match remains provisional until the accepted moment
  • the action at vehicle.boost is a candidate only when the cited context holds at that moment
  • this test restates nothing from play.in-vehicle and checks nothing about how an accepted moment is shifted
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

binding-preset-is-current

Row.id exists only while preset Bind preset is current

scenarioper action-bindings row

Does not apply to shooter-layers: no matching row in action-bindings has every field this test uses (preset).

shared-physical-activation-stays-one-input

Row.id shares action input Bind action input consistently

scenarioper action-bindings row

Does not apply to shooter-layers: no matching row in action-bindings has every field this test uses (action-input).

simpler-input-matches-named-binding

Row.id matches as binding Row.action binding

scenarioper simpler-inputs row

Does not apply to shooter-layers: simpler-inputs has no rows.

demanding-none-override · handheld-aim-stick

handheld-aim-stick has an ordinary route by its row answer

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the default answer: the action for handheld-aim-stick has an ordinary route without a setting change, and performing that route emits an action input carrying the action. A demanding input is not its only route.

Test steps and diagnostics
Given

binding handheld-aim-stick and its cited action and physical-input rules

When
  • an observer performs the covered action through its ordinary route without changing a setting
Then
  • the ordinary route produces an action input carrying the action at combat.aim
  • no demanding input is the action's only route
  • an observer, not the running game, judges this
Diagnostics
  • shooter-layers-handheld-aim-stick-observer-result
  • shooter-layers-action-input-log

demanding-none-override · handheld-aim-tilt

handheld-aim-tilt has an ordinary route by its row answer

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the default answer: the action for handheld-aim-tilt has an ordinary route without a setting change, and performing that route emits an action input carrying the action. A demanding input is not its only route.

Test steps and diagnostics
Given

binding handheld-aim-tilt and its cited action and physical-input rules

When
  • an observer performs the covered action through its ordinary route without changing a setting
Then
  • the ordinary route produces an action input carrying the action at combat.aim
  • no demanding input is the action's only route
  • an observer, not the running game, judges this
Diagnostics
  • shooter-layers-handheld-aim-tilt-observer-result
  • shooter-layers-action-input-log

demanding-none-override · handheld-vehicle-boost

handheld-vehicle-boost has an ordinary route by its row answer

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the default answer: the action for handheld-vehicle-boost has an ordinary route without a setting change, and performing that route emits an action input carrying the action. A demanding input is not its only route.

Test steps and diagnostics
Given

binding handheld-vehicle-boost and its cited action and physical-input rules

When
  • an observer performs the covered action through its ordinary route without changing a setting
Then
  • the ordinary route produces an action input carrying the action at vehicle.boost
  • no demanding input is the action's only route
  • an observer, not the running game, judges this
Diagnostics
  • shooter-layers-handheld-vehicle-boost-observer-result
  • shooter-layers-action-input-log

demanding-none-default

Row.id has an ordinary route by the default answer

scenarioper action-bindings row

Does not apply to shooter-layers: demanding input default is player can change it, not no demanding presses.

demanding-simpler-press-style-override

the demanding press style of Row.id follows simpler-alternative by its row answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input simpler alternative and press-style timed press or hold or rapid presses or repeated presses or double press or simultaneous inputs or input sequence and motion-use no motion or optional motion.

demanding-simpler-required-motion-override

the required motion of Row.id follows simpler-alternative by its row answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input simpler alternative and motion-use required motion.

demanding-simpler-press-style-default

the demanding press style of Row.id follows simpler-alternative by the default answer

scenarioper action-bindings row

Does not apply to shooter-layers: demanding input default is player can change it, not simpler alternative.

demanding-simpler-required-motion-default

the required motion of Row.id follows simpler-alternative by the default answer

scenarioper action-bindings row

Does not apply to shooter-layers: demanding input default is player can change it, not simpler alternative.

demanding-setting-press-style-override

the demanding press style of Row.id follows player-can-change-it by its row answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input player can change it and press-style timed press or hold or rapid presses or repeated presses or double press or simultaneous inputs or input sequence and motion-use no motion or optional motion.

demanding-setting-required-motion-override

the required motion of Row.id follows player-can-change-it by its row answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input player can change it and motion-use required motion.

demanding-setting-press-style-default · handheld-ads-trigger

the demanding press style of handheld-ads-trigger follows player-can-change-it by the default answer

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

Audit class: observer-judged. An observer, not the running game, judges this. The row uses the default answer. The contract treats the press style of handheld-ads-trigger as demanding. The observer changes the player-facing demanding-input setting, which is not a control-remapping route, and performs the action with the declared easier current press style; that performance emits the action input. The easier press style does not remove any device motion the binding requires. A stored setting alone is not evidence.

Test steps and diagnostics
Given

binding handheld-ads-trigger, its cited demanding press style, and the player-facing demanding-input setting for its declared easier press style, which is not a control-remapping route

When
  • an observer changes the setting and then performs the action with the easier current press style
Then
  • the setting replaces the demanding press style before the binding is used
  • the easier press style does not remove any device motion the binding requires
  • the observer's easier performance emits the action input carrying the action at combat.aim-down-sights
  • the result is judged from performed play and not from a stored setting alone
  • an observer, not the running game, judges this
Diagnostics
  • shooter-layers-handheld-ads-trigger-observer-result
  • shooter-layers-setting-state
  • shooter-layers-action-input-log

demanding-setting-required-motion-default

the required motion of Row.id follows player-can-change-it by the default answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input use game default and motion-use required motion.

demanding-required-press-style-override

the demanding press style of Row.id follows required-as-written by its row answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input required as written and press-style timed press or hold or rapid presses or repeated presses or double press or simultaneous inputs or input sequence and motion-use no motion or optional motion.

demanding-required-required-motion-override

the required motion of Row.id follows required-as-written by its row answer

scenarioper action-bindings row

Does not apply to shooter-layers: no row in action-bindings matches demanding-input required as written and motion-use required motion.

demanding-required-press-style-default

the demanding press style of Row.id follows required-as-written by the default answer

scenarioper action-bindings row

Does not apply to shooter-layers: demanding input default is player can change it, not required as written.

demanding-required-required-motion-default

the required motion of Row.id follows required-as-written by the default answer

scenarioper action-bindings row

Does not apply to shooter-layers: demanding input default is player can change it, not required as written.

simpler-route-is-distinct

Row.id performs the same action without resembling a failed demanding input

scenarioper simpler-inputs row

Does not apply to shooter-layers: simpler-inputs has no rows.

device-motion-rule-holds · handheld-aim-stick

handheld-aim-stick follows its no-motion device-motion rule

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

For handheld-aim-stick under controls.right-stick: no device motion is read while the cited non-motion performance emits the action input. This test names the address, restates nothing from it, and checks nothing about device-motion quality.

Test steps and diagnostics
Given

binding handheld-aim-stick and its physical input and device at controls.right-stick

When
  • the cited performance and the corresponding motion or non-motion comparison are each attempted
Then
  • no device motion is read while the cited non-motion performance emits the action input
  • this test checks nothing about device-motion quality
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

device-motion-rule-holds · handheld-aim-tilt

handheld-aim-tilt follows its optional-motion device-motion rule

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

For handheld-aim-tilt under controls.device-tilt: the completed motion gesture and its matching non-motion alternative each emit an action input carrying the same action. This test names the address, restates nothing from it, and checks nothing about device-motion quality.

Test steps and diagnostics
Given

binding handheld-aim-tilt and its physical input and device at controls.device-tilt

When
  • the cited performance and the corresponding motion or non-motion comparison are each attempted
Then
  • the completed motion gesture and its matching non-motion alternative each emit an action input carrying the same action
  • this test checks nothing about device-motion quality
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

device-motion-rule-holds · handheld-ads-trigger

handheld-ads-trigger follows its no-motion device-motion rule

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

For handheld-ads-trigger under controls.right-trigger: no device motion is read while the cited non-motion performance emits the action input. This test names the address, restates nothing from it, and checks nothing about device-motion quality.

Test steps and diagnostics
Given

binding handheld-ads-trigger and its physical input and device at controls.right-trigger

When
  • the cited performance and the corresponding motion or non-motion comparison are each attempted
Then
  • no device motion is read while the cited non-motion performance emits the action input
  • this test checks nothing about device-motion quality
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

device-motion-rule-holds · handheld-vehicle-boost

handheld-vehicle-boost follows its no-motion device-motion rule

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

For handheld-vehicle-boost under controls.right-trigger: no device motion is read while the cited non-motion performance emits the action input. This test names the address, restates nothing from it, and checks nothing about device-motion quality.

Test steps and diagnostics
Given

binding handheld-vehicle-boost and its physical input and device at controls.right-trigger

When
  • the cited performance and the corresponding motion or non-motion comparison are each attempted
Then
  • no device motion is read while the cited non-motion performance emits the action input
  • this test checks nothing about device-motion quality
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

one-physical-activation-emits-one-action-input

one physical activation emits one action input with all matched candidates

scenarioonce

Applies to shooter-layers.

Each reachable physical activation emits one action input carrying every matched binding's action as a candidate. N matched actions remain one input with N candidates, never N inputs. Where no activation matches several bindings, this test checks nothing about several candidates.

Test steps and diagnostics
Given

each reachable physical activation in the shooter-layers adoption, including one that matches several bindings where the adoption declares one

When
  • the current set is matched and the contract emits its result to the game
Then
  • the activation emits one action input
  • that one input carries every matched binding's action as a candidate
  • N matched actions remain one input with N candidates and never become N inputs
  • where no activation matches several bindings, this test checks nothing about several candidates
Diagnostics
  • shooter-layers-match-trace
  • shooter-layers-action-input-log
  • shooter-layers-candidate-set

action-input-stops-at-handoff

the action input stops at the contract boundary

scenarioonce

Applies to shooter-layers.

The contract emits one action input with all matched candidates and stops there. Input forgiveness can supply the accepted moment; Action legibility, when adopted, selects a candidate before one action proposal. Otherwise the game's cited Fixed selection rule owns shared-candidate selection. This test checks nothing about forgiveness windows, offered-action presentation, candidate ordering, refusal of a proposal, or action effects.

Test steps and diagnostics
Given

one action input emitted by the shooter-layers adoption with all matched candidates

When
  • the input crosses the contract boundary
Then
  • the emitted input is handed to Input forgiveness when adopted, which can supply the accepted moment, and then to Action legibility when adopted for candidate selection before one action proposal
  • without Action legibility, the game's cited Fixed selection rule owns shared-candidate selection
  • this test stops at emission and checks nothing about forgiveness windows, offered-action presentation, candidate ordering, refusal of a proposal, or action effects
Diagnostics
  • shooter-layers-action-input-log

control-options-authority-order

control options keeps the order of its steps

scenarioonce

Applies to shooter-layers.

The order of the steps is platform, defaults, starting set, accepted control change, current set, physical match, demanding-input answer, simpler route, device-motion rule, one action-input creation, accepted-moment shared-action choice, and one action proposal. A later step does not change an earlier decision.

Test steps and diagnostics
Given

a run that reaches platform selection, control setup, a physical activation, and the action-input boundary

When
  • the decision trace is read in order
Then
  • the trace orders platform, defaults, starting set, accepted control change, current set, physical match, demanding-input answer, simpler route, device-motion rule, one action-input creation, accepted-moment shared-action choice, and one action proposal
  • a later step does not change an earlier decision
Diagnostics
  • shooter-layers-platform-selection
  • shooter-layers-change-log
  • shooter-layers-current-set
  • shooter-layers-match-trace
  • shooter-layers-action-input-log

control-options-boundaries

the adoption makes no promise beyond control options

scenarioonce

Applies to shooter-layers.

The contract makes no promise about system-level remapping, virtual-control layout editing, chord member lists, device-motion quality, or saved profiles. Moving or resizing a touch control while keeping its action is not a control change. Presentation of the current binding is owned by Action legibility when adopted, otherwise by the game's UI rules. Beyond its stated hand-off order, the contract makes no promise about an action input after emission.

Test steps and diagnostics
Given

the shooter-layers adoption and features adjacent to its control rules

When
  • the adoption's promise boundary is reviewed
Then
  • the contract makes no promise about system-level remapping, virtual-control layout editing, chord member lists, device-motion quality, or saved profiles
  • moving or resizing a touch control while keeping its action is not a control change
  • presentation of the current binding is owned by Action legibility when adopted, otherwise by the game's UI rules
  • the contract makes no promise about action-input behavior after emission except the stated hand-off order
Diagnostics
  • shooter-layers-declaration-record

empty-row-sets-make-no-promise

empty row sets and absent default answers make no promise

scenarioonce

Applies to shooter-layers.

This declaration check reads the adoption, not the running game. Where no platform row exists, no platform receives a physical-control promise, and the adoption makes no default remapping or demanding-input promise; where a platform row exists, this test checks nothing about these statements. Where no preset, binding, or simpler-input row exists, its row set makes its stated empty-set promise; where a row exists, this test checks nothing about that row set.

Test steps and diagnostics
Given

the shooter-layers adoption, not the running game

When
  • a reviewer checks each row set and the two default answers that depend on a platform row
Then
  • where no platform-control-sets row exists, no platform receives a physical-control promise from this adoption; where a row exists, this test checks nothing about this statement
  • where no control-presets row exists, no named control preset is offered; where a row exists, this test checks nothing about this statement
  • where no action-bindings row exists, no physical input is promised to produce a game action; where a row exists, this test checks nothing about this statement
  • where no simpler-inputs row exists, no demanding binding promises a separate simpler input without a setting change; where a row exists, this test checks nothing about this statement
  • where no platform-control-sets row exists, this adoption makes no default remapping promise; where a platform row exists, this test checks nothing about this statement
  • where no platform-control-sets row exists, this adoption makes no default demanding-input promise; where a platform row exists, this test checks nothing about this statement
Diagnostics
  • shooter-layers-declaration-record

preset-platform-join

declaration check: preset Row.id names a platform row in this adoption

scenarioper control-presets row

Does not apply to shooter-layers: control-presets has no rows.

binding-platform-join · handheld-aim-stick

declaration check: binding handheld-aim-stick names a platform row in this adoption

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

This declaration check reads the adoption, not the running game. Binding handheld-aim-stick must name an existing platform-control-sets row in this adoption: handheld. When the named platform row is missing or misspelled, the adoption is invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-aim-stick, not the running game

When
  • a reviewer checks the platform row that it names
Then
  • a platform-control-sets row with id handheld exists in this adoption
  • a missing or misspelled platform row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-platform-join · handheld-aim-tilt

declaration check: binding handheld-aim-tilt names a platform row in this adoption

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption, not the running game. Binding handheld-aim-tilt must name an existing platform-control-sets row in this adoption: handheld. When the named platform row is missing or misspelled, the adoption is invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-aim-tilt, not the running game

When
  • a reviewer checks the platform row that it names
Then
  • a platform-control-sets row with id handheld exists in this adoption
  • a missing or misspelled platform row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-platform-join · handheld-ads-trigger

declaration check: binding handheld-ads-trigger names a platform row in this adoption

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

This declaration check reads the adoption, not the running game. Binding handheld-ads-trigger must name an existing platform-control-sets row in this adoption: handheld. When the named platform row is missing or misspelled, the adoption is invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-ads-trigger, not the running game

When
  • a reviewer checks the platform row that it names
Then
  • a platform-control-sets row with id handheld exists in this adoption
  • a missing or misspelled platform row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-platform-join · handheld-vehicle-boost

declaration check: binding handheld-vehicle-boost names a platform row in this adoption

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

This declaration check reads the adoption, not the running game. Binding handheld-vehicle-boost must name an existing platform-control-sets row in this adoption: handheld. When the named platform row is missing or misspelled, the adoption is invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-vehicle-boost, not the running game

When
  • a reviewer checks the platform row that it names
Then
  • a platform-control-sets row with id handheld exists in this adoption
  • a missing or misspelled platform row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-preset-join

declaration check: binding Row.id names a preset on the same platform

scenarioper action-bindings row

Does not apply to shooter-layers: no matching row in action-bindings has every field this test uses (preset).

optional-motion-has-no-motion-sibling · handheld-aim-tilt

declaration check: optional-motion binding handheld-aim-tilt has a no-motion binding for the same action

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption, not the running game. The contract requires optional-motion binding handheld-aim-tilt to have another binding for the same action on platform row handheld and the same preset with motion-use no-motion. Any other shape makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and optional-motion binding handheld-aim-tilt, not the running game

When
  • a reviewer compares its action, platform row, preset, and motion use with the other action-bindings rows
Then
  • another binding for the same action on platform row handheld and the same preset has motion-use no-motion
  • any other shape makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

simpler-binding-join

declaration check: simpler route Row.id names a binding in this adoption

scenarioper simpler-inputs row

Does not apply to shooter-layers: simpler-inputs has no rows.

presets-only-has-complete-choice

declaration check: every presets-only platform has two selectable complete presets

scenarioonce

Applies to shooter-layers.

This declaration check reads the adoption, not the running game. Under the contract, every platform whose effective answer is presets-only must have at least two presets whose availability is starting-and-selectable or player-selectable, and every preset maps every action bound on that platform. For a platform with another effective answer, this test checks nothing. A missing choice or incomplete preset makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption, not the running game

When
  • a reviewer resolves each platform row's effective remapping answer and compares its preset and binding rows
Then
  • each platform whose effective answer is presets-only has at least two control-presets rows whose availability is starting-and-selectable or player-selectable
  • every preset for that platform maps every action bound on the platform with a matching action-bindings row
  • for a platform with another effective answer, this test checks nothing
  • a missing choice or incomplete preset makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

simpler-answer-has-row · handheld-aim-stick

declaration check: every demanding simpler-alternative binding has a simpler row

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

This declaration check reads the adoption, not the running game. If handheld-aim-stick has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row must name it. Otherwise this test checks nothing. A missing simpler row makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-aim-stick, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer and classifies its cited performance
Then
  • if handheld-aim-stick has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row names it
  • otherwise this test checks nothing
  • a missing simpler row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

simpler-answer-has-row · handheld-aim-tilt

declaration check: every demanding simpler-alternative binding has a simpler row

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption, not the running game. If handheld-aim-tilt has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row must name it. Otherwise this test checks nothing. A missing simpler row makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-aim-tilt, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer and classifies its cited performance
Then
  • if handheld-aim-tilt has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row names it
  • otherwise this test checks nothing
  • a missing simpler row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

simpler-answer-has-row · handheld-ads-trigger

declaration check: every demanding simpler-alternative binding has a simpler row

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

This declaration check reads the adoption, not the running game. If handheld-ads-trigger has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row must name it. Otherwise this test checks nothing. A missing simpler row makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-ads-trigger, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer and classifies its cited performance
Then
  • if handheld-ads-trigger has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row names it
  • otherwise this test checks nothing
  • a missing simpler row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

simpler-answer-has-row · handheld-vehicle-boost

declaration check: every demanding simpler-alternative binding has a simpler row

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

This declaration check reads the adoption, not the running game. If handheld-vehicle-boost has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row must name it. Otherwise this test checks nothing. A missing simpler row makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and binding handheld-vehicle-boost, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer and classifies its cited performance
Then
  • if handheld-vehicle-boost has a demanding press style or requires device motion, and its effective answer is simpler-alternative, at least one simpler-inputs row names it
  • otherwise this test checks nothing
  • a missing simpler row makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

no-demanding-answer-has-ordinary-route · handheld-aim-stick

declaration check: every no-demanding binding has an ordinary route

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

This declaration check reads the adoption and its cited prose, not the running game. Under an effective no-demanding-presses answer, handheld-aim-stick must have a non-demanding press style and not require device motion, or have a cited ordinary route to the same action. Under another answer, this test checks nothing. A demanding-only route makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption, binding handheld-aim-stick, and its cited prose, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer
Then
  • if the effective answer is no-demanding-presses, handheld-aim-stick has a non-demanding press style and does not require device motion, or its cited prose states an ordinary route to the same action
  • otherwise this test checks nothing
  • a demanding-only route makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

no-demanding-answer-has-ordinary-route · handheld-aim-tilt

declaration check: every no-demanding binding has an ordinary route

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption and its cited prose, not the running game. Under an effective no-demanding-presses answer, handheld-aim-tilt must have a non-demanding press style and not require device motion, or have a cited ordinary route to the same action. Under another answer, this test checks nothing. A demanding-only route makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption, binding handheld-aim-tilt, and its cited prose, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer
Then
  • if the effective answer is no-demanding-presses, handheld-aim-tilt has a non-demanding press style and does not require device motion, or its cited prose states an ordinary route to the same action
  • otherwise this test checks nothing
  • a demanding-only route makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

no-demanding-answer-has-ordinary-route · handheld-ads-trigger

declaration check: every no-demanding binding has an ordinary route

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

This declaration check reads the adoption and its cited prose, not the running game. Under an effective no-demanding-presses answer, handheld-ads-trigger must have a non-demanding press style and not require device motion, or have a cited ordinary route to the same action. Under another answer, this test checks nothing. A demanding-only route makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption, binding handheld-ads-trigger, and its cited prose, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer
Then
  • if the effective answer is no-demanding-presses, handheld-ads-trigger has a non-demanding press style and does not require device motion, or its cited prose states an ordinary route to the same action
  • otherwise this test checks nothing
  • a demanding-only route makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

no-demanding-answer-has-ordinary-route · handheld-vehicle-boost

declaration check: every no-demanding binding has an ordinary route

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

This declaration check reads the adoption and its cited prose, not the running game. Under an effective no-demanding-presses answer, handheld-vehicle-boost must have a non-demanding press style and not require device motion, or have a cited ordinary route to the same action. Under another answer, this test checks nothing. A demanding-only route makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption, binding handheld-vehicle-boost, and its cited prose, not the running game

When
  • a reviewer resolves the binding's effective demanding-input answer
Then
  • if the effective answer is no-demanding-presses, handheld-vehicle-boost has a non-demanding press style and does not require device motion, or its cited prose states an ordinary route to the same action
  • otherwise this test checks nothing
  • a demanding-only route makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

forbidden-effective-pair-does-not-reappear

declaration check: no platform or binding recreates the forbidden effective pair

scenarioonce

Applies to shooter-layers.

This declaration check reads the adoption, not the running game. The contract's demanding-input field forbids a binding from having effective required-as-written on a platform with effective action-and-press-style. A row override that recreates this forbidden pair makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption, not the running game

When
  • a reviewer resolves every platform's effective remapping answer and every binding's effective demanding-input answer
Then
  • no binding has effective required-as-written on a platform with effective action-and-press-style
  • any platform-row or binding-row override that recreates that pair makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

settings-citation-covers-effective-change-policy · handheld

declaration check: handheld's settings citation covers its effective policy

scenarioper platform-control-sets row

Applies to the handheld row.

This declaration check reads the adoption and controls.handheld-control-options, not the running game. Under any-action-any-input or action-and-press-style, that citation must state visible conflict handling before use; action-and-press-style must also state the press styles offered for each action. Under swap-only, it must state that a swap exchanges two existing assignments. Under presets-only, it must state that selection replaces the whole set and an individual binding change is refused. Under fixed-bindings, it must state the absence of changes. A missing duty makes the adoption invalid, and this test fails. This test checks nothing about reachability beyond what the citation states.

Test steps and diagnostics
Given

the shooter-layers adoption, platform row handheld, and controls.handheld-control-options, not the running game

When
  • a reviewer resolves the row's effective remapping answer and checks the cited rule
Then
  • under any-action-any-input or action-and-press-style, the citation states visible conflict handling before use
  • under action-and-press-style, the citation states the press styles offered for each action
  • under swap-only, the citation states that a swap exchanges two existing assignments
  • under presets-only, the citation states that selection replaces the whole set and an individual binding change is refused
  • under fixed-bindings, the citation states the absence of changes
  • a missing duty makes the adoption invalid, and this test fails
  • this test checks nothing about reachability beyond what the citation states
Diagnostics
  • shooter-layers-declaration-record

shared-action-input-declaration-agrees

declaration check: rows sharing an activation agree on one action input

scenarioonce

Applies to shooter-layers.

This declaration check reads the adoption and its cited physical activations and contexts, not the running game. Under the contract, one group contains only rows that can be current together: they use the same platform row, either all omit a preset or all name the same preset, have no disjoint cited contexts, and share one physical activation. Rows in mutually exclusive presets or disjoint contexts are not one group, and this test checks nothing about whether their action-input values agree. Every row in a multi-binding group supplies and agrees on one value, and the emitted input carries every matched action as a candidate. A lone binding's name can remain implicit, and this test checks nothing about a shared value for a lone binding. A missing, different, or split value makes the adoption invalid, and this test fails. This test checks nothing about a paired Action legibility adoption.

Test steps and diagnostics
Given

the shooter-layers adoption and the physical activations, platforms, presets, and contexts described by its binding rows and citations, not the running game

When
  • a reviewer groups rows that can be current together and share one physical activation
Then
  • one group contains only rows on the same platform row that either all omit a preset or all name the same preset, have no disjoint cited contexts, and share one physical activation
  • rows in mutually exclusive presets or disjoint cited contexts are not one group, and this test checks nothing about whether their action-input values agree
  • every group with several bindings supplies one action-input value shared by every row in that group
  • the emitted input carries every matched binding's action as a candidate
  • a lone binding's action-input name can remain implicit, and this test checks nothing about a shared value for a lone binding
  • a missing, different, or split shared value makes the adoption invalid, and this test fails
  • this test checks nothing about a paired Action legibility adoption
Diagnostics
  • shooter-layers-declaration-record
  • shooter-layers-candidate-set

rows-do-not-duplicate-meaning

declaration check: no two rows mean the same platform, preset, or binding

scenarioonce

Applies to shooter-layers.

This declaration check reads the adoption and its cited prose, not the running game. No two rows can mean the same platform, preset, binding, or simpler alternative for one binding. The contract sets no maximum row count. A duplicate meaning makes the adoption invalid, and this test fails.

Test steps and diagnostics
Given

the shooter-layers adoption and its cited prose, not the running game

When
  • a reviewer compares every pair of rows in each row set
Then
  • no two platform-control-sets rows mean the same platform, edition, devices, and policy scope
  • no two control-presets rows mean the same preset
  • no two action-bindings rows mean the same binding
  • no two simpler-inputs rows mean the same alternative for one binding
  • the contract imposes no maximum row count
  • a duplicate meaning makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

platform-citation-duty · handheld

declaration check: handheld's platform citation states its duty

scenarioper platform-control-sets row

Applies to the handheld row.

This declaration check reads the adoption and platforms.handheld, not the running game. The citation must name one platform or edition and its supported devices; different control behavior belongs in another row. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and platforms.handheld, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • platforms.handheld names one platform or edition and its supported devices, with different control behavior in another row
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

methods-citation-duty · handheld

declaration check: handheld's methods citation states its duty

scenarioper platform-control-sets row

Applies to the handheld row.

This declaration check reads the adoption and controls.handheld-gamepad, not the running game. The citation must list every complete input method for handheld and any required switch. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and controls.handheld-gamepad, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • controls.handheld-gamepad lists every complete input method for handheld and any required switch between methods
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

settings-rule-citation-duty · handheld

declaration check: handheld's settings citation states its duty

scenarioper platform-control-sets row

Applies to the handheld row.

This declaration check reads the adoption and controls.handheld-control-options, not the running game. The citation must always state handheld's control menu. Where the platform declares a preset, it must state preset selection. Under effective any-action-any-input or action-and-press-style, it must state conflict handling; action-and-press-style must also state the press styles offered for each action. Under effective fixed-bindings, it must state the explicit absence of changes. For a duty outside its stated condition, this test checks nothing. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and controls.handheld-control-options, not the running game

When
  • a reviewer resolves handheld's effective remapping answer and checks the citation's meaning
Then
  • controls.handheld-control-options states handheld's control menu
  • where the platform has a control-presets row, the citation states preset selection; where it has none, this test checks nothing about preset selection
  • under effective any-action-any-input or action-and-press-style, the citation states conflict handling; under another effective answer, this test checks nothing about conflict handling
  • under effective action-and-press-style, the citation states the press styles offered for each action; under another effective answer, this test checks nothing about the offered press styles
  • under effective fixed-bindings, the citation states the explicit absence of changes; under another effective answer, this test checks nothing about the absence of changes
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

preset-selection-citation-duty

declaration check: preset Row.id's selection citation states its duty

scenarioper control-presets row

Does not apply to shooter-layers: control-presets has no rows.

binding-action-citation-duty · handheld-aim-stick

declaration check: handheld-aim-stick's action citation states its duty

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

This declaration check reads the adoption and combat.aim, not the running game. The citation must name the game action that handheld-aim-stick contributes as a candidate. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and combat.aim, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • combat.aim names the game action that handheld-aim-stick contributes as a candidate
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-action-citation-duty · handheld-aim-tilt

declaration check: handheld-aim-tilt's action citation states its duty

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption and combat.aim, not the running game. The citation must name the game action that handheld-aim-tilt contributes as a candidate. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and combat.aim, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • combat.aim names the game action that handheld-aim-tilt contributes as a candidate
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-action-citation-duty · handheld-ads-trigger

declaration check: handheld-ads-trigger's action citation states its duty

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

This declaration check reads the adoption and combat.aim-down-sights, not the running game. The citation must name the game action that handheld-ads-trigger contributes as a candidate. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and combat.aim-down-sights, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • combat.aim-down-sights names the game action that handheld-ads-trigger contributes as a candidate
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-action-citation-duty · handheld-vehicle-boost

declaration check: handheld-vehicle-boost's action citation states its duty

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

This declaration check reads the adoption and vehicle.boost, not the running game. The citation must name the game action that handheld-vehicle-boost contributes as a candidate. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and vehicle.boost, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • vehicle.boost names the game action that handheld-vehicle-boost contributes as a candidate
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-physical-input-citation-duty · handheld-aim-stick

declaration check: handheld-aim-stick's physical-input citation states its duty

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

This declaration check reads the adoption and controls.right-stick, not the running game. The citation must name handheld-aim-stick's physical input, supplying device, and the axis range and direction. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and controls.right-stick, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • controls.right-stick names the physical input, its supplying device, and the axis range and direction for handheld-aim-stick
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-physical-input-citation-duty · handheld-aim-tilt

declaration check: handheld-aim-tilt's physical-input citation states its duty

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption and controls.device-tilt, not the running game. The citation must name handheld-aim-tilt's physical input, supplying device, and the gesture completion. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and controls.device-tilt, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • controls.device-tilt names the physical input, its supplying device, and the gesture completion for handheld-aim-tilt
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-physical-input-citation-duty · handheld-ads-trigger

declaration check: handheld-ads-trigger's physical-input citation states its duty

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

This declaration check reads the adoption and controls.right-trigger, not the running game. The citation must name handheld-ads-trigger's physical input, supplying device, and the hold completion. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and controls.right-trigger, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • controls.right-trigger names the physical input, its supplying device, and the hold completion for handheld-ads-trigger
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-physical-input-citation-duty · handheld-vehicle-boost

declaration check: handheld-vehicle-boost's physical-input citation states its duty

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

This declaration check reads the adoption and controls.right-trigger, not the running game. The citation must name handheld-vehicle-boost's physical input, supplying device, and the press performance. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and controls.right-trigger, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • controls.right-trigger names the physical input, its supplying device, and the press performance for handheld-vehicle-boost
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-context-citation-duty · handheld-aim-stick

declaration check: handheld-aim-stick's context citation states its duty

scenarioper action-bindings row

Applies to the handheld-aim-stick row.

This declaration check reads the adoption and play.on-foot, not the running game. The citation must state the context in which binding handheld-aim-stick exists. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and play.on-foot, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • play.on-foot states the context in which binding handheld-aim-stick exists
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-context-citation-duty · handheld-aim-tilt

declaration check: handheld-aim-tilt's context citation states its duty

scenarioper action-bindings row

Applies to the handheld-aim-tilt row.

This declaration check reads the adoption and play.on-foot, not the running game. The citation must state the context in which binding handheld-aim-tilt exists. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and play.on-foot, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • play.on-foot states the context in which binding handheld-aim-tilt exists
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-context-citation-duty · handheld-ads-trigger

declaration check: handheld-ads-trigger's context citation states its duty

scenarioper action-bindings row

Applies to the handheld-ads-trigger row.

This declaration check reads the adoption and play.on-foot, not the running game. The citation must state the context in which binding handheld-ads-trigger exists. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and play.on-foot, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • play.on-foot states the context in which binding handheld-ads-trigger exists
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

binding-context-citation-duty · handheld-vehicle-boost

declaration check: handheld-vehicle-boost's context citation states its duty

scenarioper action-bindings row

Applies to the handheld-vehicle-boost row.

This declaration check reads the adoption and play.in-vehicle, not the running game. The citation must state the context in which binding handheld-vehicle-boost exists. A missing duty makes the adoption invalid, and this test fails. The test names the address and restates nothing from it.

Test steps and diagnostics
Given

the shooter-layers adoption and play.in-vehicle, not the running game

When
  • a reviewer checks the citation's meaning
Then
  • play.in-vehicle states the context in which binding handheld-vehicle-boost exists
  • a missing duty makes the adoption invalid, and this test fails
Diagnostics
  • shooter-layers-declaration-record

simpler-alternative-citation-duty

declaration check: Row.id's alternative citation states its duty

scenarioper simpler-inputs row

Does not apply to shooter-layers: simpler-inputs has no rows.

simpler-distinction-citation-duty

declaration check: Row.id's distinction citation states its duty

scenarioper simpler-inputs row

Does not apply to shooter-layers: simpler-inputs has no rows.

control-options-hold

control options holds for the whole run

generalonce

Applies to shooter-layers.

Across every platform row on its cited devices, every preset, every binding, and every simpler route of the audited run, every accepted control change follows the platform's effective remapping answer and every refused change is refused; every binding matches only under its cited performance and emits one action input; every demanding binding meets its effective answer; every simpler route produces the same action distinguishably; every device-motion rule holds; and no physical activation produces more than one action input.

Test steps and diagnostics
Holds

every accepted control change followed the platform's effective remapping answer and every refused change was refused; every binding matched only under its cited performance and emitted one action input; every demanding binding met its effective answer; every simpler route produced the same action distinguishably; every device-motion rule held; no physical activation produced more than one action input

Seeds

["audit-a","audit-b"]

Scope

every platform row on its cited devices, every preset, every binding, and every simpler route of the audited run

Diagnostics
  • shooter-layers-platform-selection
  • shooter-layers-change-log
  • shooter-layers-current-set
  • shooter-layers-match-trace
  • shooter-layers-action-input-log
  • shooter-layers-observer-result
  • shooter-layers-setting-state
JSONthe adoption as one file

Answers you try on this page do not change this file. To change an adoption, open it in the authoring tool.

{
  "contract": "control-options",
  "version": 2,
  "summary": "This contract covers which physical inputs produce each action on every platform. It also covers complete input methods, named control presets, remapping, press styles, simpler alternatives, and device-motion inputs. This contract does not cover action prompts, input timing help, the choice between actions that share one input, or event order. The Action legibility contract covers action prompts and the choice between actions that share one input, the Input forgiveness contract covers input timing help, and the Event resolution contract covers event order.",
  "questions": {
    "remapping-default": {
      "asks": "By default, how can players change the controls?",
      "rationale": "A platform may offer fixed controls, presets, or free changes. This answer is the default answer. A platform row can choose another answer.",
      "when": {
        "row-count": {
          "platform-control-sets": "non-empty"
        }
      },
      "otherwise": "With no platform control set, this adoption makes no default remapping promise.",
      "options": {
        "fixed-bindings": {
          "meaning": "The controls cannot be changed in the game. A puzzle game always keeps rotate on the space bar.",
          "semantics": "No player-facing setting changes an action's physical input or press style."
        },
        "swap-only": {
          "meaning": "Existing controls can only exchange actions. A platformer can swap jump and dash, but an unused button cannot receive either action.",
          "semantics": "A supported binding can exchange its current action with another supported binding; no action can move independently to an otherwise unused input."
        },
        "presets-only": {
          "meaning": "Players can choose only between presets. An action game offers the presets Default and Alternate, and no single button can be changed.",
          "semantics": "The player may select a complete declared preset but cannot change one binding independently inside that preset. The platform offers at least two presets whose availability is starting-and-selectable or player-selectable."
        },
        "any-action-any-input": {
          "meaning": "Any action can move to any supported input. A strategy game can move end turn from Enter to an unused mouse button.",
          "semantics": "Every covered action can be assigned independently to any supported remappable input, including an otherwise unassigned input; conflicts are resolved visibly before use."
        },
        "action-and-press-style": {
          "meaning": "Both the input and the press style can change. An adventure game can move interact to another button and change a hold into one press.",
          "semantics": "Every covered action can change to a supported input and to any press style that its cited platform rule offers for that action."
        }
      }
    },
    "demanding-input-default": {
      "asks": "By default, what happens when an action needs a demanding press?",
      "rationale": "A hold, rapid presses, a double press, or a button combination can stop a player from using an action that the player knows. This answer is the default answer.",
      "when": {
        "row-count": {
          "platform-control-sets": "non-empty"
        }
      },
      "otherwise": "With no platform control set, this adoption makes no default demanding-input promise.",
      "options": {
        "no-demanding-presses": {
          "meaning": "No action needs a demanding press. A card game plays a selected card with one ordinary activation.",
          "semantics": "No covered binding requires timed, held, rapid, repeated, double, simultaneous, directional-sequence, or device-motion input as its only route to the action."
        },
        "simpler-alternative": {
          "meaning": "Every demanding press has a distinct simpler route with no setting change. A repair game offers a separate tap button beside its hold-to-repair control.",
          "semantics": "Every covered demanding binding has a declared alternative that performs the same action without configuration."
        },
        "player-can-change-it": {
          "meaning": "A setting can make the press easier. A racing game can change a held pit command into one ordinary press.",
          "semantics": "A player-facing setting replaces each covered demanding press with a declared easier press style before play uses the binding."
        },
        "required-as-written": {
          "meaning": "The demanding press remains required. A rhythm special still needs two buttons together and has no simpler route from this contract.",
          "semantics": "The covered demanding binding has no simpler alternative or press-style setting promised by this adoption."
        }
      }
    }
  },
  "declares": {
    "values": {},
    "rows": {
      "platform-control-sets": {
        "description": "Supported platforms or editions and their complete control policies. A separate row is required whenever mappings or options differ.",
        "when-empty": "No platform receives a physical-control promise from this adoption.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name for the platform or edition in your game's words, such as pc or console-gamepad."
          },
          "platform-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules name one platform or edition and its supported devices. Use another row when the control behavior differs."
          },
          "methods-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules list the complete input methods and any required switch between them. A PC row may name keyboard and pointer as one mixed method."
          },
          "input-method-coverage": {
            "type": "string",
            "required": true,
            "options": [
              "one-method-covers-all",
              "player-chooses-method",
              "mixed-methods-needed"
            ],
            "description": "Whether one named method covers every action bound on the platform, several named methods each do so, or the named methods must be mixed. A console may offer complete gamepad and accessibility-controller methods."
          },
          "remapping": {
            "type": "string",
            "required": true,
            "options": [
              "use-game-default",
              "fixed-bindings",
              "swap-only",
              "presets-only",
              "any-action-any-input",
              "action-and-press-style"
            ],
            "description": "The platform's remapping policy. Use the default answer, or choose another answer for this row. A console edition may offer presets while the PC edition allows free assignment."
          },
          "settings-rule-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules state the platform's control menu. The rules also state what the platform's effective remapping answer needs: preset selection, conflict handling, or the press styles offered for each action. When bindings are fixed, the rules state explicitly that no changes are possible."
          }
        }
      },
      "control-presets": {
        "description": "Named complete binding sets offered on a platform. A preset maps every action bound on its platform.",
        "when-empty": "No named control preset is offered.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name for the preset in your game's words, such as gamepad-default or gamepad-alternate."
          },
          "platform-control-set": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The supported platform or edition that offers this preset."
          },
          "label": {
            "type": "string",
            "required": true,
            "description": "The player-facing preset name, such as Standard or Southpaw."
          },
          "availability": {
            "type": "string",
            "required": true,
            "options": [
              "starting-and-selectable",
              "player-selectable",
              "mode-selected"
            ],
            "description": "Whether this preset is the starting set and remains selectable, is another selectable set, or follows a cited player mode. An assisted-play mode may select its own complete preset."
          },
          "selection-rule-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules state the route that selects this preset and makes its matching action-binding rows current."
          }
        }
      },
      "action-bindings": {
        "description": "Physical inputs that produce actions on a platform or inside one named preset.",
        "when-empty": "No physical input is promised to produce a game action.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name in your game's words for the platform, the action, and the input, such as pc-jump-space. A per-character control set names the character too."
          },
          "platform-control-set": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The supported platform or edition where this binding exists."
          },
          "preset": {
            "type": "string",
            "pattern": "kebab-case",
            "description": "The preset that contains this binding. When this field is absent, the binding belongs to the platform's current base set or its freely remappable set. On a platform where players can change controls, the preset is the starting set. Accepted changes change only the current copy, not the preset."
          },
          "context-declared-in": {
            "type": "citation",
            "description": "Where your game's rules state the context in which this binding exists, such as a vehicle layer, menu, training mode, or unlock gate. When this field is absent, the binding exists throughout the selected control set."
          },
          "action-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules name the game action that this binding contributes as a candidate."
          },
          "physical-input-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules name the physical input and the device that supplies it. The physical input is a key, button, axis, touch region, gesture, directional sequence, or device-motion input."
          },
          "action-input": {
            "type": "string",
            "pattern": "kebab-case",
            "description": "A name for the one input that the game receives from this physical activation. Give the name when several bindings use the same physical activation."
          },
          "press-style": {
            "type": "string",
            "required": true,
            "options": [
              "press",
              "release",
              "timed-press",
              "hold",
              "rapid-presses",
              "repeated-presses",
              "double-press",
              "simultaneous-inputs",
              "continuous-axis",
              "gesture",
              "input-sequence"
            ],
            "description": "The physical performance required by this binding. A timed press has a target moment, rapid presses have a rate, repeated presses have a count, and an input sequence is a directional sequence completed by a press."
          },
          "motion-use": {
            "type": "string",
            "required": true,
            "options": [
              "no-motion",
              "optional-motion",
              "required-motion"
            ],
            "description": "Whether this binding uses no device motion, is an optional device-motion route beside another binding, or requires device motion. A handheld aim action may offer tilt as an alternative to the stick. A required-motion binding is demanding because of its motion. A press-style setting does not make it easier, so its easier route is a simpler alternative or another binding. An optional-motion binding has a no-motion binding for the same action on the same platform and preset."
          },
          "demanding-input": {
            "type": "string",
            "required": true,
            "options": [
              "use-game-default",
              "no-demanding-presses",
              "simpler-alternative",
              "player-can-change-it",
              "required-as-written"
            ],
            "description": "The demanding-input answer of this action binding. Use the default answer, or choose another answer for this row. A repeated crafting input may allow a hold even when combat combinations remain fixed. No binding answers required-as-written on a platform whose effective remapping is action-and-press-style."
          }
        }
      },
      "simpler-inputs": {
        "description": "Separate simpler inputs that work without a setting change, for bindings whose effective demanding-input answer promises one.",
        "when-empty": "No demanding binding promises a separate simpler input without a setting change.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name for the alternative in your game's words, such as repair-tap-alternative."
          },
          "action-binding": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The demanding binding for which this route is the simpler alternative."
          },
          "alternative-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules name the physical input and the ordinary press style that perform the same game action without a setting change."
          },
          "distinction-rule-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules prove that a successful use of this alternative cannot be mistaken for a failure to finish the demanding input."
          }
        }
      }
    }
  },
  "rules": {
    "press-style-change-needs-a-setting-answer": {
      "forbid": {
        "all": [
          {
            "flag": {
              "remapping-default": [
                "action-and-press-style"
              ]
            }
          },
          {
            "flag": {
              "demanding-input-default": [
                "required-as-written"
              ]
            }
          }
        ]
      },
      "message": "Controls that let players change a press style cannot also require every demanding press exactly as written."
    }
  },
  "origin": "https://opengdd.org/contracts/control-options-2",
  "mechanism": [
    "This text decides the order of the steps for platform selection, preset choice, remapping, physical-input matching, press style, simpler alternatives, device-motion use, and creation of action inputs. The questions and rows supply choices and cited game rules. They do not change the order.",
    "A **control set** is the complete current mapping for one platform and input method. A **preset** is a named immutable source set that can become current. A **binding** joins one physical input and press style to one candidate action. An **action input** is the one signal that the game receives from a physical activation; it carries every matched binding's action as a candidate. Bindings that can be current together and share one physical activation share its optional `action-input` name, while a lone binding's name may remain implicit. A **demanding input** is a timed, held, rapid, repeated, double, simultaneous, input-sequence, or required-device-motion input.",
    "1. Select exactly one matching platform-control-set from the running platform, edition, and supported device rules.",
    "2. Resolve the platform's effective remapping answer. A row value other than `use-game-default` applies. Otherwise `remapping-default` applies.",
    "3. Establish the starting control set from the platform's cited rule. When a preset is selected, copy its complete matching action-binding rows into the current set. The preset itself remains unchanged.",
    "4. Apply control changes only through the effective remapping answer. Fixed bindings refuse all changes. Swap-only exchanges two existing assignments. Presets-only replaces the whole set with another declared preset. Free assignment moves one action independently and resolves conflicts before use. Action-and-press-style also permits a supported press-style change.",
    "5. After an accepted change, the resulting complete set becomes current. Every later binding lookup reads that set, and each binding row's promises follow its action to the input the current set assigns. Presentation of the current binding is owned by Action legibility when adopted, otherwise by the game's UI rules.",
    "6. On physical input, read every binding with a matching physical input and performance in the current platform, device, method, and preset-derived set. A press, release, hold, repeated activation, double activation, simultaneous group, axis, gesture, directional input sequence, or device-motion input matches only under its cited Fixed rule. An optional binding context makes the match provisional. Whether that context holds is decided at the accepted moment. Step 11 says how the accepted moment is determined. Rows that can be current together and share one physical activation agree on one `action-input` value. A physical input cited by a `simpler-inputs` row matches as if it were its named binding: it emits that binding's action input and contributes the same action.",
    "7. Resolve the binding's effective demanding-input answer. A row value other than `use-game-default` applies. Otherwise `demanding-input-default` applies.",
    "8. Under no-demanding-presses, the covered action has an ordinary route. Under player-can-change-it, the selected setting supplies the easier current press style. Under required-as-written, an incomplete demanding input produces no action input from this contract.",
    "9. Under simpler-alternative, the demanding route and every matching simpler row remain available together without configuration. The alternative produces the same action only through its distinct cited input; failure to finish the demanding route never becomes the alternative by itself.",
    "10. A `no-motion` binding reads no device motion. An `optional-motion` binding contributes the same action as its non-device-motion alternative when its gesture completes. A `required-motion` binding produces no action input from a non-device-motion attempt.",
    "11. First, the physical input occurs. Then this contract emits the action input. Then Input forgiveness, when adopted, may shift the accepted moment. Then Action legibility, when adopted, selects the offered candidate at the accepted moment. The result is one action proposal. Thus an interact buffered during a cutscene evaluates candidates in the situation where the input is accepted, not the situation where it was pressed. The emitted action input carries every matched binding's action as a candidate; it is one input with N candidates, never N inputs.",
    "12. When Action legibility is adopted, its shared-input case consumes that one action input and selects one candidate. Otherwise the game's cited Fixed selection rule resolves shared candidates, and the game's UI rules own their presentation. Event resolution begins only after the one action proposal exists.",
    "The order of the steps is: platform, defaults, starting set, accepted control change, current set, physical match, demanding-input answer, simpler route, device-motion rule, one action-input creation, accepted-moment shared-action choice, and one action proposal."
  ],
  "pack": "sha256:af872c7dbbd7b7faeacfbfb6f9015a7e9988a6e44b4726318aa9f91e20fe39b2",
  "answers": {
    "remapping-default": "action-and-press-style",
    "demanding-input-default": "player-can-change-it"
  },
  "values": {},
  "rows": {
    "platform-control-sets": [
      {
        "id": "handheld",
        "platform-declared-in": "platforms.handheld",
        "methods-declared-in": "controls.handheld-gamepad",
        "input-method-coverage": "one-method-covers-all",
        "remapping": "use-game-default",
        "settings-rule-declared-in": "controls.handheld-control-options"
      }
    ],
    "control-presets": [],
    "action-bindings": [
      {
        "id": "handheld-aim-stick",
        "platform-control-set": "handheld",
        "context-declared-in": "play.on-foot",
        "action-declared-in": "combat.aim",
        "physical-input-declared-in": "controls.right-stick",
        "press-style": "continuous-axis",
        "motion-use": "no-motion",
        "demanding-input": "no-demanding-presses"
      },
      {
        "id": "handheld-aim-tilt",
        "platform-control-set": "handheld",
        "context-declared-in": "play.on-foot",
        "action-declared-in": "combat.aim",
        "physical-input-declared-in": "controls.device-tilt",
        "press-style": "gesture",
        "motion-use": "optional-motion",
        "demanding-input": "no-demanding-presses"
      },
      {
        "id": "handheld-ads-trigger",
        "platform-control-set": "handheld",
        "context-declared-in": "play.on-foot",
        "action-declared-in": "combat.aim-down-sights",
        "physical-input-declared-in": "controls.right-trigger",
        "press-style": "hold",
        "motion-use": "no-motion",
        "demanding-input": "use-game-default"
      },
      {
        "id": "handheld-vehicle-boost",
        "platform-control-set": "handheld",
        "context-declared-in": "play.in-vehicle",
        "action-declared-in": "vehicle.boost",
        "physical-input-declared-in": "controls.right-trigger",
        "press-style": "press",
        "motion-use": "no-motion",
        "demanding-input": "no-demanding-presses"
      }
    ],
    "simpler-inputs": []
  }
}