From 6adea1730e42f454ab73e14a7937ce571a6123e8 Mon Sep 17 00:00:00 2001 From: steev Date: Sun, 7 Jan 2024 19:26:41 +0100 Subject: [PATCH] added server communication between client and server --- .../Assets/Cards/{Arena => 0}/field.png | Bin .../testmonstercard => 1}/card.json | 2 +- .../testmonstercard => 1}/card.png | Bin .../testspellcard => 2}/artworkjson.png | Bin .../testspellcard => 2}/testspellcard.json | 2 +- .../testtrapcard => 3}/artworkjson.png | Bin Game_Client/Assets/Cards/3/testtrapcard.json | 6 ++ .../TrapCards/testtrapcard/testtrapcard.json | 6 -- Game_Client/Classes/Game/Cards/Card.py | 14 ---- Game_Client/Classes/Game/Cards/MonsterCard.py | 12 ++- .../__pycache__/MonsterCard.cpython-311.pyc | Bin 5129 -> 5661 bytes .../__pycache__/SpellCard.cpython-311.pyc | Bin 0 -> 4751 bytes .../__pycache__/TrapCard.cpython-311.pyc | Bin 0 -> 4727 bytes Game_Client/Classes/Game/Events/GameStart.py | 7 ++ Game_Client/Classes/Game/Events/PlaceCard.py | 40 +--------- .../Events/__pycache__/Login.cpython-311.pyc | Bin 0 -> 848 bytes .../__pycache__/PlaceCard.cpython-311.pyc | Bin 0 -> 1013 bytes Game_Client/Classes/Game/Player.py | 20 +++-- Game_Client/Classes/Game/World.py | 71 +++++++++++++++--- .../__pycache__/BoardField.cpython-311.pyc | Bin 4773 -> 5033 bytes .../Game/__pycache__/Player.cpython-311.pyc | Bin 0 -> 2761 bytes .../Game/__pycache__/World.cpython-311.pyc | Bin 6278 -> 11167 bytes Game_Client/Classes/System/App.py | 36 ++++++--- .../Classes/System/Components/InputHandler.py | 28 +++---- .../Classes/System/Components/Window.py | 4 +- .../__pycache__/InputHandler.cpython-311.pyc | Bin 3487 -> 3305 bytes .../__pycache__/Window.cpython-311.pyc | Bin 3455 -> 3449 bytes .../Classes/System/Network/NetworkManager.py | 54 +++++++------ .../__pycache__/EventHandler.cpython-311.pyc | Bin 0 -> 1861 bytes .../NetworkManager.cpython-311.pyc | Bin 0 -> 6474 bytes .../System/__pycache__/App.cpython-311.pyc | Bin 7099 -> 9258 bytes 31 files changed, 173 insertions(+), 129 deletions(-) rename Game_Client/Assets/Cards/{Arena => 0}/field.png (100%) rename Game_Client/Assets/Cards/{MonsterCards/testmonstercard => 1}/card.json (89%) rename Game_Client/Assets/Cards/{MonsterCards/testmonstercard => 1}/card.png (100%) rename Game_Client/Assets/Cards/{SpeelCards/testspellcard => 2}/artworkjson.png (100%) rename Game_Client/Assets/Cards/{SpeelCards/testspellcard => 2}/testspellcard.json (62%) rename Game_Client/Assets/Cards/{TrapCards/testtrapcard => 3}/artworkjson.png (100%) create mode 100644 Game_Client/Assets/Cards/3/testtrapcard.json delete mode 100644 Game_Client/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json delete mode 100644 Game_Client/Classes/Game/Cards/Card.py create mode 100644 Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc create mode 100644 Game_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc create mode 100644 Game_Client/Classes/Game/Events/GameStart.py create mode 100644 Game_Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc create mode 100644 Game_Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc create mode 100644 Game_Client/Classes/Game/__pycache__/Player.cpython-311.pyc create mode 100644 Game_Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc create mode 100644 Game_Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc diff --git a/Game_Client/Assets/Cards/Arena/field.png b/Game_Client/Assets/Cards/0/field.png similarity index 100% rename from Game_Client/Assets/Cards/Arena/field.png rename to Game_Client/Assets/Cards/0/field.png diff --git a/Game_Client/Assets/Cards/MonsterCards/testmonstercard/card.json b/Game_Client/Assets/Cards/1/card.json similarity index 89% rename from Game_Client/Assets/Cards/MonsterCards/testmonstercard/card.json rename to Game_Client/Assets/Cards/1/card.json index 0df2ece..b2b53c5 100644 --- a/Game_Client/Assets/Cards/MonsterCards/testmonstercard/card.json +++ b/Game_Client/Assets/Cards/1/card.json @@ -1,7 +1,7 @@ { "id": 1, "name": "Test Monster", - "image": "Assets/Cards/testmonstercard/cards.png", + "image": "Assets/Cards/1/cards.png", "description": "can attack other monsters", "costs": 30, "defense": 40, diff --git a/Game_Client/Assets/Cards/MonsterCards/testmonstercard/card.png b/Game_Client/Assets/Cards/1/card.png similarity index 100% rename from Game_Client/Assets/Cards/MonsterCards/testmonstercard/card.png rename to Game_Client/Assets/Cards/1/card.png diff --git a/Game_Client/Assets/Cards/SpeelCards/testspellcard/artworkjson.png b/Game_Client/Assets/Cards/2/artworkjson.png similarity index 100% rename from Game_Client/Assets/Cards/SpeelCards/testspellcard/artworkjson.png rename to Game_Client/Assets/Cards/2/artworkjson.png diff --git a/Game_Client/Assets/Cards/SpeelCards/testspellcard/testspellcard.json b/Game_Client/Assets/Cards/2/testspellcard.json similarity index 62% rename from Game_Client/Assets/Cards/SpeelCards/testspellcard/testspellcard.json rename to Game_Client/Assets/Cards/2/testspellcard.json index 51d4083..7c1ebee 100644 --- a/Game_Client/Assets/Cards/SpeelCards/testspellcard/testspellcard.json +++ b/Game_Client/Assets/Cards/2/testspellcard.json @@ -1,6 +1,6 @@ { "name": "testspell", - "image":"Assets/Cards/testspelltcard/artwork.png", + "image":"Assets/Cards/2/artwork.png", "costs": 30, "description":"this is a test spell card" } \ No newline at end of file diff --git a/Game_Client/Assets/Cards/TrapCards/testtrapcard/artworkjson.png b/Game_Client/Assets/Cards/3/artworkjson.png similarity index 100% rename from Game_Client/Assets/Cards/TrapCards/testtrapcard/artworkjson.png rename to Game_Client/Assets/Cards/3/artworkjson.png diff --git a/Game_Client/Assets/Cards/3/testtrapcard.json b/Game_Client/Assets/Cards/3/testtrapcard.json new file mode 100644 index 0000000..ef4ad97 --- /dev/null +++ b/Game_Client/Assets/Cards/3/testtrapcard.json @@ -0,0 +1,6 @@ +{ + "name": "testtrap", + "image":"Assets/Cards/3/artwork.png", + "costs": 30, + "description":"this is a test trap card" +} \ No newline at end of file diff --git a/Game_Client/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json b/Game_Client/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json deleted file mode 100644 index 6d1cd5a..0000000 --- a/Game_Client/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "testtrap", - "image":"Assets/Cards/testtrapcard/artwork.png", - "costs": 30, - "description":"this is a test tryp card" -} \ No newline at end of file diff --git a/Game_Client/Classes/Game/Cards/Card.py b/Game_Client/Classes/Game/Cards/Card.py deleted file mode 100644 index 7deb9f1..0000000 --- a/Game_Client/Classes/Game/Cards/Card.py +++ /dev/null @@ -1,14 +0,0 @@ -import json -import pygame - - -class Card(pygame.sprite.Sprite): - - - def __init__(self, pos:tuple, assetDir:str): - - if assetDir == "": - return ValueError.add_note("Card: imagePath cannot be empty") - - - diff --git a/Game_Client/Classes/Game/Cards/MonsterCard.py b/Game_Client/Classes/Game/Cards/MonsterCard.py index b163f1d..5aa58a7 100644 --- a/Game_Client/Classes/Game/Cards/MonsterCard.py +++ b/Game_Client/Classes/Game/Cards/MonsterCard.py @@ -1,9 +1,8 @@ import json -from typing import Any - import pygame from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Player import Player class MonsterCard(pygame.sprite.Sprite): __name:str @@ -15,16 +14,18 @@ class MonsterCard(pygame.sprite.Sprite): __dragging:bool = False __offset:pygame.Vector2 = pygame.Vector2(0,0) __inputHandler: InputHandler + __owner:Player image:pygame.image rect:pygame.rect - def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler): + def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler, owner:Player): if assetDir == "": return ValueError.add_note("Card: imagePath cannot be empty") pygame.sprite.Sprite.__init__(self) data = json.load(open(assetDir + "/card.json")) + self.__owner = owner self.__id = int(data["id"]) self.__pos = pos self.__name = data["name"] @@ -42,7 +43,7 @@ class MonsterCard(pygame.sprite.Sprite): self.__attacks.append(attack) def update(self): - if self.getDragging(): + if self.__dragging: mouse_pos = self.__inputHandler.getMousePos() self.__pos = mouse_pos self.rect.center = self.__pos @@ -74,6 +75,9 @@ class MonsterCard(pygame.sprite.Sprite): def getID(self) -> int: return self.__id + def getOwner(self) -> Player: + return self.__owner + def setDragging(self, dragging:bool): self.__dragging = dragging diff --git a/Game_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc b/Game_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc index b27884378f58fc43f97a46cd247c72cc3241b1fa..4e5d7a7b9d3a7f2901bc7bdd5b26f31eefedd7f3 100644 GIT binary patch literal 5661 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 literal 5129 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 L{h$A_i0k)X2VGWW diff --git a/Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc b/Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af192b32fbbd88acbe45615ae7743340c06080e3 GIT binary patch literal 4751 zcmbUlU2hx5agRJwM^Y3e@xzozN|YVTpyeu-)7Xuhx(=k;mS8Ihlo$merYBvBIF;4SdXvUIsFVe-w;ZuP$qe7J!N6jllKTF z&71cE&07{XeR-ciJmfy1;&VcMinrvqgp~%Y-U}}wui?*p@)8wRNY4LHM3-}d;r*bp z4b9+UrM9I#C{$=!VQbyNys<={{#rn@6p|Mx$$LH}idPY-@IDOUJrD2sdL{tZi!>_c z2NVe~A7UP&IL1&v^}q0df$(QO`GAuTvj(`_AoL_IjpRdIUx3qnr9o>Zj0kpVVFxY5 zXAL@~(y-#CLrQSnPb1I8{16>}PVx~tqIlOmbQCDV(051%Y80p=GzQ~FX&hjbCIH6h z1%Ppy1el;>iUcFaVdMpxa_R$W8mLL?vI3|XppMZAIFLyruu@aX<@o}m#;|PnWw}z= zRE!Hw3RToKR;+2oYQ=~+8MUf<&xkoGlod8Mij@t9`)iCkS=IG*Rnd&3lU8&%f!hjg zyQUbv;$~q(F+`@UX@(cH8B#$7Aqz!j3_9noiPix?iw=bTclt*#;v2H#p~4sZxY@Yo z7}f;$I{Q%13!uNYc`HP7$S&D_U9zc7D~?>kc8FV!Ks4J)2gMZp#{`_5`^+OF;#`vQ>HHUTu+vUfb zckNuv<~Y|8x2Vqc%sLVl7xdb?N`@1i~+{Y>@gS2H)*0ck+)4+LP>Bp;D=8 z+0T`%vRTu%>%q6zV8m=mg}@UrF6#l4Qmbs-Gea!o2+my62tF>9x0GKoR%H+?l*%Aa zG5odd4UB5PT4P1TSIkzDZNl?Z z2O&4?l1?c4HT%Pz6Cwnbgg4R5adi49I^DYRK#wlAql>M<#qXt|y>MGfA4`{yq{~gJ zOEYb0rX|gMABpa5|2cN>iXO|gV>uuO zI>`();Wvr&ex>>GOF>UuZ6~gx*v zqs(LUQ?GLhp@>L`@bLz#9c zb3(j@4WwxsO& zEaS=Pj2S~<24oYf{;4Njb~rdU`V5(BNmJ)B1kMHbx!(|m3$4f9+Plunx2|_Mzk|3u zr)J#9e$7Szw%|ivyw#&F{U-5exbU9#XDumxPVM~4>GuOaXoqlgMwUtWxm$0&C5@d& zFN6b@DrZ)W!SD$bp?$%Cq&qnN76J?lb`ijuGhbn!#~@Y|5QA8-LC<_J|L{0uD5jfM zxC~c931OMrJzwXsJIEivd=+g6*B`$KIXu#U*R<&^AfLykyD-nP31zr!3V`ynj$jiP zaD3OEa}Vj?9a(0+u1FEHf+>*(C(%>xTGwwOVF8UPL5vAHqtB z7eu^*V3-ovO$4_Q;O{~n#tcu6;dZfm2p%90-PS9NwF4iAnf$G1*C^c9$AjOH9G1i>c1UwS)D;%FB;meyLB) zwI}9wA2c5Ceby4^;M2vqPAuCJ@zcd@XC%FQuklVxOv9&(X_S1eB_`n0#Y86%*#n_5 z_;fLLB98cO9NavFiU>O2&hzH)W#06IY0(GQm<fq_&4$`Ok z0WdEjtqTC1M6?S4g)7zufQ}>D1%Nu00eY$VQ{-Rj2f&&H6TU*aQ$9z5Id+gZoIvK- zj{-9!@hEcvmVw6b!_Qm%m5f<}dzLZXtx0EBwxNXGoSm<3)~XdKR@GVOe@Ym4wsD-6 zLcslF1$#Udq0jsvy>B}99rhSdyx-NY0GxOQLFkasE`K{D(Q<#^k?<~mzazhFxxW+f bt{}kr{x|&EzaMT7zx8j<{?CsL;`aR)@&)-f literal 0 HcmV?d00001 diff --git a/Game_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc b/Game_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3cda490404519d5652a99c3161a8315600839366 GIT binary patch literal 4727 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 int: return self.__hp - + + def getMana(self) -> int: + return self.__mana + def adjustHP(self, hp:int) -> int: self.__hp = self.__hp + hp - def getHand(self) -> pygame.Sprite.Group: + def getHand(self) -> pygame.sprite.Group: return self.__handCards - def AddToHand(self, card) -> pygame.Sprite.Group: + def AddToHand(self, card) -> pygame.sprite.Group: self.__handCards.add(card) return self.__handCards - def removeFromHand(self, pos:int) -> pygame.Sprite.Group: + def removeFromHand(self, pos:int) -> pygame.sprite.Group: self.__handCards.remove(pos) - return self.__handCards \ No newline at end of file + return self.__handCards + diff --git a/Game_Client/Classes/Game/World.py b/Game_Client/Classes/Game/World.py index 7acd9bf..06d51b3 100644 --- a/Game_Client/Classes/Game/World.py +++ b/Game_Client/Classes/Game/World.py @@ -2,12 +2,18 @@ import pygame from Classes.Game.BoardField import BoardField from Classes.System.Components.Label import Label from Classes.Game.Cards.MonsterCard import MonsterCard +from Classes.Game.Cards.SpellCard import SpellCard +from Classes.Game.Cards.TrapCard import TrapCard from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Player import Player class World(): __boardFields:list + __player:Player + __enemy:Player __labels:list __cards:pygame.sprite.Group() + __PlayerHandCards:pygame.sprite.Group() __screen:pygame.surface __cardWidth:int = 150 __cardHeight:int = 200 @@ -16,11 +22,14 @@ class World(): def __init__(self, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): self.__boardFields = [] self.__labels = [] - self.__cards = [] + self.__cards = pygame.sprite.Group() + self.__PlayerHandCards = pygame.sprite.Group() self.__screen = screen self.__cardWidth = cardWidth self.__cardHeight = cardHeight self.__cardOffset = cardOffset + self.__player = None + self.__enemy = None self.buildGameWorld() def buildGameWorld(self): @@ -42,17 +51,19 @@ class World(): pDeckPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow2Height) pNamePos = pygame.Vector2(20, pRow2Height + 195) pHPPos = pygame.Vector2(20, pRow2Height + 225) + pManaPos = pygame.Vector2(20, pRow2Height + 255) # labeling self.__labels.append(Label("PlayerHP", self.__screen, "1000 / 1000", pHPPos)) self.__labels.append(Label("PlayerName", self.__screen, "Player", pNamePos)) + self.__labels.append(Label("PlayerName", self.__screen, "0", pManaPos)) self.__labels.append(Label("EnemyHP", self.__screen, "1000 / 1000", eHPPos)) self.__labels.append(Label("EnemyName", self.__screen, "Enemy", eNamePos)) - self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, "Assets/Cards/Arena/field.png")) - self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, "Assets/Cards/Arena/field.png")) - self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, "Assets/Cards/Arena/field.png")) - self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, "Assets/Cards/Arena/field.png")) + self.__boardFields.append(BoardField("EnemyDeck", "Enemy", "Deck", eDeckPos, "Assets/Cards/0/field.png", "e-deck")) + self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, "Assets/Cards/0/field.png", "e-grave")) + self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, "Assets/Cards/0/field.png", "P-deck")) + self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, "Assets/Cards/0/field.png", "p-grave")) # handle field creation for i in range(5): @@ -61,10 +72,10 @@ class World(): eMonsterPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1)), eRow1Height)) eEffectPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * (i+1))), eRow2Height) - self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "MonsterField", pMonsterPos, "Assets/Cards/Arena/field.png", "pm"+str(id))) - self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "EffectField", pEffectPos, "Assets/Cards/Arena/field.png", "pe"+str(id))) - self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "MonsterField", eMonsterPos, "Assets/Cards/Arena/field.png", "em"+str(id))) - self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "EffectField", eEffectPos, "Assets/Cards/Arena/field.png", "ee"+str(id))) + self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "MonsterField", pMonsterPos, "Assets/Cards/0/field.png", "pm"+str(id))) + self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "EffectField", pEffectPos, "Assets/Cards/0/field.png", "pe"+str(id))) + self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "MonsterField", eMonsterPos, "Assets/Cards/0/field.png", "em"+str(id))) + self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "EffectField", eEffectPos, "Assets/Cards/0/field.png", "ee"+str(id))) def getBoardFields(self) -> list: return self.__boardFields @@ -81,9 +92,45 @@ class World(): def getCards(self) -> pygame.sprite.Group: return self.__cards - def spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler) -> MonsterCard: - self.__cards.add(MonsterCard(pos, asset, inputHandler)) + def getHandCards(self) -> pygame.sprite.Group: + return self.__PlayerHandCards + + def getPlayer(self) -> Player: + return self.__player + + def getEnemy(self) -> Player: + return self.__enemy + + def setPlayer(self, player:Player): + for label in self.__labels: + if label.getName() == "PlayerName": + label.setText(player.getName()) + self.__player = player + + def setEnemy(self, player:Player): + for label in self.__labels: + if label.getName() == "EnemyName": + label.setText(player.getName()) + self.__enemy = player + + def spawnMonsterCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> MonsterCard: + card = MonsterCard(pos, asset, inputHandler, owner) + self.__cards.add(card) + return card + + def spawnSpellCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> SpellCard: + card = SpellCard(pos, asset, inputHandler, owner) + self.__cards.add(card) + return card + + def spawnTrapCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> TrapCard: + card = TrapCard(pos, asset, inputHandler, owner) + self.__cards.add(card) + return card def spawnCards(self, cards:pygame.sprite.Group): for card in cards: - self.__cards.append(card) \ No newline at end of file + self.__cards.add(card) + + def AddToPlayerHand(self, Card): + self.__PlayerHandCards.add(Card) \ No newline at end of file diff --git a/Game_Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc b/Game_Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc index abdcc11874ad4a888791aa1ddedd5df7906b4f5a..a5b09d18cc3243d53bea9388f0128521e5a04784 100644 GIT binary patch literal 5033 zcmbtXO>7(25#A-2)asA=qi9i*ZMu#W(>B~Tsnf;{g4UE}OR?3|igO^8EC{}pyedty zZ&zup5(W+U;1&YfLx2c{4m`Or+(QpN^pKv4UV0)80w%TyP@t#WRH(h=(th*yN8F_X zH1d+1H*aR%o1Zr`Z~437;QuqNlY$Dd1sXKazwf= zvB)EdMRj>I;w{>Yde{?S&-__lVe+b!RlXqhO3@Rdambw<{81)7x|Elhl#kqz^r((i zZ-Fhah>t~mOc7XYGw$voVMR>P`hdj=V|{s5rH8(0PorX(kDP21+@?O z6!0+@PXiwp(i5IVkeCKFDX6~fpw56g$z~r(`4l5-$qt2`1oecl+L@oid@AHY&>DrE zhD@4e^gdyQ!p>km&A#E!&tg8qUV)}rp(VoRKsm|!ajNt7z|~5DvqeKMF*~UpPBd+u zXiE$BSb$nC+|xrO(_mqeb-$|Hqk)ChirKSnThB(n_%C9`=?Dd|#{;X1l~RST*fHZ? zVMDhSt`{v^5jH47ts*oYrs=I32a!OXXaVJ{6;>pZnMX8qpGN_v-5*Zj(267n~)vbBUI3p&p%6fE7St`}Hldy8kT8YRYv zk}*sxvsK>s%V#Ca*vM2EM46#G;u-ztU>iEOGG(K9*SeHV+VSfB4a)JjS>=X>an%`B zO*6`drD>cFm6LUxj*!#I*{ML*-mR3FnL}N1N(VcF>{P0hm~o-dv}4$_Z1G{@Dy2$+ z*~7(3`6C#j6-w2+1zX+FEse6BQwZ&NQ7>CM&-U4hsh8F{ofoI$;1pL*;o%e+PRV1E zZ5ikJ@<#5;+8tBp=9+2g`bTREy7?2UQeFE|xnz`e?Y-Rfwd-(K%ashMSj&|Prm35P zwszPJE>-XIG8my&WXsZ{R>V-~f`mwSz z7#b$0Kpg1IoPMmd)u~Q;7SqIk;?n5&&d+}R;8zcJjn>Gy_Q<(?N$FpdKOY)vj(^Y^ z`mjCpVN-k|I-S{@eUU!@JbnJtH(Tk;?eygr>D=>lu9d#lPG5Vxu(SM+pnJ)j$*E_FsGc7D-Rr}-SF|G#Q}4&qtaNyYQP z!>U)&n8T`xHV;{Tk-#w&!cCF(M=5*{Z9lA#XxW!h2oI^mcvxW^fqb`OZjS|H3lh23 z7255lnm(qdbUr2yZ*RaGSL!CsbHPxBp zc#AMotLafr-rhzd3ZE;{E(cZLM(JSVgp}5atU6 z#36khBm5S;Dmk4l;@or847>=@#TT$84!z-~;E)zc)Q!(X3awwIw(Iu>T&yVH;@2?{ z8#<3`Ab$f>&$1=p0n7SeMo-spY0D5kjFKG_Z@n*P%bQ)c+zi{ILT_(F@rWxV?ndea zUCBcfsl&c#aru}rQP;xm@)8h7srWMNNidC?TO4-C~WeS_xeea{KR`_dn%-X7!bmu-0ol0~_ z(V^)@j9(ydiNLoByiVY|1g-$s3Uy~re}y^q1^z<8rjo+9rKCFjBRexqC5dlKN$x9SvH9KHzJ#Gs z6vH2)V)#?)vr__TuDR>`v@U7{VZaT-Nk%d@n(}O^1Qlax$z)C7&-72YM6)asX%MA0He+ms#u(01K6snf;?(${lC?IoA?d$Zgncc}u6 zyjs5b=Dj!b-n@D9cJznw@ev8n`ro#6QlG9xuSz-POA@b?TqSCS2WSs}FOwZzD#%PKgziduSjVV0 zArdI$p|C)ajVKML2YQO&4FN?6v1mcnsW&8gYGGK9Y`B(4f4DoxsF=W+V?^kV>R~p9 z-#C5~80A@EF+F^5gvB2!g)ue>9AZAWG9JnWh$4)r4I=& z6m}Z@G|PJZdGzPl8Cc3N6?=Eq9=TC1a<*vbWoA!my^f|;iVySv%QRS!Wo^}TJMJ4; ztC|Djw)I^2%l{w}oE9#KJ>?r!s+OyK#f}&citD%oe+BNF_Lz| z=y^WuDCiBjnhbMkIDpP$O}R*tdP&>xQne?A4-vl)X532k{65Zezkl z{cUjeMyy}z;>Q3_-43n9n{`Lp@NgsUsq}$?v6HS4W4-tQdwk7{4wI0Up_R>dFl0gJ z*@dE|8?}2ymfhau*&9ZgG2&zm)5>mE*8lpfY#Hm>DuXIBbVog_{|aJ5=T^32lL~+lRV0b=c{+~*VpcvIycu$OV>YIThPs)Th-dy?Mm6G=-PYvrL`rj zQOlPNOum*c7fn+)*KYr817^*&-r>Gl+u|oM@Ah;b&kY1QVg4DUE`6a+?2fn9%nSA0 zbM;(S0a+)1V%DZ8VAW@Z-5k!7tt+5Z=V;?rf3)OUXKl37W>3QnX=Wn!9*V?ITFH-sEseCJSvz@y6 zXkmBx?}^z@mtQ0rPrR1GsFbRwLKoR~7 zIlY0_c~+$-^2!rgr^i&vLNx`$NM>QW~*z5DB?n&xNG z{r^q#^H9&pPVQX<4w_y?*$tW|-Yd}Mmxvt0AeJfe{3wI(p{NH967Ryx7{m(cO!1(> zC<1w>YHm;ZV+$57tuM6OO*M7Ql@1?en09s5*dACZ@xJjgD@ACjt`Dq~NiK+fZ@B;q)8Ix4x4s3fAcn>0h#ttaLY^`y(A`|2T;fB4g_vc9tNQeIu{^NOnA zfL8-2A6^mf2T70;^VRJxG!b)#b7Mu^ty^Cb$q!J^=>7D%-lpXnq@ zze;7-s}1;^;`o-nj)THEB3%dhcYs~bmVkYp4Z)3ps?p`W4dq^x?1;G2zML=L?ek?h z=!*)wg9XK9-XisGq)ucIsWFOFudW;!qXY&8^PBEuPFBCw^Tt+6I9R^WOps+TyQj-{ z==`EPcgQT+8V0uW9y(rah>#%`)LJP5Z@WvD}q}O^e$xO)FL^ zRjX(j)ryI094){edLLD-%3rl3)@H4&JLOmu3Q?d$fusu%&k?yoVy*Z7Q>PTgq%_G+w_|zxBzjPGY{k^yp?&naA5w<~vi#`nw(IUTG>xye%c!8IJAF zHI)S3mXbJ7;*s-v`2z_}qa>O?g+=q1Q8-l5Q&UpAe!VE^_oM^-bq=y~TeD9@T2I0CEtPWw|2_ l*Tr8)8n27L1La4ujG!G&f0z99WP9@5KZW>T|3gXG{x2p2*;N1l diff --git a/Game_Client/Classes/Game/__pycache__/Player.cpython-311.pyc b/Game_Client/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c97d21726cf70abed28caa10b36d4342561e2e01 GIT binary patch literal 2761 zcmcIl&1)M+6rcT)SJtO3Tk%I+E0#+t8rmL8p}~|Enc6YbHN?3X!Ln%9iCk%=&a4A= zeNey$A983R5L0^4p`A@BQ9;v-3V@^;0S} zPGD{Q`n~nLLdb6@1WWb7M^iv^Wo+QRxK88L*A?59dsR zJ^LT_9M~u56vXy#XQ*@<_Ds?|)b5%a+p3!f7IPDZ2MnV|Bf^80n+h!r(>5cbZ8j`- zGPFK0ZCW-N<*p1*sbaH=d#XWSv5eR~=sUUm0LW8vBpne0khhLxkf39}q<|E5o07Za zOxi3d44ccaI}96BQeBl>^<9Q@#S%!8KsY)rzzFoP;EygR{v8;!cRf~V+G+UJ~ z?Rw3&jP3GTWeuV<%JrIMJC$tBz4f6p-Sc@qThHHWOvNRaZB&Go?$t(km<$!Q}vQS`I zV6Mh3=g#V3(ho~WxRa-VgfX4OPvUG6_s5v!>@&L>))|zDMOW}dh=l9`_m&?8n+6d= z5hvsJ!2A6H??OU1msl3?p2i7}4Om2T3#eU2#y6CWrr299%x(>3$tPDlQ36X!mhu{UpY z98MeA=yiCjL<@oP4fKyUUCdW6v)I)ay#_>Ug7Yk9dKJK6O*%MDudO5L8R%bxHfhv7 zfO281u3}Q^m(EqI_}YusF8&#%+f5OB)*sSPgDv7qKp=WO+0$o!(XYSMub*z8>q|X- zsjDx+rHLfvDy=3TcyIi_nZf&^(R^qHb8!p9jpmm2?4Pq{LnJuuCpf6azwn_f7hmd& z9pzkK?&-^2eR(j;%~B5EvG{*s81A@XG@5k3jyP!;U+W5bZSkT z!ybh@%#F1U?!)75jJH_Lv0QD9HTPR=0wQ5~By&g>kl+NdB9ga}+(hy&lJ|j}dAC`- zU73nnBv^EQ48zfmd@kb2_Ii8$(fU6ik#29aHy&+Vgdm%LlImrPT@}CQYO${>+Wcv; zPk?pGf<3PaHcZAP?b^4zPk;@Rn54~mrdc#a37FkQU9<(p^rN6f y>|;du?<0EmN?-AY=o5Auba=1%r$G9OBuN(})fS(=dQ*aUUMGK|?ynIB;o)zE;w>cr literal 0 HcmV?d00001 diff --git a/Game_Client/Classes/Game/__pycache__/World.cpython-311.pyc b/Game_Client/Classes/Game/__pycache__/World.cpython-311.pyc index c6f2cfb9114d21d1192c904535b28ba10e526eb7..3f8ca3eca02f862c821472f42feaa20a0ec1d540 100644 GIT binary patch literal 11167 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 delta 2280 zcma)7O>7fK6yEiEz2l#?y>?=+9Vh-lU<^$xs+P7ijfg@?RVgGTf30N!Cc8la<&U??-CO_Zj{zjG^9E`|s3;KD_x?ANBt|xcKEZiWcSywqtyl&yRTkteSM%4IG zE@fN4(Wy>7CFyM6QXc=vktiQp7Idp-=><|3PusTEIN$`zY1WLSBhW;q*)n#fNlZf- z2h;3K3u?~hH)t*$X)-)+9Ze(6vnpnsns=4UxHLrolh+1wXZ6WhoYzuf&1&fR zX{=BS9|b>!HUNWe6r*GF@W6rWxS?YsYZP^TK6^+v&J<_ovcrY^OhG?RMr^7yeDbtD zRWwN6wj)gUGu{JO;Wj#>Yt||XZ>Zrl>qVJVZ82hzQcju&^puaUpga4e6BhE&kyd1r zJ557pLvx!h5_1kIo)*??Iw|W>T39#fatPUZoUeG=G{4qvidx`0oa&ZH zyq-Z%5IEJewQwQL3wDkcE)1M%+M76){OyVhUoOccCcn+gBrAtVRPF^SVh@p$+$+dh z2XVNgyq8)?pe@3gNCbs=gzFW^@^v1ff~PU4E$rE8x|{YKOn1G6Pt^3Z z_{3i5$byOg>Y(KZx`j zhF&z%139c2>3*yia_Q+AJ+Jl56;9RM?-um43xhZ}uP=Z>O=M!t(Rjfjed1^J6$S*I-jJD}(E;Z8Swt7OgpdM7O&RxK@n z={4gZ`PCni0w5ae);oXs`*`6Ya*?t2Nm6O=<2Q&m5cC?AM6sGER#2&mN@Y|c2Lj>c z#Y*CQHF3Uz%qlX=$lO3KD5hUf{AU#Zde4pQ-8b(|-2bpVS*j%FtBLsvI#)&K%II9H zUAepO9=e|_k7moq%t~UZnpmo!3srQXj4u4H1TKBNu3lE_oZUWddBkw7|3Nr*wdV%0 z2LFgsl1ollo-hPio}@Bhog(>O?IItkuIN!_H_GfrsVt8%yD?@r26lU*j88HiklKth zn{j3{PU4}xuf4!#%d76E;WmQC9pu~4{xJQ(DV}w}n>@W7&Y(3F!y&R6N(K5TLHi+e zC6B-AiI-6vJa0#O)GbfeHiw)2mc!BZeoD}O#r!TVl~JVCjrG_Tw?D%>1Ba+v({|A^ zinjW(w%p>k*pciWe9kXcMlsw0otx5GBG-hO zLh)JK$6@Lbq%cC^D1|W!696|k_WDMu(w|REfp&i*#*^=MMI>cqXl3Y=A<~{a_`W1| z)j5DG(^m^jxGS*f{s5cGC#Kl^Jot8r^tPICgj`GJ_j0@#uTyBmKzB~rFgsCrAfJP- zVe~xxY56I&f0@OGkI^XUH(^0 tuple: - xvel:int = 0 - yvel:int = 0 + xvel = 0 + yvel = 0 # construct x and y velocity input axis if InputHandler.getPressed()[pygame.K_a] or InputHandler.getPressed()[pygame.K_LEFT]: @@ -25,22 +26,23 @@ class InputHandler: return tuple((xvel, yvel)) - def getMousePos(self) -> pygame.Vector2: + @staticmethod + def getMousePos() -> pygame.Vector2: return pygame.Vector2(pygame.mouse.get_pos()) # get field under mousbutton - def getMouseHover(self, world:World) -> BoardField: - mouse_pos = self.getMousePos() - x_pos = mouse_pos.x / world.getCardWidth() - y_pos = mouse_pos.y / world.getCardHeight() + @staticmethod + def getMouseHover(mouse_pos: pygame.Vector2, world_card_width: int, world_card_height: int, board_fields: list) -> BoardField: + x_pos = mouse_pos.x / world_card_width + y_pos = mouse_pos.y / world_card_height - for field in world.getBoardFields(): + for field in board_fields: field_x = field.getPos().x field_y = field.getPos().y - field_width = world.getCardWidth() # Annahme: Jedes Feld hat eine Breite von 1 Einheit - field_height = world.getCardHeight() # Annahme: Jedes Feld hat eine Höhe von 1 Einheit + field_width = world_card_width # Annahme: Jedes Feld hat eine Breite von 1 Einheit + field_height = world_card_height # Annahme: Jedes Feld hat eine Höhe von 1 Einheit if field_x <= x_pos < field_x + field_width and field_y <= y_pos < field_y + field_height: return field - return None \ No newline at end of file + return None diff --git a/Game_Client/Classes/System/Components/Window.py b/Game_Client/Classes/System/Components/Window.py index c2669b7..88a2d69 100644 --- a/Game_Client/Classes/System/Components/Window.py +++ b/Game_Client/Classes/System/Components/Window.py @@ -1,8 +1,8 @@ import pygame from pygame.locals import * -from Classes.Objects.BoardField import BoardField -from Classes.Objects.World import World +from Classes.Game.BoardField import BoardField +from Classes.Game.World import World class Window: __width:int = 800 diff --git a/Game_Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc b/Game_Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc index 67dcf95f9e31c691bfc44275a214fd7d163761cf..4699ec524e0246823e053cac01bb699938ac9552 100644 GIT binary patch delta 1299 zcmZuwO>7fK6n-+ z!n)2OQgg@!EmEkIsvHnKa6-Lt;)=u}0n|o&@}&oaR5{Q}6_@tSI*vorSV4Id{5g>@0mqv^ey}b5cJjk7M$uXZ4xBiUmn(Hhh2|*%3g>_;3&7O}6yPDw z*2pWIOu#UECC%~Mw|eW=rswSnZkEA@JmHY1HVPNu0dfyF1ps*!S!%Nq#nkG5d|Kqw zuNZAPs?;5-7^;}PO?8lKw#jvzhHYW;c**3k9bpM>;;F4iuT2uy@da)MVIF=D2<;~E zUouovEQXXwN-%;UHbD}>E%uqwNTnCm^;9}|%>Gg1=neX5CU~JuACY;6RUywC>KE;z zR}~{6t5mPMcBoI=-qf|KD`a(q3=@f9RzFbx7`JX80=_)8Yw5cmODoQA*^%ejk+tmT z%k1b{YV2idY}FWxg2GsoPG$$$nQ^kVdQ#Z=on+dzNF*9~~dd3Umm#flWD%%cs ziz>dSJ>*`2lK^l3#@#abaHZ`6pWMWA)>Pz3oAhbKF<AY|FtVrkR)hMTkp>5v8=&Ml%p+~AoUn`<|0+xy# zQA9;mLNXVUZ$k~Mc%kYJTVfDn#9j&eBn%-0J?5D%S>C?Rz#=4lJHu?>!itvKDlCPvgVM;F&d8596*^@XE!C z?afqqt1o)dFR~KkrHeiZ0|=o~p7lc2DZ8FfBzaWAwyT$B)Ls(gbe|&3Z#@mx)ue>& zZvw)G0@?@lg-b2QK%+^MY~b$RCg9S6NGD~I?TciD9lM)Z$;vdxIGX} zM delta 1304 zcmZ`&-)j>|9G}_U*%_%J;U(l(-q;sVO?St{TKDJNmRmJ9NNl2b5}&`*de8;FvJ z5<*YlYmXeEcnYP}H(b1w#sQfwvI2#Ld8T-s(Q|W7f#$ak#4er#hi&Ab9HuBIQM`e2 zGL;-2$f|p$a{vW z0x>_B!laaNl?d@ibmfmSDUqrQ;?YQlsH}e0g*qH%txd0%b%+;qLuI3+mgKy&BHa?P zjLZ5eYF%{V-k-)qly`2j zGobJ_BlBw#lx`m+u#TG6;f9r}St;Kds9OUSqZ#e_t82$;*dsN2#J96`JL^ZY71Gg< z*6dN=9;@49esrutUdG~$Sh^NV`?2Ho*l};j%-Fq+_;4*g?8h_pc&2ipnMgJgnOY*_ zCr0Xt5$`v1L*qw%Dc$Y8HdAZuPUGFcdO7e;VtpKVkr+P^rf?YN(9MB|voHtIsvP*| zmI2l~PfNjMsD(P9hsn{M{uYAi3s@6!5|i+u>%!br)#`aj>oJGwz*rJ7Tf4T16Hw+@bPvLVq(EtDd diff --git a/Game_Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc b/Game_Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc index 2141e4eddee0d713d886b66b1f1792fc2752ac46..7aca9940bd279ecaafa65a55691d551f5a15548d 100644 GIT binary patch delta 109 zcmew_^;3#>IWI340}!~Jo0+Pzk#{POwzzXnVsUY5v7UQkZmOPBeqvFITV`rbN)ZcC d*)1Vt*~yoAf|c|xFrc6t3@R5;(PR%^a{z^4BMbll delta 125 zcmew<^b>KSkEaxu_(nYGc_lr rhy|$fmMEHn$!B?jH4HB>pr9KJ>K9Pa2NrEc$q$ngd4(rO^U47LGsY=F diff --git a/Game_Client/Classes/System/Network/NetworkManager.py b/Game_Client/Classes/System/Network/NetworkManager.py index 7850ebd..36d84f5 100644 --- a/Game_Client/Classes/System/Network/NetworkManager.py +++ b/Game_Client/Classes/System/Network/NetworkManager.py @@ -2,7 +2,7 @@ import json import socket import threading -from Game_Client.Classes.System.Network.EventHandler import TCPEventHandler, UDPEventHandler +from Classes.System.Network.EventHandler import TCPEventHandler, UDPEventHandler class NetworkManager: class UDP: @@ -11,19 +11,22 @@ class NetworkManager: self.port = int(port) self.udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.eventHandler = UDPEventHandler(self.udpSocket) + + try: + self.udpSocket.bind((self.addr, self.port)) + except Exception as e: + print(f"Error binding UDP socket: {e}") # start listener thread self.listen() def send(self, message: dict): - self.udpSocket.sendto(json.dumps(message).encode(), (self.addr, self.port)) + try: + self.udpSocket.sendto(json.dumps(message).encode(), (self.addr, self.port)) + except Exception as e: + print(f"Error sending UDP data: {e}") # starts a listener thread for udp data - def listen(self): - udpThread = threading.Thread(target=self.receive) - udpThread.daemon = True - udpThread.start() - def receive(self): while True: try: @@ -35,6 +38,11 @@ class NetworkManager: print(f"Error receiving UDP data: {e}") break + def listen(self): + udpThread = threading.Thread(target=self.receive) + udpThread.daemon = True + udpThread.start() + class TCP: def __init__(self, addr: str, port: str): self.addr = addr @@ -42,20 +50,19 @@ class NetworkManager: self.tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.eventHandler = TCPEventHandler(self.tcpSocket) - # start listener thread + try: + self.tcpSocket.connect((self.addr, self.port)) + except Exception as e: + print(f"Error connecting TCP socket: {e}") + + # Starten des Listener-Threads self.listen() - def connect(self): - self.tcpSocket.connect((self.addr, self.port)) - def send(self, message: dict): - self.tcpSocket.sendall(json.dumps(message).encode()) - - # starts a listener thread for tcp data - def listen(self): - tcp_thread = threading.Thread(target=self.receive) - tcp_thread.daemon = True - tcp_thread.start() + try: + self.tcpSocket.sendall(json.dumps(message).encode()) + except Exception as e: + print(f"Error sending TCP data: {e}") def receive(self): while True: @@ -68,6 +75,11 @@ class NetworkManager: print(f"Error receiving TCP data: {e}") break - def __init__(self, addr: str, port: str): - self.tcp = self.TCP(addr, port) - self.udp = self.UDP(addr, port) \ No newline at end of file + def listen(self): + tcpThread = threading.Thread(target=self.receive) + tcpThread.daemon = True + tcpThread.start() + + def __init__(self, addr: str, tcpport: str, udpport: str): + self.tcp = self.TCP(addr, tcpport) + self.udp = self.UDP(addr, udpport) \ No newline at end of file diff --git a/Game_Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc b/Game_Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e8c79b0c155fb6913f508d8196c64c5d7f0df72 GIT binary patch literal 1861 zcmbtUy-(Xf6hGT>zRgFV6$M&BD8ANEsLy z7&@?pu~Vz4L;r=&ovMf-@>Ho)H={5y^}REp!AT=kJMx zQcEJ_Cr(-;bfq+3fKnv}F$9xjiAa`-As!J!`Y00e8D4*61&)LOkpqZm2y0|I{0kj3 zxhsGEX{~Nfz_dyz$qEL^f4kDYI4Ep>$VWq;}CMZ>z5?vtUteJ-w_h>m{nC%>pE(rcK?psjaTnG=D)u~x!|TTr1$pu`?-BR}MOcy{mrmhtjhp=+ zNjDa6kd#-^{pSA0P!@qCkfS?Bi=!-tMf%+I%g1x6j0A#RvxpxPvWQpJJ^VL-dlM%> zDyf}R0W8!5lY3y{9$2IY7H!8k!DAUV02R5hRa4K=w9X7Sx>DZtwfJjVy4DvQN6!_x zN7C0}$v*r~QVTh!u&XWPOQQDTD)Y?X#GeDdZ@x%*+Xt~~NcB4{43D~~-A>u!z&&G+ic6OYIN^Y_Ww zx-ttr&|#meD|65lC14F$68U)rz_+ptskZHOCAOa31KTarfz zguaYE_kSGoYzkZijK2i}(iVgUQ4aazg(Ct4>J;Z_yZ8g7Qs~zy&e3+!1>l+f2A&I> AtN;K2 literal 0 HcmV?d00001 diff --git a/Game_Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc b/Game_Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..125a49faca7f09757eaf982482526fb99cde2da7 GIT binary patch literal 6474 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 W&3r}-a~zCkbNQUbzt|#`4fbEy(@}f? literal 0 HcmV?d00001 diff --git a/Game_Client/Classes/System/__pycache__/App.cpython-311.pyc b/Game_Client/Classes/System/__pycache__/App.cpython-311.pyc index 51439202bb063b26dff9d22d4c6e1f758a0418b1..a32120bffae46042f4f020a91ca3aa8f87439bc6 100644 GIT binary patch literal 9258 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 xF|YpRP`#)>>*%yt`sC1YvGmEIZn5;qA-`Dq