From ab5752d59fc2966f03aedccd4c9464c83c4b0136 Mon Sep 17 00:00:00 2001 From: steev Date: Sat, 12 Jul 2025 18:19:44 +0200 Subject: [PATCH] feat: :sparkles: added empty c++ project --- .vs/ShadoowCrest_Gameengine/v17/.suo | Bin 0 -> 18432 bytes .vs/ShadoowCrest_Gameengine/v17/Browse.VC.db | Bin 0 -> 565248 bytes .../v17/DocumentLayout.json | 23 +++ Classes/System/App.py | 62 -------- Classes/System/Components/InputHandler.py | 53 ------- Classes/System/Components/Label.py | 47 ------ Classes/System/Components/Window.py | 54 ------- Classes/System/GameManager.py | 23 --- Classes/System/Network/EventHandler.py | 11 -- Classes/System/Network/TCPClient.py | 69 --------- Classes/System/Utils/Path.py | 6 - Classes/System/Utils/StringUtils.py | 11 -- README.md | 34 +---- ShadoowCrest_Gameengine.sln | 31 ++++ ShadoowCrest_Gameengine.vcxproj | 134 ++++++++++++++++++ ShadoowCrest_Gameengine.vcxproj.filters | 17 +++ ShadoowCrest_Gameengine.vcxproj.user | 4 + ...movebg-preview.png => ShadowCrest_Logo.png | Bin main.py | 7 - server logic notes.md | 42 ------ 20 files changed, 214 insertions(+), 414 deletions(-) create mode 100644 .vs/ShadoowCrest_Gameengine/v17/.suo create mode 100644 .vs/ShadoowCrest_Gameengine/v17/Browse.VC.db create mode 100644 .vs/ShadoowCrest_Gameengine/v17/DocumentLayout.json delete mode 100644 Classes/System/App.py delete mode 100644 Classes/System/Components/InputHandler.py delete mode 100644 Classes/System/Components/Label.py delete mode 100644 Classes/System/Components/Window.py delete mode 100644 Classes/System/GameManager.py delete mode 100644 Classes/System/Network/EventHandler.py delete mode 100644 Classes/System/Network/TCPClient.py delete mode 100644 Classes/System/Utils/Path.py delete mode 100644 Classes/System/Utils/StringUtils.py create mode 100644 ShadoowCrest_Gameengine.sln create mode 100644 ShadoowCrest_Gameengine.vcxproj create mode 100644 ShadoowCrest_Gameengine.vcxproj.filters create mode 100644 ShadoowCrest_Gameengine.vcxproj.user rename sc_logo_3_4-removebg-preview.png => ShadowCrest_Logo.png (100%) delete mode 100644 main.py delete mode 100644 server logic notes.md diff --git a/.vs/ShadoowCrest_Gameengine/v17/.suo b/.vs/ShadoowCrest_Gameengine/v17/.suo new file mode 100644 index 0000000000000000000000000000000000000000..5724ff42cdbd8f7048eec89e1d9130a9bd313713 GIT binary patch literal 18432 zcmeI3&vRTy5yxj8ny<*+g<o>nW@NW|;N6jPVqdSkAPXy{yfqV0LV?M>R>OQ)2=Z;?K zp4*+$LnCnBtn*hjeddH&<61U1HI=c;ezT`O=X+Xw_0FE3{`}N`|B?DE?T#IAjn9E` z-Mnc|gT2Vz33H=GFI!*lH@oWiHSAm8Hh;QGHR5Z_0(e)zn>Be;06aYflVdb0wN~3- zo-?~rkMa6xATEBdFY2`w{#N7h0{nl4e!kQu{@r}{VL)CrhhMJsrRrw__o7>Tej4~3 zpfTJF>;s+vo&=r(_5)u4z6gk}X94xq$5nlNruHnlHFnR{>eXha+}{znpZfpCGe55D zzj=WAzl6MXTmRLcW{ykC(rx{hPPVK6UfR4Jkp4dkh{msSeH{2C;B{8@N%db-t?z02QB~$z(wE^@EY(v;QPSqz-8bEzz=~dz#BlY&t~_U(|cLA#yb~~xNBIw zYCRq+qjOO*m_hy|E1FNy$)#nPrG@O3ipMWK+_3hiY_)M78iY5j@9wL{@1Zu?OrStwEK)~04Fkmf%qpRU*F z-;=z)RckV57K#368TWF1?ejMFq8X3wh_|dimTyl(%MWO90@zh+IL+K=;j)6(mKcNU zcTo}DV>|LEJ@>uJzglGcm-y2vbjeD+R=)x?wJv>a@c%O1di@LIpMr)0G%TZy>sA)3 z<`wGJp>d-LMT52Zm;H__e=pHiF@;JT{88f||Ig2TT>KN@{fWhXH-6cn93#-m@2Y*y zT9sV>B-M(4RKomwe`L*ipn2<`MA0+a2LEH=-44I}AK{i?D*r>cqYC_|w7zRyk30Ut z{cAZClraAd{5P>li%_xR8gBF3&iF^^-z@yDf>n9Ype@`^2HS~$Wc%eSsD$}-7o)7vU)E|P{wDm`-+0x zO4QFv=zPI-G@`Kv_&CgI#8Ko={4kEL^VUg>KS!9-S)_VT9xIej-!1OQ1+l5o%T482C>;&-Do)F8{Kq-u@=RFF&P9 zw4$icMaYI2COQ8_@O%Bg$Sn8Oy>J(Y>p9D)EZ1bAk0@(|F;Tn~F75b#LHipu|L5#l z1*~Z-u?VX;lF5Qp^B}}vJ#zv8jZic$aB4FDPjCmid8)g z&G3cm9-+efUs3okSub!cG9QEgRmUAy{^a{AU#+5XsD(oIIq6TQ-;0h;@M|3PeWQ`Vq2ds69_6CKOlszOM}j23RVc1-&GppS zhbg~7wsW|rImj{xtCoYm^oab2=OBmml0|YdWz3&?l#dctb{u(WUS=1Nb`#wJ=J?I^=X2_IUL^BZhJAOHSi$WwNvrf${@6SbudCPo({%mK74lDR_g{NMOEv;<`j?d6 zaC_xqU$?um;WzP~#eXMdm5*yNaLV*2<3I5S{{xu_7W^*tV5Te?i~WdC&Tb7W;C$0k zo^X`3BQJ(eWe6XGf9d*D^j+{9-FLOzqBrF*4rPjq#ff4*pDs>}WYWW9`O)M-X7Msyrh6W%sQ9Q#%|<;- ztJW%$HuL@#dxSIm4Ur!iV!vpbGcvj#0Mf*UQ@k7HZk*i77;V$MIc`U1gq+G4^~$p- z!}~ULJZ4XFbf%<}_9TyT$jXu`m!8C`hgDuQX@{Ykd`>b#-R-fT)$F>>d^P6Fo!)EA zmd;HzpHY{0zc-w|)OAi9dzQCq`!|xeetgR*JLfvRFogu?tz3g1N!1ywZq8u8^(oxR ziCZiX%7R2wpi@8HrQke%i%uqLU#7r`7MII!Jr>=ckuW83#zQCjjk3$%0o@8fp?$k%){8jw(Uy5Jlk;WbWE}#Fh=l>2Tz#lw+5a$2mcK%Ce8j1GmtgddfLKEeB-L~&suwv%>Q?2@6W$zr}rHAmpBn0^hVq{NX?E;`&=PD+4lSi z*312`Xv=-L+NylyduRf?&R}vMr6s-F%+U>9R8mLzqbM0wk)S<(Tx9A z`1QXsnvpBk+jfZvoxk$9&2>c)2Qj!Y* literal 0 HcmV?d00001 diff --git a/.vs/ShadoowCrest_Gameengine/v17/Browse.VC.db b/.vs/ShadoowCrest_Gameengine/v17/Browse.VC.db new file mode 100644 index 0000000000000000000000000000000000000000..9a7f7690035b00e922d850a41067dd9d4ca0226c GIT binary patch literal 565248 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 tuple: - xvel = 0 - yvel = 0 - - # construct x and y velocity input axis - if InputHandler.getPressed()[pygame.K_a] or InputHandler.getPressed()[pygame.K_LEFT]: - xvel = -1 - if InputHandler.getPressed()[pygame.K_d] or InputHandler.getPressed()[pygame.K_RIGHT]: - xvel = 1 - if InputHandler.getPressed()[pygame.K_w] or InputHandler.getPressed()[pygame.K_UP]: - yvel = -1 - if InputHandler.getPressed()[pygame.K_s] or InputHandler.getPressed()[pygame.K_DOWN]: - yvel = 1 - - return tuple((xvel, yvel)) - - @staticmethod - def getMousePos() -> pygame.Vector2: - return pygame.Vector2(pygame.mouse.get_pos()) - - # get field under mousbutton - @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 board_fields: - field_x = field.getPos().x - field_y = field.getPos().y - 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 diff --git a/Classes/System/Components/Label.py b/Classes/System/Components/Label.py deleted file mode 100644 index ed04c54..0000000 --- a/Classes/System/Components/Label.py +++ /dev/null @@ -1,47 +0,0 @@ -import pygame - -class Label: - rect:pygame.rect - image:pygame.image - __screen:pygame.surface - __text:str - __pos:pygame.Vector2 - __font:pygame.font - font:pygame.font - __name:str - - def __init__(self, name:str, screen:pygame.surface, text:str, pos:pygame.Vector2, size:float=20, color:str="white"): - self.__font = pygame.font.SysFont("Arial", size) - self.font = pygame.font.SysFont("Arial", size) - self.image = self.font.render(text, 1, color) - _, _, w, h = self.image.get_rect() - self.__pos = pos - self.rect = pygame.Rect(self.__pos.x, self.__pos.y, w, h) - self.__screen = screen - self.__text = text - self.__name = name - - def getText(self) -> str: - return self.__text - - def getFont(self) -> pygame.font: - return self.__font - - def getPos(self) -> pygame.Vector2: - return self.__pos - - def getName(self) -> str: - return self.__name - - def setText(self, newtext:str, color:str="white"): - self.image = self.font.render(newtext, 1, color) - - def setFont(self, font:pygame.font, size:float, color:str="white"): - self.__font = pygame.font.SysFont(font, size) - self.change_text(self.text, color) - - def setPos(self, pos:pygame.Vector2): - self.__pos = pos - - def draw(self): - self.__screen.blit(self.image, (self.rect)) \ No newline at end of file diff --git a/Classes/System/Components/Window.py b/Classes/System/Components/Window.py deleted file mode 100644 index b4c3439..0000000 --- a/Classes/System/Components/Window.py +++ /dev/null @@ -1,54 +0,0 @@ -import pygame -from pygame.locals import * - -from Classes.Game.BoardField import BoardField -from Classes.Game.World import World - -class Window: - __width:int = 800 - __height:int = 600 # takes 80% of width which tranlates to 640 - __title:str = "python game engine" - __screen:pygame.Surface - __clock:pygame.time.Clock - - def __init__(self, width:int=800, height:int=600, title:str="python game engine"): - self.__width = width - self.__height = height - self.__title = title - - pygame.init() - - self.__screen = pygame.display.set_mode((self.__width, self.__height)) - self.__screen.fill((236, 240, 241)) # Hier liegt der Fehler, es muss eine Tuple übergeben werden - pygame.display.set_caption(self.__title) - - self.__clock = pygame.time.Clock() - self.__framerate = 60 # Framerate auf 60 FPS festlegen - - # set framerate (where the fuck is it?) - def Render(self): - # dear future me figure out what past me did! - pass - - def setWidth(self, width:int): - self.__width = width - - def setHeight(self, height:int): - self.__height = height - - def setTitle(self, title:str): - self.__title = title - - def getScreen(self) -> pygame.surface: - return self.__screen - - # draws a passed sprite group to the screen - def drawSpriteGroup(self, group:pygame.sprite.Group): - group.draw(self.__screen) - - # draws a given group of rectangles onto the screen - def drawWorld(self, world:World): - for field in world.getBoardFields(): - pygame.draw.rect(self.__screen, field.getColor(), field.getRect()) - for label in world.getLabels(): - label.draw() \ No newline at end of file diff --git a/Classes/System/GameManager.py b/Classes/System/GameManager.py deleted file mode 100644 index ea25200..0000000 --- a/Classes/System/GameManager.py +++ /dev/null @@ -1,23 +0,0 @@ -from Classes.Game.Player import Player -from Classes.Game.World import World - - -class GameManager: - player:Player - enemy:Player - world:World - - def __init__(self, world): - self.world = world - - def getPlayer(self) -> Player: - return self.player - - def getEnemy(self) -> Player: - return self.enemy - - def setPlayer(self, player:Player): - self.player = player - - def setEnemy(self, enemy:Player): - self.enemy = enemy \ No newline at end of file diff --git a/Classes/System/Network/EventHandler.py b/Classes/System/Network/EventHandler.py deleted file mode 100644 index e1ba80e..0000000 --- a/Classes/System/Network/EventHandler.py +++ /dev/null @@ -1,11 +0,0 @@ -import socket - -import pygame - -from Classes.System.Components.InputHandler import InputHandler -class TCPEventHandler: - def __init__(self, socket:socket): - self.tcp_socket = socket - - def handleEvents(self, message, inputHandler:InputHandler): - pass \ No newline at end of file diff --git a/Classes/System/Network/TCPClient.py b/Classes/System/Network/TCPClient.py deleted file mode 100644 index dcaf1b0..0000000 --- a/Classes/System/Network/TCPClient.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import socket -import threading - -import pygame - -from Classes.Game.World import World -from Classes.System.Components.InputHandler import InputHandler -from Classes.Game.Events.GameStart import GameStart -from Classes.Game.Events.Login import LoginResponse -from Classes.Game.Events.PlaceCard import CardPlaced -from Classes.Game.Player import Player - -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.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.handleEvents(decoded_data) - except Exception as e: - print(f"Error receiving TCP data: {e}") - break - - def handleEvents(self, message): - print(message) - if message["event"] == "loginresponse": - if message["status"] != "success": - print("login failed") - else: - print("receiving login confirmation from server") - self.world.setPlayer(Player(0,0,message["name"], message["id"])) - elif message["event"] == "startgame": - print(self.world.player) - # world.player.setMana(message["player"]["mana"]) - # world.player.setHp(message["player"]["hp"]) - self.world.setEnemy(Player(message["enemy"]["hp"],0,message["enemy"]["name"], message["enemy"]["id"])) - GameStart(self.world, message["player"]["hand"], self.inputHandler, self.world.getPlayer()) - pass - elif message["event"] == "PlacedCard": - CardPlaced(self.world, message["card"], message["owner"], pygame.Vector2(message["x"], message["y"]), self.inputHandler) - pass - - def listen(self): - tcpThread = threading.Thread(target=self.receive) - tcpThread.daemon = True - tcpThread.start() \ No newline at end of file diff --git a/Classes/System/Utils/Path.py b/Classes/System/Utils/Path.py deleted file mode 100644 index 9b01eb9..0000000 --- a/Classes/System/Utils/Path.py +++ /dev/null @@ -1,6 +0,0 @@ -import os - - -class PathUtil: - def getAbsolutePathTo(notAbsolutPath:str) -> str: - return os.path.abspath("Client/" + notAbsolutPath) \ No newline at end of file diff --git a/Classes/System/Utils/StringUtils.py b/Classes/System/Utils/StringUtils.py deleted file mode 100644 index e4d02a1..0000000 --- a/Classes/System/Utils/StringUtils.py +++ /dev/null @@ -1,11 +0,0 @@ -import random -import string - - -class StringUtils: - def get_random_string(length) -> str: - # choose from all lowercase letter - letters = string.ascii_lowercase - result_str = ''.join(random.choice(letters) for i in range(length)) - print("Random string of length", length, "is:", result_str) - return result_str diff --git a/README.md b/README.md index f13aa8e..8a887f6 100644 --- a/README.md +++ b/README.md @@ -3,44 +3,20 @@ # Shadowcrest -My own Gameengine used in games i make forward +My own Gameengine made in c++ which is used in games i make forward ## why do i want my own engine? -simply said because i want to know how games run in their backend -another strong reason would be i want to have full controll over what works how and when its added +Simply put i want to learn c++ and how the more lower level Systems on a computer work as i only have worked in languages that help out with things like memory management e.g. Javascript, PHP, C#, Go. In Addition to that i want to improve my skills on how to optimize code and how to properly work with memory. +and since that isn't enough i want to know how the System that are required to make games work eventually improving my engine on my way while working on projects. ## big things are to happen right now this repo only is a placeholder not planed to be worked on for a long while as i need to figure out what i want and how i want it -depending on what of the below i chose (i already think i will decide between 2 or 3 but am interessted in 3 due to more tech) i will start designing an engine architecture and also decide if i keep this project opensource or not +depending on what of the below i chose (i already think i will decide between 2 or 3 but am interested in 3 due to more tech) i will start designing an engine architecture and also decide if i keep this project oversource or not ### what does it aim todo -bulding my games to keep it simple +building my games to keep it simple - supporting 2D games - supporting 3D games - supporting networking networking solutions i develop in placeholder - a user interface for me to organize my project with -## multiple options emerge -### option 1 using pygame -as i am working on a project in pygame and have constructed a small engine arround pygame for the sake of getting the project to where i want it -a option would be clearing the present gamelogic out from it and constructing a more easy to use api and a user interface -#### downsides: -- python is compared to its dotnet competitors not very good in memory management -- python is simple but due to the lack of typesafety can be painfull to debug - -### option 2 using dotnet gameframeworks -dotnet is used very widely in game development and is used in the biggest known game engines currently available: -- godot (C#) -- unity (C#) -- cryengine (C#, LUA) -- unreal (c++) -i could use a game framework like [monogame](https://monogame.net/) - -### option 3 the hard way implementing public tech on my own -besides the option to use a framework that does the hard game technology part for me i can go all the way on my own and implement things like Vulcan or DirectX, a opensource physics engine like [project chrono](https://projectchrono.org/) or [react physics 3d](https://www.reactphysics3d.com/) or even a more widely used physics engine like nvidia physx or havok engine and fmod as audio engine - -this would be the by far hardest option out of all available but also the by a lot most custom experience -this approach would also teach me a very much more then all the other options above - -### downsides -a very very very very painfull development process diff --git a/ShadoowCrest_Gameengine.sln b/ShadoowCrest_Gameengine.sln new file mode 100644 index 0000000..264b588 --- /dev/null +++ b/ShadoowCrest_Gameengine.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36301.6 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShadoowCrest_Gameengine", "ShadoowCrest_Gameengine.vcxproj", "{EDD323AC-3212-4BD6-877E-1A0155781415}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EDD323AC-3212-4BD6-877E-1A0155781415}.Debug|x64.ActiveCfg = Debug|x64 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Debug|x64.Build.0 = Debug|x64 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Debug|x86.ActiveCfg = Debug|Win32 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Debug|x86.Build.0 = Debug|Win32 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Release|x64.ActiveCfg = Release|x64 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Release|x64.Build.0 = Release|x64 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Release|x86.ActiveCfg = Release|Win32 + {EDD323AC-3212-4BD6-877E-1A0155781415}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {E38B3869-3F4D-47BE-9C10-30182BCFAEA1} + EndGlobalSection +EndGlobal diff --git a/ShadoowCrest_Gameengine.vcxproj b/ShadoowCrest_Gameengine.vcxproj new file mode 100644 index 0000000..4935a93 --- /dev/null +++ b/ShadoowCrest_Gameengine.vcxproj @@ -0,0 +1,134 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + 17.0 + Win32Proj + {edd323ac-3212-4bd6-877e-1a0155781415} + ShadoowCrestGameengine + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + + + + diff --git a/ShadoowCrest_Gameengine.vcxproj.filters b/ShadoowCrest_Gameengine.vcxproj.filters new file mode 100644 index 0000000..50aca57 --- /dev/null +++ b/ShadoowCrest_Gameengine.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + \ No newline at end of file diff --git a/ShadoowCrest_Gameengine.vcxproj.user b/ShadoowCrest_Gameengine.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/ShadoowCrest_Gameengine.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/sc_logo_3_4-removebg-preview.png b/ShadowCrest_Logo.png similarity index 100% rename from sc_logo_3_4-removebg-preview.png rename to ShadowCrest_Logo.png diff --git a/main.py b/main.py deleted file mode 100644 index d243f0c..0000000 --- a/main.py +++ /dev/null @@ -1,7 +0,0 @@ -import pygame -from Classes.System.App import App - -if __name__ == "__main__": - pygame.init() - game = App() - game.onExecute() \ No newline at end of file diff --git a/server logic notes.md b/server logic notes.md deleted file mode 100644 index 7370d4a..0000000 --- a/server logic notes.md +++ /dev/null @@ -1,42 +0,0 @@ -# validation for placing cards: -- is the game still running -- is it the players turn -- does the card exist -- does the player have that card in his deck -- does the player have this card in his hand -- is the type of card allowed in that type of field -- is the field already blocked by another card - -# validation for attacking another player -- is the game still running -- is it the players turn -- does the card exist -- does the player have that card in his deck -- is that card played -- does the enemy have remaining monster cards on his side - - if yes a direct attack would only be possible if a effect allows it -- can this card attack - - is the card of correct type - - is it blocked by effects (will be implemented after card effects are implemented) - -# player death management (win condition) -- does a players hp go to 0? - - make the other player the winner - - if an effect affects the playing player card priority comes first - -# handle a player leaving -- check if game still runs - - make remaining player win if yes - -# turn management -- server keeps track of each turn - - whos turn is it - - what turn state is currently active - - draw state - - place state - - is the player trying to do actions not allowed in the given state - -# drawing cards: -- ensure the player only can have 7 cards - - if limit exceeds the player payes lifepoints and drops a card -- ensure the drawn card for sure still can be in the players deck \ No newline at end of file