64 lines
1.9 KiB
GDScript
64 lines
1.9 KiB
GDScript
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
|