GodotProjects/Sprout/addons/dialogic/Events/Variable/event_variable.gd
2023-01-03 16:54:53 -07:00

204 lines
6.9 KiB
GDScript

@tool
class_name DialogicVariableEvent
extends DialogicEvent
## Event that allows changing a dialogic variable or a property of an autoload.
enum Operations {Set, Add, Substract, Multiply, Divide}
## Settings
## Name/Path of the variable that should be changed.
var name: String = ""
## The operation to perform.
var operation: int = Operations.Set
## The value that is used. Can be a variable as well.
var value: String = ""
## If true, a random number between [random_min] and [random_max] is used instead of [value].
var random_enabled: bool = false
var random_min: int = 0
var random_max: int = 100
################################################################################
## EXECUTE
################################################################################
func _execute() -> void:
if name:
var orig = dialogic.VAR.get_variable(name)
var the_value = value
if value.begins_with("{"):
the_value = dialogic.VAR.get_variable(value)
if random_enabled:
the_value = randi()%(random_max-random_min)+random_min
if orig != null:
if Dialogic.has_subsystem('History'):
if Dialogic.History.full_history_enabled:
Dialogic.History.full_history[0]['previous_value'] = orig
if operation != Operations.Set and orig.is_valid_float() and value.is_valid_float():
orig = orig.to_float()
the_value = value.to_float()
match operation:
Operations.Add:
dialogic.VAR.set_variable(name, str(orig+the_value))
Operations.Substract:
dialogic.VAR.set_variable(name, str(orig-the_value))
Operations.Multiply:
dialogic.VAR.set_variable(name, str(orig*the_value))
Operations.Divide:
dialogic.VAR.set_variable(name, str(orig/the_value))
elif operation == Operations.Set:
dialogic.VAR.set_variable(name, str(the_value))
else:
printerr("Dialogic: Set Variable event failed because one value wasn't a float!")
finish()
################################################################################
## INITIALIZE
################################################################################
func _init() -> void:
event_name = "Set Variable"
set_default_color('Color1')
event_category = Category.Godot
event_sorting_index = 0
expand_by_default = false
################################################################################
## SAVING/LOADING
################################################################################
func to_text() -> String:
var string = "VAR "
if name:
string += "{" + name + "}"
match operation:
Operations.Set:
string+= " = "
Operations.Add:
string+= " += "
Operations.Substract:
string+= " -= "
Operations.Multiply:
string+= " *= "
Operations.Divide:
string+= " /= "
string += value
if random_enabled:
string += ' [random="True"'
if random_min != 0:
string += ' min="'+str(random_min)+'"'
if random_max != 100:
string += ' max="'+str(random_max)+'"'
string += "]"
return string
func from_text(string:String) -> void:
var reg = RegEx.new()
reg.compile("VAR (?<name>[^=+\\-*\\/]*)(?<operation>=|\\+=|-=|\\*=|\\/=)(?<value>[^\\[\\n]*)(?<shortcode>\\[.*)?")
var result = reg.search(string)
name = result.get_string('name').strip_edges().replace("{", "").replace("}", "")
match result.get_string('operation').strip_edges():
'=':
operation = Operations.Set
'-=':
operation = Operations.Substract
'+=':
operation = Operations.Add
'*=':
operation = Operations.Multiply
'/=':
operation = Operations.Divide
value = result.get_string('value').strip_edges()
if !result.get_string('shortcode').is_empty():
var shortcodeparams = parse_shortcode_parameters(result.get_string('shortcode'))
random_enabled = true if shortcodeparams.get('random', "True") == "True" else false
random_min = DialogicUtil.logical_convert(shortcodeparams.get('min', 0))
random_max = DialogicUtil.logical_convert(shortcodeparams.get('max', 100))
func is_valid_event(string:String) -> bool:
return string.begins_with('VAR ')
################################################################################
## EDITOR REPRESENTATION
################################################################################
func build_event_editor():
add_header_edit('name', ValueType.ComplexPicker, '', '',
{'suggestions_func' : get_var_suggestions,
'editor_icon' : ["ClassList", "EditorIcons"]})
add_header_edit('operation', ValueType.FixedOptionSelector, '', '', {
'selector_options': [
{
'label': 'to be',
'icon': load("res://addons/dialogic/Editor/Images/Dropdown/set.svg"),
'value': Operations.Set
},
{
'label': 'to itself plus',
'icon': load("res://addons/dialogic/Editor/Images/Dropdown/plus.svg"),
'value': Operations.Add
},
{
'label': 'to itself minus',
'icon': load("res://addons/dialogic/Editor/Images/Dropdown/minus.svg"),
'value': Operations.Substract
},
{
'label': 'to itself multiplied by',
'icon': load("res://addons/dialogic/Editor/Images/Dropdown/multiply.svg"),
'value': Operations.Multiply
},
{
'label': 'to itself divided by',
'icon': load("res://addons/dialogic/Editor/Images/Dropdown/divide.svg"),
'value': Operations.Divide
}
]
}, '!name.is_empty()')
add_header_edit('value', ValueType.ComplexPicker, '', '',
{'suggestions_func' : get_value_suggestions,
'editor_icon' : ["Variant", "EditorIcons"], },
'!name.is_empty() and not random_enabled')
add_header_label('a random integer', 'random_enabled')
add_header_button('', _on_variable_editor_pressed, 'Variable Editor', ["EditAddRemove", "EditorIcons"])
add_body_edit('random_enabled', ValueType.Bool, 'Use Random Integer:', '', {}, '!name.is_empty()')
add_body_edit('random_min', ValueType.Integer, 'Min:', '', {}, '!name.is_empty() and random_enabled')
add_body_edit('random_max', ValueType.Integer, 'Max:', '', {}, '!name.is_empty() and random_enabled')
func get_var_suggestions(filter:String) -> Dictionary:
var suggestions := {}
if filter:
suggestions[filter] = {'value':filter, 'editor_icon':["GuiScrollArrowRight", "EditorIcons"]}
var vars: Dictionary = DialogicUtil.get_project_setting('dialogic/variables', {})
for var_path in DialogicUtil.list_variables(vars):
suggestions[var_path] = {'value':var_path, 'editor_icon':["ClassList", "EditorIcons"]}
return suggestions
func get_value_suggestions(filter:String) -> Dictionary:
var suggestions := {}
if filter:
suggestions[filter] = {'value':filter, 'editor_icon':["GuiScrollArrowRight", "EditorIcons"]}
var vars: Dictionary = DialogicUtil.get_project_setting('dialogic/variables', {})
for var_path in DialogicUtil.list_variables(vars):
suggestions[var_path] = {'value':var_path, 'editor_icon':["ClassList", "EditorIcons"]}
return suggestions
func _on_variable_editor_pressed():
var editor_manager := _editor_node.find_parent('EditorsManager')
if editor_manager:
editor_manager.open_editor(editor_manager.editors['Settings']['node'], true, 'VariablesEditor')