86 lines
3.3 KiB
GDScript
86 lines
3.3 KiB
GDScript
@icon("res://addons/guide/guide_internal.svg")
|
|
## A remapping configuration. This only holds changes to the context mapping,
|
|
## so to get the full input map you need to apply this on top of one or more
|
|
## mapping contexts. The settings from this config take precedence over the
|
|
## settings from the mapping contexts.
|
|
class_name GUIDERemappingConfig
|
|
extends Resource
|
|
|
|
## Dictionary with remapped inputs. Structure is:
|
|
## {
|
|
## mapping_context : {
|
|
## action : {
|
|
## index : bound input
|
|
## ...
|
|
## }, ...
|
|
## }
|
|
## The bound input can be NULL which means that this was deliberately unbound.
|
|
@export var remapped_inputs:Dictionary = {}
|
|
|
|
## Dictionary for additional custom data to store (e.g. modifier settings, etc.)
|
|
## Note that this data is completely under application control and it's the responsibility
|
|
## of the application to ensure that this data is serializable and gets applied at
|
|
## the necessary point in time.
|
|
@export var custom_data:Dictionary = {}
|
|
|
|
## Binds the given input to the given action. Index can be given to have
|
|
## alternative bindings for the same action.
|
|
func _bind(mapping_context:GUIDEMappingContext, action:GUIDEAction, input:GUIDEInput, index:int = 0) -> void:
|
|
if not remapped_inputs.has(mapping_context):
|
|
remapped_inputs[mapping_context] = {}
|
|
|
|
if not remapped_inputs[mapping_context].has(action):
|
|
remapped_inputs[mapping_context][action] = {}
|
|
|
|
remapped_inputs[mapping_context][action][index] = input
|
|
|
|
|
|
## Unbinds the given input from the given action. This is a deliberate unbind
|
|
## which means that the action should not be triggerable by the input anymore. It
|
|
## its not the same as _clear.
|
|
func _unbind(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> void:
|
|
_bind(mapping_context, action, null, index)
|
|
|
|
|
|
## Removes the given input action binding from this configuration. The action will
|
|
## now have the default input that it has in the mapping_context. This is not the
|
|
## same as _unbind.
|
|
func _clear(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> void:
|
|
if not remapped_inputs.has(mapping_context):
|
|
return
|
|
|
|
if not remapped_inputs[mapping_context].has(action):
|
|
return
|
|
|
|
remapped_inputs[mapping_context][action].erase(index)
|
|
|
|
if remapped_inputs[mapping_context][action].is_empty():
|
|
remapped_inputs[mapping_context].erase(action)
|
|
|
|
if remapped_inputs[mapping_context].is_empty():
|
|
remapped_inputs.erase(mapping_context)
|
|
|
|
|
|
## Returns the bound input for the given action name and index. Returns null
|
|
## if there is matching binding.
|
|
func _get_bound_input_or_null(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> GUIDEInput:
|
|
if not remapped_inputs.has(mapping_context):
|
|
return null
|
|
|
|
if not remapped_inputs[mapping_context].has(action):
|
|
return null
|
|
|
|
return remapped_inputs[mapping_context][action].get(index, null)
|
|
|
|
|
|
## Returns whether or not this mapping has a configuration for the given combination (even if the
|
|
## combination is set to null).
|
|
func _has(mapping_context:GUIDEMappingContext, action:GUIDEAction, index:int = 0) -> bool:
|
|
if not remapped_inputs.has(mapping_context):
|
|
return false
|
|
|
|
if not remapped_inputs[mapping_context].has(action):
|
|
return false
|
|
|
|
return remapped_inputs[mapping_context][action].has(index)
|