{
  "contract": "pointer-command",
  "version": 2,
  "summary": "This contract covers pointer gestures that select things in the world and issue commands to or at the world. It records direct world orders, chosen abilities and verbs, orders added to a queue, and cancellation. This contract does not cover physical bindings, the camera view, displayed information, pathfinding, unit AI, or formations. The Control options contract covers physical bindings, the Camera framing contract covers the camera view, and the Fact list contract covers displayed information.",
  "questions": {
    "command-receiver": {
      "asks": "Who receives a command made by pointing at the world?",
      "rationale": "A pointer command may control one fixed actor, the current selection, or the place the pointer is on.",
      "options": {
        "fixed-actor": {
          "meaning": "One fixed actor or party receives every world command. An ARPG hero moves wherever the ground is clicked.",
          "semantics": "Every proposed command names the actor or party fixed by its cited command rule. No world selection is required to supply a receiver."
        },
        "current-selection": {
          "meaning": "The current world selection receives every command. An RTS order moves the selected squad.",
          "semantics": "The receiver set is the complete current selection. An empty set is refused as a receiver."
        },
        "world-target": {
          "meaning": "The command belongs to the place or object under the pointer, without a selected actor. A colony work order marks one ore tile for any worker.",
          "semantics": "A proposed command names its world target and no selected receiver. The cited game rule owns any later choice of actor, worker, structure, or world system that carries it out."
        }
      }
    },
    "near-miss-resolution": {
      "asks": "When the pointer just misses a target, what can it choose?",
      "rationale": "The game can require the exact point or choose the nearest candidate inside a declared reach.",
      "options": {
        "exact-point-only": {
          "meaning": "Only the exact place or object under the pointer counts. A click beside a chest does not choose it.",
          "semantics": "Candidate lookup uses the exact pointer point and applies no near-miss reach."
        },
        "nearest-within-reach": {
          "meaning": "The nearest candidate inside the game's declared reach counts. A click beside a small lever can choose it.",
          "semantics": "Candidate lookup chooses the nearest selectable candidate inside the cited reach and uses the cited complete tie-break."
        }
      }
    },
    "empty-selection": {
      "asks": "The player clicks or drags to select units, and nothing is there. What happens to the current selection?",
      "rationale": "An empty click or box can clear the selection or leave the current selection in place. The answer applies only to selection gestures whose change is replace. When no such row exists, the answer has no effect.",
      "when": {
        "row-count": {
          "selection-gestures": "non-empty"
        }
      },
      "otherwise": "No pointer gesture changes the current world selection.",
      "options": {
        "clear-selection": {
          "meaning": "The current selection is cleared. A tactics click on open ground leaves no unit selected.",
          "semantics": "An empty result empties the current selection."
        },
        "keep-selection": {
          "meaning": "The current selection stays. A colony drag across bare ground leaves the chosen workers selected.",
          "semantics": "An empty result keeps the current selection."
        }
      }
    },
    "invalid-target": {
      "asks": "The player points at an invalid target for the chosen ability or verb. Does the game keep waiting for another target?",
      "rationale": "The game can wait for the player to point again, or it can return to ordinary pointing.",
      "when": {
        "row-count": {
          "targeted-verbs": "non-empty"
        }
      },
      "otherwise": "No chosen ability or verb waits for a world target from the pointer.",
      "options": {
        "keep-targeting": {
          "meaning": "The game keeps waiting for another point. An ARPG fire spell still waits after the player points outside its range.",
          "semantics": "After an invalid target, the same chosen verb stays active."
        },
        "leave-targeting": {
          "meaning": "The game stops waiting after the invalid point. A tower placement returns to ordinary pointing after a blocked tile.",
          "semantics": "After an invalid target, the chosen verb is cleared."
        }
      }
    },
    "queued-command-placement": {
      "asks": "The player holds the key that adds an order to the queue. Where does the new order go?",
      "rationale": "The new order may wait at the end of the queue, or become the next order after the current one.",
      "when": {
        "row-count": {
          "queue-modifiers": "non-empty"
        }
      },
      "otherwise": "No pointer modifier adds a command to a queue.",
      "options": {
        "append-at-end": {
          "meaning": "The new order goes to the end of the queue. An RTS shift-order adds a final waypoint.",
          "semantics": "The declared placement is after every waiting command for the same plan owner."
        },
        "insert-next": {
          "meaning": "The new order becomes the next order after the current one. A colony emergency repair runs before work already waiting.",
          "semantics": "The declared placement is before every waiting command for the same plan owner."
        }
      }
    },
    "unmodified-command": {
      "asks": "A new order arrives while another order is waiting. The player does not hold the key that adds an order to the queue. What happens?",
      "rationale": "An order given without that key can replace the orders that wait in the queue, join the end of the queue, or be refused while its owner has an order waiting.",
      "when": {
        "any": [
          {
            "row-count": {
              "context-commands": "non-empty"
            }
          },
          {
            "row-count": {
              "targeted-verbs": "non-empty"
            }
          }
        ]
      },
      "otherwise": "No pointer command can enter a queue.",
      "options": {
        "replaces-waiting": {
          "meaning": "The new order replaces every order waiting in its owner's queue. A hero turns toward the newest clicked destination.",
          "semantics": "The unmodified placement clears waiting pointer commands for the same plan owner."
        },
        "always-appends": {
          "meaning": "The new order goes to the end of its owner's queue. A colony keeps each new work mark.",
          "semantics": "The unmodified placement is after every waiting pointer command for the same plan owner."
        },
        "rejected-while-busy": {
          "meaning": "The new order is refused while its owner has an order waiting. A build tool accepts no second placement until the first is no longer waiting.",
          "semantics": "An unmodified proposal is refused while its plan owner has a waiting pointer command."
        }
      }
    }
  },
  "declares": {
    "values": {},
    "rows": {
      "selection-gestures": {
        "description": "Pointer gestures that replace, add, remove, or toggle actors or world objects in the current selection.",
        "when-empty": "No pointer gesture changes the current world selection.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name in your game's words, such as point-select or box-select."
          },
          "gesture": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The pointer action that the game receives after physical input mapping, such as select-point or select-area."
          },
          "resolves-on": {
            "type": "string",
            "required": true,
            "options": [
              "press",
              "release",
              "drag-complete"
            ],
            "description": "The pointer phase that settles the selection. A tactics point may settle on release; an RTS box settles when its drag completes."
          },
          "shape": {
            "type": "string",
            "required": true,
            "options": [
              "point",
              "area"
            ],
            "description": "Whether the gesture tests one pointer point or the cited dragged area."
          },
          "change": {
            "type": "string",
            "required": true,
            "options": [
              "replace",
              "add",
              "remove",
              "toggle"
            ],
            "description": "How the selectable results change the current selection. A strategy box may replace it while a modified click adds one unit."
          },
          "gesture-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say how the game recognizes this press, release, or drag. The rules include any drag threshold and the geometry of the area."
          },
          "candidates-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say which kinds of target can be selected. The rules say when the pointer point or the dragged area includes a target. They give the near-miss reach, when the game uses one. They give a complete tie-break. A point rule may return several candidates, as in double-click select-type."
          }
        }
      },
      "context-commands": {
        "description": "Commands chosen directly from the classified world target under a pointer gesture, such as moving on ground or attacking an enemy.",
        "when-empty": "No pointer gesture chooses a command directly from what lies under it.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name in your game's words, such as move-on-ground or attack-enemy."
          },
          "gesture": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The pointer action that the game receives after physical input mapping, such as world-command or context-order."
          },
          "resolves-on": {
            "type": "string",
            "required": true,
            "options": [
              "press",
              "release",
              "drag-complete"
            ],
            "description": "The pointer phase that proposes the command. An action RPG may move on release while a colony designation completes as a drag."
          },
          "target-kind": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The mutually exclusive world classification that selects this row, such as ground, enemy, door, or buildable-tile."
          },
          "command": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The game command proposed by this row, such as move, basic-attack, open-door, or place-tower."
          },
          "gesture-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say how the game recognizes the pointer action and which phase completes it."
          },
          "target-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say how the game classifies what is under the pointer and what the exact target is. For nearest-within-reach, the rules also give the reach and the tie-break."
          },
          "area-declared-in": {
            "type": "citation",
            "when": {
              "row": {
                "resolves-on": [
                  "drag-complete"
                ]
              }
            },
            "description": "Where your game's rules say what the dragged region is, whether its boundary is included, and how the region becomes the command target."
          },
          "receiver-condition": {
            "type": "citation",
            "description": "Where your game's rules say which receiver class this row is limited to, such as worker or soldier. This field is optional."
          },
          "command-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say what the command is. The rules name its receiver. They name its target. They say who owns the queue for each target. They say when the command is permitted. They say what happens when the target cannot be reached. They give the complete effect of the command when it is accepted and when it is refused."
          }
        }
      },
      "targeted-verbs": {
        "description": "Abilities and verbs that use a pointer-captured world target, whether the verb or the target arrives first. Every targeting state can be left: through leave-targeting, a targeting cancellation row, or the cited start rule.",
        "when-empty": "No chosen ability or verb waits for a world target from the pointer.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name in your game's words, such as artillery-target or use-key-on-door."
          },
          "verb": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The chosen ability or verb applied to the captured world target."
          },
          "order": {
            "type": "string",
            "required": true,
            "options": [
              "verb-first",
              "target-first"
            ],
            "description": "Whether the verb starts before target capture or arrives from a cited game action after the pointer captures the target."
          },
          "confirm-style": {
            "type": "string",
            "required": true,
            "options": [
              "separate-gesture",
              "at-entry-position"
            ],
            "description": "Whether confirmation needs another pointer gesture or uses the pointer snapshot captured when this verb entry begins."
          },
          "target-gesture": {
            "type": "string",
            "pattern": "kebab-case",
            "when": {
              "row": {
                "order": [
                  "target-first"
                ]
              }
            },
            "description": "The pointer action that captures the world target before the verb arrives."
          },
          "confirm-gesture": {
            "type": "string",
            "pattern": "kebab-case",
            "when": {
              "row": {
                "confirm-style": [
                  "separate-gesture"
                ]
              }
            },
            "description": "The action that separately confirms this target. It may be a pointer gesture or a cited non-pointer action, such as releasing the held ability key."
          },
          "resolves-on": {
            "type": "string",
            "required": true,
            "options": [
              "press",
              "release",
              "drag-complete"
            ],
            "description": "The phase that this row uses. With a separate confirmation, it is the phase of the confirming gesture. For a target-first row, it is the phase that captures the target. For a verb-first row that confirms at the entry position, it is the phase that completes the cited entry action. A row that resolves on a completed drag also cites its region rule."
          },
          "after-dispatch": {
            "type": "string",
            "required": true,
            "options": [
              "leave-targeting",
              "keep-targeting"
            ],
            "description": "Whether a valid dispatched command ends targeting or keeps the same verb ready for another target. A tower tool may remain active for repeated placement."
          },
          "starts-when-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say which game action supplies the verb. For a target-first row, this action arrives after the target is captured."
          },
          "target-gesture-declared-in": {
            "type": "citation",
            "when": {
              "row": {
                "order": [
                  "target-first"
                ]
              }
            },
            "description": "Where your game's rules say how the game recognizes the target-first pointer action and in which phase it captures the target."
          },
          "confirm-gesture-declared-in": {
            "type": "citation",
            "when": {
              "row": {
                "confirm-style": [
                  "separate-gesture"
                ]
              }
            },
            "description": "Where your game's rules say how the game recognizes the confirmation gesture and which phase completes it."
          },
          "targets-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say how a target is captured. The rules name every valid target. They give the near-miss reach and the tie-break, when the game uses them. They give the complete test for an invalid target."
          },
          "area-declared-in": {
            "type": "citation",
            "when": {
              "row": {
                "resolves-on": [
                  "drag-complete"
                ]
              }
            },
            "description": "Where your game's rules say what the dragged region is, whether its boundary is included, and how the region becomes the target of the verb."
          },
          "command-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say what the command is. The rules name its receiver. They say who owns the queue for each target. They say when the command is permitted. They say what the command costs. They say what happens when the target cannot be reached. They give the complete effect of the command, or its refusal."
          }
        }
      },
      "queue-modifiers": {
        "description": "Modifier actions that add matching pointer commands to a queue.",
        "when-empty": "No pointer modifier adds a command to a queue.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name in your game's words, such as queue-orders or urgent-work-next."
          },
          "modifier-action": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The mapped game action held or active when the pointer command completes."
          },
          "modifier-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say when this modifier action is active, what the capacity of the queue is, if it has one, and what happens when the queue has no free place."
          },
          "applies-to-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say to which context commands and targeted verbs this modifier applies. The rules name every one of them, and they name at least one row of this adoption."
          }
        }
      },
      "cancellations": {
        "description": "Actions that end targeting, abort a selection drag, clear the orders waiting in a queue, or clear the current selection without proposing another command.",
        "when-empty": "No action has a separate cancellation meaning in this adoption.",
        "record": {
          "id": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "unique": true,
            "description": "A short name in your game's words, such as cancel-ability-target or abort-box-select."
          },
          "action": {
            "type": "string",
            "required": true,
            "pattern": "kebab-case",
            "description": "The pointer action or other game action that has a cancellation meaning in the cited state."
          },
          "resolves-on": {
            "type": "string",
            "required": true,
            "options": [
              "press",
              "release",
              "drag-cancel"
            ],
            "description": "The phase of the action that applies the cancellation."
          },
          "active-state": {
            "type": "string",
            "required": true,
            "options": [
              "targeting",
              "selection-drag",
              "queued-commands",
              "selection"
            ],
            "description": "The state in which this row applies. The state named selection exists while the current selection is not empty. A cancel of an ability uses targeting. An RTS gesture that clears planned orders uses queued-commands."
          },
          "result": {
            "type": "string",
            "required": true,
            "options": [
              "ends-targeting",
              "ends-drag",
              "empties-queue",
              "empties-selection"
            ],
            "description": "The state change made without another world command. The result matches the row's active state; empties-queue clears the queue named at state-declared-in."
          },
          "action-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say how the game recognizes the cancellation action and which phase completes it."
          },
          "state-declared-in": {
            "type": "citation",
            "required": true,
            "description": "Where your game's rules say when the affected state exists: the targeting state, the selection drag, the queue, or the selection."
          }
        }
      }
    }
  },
  "rules": {},
  "origin": "https://opengdd.org/contracts/pointer-command-2",
  "mechanism": [
    "This text decides the order of the steps for what a pointer press, drag, or release over the world means; how selection, context command, and targeting states advance; where a queue modifier places a command; and what a cancellation clears. The questions and rows supply choices and cited game rules. They do not change the order.",
    "A **game-facing pointer action** is the action received after Control options maps a mouse, touch, or stick-driven cursor input. A **pointer phase** is its press, release, completed drag, or canceled drag. A **pointer snapshot** is the world point and classified object under the pointer at that phase. The broader **game-facing action** also includes a cited non-pointer action that supplies a verb, confirmation, or cancellation; a non-pointer action has one completion phase, recorded as its press unless its cited rule names release. The **current selection** is one set of world objects. It starts empty unless a cited load or scene-entry rule supplies it, lasts until a rule changes it, and may also change through cited control-group recall, unit death, roster change, scene entry, or load. A **selection drag** starts when its cited gesture rule crosses the drag threshold and lasts until that same gesture completes or cancels. A **targeting state** holds one chosen ability or verb, or a target-first snapshot while it waits for the verb. A **command proposal** contains one command, its receiver shape, exact world target, and queue placement. A **waiting plan** contains pointer commands accepted for later execution for the owner named by the cited command rule. The questions and field descriptions call a waiting plan a queue, and call its commands orders. The game's Fixed command rules own whether a proposal is accepted and what it does.",
    "### Recognize the gesture",
    "1. Control options maps physical input to one game-facing pointer action. The matching cited gesture rule observes its press, movement, and release. This contract does not inspect device identity.",
    "2. On press, record the pointer snapshot needed by the cited gesture rule. A row that resolves on press proceeds immediately, and no later drag or release result is inferred from that press for this contract.",
    "3. While the pointer moves, the cited rule alone decides whether it remains a point gesture, becomes a drag, or is canceled. Its cited distance, duration, geometry, coordinate space, and boundary rule are read directly; this adoption contributes no number. A cited gesture rule may emit repeated completed phases while a control is held.",
    "4. On release, create the final pointer snapshot. A release row resolves now. A recognized drag creates one `drag-complete` phase; an aborted drag creates one `drag-cancel` phase belonging to that drag's own game-facing action. One physical sequence cannot produce both a point result and a drag result unless the cited rule creates two distinct game-facing actions.",
    "### Resolve cancellation and targeting",
    "5. At each completed action phase, check cancellation before any other row. A cancellation row matches on three terms of its own: the game-facing action, its resolving phase, and the currently holding active state, checked in this order: targeting, selection-drag, queued-commands, selection. Apply its declared result and end this phase. It proposes no command and performs no selection change beyond `empties-selection`.",
    "6. For `verb-first`, a game action named by `starts-when-declared-in` supplies the verb and begins its targeting entry. For `target-first`, the capture gesture — matched on its game-facing action, phase, and classified snapshot — captures the world target and begins a target-first state; then the cited game action — a verb coin, pie menu, or command card — supplies the verb. A second entry does not change the active targeting state unless the cited start rule explicitly replaces it.",
    "7. While targeting is active, ordinary selection and direct-command rows do not run. Under `separate-gesture`, a matching confirmation action reads the pointer snapshot at its completion moment — for a non-pointer confirmation such as a key release, the pointer's position at that release. Under `at-entry-position`, confirmation reads the entry-time snapshot: the pointer position when a verb-first entry begins or the already captured target for target-first. A `drag-complete` row also reads its cited region rule, and validity is tested on that region. Apply `near-miss-resolution` through `targets-declared-in`, then test validity. A non-matching pointer action has no meaning here unless it matches a cancellation row.",
    "8. For an invalid target, propose no command. Under `keep-targeting`, preserve the active verb. Under `leave-targeting`, clear it. The same pointer phase is not then matched against the context-command rows.",
    "9. For a valid target, create one command proposal from the targeted row and its cited rules; under `current-selection` an empty selection makes it one refused proposal, as in step 12. Preserve the row's `after-dispatch` result with the proposal. A refused command is still a dispatched proposal, so refusal does not restore targeting unless the cited game rule starts a new instance.",
    "### Resolve selection or a context command",
    "10. With no active targeting state, find the one selection or context row that matches the game-facing action, pointer phase, and classified pointer snapshot. A context row with `receiver-condition` also matches the receiver class named by that citation; receiver class therefore participates in classification when a row cites it. A receiver-conditioned adoption keeps its receiver set homogeneous for that action: when rows cite different receiver classes for one action, phase, and target kind, the selection holds one class at a time under the receiver-condition citation. This version cannot express different commands for the members of one mixed selection. For one game-facing action and phase, selection rows, context rows, and target-first capture gestures have mutually exclusive classifications. Apply `near-miss-resolution` through the row's cited target or candidate rule. If no row matches, change no world-command state and record the unmatched classification in step 16.",
    "11. For a selection row, compute its complete candidate set from the cited point or area rule. With an empty result, a `replace` row applies `empty-selection`; an `add`, `remove`, or `toggle` row always keeps the current selection, because an empty result gives such a row nothing to add, remove, or toggle. With a non-empty result, apply `replace`, `add`, `remove`, or `toggle` to the complete set. Commit the new selection once and end this pointer phase.",
    "12. For a context row, copy its classified point or object as the command target. Under `fixed-actor`, read the fixed receiver from the cited command rule. Under `current-selection`, copy the complete current selection. An empty copy creates one refused proposal with no world effect and ends at this step; it never reaches queue placement or dispatch. Under `world-target`, attach no selected receiver and read that exact target's plan owner from the cited command rule. Create one command proposal and continue.",
    "### Place and dispatch the command",
    "13. Read queue modifiers only after the command, receiver, and target are fixed. A matching modifier changes placement, not meaning. Under `append-at-end`, place the proposal after every waiting pointer command for the same waiting-plan owner. Under `insert-next`, place it before those waiting commands and after the command already being carried out. The cited modifier rule owns plan capacity and the complete result of the refusal when no place is available; this contract never drops another command implicitly.",
    "14. With a matching modifier, add the proposal at the position from step 13. Without one, read `unmodified-command`: `replaces-waiting` clears waiting pointer commands for the same owner, `always-appends` places the proposal after them, and `rejected-while-busy` records a refusal and stops when one is waiting. A proposal exists once per completed phase; a held modifier or update cannot add another copy within that phase. After a targeted proposal is dispatched, placed, or refused at this step, apply its row's `after-dispatch` result: `leave-targeting` ends the state and `keep-targeting` preserves it.",
    "15. Submit each dispatched proposal to its cited Fixed command rule. That rule owns permission, cost, range, path request, the unreachable-destination case, effect, refusal, and whether the command already being carried out stops. A queued proposal is submitted when it reaches its declared place. Event resolution owns the order when several proposals share one instant.",
    "16. Record the pointer result: gesture id, resolving phase, pointer snapshot, prior and final targeting state, prior and final selection when changed, command and receiver when proposed, target, queue modifier or unmodified placement outcome, cancellation when used, target validity for every targeted verb that reached a validity test, a no-matching-row result when applicable, and the cited game-rule result when available.",
    "The order of the steps is: physical mapping, gesture recognition, cancellation, targeting entry, target confirmation, selection or context classification, receiver snapshot, queue placement, command dispatch, game rule, and same-instant event order. A later step never changes the pointer snapshot or receiver copied by an earlier step; classification may read receiver class without copying the receiver set."
  ],
  "pack": "sha256:e5103351d21ef47e6f90b1e34ceba968cf5bf77ec393a38413f80aa8e442eee1",
  "answers": {
    "command-receiver": "current-selection",
    "near-miss-resolution": "exact-point-only",
    "empty-selection": "keep-selection",
    "invalid-target": "keep-targeting",
    "unmodified-command": "replaces-waiting"
  },
  "values": {},
  "rows": {
    "selection-gestures": [
      {
        "id": "add-ally-on-press",
        "gesture": "add-ally",
        "resolves-on": "press",
        "shape": "point",
        "change": "add",
        "gesture-declared-in": "controls.add-ally",
        "candidates-declared-in": "units.ally-selection"
      },
      {
        "id": "toggle-hero",
        "gesture": "toggle-hero",
        "resolves-on": "release",
        "shape": "point",
        "change": "toggle",
        "gesture-declared-in": "controls.toggle-hero",
        "candidates-declared-in": "units.hero-selection"
      },
      {
        "id": "remove-defeated-hero",
        "gesture": "remove-hero",
        "resolves-on": "release",
        "shape": "point",
        "change": "remove",
        "gesture-declared-in": "controls.remove-hero",
        "candidates-declared-in": "units.defeated-hero-selection"
      }
    ],
    "context-commands": [
      {
        "id": "move-hero-on-ground",
        "gesture": "hero-order",
        "resolves-on": "release",
        "target-kind": "ground",
        "command": "move-hero",
        "gesture-declared-in": "controls.hero-order",
        "target-declared-in": "arena.pointer-target-kinds",
        "command-declared-in": "orders.move-hero"
      }
    ],
    "targeted-verbs": [
      {
        "id": "arc-stun-smart-cast",
        "verb": "arc-stun",
        "order": "verb-first",
        "confirm-style": "at-entry-position",
        "resolves-on": "press",
        "after-dispatch": "leave-targeting",
        "starts-when-declared-in": "abilities.choose-arc-stun",
        "targets-declared-in": "abilities.arc-stun-targets",
        "command-declared-in": "abilities.arc-stun-command"
      }
    ],
    "queue-modifiers": [],
    "cancellations": [
      {
        "id": "cancel-aim-mode",
        "action": "ability-key-again",
        "resolves-on": "press",
        "active-state": "targeting",
        "result": "ends-targeting",
        "action-declared-in": "controls.ability-key-again",
        "state-declared-in": "abilities.aim-mode-state"
      },
      {
        "id": "clear-hero-selection",
        "action": "clear-selection-key",
        "resolves-on": "press",
        "active-state": "selection",
        "result": "empties-selection",
        "action-declared-in": "controls.clear-selection-key",
        "state-declared-in": "units.hero-selection-state"
      }
    ]
  }
}
