From b246648099bdab0eff0313fc1b506df4df3a3741 Mon Sep 17 00:00:00 2001 From: csd4ni3l Date: Thu, 6 Nov 2025 20:17:23 +0100 Subject: [PATCH] Add corner textures, and redo the folder layout. Doesnt work yet though. --- .../connected_lines/corner/left_bottom.png | Bin 0 -> 1178 bytes .../connected_lines/corner/left_top.png | Bin 0 -> 1124 bytes .../connected_lines/corner/right_bottom.png | Bin 0 -> 1169 bytes .../connected_lines/corner/right_top.png | Bin 0 -> 1154 bytes .../graphics/connected_lines/horizontal.png | Bin 170 -> 0 bytes .../connected_lines/line/horizontal.png | Bin 0 -> 203 bytes .../connected_lines/line/vertical.png | Bin 0 -> 187 bytes assets/graphics/connected_lines/vertical.png | Bin 163 -> 0 bytes .../unconnected_lines/corner/left_bottom.png | Bin 0 -> 1144 bytes .../unconnected_lines/corner/left_top.png | Bin 0 -> 1063 bytes .../unconnected_lines/corner/right_bottom.png | Bin 0 -> 1105 bytes .../unconnected_lines/corner/right_top.png | Bin 0 -> 1093 bytes .../graphics/unconnected_lines/horizontal.png | Bin 158 -> 0 bytes .../unconnected_lines/line/horizontal.png | Bin 0 -> 191 bytes .../unconnected_lines/line/vertical.png | Bin 0 -> 181 bytes .../graphics/unconnected_lines/vertical.png | Bin 159 -> 0 bytes game/play.py | 16 +++- game/power_line.py | 83 +++++++++++++++--- utils/preload.py | 16 +++- 19 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 assets/graphics/connected_lines/corner/left_bottom.png create mode 100644 assets/graphics/connected_lines/corner/left_top.png create mode 100644 assets/graphics/connected_lines/corner/right_bottom.png create mode 100644 assets/graphics/connected_lines/corner/right_top.png delete mode 100644 assets/graphics/connected_lines/horizontal.png create mode 100644 assets/graphics/connected_lines/line/horizontal.png create mode 100644 assets/graphics/connected_lines/line/vertical.png delete mode 100644 assets/graphics/connected_lines/vertical.png create mode 100644 assets/graphics/unconnected_lines/corner/left_bottom.png create mode 100644 assets/graphics/unconnected_lines/corner/left_top.png create mode 100644 assets/graphics/unconnected_lines/corner/right_bottom.png create mode 100644 assets/graphics/unconnected_lines/corner/right_top.png delete mode 100644 assets/graphics/unconnected_lines/horizontal.png create mode 100644 assets/graphics/unconnected_lines/line/horizontal.png create mode 100644 assets/graphics/unconnected_lines/line/vertical.png delete mode 100644 assets/graphics/unconnected_lines/vertical.png diff --git a/assets/graphics/connected_lines/corner/left_bottom.png b/assets/graphics/connected_lines/corner/left_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..6bfef33ba5c179565f15333488777ae82f95dddc GIT binary patch literal 1178 zcmV;L1ZDe)P)000DGNkln{H0^pob zingtqrY>GJ&C+!fQ3}>kYcs%@WZNnLh&<@JiAV_H0lH`*0Hx@GT#rVC^f^S^z?LrP3=N03e$!%d!{X2!fUZa86{IRVo?Ii6k)q z=nC(DEsys`mPNf3=#T6d99r-OS}mwymBH005vA8;y9e znD;*!9{wpFH$_DSU_THmhlq0$i#erI-f?1-A|g$ts>8!erWvP{o!ovq02IaD-u|#y z%oD=J@osEvvAg??=P4&Iq?Q9fGYN&lsAXxCBIm>~>f__z1=0y^0#Fopd%LGl7!?sC z(p;`|?b^>`JvfQ+b^rhXBGvUqq40U7k`eQib22gUIFqS}v>e-Vn*gABIDPbJk}(OI z8^YAof~Hxns~nr5eE{MpvA*8_t}D;a&%Auu?=u)ieQIi9a`Ib6 zaqD&Ch_@Ia0002zRF*x@lji1bl}ewAvO%PrlaZ09ckg~ZGV+u$xzUJ=+l@ntinQor z>nIXIJ5FqDZ1LvJ@5M<8ng{Q4`RvltXUofXz zwQbe1G{&S(0T7}T9Vg~_ayGk}&;OFkJxe6^#8-ku{N~_v>MQ^N5S8sXG1pbjocU{D z;P;`SmA<}ppX8u8Cvy8kJX~VqQ4}{8b1X|M7OxhISCh$FI=z+6Zua)RN~LxZi9J=d zRn?{xI}SidU{H$jcmn_|OMCHRV0Cqn5H8D}s@jU;#N%e?0{HUlUR7<;$D9+-lU-NY z-%kK^UJ3o5{`+5v7*nSP;9v4#!Z`~Cs0bizMF3$d0tj0XK-h`^!d3(jwjzMA6#;~; s2q0`l0AVWv2wM?A*opwc)~N^h8$^#J)}RanssI2007*qoM6N<$f^eTF0RR91 literal 0 HcmV?d00001 diff --git a/assets/graphics/connected_lines/corner/left_top.png b/assets/graphics/connected_lines/corner/left_top.png new file mode 100644 index 0000000000000000000000000000000000000000..1be071beab3688a6a84ef0e01702c4c5a32ded26 GIT binary patch literal 1124 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 UvNf_#OaK4?07*qoM6N<$f)RQodjJ3c literal 0 HcmV?d00001 diff --git a/assets/graphics/connected_lines/horizontal.png b/assets/graphics/connected_lines/horizontal.png deleted file mode 100644 index 7056e7ef2424b2dd799f4272b245f62c3b51566f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMLQfaRkcv5PFJ9zqFc4vJR2Gxd zzOMAi(B{U<2h*af-)C=%=C=rK2*U}@>=J6{&nrm#!_1m-{&(KqhbMlpb6vm%kFo!; Xj$&O}PAxugcl$FZY?B7o>x3MVaqaT>ACjMd_eZ_K!Zv&%|lKRQ?}~)*b?R UukZUL16{}9>FVdQ&MBb@02v)f8vpKY0+8Gy4 zVC!{saS`a(3~=~tD0m}ne#7pYFZSl&&v?7)>$#o|na6WJYdk&KvsM51t)2fR9gG{& o7|t@xVl-jSV7tJxfMkKV_iOnWB=@-P2fBvA)78&qol`;+03&ffUjP6A literal 0 HcmV?d00001 diff --git a/assets/graphics/connected_lines/vertical.png b/assets/graphics/connected_lines/vertical.png deleted file mode 100644 index 681597d002edbd3df06085bff42f286533491437..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMEKe85kcv5P&uzopr E0Bz7T-~a#s diff --git a/assets/graphics/unconnected_lines/corner/left_bottom.png b/assets/graphics/unconnected_lines/corner/left_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..b3734ce86f372ed58d1004dcd5d3f062d4666817 GIT binary patch literal 1144 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 literal 0 HcmV?d00001 diff --git a/assets/graphics/unconnected_lines/corner/right_bottom.png b/assets/graphics/unconnected_lines/corner/right_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..34f7fc38ec3cfb73f891457c600ea629d2311cce GIT binary patch literal 1105 zcmV-X1g`suP)000CSNkl*r2!!XrBu_jTCIkUilTVEUdEV(y?nvq89)QN zuH&QI?UrR(2w`n6zx8P0e+eO6F4xD$2j`qp3IINz&*SlM&YKrV*3Uq(Si}YZgu~%Z zngIY1Lfqfqn~$+rtdo)$6QEEi001sTu~^Jpk(z{M280l9xBKz&u~aG%LOADMuQw8j z)a&)8PJ)#NBuUEUa+t~hFgQ3E3WXYtMrRnHlvXO0Y&Hu3n6;y$qnOG~#hMN{=N^wI zm&?7rzEVmVV~V0A5(!<`J0poP=ub~iu?+wd6BFIt-OY|4u*3l7>*eL;-Q69f6t}Hp zGRYWgwtBF{0Hsvd^`oOB0Kf_~kx0bjaZS@YzyM=RRn<%;Q!Ey7_$j3e3kyvxAAaSZ z3~RlUBxJ~=r-xk8BP>FJ@Np%$bs@_hqB2w9fPNXWUt3!X1OhEsd`!M$0M$#9w70i+dwYxOIp?#pvr|)3)oQf``!aWAzqz?NI5;SkN~ZeW-rlXPEk#ib!)WpF!=D(y6-HH6P16n!508(J%@ZT% zyuZJHb8|Bg2280lptg5Oq#x5={GMUWN(-QztO7ZRR@bLQjy2sG2Fxw*OJ#fEsm<#l>JSSgBO-m5u5Ffb{hAaL#MBnqe5fUZD{}a5l^j$HvCy=jXA` zX*3%44!p^48000CGNklP?kWKY0RU?S0IU@N zuvP%TS^)rS1purS0I*g7z*+$SYXtzT6#%eS0Ki%S0Bikx073{Mg!MMQE}r8!0073= z{RIF(2qA%CZb0lx10xq-ZqS($bPl zCfnQFW3iYl%NS$RG#i=Z^F1MiVzF3HPfu@eZz`2i6s12IvFE20m_xGhzsZ=WIx=!z)X^PrJmgTXrv5}FHP$*QbRvUqVR}=+87>Pva zD~Ax;wp}iludlDq&d$!y&nXGLWEjTw_V&ri$@KJeDwU!cjBQlF)zwvZLA?b+$Z=dK z6oL>wKR+KG9p!Slhld9M0Da{cV~*pdrlv+mN2}E;A%r0V{PZ)cTb^lg&~-hR%kAy$ zmCI%N%4x|{RdsfDmIgg5hR>ZCLg)rD^^@`O@#W=ZRaFTgG=dRAhlhvj>+7~{^E~fX zai8@+QAkMu0Gg&Lijv7>GMNlbTmS%s(8a~Y=H@14VA50lZW?i|p{nZA(o!Oka2YNy zFE=(e=zsqi{vZ!hYg8(gcs#zixY*s@{gL67)NP;tsy|NT9LJfaDG0*C!oo*} zd_JGeX2ap|$13iFzEX)0LY8ImJU>4_|IwFrc6JJdf*T?J=!>P4GKiu$H#es!3Uz&q z@z&OsX_~Zn`=hV-0tlgMwc6I!HZwCr0T4oukB_^%yM7wsTg?o|ahj&3)9Jy%LAqlI z;r{;q?d`1~2>xWG?{;IfL7JSLj7Fohz*&}+&1OTP(2oId9H*(NX<}jm06_bqFKFg5C0E&ITJdL)7RGr-sjJ&tE;!S zw|aY#X8<&Tc64+!H#gH})P9zfG{have>B+Y3x{k|U0??`)jYjG59srbP0l+XkKunR6a diff --git a/assets/graphics/unconnected_lines/line/horizontal.png b/assets/graphics/unconnected_lines/line/horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..b56567015d9f9e9a894c84851b486024c1a05613 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMHcuDFkcv5PuWsZ$V8CUu z2ZxJ7v1kFK@Rs74`U;hk4Uc{9wM-9Hy;=SJUUYW$T9xwnd%KJO8#kmeoMo8BXu_Pq hc7bPsqyxzUvK(A|40)cn^?>eR@O1TaS?83{1OO(MH;n)Q literal 0 HcmV?d00001 diff --git a/assets/graphics/unconnected_lines/vertical.png b/assets/graphics/unconnected_lines/vertical.png deleted file mode 100644 index b05ccd5d2e6ba7db7dd46fde7c27ddfb7d3d202d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMG*1`Dkcv5P&u3WKMspUXO@geCxd-8B{f diff --git a/game/play.py b/game/play.py index 02cc741..da3dd6c 100644 --- a/game/play.py +++ b/game/play.py @@ -1,4 +1,4 @@ -import arcade, arcade.gui +import arcade, arcade.gui, random from utils.constants import button_style from utils.preload import button_texture, button_hovered_texture @@ -13,6 +13,7 @@ class Game(arcade.gui.UIView): self.pypresence_client.update(state='In Game', start=self.pypresence_client.start_time) self.difficulty = difficulty + self.power_lines = [] self.anchor = self.add_widget(arcade.gui.UIAnchorLayout(size_hint=(1, 1))) self.grid_size = list(map(int, difficulty.split("x"))) @@ -26,8 +27,19 @@ class Game(arcade.gui.UIView): self.anchor.add(self.back_button, anchor_x="left", anchor_y="top", align_x=5, align_y=-5) for row in range(self.grid_size[0]): + self.power_lines.append([]) for col in range(self.grid_size[1]): - self.power_grid.add(PowerLine(), row=row, column=col) + left_neighbor = self.power_lines[row][col - 1] if col > 0 else None + top_neighbor = self.power_lines[row - 1][col] if row > 0 else None + + power_line = PowerLine(random.choice(["line", "corner"]), left_neighbor, top_neighbor) + self.power_grid.add(power_line, row=row, column=col) + self.power_lines[row].append(power_line) + + if left_neighbor: + left_neighbor.right_neighbor = power_line + if top_neighbor: + top_neighbor.bottom_neighbor = power_line def main_exit(self): from menus.main import Main diff --git a/game/power_line.py b/game/power_line.py index 55cd131..963a9d1 100644 --- a/game/power_line.py +++ b/game/power_line.py @@ -1,26 +1,81 @@ import arcade, arcade.gui -from utils.preload import vertical_connected, vertical_unconnected, horizontal_connected, horizontal_unconnected +from utils.preload import * -from typing import Literal +TEXTURE_MAP = { + ("vertical", True): vertical_connected, + ("vertical", False): vertical_unconnected, + + ("horizontal", True): horizontal_connected, + ("horizontal", False): horizontal_unconnected, + + ("left_bottom", True): left_bottom_connected, + ("left_bottom", False): left_bottom_unconnected, + + ("left_top", True): left_top_connected, + ("left_top", False): left_top_unconnected, + + ("right_bottom", True): right_bottom_connected, + ("right_bottom", False): right_bottom_unconnected, + + ("right_top", True): right_top_connected, + ("right_top", False): right_top_unconnected, +} + +ROTATIONS = { + "line": ["vertical", "horizontal"], + "corner": ["left_top", "right_top", "right_bottom", "left_bottom"] +} + +NEIGHBOURS = { + "vertical": lambda l, r, t, b: bool((b and b.connected) or (t and t.connected)), + "horizontal": lambda l, r, t, b: bool((l and l.connected) or (r and r.connected)), + "left_bottom": lambda l, r, t, b: bool(((l and l.connected) or (b and b.connected))), + "right_bottom": lambda l, r, t, b: bool(((r and r.connected) or (b and b.connected))), + "left_top": lambda l, r, t, b: bool(((l and l.connected) or (t and t.connected))), + "right_top": lambda l, r, t, b: bool(((r and r.connected) or (t and t.connected))) +} class PowerLine(arcade.gui.UITextureButton): - def __init__(self): - super().__init__(texture=vertical_unconnected) + def __init__(self, line_type, left_neighbor, top_neighbour): + super().__init__(texture=TEXTURE_MAP[ROTATIONS[line_type][0], False]) - self.rotation: Literal["vertical", "horizontal"] = "vertical" + self.line_type = line_type + self.rotation = ROTATIONS[line_type][0] self.connected = False + self.left_neighbour, self.top_neighbour = left_neighbor, top_neighbour + self.right_neighbour, self.bottom_neighbour = None, None + self.on_click = lambda e: self.next_rotation() - def next_rotation(self): - if self.rotation == "vertical": - self.rotation = "horizontal" - self.texture = horizontal_connected if self.connected else horizontal_unconnected - self.texture_hovered = horizontal_connected if self.connected else horizontal_unconnected - elif self.rotation == "horizontal": - self.rotation = "vertical" - self.texture = vertical_connected if self.connected else vertical_unconnected - self.texture_hovered = vertical_connected if self.connected else vertical_unconnected + self.update() + def next_rotation(self): + current_index = ROTATIONS[self.line_type].index(self.rotation) + + if current_index + 1 == len(ROTATIONS[self.line_type]) - 1: + self.rotation = ROTATIONS[self.line_type][0] + else: + self.rotation = ROTATIONS[self.line_type][current_index + 1] + + self.update() + + def update_neighbours(self): + if self.rotation == "horizontal": + self.left_neighbour.update() if self.left_neighbour else None + self.right_neighbour.update() if self.right_neighbour else None + elif self.rotation == "vertical": + self.top_neighbour.update() if self.top_neighbour else None + self.bottom_neighbour.update() if self.bottom_neighbour else None + + def update(self): + if not self.connected: + old_connected = self.connected + self.connected = NEIGHBOURS[self.rotation](self.left_neighbour, self.right_neighbour, self.top_neighbour, self.bottom_neighbour) + if self.connected != old_connected: + self.update_neighbours() + + self.texture = TEXTURE_MAP[(self.rotation, self.connected)] + self.texture_hovered = TEXTURE_MAP[(self.rotation, self.connected)] self._requires_render = True \ No newline at end of file diff --git a/utils/preload.py b/utils/preload.py index ac065b3..77487cd 100644 --- a/utils/preload.py +++ b/utils/preload.py @@ -3,8 +3,16 @@ import arcade.gui, arcade button_texture = arcade.gui.NinePatchTexture(64 // 4, 64 // 4, 64 // 4, 64 // 4, arcade.load_texture("assets/graphics/button.png")) button_hovered_texture = arcade.gui.NinePatchTexture(64 // 4, 64 // 4, 64 // 4, 64 // 4, arcade.load_texture("assets/graphics/button_hovered.png")) -vertical_connected = arcade.load_texture("assets/graphics/connected_lines/vertical.png") -horizontal_connected = arcade.load_texture("assets/graphics/connected_lines/horizontal.png") +vertical_connected = arcade.load_texture("assets/graphics/connected_lines/line/vertical.png") +horizontal_connected = arcade.load_texture("assets/graphics/connected_lines/line/horizontal.png") +left_bottom_connected = arcade.load_texture("assets/graphics/connected_lines/corner/left_bottom.png") +left_top_connected = arcade.load_texture("assets/graphics/connected_lines/corner/left_top.png") +right_bottom_connected = arcade.load_texture("assets/graphics/connected_lines/corner/right_bottom.png") +right_top_connected = arcade.load_texture("assets/graphics/connected_lines/corner/right_top.png") -vertical_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/vertical.png") -horizontal_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/horizontal.png") \ No newline at end of file +vertical_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/line/vertical.png") +horizontal_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/line/horizontal.png") +left_bottom_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/corner/left_bottom.png") +left_top_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/corner/left_top.png") +right_bottom_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/corner/right_bottom.png") +right_top_unconnected = arcade.load_texture("assets/graphics/unconnected_lines/corner/right_top.png") \ No newline at end of file