Party RPG with a tactical view
party-rpg-with-a-tactical-view · an adoption of Camera framing, version 1
Use in your game
Opens the authoring tool with these answers and settings already filled in. You still add your game's own rules and tuning.
What is in the ZIP
The ZIP holds the adoption and its acceptance tests. In the authoring tool, choose Add contract and pick this ZIP. If you keep your design as files, put them in contracts/.
The contract behind it
Covers the views used during play and what each one keeps visible. It records fixed, follow, and free-camera modes, manual panning, view size, travel limits, safe areas, clearance, camera activities, and failure handling. Camera feel, physical input mappings, unit commands, HUD layout, and 3D occlusion stay elsewhere.
Questions
The supplied answer is marked on each question. Pick other answers to see what changes. Nothing is saved here: the ZIP and the authoring tool use the supplied answers.
In normal play, must these cameras keep anything from your game on screen?
Why this is asked
A follow target or camera travel limit does not prove that game content remains visible. This choice states whether these cameras make that promise.
Numbersno numbers
This contract has no numbers to set.
Rulesno rules
A rule is a check between the numbers. Validation reports a rule that fails.
This contract has no rules between its numbers.
Lists3 lists
Each list holds the rows this adoption supplies. A list can be empty.
Cameras
cameras
| Id | Active when | View declared in | Follow mode | Follow target declared in | Manual pan | Pan actions declared in | Recenter action declared in | Travel limit | Travel limit declared in | View size | View size rule declared in | Failure response | Failure handling declared in |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
combat-follow-camera | party.combat-view-active | presentation.combat-play-view | locked-follow | party.active-party-centroid | — | — | — | one-world-region | combat.current-arena-region | fixed-size | — | change-world-to-restore-frame | party.tether-or-defeat-to-restore-frame |
tactical-camera | party.tactical-view-active | presentation.tactical-play-view | free-view | — | edge-scroll | controls.tactical-edge-pan-action | — | changes-by-situation | battle.tactical-regions | player-held-zoom | controls.tactical-zoom-actions-and-range | show-framing-failure | presentation.tactical-framing-warning |
Coverage promises
coverage-promises
| Id | Camera id | Subject | Applies when | Coverage | Reference point | Visibility area | Safe area declared in | Margin declared in |
|---|---|---|---|---|---|---|---|---|
active-party | combat-follow-camera | party.active-heroes | party.combat-control-active | whole-extent | — | rendered-view | — | presentation.party-view-margin |
selected-group | tactical-camera | battle.selected-unit-group | battle.selection-can-receive-commands | whole-extent | — | hud-safe-area | presentation.tactical-safe-area | presentation.selected-group-margin |
Camera activities
camera-activities
| Id | Camera id | Activity kind | Applies when | Extent declared in | Actions declared in | Promises | Promise effect |
|---|---|---|---|---|---|---|---|
hero-sprint-look-ahead | combat-follow-camera | look-ahead | party.leader-sprinting | party.sprint-look-ahead-lead | — | — | keeps-promise |
hero-hit-shake | combat-follow-camera | shake | combat.heavy-hit-shake | combat.heavy-hit-shake-strength | — | — | may-suspend |
boss-approach-punch-in | combat-follow-camera | temporary-zoom | combat.boss-approach-punch-in | combat.punch-in-zoom-extent | — | — | keeps-promise |
leader-aim-peek | combat-follow-camera | aim-or-peek-offset | party.leader-aiming | party.aim-peek-reach | controls.leader-aim-actions | — | keeps-promise |
tactical-edge-pan | tactical-camera | manual-pan | battle.edge-pan-moving-view | — | — | — | keeps-promise |
tactical-held-zoom | tactical-camera | player-zoom | battle.zoom-level-held | — | — | — | keeps-promise |
battlefield-reveal | tactical-camera | scripted-move | battle.reinforcement-reveal | battle.reveal-move-path | — | — | may-suspend |
Test inputsscope and seeds
Some tests need a scope or seeds from the adoption before they can run.
This adoption supplies none; every test uses its defaults.
Acceptance tests77 tests apply
The contract comes with 51 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.
framing-vocabulary-is-observable
the framing vocabulary is observed at the displayed result
Applies to party-rpg-with-a-tactical-view.
This test fixes two observable meanings. A displayed play moment is the final play image after every listed camera change, scaling, and HUD composition. Any overlap makes two screen areas one play region.
Test steps and diagnostics
- Given
a trace of camera settlement and displayed output for
party-rpg-with-a-tactical-view- When
- displayed play moments and play regions are classified
- Then
- each displayed play moment is the final play image after follow motion, manual pan, aim or peek offset, player-held zoom, shake, temporary zoom, scripted movement, viewport scaling, and HUD composition
- two play regions are treated as one region whenever their screen areas overlap at all
- Diagnostics
party-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-candidate-trace
declared-content-framing-outcomes-are-observable
valid frames and framing failures are observable
Applies to party-rpg-with-a-tactical-view.
For declared content, a valid frame satisfies every applicable unsuspended coverage row at its settled margin. A framing failure exists only after every allowed position and size has failed.
Test steps and diagnostics
- Given
a trace of composed views and failure settlement for
party-rpg-with-a-tactical-view- When
- valid frames and framing failures are classified
- Then
- a frame is valid exactly when every applicable unsuspended coverage row fits at its settled margin
- a framing failure is recorded only when no position and view size allowed by the camera can produce a valid frame
- Diagnostics
party-rpg-with-a-tactical-view-failure-record
camera-supplies-region-while-active · combat-follow-camera
combat-follow-camera supplies its region exactly while active
Applies to the combat-follow-camera row.
Camera combat-follow-camera supplies exactly the play region cited at presentation.combat-play-view, and only while the rule cited at party.combat-view-active holds. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
camera row
combat-follow-cameraand the rules cited atparty.combat-view-activeandpresentation.combat-play-view- When
- the active-camera trace crosses both edges of the rule cited at
party.combat-view-active
- the active-camera trace crosses both edges of the rule cited at
- Then
combat-follow-camerasupplies exactly the play region cited atpresentation.combat-play-viewwhileparty.combat-view-activeholdscombat-follow-camerasupplies no play region whileparty.combat-view-activedoes not hold
- Diagnostics
party-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-displayed-frame-log
camera-supplies-region-while-active · tactical-camera
tactical-camera supplies its region exactly while active
Applies to the tactical-camera row.
Camera tactical-camera supplies exactly the play region cited at presentation.tactical-play-view, and only while the rule cited at party.tactical-view-active holds. The test names both addresses and restates nothing from them.
Test steps and diagnostics
- Given
camera row
tactical-cameraand the rules cited atparty.tactical-view-activeandpresentation.tactical-play-view- When
- the active-camera trace crosses both edges of the rule cited at
party.tactical-view-active
- the active-camera trace crosses both edges of the rule cited at
- Then
tactical-camerasupplies exactly the play region cited atpresentation.tactical-play-viewwhileparty.tactical-view-activeholdstactical-camerasupplies no play region whileparty.tactical-view-activedoes not hold
- Diagnostics
party-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-displayed-frame-log
active-regions-are-exclusive
active cameras occupy exclusive play regions
Applies to party-rpg-with-a-tactical-view.
At most one camera is active in one play region. Overlap is the whole test; how two areas are composited is outside this contract. No pair settles independently unless its play regions are distinct, and each distinct camera's settlement and promise results remain independent. Where the adoption can activate no pair, there is no pair behavior to assert.
Test steps and diagnostics
- Given
every pair of cameras that
party-rpg-with-a-tactical-viewcan activate at the same displayed play moment; an adoption with no such pair asserts only the no-pair result- When
- their play regions are compared after display scaling
- Then
- no pair is active where the two screen areas overlap at all; a violating pair is a defect this test fails by construction
- no pair settles independently unless its play regions are distinct; where they are distinct, each camera's base position, settled view size, suspensions, and promise results are recorded per camera and no value of one is a function of the other's
- an adoption that can activate no pair has no simultaneous-region settlement to assert
- Diagnostics
party-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-play-region-mapparty-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-settled-margin-recordparty-rpg-with-a-tactical-view-suspension-log
promise-applies-exactly-when-cited · active-party
active-party applies exactly when its cited rule holds
Applies to the active-party row.
Promise active-party on combat-follow-camera applies exactly while the rule cited at party.combat-control-active holds. Outside that interval it is not tested and cannot create a framing failure. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
coverage-promises row
active-partyforcombat-follow-camera- When
- the trace crosses both edges of the rule cited at
party.combat-control-active
- the trace crosses both edges of the rule cited at
- Then
active-partyenters the applicable promise set exactly whileparty.combat-control-activeholds- outside that interval
active-partyis not tested and cannot create a framing failure
- Diagnostics
party-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-failure-record
promise-applies-exactly-when-cited · selected-group
selected-group applies exactly when its cited rule holds
Applies to the selected-group row.
Promise selected-group on tactical-camera applies exactly while the rule cited at battle.selection-can-receive-commands holds. Outside that interval it is not tested and cannot create a framing failure. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
coverage-promises row
selected-groupfortactical-camera- When
- the trace crosses both edges of the rule cited at
battle.selection-can-receive-commands
- the trace crosses both edges of the rule cited at
- Then
selected-groupenters the applicable promise set exactly whilebattle.selection-can-receive-commandsholds- outside that interval
selected-groupis not tested and cannot create a framing failure
- Diagnostics
party-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-failure-record
whole-extent-stays-visible · active-party
the whole extent of active-party remains inside its visibility area
Applies to the active-party row.
The whole extent of active-party, the subject named at party.active-heroes, remains inside this row's own visibility area at its settled margin on every displayed play moment where the promise is applicable and unsuspended, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept. For a set-valued subject, the whole extent is the union of its members' displayed extents. The suspension log shows whether each moment tested this row or left it untested.
Test steps and diagnostics
- Holds
on every displayed play moment when
active-partyis applicable and unsuspended, the complete displayed extent of the subject named atparty.active-heroesremains inside this row's visibility area at its settled margin, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept; when the subject is set-valued, that complete extent is the union of its members' displayed extents; the suspension log shows whether each moment tested this row or left it untested- Seeds
["camera-route-a","camera-route-b"]- Scope
all supported play routes and camera transitions covered by the row's cited conditions- Diagnostics
party-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-suspension-logactive-party-displayed-extent
whole-extent-stays-visible · selected-group
the whole extent of selected-group remains inside its visibility area
Applies to the selected-group row.
The whole extent of selected-group, the subject named at battle.selected-unit-group, remains inside this row's own visibility area at its settled margin on every displayed play moment where the promise is applicable and unsuspended, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept. For a set-valued subject, the whole extent is the union of its members' displayed extents. The suspension log shows whether each moment tested this row or left it untested.
Test steps and diagnostics
- Holds
on every displayed play moment when
selected-groupis applicable and unsuspended, the complete displayed extent of the subject named atbattle.selected-unit-groupremains inside this row's visibility area at its settled margin, except on a displayed play moment that has entered failure settlement, where this row is recorded as failed rather than kept; when the subject is set-valued, that complete extent is the union of its members' displayed extents; the suspension log shows whether each moment tested this row or left it untested- Seeds
["camera-route-a","camera-route-b"]- Scope
all supported play routes and camera transitions covered by the row's cited conditions- Diagnostics
party-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-suspension-logselected-group-displayed-extent
reference-point-stays-visible
the declared point for Row.id remains inside its visibility area
Does not apply to party-rpg-with-a-tactical-view: no row in coverage-promises matches coverage reference point.
rendered-view-defines-visibility-area · active-party
active-party uses the rendered play region
Applies to the active-party row.
Promise active-party uses the final rendered play region supplied by combat-follow-camera as its visibility area. HUD overlap alone is ignored for this row.
Test steps and diagnostics
- Given
applicable unsuspended promise
active-partyafter display scaling and HUD composition- When
- its visibility area is constructed
- Then
- the visibility area is the final rendered play region supplied by
combat-follow-camera - HUD overlap alone removes no space from this visibility area
- the visibility area is the final rendered play region supplied by
- Diagnostics
party-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-hud-composition-log
hud-safe-area-defines-visibility-area · selected-group
selected-group uses its cited HUD-safe area
Applies to the selected-group row.
Promise selected-group uses the final unobscured shape cited at presentation.tactical-safe-area after scaling and the HUD placement named by its conditions. HUD-covered space is outside it. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
applicable unsuspended promise
selected-groupafter display scaling and the HUD placement named by its conditions- When
- its visibility area is constructed
- Then
- the visibility area is the final unobscured shape cited at
presentation.tactical-safe-area - HUD-covered space is outside that visibility area
- the visibility area is the final unobscured shape cited at
- Diagnostics
party-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-hud-composition-log
margin-insets-the-visibility-area · active-party
active-party insets its visibility area by four margins
Applies to the active-party row.
The four clearances with units cited at presentation.party-view-margin inset active-party's visibility area. A subject or reference point exactly on the inset boundary fits. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
promise
active-party, its visibility area, and the four clearances with units cited atpresentation.party-view-margin- When
- the margin is inset
- Then
- the top, right, bottom, and left clearances from
presentation.party-view-margininset the visibility area - a subject or reference point exactly on the boundary of the inset area fits
- the top, right, bottom, and left clearances from
- Diagnostics
party-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-settled-margin-record
margin-insets-the-visibility-area · selected-group
selected-group insets its visibility area by four margins
Applies to the selected-group row.
The four clearances with units cited at presentation.selected-group-margin inset selected-group's visibility area. A subject or reference point exactly on the inset boundary fits. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
promise
selected-group, its visibility area, and the four clearances with units cited atpresentation.selected-group-margin- When
- the margin is inset
- Then
- the top, right, bottom, and left clearances from
presentation.selected-group-margininset the visibility area - a subject or reference point exactly on the boundary of the inset area fits
- the top, right, bottom, and left clearances from
- Diagnostics
party-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-settled-margin-record
activity-selects-affected-promises · hero-sprint-look-ahead
hero-sprint-look-ahead affects exactly its selected promises
Applies to the hero-sprint-look-ahead row.
Activity hero-sprint-look-ahead affects exactly the applicable promises selected for combat-follow-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on combat-follow-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
hero-sprint-look-aheadoncombat-follow-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
combat-follow-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
combat-follow-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
activity-selects-affected-promises · hero-hit-shake
hero-hit-shake affects exactly its selected promises
Applies to the hero-hit-shake row.
Activity hero-hit-shake affects exactly the applicable promises selected for combat-follow-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on combat-follow-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
hero-hit-shakeoncombat-follow-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
combat-follow-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
combat-follow-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
activity-selects-affected-promises · boss-approach-punch-in
boss-approach-punch-in affects exactly its selected promises
Applies to the boss-approach-punch-in row.
Activity boss-approach-punch-in affects exactly the applicable promises selected for combat-follow-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on combat-follow-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
boss-approach-punch-inoncombat-follow-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
combat-follow-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
combat-follow-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
activity-selects-affected-promises · leader-aim-peek
leader-aim-peek affects exactly its selected promises
Applies to the leader-aim-peek row.
Activity leader-aim-peek affects exactly the applicable promises selected for combat-follow-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on combat-follow-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
leader-aim-peekoncombat-follow-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
combat-follow-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
combat-follow-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
activity-selects-affected-promises · tactical-edge-pan
tactical-edge-pan affects exactly its selected promises
Applies to the tactical-edge-pan row.
Activity tactical-edge-pan affects exactly the applicable promises selected for tactical-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on tactical-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
tactical-edge-panontactical-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
tactical-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
tactical-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
activity-selects-affected-promises · tactical-held-zoom
tactical-held-zoom affects exactly its selected promises
Applies to the tactical-held-zoom row.
Activity tactical-held-zoom affects exactly the applicable promises selected for tactical-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on tactical-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
tactical-held-zoomontactical-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
tactical-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
tactical-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
activity-selects-affected-promises · battlefield-reveal
battlefield-reveal affects exactly its selected promises
Applies to the battlefield-reveal row.
Activity battlefield-reveal affects exactly the applicable promises selected for tactical-camera. Where this row cites a promises list, that fixed list is exact; where it cites none, every applicable promise on tactical-camera is affected. The test names no list contents and restates nothing from the citation.
Test steps and diagnostics
- Given
active activity row
battlefield-revealontactical-camera, the fixed promise list this row cites in its promises field, when it has one, and every applicable promise on that camera- When
- the activity's affected set is built
- Then
- where this row cites a promises list, the affected promises are exactly the ones it names
- where it cites no promises list, the affected set is every applicable promise on
tactical-camera - the affected-promise-set record names each promise the citation lists, or every applicable promise on
tactical-camerawhen the row cites none - the selection record distinguishes an unaffected promise from an affected promise that happened not to change
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-affected-promise-set
may-suspend-releases-and-restores-promises · hero-hit-shake
hero-hit-shake suspends only its affected promises
Applies to the hero-hit-shake row.
Activity hero-hit-shake releases only its affected promises, and only during the interval cited at combat.heavy-hit-shake. A suspended promise is not tested and cannot create a framing failure. It holds again on the first displayed play moment after its last affecting suspension ends. The log distinguishes an untested promise from one that happened to fit. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
activity
hero-hit-shakeand its affected applicable promises- When
- the interval cited at
combat.heavy-hit-shakebegins and then the last suspending activity affecting each promise ends
- the interval cited at
- Then
- only the affected set is suspended during
hero-hit-shake's active interval - each suspended promise is not tested and cannot create a framing failure during that interval
- each promise is required again on the first displayed play moment after its last affecting suspension ends
- the suspension log distinguishes a promise that was not tested from one that happened to fit
- only the affected set is suspended during
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-failure-record
may-suspend-releases-and-restores-promises · battlefield-reveal
battlefield-reveal suspends only its affected promises
Applies to the battlefield-reveal row.
Activity battlefield-reveal releases only its affected promises, and only during the interval cited at battle.reinforcement-reveal. A suspended promise is not tested and cannot create a framing failure. It holds again on the first displayed play moment after its last affecting suspension ends. The log distinguishes an untested promise from one that happened to fit. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
activity
battlefield-revealand its affected applicable promises- When
- the interval cited at
battle.reinforcement-revealbegins and then the last suspending activity affecting each promise ends
- the interval cited at
- Then
- only the affected set is suspended during
battlefield-reveal's active interval - each suspended promise is not tested and cannot create a framing failure during that interval
- each promise is required again on the first displayed play moment after its last affecting suspension ends
- the suspension log distinguishes a promise that was not tested from one that happened to fit
- only the affected set is suspended during
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-failure-record
keeps-promise-preserves-other-suspensions · hero-sprint-look-ahead
hero-sprint-look-ahead keeps its promise without cancelling another suspension
Applies to the hero-sprint-look-ahead row.
Activity hero-sprint-look-ahead supplies no suspension of its own. If another active activity suspends the same promise, hero-sprint-look-ahead does not cancel it; where this adoption cannot construct that overlap, the overlap clause asserts nothing. The interval comes from party.leader-sprinting, whose content this test does not restate.
Test steps and diagnostics
- Given
active keeps-promise activity
hero-sprint-look-aheadand each overlap with another active suspending activity on the same promise thatparty-rpg-with-a-tactical-viewcan construct; where no overlap can be constructed, the overlap clause asserts nothing- When
- the final promise set is tested during
hero-sprint-look-ahead's interval cited atparty.leader-sprinting
- the final promise set is tested during
- Then
hero-sprint-look-aheadsupplies no suspension of its own- a different active suspension affecting the same promise remains active until its own interval ends
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-activity-log
keeps-promise-preserves-other-suspensions · boss-approach-punch-in
boss-approach-punch-in keeps its promise without cancelling another suspension
Applies to the boss-approach-punch-in row.
Activity boss-approach-punch-in supplies no suspension of its own. If another active activity suspends the same promise, boss-approach-punch-in does not cancel it; where this adoption cannot construct that overlap, the overlap clause asserts nothing. The interval comes from combat.boss-approach-punch-in, whose content this test does not restate.
Test steps and diagnostics
- Given
active keeps-promise activity
boss-approach-punch-inand each overlap with another active suspending activity on the same promise thatparty-rpg-with-a-tactical-viewcan construct; where no overlap can be constructed, the overlap clause asserts nothing- When
- the final promise set is tested during
boss-approach-punch-in's interval cited atcombat.boss-approach-punch-in
- the final promise set is tested during
- Then
boss-approach-punch-insupplies no suspension of its own- a different active suspension affecting the same promise remains active until its own interval ends
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-activity-log
keeps-promise-preserves-other-suspensions · leader-aim-peek
leader-aim-peek keeps its promise without cancelling another suspension
Applies to the leader-aim-peek row.
Activity leader-aim-peek supplies no suspension of its own. If another active activity suspends the same promise, leader-aim-peek does not cancel it; where this adoption cannot construct that overlap, the overlap clause asserts nothing. The interval comes from party.leader-aiming, whose content this test does not restate.
Test steps and diagnostics
- Given
active keeps-promise activity
leader-aim-peekand each overlap with another active suspending activity on the same promise thatparty-rpg-with-a-tactical-viewcan construct; where no overlap can be constructed, the overlap clause asserts nothing- When
- the final promise set is tested during
leader-aim-peek's interval cited atparty.leader-aiming
- the final promise set is tested during
- Then
leader-aim-peeksupplies no suspension of its own- a different active suspension affecting the same promise remains active until its own interval ends
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-activity-log
keeps-promise-preserves-other-suspensions · tactical-edge-pan
tactical-edge-pan keeps its promise without cancelling another suspension
Applies to the tactical-edge-pan row.
Activity tactical-edge-pan supplies no suspension of its own. If another active activity suspends the same promise, tactical-edge-pan does not cancel it; where this adoption cannot construct that overlap, the overlap clause asserts nothing. The interval comes from battle.edge-pan-moving-view, whose content this test does not restate.
Test steps and diagnostics
- Given
active keeps-promise activity
tactical-edge-panand each overlap with another active suspending activity on the same promise thatparty-rpg-with-a-tactical-viewcan construct; where no overlap can be constructed, the overlap clause asserts nothing- When
- the final promise set is tested during
tactical-edge-pan's interval cited atbattle.edge-pan-moving-view
- the final promise set is tested during
- Then
tactical-edge-pansupplies no suspension of its own- a different active suspension affecting the same promise remains active until its own interval ends
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-activity-log
keeps-promise-preserves-other-suspensions · tactical-held-zoom
tactical-held-zoom keeps its promise without cancelling another suspension
Applies to the tactical-held-zoom row.
Activity tactical-held-zoom supplies no suspension of its own. If another active activity suspends the same promise, tactical-held-zoom does not cancel it; where this adoption cannot construct that overlap, the overlap clause asserts nothing. The interval comes from battle.zoom-level-held, whose content this test does not restate.
Test steps and diagnostics
- Given
active keeps-promise activity
tactical-held-zoomand each overlap with another active suspending activity on the same promise thatparty-rpg-with-a-tactical-viewcan construct; where no overlap can be constructed, the overlap clause asserts nothing- When
- the final promise set is tested during
tactical-held-zoom's interval cited atbattle.zoom-level-held
- the final promise set is tested during
- Then
tactical-held-zoomsupplies no suspension of its own- a different active suspension affecting the same promise remains active until its own interval ends
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-activity-log
recenter-manual-pan-defines-suspension-interval
suspending manual pan uses the recentered interval
Does not apply to party-rpg-with-a-tactical-view: no row in camera-activities matches promise-effect may suspend and activity-kind manual pan.
controller-disposes-of-kept-player-proposals · leader-aim-peek
the controller disposes of kept player proposals
Applies to the leader-aim-peek row.
For keeps-promise activity leader-aim-peek, the controller stops, redirects, or resizes a player proposal before an affected promise fails. The player proposes and the controller disposes; the proposal never owns the displayed result.
Test steps and diagnostics
- Given
each proposal this adoption can construct for
leader-aim-peek- When
- the proposal would make an affected promise fail
- Then
- the controller stops, redirects, or resizes the proposed view before the affected promise fails
- the player proposes and the controller disposes; the player's proposal never owns the displayed result
- Diagnostics
party-rpg-with-a-tactical-view-player-proposal-logparty-rpg-with-a-tactical-view-controller-disposal-logparty-rpg-with-a-tactical-view-displayed-frame-log
controller-disposes-of-kept-player-proposals · tactical-edge-pan
the controller disposes of kept player proposals
Applies to the tactical-edge-pan row.
For keeps-promise activity tactical-edge-pan, the controller stops, redirects, or resizes a player proposal before an affected promise fails. The player proposes and the controller disposes; the proposal never owns the displayed result.
Test steps and diagnostics
- Given
each proposal this adoption can construct for
tactical-edge-pan- When
- the proposal would make an affected promise fail
- Then
- the controller stops, redirects, or resizes the proposed view before the affected promise fails
- the player proposes and the controller disposes; the player's proposal never owns the displayed result
- Diagnostics
party-rpg-with-a-tactical-view-player-proposal-logparty-rpg-with-a-tactical-view-controller-disposal-logparty-rpg-with-a-tactical-view-displayed-frame-log
camera-without-activity-uses-base-alone
a camera without an activity builds from its base alone
Applies to party-rpg-with-a-tactical-view.
For each active camera and moment with no active camera-activities row, the candidate is built from the settled base position alone and has no activity offset. If this adoption has no such moment, the test asserts nothing.
Test steps and diagnostics
- Given
each active camera and displayed play moment for which
party-rpg-with-a-tactical-viewhas no active camera-activities row; if every active camera has an activity, this test asserts nothing- When
- the candidate position is built
- Then
- the candidate has the settled base position and no activity offset
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-activity-log
fixed-view-uses-authored-base
Row.id uses only its authored base position
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches follow-mode fixed view.
locked-follow-uses-target-point · combat-follow-camera
combat-follow-camera follows only its cited target point
Applies to the combat-follow-camera row.
Locked-follow camera combat-follow-camera has only the target point cited at party.active-party-centroid in the set this follow mode supplies. That point becomes the base before the travel limit is applied. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active locked-follow camera
combat-follow-cameraand the target point cited atparty.active-party-centroid- When
- the base position is selected
- Then
- the set this follow mode supplies contains only that cited target point
- the selected base position is that point before the travel limit is applied
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-follow-target-trace
slack-follow-stays-in-allowed-set
Row.id stays in its cited slack set
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches follow-mode slack follow.
free-camera-starts-from-player-pan · tactical-camera
tactical-camera starts from its player pan proposal
Applies to the tactical-camera row.
Camera tactical-camera begins from an edge-scroll proposal through the actions cited at controls.tactical-edge-pan-action. Only those cited actions produce this camera's pan proposal. This says who initiates movement, not who owns the result: the controller still disposes of the displayed frame. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active free camera
tactical-camerareceiving an edge-scroll proposal through the actions cited atcontrols.tactical-edge-pan-action- When
- the mode selects its base proposal
- Then
- the mode begins from the player's proposed position
- the controller searches only positions supplied by this free-camera mode and still disposes of the displayed result
- only the game actions cited at
controls.tactical-edge-pan-actionproduce this camera's pan proposal
- Diagnostics
party-rpg-with-a-tactical-view-player-proposal-logparty-rpg-with-a-tactical-view-controller-disposal-logparty-rpg-with-a-tactical-view-candidate-trace
free-with-recenter-selects-target
Row.id returns to its cited target on recenter
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches follow-mode free with recenter.
no-travel-limit-does-not-clamp
Row.id applies no camera travel clamp
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches travel-limit no camera travel limit.
travel-limit-clamps-base-position · combat-follow-camera
combat-follow-camera clamps its base position to the cited region
Applies to the combat-follow-camera row.
Camera combat-follow-camera clamps its base position to the one camera-position region cited at combat.current-arena-region. The limit constrains camera position, not the visible region. A promise not tested by the final composed-view test is not recorded as kept. Its edge condition reduces only the clamped-side margin by the exact shortfall, never below zero, while the subject still stays inside the underlying area; the margin record distinguishes that thinning from an ordinary fit. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
camera
combat-follow-camera, base proposals inside and outside the one camera-position region cited atcombat.current-arena-region, and a subject near each region edge- When
- the travel limit is applied before activity offsets
- Then
- the base position is clamped to the one camera-position region
- the clamp constrains camera position, not the visible region
- a promise not tested by the final composed-view test is not recorded as kept
- where the clamp alone prevents the subject from meeting a margin, the clamped-side margin is reduced by the exact shortfall and no lower than zero, while the subject remains inside the underlying uninset visibility area
- the margin-settlement record distinguishes a thinned margin from a subject that merely fit inside the original inset
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-settled-margin-recordparty-rpg-with-a-tactical-view-visibility-area-trace
travel-limit-clamps-base-position · tactical-camera
tactical-camera clamps its base position to the cited region
Applies to the tactical-camera row.
Camera tactical-camera clamps its base position to the camera-position region currently selected by the rule cited at battle.tactical-regions. The limit constrains camera position, not the visible region. When the cited rule selects a different region, the base is clamped to the new region from that moment. A promise not tested by the final composed-view test is not recorded as kept. Its edge condition reduces only the clamped-side margin by the exact shortfall, never below zero, while the subject still stays inside the underlying area; the margin record distinguishes that thinning from an ordinary fit. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
camera
tactical-camera, base proposals inside and outside the camera-position region currently selected by the rule cited atbattle.tactical-regions, and a subject near each region edge- When
- the travel limit is applied before activity offsets; the situation changes so that the rule cited at
battle.tactical-regionsselects a different region, and the base is clamped to the new region from that moment
- the travel limit is applied before activity offsets; the situation changes so that the rule cited at
- Then
- the base position is clamped to the camera-position region currently selected by the rule
- the clamp constrains camera position, not the visible region
- a promise not tested by the final composed-view test is not recorded as kept
- where the clamp alone prevents the subject from meeting a margin, the clamped-side margin is reduced by the exact shortfall and no lower than zero, while the subject remains inside the underlying uninset visibility area
- the margin-settlement record distinguishes a thinned margin from a subject that merely fit inside the original inset
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-settled-margin-recordparty-rpg-with-a-tactical-view-visibility-area-trace
activity-offset-follows-settled-base · hero-sprint-look-ahead
hero-sprint-look-ahead applies its bounded change after the base settles
Applies to the hero-sprint-look-ahead row.
Activity hero-sprint-look-ahead applies after the base settles and is bounded by the strongest change cited at party.sprint-look-ahead-lead. A position-changing activity is an offset outside the set this follow mode supplies and can pass any travel limit the camera declares; the final test still decides every promise. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active activity
hero-sprint-look-aheadat its strongest displacement cited atparty.sprint-look-ahead-lead- When
- the candidate is built after the base position and travel clamp settle
- Then
- the activity change is bounded by
party.sprint-look-ahead-leadand is applied after the base settles - a position-changing activity is an activity offset outside the set this follow mode supplies and can carry the candidate past any travel limit the camera declares
- the offset never substitutes for the final composed-view test
- the activity change is bounded by
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-displayed-frame-log
activity-offset-follows-settled-base · hero-hit-shake
hero-hit-shake applies its bounded change after the base settles
Applies to the hero-hit-shake row.
Activity hero-hit-shake applies after the base settles and is bounded by the strongest change cited at combat.heavy-hit-shake-strength. A position-changing activity is an offset outside the set this follow mode supplies and can pass any travel limit the camera declares; the final test still decides every promise. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active activity
hero-hit-shakeat its strongest displacement cited atcombat.heavy-hit-shake-strength- When
- the candidate is built after the base position and travel clamp settle
- Then
- the activity change is bounded by
combat.heavy-hit-shake-strengthand is applied after the base settles - a position-changing activity is an activity offset outside the set this follow mode supplies and can carry the candidate past any travel limit the camera declares
- the offset never substitutes for the final composed-view test
- the activity change is bounded by
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-displayed-frame-log
activity-offset-follows-settled-base · leader-aim-peek
leader-aim-peek applies its bounded change after the base settles
Applies to the leader-aim-peek row.
Activity leader-aim-peek applies after the base settles and is bounded by the strongest change cited at party.aim-peek-reach. A position-changing activity is an offset outside the set this follow mode supplies and can pass any travel limit the camera declares; the final test still decides every promise. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active activity
leader-aim-peekat its strongest displacement cited atparty.aim-peek-reach- When
- the candidate is built after the base position and travel clamp settle
- Then
- the activity change is bounded by
party.aim-peek-reachand is applied after the base settles - a position-changing activity is an activity offset outside the set this follow mode supplies and can carry the candidate past any travel limit the camera declares
- the offset never substitutes for the final composed-view test
- the activity change is bounded by
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-displayed-frame-log
activity-offset-follows-settled-base · battlefield-reveal
battlefield-reveal applies its bounded change after the base settles
Applies to the battlefield-reveal row.
Activity battlefield-reveal applies after the base settles and is bounded by the strongest change cited at battle.reveal-move-path. A position-changing activity is an offset outside the set this follow mode supplies and can pass any travel limit the camera declares; the final test still decides every promise. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active activity
battlefield-revealat its strongest displacement cited atbattle.reveal-move-path- When
- the candidate is built after the base position and travel clamp settle
- Then
- the activity change is bounded by
battle.reveal-move-pathand is applied after the base settles - a position-changing activity is an activity offset outside the set this follow mode supplies and can carry the candidate past any travel limit the camera declares
- the offset never substitutes for the final composed-view test
- the activity change is bounded by
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-displayed-frame-log
temporary-zoom-settles-one-proposed-size · boss-approach-punch-in
boss-approach-punch-in proposes and settles one temporary view size
Applies to the boss-approach-punch-in row.
During the interval cited at combat.boss-approach-punch-in, temporary-zoom activity boss-approach-punch-in proposes the size cited at combat.punch-in-zoom-extent. The controller disposes of it with the row's promise effect and every unsuspended promise, and exactly one view size settles per displayed moment. While the proposal is accepted, the temporary size replaces whatever this camera's view-size answer would otherwise settle: the authored size, the held level, or the fit result. When the activity ends, that size returns on the next displayed moment.
Test steps and diagnostics
- Given
active temporary-zoom activity
boss-approach-punch-inoncombat-follow-cameraduring the interval cited atcombat.boss-approach-punch-in- When
- the activity proposes the size cited at
combat.punch-in-zoom-extentas a temporary view size
- the activity proposes the size cited at
- Then
- the controller disposes of the proposal under this row's promise effect and every unsuspended promise together
- exactly one view size settles per displayed moment
- while the proposal is accepted, the temporary size replaces the size this camera's view-size answer would otherwise settle: the authored size, the held level, or the fit result
- on the first displayed moment after the activity ends, the authored size, held level, or fit result settles again
- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-view-size-traceparty-rpg-with-a-tactical-view-controller-disposal-log
aim-offset-uses-cited-actions · leader-aim-peek
leader-aim-peek receives proposals through its cited aim actions
Applies to the leader-aim-peek row.
Aim-or-peek activity leader-aim-peek receives proposals only through the game actions cited at controls.leader-aim-actions. The controller still disposes of the displayed result. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
activity
leader-aim-peekand supported and unsupported game actions- When
- aim or peek proposals are collected
- Then
- only the game actions cited at
controls.leader-aim-actionsproduce this activity's proposal - the controller still disposes of the displayed result
- only the game actions cited at
- Diagnostics
party-rpg-with-a-tactical-view-player-proposal-logparty-rpg-with-a-tactical-view-controller-disposal-log
fixed-size-uses-authored-size · combat-follow-camera
combat-follow-camera uses its authored view size
Applies to the combat-follow-camera row.
Fixed-size camera combat-follow-camera uses the authored size named at presentation.combat-play-view. Only an active temporary-zoom activity can propose another temporary size. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active fixed-size camera
combat-follow-cameraacross ordinary activity and, where this adoption has such an activity, every active temporary-zoom activity it can construct- When
- view size settles
- Then
- without an active temporary-zoom activity the size is exactly the authored size named at
presentation.combat-play-view - only an active temporary-zoom activity can propose a different temporary size
- without an active temporary-zoom activity the size is exactly the authored size named at
- Diagnostics
party-rpg-with-a-tactical-view-view-size-traceparty-rpg-with-a-tactical-view-activity-log
player-held-zoom-starts-in-cited-range · tactical-camera
tactical-camera starts from held zoom inside its cited range
Applies to the tactical-camera row.
Player-held-zoom camera tactical-camera starts from the held level inside the range cited at controls.tactical-zoom-actions-and-range. Where this camera declares a player-zoom activity row, that row's promise effect decides keep or suspend; where it declares none, the controller must keep every applicable promise at every held level. Only the game actions cited at the same address change the held level. The controller disposes of the final size with all unsuspended promises. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
active player-held-zoom camera
tactical-camera, held levels at the ends and interior of the range cited atcontrols.tactical-zoom-actions-and-range, and each player-zoom activity row this camera declares, or the no-row default where it declares none- When
- view size settles with each applicable player-zoom activity row
- Then
- the proposal starts from the player's held level inside the cited range
- where this camera declares a player-zoom activity row, that row's promise effect decides keep or suspend; where it declares none, the controller must keep every applicable promise at every held level
- only the game actions cited at
controls.tactical-zoom-actions-and-rangechange the held level - the controller disposes of the final size together with every unsuspended promise
- Diagnostics
party-rpg-with-a-tactical-view-view-size-traceparty-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-controller-disposal-log
automatic-fit-chooses-largest-valid-size
Row.id chooses the largest allowed fitting size
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches view-size automatic fit.
automatic-fit-respects-travel-region
Row.id continues automatic fitting after its centre is clamped
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches view-size automatic fit and travel-limit one world region or changes by situation.
final-composed-test-decides-frame
the final composed-view test decides every promise
Applies to party-rpg-with-a-tactical-view.
After the final view and HUD are composed, every applicable unsuspended promise is tested against its inset visibility area. That result alone decides validity; no follow trigger, recenter action, travel limit, or earlier candidate substitutes for it. When every applicable unsuspended promise passes, that composed view is the displayed play moment. Exactly one view size settles per displayed play moment on each active camera, and the controller disposes of every size and position proposal under the activity permission and all unsuspended promises together.
Test steps and diagnostics
- Given
each candidate
party-rpg-with-a-tactical-viewcan construct, including candidates that pass an earlier follow, recenter, travel, or position check- When
- the final view and HUD are composed
- Then
- every applicable unsuspended promise is tested against its inset visibility area
- only this final test decides whether the frame is valid
- no follow trigger, recenter action, travel limit, or earlier candidate substitutes for the final test
- when every applicable unsuspended promise passes, that composed view is the displayed play moment
- exactly one view size settles for each displayed play moment on each active camera
- the controller disposes of every size and position proposal under the activity permission and all unsuspended promises together
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-displayed-frame-log
keeps-promise-holds-through-full-interval · hero-sprint-look-ahead
hero-sprint-look-ahead keeps every affected promise for its full interval
Applies to the hero-sprint-look-ahead row.
Activity hero-sprint-look-ahead is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at party.leader-sprinting, including the strongest displacement or size change cited at party.sprint-look-ahead-lead. The test names the addresses and restates nothing from them.
Test steps and diagnostics
- Holds
the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at
party.leader-sprinting, including the strongest displacement or size change cited atparty.sprint-look-ahead-lead- Seeds
["activity-route-a","activity-route-b"]- Scope
the full cited activity interval, including boundary moments and strongest legal proposals- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-trace
keeps-promise-holds-through-full-interval · boss-approach-punch-in
boss-approach-punch-in keeps every affected promise for its full interval
Applies to the boss-approach-punch-in row.
Activity boss-approach-punch-in is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at combat.boss-approach-punch-in, including the strongest displacement or size change cited at combat.punch-in-zoom-extent. The test names the addresses and restates nothing from them.
Test steps and diagnostics
- Holds
the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at
combat.boss-approach-punch-in, including the strongest displacement or size change cited atcombat.punch-in-zoom-extent- Seeds
["activity-route-a","activity-route-b"]- Scope
the full cited activity interval, including boundary moments and strongest legal proposals- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-trace
keeps-promise-holds-through-full-interval · leader-aim-peek
leader-aim-peek keeps every affected promise for its full interval
Applies to the leader-aim-peek row.
Activity leader-aim-peek is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at party.leader-aiming, including the strongest displacement or size change cited at party.aim-peek-reach. The test names the addresses and restates nothing from them.
Test steps and diagnostics
- Holds
the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at
party.leader-aiming, including the strongest displacement or size change cited atparty.aim-peek-reach- Seeds
["activity-route-a","activity-route-b"]- Scope
the full cited activity interval, including boundary moments and strongest legal proposals- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-trace
keeps-promise-holds-for-pan-and-zoom · tactical-edge-pan
tactical-edge-pan keeps every affected promise across its proposals
Applies to the tactical-edge-pan row.
Activity tactical-edge-pan is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at battle.edge-pan-moving-view, including every pan proposal bounded by the camera's travel limit and controller disposal. The test names the address and restates nothing from it.
Test steps and diagnostics
- Holds
the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at
battle.edge-pan-moving-view, including every pan proposal bounded by the camera's travel limit and controller disposal- Seeds
["activity-route-a","activity-route-b"]- Scope
the full cited activity interval, including boundary moments and strongest legal proposals- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-trace
keeps-promise-holds-for-pan-and-zoom · tactical-held-zoom
tactical-held-zoom keeps every affected promise across its proposals
Applies to the tactical-held-zoom row.
Activity tactical-held-zoom is demonstrated as keeps-promise only when the final test passes for every affected unsuspended promise on every displayed play moment in its interval at battle.zoom-level-held, including every held level inside the range its camera's view-size answer supplies. The test names the address and restates nothing from it.
Test steps and diagnostics
- Holds
the final composed-view test passes for every affected unsuspended promise on every displayed play moment in the interval cited at
battle.zoom-level-held, including every held level inside the range its camera's view-size answer supplies- Seeds
["activity-route-a","activity-route-b"]- Scope
the full cited activity interval, including boundary moments and strongest legal proposals- Diagnostics
party-rpg-with-a-tactical-view-activity-logparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-visibility-area-trace
failure-record-follows-exhausted-search · combat-follow-camera
combat-follow-camera creates one complete failure record after search
Applies to the combat-follow-camera row.
For camera combat-follow-camera, one complete framing failure is created only after no allowed candidate passes. It records the camera, failed promises, display size, visibility areas, settled margins, attempted position and size, travel limit, active activities, and selected response. Before that point, the response weakens no coverage row. If this adoption can construct no exhausted search, the failure branch asserts nothing.
Test steps and diagnostics
- Given
active camera
combat-follow-cameraand each situation the adoption can construct where every allowed candidate fails; where no such situation is reachable, the failure branch asserts nothing- When
- the allowed position and view-size search is exhausted
- Then
- exactly one framing failure is created only after no allowed candidate passes
- the record contains the camera id, failed promise ids, display size, visibility areas, settled margins, attempted position and view size, travel limit, active activities, and selected failure response
- before this step, the failure response weakens no coverage row
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-failure-recordparty-rpg-with-a-tactical-view-visibility-area-trace
failure-record-follows-exhausted-search · tactical-camera
tactical-camera creates one complete failure record after search
Applies to the tactical-camera row.
For camera tactical-camera, one complete framing failure is created only after no allowed candidate passes. It records the camera, failed promises, display size, visibility areas, settled margins, attempted position and size, travel limit, active activities, and selected response. Before that point, the response weakens no coverage row. If this adoption can construct no exhausted search, the failure branch asserts nothing.
Test steps and diagnostics
- Given
active camera
tactical-cameraand each situation the adoption can construct where every allowed candidate fails; where no such situation is reachable, the failure branch asserts nothing- When
- the allowed position and view-size search is exhausted
- Then
- exactly one framing failure is created only after no allowed candidate passes
- the record contains the camera id, failed promise ids, display size, visibility areas, settled margins, attempted position and view size, travel limit, active activities, and selected failure response
- before this step, the failure response weakens no coverage row
- Diagnostics
party-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-failure-recordparty-rpg-with-a-tactical-view-visibility-area-trace
hold-valid-frame-keeps-invalid-candidate-offscreen
Row.id holds a valid frame on failure
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches failure-response hold valid frame.
keep-priority-content-displays-best-allowed-frame
Row.id applies its total priority on failure
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches failure-response keep priority content.
show-framing-failure-adds-cited-state · tactical-camera
tactical-camera shows its cited framing-failure state
Applies to the tactical-camera row.
On a reached failure, tactical-camera displays the best allowed frame with the player-facing state cited at presentation.tactical-framing-warning. The test names the address and restates nothing from it.
Test steps and diagnostics
- Given
a reached framing failure for
tactical-camera- When
- the response at
presentation.tactical-framing-warningsettles
- the response at
- Then
- the best allowed frame is displayed
- the player-facing failure state cited at
presentation.tactical-framing-warningis present on that displayed result
- Diagnostics
party-rpg-with-a-tactical-view-failure-recordparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-player-facing-state-log
change-world-reruns-framing-before-display · combat-follow-camera
combat-follow-camera changes the world and reruns framing
Applies to the combat-follow-camera row.
On a reached failure, combat-follow-camera applies the tether, defeat, or move rule cited at party.tether-or-defeat-to-restore-frame, then reruns promise selection through the final composed-view test before another displayed play moment. The rule changes neither the active camera set nor the play-region set. The test fixes those consequences and restates nothing from the cited rule.
Test steps and diagnostics
- Given
a reached framing failure for
combat-follow-camera- When
- the game rule cited at
party.tether-or-defeat-to-restore-frameapplies its tether, defeat, or move
- the game rule cited at
- Then
- steps 2 through 10 rerun before another displayed play moment
- the active camera set is unchanged and no play region is created
- only the rerun result can produce a valid frame or another framing failure
- Diagnostics
party-rpg-with-a-tactical-view-failure-recordparty-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-displayed-frame-log
failure-unreachable-invalidates-reached-claim
Row.id treats a reached failure as an invalid claim
Does not apply to party-rpg-with-a-tactical-view: no row in cameras matches failure-response failure unreachable.
failure-persists-until-valid-or-inactive
a framing failure persists until settlement or deactivation
Applies to party-rpg-with-a-tactical-view.
Every reached framing failure persists until a later valid settlement or camera deactivation. Priority, a notice, or a started world change does not itself make an invalid frame satisfy a promise. If this adoption cannot reach failure, the template asserts nothing.
Test steps and diagnostics
- Given
each framing failure
party-rpg-with-a-tactical-viewcan reach; if none is reachable, this test asserts nothing- When
- priority is applied, a notice is shown, a world change starts, and later settlement or deactivation occurs as available
- Then
- the failure remains a failure until a later settlement produces a valid frame or the camera deactivates
- priority, a visible notice, or a started world change does not by itself turn an invalid frame into a kept promise
- Diagnostics
party-rpg-with-a-tactical-view-failure-recordparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-active-camera-trace
recovery-and-handover-insert-no-unchecked-frame
recovery and handover insert no unchecked frame
Applies to party-rpg-with-a-tactical-view.
Neither the end of a suspension nor a camera switch inserts an unchecked frame, and neither leaves two cameras active in one play region. An adoption in which no camera activation follows a deactivation has no handover case to construct.
Test steps and diagnostics
- Given
each suspension end and camera handover
party-rpg-with-a-tactical-viewcan construct; an adoption in which no camera activation follows a deactivation has no handover case to construct- When
- the next displayed play moment is prepared
- Then
- neither recovery nor switching inserts an unchecked frame or leaves two cameras active in one play region
- Diagnostics
party-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-displayed-frame-log
recovery-and-handover-first-frame-is-settled
recovery and handover settle a checked first frame
Applies to party-rpg-with-a-tactical-view.
After a suspension ends, the mechanism reruns promise selection through the final composed-view test before the next displayed play moment; that moment is valid or enters failure settlement. A handover runs active-region selection through the final composed-view test with the incoming camera's own promises and visibility areas. An adoption in which no camera activation follows a deactivation has no handover case to construct.
Test steps and diagnostics
- Given
each suspension end and camera handover
party-rpg-with-a-tactical-viewcan construct; an adoption in which no camera activation follows a deactivation has no handover case to construct- When
- the next displayed play moment is prepared
- Then
- after a suspension ends, steps 2 through 10 run and the first unsuspended moment is valid or enters steps 11 through 13
- at handover, steps 1 through 10 run with the incoming camera's own promise set and visibility areas
- Diagnostics
party-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-failure-record
camera-first-frame-is-checked · combat-follow-camera
combat-follow-camera checks its first frame after every activation
Applies to the combat-follow-camera row.
Whenever camera combat-follow-camera becomes active, whether at a handover or a reactivation, its first displayed play moment in the region cited at presentation.combat-play-view is tested against this camera's own applicable promises and visibility areas. It is valid or enters failure settlement under the failure response this camera declares.
Test steps and diagnostics
- Given
each activation of camera
combat-follow-camera, whether at a handover or a reactivation- When
- its first displayed play moment is prepared in the region cited at
presentation.combat-play-view
- its first displayed play moment is prepared in the region cited at
- Then
- the first displayed play moment is tested against this camera's own applicable promises and visibility areas
- that moment is valid or enters failure settlement under this camera's own
change-world-to-restore-frameanswer
- Diagnostics
party-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-failure-record
camera-first-frame-is-checked · tactical-camera
tactical-camera checks its first frame after every activation
Applies to the tactical-camera row.
Whenever camera tactical-camera becomes active, whether at a handover or a reactivation, its first displayed play moment in the region cited at presentation.tactical-play-view is tested against this camera's own applicable promises and visibility areas. It is valid or enters failure settlement under the failure response this camera declares.
Test steps and diagnostics
- Given
each activation of camera
tactical-camera, whether at a handover or a reactivation- When
- its first displayed play moment is prepared in the region cited at
presentation.tactical-play-view
- its first displayed play moment is prepared in the region cited at
- Then
- the first displayed play moment is tested against this camera's own applicable promises and visibility areas
- that moment is valid or enters failure settlement under this camera's own
show-framing-failureanswer
- Diagnostics
party-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-visibility-area-traceparty-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-failure-record
promise-camera-id-joins-one-camera · active-party
declaration check: active-party names exactly one camera in this adoption
Applies to the active-party row.
Declaration check: coverage promise active-party is legal only when combat-follow-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
coverage-promises row
active-partywith camera-idcombat-follow-camera- When
- the cameras rows are inspected
- Then
combat-follow-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
promise-camera-id-joins-one-camera · selected-group
declaration check: selected-group names exactly one camera in this adoption
Applies to the selected-group row.
Declaration check: coverage promise selected-group is legal only when tactical-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
coverage-promises row
selected-groupwith camera-idtactical-camera- When
- the cameras rows are inspected
- Then
tactical-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · hero-sprint-look-ahead
declaration check: hero-sprint-look-ahead names exactly one camera in this adoption
Applies to the hero-sprint-look-ahead row.
Declaration check: camera activity hero-sprint-look-ahead is legal only when combat-follow-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
hero-sprint-look-aheadwith camera-idcombat-follow-camera- When
- the cameras rows are inspected
- Then
combat-follow-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · hero-hit-shake
declaration check: hero-hit-shake names exactly one camera in this adoption
Applies to the hero-hit-shake row.
Declaration check: camera activity hero-hit-shake is legal only when combat-follow-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
hero-hit-shakewith camera-idcombat-follow-camera- When
- the cameras rows are inspected
- Then
combat-follow-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · boss-approach-punch-in
declaration check: boss-approach-punch-in names exactly one camera in this adoption
Applies to the boss-approach-punch-in row.
Declaration check: camera activity boss-approach-punch-in is legal only when combat-follow-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
boss-approach-punch-inwith camera-idcombat-follow-camera- When
- the cameras rows are inspected
- Then
combat-follow-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · leader-aim-peek
declaration check: leader-aim-peek names exactly one camera in this adoption
Applies to the leader-aim-peek row.
Declaration check: camera activity leader-aim-peek is legal only when combat-follow-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
leader-aim-peekwith camera-idcombat-follow-camera- When
- the cameras rows are inspected
- Then
combat-follow-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · tactical-edge-pan
declaration check: tactical-edge-pan names exactly one camera in this adoption
Applies to the tactical-edge-pan row.
Declaration check: camera activity tactical-edge-pan is legal only when tactical-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
tactical-edge-panwith camera-idtactical-camera- When
- the cameras rows are inspected
- Then
tactical-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · tactical-held-zoom
declaration check: tactical-held-zoom names exactly one camera in this adoption
Applies to the tactical-held-zoom row.
Declaration check: camera activity tactical-held-zoom is legal only when tactical-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
tactical-held-zoomwith camera-idtactical-camera- When
- the cameras rows are inspected
- Then
tactical-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-camera-id-joins-one-camera · battlefield-reveal
declaration check: battlefield-reveal names exactly one camera in this adoption
Applies to the battlefield-reveal row.
Declaration check: camera activity battlefield-reveal is legal only when tactical-camera names exactly one cameras row in this adoption. A missing or ambiguous name is a defect this test fails by construction. This check reads the adoption, not the running game; the validator cannot check this join, so the reviewer does.
Test steps and diagnostics
- Given
camera-activities row
battlefield-revealwith camera-idtactical-camera- When
- the cameras rows are inspected
- Then
tactical-cameranames exactly one cameras row in this adoption; a missing or ambiguous join is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · hero-sprint-look-ahead
declaration check: hero-sprint-look-ahead cites promises only from its own camera
Applies to the hero-sprint-look-ahead row.
Declaration check: where activity hero-sprint-look-ahead cites a promises list, every named promise must exist and belong to combat-follow-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
hero-sprint-look-aheadand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
combat-follow-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · hero-hit-shake
declaration check: hero-hit-shake cites promises only from its own camera
Applies to the hero-hit-shake row.
Declaration check: where activity hero-hit-shake cites a promises list, every named promise must exist and belong to combat-follow-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
hero-hit-shakeand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
combat-follow-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · boss-approach-punch-in
declaration check: boss-approach-punch-in cites promises only from its own camera
Applies to the boss-approach-punch-in row.
Declaration check: where activity boss-approach-punch-in cites a promises list, every named promise must exist and belong to combat-follow-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
boss-approach-punch-inand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
combat-follow-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · leader-aim-peek
declaration check: leader-aim-peek cites promises only from its own camera
Applies to the leader-aim-peek row.
Declaration check: where activity leader-aim-peek cites a promises list, every named promise must exist and belong to combat-follow-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
leader-aim-peekand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
combat-follow-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · tactical-edge-pan
declaration check: tactical-edge-pan cites promises only from its own camera
Applies to the tactical-edge-pan row.
Declaration check: where activity tactical-edge-pan cites a promises list, every named promise must exist and belong to tactical-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
tactical-edge-panand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
tactical-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · tactical-held-zoom
declaration check: tactical-held-zoom cites promises only from its own camera
Applies to the tactical-held-zoom row.
Declaration check: where activity tactical-held-zoom cites a promises list, every named promise must exist and belong to tactical-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
tactical-held-zoomand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
tactical-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
activity-promise-list-stays-on-camera · battlefield-reveal
declaration check: battlefield-reveal cites promises only from its own camera
Applies to the battlefield-reveal row.
Declaration check: where activity battlefield-reveal cites a promises list, every named promise must exist and belong to tactical-camera. A stale, missing, or foreign-camera name is a defect this test fails by construction. Where the row cites no list, this join test asserts nothing. This check reads the adoption, not the running game. The test names no list contents and restates nothing from its citation.
Test steps and diagnostics
- Given
camera-activities row
battlefield-revealand the fixed promise list this row cites in its promises field, when it has one; where it cites none, the list clause asserts nothing- When
- the named coverage-promises rows and their camera-id fields are inspected
- Then
- every named promise exists and has camera-id
tactical-camera; a missing promise or a promise on another camera is a defect this test fails by construction
- every named promise exists and has camera-id
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
adoption-declares-a-camera
declaration check: the adoption declares at least one camera
Applies to party-rpg-with-a-tactical-view.
Declaration check: a camera-framing adoption declares at least one cameras row. An adoption with none describes no play view and is a defect this test fails by construction. This check reads the adoption, not the running game.
Test steps and diagnostics
- Given
the cameras row set for
party-rpg-with-a-tactical-view- When
- the adoption is reviewed as a camera-framing adoption
- Then
- at least one cameras row exists; an adoption with none describes no play view and is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
declared-content-has-a-promise
declaration check: declared content includes at least one coverage promise
Applies to party-rpg-with-a-tactical-view.
Declaration check: an adoption answering declared-content declares at least one coverage-promises row. If it declares none, it has no visibility promise to test and fails this test by construction. This check reads the adoption, not the running game.
Test steps and diagnostics
- Given
party-rpg-with-a-tactical-viewanswering declared-content- When
- its coverage-promises rows are inspected
- Then
- at least one coverage-promises row exists; an adoption that answers declared-content and declares none has no promise to test and is a defect this test fails by construction
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
free-promise-camera-has-manual-pan-activity · tactical-camera
declaration check: a free promise-bearing camera declares manual-pan activity
Applies to the tactical-camera row.
Declaration check: where free camera tactical-camera carries a coverage promise, it declares at least one manual-pan activity row naming this camera. A missing row is a defect this test fails by construction. A free camera with no promise asserts nothing here. This check reads the adoption, not the running game.
Test steps and diagnostics
- Given
camera
tactical-camerawhere at least one coverage promise names it; where no promise names it, this test asserts nothing- When
- the camera-activities rows are inspected
- Then
- the promise-bearing free camera has at least one manual-pan activity row whose camera-id names
tactical-camera; a missing row is a defect this test fails by construction
- the promise-bearing free camera has at least one manual-pan activity row whose camera-id names
- Diagnostics
party-rpg-with-a-tactical-view-declaration-record
no-content-guarantee-keeps-promise-shape-empty
declaration check: no-content-guarantee declares no promise machinery
Does not apply to party-rpg-with-a-tactical-view: content visibility is declared content, not no content guarantee.
framing-holds
the framing authority order holds for the whole run
Applies to party-rpg-with-a-tactical-view.
Across sequences of displayed play moments across activations, activities, suspensions, handovers, and failures, every displayed play moment follows the mechanism's authority order. Later stages never rewrite an earlier declaration, no question answer or row field changes the settlement order, and no displayed moment is both invalid and outside failure settlement. An adoption answering no-content-guarantee audits only the active-region and displayed-moment stages. The adoption supplies the audit seeds through verification inputs.
Test steps and diagnostics
- Holds
every displayed play moment passes in order through active play region, applicable promise, each coverage row's visibility area and margin, activity suspension, player proposal and controller disposal, camera-position travel limit, allowed position and view-size settlement, final composed-view test, and failure response; later stages never rewrite an earlier declaration; no question answer or row field changes the order in which these stages settle; no displayed play moment is both invalid and outside steps 11 through 13; an adoption answering no-content-guarantee audits only the active-region and displayed-moment stages
- Seeds
["framing-audit-a","framing-audit-b"]- Scope
sequences of displayed play moments across activations, activities, suspensions, handovers, and failures- Diagnostics
party-rpg-with-a-tactical-view-displayed-frame-logparty-rpg-with-a-tactical-view-active-camera-traceparty-rpg-with-a-tactical-view-candidate-traceparty-rpg-with-a-tactical-view-suspension-logparty-rpg-with-a-tactical-view-failure-recordparty-rpg-with-a-tactical-view-first-authority-order-violation
JSONthe adoption as one file
The adoption file as supplied. Answers you try on this page are not written into it; to change an adoption, open it in the authoring tool.
{
"contract": "camera-framing",
"version": 1,
"summary": "Covers the views used during play and what each one keeps visible. It records fixed, follow, and free-camera modes, manual panning, view size, travel limits, safe areas, clearance, camera activities, and failure handling. Camera feel, physical input mappings, unit commands, HUD layout, and 3D occlusion stay elsewhere.",
"questions": {
"content-visibility": {
"asks": "In normal play, must these cameras keep anything from your game on screen?",
"rationale": "A follow target or camera travel limit does not prove that game content remains visible. This choice states whether these cameras make that promise.",
"options": {
"declared-content": {
"meaning": "The cameras keep named game content visible. A party view keeps every active hero on screen.",
"semantics": "Every visibility promise lives in a coverage-promises row and every effect on one lives in a camera-activities row; nothing outside those rows is promised."
},
"no-content-guarantee": {
"meaning": "The cameras make no promise about game content staying visible. An endless runner may leave the view during a fast fall.",
"semantics": "No visibility promise exists; the promise and activity row sets are declared empty."
}
}
}
},
"declares": {
"values": {},
"rows": {
"cameras": {
"description": "The play views in this camera family and the rules that move or limit each one.",
"when-empty": "An adoption without a camera row describes no play view, and a reviewer rejects it.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A stable camera name in game language, such as board-camera or tactical-view."
},
"active-when": {
"type": "citation",
"required": true,
"description": "The complete rule for when this camera supplies a displayed play view."
},
"view-declared-in": {
"type": "citation",
"required": true,
"description": "The rule naming this camera's final play region, aspect handling, and display sizes. For a fixed view it also names the authored base position; for a fixed size it also names the authored view size."
},
"follow-mode": {
"type": "string",
"required": true,
"options": [
"fixed-view",
"locked-follow",
"slack-follow",
"free-view",
"free-with-recenter"
],
"description": "A fixed room view's base position never moves or follows anything, and no input moves it; only a declared activity can offset it. Locked follow keeps a hero at the centre. Slack follow lets a runner move before the view follows. A free tactical view begins where the player moves it. A free map with recenter can return to a selected group."
},
"follow-target-declared-in": {
"type": "citation",
"when": {
"row": {
"follow-mode": [
"locked-follow",
"slack-follow",
"free-with-recenter"
]
}
},
"description": "The rule naming the followed target or the target used by recenter. For slack follow it also names the allowed positions around that target."
},
"manual-pan": {
"type": "string",
"when": {
"row": {
"follow-mode": [
"free-view",
"free-with-recenter"
]
}
},
"options": [
"edge-scroll",
"drag-view",
"move-view-actions",
"several-methods"
],
"description": "Edge scroll moves a strategy view at the screen edge. Drag view pulls a mission map. Move-view actions pan a tactics camera through mapped actions. Several methods gives a world map at least two of these."
},
"pan-actions-declared-in": {
"type": "citation",
"when": {
"row": {
"follow-mode": [
"free-view",
"free-with-recenter"
]
}
},
"description": "The game actions that pan this camera. Several methods names at least two methods; platform inputs stay with Control options."
},
"recenter-action-declared-in": {
"type": "citation",
"when": {
"row": {
"follow-mode": [
"free-with-recenter"
]
}
},
"description": "The game action that returns this view to its cited target."
},
"travel-limit": {
"type": "string",
"when": {
"row": {
"follow-mode": [
"locked-follow",
"slack-follow",
"free-view",
"free-with-recenter"
]
}
},
"options": [
"no-camera-travel-limit",
"one-world-region",
"changes-by-situation"
],
"description": "No limit lets a runner view keep moving. One region keeps a board view inside its room. Situation changes can give a tactical map different regions by mission phase. A fixed view travels nowhere and is not asked."
},
"travel-limit-declared-in": {
"type": "citation",
"when": {
"row": {
"travel-limit": [
"one-world-region",
"changes-by-situation"
]
}
},
"description": "The complete camera-position region and, when needed, the rule selecting the current region."
},
"view-size": {
"type": "string",
"required": true,
"options": [
"fixed-size",
"player-held-zoom",
"automatic-fit"
],
"description": "Fixed size keeps a runner at its authored view size. Player-held zoom lets a strategy player hold a chosen zoom level. Automatic fit widens a co-op view until the party and margins fit."
},
"view-size-rule-declared-in": {
"type": "citation",
"when": {
"row": {
"view-size": [
"player-held-zoom",
"automatic-fit"
]
}
},
"description": "For player-held zoom, the zoom actions and allowed range. For automatic fit, the allowed range, aspect response, update timing, and simultaneous-promise rule."
},
"failure-response": {
"type": "string",
"when": {
"flag": {
"content-visibility": [
"declared-content"
]
}
},
"options": [
"hold-valid-frame",
"keep-priority-content",
"show-framing-failure",
"change-world-to-restore-frame",
"failure-unreachable"
],
"description": "Hold valid frame leaves a puzzle transition on its last valid view. Keep priority content protects a tactics leader and records hidden allies as failed. Show framing failure adds a warning to a strategy view. Change world to restore frame applies a co-op tether or defeat rule. Failure unreachable cites why a fixed arena fits on every reachable display."
},
"failure-handling-declared-in": {
"type": "citation",
"when": {
"flag": {
"content-visibility": [
"declared-content"
]
}
},
"description": "The exact wait, priority, warning, or game rule used after failure, or the complete argument that failure cannot be reached."
}
}
},
"coverage-promises": {
"description": "The subjects or areas each camera keeps visible in named play situations.",
"when-empty": "No camera in this adoption promises to keep game content visible.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A stable promise name in game language, such as whole-board or selected-group."
},
"camera-id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"description": "The camera that keeps this promise, by the name you gave it."
},
"subject": {
"type": "citation",
"required": true,
"description": "The Fixed game prose naming the subject or area that stays visible."
},
"applies-when": {
"type": "citation",
"required": true,
"description": "The complete play conditions in which this promise applies."
},
"coverage": {
"type": "string",
"required": true,
"options": [
"whole-extent",
"reference-point"
],
"description": "Whole extent keeps every edge of a selected squad visible. Reference point keeps a runner's cited centre visible even when the sprite reaches past the view."
},
"reference-point": {
"type": "citation",
"when": {
"row": {
"coverage": [
"reference-point"
]
}
},
"description": "The exact point that stays visible."
},
"visibility-area": {
"type": "string",
"required": true,
"options": [
"rendered-view",
"hud-safe-area"
],
"description": "Rendered view measures a runner from the final view edges, so HUD overlap alone does not fail. HUD safe area measures a tactics objective from the cited unobscured area, so HUD-covered space counts outside."
},
"safe-area-declared-in": {
"type": "citation",
"when": {
"row": {
"visibility-area": [
"hud-safe-area"
]
}
},
"description": "The final unobscured rectangle or shape after the HUD elements named by this promise's conditions are placed."
},
"margin-declared-in": {
"type": "citation",
"required": true,
"description": "The top, right, bottom, and left clearance inside the chosen visibility area, with units. Zero is stated explicitly. A camera clamped at its travel limit may hold less than this clearance on the clamped side, but the subject still stays inside the area."
}
}
},
"camera-activities": {
"description": "Frame-changing situations and whether each one keeps or suspends all or named promises on its camera.",
"when-empty": "No camera activity has a visibility-promise effect in this adoption. With declared content, the promise-bearing cameras use none of the seven listed activities.",
"record": {
"id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"unique": true,
"description": "A stable activity name in game language, such as sprint-look-ahead or boss-hit-shake."
},
"camera-id": {
"type": "string",
"required": true,
"pattern": "kebab-case",
"description": "The camera this activity changes, by the name you gave it."
},
"activity-kind": {
"type": "string",
"required": true,
"options": [
"look-ahead",
"manual-pan",
"aim-or-peek-offset",
"player-zoom",
"shake",
"temporary-zoom",
"scripted-move"
],
"description": "Look-ahead leads a runner. Manual pan moves a tactical view. Aim or peek offsets a follow camera toward a target. Player zoom holds a strategy view at a chosen size. Shake offsets a boss hit. Temporary zoom changes a combat view's size. A scripted move frames a dialogue reveal."
},
"applies-when": {
"type": "citation",
"required": true,
"description": "The complete start and end conditions for this camera activity."
},
"extent-declared-in": {
"type": "citation",
"when": {
"row": {
"activity-kind": [
"look-ahead",
"aim-or-peek-offset",
"shake",
"temporary-zoom",
"scripted-move"
]
}
},
"description": "The rule naming this activity's strongest displacement or size change. Manual pan is bounded by the travel limit and controller instead; player zoom is bounded by the view-size citation."
},
"actions-declared-in": {
"type": "citation",
"when": {
"row": {
"activity-kind": [
"aim-or-peek-offset"
]
}
},
"description": "The game actions that produce this offset. Platform inputs stay with Control options."
},
"promises": {
"type": "citation",
"description": "The fixed list of promise names affected by this activity. When absent, the activity affects every promise on its camera."
},
"promise-effect": {
"type": "string",
"required": true,
"options": [
"keeps-promise",
"may-suspend"
],
"description": "Keeps promise preserves the affected rows, as when runner look-ahead stays inside its margin. May suspend allows those rows to fail only for this activity, as during a boss reveal."
}
}
}
}
},
"rules": {},
"origin": "https://opengdd.org/contracts/camera-framing-1",
"mechanism": [
"This is the single normative authority for each displayed play moment: which camera is active, what must remain visible, who moves the view, what may suspend a promise, how travel and view size are applied, what happens when content cannot fit, and when a suspended promise returns. Questions and rows supply choices and cited game rules; they do not define another order.",
"A **displayed play moment** is the final play image presented at one moment, after follow motion, manual pan, aim or peek offset, player-held zoom, shake, temporary zoom, scripted movement, viewport scaling, and HUD composition. A **play region** is the screen area named by `view-declared-in`; two regions are the same region whenever their screen areas overlap at all. A coverage row's **visibility area** is either the final rendered play region or that row's cited HUD-safe area. A **valid frame** satisfies every applicable, unsuspended coverage row at its settled margin. A **framing failure** exists only when no camera position and view size allowed by the camera can produce a valid frame.",
"### Select the view and promises",
"1. Read every camera whose `active-when` rule holds. Each active camera supplies the final play region named by `view-declared-in`. At most one camera may be active in one play region. Simultaneous split views settle independently only when their regions are distinct. 2. For each active camera, collect its coverage rows whose `applies-when` rules hold. `whole-extent` contributes the subject's complete displayed extent. For a set-valued subject, the whole extent is the union of its members' displayed extents. `reference-point` contributes only the cited point. 3. Construct each row's visibility area after display scaling and the HUD placement named by that row's conditions. HUD-covered space is outside a HUD-safe area; a rendered-view row deliberately ignores HUD overlap. Inset the area by the cited top, right, bottom, and left margin. Attach the one contract-supplied edge condition: a later travel clamp may reduce only the margin on its clamped side, never the underlying visibility area. A whole extent fits only when all of it lies inside the settled inset area. A reference point fits when that point lies inside it. A subject or point lying exactly on the boundary of the settled inset area fits.",
"### Apply activity permissions",
"4. Read every active activity row for the camera. Its `promises` citation, when present, selects the affected applicable promises; when absent, it selects every applicable promise on that camera. An active `may-suspend` row suspends only that set for its cited interval. Active `keeps-promise` rows do not cancel a different active suspension affecting the same promise. 5. A suspended promise is not tested and cannot create a framing failure. It becomes required again on the first displayed play moment after the last suspending activity affecting it ends. On a free-with-recenter camera, a suspending manual-pan interval begins when the view leaves its recentered state and ends on recenter or camera deactivation. 6. The player proposes motion and held zoom through the cited game actions; the camera controller disposes of the final frame. `free-view` and `free-with-recenter` name who initiates position changes, not who owns the displayed result. A `keeps-promise` manual-pan or aim-or-peek row therefore requires the controller to stop, redirect, or resize the proposed view before an affected promise fails.",
"### Build and test the frame",
"7. Build the candidate position in two stages. Stage one selects the base position inside the follow mode's set. A fixed view has only the base position named by `view-declared-in`. A locked follow has only its target point. A slack follow may use the allowed positions its citation names around the target. A free view starts from the player's proposal; a free-with-recenter view does the same until recenter selects its target point. The controller may search only within the set supplied by that mode. Apply any travel limit to the base position; a fixed view declares none. It constrains camera position, not the visible region, and it never proves that a subject is visible. Resolve the step-3 edge condition now: when this clamp alone prevents the subject from meeting a margin, reduce only the clamped-side margin by the exact shortfall, no lower than zero. The subject must still lie inside the underlying, uninset visibility area. Stage two applies each active position-changing activity as an offset to the settled base, bounded by its cited extent. An activity offset is outside the mode's search set and may carry the view past the travel limit; the final test in step 9 still decides every promise. 8. Settle view size once. `fixed-size` uses the size named by `view-declared-in`. `player-held-zoom` starts from the player's held level inside the cited range; its `player-zoom` activity row's effect decides whether the controller must keep every promise or may let the named ones suspend; with no such row, the controller must keep every applicable promise at every held level. `automatic-fit` applies the cited fit rule, choosing the largest allowed size at which the extent, the margins, the strongest cited displacement of every position-changing `keeps-promise` activity, and the largest cited size of every size-changing one fit together. On any view-size answer, an active temporary-zoom activity may propose its cited extent as a temporary size; an accepted temporary size replaces the size the answer would otherwise settle, for the activity's cited interval, and the authored size, held level, or fit result returns on the first displayed moment after it ends. The controller disposes of every proposal under the activity permission and all unsuspended promises together. The travel region still binds camera position only: if fitting needs a centre outside it, clamp the centre and continue fitting inside the allowed zoom range, even when the visible region extends beyond the travel region. If no allowed size and clamped position fits, step 11 applies. 9. Compose the final view and HUD, then test every unsuspended promise against its inset visibility area. This final test decides the outcome; a follow trigger, recenter action, camera travel limit, or earlier candidate frame never substitutes for it. 10. If every row passes, display the valid frame. A `keeps-promise` activity is demonstrated only when this final test passes on every displayed moment of its cited interval, including the strongest displacement or size change its extent citation names.",
"### Settle a framing failure and recovery",
"11. Only after no allowed candidate can pass, create one framing failure containing the camera id, failed promise ids, display size, visibility areas, settled margins, attempted position and view size, travel limit, active activities, and selected failure response. A failure response is not an ordinary precondition and cannot weaken a coverage row before this step. 12. `hold-valid-frame` does not display the invalid candidate. It keeps the last valid displayed frame or, before one exists, the cited non-play transition surface; the cited game rule decides whether play or a transition advances. `keep-priority-content` applies the cited total priority, displays the best allowed frame, and records each promise that did not fit. `show-framing-failure` displays the best allowed frame with its cited player-facing failure state. `change-world-to-restore-frame` applies the cited game rule to tether, defeat, or move content, then reruns steps 2–10 before another play moment is displayed; the cited rule may not change the active camera set or create a play region. `failure-unreachable` declares no runtime handling: reaching this step contradicts its cited argument and invalidates the design claim. 13. A failure remains a failure until a later settlement produces a valid frame or the camera deactivates. Priority, a visible notice, or starting a cited world change does not by itself turn an invalid frame into a kept promise. 14. When a suspension ends, run steps 2–10 before displaying the next play moment. The first displayed moment without an active suspension must be valid or must enter steps 11–13. At a camera handover, run steps 1–10: the incoming camera brings its own promise set and visibility areas, and its first frame follows this same first-valid-frame recovery path. Switching cannot insert an unchecked frame or leave two cameras active in one region.",
"The authority order is therefore: active play region, applicable promise, each coverage row's visibility area and margin, activity suspension, player proposal and controller disposal, camera-position travel limit, allowed position and view-size settlement, final composed-view test, failure response. Later stages never rewrite an earlier declaration."
],
"answers": {
"content-visibility": "declared-content"
},
"values": {},
"rows": {
"cameras": [
{
"id": "combat-follow-camera",
"active-when": "party.combat-view-active",
"view-declared-in": "presentation.combat-play-view",
"follow-mode": "locked-follow",
"follow-target-declared-in": "party.active-party-centroid",
"travel-limit": "one-world-region",
"travel-limit-declared-in": "combat.current-arena-region",
"view-size": "fixed-size",
"failure-response": "change-world-to-restore-frame",
"failure-handling-declared-in": "party.tether-or-defeat-to-restore-frame"
},
{
"id": "tactical-camera",
"active-when": "party.tactical-view-active",
"view-declared-in": "presentation.tactical-play-view",
"follow-mode": "free-view",
"manual-pan": "edge-scroll",
"pan-actions-declared-in": "controls.tactical-edge-pan-action",
"travel-limit": "changes-by-situation",
"travel-limit-declared-in": "battle.tactical-regions",
"view-size": "player-held-zoom",
"view-size-rule-declared-in": "controls.tactical-zoom-actions-and-range",
"failure-response": "show-framing-failure",
"failure-handling-declared-in": "presentation.tactical-framing-warning"
}
],
"coverage-promises": [
{
"id": "active-party",
"camera-id": "combat-follow-camera",
"subject": "party.active-heroes",
"applies-when": "party.combat-control-active",
"coverage": "whole-extent",
"visibility-area": "rendered-view",
"margin-declared-in": "presentation.party-view-margin"
},
{
"id": "selected-group",
"camera-id": "tactical-camera",
"subject": "battle.selected-unit-group",
"applies-when": "battle.selection-can-receive-commands",
"coverage": "whole-extent",
"visibility-area": "hud-safe-area",
"safe-area-declared-in": "presentation.tactical-safe-area",
"margin-declared-in": "presentation.selected-group-margin"
}
],
"camera-activities": [
{
"id": "hero-sprint-look-ahead",
"camera-id": "combat-follow-camera",
"activity-kind": "look-ahead",
"applies-when": "party.leader-sprinting",
"extent-declared-in": "party.sprint-look-ahead-lead",
"promise-effect": "keeps-promise"
},
{
"id": "hero-hit-shake",
"camera-id": "combat-follow-camera",
"activity-kind": "shake",
"applies-when": "combat.heavy-hit-shake",
"extent-declared-in": "combat.heavy-hit-shake-strength",
"promise-effect": "may-suspend"
},
{
"id": "boss-approach-punch-in",
"camera-id": "combat-follow-camera",
"activity-kind": "temporary-zoom",
"applies-when": "combat.boss-approach-punch-in",
"extent-declared-in": "combat.punch-in-zoom-extent",
"promise-effect": "keeps-promise"
},
{
"id": "leader-aim-peek",
"camera-id": "combat-follow-camera",
"activity-kind": "aim-or-peek-offset",
"applies-when": "party.leader-aiming",
"extent-declared-in": "party.aim-peek-reach",
"actions-declared-in": "controls.leader-aim-actions",
"promise-effect": "keeps-promise"
},
{
"id": "tactical-edge-pan",
"camera-id": "tactical-camera",
"activity-kind": "manual-pan",
"applies-when": "battle.edge-pan-moving-view",
"promise-effect": "keeps-promise"
},
{
"id": "tactical-held-zoom",
"camera-id": "tactical-camera",
"activity-kind": "player-zoom",
"applies-when": "battle.zoom-level-held",
"promise-effect": "keeps-promise"
},
{
"id": "battlefield-reveal",
"camera-id": "tactical-camera",
"activity-kind": "scripted-move",
"applies-when": "battle.reinforcement-reveal",
"extent-declared-in": "battle.reveal-move-path",
"promise-effect": "may-suspend"
}
]
},
"pack": "sha256:4caf436eee5950d06c4368a78c14f9c4bff965e124c8d84695700ba82e2e7129"
}