Struct InputConflictPolicy
Which of the conflict rules apply, and how paths are compared.
Inherited Members
Namespace: Scylla.Input
Assembly: ScyllaInput.dll
Syntax
public readonly struct InputConflictPolicy
Remarks
Two callers in the framework ask overlapping but different questions. A rebinding table asks which bindings could fire together given the game's declared layout, and applies every rule. A live path lookup asks only which actions currently sit on a control, matches case-insensitively, and excludes the querying action outright rather than just its own row.
Expressing that as a policy keeps one engine. The alternative was either changing one caller's long-standing semantics or keeping a second copy of the rules, and a second copy is exactly what this engine exists to eliminate.
Constructors
InputConflictPolicy(StringComparison, bool, bool, bool, bool, bool, bool, bool)
Initializes a policy. Prefer RebindTable or LiveBindingLookup; a third combination should be a named preset here rather than an inline construction at the call site.
Declaration
public InputConflictPolicy(StringComparison pathComparison, bool requireRegisteredScheme, bool scopeByDeviceClass, bool scopeByModifierDepth, bool scopeByModifierComposite, bool excludeWholeQueryAction, bool scopeByInteraction = false, bool scopeByScheme = false)
Parameters
| Type | Name | Description |
|---|---|---|
| StringComparison | pathComparison | How control paths are compared. |
| bool | requireRegisteredScheme | Whether undeclared columns are invisible. |
| bool | scopeByDeviceClass | Whether device class exempts a pair. |
| bool | scopeByModifierDepth | Whether modifier depth exempts a pair. |
| bool | scopeByModifierComposite | Whether differing modifiers exempt a pair. |
| bool | excludeWholeQueryAction | Whether the whole querying action is excluded. |
| bool | scopeByInteraction | Whether provably disjoint interactions are exempt. |
| bool | scopeByScheme | Whether bindings sharing no control scheme are exempt. |
Fields
ExcludeWholeQueryAction
Whether every binding of the querying action is excluded, rather than only the queried binding and its same-named siblings.
Declaration
public readonly bool ExcludeWholeQueryAction
Field Value
| Type | Description |
|---|---|
| bool |
PathComparison
How control paths are compared for equality.
Declaration
public readonly StringComparison PathComparison
Field Value
| Type | Description |
|---|---|
| StringComparison |
RequireRegisteredScheme
Whether a binding outside the declared columns is invisible.
Declaration
public readonly bool RequireRegisteredScheme
Field Value
| Type | Description |
|---|---|
| bool |
ScopeByDeviceClass
Whether bindings on different device classes are exempt.
Declaration
public readonly bool ScopeByDeviceClass
Field Value
| Type | Description |
|---|---|
| bool |
ScopeByInteraction
Whether bindings whose interactions cannot both perform from one gesture are exempt.
Declaration
public readonly bool ScopeByInteraction
Field Value
| Type | Description |
|---|---|
| bool |
Remarks
On under both presets, which is only honest because every record producer fills
InteractionSignature with real data. It is not in
the set of fields the live lookup leaves neutral; see the remarks on
InputConflictRecordBuilder.BuildLiveLookupCandidate for why that distinction
is the whole reason this rule can be on there.
ScopeByModifierComposite
Whether modifier composite parts under different modifiers are exempt.
Declaration
public readonly bool ScopeByModifierComposite
Field Value
| Type | Description |
|---|---|
| bool |
ScopeByModifierDepth
Whether bindings at different modifier depths are exempt.
Declaration
public readonly bool ScopeByModifierDepth
Field Value
| Type | Description |
|---|---|
| bool |
ScopeByScheme
Whether bindings that name no control scheme in common are exempt.
Declaration
public readonly bool ScopeByScheme
Field Value
| Type | Description |
|---|---|
| bool |
Remarks
Off in both presets, and deliberately unlike ScopeByInteraction: this one is not a property of the question being asked but of the asset being asked about. Whether two schemes are mutually exclusive depends on whether anything applies a binding mask at run time, which differs per project and per asset, so a preset cannot honestly answer it. Callers derive a policy with WithSchemeExclusivity(bool) from whatever they know.
A binding naming no scheme at all is never exempt under this rule. It is live under
every mask, which is Unity's own behaviour: the resolver matches a binding against
the mask with EmptyGroupMatchesAny.
Properties
LiveBindingLookup
The live path lookup's rules: path equality and scope only, compared case-insensitively, with every binding of the querying action excluded.
Declaration
public static InputConflictPolicy LiveBindingLookup { get; }
Property Value
| Type | Description |
|---|---|
| InputConflictPolicy |
RebindTable
The rebinding table's rules: every documented rule, ordinal path comparison, and only the queried binding's own semantic slot excluded.
Declaration
public static InputConflictPolicy RebindTable { get; }
Property Value
| Type | Description |
|---|---|
| InputConflictPolicy |
SupportsPathBucketing
Gets whether a path-bucket index can stand in for a full scan under this policy.
Declaration
public bool SupportsPathBucketing { get; }
Property Value
| Type | Description |
|---|---|
| bool |
Remarks
The bucket index groups records by an ordinal case-insensitive key. That is a superset of what either ordinal comparison would match, so it is safe for both: extra candidates get rejected by the path test exactly as they would have been in a full scan.
A culture-sensitive or linguistic comparison can consider two strings equal that differ under the index's key, which would make the bucket a strict subset and lose real conflicts. Rather than assume no such policy will ever exist, the engine falls back to the linear scan, so an unsupported comparison costs speed rather than correctness.
Methods
WithSchemeExclusivity(bool)
Returns this policy with ScopeByScheme set as given.
Declaration
public InputConflictPolicy WithSchemeExclusivity(bool scopeByScheme)
Parameters
| Type | Name | Description |
|---|---|---|
| bool | scopeByScheme | Whether bindings sharing no control scheme are exempt. |
Returns
| Type | Description |
|---|---|
| InputConflictPolicy | A copy differing only in that flag. |
Remarks
The one rule a caller is expected to vary, because it is answered per asset rather than per question. Starting from a preset and deriving keeps the presets the single statement of what each caller's other rules are, so a rule added to a preset later reaches every derived policy without anyone remembering to copy it.