simple_state.gd
· 1.7 KiB · GDScript3
Sin formato
Playground
extends Node
class_name _SimpleState
signal state_changed(name, state)
var state := { }
func register(state_name: String, inital_state: Dictionary = {}) -> void:
state[state_name] = inital_state
func replace(state_name: String, new_state: Dictionary) -> void:
state[state_name] = new_state.duplicate(true)
emit_signal("state_changed", state_name, state)
func update(state_name: String, new_state: Dictionary) -> void:
state[state_name] = _SimpleState.merge(get_state(state_name), new_state)
emit_signal("state_changed", state_name, state)
func update_deep(state_name: String, new_state: Dictionary) -> void:
state[state_name] = _SimpleState.merge_deep(get_state(state_name), new_state)
emit_signal("state_changed", state_name, state)
func update_mut(state_name: String, new_state: Dictionary) -> void:
_SimpleState.copy_to(state[state_name], new_state)
emit_signal("state_changed")
func _on_update_state(data: Dictionary) -> void:
update(data.state_name, data.state)
func get_state(state_name: String) -> Dictionary:
return state[state_name].duplicate()
static func copy_to(a: Dictionary, b: Dictionary) -> void:
for key in b:
a[key] = b[key]
static func copy_to_deep(a: Dictionary, b: Dictionary) -> void:
for k in b:
if process_recursively(a, b, k):
copy_to_deep(a[k], b[k])
else:
a[k] = b[k]
static func process_recursively(a, b, k) -> bool:
return a.has(k) and a[k] is Dictionary and b[k] is Dictionary
static func merge(a: Dictionary, b: Dictionary) -> Dictionary:
var c := a.duplicate(true)
copy_to(c, b)
return c
static func merge_deep(a: Dictionary, b: Dictionary) -> Dictionary:
var c := a.duplicate(true)
copy_to_deep(c, b)
return c
| 1 | extends Node |
| 2 | class_name _SimpleState |
| 3 | |
| 4 | signal state_changed(name, state) |
| 5 | |
| 6 | var state := { } |
| 7 | |
| 8 | |
| 9 | func register(state_name: String, inital_state: Dictionary = {}) -> void: |
| 10 | state[state_name] = inital_state |
| 11 | |
| 12 | |
| 13 | func replace(state_name: String, new_state: Dictionary) -> void: |
| 14 | state[state_name] = new_state.duplicate(true) |
| 15 | emit_signal("state_changed", state_name, state) |
| 16 | |
| 17 | |
| 18 | func update(state_name: String, new_state: Dictionary) -> void: |
| 19 | state[state_name] = _SimpleState.merge(get_state(state_name), new_state) |
| 20 | emit_signal("state_changed", state_name, state) |
| 21 | |
| 22 | |
| 23 | func update_deep(state_name: String, new_state: Dictionary) -> void: |
| 24 | state[state_name] = _SimpleState.merge_deep(get_state(state_name), new_state) |
| 25 | emit_signal("state_changed", state_name, state) |
| 26 | |
| 27 | |
| 28 | func update_mut(state_name: String, new_state: Dictionary) -> void: |
| 29 | _SimpleState.copy_to(state[state_name], new_state) |
| 30 | emit_signal("state_changed") |
| 31 | |
| 32 | |
| 33 | func _on_update_state(data: Dictionary) -> void: |
| 34 | update(data.state_name, data.state) |
| 35 | |
| 36 | |
| 37 | func get_state(state_name: String) -> Dictionary: |
| 38 | return state[state_name].duplicate() |
| 39 | |
| 40 | |
| 41 | static func copy_to(a: Dictionary, b: Dictionary) -> void: |
| 42 | for key in b: |
| 43 | a[key] = b[key] |
| 44 | |
| 45 | |
| 46 | |
| 47 | static func copy_to_deep(a: Dictionary, b: Dictionary) -> void: |
| 48 | for k in b: |
| 49 | if process_recursively(a, b, k): |
| 50 | copy_to_deep(a[k], b[k]) |
| 51 | else: |
| 52 | a[k] = b[k] |
| 53 | |
| 54 | |
| 55 | static func process_recursively(a, b, k) -> bool: |
| 56 | return a.has(k) and a[k] is Dictionary and b[k] is Dictionary |
| 57 | |
| 58 | static func merge(a: Dictionary, b: Dictionary) -> Dictionary: |
| 59 | var c := a.duplicate(true) |
| 60 | copy_to(c, b) |
| 61 | return c |
| 62 | |
| 63 | |
| 64 | static func merge_deep(a: Dictionary, b: Dictionary) -> Dictionary: |
| 65 | var c := a.duplicate(true) |
| 66 | copy_to_deep(c, b) |
| 67 | return c |
| 68 |