small racing game im working on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
extends Button
class_name EditorMarshalling

@onready var editor: TrackEditor = owner

func _pressed() -> void:
	var enc := EditorMarshalling.td2s(editor.get_trackdata())
	print_rich("exporting to `[code]%s[/code]`" % enc) # for funny clipboard shenanigans
	DisplayServer.clipboard_set(enc)

static func td2s(td: TrackResource) -> String:
	var buf := var_to_bytes(td.to_d())
	var buf_c := buf.compress(FileAccess.COMPRESSION_DEFLATE)
	return "%s|%s" % [Marshalls.raw_to_base64(buf_c), String.num_uint64(buf.size(), 16)]

static func s2td(s: String) -> TrackResource:
	var split := s.lstrip('`').rstrip('`').strip_edges().split("|", false, 1)
	if not split.size() || split[0].length() < 80 || split[0].length() % 4 != 0 || EditorMarshalling.contains(split[0], " \n\t\r"):
		return null
	var buf := Marshalls.base64_to_raw(split[0])
	if buf.size() < 100:
		return
	var decompressed: PackedByteArray = []
	if split.size() > 1 and split[1].length() < 20 and split[1].hex_to_int() > 0:
		decompressed = buf.decompress(split[1].hex_to_int(), FileAccess.COMPRESSION_DEFLATE)
	else: # size unknown!
		decompressed = buf.decompress_dynamic(51200, FileAccess.COMPRESSION_DEFLATE)
	if decompressed.size() < 4:
		return null
	var d = bytes_to_var(decompressed)
	if d is Dictionary:
		return TrackResource.from_d(d)
	return null

static func contains(s: String, chars: String) -> bool:
	for c in chars:
		if s.contains(c):
			return true
	return false