Secret finisher
secret-finisher · an adoption of Action legibility, version 2
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 actions players can discover in each situation, how availability is presented, and what an unavailable action shows. It also covers which action is offered when one control signal has several candidate actions. This contract does not cover physical controls, input timing help, displayed game facts, or event order. The Control options contract covers physical controls, the Input forgiveness contract covers input timing help, the Fact list contract covers displayed game facts, and the Event resolution contract covers event order.
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 discover an action in a situation where the action applies?
- Asked when
- the action cases list has at least one row.
- If not asked
- With no action case, this adoption makes no default discovery promise.
Why this is asked
Different actions may need different help. This answer is the default answer. An action case can choose another answer in its own row.
By default, what appears when an action cannot be used?
- Asked when
- the action cases list has at least one row.
- If not asked
- With no action case, this adoption makes no default unavailable-action promise.
Why this is asked
A missing prompt, a dimmed control, and an explanation create different expectations. 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.
-
Forbidden when Action discovery default is None, and Unavailable action default is Reason is shown.
Lists3 lists
Each list holds the rows this adoption supplies. A list can be empty.
Action cases
action-cases
| Id | Action declared in | Situation declared in | Discoverability | When unavailable | Presentation rule declared in |
|---|---|---|---|---|---|
secret-finisher | combat.secret-finisher | combat.final-round-range | none | unchanged | combat.secret-finisher-has-no-discovery-route |
Availability presentations
availability-presentations
This adoption declares no availability presentations.
Shared input cases
shared-input-cases
This adoption declares no shared input cases.
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 tests18 tests apply
The contract comes with 52 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.
action-legibility-vocabulary
action legibility uses one action input, action cases, candidates, and offered actions
Applies to secret-finisher.
An action input is one signal that the game receives. It comes from Control options when that contract is adopted, otherwise from the game's Fixed control rule. An action case is one action in one cited situation. A candidate is an action the input carries whose permission or forgiveness acceptance holds at the accepted moment. An action is offered when selection identifies it to the player.
Test steps and diagnostics
- Given
the
secret-finisheradoption and a player-facing physical control, where the adoption or its cited control rules name an action input; where they name none, this test checks nothing- When
- the control path, matching action cases, candidate actions, and offered result are identified
- Then
- the action input is one signal that the game receives; it comes from Control options when adopted and otherwise from the game's Fixed control rule
- each action case is one action in one cited situation
- a candidate is an action the input carries whose binding context, when one exists, holds and whose ordinary permission or Input forgiveness acceptance holds at the accepted moment
- an action is offered only when it is identified to the player as the result of selection
- Diagnostics
secret-finisher-candidate-setsecret-finisher-offered-action
no-action-case-makes-no-promise
with no matching action case, the adoption makes no action-legibility promise
Applies to secret-finisher.
Where no matching action case exists because the adoption has no action-cases row, the adoption makes no discovery, unavailable-presentation, or availability promise and both default answers are absent. Where an action case exists, this test checks nothing.
Test steps and diagnostics
- Given
the
secret-finisheradoption, its action-cases rows, and its default answers- When
- the adoption's action-legibility promises are read
- Then
- where no matching action case exists because the adoption has no action-cases row, the adoption makes no discovery, unavailable-presentation, or availability promise and the default discovery answer and the default unavailable-action answer are both absent; where an action case exists, this test checks nothing
- Diagnostics
secret-finisher-declaration-record
action-case-matches-cited-situation · secret-finisher
secret-finisher applies exactly in its cited situations
Applies to the secret-finisher row.
Action case secret-finisher applies in every situation named at combat.final-round-range and does not apply in any situation excluded there. It applies on every platform the adoption covers; differences between platforms are stated only in availability-presentations rows. The test leaves the rule's content to that citation. For a situation that the citation neither covers nor excludes, this test checks nothing.
Test steps and diagnostics
- Given
the action case
secret-finisherand the Fixed situation rule atcombat.final-round-range- When
- the cited covered situations and the nearest similar excluded situations are each reached
- Then
secret-finisherapplies in every situation the citation coverssecret-finisherdoes not apply in any situation the citation excludessecret-finisherapplies on every platform the adoption covers; differences between platforms are stated only in availability-presentations rows- for a situation that the citation neither covers nor excludes, this test checks nothing
- Diagnostics
secret-finisher-situation-trace
discovery-looks-usable-override
Row.id looks usable by its row answer
Does not apply to secret-finisher: no row in action-cases matches discoverability looks usable.
discovery-looks-usable-default
Row.id looks usable by the default answer
Does not apply to secret-finisher: no row in action-cases matches discoverability use game default.
discovery-explanation-on-demand-override
Row.id has an explanation route by its row answer
Does not apply to secret-finisher: no row in action-cases matches discoverability explanation on demand.
discovery-explanation-on-demand-default
Row.id has an explanation route by the default answer
Does not apply to secret-finisher: action discovery default is looks usable, not explanation on demand.
discovery-current-binding-override
Row.id shows the current device control by its row answer
Does not apply to secret-finisher: no row in action-cases matches discoverability current binding is shown.
discovery-current-binding-default
Row.id shows the current device control by the default answer
Does not apply to secret-finisher: action discovery default is looks usable, not current binding is shown.
discovery-assistive-name-override
Row.id exposes its name and role by its row answer
Does not apply to secret-finisher: no row in action-cases matches discoverability assistive tech can name it.
discovery-assistive-name-default
Row.id exposes its name and role by the default answer
Does not apply to secret-finisher: action discovery default is looks usable, not assistive tech can name it.
discovery-none-override · secret-finisher
secret-finisher promises no discovery route by its row answer
Applies to the secret-finisher row.
Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the default answer: secret-finisher promises no identity or availability before the attempt. Accidental discovery and memorable content do not violate this answer; secrecy beyond that promise is outside the contract.
Test steps and diagnostics
- Given
secret-finisherbefore an attempt in every situation atcombat.final-round-range- When
- an observer examines every player-facing presentation before the attempt
- Then
- no presentation promises the action's identity or availability before the attempt
- accidental discovery and memorable authored content do not fail this answer
- Diagnostics
secret-finisher-secret-finisher-observer-resultsecret-finisher-presentation-trace
discovery-none-default
Row.id promises no discovery route by the default answer
Does not apply to secret-finisher: action discovery default is looks usable, not none.
action-permission-remains-cited · secret-finisher
secret-finisher uses its cited ordinary permission
Applies to the secret-finisher row.
Ordinary permission for secret-finisher stays at combat.secret-finisher. This contract grants none and does not make an unavailable action succeed. Where the cited rule admits no unavailable state, this test checks nothing about an unavailable attempt. The test restates nothing from the cited action rule.
Test steps and diagnostics
- Given
the action at
combat.secret-finisherin an ordinarily permitted state and, where the cited action rule admits one, an ordinarily unavailable state in a covered situation- When
- the player attempts the action in each state
- Then
- ordinary permission is read from
combat.secret-finisher - this contract grants no permission
- where an unavailable state exists, the unavailable attempt does not succeed because of any discovery route, availability presentation, or shared-input selection; where none exists, this test checks nothing about an unavailable attempt
- ordinary permission is read from
- Diagnostics
secret-finisher-permission-trace
presentation-applies-on-covered-platforms
Row.id applies on its covered platform scope
Does not apply to secret-finisher: availability-presentations has no rows.
listed-action-presentations-agree
action presentations agree with the cited action cases
Applies to secret-finisher.
Audit class: observer-judged. An observer, not the running game, judges this. Every player-facing presentation of a covered action agrees with that action case's Fixed action citation and never presents it as another covered action. For a presentation outside the stated scope, this test checks nothing.
Test steps and diagnostics
- Scope
every player-facing prompt, explanation, control reminder, and availability presentation
- Holds
each presentation of an action case agrees with its Fixed action citation and never presents one covered action as another; for a player-facing presentation outside this scope, this test checks nothing
- Diagnostics
secret-finisher-observer-resultsecret-finisher-presentation-trace
remapped-prompt-updates-override
Row.id prompts update after a binding change by its row answer
Does not apply to secret-finisher: no row in action-cases matches discoverability current binding is shown.
remapped-prompt-updates-default
Row.id prompts update after a binding change by the default answer
Does not apply to secret-finisher: action discovery default is looks usable, not current binding is shown.
unavailable-hidden-override
Row.id is hidden while unavailable by its row answer
Does not apply to secret-finisher: no row in action-cases matches when-unavailable hidden.
unavailable-hidden-default
Row.id is hidden while unavailable by the default answer
Does not apply to secret-finisher: no row in action-cases matches when-unavailable use game default.
unavailable-shown-override
Row.id stays identifiable and distinctly unavailable by its row answer
Does not apply to secret-finisher: no row in action-cases matches when-unavailable shown unavailable.
unavailable-shown-default
Row.id stays identifiable and distinctly unavailable by the default answer
Does not apply to secret-finisher: unavailable action default is hidden, not shown unavailable.
unavailable-reason-override
Row.id names its current block by its row answer
Does not apply to secret-finisher: no row in action-cases matches when-unavailable reason is shown.
unavailable-reason-default
Row.id names its current block by the default answer
Does not apply to secret-finisher: unavailable action default is hidden, not reason is shown.
unavailable-unchanged-override · secret-finisher
secret-finisher looks identical across availability states by its row answer
Applies to the secret-finisher row.
Audit class: observer-judged. An observer, not the running game, judges this. The row overrides the default answer: any player-facing presentation of secret-finisher that exists is identical while available and unavailable. If none exists, this test checks nothing.
Test steps and diagnostics
- Given
any player-facing presentation of
secret-finisherthat exists once the action is available and once it is unavailable in the same covered situation- When
- an observer compares the two states
- Then
- where a player-facing presentation exists, it is identical across the available and unavailable states; where none exists, this test checks nothing
- Diagnostics
secret-finisher-secret-finisher-observer-resultsecret-finisher-presentation-trace
unavailable-unchanged-default
Row.id looks identical across availability states by the default answer
Does not apply to secret-finisher: unavailable action default is hidden, not unchanged.
unavailable-never-override
Row.id has no reachable unavailable state by its row answer
Does not apply to secret-finisher: no row in action-cases matches when-unavailable never unavailable.
unavailable-never-default
Row.id has no reachable unavailable state by the default answer
Does not apply to secret-finisher: unavailable action default is hidden, not never unavailable.
action-channel-announces
Row.id presents its channel form through Bind channel phrase alone
Does not apply to secret-finisher: availability-presentations has no rows.
shared-input-stays-one
one action input stays one signal with its candidates
Applies to secret-finisher.
Where the adoption or its cited control rules name an action input, one action input is consumed once with all its candidates; where none is named, this test checks nothing. With exactly one candidate at the accepted moment, that candidate is offered and no shared-input-cases row is needed, as the contract says. With no candidate or with several candidates, this test checks nothing about the offered candidate.
Test steps and diagnostics
- Given
one action input carrying its candidate actions at an accepted moment, where the adoption or its cited control rules name an action input; where they name none, this test checks nothing
- When
- the candidate set is read
- Then
- the action input is consumed once with all its candidates and is never split into several inputs
- when exactly one candidate remains, that candidate is offered and no shared-input-cases row is needed, as the contract says
- when no candidate remains or several candidates remain, this test checks nothing about the offered candidate
- Diagnostics
secret-finisher-candidate-setsecret-finisher-offered-action
shared-input-rule-selects-one
Row.id offers one rule-selected candidate
Does not apply to secret-finisher: shared-input-cases has no rows.
shared-input-player-selects-one
Row.id offers one player-selected candidate
Does not apply to secret-finisher: shared-input-cases has no rows.
buffered-shared-input-reads-accepted-situation
Row.id reads a buffered shared input in its accepted situation
Does not apply to secret-finisher: shared-input-cases has no rows.
presentation-refreshes-after-change
availability and offered-action presentations refresh after relevant changes
Applies to secret-finisher.
Where an availability or offered-action presentation exists, the game recomputes it from the current situation and the matching declarations after a change in availability, situation, platform, binding, or candidate eligibility. A previous prompt or selection stays current only when the cited rules still select it. Without a presentation, this test checks nothing. For a kind of change that the adoption cannot construct, this test checks nothing about that kind of change.
Test steps and diagnostics
- Given
where the adoption has a live availability or offered-action presentation, that presentation followed separately by a change in availability, situation, platform, binding, or candidate eligibility; where it has none, this test checks nothing
- When
- each change takes effect
- Then
- the presentation is recomputed from the current situation and the matching declarations
- the previous prompt or selection remains current only when the cited rules still select it
- for a kind of change that the adoption cannot construct, this test checks nothing
- Diagnostics
secret-finisher-refresh-logsecret-finisher-prompt-bindingssecret-finisher-offered-action
action-legibility-authority-order
action legibility keeps the order of its steps
Applies to secret-finisher.
The contract reads situation, row defaults, ordinary permission, discovery, unavailable presentation, candidate set, shared-input selection at the accepted moment with its offered-action presentation, one action proposal, current-device binding, and refresh in that order. For a part that this adoption does not exercise, this test checks nothing.
Test steps and diagnostics
- Given
a covered action input and situation that exercise every applicable part of the
secret-finisheradoption- When
- the game handles the action input
- Then
- the game reads situation, row defaults, ordinary permission, discovery, unavailable presentation, candidate set, shared-input selection at the accepted moment with its offered-action presentation, one action proposal, current-device binding, and refresh in that order
- for a part that the adoption does not exercise, this test checks nothing
- Diagnostics
secret-finisher-presentation-tracesecret-finisher-candidate-setsecret-finisher-offered-actionsecret-finisher-refresh-log
legibility-boundaries
the adoption makes no promise beyond action legibility
Applies to secret-finisher.
The adoption makes no promise about physical controls, input timing help, displayed game facts, or event order. A route that highlights without naming an action or explaining how to attempt it is not a discovery answer. A control layout the game's Fixed rules do not make a cited situation is not a situation of this contract.
Test steps and diagnostics
- Given
the
secret-finisheradoption and features outside its declared answers and rows- When
- the adoption's promise boundary is reviewed
- Then
- the adoption makes no promise about physical controls
- the adoption makes no promise about input timing help
- the adoption makes no promise about displayed game facts
- the adoption makes no promise about event order
- a route that highlights without naming an action or explaining how to attempt it is not a discovery answer
- a control layout the game's Fixed rules do not make a cited situation is not a situation of this contract
- Diagnostics
secret-finisher-declaration-record
effective-answers-have-legal-presentation-shape · secret-finisher
declaration check: secret-finisher has the presentation shape its effective answers require
Applies to the secret-finisher row.
This declaration check reads the adoption, not the running game. The action-cases description supplies all three duties. Resolve secret-finisher's effective answers from its row and the default answers. For every platform the case covers, every effective discovery answer except none requires an applicable presentation row; none requires no presentation row; and none cannot pair with reason-is-shown. This test checks nothing about a duty that does not apply to the effective answers. Any other shape makes the adoption invalid, and this test fails.
Test steps and diagnostics
- Given
the
secret-finisheradoption, its two default answers, and action casesecret-finisher, not the running game- When
- a reviewer resolves the row's effective discovery and unavailable answers
- Then
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
secret-finisher, as the action-cases description requires; under none, this test checks nothing about this requirement - when the effective discovery answer is none, no availability-presentations row names
secret-finisher, as the action-cases description requires; under another answer, this test checks nothing about this requirement - the effective answers are never none together with reason-is-shown, as the action-cases description requires
- a missing row, forbidden row, or forbidden effective pair makes the adoption invalid, and this test fails
- when the effective discovery answer is not none, then for each platform the case covers, at least one availability-presentations row that applies on that platform names
- Diagnostics
secret-finisher-declaration-record
presentation-action-case-join
declaration check: Row.id names an action case in this adoption
Does not apply to secret-finisher: availability-presentations has no rows.
shared-input-completeness
declaration check: Row.id lists every candidate and always selects one
Does not apply to secret-finisher: shared-input-cases has no rows.
multi-candidate-input-has-one-row
declaration check: every multi-candidate input has exactly one matching row
Applies to secret-finisher.
This declaration check reads the adoption and its cited prose, not the running game. Every situation where one action input has several candidates must have exactly one matching shared-input-cases row. For an input with at most one candidate, this test checks nothing. A missing or duplicate match makes the adoption invalid, and this test fails.
Test steps and diagnostics
- Given
the
secret-finisheradoption and every cited situation where one action input can have several candidates, not the running game- When
- a reviewer matches shared-input-cases rows to those situations and inputs
- Then
- each action input with several candidates has exactly one matching shared-input-cases row
- an input with at most one candidate needs no row, and this test checks nothing about such an input
- a missing or duplicate match makes the adoption invalid, and this test fails
- Diagnostics
secret-finisher-declaration-record
rows-do-not-repeat-or-overlap
declaration check: presentation pairs do not repeat and action cases do not overlap
Applies to secret-finisher.
This declaration check reads the adoption and its cited prose, not the running game. The availability-presentations description forbids a repeated action-case and channel pair, and the action-cases description forbids two cases for the same action in overlapping situations. The contract sets no maximum row count. A repetition or overlap makes the adoption invalid, and this test fails.
Test steps and diagnostics
- Given
the
secret-finisheradoption and its cited prose, not the running game- When
- a reviewer compares every presentation-row pair and every pair of action cases
- Then
- no two availability-presentations rows repeat one action-case and channel pair
- no two action-cases rows cover the same action in overlapping situations
- the contract imposes no maximum row count
- a repeated pair or overlapping action case makes the adoption invalid, and this test fails
- Diagnostics
secret-finisher-declaration-record
action-citation-duty · secret-finisher
declaration check: secret-finisher's action citation states its duty
Applies to the secret-finisher row.
This declaration check reads the adoption and combat.secret-finisher, not the running game. The citation must name secret-finisher's action, ordinary permission, and complete effect. 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
secret-finisheradoption andcombat.secret-finisher, not the running game- When
- a reviewer checks the citation's meaning
- Then
combat.secret-finishernames the action, its ordinary permission, and its complete effect- a missing duty makes the adoption invalid, and this test fails
- Diagnostics
secret-finisher-declaration-record
action-situation-citation-duty · secret-finisher
declaration check: secret-finisher's situation citation states its duty
Applies to the secret-finisher row.
This declaration check reads the adoption and combat.final-round-range, not the running game. The citation must name every covered play situation and the nearest similar excluded situations for secret-finisher. 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
secret-finisheradoption andcombat.final-round-range, not the running game- When
- a reviewer checks the citation's meaning
- Then
combat.final-round-rangenames every play situation covered bysecret-finisherand the nearest similar situations excluded from it- a missing duty makes the adoption invalid, and this test fails
- Diagnostics
secret-finisher-declaration-record
action-presentation-citation-duty · secret-finisher
declaration check: secret-finisher's presentation citation states its duty
Applies to the secret-finisher row.
This declaration check reads the adoption and combat.secret-finisher-has-no-discovery-route, not the running game. The citation must state every discovery route and unavailable state for secret-finisher, including an explicit no-route statement where applicable. 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
secret-finisheradoption andcombat.secret-finisher-has-no-discovery-route, not the running game- When
- a reviewer checks the citation's meaning
- Then
combat.secret-finisher-has-no-discovery-routestates every discovery route and unavailable state forsecret-finisher, including an explicit statement when no route exists- a missing duty makes the adoption invalid, and this test fails
- Diagnostics
secret-finisher-declaration-record
presentation-platform-citation-duty
declaration check: Row.id's platform citation states its duty
Does not apply to secret-finisher: availability-presentations has no rows.
channel-rule-citation-duty
declaration check: Row.id's channel citation states its duty
Does not apply to secret-finisher: availability-presentations has no rows.
shared-situation-citation-duty
declaration check: the situation citation of Row.id states its duty
Does not apply to secret-finisher: shared-input-cases has no rows.
shared-actions-citation-duty
declaration check: the candidate citation of Row.id states its duty
Does not apply to secret-finisher: shared-input-cases has no rows.
shared-action-input-citation-duty
declaration check: the action-input citation of Row.id states its duty
Does not apply to secret-finisher: shared-input-cases has no rows.
shared-selection-citation-duty
declaration check: the selection citation of Row.id states its duty
Does not apply to secret-finisher: shared-input-cases has no rows.
shared-presentation-citation-duty
declaration check: the presentation citation of Row.id states its duty
Does not apply to secret-finisher: shared-input-cases has no rows.
legibility-holds
action legibility holds for the whole run
Applies to secret-finisher.
Across every covered situation of the audited run on every covered platform, every available covered action meets its effective discovery promise; every unavailable covered action meets its effective unavailable answer; every channel distinguishes the states it promises; every shared input offers exactly one action before the attempt; and no prompt names an old binding as current. For a case that the adoption cannot construct, this test checks nothing.
Test steps and diagnostics
- Holds
every available covered action met its effective discovery promise; every unavailable covered action met its effective unavailable answer; every availability-presentation channel distinguished the states it promises; every shared input offered exactly one action before the attempt; no prompt named an old binding as current; for a case that the adoption cannot construct, this test checks nothing
- Seeds
["audit-a","audit-b"]- Scope
every covered situation of the audited run on every covered platform- Diagnostics
secret-finisher-observer-resultsecret-finisher-presentation-tracesecret-finisher-prompt-bindingssecret-finisher-candidate-setsecret-finisher-offered-actionsecret-finisher-refresh-log
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": "action-legibility",
"version": 2,
"summary": "This contract covers which actions players can discover in each situation, how availability is presented, and what an unavailable action shows. It also covers which action is offered when one control signal has several candidate actions. This contract does not cover physical controls, input timing help, displayed game facts, or event order. The Control options contract covers physical controls, the Input forgiveness contract covers input timing help, the Fact list contract covers displayed game facts, and the Event resolution contract covers event order.",
"questions": {
"action-discovery-default": {
"asks": "By default, how can players discover an action in a situation where the action applies?",
"rationale": "Different actions may need different help. This answer is the default answer. An action case can choose another answer in its own row.",
"when": {
"row-count": {
"action-cases": "non-empty"
}
},
"otherwise": "With no action case, this adoption makes no default discovery promise.",
"options": {
"looks-usable": {
"meaning": "The action looks possible before it is tried. A platformer marks a climbable ledge with a clear edge shape.",
"semantics": "At least one player-facing presentation identifies that the action can be attempted in the current situation before the attempt."
},
"explanation-on-demand": {
"meaning": "An explanation of the action is available in a situation where the action applies. The explanation names the action and says how to attempt it. An adventure game can show 'Open: needs the brass key' beside a sealed door.",
"semantics": "A player-facing route available in the current situation names the action and explains how to attempt it."
},
"current-binding-is-shown": {
"meaning": "The action prompt shows its current control. A racing game updates the pit-stop prompt after confirm moves to another button.",
"semantics": "Every prompt for the action names the current device's actual control under the applicable control rule. A wrong-device glyph, an old binding, or a hardware glyph in place of the actual touch region or gesture fails this promise."
},
"assistive-tech-can-name-it": {
"meaning": "Assistive technology can name the action and its purpose. A strategy game's screen reader identifies the end-turn control.",
"semantics": "A player-facing interface element exposes a determinable action name and role to supported assistive technology."
},
"none": {
"meaning": "The game gives no discovery route for the action. A fighting game leaves a secret finisher for players to uncover outside ordinary prompts.",
"semantics": "No player-facing presentation promises the action's identity or availability before it is attempted; accidental discovery and memorable authored content do not violate this answer."
}
}
},
"unavailable-action-default": {
"asks": "By default, what appears when an action cannot be used?",
"rationale": "A missing prompt, a dimmed control, and an explanation create different expectations. This answer is the default answer.",
"when": {
"row-count": {
"action-cases": "non-empty"
}
},
"otherwise": "With no action case, this adoption makes no default unavailable-action promise.",
"options": {
"hidden": {
"meaning": "The action disappears while unavailable. A racing boost prompt vanishes while the boost meter is empty.",
"semantics": "The action's availability presentation is absent while the action cannot be attempted."
},
"shown-unavailable": {
"meaning": "The action stays visible but clearly unavailable. A card game dims a card that cannot be played this turn.",
"semantics": "The presentation keeps the action identifiable and carries a distinct unavailable state without promising a reason."
},
"reason-is-shown": {
"meaning": "The action stays visible and states why it is unavailable. A survival recipe says that two pieces of wood are missing.",
"semantics": "The presentation identifies the action, marks it unavailable, and states the current blocking reason."
},
"unchanged": {
"meaning": "The action looks the same whether or not it can be used. A mystery game's bookcase gives no hint that its hidden passage is locked.",
"semantics": "The action's player-facing presentation is identical across its available and unavailable states."
},
"never-unavailable": {
"meaning": "The action can always be used in the situations that its action case covers, so the game never shows it as unavailable. A rhythm game's pause action works at every playable moment of every song.",
"semantics": "No reachable state in a covered situation makes the action unavailable."
}
}
}
},
"declares": {
"values": {},
"rows": {
"action-cases": {
"description": "Actions in the situations where their discovery and unavailable presentation are promised. The effective answer of a case is its own answer, or the default answer when the row says use-game-default. When the effective discovery answer is not none, the case has at least one availability-presentations row on each platform that it covers. When the effective discovery answer is none, the case has no availability-presentations row. No case has the effective discovery answer none together with the effective unavailable answer reason-is-shown. No two cases cover the same action in overlapping situations.",
"when-empty": "No action receives a legibility promise from this adoption.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A short name for this case in your game's words, such as open-door-nearby or jump-at-gap."
},
"action-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules name the action, its ordinary permission, and its complete effect."
},
"situation-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules name every play situation that this case covers. The same rules also name the nearest similar situations that this case does not cover."
},
"discoverability": {
"type": "string",
"required": true,
"options": [
"use-game-default",
"looks-usable",
"explanation-on-demand",
"current-binding-is-shown",
"assistive-tech-can-name-it",
"none"
],
"description": "The minimum discovery promise for this action case. Use the default answer, or choose another answer for this row. A secret arcade command may state that no discovery route exists."
},
"when-unavailable": {
"type": "string",
"required": true,
"options": [
"use-game-default",
"hidden",
"shown-unavailable",
"reason-is-shown",
"unchanged",
"never-unavailable"
],
"description": "What the player-facing presentation does while the action cannot be used. Use the default answer, or choose another answer for this row. A crafting action may remain visible with its missing material named."
},
"presentation-rule-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules state every player-facing discovery route and every unavailable state of this case. When no route exists, the rules say so explicitly."
}
}
},
"availability-presentations": {
"description": "Independent channels that present one action case's availability. No two rows repeat one action case and channel pair.",
"when-empty": "No action case promises a player-facing availability channel.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A short name in your game's words for one action case and one channel, such as jump-at-gap-shape."
},
"action-case": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"description": "The id of the action-cases row of this adoption presented through this channel."
},
"channel": {
"type": "string",
"required": true,
"options": [
"text",
"icon",
"shape",
"outline-or-contrast",
"audio-cue",
"spatial-audio",
"narration",
"audio-description",
"haptic"
],
"description": "The independent presentation channel. Text and icons can name or depict an action; shape, contrast, sound, position, speech, description, and touch can distinguish availability under their cited rules."
},
"platform-declared-in": {
"type": "citation",
"description": "Where your game's rules name the platform on which this presentation applies. When this field is absent, the presentation applies on every platform that the action case covers."
},
"channel-rule-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules state the form of this channel in the available state and in the unavailable state. For a case whose effective unavailable answer is never-unavailable or unchanged, the rules state the available form alone. The rules also state whether the channel identifies the action. A channel is judged by an observer who meets that channel alone."
}
}
},
"shared-input-cases": {
"description": "Situations where one action input can offer several actions and one choice must be made visible.",
"when-empty": "No action input offers several actions in one situation.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A short name for the situation in your game's words, such as porch-interactions."
},
"situation-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules name the situation in which several actions share one action input."
},
"actions-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules list the candidate actions and the conditions that make each candidate eligible."
},
"action-input": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"description": "The name of the one action input that carries these candidates, such as porch-interact."
},
"action-input-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's control rules name this shared input and the physical activation that produces it."
},
"selection": {
"type": "string",
"required": true,
"options": [
"rule-selects-one",
"player-selects-one"
],
"description": "Whether the cited rule selects one candidate by ordering or a situation test, or the player chooses before the attempt. A village interact may prefer talking over picking up an item."
},
"selection-rule-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules select exactly one offered action and decide every reachable tie."
},
"presentation-rule-declared-in": {
"type": "citation",
"required": true,
"description": "Where your game's rules say how the selected action is identified to the player before the shared input becomes an action attempt."
}
}
}
}
},
"rules": {
"secret-default-cannot-explain-a-block": {
"forbid": {
"all": [
{
"flag": {
"action-discovery-default": [
"none"
]
}
},
{
"flag": {
"unavailable-action-default": [
"reason-is-shown"
]
}
}
]
},
"message": "A secret action cannot use a default answer that names it and explains why it is blocked."
}
},
"origin": "https://opengdd.org/contracts/action-legibility-2",
"mechanism": [
"This text decides the order of the steps for action discovery, availability presentation, and shared-input selection. The questions and rows supply choices and cited game rules. They do not change the order.",
"An **action input** is one signal that the game receives. Control options declares it when that contract is adopted; otherwise it comes from the game's Fixed control rule. Control options owns how bindings emit it; this contract consumes one action input and the candidate actions it carries. The current binding comes from the same optional source. An **action case** is one action in one cited situation. A **candidate** is an action carried by the input whose optional binding context holds and whose Fixed permission rule — or a forgiveness acceptance from Input forgiveness — accepts it in the situation at the accepted moment. Forgiveness applies to each candidate separately. The forgiveness rows of a candidate action read the shared input as the input of that action. When forgiveness shifts the acceptance for one candidate, the accepted moment that this contract reads shifts with it. An action is **offered** when it is identified to the player as the result of selection.",
"1. Read the current situation and every matching action case — action cases are platform-neutral — then every presentation row whose optional platform citation applies on the current platform. When no action case matches, this adoption makes no legibility promise.",
"2. Resolve each row's effective discovery and unavailable answers. A row value other than `use-game-default` applies. Otherwise the answer to the matching question applies.",
"3. Read ordinary action permission from the cited Fixed action rule. This contract does not grant permission and does not make an unavailable action succeed.",
"4. While an action is available, apply its effective discovery promise through the matching presentation rows. Under `none`, no discovery route is promised.",
"5. While an action is unavailable, apply its effective unavailable answer. Hidden removes its presentation. Shown-unavailable keeps identity and marks the state. Reason-is-shown also names the current block. Unchanged exposes no availability difference. Never-unavailable admits no unavailable state in the cited situation.",
"6. Read the one action input and all of its candidate actions. This contract consumes one input carrying its candidates; it never splits one input into several.",
"7. When the action input has at most one candidate at the accepted moment, that candidate is offered and no shared-input-cases row is needed. A physical input may differ by platform without changing this step.",
"8. When the action input has several candidates, exactly one matching `shared-input-cases` row applies. Under `rule-selects-one`, its cited rule uses its declared ordering or situation test. Under `player-selects-one`, an explicit choice is required. The row consumes one input with N candidates and offers exactly one. Present that offered action under the row's cited presentation rule before the accepted input becomes an action attempt. Other candidates may remain visible, but none is presented as what will happen now. While an input waits in a buffer, this presentation does not promise which candidate will be offered. The promise applies from the accepted moment.",
"9. First, the physical input occurs. Then Control options, when adopted, emits the action input. Then Input forgiveness, when adopted, may shift the accepted moment. Then this contract 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. Event resolution owns ordering, refusal, and effects after the proposal.",
"10. Whenever a presentation shows the current binding, it shows the actual current device control, including the touch region or gesture on a touch platform.",
"11. When availability, situation, platform, binding, or candidate eligibility changes, recompute the presentation from step 1. A previous prompt or selection does not remain current unless the cited rules still select it.",
"The order of the steps is: situation, row defaults, ordinary permission, discovery, unavailable presentation, candidate set, shared-input selection at the accepted moment with its offered-action presentation, one action proposal, current-device binding, and refresh."
],
"pack": "sha256:e8bc008156a44034a292f2641015b40a9840cd8afb0e08e4405009d0e3f362b4",
"answers": {
"action-discovery-default": "looks-usable",
"unavailable-action-default": "hidden"
},
"values": {},
"rows": {
"action-cases": [
{
"id": "secret-finisher",
"action-declared-in": "combat.secret-finisher",
"situation-declared-in": "combat.final-round-range",
"discoverability": "none",
"when-unavailable": "unchanged",
"presentation-rule-declared-in": "combat.secret-finisher-has-no-discovery-route"
}
],
"availability-presentations": [],
"shared-input-cases": []
}
}