From 60f4fe7e913475f83de5cc1e37a2b0bd29777152 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Thu, 8 Jan 2026 14:52:22 +1100 Subject: [PATCH] The tile result doesn't look right --- Set.gd | 247 +++++++++++++++++++++++++++++++++++++++ Set.gd.uid | 1 + assets/000000.png | Bin 0 -> 1789 bytes assets/000000.png.import | 40 +++++++ assets/0000FF.png | Bin 0 -> 3056 bytes assets/0000FF.png.import | 40 +++++++ assets/00FF00.png | Bin 0 -> 2652 bytes assets/00FF00.png.import | 40 +++++++ assets/FF0000.png | Bin 0 -> 2446 bytes assets/FF0000.png.import | 40 +++++++ atlas.png | Bin 0 -> 9430 bytes atlas.png.import | 40 +++++++ client.gd | 31 ++++- sample2.png | Bin 0 -> 4236 bytes sample2.png.import | 40 +++++++ scene.tscn | 36 +++++- 16 files changed, 549 insertions(+), 6 deletions(-) create mode 100644 Set.gd create mode 100644 Set.gd.uid create mode 100644 assets/000000.png create mode 100644 assets/000000.png.import create mode 100644 assets/0000FF.png create mode 100644 assets/0000FF.png.import create mode 100644 assets/00FF00.png create mode 100644 assets/00FF00.png.import create mode 100644 assets/FF0000.png create mode 100644 assets/FF0000.png.import create mode 100644 atlas.png create mode 100644 atlas.png.import create mode 100644 sample2.png create mode 100644 sample2.png.import diff --git a/Set.gd b/Set.gd new file mode 100644 index 0000000..fd9b5c2 --- /dev/null +++ b/Set.gd @@ -0,0 +1,247 @@ +class_name Set extends RefCounted +## A custom implementation of a set data structure in GDScript. +## +## Usage Example: +## [codeblock] +## var mySet = Set.new([1, 2, 3]) +## var otherSet = Set.new([2, 3, 4]) +## +## var differenceSet = mySet.difference(otherSet) +## print(differenceSet.elements()) # Output: [1] +## +## mySet.intersection_update(otherSet) +## print(mySet.elements()) # Output: [2, 3] +## [/codeblock] + + +var _set := {} + +## The constructor initializes the set with elements from the specified object, +## supporting various data types. Unsupported types trigger an assertion error. +func _init(obj: Variant = null) -> void: + match typeof(obj): + TYPE_ARRAY, TYPE_PACKED_BYTE_ARRAY, TYPE_PACKED_COLOR_ARRAY, \ + TYPE_PACKED_FLOAT32_ARRAY, TYPE_PACKED_FLOAT64_ARRAY, \ + TYPE_PACKED_INT32_ARRAY, TYPE_PACKED_INT64_ARRAY, \ + TYPE_PACKED_VECTOR2_ARRAY, TYPE_PACKED_VECTOR3_ARRAY, \ + TYPE_PACKED_STRING_ARRAY: + for element in obj: + add(element) + TYPE_NIL: pass + _: + assert(false, "Type %s unsupported for Set objects" % [typeof(obj)]) + +## Adds an [param element] to the set. +func add(element: Variant) -> void: + _set[element] = 0 + +## Clears all elements from the set. +func clear() -> void: + _set.clear() + +## Creates and returns a new [Set] containing the same elements as the current set. +func duplicate() -> Set: + var new_set := Set.new() + new_set._set = _set.duplicate() + return new_set + +# O(min(|self|, |set|)) +## Returns a new [Set] containing elements that are present in the current set +## but not in the provided [param set]. +func difference(set: Set) -> Set: + if set.hash() == self.hash(): + return Set.new() + var out := self.duplicate() + if set.size() > self.size(): + for element in self.elements(): + if set.has(element): + out.erase(element) + else: + for element in set.elements(): + out.erase(element) + return out + +# O(min(|self|, |set|)) +## Modifies the current [Set] to contain elements present in the current set\ +## but not in the provided [param set]. +func difference_update(set: Set) -> void: + if set.hash() == self.hash(): + self.clear() + return + if set.size() > self.size(): + for element in self.elements(): + if set.has(element): + self.erase(element) + else: + for element in set.elements(): + self.erase(element) + +# O(min(|self|, |set|)) +## Returns a new [Set] containing elements common to both the current set and +## the provided [param set]. +func intersection(set: Set) -> Set: + if set.hash() == self.hash(): + return duplicate() + var out := Set.new() + if set.size() > self.size(): + for element in self.elements(): + if set.has(element): + out.add(element) + else: + for element in set.elements(): + if self.has(element): + out.add(element) + return out + +# O(min(|self|, |set|)) +## Modifies the current set to contain only elements common to both the +## current set and the provided [param set]. +func intersection_update(set: Set) -> void: + if set.hash() == self.hash(): + return + var out := Set.new() + if set.size() > self.size(): + for element in self.elements(): + if set.has(element): + out.add(element) + else: + for element in set.elements(): + if self.has(element): + out.add(element) + self.clear() + self._set = out._set + +# O([1, min(|self|, |set|)]) +## Returns [code]true[/code] if the sets have no elements in common; +## otherwise, returns [code]false[/code]. +func isdisjoint(set: Set) -> bool: + if set.size() > self.size(): + for element in self.elements(): + if set.has(element): + return false + else: + for element in set.elements(): + if self.has(element): + return false + return true + +# O([1, |self|]) +## Returns [code]true[/code] if every element of the current set is present +## in the provided [param set]; otherwise, returns [code]false[/code]. +func issubset(set: Set) -> bool: + if set.size() < self.size(): + return false + else: + for element in self.elements(): + if !set.has(element): + return false + return true + +# O([1, |set|]) +## Returns [code]true[/code] if every element of the provided [param set] +## is present in the current set; otherwise, returns [code]false[/code]. +func issuperset(set: Set) -> bool: + if self.size() < set.size(): + return false + else: + for element in set.elements(): + if !self.has(element): + return false + return true + +# O(|self|) ? +## Removes and returns an arbitrary element from the set. +func pop() -> Variant: + assert(self.size() > 0) + var element = self.elements()[randi() % self.size()] + self.erase(element) + return element + +## Removes the specified [param element] from the set. +func erase(element: Variant) -> void: + _set.erase(element) + +# O(min(|self|, |set|)) +## Returns a new [Set] containing elements that are present in either +## the current set or the provided [param set], but not in both. +func symmetric_difference(set: Set) -> Set: + if set.hash() == self.hash(): + return Set.new() + if set.size() > self.size(): + var out := set.duplicate() + for element in self.elements(): + if set.has(element): + out.remove(element) + return out + else: + var out := self.duplicate() + for element in set.elements(): + if self.has(element): + out.remove(element) + return out + +# O(min(|self|, |set|)) +## Modifies the current set to contain elements that are present in either +## the current set or the provided [param set], but not in both. +func symmetric_difference_update(set: Set) -> void: + if set.size() > self.size(): + var temp := set.duplicate() + for element in self.elements(): + if temp.has(element): + temp.erase(element) + else: + temp.add(element) + self._set = temp._set + else: + for element in set.elements(): + if self.has(element): + self.erase(element) + else: + self.add(element) + +# O(min(|self|, |set|)) +## Returns a new [Set] containing all elements from both the current +## set and the provided [param set]. +func union(set: Set) -> Set: + if set.size() > self.size(): + var out := set.duplicate() + for element in self.elements(): + out.add(element) + return out + else: + var out := self.duplicate() + for element in set.elements(): + out.add(element) + return out + +# O(min(|self|, |set|)) +## Modifies the current set to contain all elements from both the current set +## and the provided [param set]. +func update(set: Set) -> void: + if set.size() > self.size(): + var temp := set.duplicate() + for element in self.elements(): + temp.add(element) + self._dict = temp._dict + else: + var temp := self.duplicate() + for element in set.elements(): + temp.add(element) + self._dict = temp.dict + +## Returns an [Array] containing all elements of the set. +func elements() -> Array: + return _set.keys() + +## Returns [code]true[/code] if the set contains the specified [param element]; +## otherwise, returns [code]false[/code]. +func has(element: Variant) -> bool: + return _set.has(element) + +## Returns the number of elements in the set. +func size() -> int: + return _set.size() + +## Returns a hash value for the set. +func hash() -> int: + return _set.hash() diff --git a/Set.gd.uid b/Set.gd.uid new file mode 100644 index 0000000..7d1c1c2 --- /dev/null +++ b/Set.gd.uid @@ -0,0 +1 @@ +uid://3jpsx0g5sg04 diff --git a/assets/000000.png b/assets/000000.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d4c451f7d975853a1f614367a37102f517f25f GIT binary patch literal 1789 zcmVpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H108(^C zSad^gaCvfRXJ~W)Lqi}zbaZlQVs&(BZ*DD9Xkl_?L2PMjWguvDbZ|N^FJp3LVRUJB zWn*t`ZEtRKE^l&YFKlUJWo~n2b1!0fEpuTnG%heN!&G7g000IoNklI0K~FtoJMZ`|%y`jV%mR zE!Nwwpo&^IGP7ue3FLrW1VLmVHR?^sKqCtxW^?HP(SrkNf>z^hq&~s)U#OKSR>(`q*@ zff{ua26a;<)E5ZQX8us4ky1<*Io`v0<$d7QGsBIG-bu&TP z5I#SjXAbDxje(5CT6au>o2X9^TTS&v?*ZwuO!ubu2Yp@izK}&`!4aJ#Ms7pw{{EGK zllp#w4I-1MLWT&PCu10-phEO@vFihDR$zQ>`uaYUv#Hx{QYfezmW09DU+R78k0%lF zRL5tH4FaRdo@UK9lmoi4G&Iy6(5W}E?yUR!048%zZ=V!z`g)AC;upo97C;2H(B3#i z1TQV&Xo0wJ!(I;{SjOx#!-(StMBzx*?Hw`+8*1Se?gx^PL}t87 zwnoJ!oq8fW1~?q6ed%}v4n~NMxEzZkvdAjd+dJ$2KIU~!tlmhA?9G0B5RMmU*C2Gn zWa#B1p$X2TVvvS?7?BBj9{QX7J?QJAB(x#p1OT8G7Kky9 z(s;sjNh7~H`Y!tw{b%u$tQ&d1vu<~?YC0a9h(Z#$i0JdI7zZ)S9(ir|^Z`c`(l>~U zs$xGy35_zGv_Au>EMhGx3bF=I$1a|+#+Q=WkO$9es4_3@o<6SkK8un*s2zvwiCage zKS@Yr&OhC-YMjy{$kUwY^p1h2Ln9(sJ`oKN#lAks8dr-*>Zn?t{=kRV*3%P?47AW{ z+*2|~LgY}=M~r*|LEy%dfkC9dIGg+cO}(U1w%&X}^^x9ZKWHIs;tFz&du43<|D%idMr}h!`(jZ&t8ZWU5Ws-Gz$QY;9zNS5oq5RPBpffU0?s6nJi@dFa zgXwr95}4XW6&ZyCGV0l#p0AUwsoP}uX-G3%3>XcINb-Iot~UaaTaYoEiI)_&CPP(g z+N*VkoQcUKiD``yMPH*E*1?yLogbmi$#hh(vWmRjsrPsMA#xx0I>4$d`U$##s70+e z@^&X{QB{Yg5Zbt!y^FX$PJ`M{p1kxSDo+r_iY%h$;t9e8dS9>~G0`f{<1eJH{w#H~`k&&MR%CqmUMH-YE zxz#aBd*%##TJyM_#)WB0`??6-Sourxe#WXE+GI@z)_sxpx7j4~%Sbk}!c$&5nw6W2 z2jmf;){{2_-W=PO#M;-zKmPisNvC>*MLMXSnSo3myU6eB6;Nc%FcbXGbUbC5L%n>1 f{~P&Vqh0V{l|;1h4F$w`00000NkvXXu0mjfv+zhb literal 0 HcmV?d00001 diff --git a/assets/000000.png.import b/assets/000000.png.import new file mode 100644 index 0000000..0d6f560 --- /dev/null +++ b/assets/000000.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjq048nw8wfx0" +path="res://.godot/imported/000000.png-162664b104f1a282020c995db036c82d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/000000.png" +dest_files=["res://.godot/imported/000000.png-162664b104f1a282020c995db036c82d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/0000FF.png b/assets/0000FF.png new file mode 100644 index 0000000000000000000000000000000000000000..d90f5ef7ba5d9c17d6f52bc9771a0270797680f5 GIT binary patch literal 3056 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 KMNUMnLSTZOZtyt( literal 0 HcmV?d00001 diff --git a/assets/00FF00.png.import b/assets/00FF00.png.import new file mode 100644 index 0000000..e595bb4 --- /dev/null +++ b/assets/00FF00.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb1o41y5ceeqx" +path="res://.godot/imported/00FF00.png-83ab8a7d931629d22b3867042271f361.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/00FF00.png" +dest_files=["res://.godot/imported/00FF00.png-83ab8a7d931629d22b3867042271f361.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/FF0000.png b/assets/FF0000.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea4e549836b1dbaf8b7d66f39257c18779bad86 GIT binary patch literal 2446 zcmV;9332v`P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H108(^C zSad^gaCvfRXJ~W)Lqi}zbaZlQVs&(BZ*DD9Xkl_?L2PMjWguvDbZ|N^FJp3LVRUJB zWn*t`ZEtRKE^l&YFKlUJWo~n2b1!0fEpuTnG%heN!&G7g000QRNklL>q;7o{`mz^@{)eum2tb zI9~_KaYo;Hy2b;7GMb`D@DX|!NUSCVp>skpvV6Gdc)gcl&G7!~wWE)a#)wH2Ws=af z4%bBHr6$c3jSDPX;B2+z?&kI}14(9RYR5E%-H8GeO)vbitQd_mKHRiu1yLX`Q$zw; zVfgEHgCZgV#u{AjNO3gEfPzc{M|%mAa)Q-{b+aLlYyNb0Ls}+}0W^)HFtA%1Ceh=g z=l1rDq;b4Ejf^KLeIMxR4s8viaYo+-+PWvz&_yUGDbhHSndQ@cM7-y_I7$6U}1Ll34{ZzzG6dUSo`eC>Sk|0i>zsdhH0o z^Xc-0)7x_dVOa%KqUrmHL?B5RO;Qr0SalIW@WB(K;02Tj`;&ykC^mg0#K3a1+-^bP zf@is25u?yMd1Rp4bOeOcWgv@SG~BEmA8#GjC}tMsQ;iRBxo+u1ktCKM&sxT*=B^Hm zW;tya`0>1Bwv)5DZ;2vYEU#JB6$I^VG~TC-|A9~X|vEXPN%p{L(;?2QbaQrz9Qs41hUK$ohS94cI82! z9A~suN92hLE*6&ntlNN?0S+hNgK&MfAcV+h3*pUbkk!R~PYe)(@cz2vH_tQH&ERgG zi<~Zc4(AEKJ}xNooVM@iT;P8{tcg*myZ9J@Aly}+pKn^C3#{)OMw5(p7cJi$6)e_E z7V8H+L+c{fRYWVn8gR<+{YgWSYJ3p72&2OA)w7IO2QL|A1ui(=pa0C4^Mnrz$H$xQ zk%6}tE!T};tm50FoKd1sC~TSW{Yk^J@2gMMWA{}4oKhn*FP zg508t1Q#M=1>1LQ8bA0=cp}3X1DiImsT^K3?=CuiwVx71_{&vKAB0(OR8CW%5D|O~ zSZz`2=}@ik!Eet7Gi#cj-~xgo0!j;B6wPqkz`*&P{1AAUm&+-+6>G)}1No`VAZ@FM4T&y%4qxJYz?)5Q}XxNRdl zJ0;87(KsPV6u}F7x#qA09URJlF$yPw3&QPs$<_TWK14v#xSmf}C%E8nQSecrV;lw) zn~*1(ajJ$)L_wP;?RY1N+*Un#nNm!1HtUXW4>RWD5vfht-`sJ%_FPpx<4Mlj^Oo<9 zb8hZ$xw*eZD@ByYQoK8F8BKHQ&9KXd1{I>93}~m=&7YLucrWAYgOqyRqO~G7L-#s< zcEsWC0poJa{=^bpAc_!`;{ShXXtra`!^@jK@~4kARVP&Ij)>;{WlQIT^E<~~9kC(u zVmIOI;}?$^c)9llA1_Wgo?Cuiw2bXQwQ~-YD0>}xf(K-WQNdrTojZD&I?V~v#MLh#XzC@M}MCG4eGZYw!wofH~;_u M07*qoM6N<$f}ekfP5=M^ literal 0 HcmV?d00001 diff --git a/assets/FF0000.png.import b/assets/FF0000.png.import new file mode 100644 index 0000000..b8ea5c7 --- /dev/null +++ b/assets/FF0000.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://e6snlurkc6d0" +path="res://.godot/imported/FF0000.png-4337ff1c8f0050e96b3bf6805173b9c7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/FF0000.png" +dest_files=["res://.godot/imported/FF0000.png-4337ff1c8f0050e96b3bf6805173b9c7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/atlas.png b/atlas.png new file mode 100644 index 0000000000000000000000000000000000000000..31533ea3ffd552b6f7f4d41df57f2cbb2a5044a6 GIT binary patch literal 9430 zcmV;{Bq`g8P)PyA07*naRCt{2yZMu3*LC0dx%a*;_pE*Cs_K0M&3k%yDGEt-FNeybH3+$zUMsg?DNlB355|DVl zkB|xr2qECX&l!V|(!IuFbcW6{um)=lSOM6B^RNgZvHOesx8uLs;bAQ={KzknCVi|) z$+QMzu*M>lzzBu%Jd6@x!3qJ!8Pgbp6~Yfj~&M-Q|Y7NF>jRmRjynr~7 zT)y-tAmD%hl`pW`N(l=-o{|{jJWC1~_G6Ar1fvZvHxd#pSQ=A!N*sI>Yq`Ihpb7yx zHN;6q7%ES zi2^&lHm43PaQ@^;u<*UN-l5g&Q7%R_bqiBXuqhPVRXk77?DTp3^f68?9U}}v21$o+ zUVMvTnov*$lAcC+5PA{k&z$6M{~v!F4zu)A4Z{818iTbdCQUIq!=!Qkp1W~LYVo{TgcMk7S?_3y<&Y%KhzA+qkf%`a z$qXc^#`h#zTjJDGD0$r3i8(S6;wiV6?M_N!ATS2y3yQu^JWNRkhOwd~2nB;w(?~UI z?IwFWyCd7G&OMCrFccuFB0}$DmUqY|Mn-33{2tZ%P0l}@637XR(F|=$d%Qz$ej5aI zHpkexeiT!mLn?)}me!z0YtS2A;mG_U%H@c}bXeVtsF#a;=2K@_+i0`4(PXF5VSBs9 ziG_KlC&#FddA$DiHLecsQ0~_F#h-qb;ZU=^)#ujzjeO4rfj}lcU-;}}%uH73^%H*Q zk6+`(XU|gf>ka{w=cBE`m=q%<+NM|xHq!`^l3|cokX{}U4@R9sfcAh9erdz8u{cXozI2RuZ@0Bbd2 zL2-L~fWSGH@)T*35|AU4G{(V~th*Fb;}&Iu4;jZ1+h&4|QZ&OO{`DxARJ(x*0t-ChGj<`C1Qq(UMEXrt*2 z2ejI4Xx+fBMoT`h%3Q$|S2RU817q@e6Z&Syvam?A+2;AD z&hX)Ht@HS&kCJB4>nO(RQ&hJHynp2uLRy6J_|fN|Kxjp)H3VTeG&PRzA0U{AR2U(! zUVt?j8(Z7xEW>0e0uY{$^nE;3U#bjhAV|RBAe~@y0)ljYkB#9>O$4F06Du*PoX4p>%B*X@a zl>j?P@oOIUTLznDoLeYR(DM{^3OZp-Ng8pN)3Xs5Z*@loc%*ckuIaO@8Z;MPrm$e> zZC6=&=L~7_6fz3=&kwtOhi88B9jfX${jAL^*H;*?`i#{iEB$2vy4zLmzIhZmt)RK% z&Py}=&J~{gscT$%c@BWB-3_LvDoo_5Zh38&53enAXzCE}e|Vp#p86DFsA#nZy!*io z78a}g_E+BG+MNwvc=inOFe8pZ3CsPp4Sw!Rj|1>W|M5MPC@>tx6w8vU*EdO1&D?C6 zyZ0OddQvKM?!U$gkRAe!kOGrs2rW>`12o2p1M+4JNQt%9@qpa;!f1@v7^8D%&=_O# zNRkN8!wW-%rw~#CAO(ySB!TAi6f65kjueu5sm69|hg$If<{NRFJF6MBF~ve*ntOu{N>go) zJ^vopU!8$y`eVj7aYlW5nYq#!Sh%#Y%IftB=YCXhy>~wcN5S$B&m*VjAMhGbdpCLV zC$Dk7eiCp__}zEk=fx+_v(vPE7{oZ(;mzu%)!^f`5W38^gq z&u@N{NC)gw8;>e?^1yRxo>o=BZ63r(HN6qGUE_IYpl^Z)HwDa zr9yfkLi(;Sz&U`mZk;%Z>Dm;XY2qaQ*iH8%k1Oi~G8Cyc)FX)iq?81nL19UT8S@p% za%0HhG2ihmm%vAv%NT<;79|g=k5Ulec`?g(JZ|4DQ(c;%eq@*ROUIx%_FqIlolWMR zyu;OQ#+JX!hi^~v{0j+zEEAgqfZdyO=;C7j4fA7fi-jjHvzPUFbN55wFaSw3;2ZC~ zO=@FSqiu{8ym0(co`2#Yq^+^|b93BYzQ?h}Bc!@Ry zA%ElNKhN~|H2>uP{uV+Ao`3owGTY}5|Lk=ds)4tVVh#NEpT3Hhx)kUMA@Y*X8BAD% zv35iTtq>S3u}Wi%KnjZ<-BAlx=Ov%TYU4P7Ibi?R8doI^2#% zi~)jFXEZx)jB!MC|7d4DK5=A%>~IQ)@3MQh#-LH6vo(#FKi~@chbUB8zjTa47jCkZ z^ihSBrrD#}YaZ`z;3urc* zeD8NBD^!dzi`EG=U$` z8}#_qzxz}C@z>twwVg|-$fC21XC6Dl>puX`7>!O{w3|$$je#7-g$1KEN*Rn!Q3A|< zL|Ggo+IJS4JB+cIEX@rskxGnMvrr0@LI{CCxN;BZbz?M^)utvipd{>cQts}icuG+7 zV5}<1G;DT;#8%+@9v`j^DF>3hzNS=*7{;0p*JEn+h;D0$v6hYIHtl{7DFyxEfMJ%A zq=v*C7-nU-&Ti5~2u)@)YKM1e+?oR&V_IEgt?a7XBtuAnC{<_;o}~TK64R$YV)~&q z_EJ4s&ss>+%75WFNjk>WmtH`~6wmJi9RSW8n`hy0BHnp11_;`^sr)GHT?Yne`4K{ao_~^z8&piGR(lco7 z@#&{ebMY%zuwlaVSe@seKE<#926)zJ7r9xAvD)QwojF9X24Mv{P4ZeFgxbGz;sK!t zjLDn>Xbn;zm4jd@1v<+dc@zSnAm#mZKPCc5t#u`CnVjNiIO4~g1y#|s2Ff{E#}O8NI&k6jF6_5D;oo> zJpkv%-6_V8Y@+k1G?`@M`f0?WqtMt!?yL|Lx`fp(gJzXsd1lTF%wxl`kI4uCa%vWnxFB-w;&g})uCG!V)Oqg0Da3if@4oaZ!`T+gw&gw_ zfhi36-PgZEwKIk>maVNmrErX4S97n^Vri*Lq2zP)XpOJEvdOK@b&eh$=j_QjZrt4D z%}X~Ktbi9Hi-HK)q84c4 z%wV*o=E0G<5|v_w&Y(-2W_++Rpi~XHyfUO1ND7{yms&c53@a5&6~){6s=M3gXs=E% zb^Z#it#Q`gKZ^|}2-=rfdhR2p$0Y?7u{CU9Fx#I_d*w|>(-0SfV{@I@}RxR+t`A2yBy?cE7yH{wm zyBt0;!TwMU`#nRJPx&6J6LGmc7lIM9}q3Sj4 z&I%=Qi_%ns@?;AcX4p*9TA8G|vVidqLs;NJ54d$_i{ponfVHfxG+Y=pq(E!Ijays%%oiT#=?lk3YkzcgjsNe< zFY^mu_!QM@L>em|K6;Fetv%-e0*g&EbUMW73}G$G_Z@^AP|8&a!h$u~1NlDB|JaYo zrjq>}Z^3}YIP@^?oXmo<0PC!DAU%a04j446m{f7ScaICzGYBEr?hcp@ zCs~WPIr98vu6@0RojG~1&dxH&F1*XhB}qv|3{9DPgLUU)<2|fZY_86tg2KmIAfJ2T zG#}l#$I`+WvvVbWaPbE5WQU`{0*^hs1i;<9EsDW7XO7fanwg{1>(Fg$eBWnctU{(! z{>oqaG?h|`yLZ|gS}5WBiYW52S}^FxjE@!3nWSDF=aoNyJ+~KNvb=WJ8Nv(j!xCOt zz$=vqqB23Dj29K~!UEFs8MSnrw(ATuN*M-|W#}};=oFnM7@g()1xF^cBqmFfk=Jww zJv#l4J2y8>&JSt#+xw;mpcnViTBGwGlg=-_)!b%zdyS3e765w#O&EF@1S-oIwg+IL zSPn^z#XR6ts&fm~xrJ@q#ikh|Dv*{Q;>Ne1q>~QVNE!$PTf3UKUoR4=0I3W!XRl-1 zZhv-fo5SZW@$AV-PLvjy2`AV|_D0v(`tUG~?eoY|9jifi2cy5OuI*7NMttqtZ}Wfs z^RMt{Z~c&MhO`BA zego^ZB0|9Lef1)7qOl@Fr`lCjfM>B}naknqYyW=WeoB!?u|?!1;l8m=GCYt-A25;Y z4rU0cFnQ`A?*UlH7MsImCs=v2MfA)qW`l7)b$o`GI_qrQtWrO^!}#$Hwr;GG4Fl@+YdrH%g`x~u z?r(w=^t3Z_f49ok%EO3a6}DIL{T7o8TU^C)g5~8N&pvgS@$n+R_0^YIi?=DZs}ze) z8O$<^Z(YC%A^6rSZ}C6<^7EtpA6=T{%U`*~=Rfxp)>hPPSD9Yg0sBH|0%4HC_h5@ zAyWCMAVm2g%5&#gn|BW%Y$;%A_EK(d4Kb;v(;85!gk0YkVy&goX|lYt%GTbFYq+F_ z?VdpjL#QAXipwhlZf?a~T_19FE1^_S9GePRnpxz?^b*JCju85u6NrT1?#_YG^my$w zM@xtBJj1aU-(_m%ZOq;_A_{3Ymgsh&k+s=~8`KW(&|a%KN82l)Z3(Y)m#3a~DmH2@YDD#)-)Z`h{UZcr$GT$_jr9=pvB;O?yu8Yv}>W{K1y4{G(`$YDU85ceC1ONBYfFIT0>Yq(Dz^d;SNtd7V>cUIB)H3G4t>} zl$Wu2{{qzJS-*6Q4?cN~{f77C=`9*}W?8@bD9DhbkH5{a(js@dn_Rs(&U2q{u$JVC z;I(;l@i0Pwp+qtWP+mxy9YjE?2gI46SW+0{gERyc!Og8z{>|^a!igg@+`hj}zZ>)U z&pl1tx2&zVn4fcw`08u7IdOQ7POpVj2F;M){M~o?==LgY+Nc7k0u=jYzVwq%u)Wh` zIB=!0=NP)p37K;QC*ex4aulu7LWZjdqy!`OgWvrkr9=f0GKi3V=sJBlx=1g;m;{}s zC}S`gNbx`p_7!0$k<#PJ>X3e7h!VGURE=2cX|AkyK?o+t3sfqS_TG@CF`u!S;>Zu1 zy^Q;f0bwy95@4)hm?T6&NMIc{)At>|^foAbs zgLl5;a{T>tm0$mNU&Av#t9BikBfMV`cm*&m$&WvBj%uakDkdrU*}w2St!|U?+QewT z-Muz{@rzIKh0j0Eum9_BuwvHn%K}w$8CP4)@BQH$OpaG6Mef?t+FY5+l|P$n0wzt- z$q;lxmNR*a!LdRI`!=5fl2Rc&4GF#HVXMOJg3rUW`sM zj!lIuPR>&)7CAc?5%&|~)G|yA-Cn|}xsb7Pm4%5p3PFUgJnE$?M`jKaD8<>ih+b@1 zX{KncY4**OgqQ%gdmSlCkSDUYwqCMx7zHFI^?Ng|ED!PV8c;s z7p=ilu2X0Y0+|non0$6nVBLh6;}<~Sd6Ytp%`$?VTe=|?$J9%aLKH$QmXb+`Jjqmj zf>Afg0Xx3(sFiDE?FRLdM<)|}uri<$xej7GHUvcv+fPvsjFVXm?bUI%uP@Q)`q*$B z83mvO-f@A|7O{JavAJccC$_Oh(%l-Tvo%3lJi;(K!p0>{(l1h--@yXi?I}`!A)l#q zhxC0!xsL9K>|E~xEdV}$`jdR`@`sp-HgY}Wi!VGyy;|hrd$+j0caQn{I8sWcX9}z? zcL2lmY{0+!{Wm#(_89Y1laBmJL%HIvS1N^!m&@Gmba|wDf+wFi${&9HO-ulRS3>84 zo@eujbVSgQr7=>uuAUGQm8*JE3Mcm(JrZ^vJghbtPh+)98CFOT(v^fZ7lUl>2pF(> zG-Wf07}DfgZBny7TgmCmIFutf-pbh<}@_W(F~{1Ap%MwTzu;zUU~h}NC)vmuEf~~I(x<@U|ha7#wmMlE@Pk7>yZewUnLlm zAyR?#oO~>BO(AP7XeTs{&NVp83+DmGXu3m9x0jMx$@Ptxqmu#JT5fJ7B-&EbDZNxu z$RRK@8c%u%@gN@&WcdJzz@f}wkT~H3;r1mhnH3DO2X2&i4B1`g(8JfM%&k%MBKEQl z#u)DXphs_bjsgf*&|3-n1A#- z<=G}!!N%potgfDe$}}P>kFLMF+hb#`%c5T7^2!Pye6-2Q!^ha(+#~K6XQ;Lj+2b7MvI2n;~)KtKjZKH%8yg2L|AM2@Y)(LfA0f~&{z#Cs|`*bD^jo2 zxp8}&AN`TDNC~f91hu%h`1ebtS>mLL)+t$*jY>czRW9!2(Z4_ImpjXY#|Vsbn!P_N z=H>+SXwFb)v8yCR0j-^Ib9ix@Tbq53PlaU3kks?p?xbvWG%D~YgdY8&p;!utW6e~> z0}JKC$NTNt7}gtG7;9K>Wh9wlwkS9{8B#Au8a+d=mtZnOd!T9Vxl-uFLj#U~_8rd8 zPI0O<$80oCQHAU#E$WB2=-l?u!2-iwC?C1WbW|l2A)CE6!cR#%ivC~@;kkX;on>a1 zF7f22H~GZeJTt)rJ>AEj-o~Vs-u)2kmuTE`qhnq$!(aV{XPKLv;E6}ha^uzpZ@qV& zVlm?I+!QZ7^AJ;$MZWRv4_R6m=LZ*W@LOMg4Q(=(#-}kUeCLgic=z%>{`BSd_`wHP z*-CdA$RS=ubL-9yn;RVhUvc}+24nRCX<~T&&DU}X{(z|+lzmDeyZ{wOZZuqZIe{}H zV+-K~p%DtC87526X+oC9ZZITG!0LQBG7?r*J->Xg)2G9!@2Fj?{OJ)g*zlmp?Az*yu1 zx!EC@Wi8pl<{C(nY39Qz0FHk8eQ4dmlo#0i;0RlBli0-Edt(uR*+*|9JL}H)Tems$ z>_tBJRFSilqr^HTu_=$$PE+;@_yx`6>ATo=V|4w%Q^awKCyOMpWofC(ul$eCva+_p zqi4=wwa4j`vs}Hs#y|Ouuk-ugeU+gd^7sGV&+wPO@Erf^|MKGmCBZ$p!d}>fT7qAN z!i*&t6J)b})^{5ihCKf03Eux;lh@w3aH&DjnU&Gm7!3hVLsjHu@C(F;-W0X*LH`t5u9|8IE@l5`@a> zdn4qR|I%l%TCu&c%FIlaR>$=)BtjwsAK`@vFGMO2p`76{t`jJw90~nOc_`n<3kt|E zA}m$#ie-XA2^Ez<`6Ku@nQI2=G{NLg3XzjGAp|04;tLZYXJ!KWogq>RBIUYw3sdvV zjn7anmYJ-0nAGVIMhMi`K3!}>yqL6RA`7ZBXyT_A{ zp5={;_xY#4{vEQ^r`zA-5B}4ib62l0IZ@;v|LV{4w|?m-7z=A)JO+b=J9l^a$>%=F z-};50;&1%)=LlK_H^rZ$dA2LKeQ%qEg$iLY#qq%7{PXGV}gh@m}RJEAP zt3z(?W(XyC{BVhL^AXA#vLN8bPD(2iM1f$UqByy*#NyP{$N<_Hh$7m%i*&lsOgeP3 zK4T}gXstNSJWD(*0XC@9*(q_keTzXBqkK2p{M9cpZKm*~ z=hEQN=NG^5qx{KB7wN=XEU#^I_SiA9VZ>yu!r}59W^j<=yc0wI`2AP;KY!yZy!7h( z42s=Rx6l((A(S(Q&L@E+xM`g%K_hdhc8ww-oaiH^o60rXI-S^sVm?M@oC=t0eWS;y z0EuK@36jdg=#0pZh=LHi*JF3LM-zih6Yi{ifKrMy%P7KMVxzyE_D@Z&EwnVK%M)AVU?rSxo%fBQSHGFGYK zdj-N!(P(s;oGA0BXQFSq6jHwVGS~ z3}Y=5CB;T3VZ100G=m2WV2vT^Skf+}ojSw8_GoM?ZkOmaYM5vmv{N#NEV6c~>Ks5T zH&sy_gAA+;X{?fwzfN*KDxlSzyCf#Rg#rrkQS32 zG~I*|6#8WzI(~@djRtF*PK5HT(daZq7#~lTkwISSX@k`UsT=}$frku2XJjcKcqGhC z)9lN;T4+3(k&=MS1t4wM9~%f+2X>vqujo`!!w^e%3GK2az9MpE*M|R9rZJ zf^M(NI6ODU((F9 void: - var ruleset: PackedInt32Array = read_sample_ruleset("sample1.png") + var ruleset: PackedInt32Array = read_sample_ruleset("sample2.png") var samples: Array[PackedInt32Array] = parse_samples_from_ruleset(ruleset) - var c = wfc.generate_chunk_at(0,0,_chunks,samples) + var c: Chunk = wfc.generate_chunk_at(0,0,_chunks,samples) #TODO: build a visual layout for the results #TODO: handle the chunk-edges #print(ruleset) #print(samples) print(c.data) + draw_map_data(c) ## Read the png file, and parse it to a useable ruleset func read_sample_ruleset(filename: String) -> PackedInt32Array: @@ -43,7 +47,8 @@ func parse_samples_from_ruleset(ruleset: PackedInt32Array) -> Array[PackedInt32A const RULESET_WIDTH: int = 8 const RULESET_HEIGHT: int = 8 - var samples: Array[PackedInt32Array] = [] + #using a custom container type + var samples: Set = Set.new() for x in range(1, RULESET_WIDTH-1): for y in range(1, RULESET_HEIGHT-1): @@ -61,6 +66,22 @@ func parse_samples_from_ruleset(ruleset: PackedInt32Array) -> Array[PackedInt32A ruleset[(y +1) * RULESET_WIDTH + (x +1)], ] - samples.append(sample) + samples.add(sample) - return samples + var result: Array[PackedInt32Array] = [] + result.assign(samples.elements()) + return result + +func draw_map_data(chunk: Chunk) -> void: + #hacky + var fix = func(x) -> int: + match x: + 0x000000: return 0 + 0xFF0000: return 1 + 0x00FF00: return 2 + 0x0000FF: return 3 + _: return -1 + + for x in range(Chunk.CHUNK_WIDTH): + for y in range(Chunk.CHUNK_HEIGHT): + map.set_cell(Vector2i(x, y), fix.call(chunk.data[y * Chunk.CHUNK_WIDTH + x]), Vector2i.ZERO) diff --git a/sample2.png b/sample2.png new file mode 100644 index 0000000000000000000000000000000000000000..ed2261f544874364a6a5ed78803895810933745c GIT binary patch literal 4236 zcmeHKeQXnD7(X1cu{p#H25y4qEeZ(NyX#%s>t!8`wvGlmo2|m83+_JN>&~^k(q7ja zD5!{W>KLeeh&b?zuYkc16hS3KCJ~iE49<`6AsPb8oD&ow1by%J9Zk#<{cla$yZ8C{ zJeRE%PQ#>Di z4ogyzZKqb;(YPmT>5S>)i$@(EUP>MNbaU~1q3M>b%8BVeWjvcxH}5w=x)k1?c*S?+ z+ch_NPfn_i{)_%@YpVszP<=A(cKK~j)hAmUv?tstj?kNVAu>PTy zAI$zJFs9}1@)m4t`qU>_X-jF{8`$z)ncgjgM@KCgK6RiyLA(UZL6rgVPz>JjYYtfoufzrScy$MN)x&+q(Vd-L#(=iYhVcY90K z;(N|7@*=loJRw%dtEovo<&Q7hT*>m|E&A#uCpXwO=1vhgilbaTy-Hg zwBz1T`=VdRJ)U*tkhM)|ylt6xTJfV9*C&I4WsT$8xhc6;t@&bS)1Ji*RhjSIS^Y!B zjO;wA?Z#{A`$Dy2zb~I(#*V!BA$#~Bd*t1$xAT@?c<4O4BM1HChN^QDmh2e$+2UtT zoUJ)pP#w$Pz5C~yLla}~r9EAE^P5xlmaSMFn08%9=%T;A`fTpm`!AgNvgqKsv=y&a zzNS9B)Ls3u=j)$}Iz}a1+fO$CeswXj;7oi|>+Ws0!miU5*j*L=Ih?3QEWD%&z@kTD zu=0z*v`t=5HA_yee0jRTaiFcuQ`>PnpzE6PL*mQs_{A=O%xaqT^Jsa5aUWr zQ`9JGVDf^R)La+_^=MCik(l4#3m;8%vjF)ZbUsE<7LtfWi2fc4&07aSx)b_Gk3^Fi zV5uo`A6Wx(Gc;y7{S$%iy|@Fcdulh0p_Sjyc~miJr04UvFe5%EsiGor=Bv!gq(Ivx zoE2>}&H#bMopy@CX*(?mq{P^rJl_w>7fonbEWz*4NtI%S^j2XS{?fnCXm`)6f9Nf3&cZM=gOSzNGERtNw)L|~l`97rT1vVxs; zIAjw_61lt7c!Y=BsYLh?AY##wsW1rViUU3uX0?!gl0cZ(Wa!|+<|xsm-lqsE5m2u2 z2Ah<_?qC^)qU{t-T3K74(OeKuz)mzUDbhkSrpDM74i*E6<&8dt0Hz$)!nxys*VK4W zRl_dKNC`DOd)0n;oFrc3J-h}WC~38GB*l?zkYYH7K*Dg6!v9Vf(OocM%#5Cj3yHsRQfM0V8#2(ZO9qD*oP|X1Fzn{c7(4&t zr+Y8{#|RL5D9E7r9inT9u0b&{DC42-8lr1Z3=GP6sJs3%x-$E&Qy>ce1*PC+i6J(O zfETS1!t4@{dF4VbyZ0`EZzE%~Dia8jm1BH|A?wzUhr)Et=l7=nI4mQLWb2N>FS^el=air*{ literal 0 HcmV?d00001 diff --git a/sample2.png.import b/sample2.png.import new file mode 100644 index 0000000..495b4c3 --- /dev/null +++ b/sample2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnmlsw7rrerri" +path="res://.godot/imported/sample2.png-fea84afe5d2a3cb34a1787a71110f597.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sample2.png" +dest_files=["res://.godot/imported/sample2.png-fea84afe5d2a3cb34a1787a71110f597.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scene.tscn b/scene.tscn index 93fc410..5f88a96 100644 --- a/scene.tscn +++ b/scene.tscn @@ -1,7 +1,38 @@ -[gd_scene load_steps=3 format=3 uid="uid://d2g4ooi0x6ebo"] +[gd_scene load_steps=12 format=3 uid="uid://d2g4ooi0x6ebo"] [ext_resource type="Script" uid="uid://bf6phxhnvh0ul" path="res://wfc/generator.gd" id="1_ulcgi"] [ext_resource type="Script" uid="uid://jmttidfcknea" path="res://client.gd" id="2_nxogm"] +[ext_resource type="Texture2D" uid="uid://bjq048nw8wfx0" path="res://assets/000000.png" id="3_y2354"] +[ext_resource type="Texture2D" uid="uid://e6snlurkc6d0" path="res://assets/FF0000.png" id="4_ni31j"] +[ext_resource type="Texture2D" uid="uid://bb1o41y5ceeqx" path="res://assets/00FF00.png" id="5_xlvrw"] +[ext_resource type="Texture2D" uid="uid://dicgy2r4tfods" path="res://assets/0000FF.png" id="6_73fnb"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_5juve"] +texture = ExtResource("3_y2354") +texture_region_size = Vector2i(32, 32) +0:0/0 = 0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_fy5k1"] +texture = ExtResource("4_ni31j") +texture_region_size = Vector2i(32, 32) +0:0/0 = 0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_5c1cw"] +texture = ExtResource("5_xlvrw") +texture_region_size = Vector2i(32, 32) +0:0/0 = 0 + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_akxrc"] +texture = ExtResource("6_73fnb") +texture_region_size = Vector2i(32, 32) +0:0/0 = 0 + +[sub_resource type="TileSet" id="TileSet_gu47o"] +tile_size = Vector2i(32, 32) +sources/0 = SubResource("TileSetAtlasSource_5juve") +sources/1 = SubResource("TileSetAtlasSource_fy5k1") +sources/2 = SubResource("TileSetAtlasSource_5c1cw") +sources/3 = SubResource("TileSetAtlasSource_akxrc") [node name="Scene" type="Node2D"] @@ -10,3 +41,6 @@ script = ExtResource("1_ulcgi") [node name="Client" type="Node" parent="."] script = ExtResource("2_nxogm") + +[node name="TileMapLayer" type="TileMapLayer" parent="."] +tile_set = SubResource("TileSet_gu47o")