From 677552a6171aa23b9f62c035c839b9b9a7dafdb6 Mon Sep 17 00:00:00 2001 From: steev Date: Mon, 8 Jan 2024 20:07:29 +0100 Subject: [PATCH] merged broken branches client with master branch and added first statehandling for card placement --- Game Server/Classes/Game/Player.py | 15 ++- .../Game/__pycache__/Player.cpython-311.pyc | Bin 2807 -> 3460 bytes Game Server/Classes/System/GameManager.py | 18 ++- .../Classes/System/Network/NetworkManger.py | 123 +++++++++--------- .../__pycache__/EventHandler.cpython-311.pyc | Bin 2374 -> 2256 bytes .../__pycache__/NetworkManger.cpython-311.pyc | Bin 10078 -> 7483 bytes .../__pycache__/GameManager.cpython-311.pyc | Bin 3243 -> 3826 bytes .../System/__pycache__/Server.cpython-311.pyc | Bin 1900 -> 1900 bytes Game Server/index.py | 2 + Game_Client/Assets/Cards/1/card.json | 1 + Game_Client/Assets/Cards/2/testspellcard.json | 5 +- Game_Client/Assets/Cards/3/testtrapcard.json | 5 +- Game_Client/Classes/Game/Cards/Card.py | 98 ++++++++++++++ .../Cards/__pycache__/Card.cpython-311.pyc | Bin 0 -> 6058 bytes .../Cards/__pycache__/Card.cpython-312.pyc | Bin 0 -> 5404 bytes .../__pycache__/MonsterCard.cpython-311.pyc | Bin 5661 -> 5671 bytes .../__pycache__/MonsterCard.cpython-312.pyc | Bin 4981 -> 5506 bytes .../__pycache__/SpellCard.cpython-311.pyc | Bin 4751 -> 4761 bytes .../__pycache__/SpellCard.cpython-312.pyc | Bin 0 -> 4612 bytes .../__pycache__/TrapCard.cpython-311.pyc | Bin 4727 -> 4737 bytes .../__pycache__/TrapCard.cpython-312.pyc | Bin 0 -> 4590 bytes Game_Client/Classes/Game/Events/GameStart.py | 14 +- Game_Client/Classes/Game/Events/Login.py | 20 +-- Game_Client/Classes/Game/Events/PlaceCard.py | 22 +++- .../__pycache__/GameStart.cpython-311.pyc | Bin 0 -> 1191 bytes .../__pycache__/GameStart.cpython-312.pyc | Bin 0 -> 1032 bytes .../Events/__pycache__/Login.cpython-311.pyc | Bin 848 -> 1275 bytes .../Events/__pycache__/Login.cpython-312.pyc | Bin 0 -> 1091 bytes .../__pycache__/PlaceCard.cpython-311.pyc | Bin 1013 -> 1879 bytes .../__pycache__/PlaceCard.cpython-312.pyc | Bin 0 -> 1699 bytes Game_Client/Classes/Game/World.py | 17 +-- .../__pycache__/BoardField.cpython-311.pyc | Bin 5033 -> 5043 bytes .../__pycache__/BoardField.cpython-312.pyc | Bin 4685 -> 4938 bytes .../Game/__pycache__/Player.cpython-311.pyc | Bin 2761 -> 2771 bytes .../Game/__pycache__/Player.cpython-312.pyc | Bin 0 -> 2688 bytes .../Game/__pycache__/World.cpython-311.pyc | Bin 11167 -> 10515 bytes .../Game/__pycache__/World.cpython-312.pyc | Bin 6156 -> 10096 bytes Game_Client/Classes/System/App.py | 67 +++++----- .../__pycache__/InputHandler.cpython-311.pyc | Bin 3305 -> 3315 bytes .../__pycache__/InputHandler.cpython-312.pyc | Bin 3097 -> 2996 bytes .../__pycache__/Label.cpython-311.pyc | Bin 3655 -> 3665 bytes .../__pycache__/Label.cpython-312.pyc | Bin 3603 -> 3603 bytes .../__pycache__/Window.cpython-311.pyc | Bin 3449 -> 3459 bytes .../__pycache__/Window.cpython-312.pyc | Bin 3238 -> 3232 bytes .../Classes/System/Network/EventHandler.py | 30 +++-- .../Classes/System/Network/NetworkManager.py | 85 ------------ .../Classes/System/Network/TCPClient.py | 46 +++++++ .../__pycache__/EventHandler.cpython-311.pyc | Bin 1984 -> 2929 bytes .../__pycache__/EventHandler.cpython-312.pyc | Bin 0 -> 2343 bytes .../__pycache__/TCPClient.cpython-311.pyc | Bin 0 -> 3485 bytes .../__pycache__/TCPClient.cpython-312.pyc | Bin 0 -> 3142 bytes .../System/__pycache__/App.cpython-311.pyc | Bin 9258 -> 9767 bytes .../System/__pycache__/App.cpython-312.pyc | Bin 6713 -> 8817 bytes 53 files changed, 344 insertions(+), 224 deletions(-) create mode 100644 Game_Client/Classes/Game/Cards/Card.py create mode 100644 Game_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc create mode 100644 Game_Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc create mode 100644 Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc create mode 100644 Game_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc create mode 100644 Game_Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc create mode 100644 Game_Client/Classes/Game/Events/__pycache__/GameStart.cpython-312.pyc create mode 100644 Game_Client/Classes/Game/Events/__pycache__/Login.cpython-312.pyc create mode 100644 Game_Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc create mode 100644 Game_Client/Classes/Game/__pycache__/Player.cpython-312.pyc delete mode 100644 Game_Client/Classes/System/Network/NetworkManager.py create mode 100644 Game_Client/Classes/System/Network/TCPClient.py create mode 100644 Game_Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc create mode 100644 Game_Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc create mode 100644 Game_Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc diff --git a/Game Server/Classes/Game/Player.py b/Game Server/Classes/Game/Player.py index bb9044b..0b39b40 100644 --- a/Game Server/Classes/Game/Player.py +++ b/Game Server/Classes/Game/Player.py @@ -7,13 +7,21 @@ class Player: __mana:int __name:str __handCards:list - - def __init__(self, name:str, hp:int=1000, mana:int=0): + __deck:list + + def __init__(self, name:str, deck:list, hp:int=1000, mana:int=0): self.__hp = hp self.__name = name self.__handCards = [] + self.__deck = deck self.__id = random.randint(3, 99999) + def shuffleDeck(self): + self.__deck = random.shuffle(self.__deck) + + def getDeck(self) -> list: + return self.__deck + def getName(self) -> str: return self.__name @@ -40,6 +48,9 @@ class Player: self.__handCards.append(card) return self.__handCards + def setHand(self, hand:list): + self.__handCards = hand + def removeFromHand(self, pos:int) -> list: self.__handCards.remove(pos) return self.__handCards \ No newline at end of file diff --git a/Game Server/Classes/Game/__pycache__/Player.cpython-311.pyc b/Game Server/Classes/Game/__pycache__/Player.cpython-311.pyc index 83afbc8278b702f1c52d9c347973ebd40bec6551..7b50bcdc1cfd2fc2b41c2e2dec3e053e58851e0d 100644 GIT binary patch literal 3460 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 delta 957 zcmZ`%&1+LZ5Z`^@CNFK0(l%*RKd`mD8Ure6Kx!$pr3w-Xr3$@;yr&h@2KJ?j5@`=T zROrF52Sq9LR3jqd-=KI-OTh3B;#CBR#EW`yW)qr5ad`Wiotd54o!`7l=tDU0A`tKq zke|PwIrF7JlrEJEv0HiD&lK^k9g|6Jj>Zx1&x+ypk-JM z2JnOwsZFD;5Fxg7N4$`Y6{X!n@6k;Gb6ZlR>$coZ-lNbUtfq8Yl-OiJEK5mys&m&_ zEqLm+{H@!op0VaSY&EmuKySV*b20^I5j+fUvJ~bA#li^Kr>AFZn>nuQVpG~l5N7g+ zQZn5IwmS^~RQQ9B`?n{b-Z=0N*NJp2R5L>#&Den%+qu3wTOO+pC-;ZOt3%`aW~yqY zDrTx?2DfJFDjXH(SvP+#ouvk^OT8ljsLAj))(`NKux{L&2uP*?ou890CuB8LPSy#i z|3Whv^RlH-FMlmNeglhOZ&{g7(fCD%L$xS7fl6-ne|W}4Rz%aF89wbnWO0UnqkaB9 z^dJlH`W@vf4f99pax?}GOKP*|;(!HdJ}pV3d`f$J6&p%h28&=a4wMZbh)V}?C%P9r zSZHF+BP<+86QPG+(&JKjmM`mxQNa>=EnQUddZu$3*LB>)9Lzd_KQ#`Sf6@moi28y| zQLD55FJodQZ?EN?Nfw84_=maMe9SmK@tK^dbbfWsM}ho*;XC?%v;z_T+&Hh`8~*^_ C5x5ut diff --git a/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc b/Game Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc index 7bc686b6c79c7120bdc8166f1b92f024a1e81e3f..7d5188f91f19ea55044e2f67762d294a6561646e 100644 GIT binary patch delta 3685 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 diff --git a/Game Server/Classes/System/__pycache__/GameManager.cpython-311.pyc b/Game Server/Classes/System/__pycache__/GameManager.cpython-311.pyc index 8fa01a3848fbfa0244ce36df8fdeffee74e8934c..1e24e1dce94a888aa2ad79056f413e00a5359727 100644 GIT binary patch delta 1460 zcmZ`(%}*Og6rb5o?|N-EgklJxb__C5L8Q`@Hi=6?jU%K62PsMvELE-J8NOoH*6unG zWS1V&4^@>4nFEA4iW8wyDVId;q5lAf-0a9wtUaevdvn^JsvbJC#tqQ+S^MTUzxloA z*|%@zQRi>n{vDrB1=Jpgi+IDg?(Yai>1+cafM6OV8Y4_VI_J{dBA?*bN4ub~o*0BT z*1wF6U}c6wo?AjfManIZ@FErSl<`tVLmC#54=XMwAwT7OsO1tE(4YJ@1EKaqikpP6 zgFNA_9!IfL*-M$!b!?|NwxKB!UP_ZJ+A3fETG;76kcP62taAT%`#ViV=L&L#wi ze}xNto-axNEbRkG_znW_h&~O2fGXLa{>xlt%ONQViM^5=qmUIL+*1%}xLeS}@p*xk zQ2dUOf0prB;@T zY$^U#2-e^??LEMbG{pe)0<*gy*{sNWhCF%cF1W`XOas9*?S_K%DScnV(?Cmb2`ux| zV2Snz{jN&fkS-r3|L4q0~6v@NrpW}g3r{{Vnr*|%~OmuHFr(Gl?tY}k&P zO($<+b1`Wo9Zv(#Wt*%)rH(L{G!Pkp#jIzq0SLPty`O=LN8HhD9hNg@Ygi*-*ZM0j~neuF~mV@O8i!El?>{t{64 z)kK{;>T9nBx~hSJYT(r4tJT2hPs`Q71X-0Mt2MptxgL6^hbnrws)x&ZxYlv}zP6>^ z@fZDTB3<6lZfl#DOT(q{(r|IQqW4wxzOvp|mq2%aEgabyd^q^v+!)!^{+;OS?<)0N=a zYVd4Dk5=_)S&vdcewHr=emtkgByLwyV?*Mu-Wux{cl*WI5c$w^6`m*C9tz|O8ZYYEl)4%OJtc2> zuXG&~eWgep(BZIqmuz}xJfis~iy9+P>p68W-=Ci7Vg}{Xc+{Mv8g`jjn7TR-A*=!K cXYP+&)VklFhVb<|_;3Hx<^TAfRd@S;1FYj$A^-pY delta 1037 zcmZuv&1(}u6rb6h&3^Xw)H;XyQE5(!^dj`)MFbVWgU~__VgCY;TNMhPoQXD2_3g}W-n=)znfI~ZqRY+t zOHES%6;*#`-cjfEruKHaTL2hfm<1`ea#=XWr8o#U&<8MI1Q@;G09dB;x1{*_;W*6A z&-EsXASGjoqJm|UAK|c4M5!PSngUi$wQ37sjoLJM`jbO`cXNhCJ{+nVq{ zE{v#CVost3LOfTJ|LD4cg+;!==Rrwfrs+JNhg?(dK;(TWz(T?Bz8{njSoB)G+20+SE}S`snoiS~qLjar%8!AyFL42V+e=vR8R zCp&K1cB##b@t$DbG%eRdV`(exao2NXNo<2E`6Leaiy6~B!^{Fz`iDH^m=^Zr-doqq zoI5&h#ROZYVS3VpW7^#q+a6+?C+5;q+3_^?py>$o0Qo4z#TZqb4L~-ecr+w8`hddy zexK8|#){EWHezL?{q@DNah&wZZC!o;no9MPCK=4GZ!k`SIRT$68&yTo+%h4x%fA#!C0GlL_v9Lg_Jt_nqOMu<#))^ccid zF2XMIMKPnhXi&Es`)DOto*C0VNHZPErl(BXIYkD8ov=t|gG0hL+C^@&v4mImgbz?= z3{~^DSp)6Eq*Lt<46-awlY8os`e;S1n@i3n*VIT^jjXB>@>#ull=18Y1NOFkm_Y}F zLk#K}gcz{8Re>qaTXI#q5NZ%KAJpI=S<^;%L?1q(w@z=R|CEl6jpK=|dED-zeD*6l nmnrx>gs=j%nd(;oZL3>{A2IG#0 delta 20 acmaFE_lA#qIWI340}upp&)&$L$PNHHnFQwm diff --git a/Game Server/index.py b/Game Server/index.py index 18c5a2a..d93b9d6 100644 --- a/Game Server/index.py +++ b/Game Server/index.py @@ -1,4 +1,5 @@ import os +import sys from Classes.System.Server import Server @@ -9,6 +10,7 @@ def main(): UDPPORT = "54323" Server(HOST, TCPPORT, UDPPORT) + sys.exit(0) if __name__ == "__main__": diff --git a/Game_Client/Assets/Cards/1/card.json b/Game_Client/Assets/Cards/1/card.json index b2b53c5..3ce8af5 100644 --- a/Game_Client/Assets/Cards/1/card.json +++ b/Game_Client/Assets/Cards/1/card.json @@ -1,5 +1,6 @@ { "id": 1, + "type":"MonsterCard", "name": "Test Monster", "image": "Assets/Cards/1/cards.png", "description": "can attack other monsters", diff --git a/Game_Client/Assets/Cards/2/testspellcard.json b/Game_Client/Assets/Cards/2/testspellcard.json index 7c1ebee..f812019 100644 --- a/Game_Client/Assets/Cards/2/testspellcard.json +++ b/Game_Client/Assets/Cards/2/testspellcard.json @@ -1,6 +1,9 @@ { "name": "testspell", + "type":"EffectCard", "image":"Assets/Cards/2/artwork.png", "costs": 30, - "description":"this is a test spell card" + "defense": 0, + "description":"this is a test spell card", + "attacks": [] } \ No newline at end of file diff --git a/Game_Client/Assets/Cards/3/testtrapcard.json b/Game_Client/Assets/Cards/3/testtrapcard.json index ef4ad97..13ed51a 100644 --- a/Game_Client/Assets/Cards/3/testtrapcard.json +++ b/Game_Client/Assets/Cards/3/testtrapcard.json @@ -1,6 +1,9 @@ { "name": "testtrap", + "type":"EffectCard", "image":"Assets/Cards/3/artwork.png", "costs": 30, - "description":"this is a test trap card" + "defense": 0, + "description":"this is a test trap card", + "attacks": [] } \ No newline at end of file diff --git a/Game_Client/Classes/Game/Cards/Card.py b/Game_Client/Classes/Game/Cards/Card.py new file mode 100644 index 0000000..748819e --- /dev/null +++ b/Game_Client/Classes/Game/Cards/Card.py @@ -0,0 +1,98 @@ +import json +import pygame + +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Player import Player + +class Card(pygame.sprite.Sprite): + __name:str + __id:int + __description:str + __attacks = [] + __type:str = "MonsterCard" + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __owner:Player + __state:str + image:pygame.image + rect:pygame.rect + + def __init__(self, pos: pygame.Vector2, assetDir: str, inputHandler: InputHandler, owner: Player): + if assetDir == "": + raise ValueError("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + with open(assetDir + "/card.json", 'r') as file: + data = json.load(file) + + self.__owner = owner + self.__id = int(data["id"]) + self.__pos = pos + self.__name = data["name"] + self.__type = data.get("type") + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.rect = self.image.get_rect() + self.__inputHandler = inputHandler + self.rect.center = self.__pos + self.__description = data["description"] + self.original_size = self.image.get_size() + self.original_position = self.rect.center + self.__state = "onHand" + + self.__attacks = [] + for attack in data.get("attacks", []): + self.__attacks.append(attack) + + def update(self): + if self.__dragging: + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + def attacks(self): + return self.__attacks + + def getName(self) -> str: + return self.__name + + def getCardSprite(self) -> pygame.image: + return self.__cardSprite + + def getDescription(self): + return self.__description + + def getDragging(self): + return self.__dragging + + def getOffset(self): + return self.__offset + + def getPos(self): + return self.__pos + + def getType(self): + return self.__type + + def getID(self) -> int: + return self.__id + + def getOwner(self) -> Player: + return self.__owner + + def getState(self) -> str: + return self.__state + + def setDragging(self, dragging:bool): + self.__dragging = dragging + + def setOffset(self, offset:pygame.Vector2): + self.__offset = offset + + def setPos(self, pos:pygame.Vector2): + self.__pos = pos + + def setState(self, state:str): + self.__state = state \ No newline at end of file diff --git a/Game_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc b/Game_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2613763c49af704ef8ae743aacf9c4fecc55f3ae GIT binary patch literal 6058 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 BIXwUX literal 0 HcmV?d00001 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 4e5d7a7b9d3a7f2901bc7bdd5b26f31eefedd7f3..af7a820e553974ac968e0b9e9735281305d51046 100644 GIT binary patch delta 59 zcmbQMvs{OJIWI340}!+-%-P7T$DtVMY!wq)oLW>IQ(TgoS{CDyTAW>yUl5a2l%JiN NSCX8*Ie_CVF8~h<6T|=j delta 49 zcmZ3kGgpUuIWI340}wc#pS6)&k3-zw*(xTqIJKxarnn?EwJgRZwK%&ZzhH9|$5~zg DW{D68 diff --git a/Game_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-312.pyc b/Game_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-312.pyc index 572cc0bd23de4f67b9e70e2d1dc835246999db67..4f889b755f1cc92c814054675922da11dc78f821 100644 GIT binary patch literal 5506 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 delta 2268 zcmZ`4OKenC^xpTG-g}NndFfqoZ?o>9Al2FDNV~jD81RIeJ8$IXFylE%am%MY&|9{`RwDW1+ zcgN@R5O^+qJ#T8)e7yywLT8ksLJ1>`R@9;jr&`fw^rB9QLXHxqT_#L7)oW)*7S++} zT!A*cW7XLU^<(8KtC)NO-Pw<$g*^F^5^|lGq(~VlDzA|#QdCXN)EV6eDiTv9=9u=| z#_K2OsVHSy(Pg@U(veaYiMgpdb1=s(rDbPFNkup_t#EJK=mHxI;orpElHG3j7|%UUtOf|p4#$hrV_v5=`vDl82A5a64J z1bGDHVb%>65f%m5&0+wfEDrGX7)!trXGzlyswq%Suq~UX0`fG-lk9&|1$hSKskv++ zC%#g)i9eK-NT?IxQ0YXiYSm4Cu*_MhRG*tQ#Z|R8KB3u-ffHw~!uw=R5f9Zn1KI*z zASJi0v7j+60R-^m#v#Anwx5oQU0PTq^=Lq!2gxni7ks7@Vnk2-j3$NFO--5tem>3| z;4WYb>$;7J+cfeVb26vB2B6ku3l~(NLT!qOvos=1J-V$FZZkFJY9$+K^X$+&F(n!m zXY?%1i*G%VOexk@(wG|!50NuzLf+9K-$AU5?g7PcShwq<{aoJYbY~*ZrYrvTc>f5*69sXeSUV1r^O>z!hr=_S>bVyi<s=@-5M`hxhy7lSmw`zcHV zO2FIDp@{Sz0Q0epb!_M}er_!6wT!>KxU_iJ)oPE74o>mHbT}0c{X6K0_{Wb;fatcO z98gD^W*{4TsWZa-()?XlqO(5Ve24i-?UN7)5|P z!H*yqLx2_W6NKy|d>qkN0NiZ#UET$}{2T$UqV*WS`(!m3x;VCK_}_bZHPpSLb&DUu zL;Jfj7mr-ov!Z2IJ;CL^rM?v{y6O%rr*yy{3r0MfIkJE6!#;2Z^@!lNW<^5nH+xuF=>ohKXdJy zsj&+cbC|ygBwlT+0ANj}l>SJJpGfpq;`@z^{H-0OG;uY5z5iPOgHZlnDF2ioN4okK DX8yI# diff --git a/Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc b/Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc index af192b32fbbd88acbe45615ae7743340c06080e3..5322c49d0a09c9b6af40b3b11be4b7e36006db02 100644 GIT binary patch delta 59 zcmeBIovF&boR^o20SHIQ(TgoS{CDyTAW>yUl5a2l%JiN NSCX8*`9IqPZU7@X6te&T delta 49 zcmbQK+ONvJoR^o20SFvk&)mp;mrdN)*(xTqIJKxarnn?EwJgRZwK%&ZzhE;b`vh(P Dbw3ai diff --git a/Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc b/Game_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3fe757030d08017ca289d19d1770a21eda58042 GIT binary patch literal 4612 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 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 index 3cda490404519d5652a99c3161a8315600839366..8b137f59f79499031b70826a3031cc770d280251 100644 GIT binary patch delta 59 zcmeya(x}S4oR^o20SHIQ(TgoS{CDyTAW>yUl5a2l%JiN NSCX8*`4d|!Hvlsm6x;v+ delta 49 zcmZov{jS2joR^o20SFvl&)mp;flb`U*(xTqIJKxarnn?EwJgRZwK%&ZzhLtpwpMNc Dg}D(s diff --git a/Game_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc b/Game_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a01791f7a08bcbd4f13b9d6a8e6a84ea153b83d GIT binary patch literal 4590 zcmbtY&2JmW6`v)S)RGiMN&FBgN)%<)a%nkA3HpC6l3+ z%F1b{hL#jEv zdGmYo@!OgA-VFIyuh&hW{B7sAa#A4V8*G@x(Nd0cpzIKdNL-#Iv9{&84O`O28JIn3 z2h5)5HylX^M{MLek@yEha>({vzd2c_&JA>QQ+r}Jw4_kt63%~PV0vxv40q(h#tc>oecdhVs1-MKuzJ`` z{k_+eys}*yklkxe$@hRy4oHI!NYW<_$@VpyGz`cf=snj3yC3XBQUFE_OF@u+DFiYg zjerbFVUQsyA`8%S6nc(G(cT=uJ_h!%^gSHGJ`VOsDVCVfgGk!jvQF`E^dXC-u(qbknm%HIvKD{pT3;&_ zW!;h8NUzH}PvwlJ+hHYLNUJc#VwURt)}a~Ra!}}s=*7o>1O_`~%O-Ij|CkUO)Y_eL zEiZ2aph&hS;JR2=iPoMkXF9fFVloHud9vg@ClNxnh&dxiG_Psz6?NK>X$7|SGBnJQ zW_^#};y{>7a?i==S<1hI`eEzu4Y; z%c=L;rS?8pX0%Ct*3-(p)UlbGg#L9ZCxnVn>oh zm`~Q7#nL*)w^J?BEVfsTS`fvolGQ{}=Z!V;g|wveg`%ub^gP;!0=XA!z-{lJ542CQG7w%?gbobK3JgA;#?0kiPDny&(lLs%=#$Un4 zC^Ytyd&$Q5D}dC;FB;(F**``85NS-#)h6c4RT>JySb(wH};r1aH=Y zH|xO_MsReZ!hh*IhOZ}?R>njfZt7Ov{XHmy@QuXRI62IPC-;fY0$2`oF=_erYe=JWe4kf8KNJja z`oE74NO*dX&|R=I@3JRedDu$Dz<%0ISix+#>a z6#4fa{jk@dp0V%~oGYjOy?l!bcW7 zhuosLQIIzCsP~KFC!6Vf%VJkG3O`&#_EJmZyG9j7itldvBNP~}I{#6jkT-&cN07M; zCM@U^{ryRf^quk0z0-hcE-JvMj$M&48KslQ0GHUmv1{-jn?_V5kKUJ?_S!U-K+d&pD#I{$m2wk&|;w?%v(s+S|hR`EOGbCXk4O9giV?()LZ5Cu^JZ5|swQvDE)+J3 z1qI%J>a6u24a!ajFH#ys!8UXiHH=lZ$uERA3{RM+w*kW|R84?5vU42w590YJ34KGn d{~~XG$G^pKk;>g|$aD?gRLwW_AA$&*>c3AWovQ!< literal 0 HcmV?d00001 diff --git a/Game_Client/Classes/Game/Events/GameStart.py b/Game_Client/Classes/Game/Events/GameStart.py index 5faf41d..29b3bff 100644 --- a/Game_Client/Classes/Game/Events/GameStart.py +++ b/Game_Client/Classes/Game/Events/GameStart.py @@ -1,8 +1,16 @@ +import pygame from Classes.Game.World import World +from Classes.Game.Cards.Card import Card +from Classes.Game.Player import Player +from Classes.System.Components.InputHandler import InputHandler # send from the server to tell the player the game starts # gives the client its and the opponents stats (not cards!!) -def GameStart(world: World): - print("game starts") - pass \ No newline at end of file +def GameStart(world: World, handCards:list, inputHandler:InputHandler, owner:Player, opponent:Player): + index:int = 0 + world.setEnemy(opponent) + + for card in handCards: + world.AddToPlayerHand(Card(pygame.Vector2(500 + (index + 100), 1050), f"Assets/Cards/{card}/", inputHandler, owner)) + \ No newline at end of file diff --git a/Game_Client/Classes/Game/Events/Login.py b/Game_Client/Classes/Game/Events/Login.py index 244ca7c..1b809b2 100644 --- a/Game_Client/Classes/Game/Events/Login.py +++ b/Game_Client/Classes/Game/Events/Login.py @@ -1,20 +1,22 @@ +import json import pygame -from Classes.System.Network.NetworkManager import NetworkManager +from Classes.System.Network.TCPClient import TCPClient from Classes.Game.World import World +from Classes.Game.Player import Player # event the client sends to let the server know it logged in -def Login(networkManager:NetworkManager): +def Login(tcpClient:TCPClient): payload = { "event":"login", - "username": "player" + "username": "player", + "deck": [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] } - networkManager.tcp.send(payload) + tcpClient.send(payload) # server response for login event -def LoginResponse(networkManager:NetworkManager, gameWorld: World): - # todo: get labels from world - # todo: get name for enemy - # todo: adjust enemy name label - pass \ No newline at end of file +def LoginResponse(message:json): + # checks if the response on the login request is successfull + if message["status"] != "success": + print("login failed") \ No newline at end of file diff --git a/Game_Client/Classes/Game/Events/PlaceCard.py b/Game_Client/Classes/Game/Events/PlaceCard.py index e78522b..1be3cc7 100644 --- a/Game_Client/Classes/Game/Events/PlaceCard.py +++ b/Game_Client/Classes/Game/Events/PlaceCard.py @@ -1,9 +1,9 @@ import pygame from Classes.Game.World import World -from Classes.System.Network.NetworkManager import NetworkManager +from Classes.System.Components.InputHandler import InputHandler # the event the client sends to the server when it places a card -def PlaceCard(networkManager: NetworkManager, card): +def PlaceCard(tcpClient, card): # todo: send card information to the server # todo: required info is: # - position @@ -12,12 +12,24 @@ def PlaceCard(networkManager: NetworkManager, card): payload = { "event":"placecard", "card": card.getID(), + "type": card.getType(), "pos": card.getPos(), } - networkManager.udp.send(payload) + tcpClient.send(payload) # the event send from the server to display a card on the field -def CardPlaced(world:World, card:int, pos:pygame.Vector2): - +def CardPlaced(world:World, card:int, type:str, owner:str, pos:pygame.Vector2, inputHandler:InputHandler): + if type == "MonsterCard": + world.spawnMonsterCard(f"Assets/Cards/{card}/", pos, inputHandler, owner) + pass + elif type == "SpellCard": + world.spawnSpellCard(f"Assets/Cards/{card}/", pos, inputHandler, owner) + pass + elif type == "TrapCard": + world.spawmTrapCard(f"Assets/Cards/{card}/", pos, inputHandler, owner) + pass + pass + +def MovedCard(world:World, card:int, type:str, owner:str, oldPos:pygame.Vector2, newPos:pygame.Vector2, inputHandler:InputHandler): pass \ No newline at end of file diff --git a/Game_Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc b/Game_Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..771d6ae4f4adf0aa314d018347f112a13a036c99 GIT binary patch literal 1191 zcmZ`&O-vI}5PsY4ZnuR-kRVYD(O`(Zl!SvZ#$ZTk(1cVIel*PrDZD3E_NRHffQ79R zW1mFvzrv+cSYjTZ(B4&#mrF=&#Ru~7Z^_Edy zux}O(sxj_MOBm?KAA*gcmfu=x@|#NrgehjZY#Pk4XC+K=NZ3~t*8W!j=u4cyX#6v-onkGFQ}@ADd*ew#f(5F^)ZO1tE@r!{aRgzEm@{`5V%$qL;MLWnO#Pf7kzy1y&k>-58w_k*8%w>x(_zMQWO@@91vtsGDc*)C^+C zbC$cXT>`7;W`YOJ@wNF~O^)DJGKk^i zJDR-Vy>NU>eqX~gR)KlynXIXYkJ`$d{3f`J!J<~O>|i*b2=9U&-U)D^T-Qyyps_*T z113IP>m2|zAqXBxt_DAkTymS)BbVJ~_DG-G%pSSnHgi282~}ZjqE1k5&`@rtLiuen PlWM zP>UAsT3ApJLrwanDI;H-8CtLYV_bQ) zo~6X4gJj||AypNy`1OC{{O#aG4@xuIfp=(G#8sHI2njq)UIorknBuA{z|;%LjkwaP z9A*#uKkb)Eg(Ra{fghCiV6bh5-YI}CCI)PqJ9baNMbAF%Nh-bunT*Meihpc?u~93e z5*ZYDyRVij(*=Y3(Q#gMEYX{c3Y=Wv&?1Hki4qNLrs;ji!h4L(pU@t(V|8wLM!bz1Y zehkq;Bu+pZoWQ;XYKd$$H7{kh6rQ>7)TZ_YR{AhP6|yi37ZyZBh*Am?OIs1bg>ubIL(F|Kb5o5}2qM^x z(4Ad$Aubeg>ksfJq>{yDKoDGYccHtkJTo!H`1k{!d+wPtb7sz*$2afu`4I&4`Qicn zq#^WOP6h;XMaOF}yha2O?4xRb#8nJ)&DR3Gs$;pP`$k|^O{E*Y71&i9bd%~^8nIp& zRfpIVf$o5wBX}JZb4SvBrHDmtqr6)78#GK{Vm^qNPe8F&eXmWK$R)M7Z>?b!P+u4@ z=rOzFQCF8wAO^;8=Quus4)xD7k2Em{m3I+LZVPO*(hIk@52f1 z@`TcD_crCtB#PaKENX(gTHU=D`i+ooZj_hZWpKOM@1I-tJj?5}*W zFJ%au3tyf5Zg}X-_ni6efHNHo%E~6;SaC!ck9Z_e+^)-h7JinzwBCkZ1*Hm29!IQM zI(>0WCM+fg+hn&&>IE|Sz{J#$q5mS82^Q5S74rwAu2wmnI5&cbw0wG#U4Tt8S^f$H zgo$yA&UDn5qI^evDZ17j<`gY`i)kG%>@Q{rhJOkb?hiVX BAEW>P literal 848 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 g=+6T`4JcTj{P^kQ^!ntq(wc 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) + def spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> Card: + card = Card(pos, asset, inputHandler, owner) self.__cards.add(card) return card @@ -132,5 +123,5 @@ class World(): for card in cards: self.__cards.add(card) - def AddToPlayerHand(self, Card): + def AddToPlayerHand(self, Card: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 a5b09d18cc3243d53bea9388f0128521e5a04784..ad4f1a087bfe6278876ac00da402bc25505397c9 100644 GIT binary patch delta 59 zcmZ3fzFD1nIWI340}!+-%-P5-$EFzMY!wq)oLW>IQ(TgoS{CDyTAW>yUl5a2l%JiN NSCX8**?}#S7XS@O6GH$1 delta 49 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 NSCX8*xr@o30{|Z?6Sx2X delta 49 zcmcaCdQy~oIWI340}uq`B1!z@7q}2yhy3QtpR7IvoK$1#|y8C)j%w zeA2J!lL4O*dI@THome^@1HaK$wm9xZR_k_)aW7{1z_MyIq--?3#9(I2cI=Sq*jvmS z9n5an4lUW73Qq+uT`tyfO|{PsJPPCiu!r=ngV-m#$}X`0`QNSz8k~QiX`ltXA*4l) zl$D~!ktlo!g$bgld%9rtb&lNRF%)qS0z>BEd%jS*S-CA37nNHsV|ObHOnmA#nw3wS zdd*?hT4}Me2sv7%dW|`5rBt_tU_#m|en+l1Tb>DRacZt*?W6)@-+*z&IEc^5$))T= z{mbY{b_#}=93IDdFhxAIMyrELz%b~-C@5#U&>|d}e57y#hN8+-Fz^frfqwZsM^bx+ zVD9q5PCQ6RYPeEFK?K=6j&h9PML2V}xl{kzdOU@l?=1hR2re|c~DP~BU3 zs0XaPNMn%W=h9&bUZHSfP@ly-@JdNWc2YC#)XcFtF3{7O4RPx6`TwefXJ@N%m-VTG!mEqcASQ5yS0WR zV2vhR?nRodJK*j`M3dKC<{68;vEAgzWu8TWZzj*7KyvW{iZ@YQL-96>cR(EZPk?-| zxsFy8cmU!A#24fw8o$5fi&*mhM<-IGv-^p?L?>NnrwhO6g|4m{(+7nvf#I+uhbPq@ zYTaSQ82?)I2n^kbVodsY67lpw2JO?YvKMey#V8yWaA^UT<`1&p<-W;vCg<9db7;+X zBdU=<%>I!3KG&JO(Vo50BVg#7Xw7sHKgs@>JIZy6^X=mNUucjwOO^^p|8Bo*{vINH m5@kQ0oAds`yw7if4eyV@$*!g-%C98xw|-5@|4BedpML=2@cK&t 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 3f8ca3eca02f862c821472f42feaa20a0ec1d540..b598ff51cf346590e38e66d52753274521974c15 100644 GIT binary patch delta 1735 zcmZ{kO>7%Q6vubhAKB*1X-w=mw&Qi`jlE5=P!&K_d{t>>5Tz1LAtg!y$2$%t{$ggG zwpJTQ5JZp=G@466MdW~>p%PRIM-Chi*BaDAwa_b9f(ocaLgKwyl5{J&vVZetcK&bP zzIijBPVp1HU-a~JO7NU`@G?0aUhN%}S60*c1Eyr|DF-Tj(|xj}NIA*uT$aqP&lO3! z3V-LB-fPN}lF_|-<<*2C+un&hH4ED>u@#P?y{+(J`B!<2`;_10QGVDH38$C6(+M*} z;zh+Yz}C$D;OfA}yeFr$dO$<_0Jgt=ZZ2OTwx88$$s)EdM{A8b-HQ|Y5kbTNB8-S2 zdJzGD-8>vd8!sTbE0 z0r&7<`lGVW@ATjDkK$;G{~V0Ssf|B_-}vMV|1$E(kOt$1OfeVhGS#7BGC-rFd@Evv zUciAaz>;(`5WEpcw$&uf@N2Q`pa!F$#I@-xU`N*)N(`KYf!nw-LihfKwiC<=>%?BVbpJ%-1E<|#o^PvBw@mE5OV)_# zq1WzNPH(HaTPKRcrTZ(E=)$t4MTAJ<(;AqNLM$Rz3ZZYSbHqAYC6#l{UQt!q?Y_`g zP?F&v#IHZ~C_3>vh1>y?j$mISO)Iz_$a(> zza4(rn}IR@QT+SdpaqVHn=J-|8?7223++Pw`tkZfh+>S&)ba;dN>d3+D7Eqt~pjPH(# zrhV!ar!CC!N#n8X+W4j<`;7a-Sq4`y`e~AXW!%Zx;fZpdF~YKVlV)*)nV=J?h-MW- y+KF&WeY{dL8)fn&{TN>0y~S*PegB7(H>FJ5{oC|fvJCP3KYthFf86J-Sn*#mHieD= delta 2080 zcmah~T}&KR6rP#=Vfovk1r}I#yR$62%ZP21rcDWzq-g?8wWO97gkZ?P%);Vyce%4` z1!<|4s7;L)Z(@jvx=#v`2NL?`s}H=WgWPV_aO{}=bCHjjHJ{5(xB)oN~U7B~U zsvKd?SJqO3D#LnAeP)Fl?^L@X+41dO*PyUm2QEYeu)Mj28RfcWd5s)N=QYbSNV0_- zX+Vb~2uBf`5CRCT2=xel0LwpBNbBk#L>SEyU6nnS+tBnB38F_kLI@!YV0Zu|e4g;< zKk~NFsCR%5Y|naI>Rx7{C0MtrMzraCmh{+(SYEqMC707ODsh98T@%}b3ppO5WM(wW zW#ow^q*b|*bW-!^Ln)5FF@VJ;R^16_v9axM8y|S;k{H5Ew0wbNsMy{ejDSJr3C7>x zNhb({2argd{?H}|E~B9q;5PT8*tjP~O<$BG>5<@x))Es7CJMThd85Hd^Dr15V`~}j z{hOvQA9pXu*PqKLzOJ%YiSMq>i`DV2I zd4;IPqTfEV^7{m=R+PVF`r4gkuxY6bM=yoqfyqN<#7$q^$z#Lh;C&a0)J_49Xb6s@ z#i4T^ZGSji%lvfPITikX@-(Qj+aB;L*uW4@c$J~$uWE1P+4OF>SYwF+o|Z>frZnBa zS%T>#I5t)_cwg3)1&u6<_CXvNX6fINB>nnWj~hpa&WFE|dqF8BBn8mP>js4n=i8R8jPHBBXcR6 zG4dM0ek}${RUWeEfoMDjaGQH52G>p&J;kN1YrA6Kp4dm{qsQz$EJ_P{sS+<{Vx#dE zYHtG=XoHi1$37fC%RZdbbe-iceO^xM0y4{)Th|)bwBp3psa>&mPwaJMo-1X>8|?ow z*Rvc~iIQW98!I+lHsVnoOJ0|4f({}2ZFej#LIg_RL61~(+G}p5YVC`}Pk?5nuU$VWEk8wK(yL;k0dp)Zb lbgiF!1`9lHafd$N_2IdF_br~6_ql(^KbZZ`|5#=5{{a**)))W) diff --git a/Game_Client/Classes/Game/__pycache__/World.cpython-312.pyc b/Game_Client/Classes/Game/__pycache__/World.cpython-312.pyc index 5abd067381171aefd171455e2978ab5880aba191..455efe102118d6bc190c3cb6d11b28d15b3c5abf 100644 GIT binary patch literal 10096 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 S+WB8>l%_r3z-mNmzW-l>j0m#; delta 1980 zcmaJ>ZD?Cn7(VwaIcai}+$7CcmnCW4y6oG+#?*B>+HJDIMmzT+q#*h-MOh< zvs>r1!ox)?KRSf|68$$6B&C&>$Z$Ut6a?!!6!%BZdy>?4;tt7s-{*Nh z?m6c^=PY+k?e>17s&$BsS7(dndEc}*D(stX-V_y42QuVIWGFKtgb~Ur<3h$U{YfG^ zP$4STRRt^GBDzh8JuR8CA?|0Sshsw#O|1AVDnZncvrZE;q;TZOx;S!jgtK)Vxi|_N zb8|A zUZ083x1`NVPVYB!^l#}s@f@P>%c)0f!A8$j*Nl)YG9=a3VM`3jt4L-@Sw-}UyPp0g zJ*gj?@D3de(EvHCxx%10Q(f+aANn-hpCQ&XJfYEP&z`0Yg&1qVhppCXp(mSX!uHnY z-L&xmc}d&1nwR?Dyddl6ujRF-ACQ-{HOQ;Xsx~J9T@j`}mzkb2jr47;l`d*cxa{c8 z>EkA$VqiyN!$He33)ZeSofy`xgT&11y9Q60Ib-KYeu#DlBCc{>CH)Y+7zoi10$b?U zf%Ju9pgnJ%8SfmfXyGb9R4 z!psyyeZz#UrhoKQ&gfw8=MW-Rt9;{JC@V;}v4{Rze}tY4w+Ku0ayZ^;%{LYn@aPhp ziufFkFXHqZPJgtuw4-%)?54AHG+R1ZoNqk8fbIX}e0*|t-IK38oJYLV1nGyIca$SIJLly`< zMWXbtSSEG=2ro12PVfa6ed#%0x`flL_^bH7XtkK%K3!`|-;5_C2Z4a=nU`Lkcw?f3 zH>@w@m({vLtzlE_5EQO?XL8P$EaBw(QqT)oS9-0Xd3VQsrKvezs)SP{&iJm3L|{6< z+=Ei+pV8>mru{GOWp3GNjgmoqz~pKxOQ-S$F3E}l;V5&dkR#w71=9njmznE`x3B2Q z0W26eW!6<@UPnuT@Vp#eQnlAQ=@$=e-R@L2zB70&|89O6F?UwtkDG1$QF?x01=u@* z%}TGh+)YE9wl?2Ig2J}E);i-Le9G~*oX$?BwX=4KdpGZWlE0ih3%R@iRDKWdKQnBM k=F9^`XAr)x1;J%W5QOiMdJ8?wet*hsf{?z0!1CIE05v$g9smFU diff --git a/Game_Client/Classes/System/App.py b/Game_Client/Classes/System/App.py index 215660b..969f758 100644 --- a/Game_Client/Classes/System/App.py +++ b/Game_Client/Classes/System/App.py @@ -5,10 +5,11 @@ from Classes.Game.Cards.MonsterCard import MonsterCard from Classes.System.Components.Window import Window from Classes.System.Components.InputHandler import InputHandler from Classes.Game.World import World -from Classes.System.Network.NetworkManager import NetworkManager +from Classes.System.Network.TCPClient import TCPClient from Classes.Game.Events.Login import Login from Classes.Game.Events.PlaceCard import PlaceCard from Classes.Game.Player import Player +from Classes.Game.Cards.Card import Card class App: @@ -19,7 +20,7 @@ class App: __myFont:pygame.font __world:World __inputHandler: InputHandler - __networkManager: NetworkManager + __tcpClient: TCPClient def __init__(self, width:int=1920, height:int=1080, title:str="default title"): pygame.font.init() @@ -27,17 +28,17 @@ class App: self.__window = Window(width=width, height=height, title=title) self.__inputHandler = InputHandler() + # game word + self.__world = World(self.__window.getScreen()) + try: - self.__networkManager = NetworkManager("127.0.0.1", "54322", "54323") - Login(self.__networkManager) # will login to the server + self.__tcpClient = TCPClient("127.0.0.1", "54322", self.__world, self.__inputHandler) + Login(self.__tcpClient) # will login to the server except Exception as e: print(f"failed to login due to error {e}") print("server connection failed or got refused") pass - # game word - self.__world = World(self.__window.getScreen()) - self.startGameLoop() self.onCleanup() @@ -46,12 +47,12 @@ class App: # create sprite groups # todo: remove these and let server handle card creation instead # blocker: server - client communication [WIP] - self.__world.spawnMonsterCard("Assets/Cards/1/", pygame.Vector2(500, 1050), self.__inputHandler, Player(1000, 0, "test")) - self.__world.spawnMonsterCard("Assets/Cards/1/", pygame.Vector2(600, 1050), self.__inputHandler, Player(1000, 0, "test")) - self.__world.spawnMonsterCard("Assets/Cards/1/", pygame.Vector2(700, 1050), self.__inputHandler, Player(1000, 0, "test")) - self.__world.spawnMonsterCard("Assets/Cards/1/", pygame.Vector2(800, 1050), self.__inputHandler, Player(1000, 0, "test")) - self.__world.spawnMonsterCard("Assets/Cards/1/", pygame.Vector2(900, 1050), self.__inputHandler, Player(1000, 0, "test")) - self.__world.spawnMonsterCard("Assets/Cards/1/", pygame.Vector2(1000, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard("Assets/Cards/1/", pygame.Vector2(500, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard("Assets/Cards/1/", pygame.Vector2(600, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard("Assets/Cards/1/", pygame.Vector2(700, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard("Assets/Cards/1/", pygame.Vector2(800, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard("Assets/Cards/1/", pygame.Vector2(900, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard("Assets/Cards/1/", pygame.Vector2(1000, 1050), self.__inputHandler, Player(1000, 0, "test")) while self.__running: self.__clock.tick(self.__FPS) @@ -63,6 +64,7 @@ class App: # updates all cards inside the cards Spritegroup at each step the gameloops does self.__world.getCards().update() + self.__world.getHandCards().update() # draw groups self.__window.drawSpriteGroup(self.__world.getCards()) @@ -88,22 +90,24 @@ class App: for card in self.__world.getCards(): if card.rect.collidepoint(mouse_pos) and selectedCard == None: - card.setDragging(True) - selectedCard = card + if card.getState() == "onHand": + card.setDragging(True) + selectedCard = card + for field in self.__world.getBoardFields(): + if field.getRect().collidepoint(mouse_pos): + if field.getSide() == "Player": + if field.getType() == "MonsterField" and card.getType() == "MonsterCard": + # todo: resize card so that it fits into the card field + card.rect.center = field.rect.center + field.image = card.image.copy() + card.setDragging(False) + elif field.getType() == "EffectField" and card.getType() == "EffectCard" or field.getType() == "EffectField" and card.getType() == "EffectCard": + # todo: resize card so that it fits into the card field + card.rect.center = field.rect.center + field.image = card.image.copy() + card.setDragging(False) + - for field in self.__world.getBoardFields(): - if field.getRect().collidepoint(mouse_pos): - if field.getSide() == "Player": - if field.getType() == "MonsterField" and card.getType() == "MonsterCard": - # todo: resize card so that it fits into the card field - card.rect.center = field.rect.center - field.image = card.image.copy() - card.setDragging(False) - elif field.getType() == "EffectField" and card.getType() == "SpellCard" or field.getType() == "EffectField" and card.getType() == "TrapCard": - # todo: resize card so that it fits into the card field - card.rect.center = field.rect.center - field.image = card.image.copy() - card.setDragging(False) elif self.__inputHandler.getPressed()[pygame.K_SPACE]: print("card spawned") self.__world.spawnMonsterCard("Assets/Cards/MonsterCards/testmonstercard/", self.__inputHandler.getMousePos(), self.__inputHandler) @@ -113,9 +117,14 @@ class App: if event.button == 1: # Wenn linke Maustaste losgelassen wird for card in self.__world.getCards(): card.setDragging(False) + card.setState("placed") # TODO: send place card event to server # resets the currently selected card in order to prevent it getting moved - PlaceCard(self.__networkManager, card) # tells the server that the player placed this card + try: + PlaceCard(self.__tcpClient, card) # tells the server that the player placed this card + except Exception as e: + print(f"failed to place card on server due to error: {e}") + if not card == None: card = None 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 4699ec524e0246823e053cac01bb699938ac9552..706de1d8c604f007cbc7fe2b1d7371ae48038e7b 100644 GIT binary patch delta 59 zcmaDU`B{>CIWI340}!+-%-P7jj!`ku*(xTqIJKxarnn?EwJgRZwK%&ZzaS>5C_g(j NuOvBr^94ppZU8y%x zJ!WWE<9bqyGFy3gOXP43$vWr|AsR%e&S_)`wo1+jk2=+xgb9k9@JD9RHA{&={!Qbx zBdZ6kf{xbm9>-D>bw!hK%DNX5suPOlsmSM>S3=&GzZ9ZMxW=qQScLC3p*2K(RY%`a zuYe}Q&p@`n@gu}%Ul12dw_P)679U) z(wHb`sgPNz=(H!r+FVw)NY-P~tYS$PAEk42>LgyxgPLan7foR&m}KSpH1@~JO-r_f zqZk!6r6T68B}Or71Tb=(hj}pE!f_6nbI80SPU@LkX*1+C+A*)u!QiaS@En4j^9)wA z(zYHCEbwPfxcdxR%~ga&*b6kRd-LAyV0b4GUKV!CYR^ufXIa>*J8h3BU1I0*jos#M zdrj$=*jo&T{Pq{6J?E%qW-Jqrru0lKtrZ)f8T|%(Ji|RnD`Ra44i}%!ID9g0W(-z* zqnAO&(=*lWBL-}mj}ew&PpICfL^yxQfq0_8SV4A~KPR+pbR2+RXe;@U63ceo@ O{=;{X+5ok12bUaDRs}CT2p&o+2zv3ov}$!=zIi|2d-G=I&5P|1laaUK zZ~$=JeN{2OO7%$c^dZz1KnIl+BV}A5GVHDjh>;TmSSArD}#W$Iv4zH-4yNdTXej_#@W#VAma4lTziS(3t&T$Ip^e5sw&t*aWj#~IBe#e zk=wGBAVAfJ6e|3`VY8w_IRY(`h-#43&{4Q(V-&Y}F^qx#`FEo zFjrM<$@Ue58R1%r?gllvg4L{2^^pmE>Z-?Pz3_(Ngwa278OJ7!l5Tkt>SxQA z8Zg^2h1o%Ql*#h6Wn8*Zwj4S?6%wNp#!Y%`sA)A>fa*I8Bu{PgZaYRKsdw9lHzp#=38CdZ##y&uJ89F~f-*>T##a98LRnjjYzWdn# diff --git a/Game_Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc b/Game_Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc index 4a6f27e2a9bbe65eb49b2a9225d91299b7717c95..b8e8e31bb750bd83a4f554f5050357d2183dc0a2 100644 GIT binary patch delta 59 zcmX>ub5VwSIWI340}!+-%-P6&fJHIN*(xTqIJKxarnn?EwJgRZwK%&ZzaS>5C_g(j NuOvBr^COm2P5?7Q6sZ6J delta 49 zcmca8b6kddIWI340}z-$sNBeXfJHpO*(xTqIJKxarnn?EwJgRZwK%&ZzhLtlmQ+pv Df2IQ(TgoS{CDyTAW>yUl5a2l%JiN NSCX8*`62TRP5>TlG%qg~0}z~>K08%qBd;KjwzzXnVsUY5v7UQkZmOPBeqvFITV`rbN)ZcC f*)1Vt*~$JqF2Z_u8C1TrXfsNFVgM3FazIr8#cmni delta 96 zcmZ1=xlEGxG%qg~0}wRrs7lq^$ScTWDCL}!SX`W1tmmJUm6}{qtml-USd`+HnVOSQ i!~#@#OB7APWKSL!VZ*x&>fc$k86`h40Er?wph5tCNE}1} diff --git a/Game_Client/Classes/System/Network/EventHandler.py b/Game_Client/Classes/System/Network/EventHandler.py index b1ecd8a..6fc941e 100644 --- a/Game_Client/Classes/System/Network/EventHandler.py +++ b/Game_Client/Classes/System/Network/EventHandler.py @@ -1,27 +1,37 @@ import socket +import pygame + +from Classes.Game.Events.PlaceCard import CardPlaced +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.World import World +from Classes.Game.Events.GameStart import GameStart +from Classes.Game.Player import Player class TCPEventHandler: def __init__(self, socket:socket): self.tcp_socket = socket - def handleEvents(self, message): + def handleEvents(self, message, inputHandler:InputHandler, world:World): if message["event"] == "login": # todo: handle login response here pass elif message["event"] == "startgame": - # todo: handle starting the game here - print("game starts") + print("gamestart") + GameStart(world, message["hand"], inputHandler, world.getPlayer()) pass - -class UDPEventHandler: - def __init__(self, socket:socket): - self.udp_socket = socket - - def handleEvents(self, message): - if message["event"] == "PlaceCard": + elif message["event"] == "PlaceCard": + CardPlaced(world, message["card"], message["type"], message["owner"], pygame.Vector2(int(message["x"]), int(message["y"]), inputHandler)) pass elif message["event"] == "MoveCard": + CardMoved( + world, + message["card"], + message["type"], + message["owner"], + pygame.Vector2(int(message["old_x"]), int(message["old_y"])), + pygame.Vector2(int(message["new_x"]), int(message["new_y"])), + inputHandler) pass elif message["event"] == "RemoveCard": pass diff --git a/Game_Client/Classes/System/Network/NetworkManager.py b/Game_Client/Classes/System/Network/NetworkManager.py deleted file mode 100644 index 36d84f5..0000000 --- a/Game_Client/Classes/System/Network/NetworkManager.py +++ /dev/null @@ -1,85 +0,0 @@ -import json -import socket -import threading - -from Classes.System.Network.EventHandler import TCPEventHandler, UDPEventHandler - -class NetworkManager: - class UDP: - def __init__(self, addr: str, port: str): - self.addr = addr - 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): - 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 receive(self): - while True: - try: - data, addr = self.udpSocket.recvfrom(1024) - if data: - decoded_data = json.loads(data.decode()) - self.eventHandler.handleEvents(decoded_data) - except Exception as e: - 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 - self.port = int(port) - self.tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.eventHandler = TCPEventHandler(self.tcpSocket) - - 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 send(self, message: dict): - try: - self.tcpSocket.sendall(json.dumps(message).encode()) - except Exception as e: - print(f"Error sending TCP data: {e}") - - def receive(self): - while True: - try: - data = self.tcpSocket.recv(1024) - if data: - decoded_data = json.loads(data.decode()) - self.eventHandler.handleEvents(decoded_data) - except Exception as e: - print(f"Error receiving TCP data: {e}") - break - - 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/TCPClient.py b/Game_Client/Classes/System/Network/TCPClient.py new file mode 100644 index 0000000..c1d7354 --- /dev/null +++ b/Game_Client/Classes/System/Network/TCPClient.py @@ -0,0 +1,46 @@ +import json +import socket +import threading + +from Classes.System.Network.EventHandler import TCPEventHandler +from Classes.Game.World import World +from Classes.System.Components.InputHandler import InputHandler + +class TCPClient: + def __init__(self, addr: str, port: str, world:World, inputHandler:InputHandler): + self.addr = addr + self.port = int(port) + self.tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.eventHandler = TCPEventHandler(self.tcpSocket) + self.world = world + self.inputHandler = inputHandler + + 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 send(self, message: dict): + try: + self.tcpSocket.sendall(json.dumps(message).encode()) + except Exception as e: + print(f"Error sending TCP data: {e}") + + def receive(self): + while True: + try: + data = self.tcpSocket.recv(1024) + if data: + decoded_data = json.loads(data.decode()) + self.eventHandler.handleEvents(decoded_data, self.inputHandler, self.world) + except Exception as e: + print(f"Error receiving TCP data: {e}") + break + + def listen(self): + tcpThread = threading.Thread(target=self.receive) + tcpThread.daemon = True + tcpThread.start() \ 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 index 525d7ce86b9a588df9e7ed20f55ada06578dec7b..c5de52068bfd14145cd56189d10f060a79d97b87 100644 GIT binary patch literal 2929 zcmb^zOKcNIbaw5vz4k7#6G&SKA!#d6O6yi71c{=y$fVFh3?&3A%j$OP9j9*AUNgH% zFtP*(4jg*O0f|VZQlv^Lm3!b)3010^V~@7ANY+S5NImst1Sd{?Giy7xNg@uNoqh9u z^X9#`GjHb?RShF(8{_xzp8$ zODT!telw5{rh*)o%urrV$s7-u;d~?&5s-*ZBO`bV8KHF%p$fcSODTphizeiM8JV0A zXgHx0*krca2}Z(}n{SpID`e{Af<*NNllIU5r@Z95n* zrB7jd!Lf?zZ;7=49%Saz=L=@8fVE4B(`gp6mN0W5NGD9)wy~X_Ey2WmI*FZSi!7wO z{f-w)G^A;{Le9~&>#z4k6>m!v=8g*BCTi>*yY2sB;5IzZfPtuz>qz zcEQWjU;w;}%7P)h!T7ux;sQ?@5m`d|WWJW{BS&cKBV_p3fvR*k0&GiG&xrJ|E>3sh!vl-iAM-T2G8`?p(dk5K`ZW%8t!$~S(R-LG1 zTJyOAm2Fl9=b<)GnL$oc|94O`smu#0tEkkU;m|1+F_o<40wz?rMg=GlGu9I3Dw1Uy z+BJ~EP@+-+FEfe_B^thn^KHHGNypJM3w(~^;a&lzgC{diZb^6WbT*4K4%ZlJ^Jc69 z)GET56Co-UNv_}!_yr;G8#|r_!nQUI6iYmw;AJpkkq@a4RH@8nGG~nmKVb)p1|eEo zpT{Hy6d43yvtvF6jj+l@6_y1P^QvfHAL%cF-BNZs>=0BFD1(u~m1AyX-|BKbakAdPX~hP=yL?1$w3sUv95fN)YbQzNS0&0 z{(9_SKYO&UzTZSrAGbOF*cKve0}@t}$p-*_McfSEjfDLoIEVmZe+l4b=V^+9G`^aJ zm8J215EzwW4@Q~@hK)HsYzw^A*g_Mk=hR`q>HgMrAAmq6o0$k^+&u*aE?152`8sHVZN?{lTIfja8PJ4hy)>7E3H=Eaj?8z=VmrR z@lm9pNO48FASx=5MFD@uRXHm~v=tJfpj%`rL~-xU#>U=6K?k#%w{PC>&BuH5e)GaK zCji^)&rexa19(e=LBp|Z{p^VX(VJ)tsd&{b@ z;9;9Ltfo*qAC1SZWK!Sh2;-na5oE9n+ zr>mSMC)r%JDRaVAia3F#_OU{s4EzCH?KzHK4lN2^`J(J4y%Oq-(jMwwd%59d6Gpr7MN9ig*W`5t8yx=FwJ@|Bcb~s_%t+u=Bk#5-bpR0}+BeEK}ffM*oD7qjg%NRJ3Lkd#F zRTLY;FH#kK?nylY{3S&?qvJsiig;;S?ECm}Z+?s)GK8_B`6@Yh1`k2>Sak>V;5iC1 zrbQe+C8cvJvDvVIrx4{-z%r`CxBmy>Z>rhD>RCIY*7YN>^buI*2rN5_5lc$B3O|k! zg}FPPQ)6X^yJ7ZLdo9)`?y}ZUzZL{ettmZ>SjQ>r_>@gus|AfUCtx?~byf?c#}5PB zt+tQP3MV6gCTxVCD*vCqpt#_ssJV`$s9%3^!Qx?TVP diff --git a/Game_Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc b/Game_Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fc3b73e8006d49ab08ce78f0b2f43e8477422a4 GIT binary patch literal 2343 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 literal 0 HcmV?d00001 diff --git a/Game_Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc b/Game_Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a22909aec7b9d9ffde0625c039764e34873779cb GIT binary patch literal 3142 zcmb7GO>7%Q6rTOFz47L^uJhN>fLp*6A`-O?4S|xnp#+M7#t5(?R+e{K?AU8FyG@(O zjVkD&m5N%#Aw?B}ib_osq~^d82?7!qF0m5iuni}~ft%GJQKc8&%>LM|Dt<=VdGF18 zJM-qfZ{EyLjg1WmTI|cK_%RvDZhZux`GT(zP5W zFeJTIAUO>fWlS%gbQNj)ce@Wb!sakAa|k2q6?nv9LF3^Qu&9YxIv#+v#iUR3VgGSn z^8+8y0_RXt)@0}#rW>L`O9l^OxeT~qi78DZmRKwh(~?e6FDxZf?}Jq51my+zHoxJh z4<)XIR8MVE4QnNS5%jcy-iZN1rr#bzC=1cQznR`x*4=5HNu8GEuucW68)sO}o5gH) zZAvJsxO|P)dFZWI5?}_|wJC`pd8^5=mj}(0ZFlW!6fA3k$HAzJGH(o_<6f*dxWwxN8W&5*=q8~tv3$15@{hczj>Sh4R&e~a z*emLI;@IfOtCno0i{tEHLUCXzxDMfjhLHs6xZhdNl1ERcanZ~abW17{SjFbr?8wBC zR357~)+b`Qlwn{no`!Yu6LD+;;3p@%!_ZfpwgRe}(KDv1&a~CW-7&fi<2rO_(R!%k zym(RG2(@1kKN(|e=g!Z2KJB?abz}D0?AKG3!Ljn-*lOp?pljOLv1k79&Gu7vuR9$wnE(zdUn>@O?(?^Xp+Y#9_O%g^*58baR> z$+2$X2canz7Jdjzz+3)2HjLB>oc7KqSbOLDM-b)^!#r^Jx2$*4YZ}w56AwDwCC)u> zS?_$+{&f-V+Bit}&K^TLZ#KGr0MhvfAf2D(rzzrr-i!1O8|entH5cYu%1i;s{iGEp zwft0-%H=FEYfwCDC-X(a@?kw)&@c&s3E2)^R3P-U6MEzbjjllh0Z=5JKq+ck>|>h=T;*Je^y?&v(el^lRLnY`{eu^ z^Rbn-rz=W-S?OoV9oRCcKOYPqMBmCIy~1*!X{1|N?v{X0JEa%&bqO6{1zY}KDb>8B zo#9FxN&H)i|4VAm@KEHu#4;aQm-Uic8!J)Urkd<>FxuksHM;14l0z2_D3fijhJi;g zX}nm|_>%Ad@CdU40}s$T@Cfk?f}%asWh02-G|o)jhoPX2ArX{QSfn zp|Dj#yUU^7mC!&rG_W-MU8pj0tUPjTCGmD8@oqWs?pjE#22u02JAW!D)N>p0jp2=! z?JFGvOZ`icmGJ(xmO+s3RwYo_Rp`T!{*irXd7peJEG$3Ybf{JMzEuML9<0**(QlJL zH-}6Q$JzQ41v=UQ12i7@wXfL2NPh={S!KA!HEj=ZRUe$pTK4!D#4BR9>FPE zF)Uw#u_OxXL0VHdPpgChwq}&K(?;(<+sdHsI%y(d;AdKDDYCD)JuqrK4&7O_5$dUg zc9lcB;C?u|aC9wn;Jm!vz4N@h7U)ITAz&r(4B*V z)g*^r#6xr6)a-^2C;qRq9WH+Ua=AG1wakGcwHidZ3EEa>o-HTvow&-Uiowg&0) z-d48)!*<}FC(nX{!pxw7fm@T~ZlT~U)OZWE{EiO(igx{q4*n(X=DKbp=-3p014`bO Ah5!Hn 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 a32120bffae46042f4f020a91ca3aa8f87439bc6..b40c2b170e1bf4fb8c917ca5316d8b0696d69a7a 100644 GIT binary patch delta 3476 zcmb^!ZEzFEbx+pE$vVlBZP~IVTPMp#5=OFQzyxX&QyZ)jV@!?Qff$IaJN$u>#OWM= zAXVv1I%PVZ#&mxqp=5A6nGh(QxPi8`!=#?Vbn>GEcbdycRfj2={%_?%r;uOWJy|9W zq0>pb+I#!%eeLesx9^><1~2y;F6;H>0JTTHi)^s|yum_TJnx#`!T?4$Re8GVXcYkz zpbs$A>wwX}uK?g@=qa|N)eJENJcjePy34hPdj@-^CfFzsbp%a%h`h2V%rVzni5CcC z#fd%f_=yvIB)%pxtLQ9OBO_(#dC0(z6@M}ERclt!kOY%zc!t;lXY~eO5}eSLSX#i> zm2dzUC8I*3>s*ABut3(>kcz$}#y6BO*{&YO^_F1t1t;JepE8;O*P2rDj;9nxomBn= zyrX!ZKs!cHu@PW{j0S!~xtU19RjLKPLMfqJUjzTHFsd1V+(JT=%0lDia`hNk5t!Eo z+IRT;=oiSVwr|_o-VO&<;{%nLufm`L1MC^D8UqaidF>d>4@EeZjdIvW9EpJ$1Fg*7 zI~!r+{6s98SH-yrbO36#vuoqLd4f$~`!sH!AL!XN5=yXKVkE({?5iWaY~mCji;s+Q zu~X;(BV%wxy;qGbBpTsm^kI*$xjYT2VN2FVaXmo z*DF!B`;=+1S*mOjDW^m^1-V1FW>8fq2UF_4`?%P29NshZr@crqv5fAd4RqAD5w-A8t(geGv04wjQEN6bx(!10*jq|Wf`6{Hw*Dh5 zTifP6=&;19Y$Yl~t)e|1y(dqiqzHdd*RwOPj!%UnEHm#t8J?J8 z8JdsLGKG$yWJt%NG^!-8vK-A!vzW(nT#VaAdmQkObvs>h!P<`PD>-B_Peo!=Qxgmu zkD)@9Cvj!t!#oR{>IaBwc&5ItrUeTdV za(KIbzmD@DJb_s>th6@!2Jx#&iBs}}TI)ILf!SIBUafl-gL8Xx71ay#?+jmjIaA>- zfGv=*deL3}v9&uLBvygR93x>O$)6^u_eDJ7eFq3Mv|cM2>FG(*6wXU#=GE4vFp%=#E_5)+H+E4O|<^dV?8n zQ1tGXy!#7)a^OiZT-uw?xwc$R{WSG%`n`14)su1ctb9v!4M?tmRiJA@c3b@)c3thd z^5V4@Z;oeL_pO3*52Chh`!IDibtQc*z2eKX4Hkgb8zh9#k!&cO35CT_L<&WOF+LOG zi>wDd!8^O8p2N$^8(PWVo!kA*Ta&+w{Wd11cOR5?A6!=5(B=Hwvi|Ojzk9_j`uik* zpCI>KpySsKA2s~Ke#5?UAQL!L07^X7@X_q>Xl8g+9A>0pMi}Qa!)Pj*HJkbu0CU7X z#XpL}DjtH0N5!E4K)>Qhk#|HOXGk$&*zlKJkJZRMylDiNgP>rn z(VW(qQRpCmBE@3MTHG0n`vbFRX_G8%f~5`7F6l4mm&VsA1$9~7cZmD8mL*2o)NxZO z+PWlLmmv4Y=+mkI2*m#)yl-;|O(EgiLl`!NMBA`r8y433;dN~IF=~Y}tc?*hpqrQY z3rTFropZY0>V5pA@G^noUcLbd3%VM2E6f8e%DXM)2X&geZIuVrntN&$!ePF#OK(I1 z9tGz{1G;_9_EzF`IB1_HjPMWkcH$g-V)y83FtZi|3-r?6h!>@Y=#!Y>Lf{JEc4K@q z28I$az|ZIjovB_>;w~!dVaVaP(<)Sq*TFs_ph62>2jlQP$4)gi;W5L%Ixaito~dvm z!6tk|b0|Zc_6@N7OpH6_d-^A2xhc|@uPur7g-^3S`QuH7993Ek$6;)JnV*xLr(?|Y y6uX;CAqM^^O+1F3&M{+$05)`Z-Ptje18!ksFDR1)QBwe44OeCQqvvqtW&9gtW#Rk) delta 3029 zcmcgueN0=|6~FiS+q~xwjIoVPY-1DKU;;SFC>dXgou(y#FdxzAL>$WVC?vJrXH)WF z;%eHYO!79;E48f3HrhpjBuvc|O^T+pBiS^e?H}8Eku9Vs{FT4W+HOmoo27y>s6E-Fwct=iKwo^XkBjmsG0^qXd{nAHNsAXS}R3!llcuc^d_e0k-NpfTgcd z0NliPiC(E@;VAGhmpA)bRYT##LXO|H)exq@Y)f(U>~uJmn2koZBr$F_lHgz&C~9TaG^J3!_;RqvdQX2+j1KHPS(_RueIq&9k^eo^s7bpop!%c z^c$rFKTkvKq)gQ^op3x%(!^s^3z5NSB%TO!q^LM6fn_Jc(}^hOD^>Nx8}aGwbcJH)-T&!ie&IVN}YI<&32CRouirY34Z*w2XnE^8}pfkvpClm zN;XbIA^$`Wi+JH77Twf-cfbYIy4?ju zvg!-$6I>=>y3z>ofV{*)rHk=9`YvF>B9(*zuq2v1hmzGlg<5pc_&WNY?g0E4eXQ%y ztt2THoE9uBLGDLM*$R#9B0Z$gaE%?wXg#TaB{l#jXBOp2If~Ud(fyhhWLG&ftf->t zNXl0<=$@!S#fnQH_bN6fKt@)w3-u@EbCte1r$yVfdV`k4Kqx7jBX5>KD>`CJlaz-l zP-Sbao;SxhC9p6N_T-cHR)M= zZ!A&iY236)-z>$TCo!NE17oNyW27^eh8De{IRfxTzSLuJco#J?K$g zC#*&$b3N)a4?-RKf!U;RVkK@L(fr8lq&ZR#!p8=G!TxIQm&D082L&z8eM9&m{*KTD zw+-e?^tRqy1bY?k9l|ahEvReK=YM?S$~SXrcM&wApIKU<17$6JsQ}yoT73X6iwkD! zmCn4mJ!fve<;j}6cyred(3k>n!;%S(=MImTMg@y4Z}H|V-nFr;#m8HG8H=yb+`2rl z?P*!J(2;Rp~d&%6VxPy)h4JgnfexySZ{)wAzMHNNnf6qp)ToP0yaotmt%hd1_Qj6DUbVW~*wQ88NxCVkdGr+N@RyZuS)xfK3v-p$dBi zz3J$b5)&RB`lVwPHlj(V;R}C$(V}zOQ}Pob&PXVN@2B#v*Q4zGnQ#wx7GtEB#UCSA kTNyBLDA4>9C|1xb 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 P&)63s^sNI*4JH2phFQ6z