class_name Rulesets extends Object ## These rulesets are loaded from a file and return samples for the generator ## Different rulesets can have different file dimensions var _size: Vector2i = Vector2i.ZERO static func load_samples(filename: String) -> Array[PackedInt32Array]: var obj: Rulesets = Rulesets.new() var ruleset: PackedInt32Array = obj._load_ruleset_file(filename) var samples: Array[PackedInt32Array] = obj._parse_ruleset_to_samples(ruleset) return samples ## Read the png file, and parse it to a useable ruleset func _load_ruleset_file(filename: String) -> PackedInt32Array: var img: Image = Image.load_from_file(filename) img.decompress() _size = img.get_size() var png: PackedByteArray = img.get_data() var hex: PackedInt32Array = [] @warning_ignore("integer_division") var hex_size: int = (png.size() / 3) hex.resize(hex_size) for i in range(hex_size): #using RGB8 format var rgb8: int = (png[i * 3] << 16) | (png[i * 3 + 1] << 8) | (png[i * 3 + 2] << 0) match rgb8: #BUGFIX: remapped RGB to values the tilemap can handle 0x000000: hex[i] = 1 0xFF0000: hex[i] = 2 0x00FF00: hex[i] = 3 0x0000FF: hex[i] = 4 _: hex[i] = 1 return hex ## Convert the raw hexcodes to usable WFC samples func _parse_ruleset_to_samples(ruleset: PackedInt32Array) -> Array[PackedInt32Array]: #wrapped in a custom container type var samples: Set = Set.new() for x in range(1, _size.x-1): for y in range(1, _size.y-1): var sample: PackedInt32Array = [ ruleset[(y -1) * _size.x + (x -1)], ruleset[(y -1) * _size.x + (x )], ruleset[(y -1) * _size.x + (x +1)], ruleset[(y ) * _size.x + (x -1)], ruleset[(y ) * _size.x + (x )], ruleset[(y ) * _size.x + (x +1)], ruleset[(y +1) * _size.x + (x -1)], ruleset[(y +1) * _size.x + (x )], ruleset[(y +1) * _size.x + (x +1)], ] samples.add(sample) var result: Array[PackedInt32Array] = [] result.assign(samples.elements()) return result