# Note: The code might not be as pretty it could be, since it's written # in a way that maximizes performance. Methods are inlined and loops are avoided. extends Node const BYTE_MASK: int = 0b11111111 static func uuidbin(): randomize() # 16 random bytes with the bytes on index 6 and 8 modified return [ randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, ((randi() & BYTE_MASK) & 0x0f) | 0x40, randi() & BYTE_MASK, ((randi() & BYTE_MASK) & 0x3f) | 0x80, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, randi() & BYTE_MASK, ] static func uuidbinrng(rng: RandomNumberGenerator): rng.randomize() return [ rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, ((rng.randi() & BYTE_MASK) & 0x0f) | 0x40, rng.randi() & BYTE_MASK, ((rng.randi() & BYTE_MASK) & 0x3f) | 0x80, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, rng.randi() & BYTE_MASK, ] static func v4(): # 16 random bytes with the bytes on index 6 and 8 modified var b = uuidbin() return ( "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" % [ # low b[0], b[1], b[2], b[3], # mid b[4], b[5], # hi b[6], b[7], # clock b[8], b[9], # clock b[10], b[11], b[12], b[13], b[14], b[15] ] ) static func v4_rng(rng: RandomNumberGenerator): # 16 random bytes with the bytes on index 6 and 8 modified var b = uuidbinrng(rng) return ( "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" % [ # low b[0], b[1], b[2], b[3], # mid b[4], b[5], # hi b[6], b[7], # clock b[8], b[9], # clock b[10], b[11], b[12], b[13], b[14], b[15] ] ) var _uuid: Array func _init(rng := RandomNumberGenerator.new()) -> void: _uuid = uuidbinrng(rng) func as_array() -> Array: return _uuid.duplicate() func as_dict(big_endian := true) -> Dictionary: if big_endian: return { "low": (_uuid[0] << 24) + (_uuid[1] << 16) + (_uuid[2] << 8) + _uuid[3], "mid": (_uuid[4] << 8) + _uuid[5], "hi": (_uuid[6] << 8) + _uuid[7], "clock": (_uuid[8] << 8) + _uuid[9], "node": ( (_uuid[10] << 40) + (_uuid[11] << 32) + (_uuid[12] << 24) + (_uuid[13] << 16) + (_uuid[14] << 8) + _uuid[15] ) } else: return { "low": _uuid[0] + (_uuid[1] << 8) + (_uuid[2] << 16) + (_uuid[3] << 24), "mid": _uuid[4] + (_uuid[5] << 8), "hi": _uuid[6] + (_uuid[7] << 8), "clock": _uuid[8] + (_uuid[9] << 8), "node": ( _uuid[10] + (_uuid[11] << 8) + (_uuid[12] << 16) + (_uuid[13] << 24) + (_uuid[14] << 32) + (_uuid[15] << 40) ) } func as_string() -> String: return ( "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" % [ # low _uuid[0], _uuid[1], _uuid[2], _uuid[3], # mid _uuid[4], _uuid[5], # hi _uuid[6], _uuid[7], # clock _uuid[8], _uuid[9], # node _uuid[10], _uuid[11], _uuid[12], _uuid[13], _uuid[14], _uuid[15] ] ) func is_equal(other) -> bool: # Godot Engine compares Array recursively # There's no need for custom comparison here. return _uuid == other._uuid 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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
extends Node

const kALL_PAINTINGS = [
	"arrows",
	"beach",
	"bg_bg1",
	"bg_bg2",
	"bg_bg3",
	"bg_bg4",
	"bg_bg5",
	"bg_bg6",
	"bg_bg7",
	"bg_bg8",
	"bg_bookshelf",
	"bg_candle",
	"bg_colin",
	"bg_cooking",
	"bg_egg",
	"bg_fish",
	"bg_fourth",
	"bg_gene",
	"bg_knight",
	"bg_margret",
	"bg_nose",
	"bg_pearson",
	"bg_scorpion",
	"bg_stakeout",
	"bg_waves",
	"blueman",
	"boxes",
	"catlike",
	"cherry",
	"clock",
	"colors",
	"crep",
	"crown",
	"egg",
	"eight",
	"electrons",
	"emmy",
	"ether",
	"eyes",
	"eyesyellow",
	"flower",
	"fruitbowl",
	"garden",
	"gardenexploded",
	"hatkirby",
	"hatman",
	"hi",
	"hi_solved",
	"icy",
	"ig_note",
	"ig_rose",
	"kiwi",
	"knot",
	"map",
	"maze",
	"mittens",
	"ninjonicx",
	"ninjonicx_square",
	"noka",
	"ntwiles",
	"owl",
	"panda",
	"pattern_gold",
	"pattern_gray",
	"pattern_icely",
	"pattern_purple",
	"pattern_solar",
	"pencil",
	"rainbow",
	"redman",
	"rever",
	"rm_tower",
	"rubrica",
	"samswine",
	"smile",
	"smile_red",
	"snowman",
	"symmetry",
	"symmetry_2",
	"taiji",
	"tree",
	"undalevein",
	"yinyang",
	"zombie"
]