# 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"
]