From 5daffa8a8e6aa6b8b30eec3c58d957a9ac4caed9 Mon Sep 17 00:00:00 2001 From: steev Date: Sun, 21 Jan 2024 23:03:24 +0100 Subject: [PATCH] added old code, fixed it (mostly), merged some new code to the old code, made it mostly runnable --- .vscode/launch.json | 29 ++++ Client/.vscode/settings.json | 15 ++ Client/Assets/Arenas/default.png | Bin 0 -> 10988 bytes Client/Assets/Cards/0/field.png | Bin 0 -> 612 bytes Client/Assets/Cards/1/card.json | 23 +++ Client/Assets/Cards/1/card.png | Bin 0 -> 9570 bytes Client/Assets/Cards/2/artworkjson.png | Bin 0 -> 2389 bytes Client/Assets/Cards/2/testspellcard.json | 9 ++ Client/Assets/Cards/3/artworkjson.png | Bin 0 -> 2389 bytes Client/Assets/Cards/3/testtrapcard.json | 9 ++ Client/Classes/Game/BoardField.py | 85 +++++++++++ Client/Classes/Game/Cards/Card.py | 105 +++++++++++++ Client/Classes/Game/Cards/MonsterCard.py | 88 +++++++++++ Client/Classes/Game/Cards/SpellCard.py | 72 +++++++++ Client/Classes/Game/Cards/TrapCard.py | 72 +++++++++ .../Cards/__pycache__/Card.cpython-311.pyc | Bin 0 -> 6423 bytes .../Cards/__pycache__/Card.cpython-312.pyc | Bin 0 -> 5777 bytes .../__pycache__/MonsterCard.cpython-311.pyc | Bin 0 -> 5665 bytes .../__pycache__/MonsterCard.cpython-312.pyc | Bin 0 -> 5506 bytes .../__pycache__/SpellCard.cpython-311.pyc | Bin 0 -> 4754 bytes .../__pycache__/SpellCard.cpython-312.pyc | Bin 0 -> 4612 bytes .../__pycache__/TrapCard.cpython-311.pyc | Bin 0 -> 4730 bytes .../__pycache__/TrapCard.cpython-312.pyc | Bin 0 -> 4590 bytes Client/Classes/Game/Events/GameStart.py | 16 ++ Client/Classes/Game/Events/Login.py | 25 +++ Client/Classes/Game/Events/PlaceCard.py | 30 ++++ .../__pycache__/GameStart.cpython-311.pyc | Bin 0 -> 1181 bytes .../__pycache__/GameStart.cpython-312.pyc | Bin 0 -> 1032 bytes .../Events/__pycache__/Login.cpython-311.pyc | Bin 0 -> 1513 bytes .../Events/__pycache__/Login.cpython-312.pyc | Bin 0 -> 1091 bytes .../__pycache__/PlaceCard.cpython-311.pyc | Bin 0 -> 1727 bytes .../__pycache__/PlaceCard.cpython-312.pyc | Bin 0 -> 1797 bytes Client/Classes/Game/Player.py | 46 ++++++ {Game Client => Client}/Classes/Game/World.py | 55 ++++--- .../__pycache__/BoardField.cpython-311.pyc | Bin 0 -> 5037 bytes .../__pycache__/BoardField.cpython-312.pyc | Bin 0 -> 4938 bytes .../Game/__pycache__/Player.cpython-311.pyc | Bin 0 -> 2994 bytes .../Game/__pycache__/Player.cpython-312.pyc | Bin 0 -> 2688 bytes .../Game/__pycache__/World.cpython-311.pyc | Bin 0 -> 11103 bytes .../Game/__pycache__/World.cpython-312.pyc | Bin 0 -> 10091 bytes Client/Classes/System/App.py | 140 +++++++++++++++++ .../System/Components}/InputHandler.py | 0 Client/Classes/System/Components/Label.py | 47 ++++++ .../Classes/System/Components}/Window.py | 0 .../__pycache__/InputHandler.cpython-311.pyc | Bin 0 -> 3562 bytes .../__pycache__/InputHandler.cpython-312.pyc | Bin 0 -> 2996 bytes .../__pycache__/Label.cpython-311.pyc | Bin 0 -> 3676 bytes .../__pycache__/Label.cpython-312.pyc | Bin 0 -> 3603 bytes .../__pycache__/Window.cpython-311.pyc | Bin 0 -> 3667 bytes .../__pycache__/Window.cpython-312.pyc | Bin 0 -> 3426 bytes Client/Classes/System/Network/EventHandler.py | 40 +++++ .../Classes/System/Network}/TCPClient.py | 4 +- .../__pycache__/EventHandler.cpython-311.pyc | Bin 0 -> 3132 bytes .../__pycache__/EventHandler.cpython-312.pyc | Bin 0 -> 2343 bytes .../NetworkManager.cpython-311.pyc | Bin 0 -> 6474 bytes .../__pycache__/TCPClient.cpython-311.pyc | Bin 0 -> 3475 bytes .../__pycache__/TCPClient.cpython-312.pyc | Bin 0 -> 3142 bytes Client/Classes/System/Utils/Path.py | 6 + .../Classes/System}/Utils/StringUtils.py | 0 .../Utils/__pycache__/Path.cpython-311.pyc | Bin 0 -> 747 bytes .../__pycache__/StringUtils.cpython-311.pyc | Bin 0 -> 1233 bytes .../System/__pycache__/App.cpython-311.pyc | Bin 0 -> 10541 bytes .../System/__pycache__/App.cpython-312.pyc | Bin 0 -> 9025 bytes .../__pycache__/InputHandler.cpython-311.pyc | Bin 0 -> 3476 bytes .../__pycache__/InputHandler.cpython-312.pyc | Bin 0 -> 3083 bytes .../System/__pycache__/Window.cpython-311.pyc | Bin 0 -> 3318 bytes .../System/__pycache__/Window.cpython-312.pyc | Bin 0 -> 3104 bytes .../System/__pycache__/World.cpython-311.pyc | Bin 0 -> 880 bytes .../System/__pycache__/World.cpython-312.pyc | Bin 0 -> 774 bytes Client/main.py | 7 + {Game Client => New_Client}/App.py | 14 +- New_Client/Assets/Cards/0/field.png | Bin 0 -> 612 bytes New_Client/Assets/Cards/1/card.json | 23 +++ New_Client/Assets/Cards/1/card.png | Bin 0 -> 4204 bytes New_Client/Assets/Cards/2/artworkjson.png | Bin 0 -> 2389 bytes New_Client/Assets/Cards/2/testspellcard.json | 9 ++ New_Client/Assets/Cards/3/artworkjson.png | Bin 0 -> 2389 bytes New_Client/Assets/Cards/3/testtrapcard.json | 9 ++ New_Client/Assets/Cards/Arenas/default.png | Bin 0 -> 10988 bytes .../Classes/Engine/Components/BoardField.py | 0 .../Classes/Engine/Components/Label.py | 0 .../__pycache__/BoardField.cpython-311.pyc | Bin 0 -> 4999 bytes .../__pycache__/Label.cpython-311.pyc | Bin 0 -> 3650 bytes .../Classes/Engine/EventHandler.py | 24 ++- New_Client/Classes/Engine/InputHandler.py | 53 +++++++ .../Classes/Engine/Logger.py | 0 New_Client/Classes/Engine/TCPClient.py | 52 +++++++ New_Client/Classes/Engine/Utils/Path.py | 6 + .../Classes/Engine/Utils/StringUtils.py | 11 ++ .../Utils/__pycache__/Path.cpython-311.pyc | Bin 0 -> 747 bytes .../__pycache__/StringUtils.cpython-311.pyc | Bin 0 -> 1233 bytes New_Client/Classes/Engine/Window.py | 54 +++++++ .../__pycache__/EventHandler.cpython-311.pyc | Bin 0 -> 7252 bytes .../__pycache__/InputHandler.cpython-311.pyc | Bin 0 -> 3564 bytes .../Engine/__pycache__/Logger.cpython-311.pyc | Bin 0 -> 1304 bytes .../__pycache__/TCPClient.cpython-311.pyc | Bin 0 -> 3578 bytes .../Engine/__pycache__/Window.cpython-311.pyc | Bin 0 -> 3664 bytes .../Classes/Game/Cards/Card.py | 2 +- .../Classes/Game/Cards/MonsterCard.py | 0 .../Classes/Game/Cards/SpellCard.py | 0 .../Classes/Game/Cards/TrapCard.py | 0 .../Cards/__pycache__/Card.cpython-311.pyc | Bin 0 -> 6032 bytes .../__pycache__/MonsterCard.cpython-311.pyc | Bin 0 -> 5654 bytes .../__pycache__/SpellCard.cpython-311.pyc | Bin 0 -> 4743 bytes .../__pycache__/TrapCard.cpython-311.pyc | Bin 0 -> 4719 bytes .../Classes/Game/NetworkEvents/GameStart.py | 0 .../Classes/Game/NetworkEvents/Login.py | 8 +- .../Classes/Game/NetworkEvents/PlaceCard.py | 0 .../__pycache__/GameStart.cpython-311.pyc | Bin 0 -> 1172 bytes .../__pycache__/Login.cpython-311.pyc | Bin 0 -> 1153 bytes .../__pycache__/PlaceCard.cpython-311.pyc | Bin 0 -> 1944 bytes .../Classes/Game/Player.py | 0 New_Client/Classes/Game/World.py | 116 ++++++++++++++ .../Game/__pycache__/Player.cpython-311.pyc | Bin 0 -> 2756 bytes .../Game/__pycache__/World.cpython-311.pyc | Bin 0 -> 11690 bytes New_Client/__pycache__/App.cpython-311.pyc | Bin 0 -> 4698 bytes New_Client/log/aruudvef.log | 6 + New_Client/log/azkihdia.log | 6 + New_Client/log/cssmtaso.log | 6 + New_Client/log/dypjnvwx.log | 6 + New_Client/log/ecnwzwpv.log | 6 + New_Client/log/ezuxqfek.log | 6 + New_Client/log/hpyfylsj.log | 6 + New_Client/log/jqqeltiy.log | 6 + New_Client/log/mhtlvsqm.log | 6 + New_Client/log/pbwegfvw.log | 4 + New_Client/log/qqebhbex.log | 6 + New_Client/log/rnwforll.log | 6 + New_Client/log/rrffvbhc.log | 6 + New_Client/log/snqncicq.log | 6 + New_Client/log/sstwdlli.log | 6 + New_Client/log/vzybrxrc.log | 6 + New_Client/log/wqfhotaq.log | 6 + New_Client/log/xqetosuq.log | 6 + New_Client/log/xwrmortx.log | 6 + New_Client/log/xxfpqmla.log | 6 + New_Client/log/ysnrngup.log | 4 + New_Client/log/zlnfjkpf.log | 6 + New_Client/log/zoukqhzj.log | 6 + New_Client/log/zpvgppfk.log | 5 + {Game Client => New_Client}/main.py | 4 +- OLD_Server/.env | 4 + OLD_Server/.vscode/settings.json | 14 ++ OLD_Server/Assets/Arenas/default.png | Bin 0 -> 10988 bytes OLD_Server/Assets/Cards/Arena/field.png | Bin 0 -> 612 bytes .../MonsterCards/testmonstercard/card.json | 22 +++ .../MonsterCards/testmonstercard/card.png | Bin 0 -> 9570 bytes .../SpeelCards/testspellcard/artworkjson.png | Bin 0 -> 2389 bytes .../testspellcard/testspellcard.json | 6 + .../TrapCards/testtrapcard/artworkjson.png | Bin 0 -> 2389 bytes .../TrapCards/testtrapcard/testtrapcard.json | 6 + OLD_Server/Classes/Game/Player.py | 57 +++++++ .../Game/__pycache__/Player.cpython-311.pyc | Bin 0 -> 3485 bytes .../Game/__pycache__/Player.cpython-312.pyc | Bin 0 -> 3265 bytes OLD_Server/Classes/System/GameManager.py | 137 +++++++++++++++++ OLD_Server/Classes/System/Logger.py | 18 +++ .../Classes/System/Network/EventHandler.py | 32 ++++ .../Classes/System/Network/NetworkManger.py | 142 ++++++++++++++++++ .../__pycache__/EventHandler.cpython-311.pyc | Bin 0 -> 1903 bytes .../__pycache__/EventHandler.cpython-312.pyc | Bin 0 -> 1503 bytes .../__pycache__/NetworkManger.cpython-311.pyc | Bin 0 -> 11204 bytes .../__pycache__/NetworkManger.cpython-312.pyc | Bin 0 -> 10000 bytes OLD_Server/Classes/System/PlayerManager.py | 23 +++ OLD_Server/Classes/System/QueueManager.py | 34 +++++ OLD_Server/Classes/System/Server.py | 40 +++++ OLD_Server/Classes/System/Utils/Path.py | 6 + .../Classes/System/Utils/StringUtils.py | 11 ++ .../Utils/__pycache__/Path.cpython-311.pyc | Bin 0 -> 755 bytes .../__pycache__/StringUtils.cpython-311.pyc | Bin 0 -> 1233 bytes OLD_Server/Classes/System/World.py | 20 +++ .../__pycache__/GameManager.cpython-311.pyc | Bin 0 -> 6395 bytes .../__pycache__/GameManager.cpython-312.pyc | Bin 0 -> 4142 bytes .../System/__pycache__/Logger.cpython-311.pyc | Bin 0 -> 1309 bytes .../System/__pycache__/Logger.cpython-312.pyc | Bin 0 -> 1149 bytes .../__pycache__/PlayerManager.cpython-311.pyc | Bin 0 -> 1987 bytes .../__pycache__/PlayerManager.cpython-312.pyc | Bin 0 -> 1739 bytes .../System/__pycache__/Server.cpython-311.pyc | Bin 0 -> 2529 bytes .../System/__pycache__/Server.cpython-312.pyc | Bin 0 -> 2281 bytes .../System/__pycache__/World.cpython-311.pyc | Bin 0 -> 1183 bytes .../System/__pycache__/World.cpython-312.pyc | Bin 0 -> 1078 bytes OLD_Server/index.py | 31 ++++ OLD_Server/log/jopxlbza.log | 28 ++++ OLD_Server/log/jsrrepta.log | 28 ++++ OLD_Server/log/kawhnrji.log | 32 ++++ OLD_Server/log/olchcxfi.log | 33 ++++ OLD_Server/log/ploaokwx.log | 59 ++++++++ OLD_Server/log/tmqifhet.log | 23 +++ OLD_Server/log/usujxxks.log | 7 + OLD_Server/log/votjjlwn.log | 35 +++++ OLD_Server/log/wdqxolbm.log | 47 ++++++ OLD_Server/log/yxojocbd.log | 33 ++++ OLD_Server/server logic notes.md | 42 ++++++ 192 files changed, 2373 insertions(+), 44 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 Client/.vscode/settings.json create mode 100644 Client/Assets/Arenas/default.png create mode 100644 Client/Assets/Cards/0/field.png create mode 100644 Client/Assets/Cards/1/card.json create mode 100644 Client/Assets/Cards/1/card.png create mode 100644 Client/Assets/Cards/2/artworkjson.png create mode 100644 Client/Assets/Cards/2/testspellcard.json create mode 100644 Client/Assets/Cards/3/artworkjson.png create mode 100644 Client/Assets/Cards/3/testtrapcard.json create mode 100644 Client/Classes/Game/BoardField.py create mode 100644 Client/Classes/Game/Cards/Card.py create mode 100644 Client/Classes/Game/Cards/MonsterCard.py create mode 100644 Client/Classes/Game/Cards/SpellCard.py create mode 100644 Client/Classes/Game/Cards/TrapCard.py create mode 100644 Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-312.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc create mode 100644 Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc create mode 100644 Client/Classes/Game/Events/GameStart.py create mode 100644 Client/Classes/Game/Events/Login.py create mode 100644 Client/Classes/Game/Events/PlaceCard.py create mode 100644 Client/Classes/Game/Events/__pycache__/GameStart.cpython-311.pyc create mode 100644 Client/Classes/Game/Events/__pycache__/GameStart.cpython-312.pyc create mode 100644 Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc create mode 100644 Client/Classes/Game/Events/__pycache__/Login.cpython-312.pyc create mode 100644 Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc create mode 100644 Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc create mode 100644 Client/Classes/Game/Player.py rename {Game Client => Client}/Classes/Game/World.py (76%) create mode 100644 Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc create mode 100644 Client/Classes/Game/__pycache__/BoardField.cpython-312.pyc create mode 100644 Client/Classes/Game/__pycache__/Player.cpython-311.pyc create mode 100644 Client/Classes/Game/__pycache__/Player.cpython-312.pyc create mode 100644 Client/Classes/Game/__pycache__/World.cpython-311.pyc create mode 100644 Client/Classes/Game/__pycache__/World.cpython-312.pyc create mode 100644 Client/Classes/System/App.py rename {Game Client/Classes/Engine => Client/Classes/System/Components}/InputHandler.py (100%) create mode 100644 Client/Classes/System/Components/Label.py rename {Game Client/Classes/Engine => Client/Classes/System/Components}/Window.py (100%) create mode 100644 Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc create mode 100644 Client/Classes/System/Components/__pycache__/InputHandler.cpython-312.pyc create mode 100644 Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc create mode 100644 Client/Classes/System/Components/__pycache__/Label.cpython-312.pyc create mode 100644 Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc create mode 100644 Client/Classes/System/Components/__pycache__/Window.cpython-312.pyc create mode 100644 Client/Classes/System/Network/EventHandler.py rename {Game Client/Classes/Engine => Client/Classes/System/Network}/TCPClient.py (91%) create mode 100644 Client/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc create mode 100644 Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc create mode 100644 Client/Classes/System/Network/__pycache__/NetworkManager.cpython-311.pyc create mode 100644 Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc create mode 100644 Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc create mode 100644 Client/Classes/System/Utils/Path.py rename {Game Client/Classes/Engine => Client/Classes/System}/Utils/StringUtils.py (100%) create mode 100644 Client/Classes/System/Utils/__pycache__/Path.cpython-311.pyc create mode 100644 Client/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc create mode 100644 Client/Classes/System/__pycache__/App.cpython-311.pyc create mode 100644 Client/Classes/System/__pycache__/App.cpython-312.pyc create mode 100644 Client/Classes/System/__pycache__/InputHandler.cpython-311.pyc create mode 100644 Client/Classes/System/__pycache__/InputHandler.cpython-312.pyc create mode 100644 Client/Classes/System/__pycache__/Window.cpython-311.pyc create mode 100644 Client/Classes/System/__pycache__/Window.cpython-312.pyc create mode 100644 Client/Classes/System/__pycache__/World.cpython-311.pyc create mode 100644 Client/Classes/System/__pycache__/World.cpython-312.pyc create mode 100644 Client/main.py rename {Game Client => New_Client}/App.py (78%) create mode 100644 New_Client/Assets/Cards/0/field.png create mode 100644 New_Client/Assets/Cards/1/card.json create mode 100644 New_Client/Assets/Cards/1/card.png create mode 100644 New_Client/Assets/Cards/2/artworkjson.png create mode 100644 New_Client/Assets/Cards/2/testspellcard.json create mode 100644 New_Client/Assets/Cards/3/artworkjson.png create mode 100644 New_Client/Assets/Cards/3/testtrapcard.json create mode 100644 New_Client/Assets/Cards/Arenas/default.png rename {Game Client => New_Client}/Classes/Engine/Components/BoardField.py (100%) rename {Game Client => New_Client}/Classes/Engine/Components/Label.py (100%) create mode 100644 New_Client/Classes/Engine/Components/__pycache__/BoardField.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/Components/__pycache__/Label.cpython-311.pyc rename {Game Client => New_Client}/Classes/Engine/EventHandler.py (82%) create mode 100644 New_Client/Classes/Engine/InputHandler.py rename {Game Client => New_Client}/Classes/Engine/Logger.py (100%) create mode 100644 New_Client/Classes/Engine/TCPClient.py create mode 100644 New_Client/Classes/Engine/Utils/Path.py create mode 100644 New_Client/Classes/Engine/Utils/StringUtils.py create mode 100644 New_Client/Classes/Engine/Utils/__pycache__/Path.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/Utils/__pycache__/StringUtils.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/Window.py create mode 100644 New_Client/Classes/Engine/__pycache__/EventHandler.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/__pycache__/InputHandler.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/__pycache__/Logger.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/__pycache__/TCPClient.cpython-311.pyc create mode 100644 New_Client/Classes/Engine/__pycache__/Window.cpython-311.pyc rename {Game Client => New_Client}/Classes/Game/Cards/Card.py (97%) rename {Game Client => New_Client}/Classes/Game/Cards/MonsterCard.py (100%) rename {Game Client => New_Client}/Classes/Game/Cards/SpellCard.py (100%) rename {Game Client => New_Client}/Classes/Game/Cards/TrapCard.py (100%) create mode 100644 New_Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc create mode 100644 New_Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc create mode 100644 New_Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc create mode 100644 New_Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc rename {Game Client => New_Client}/Classes/Game/NetworkEvents/GameStart.py (100%) rename {Game Client => New_Client}/Classes/Game/NetworkEvents/Login.py (78%) rename {Game Client => New_Client}/Classes/Game/NetworkEvents/PlaceCard.py (100%) create mode 100644 New_Client/Classes/Game/NetworkEvents/__pycache__/GameStart.cpython-311.pyc create mode 100644 New_Client/Classes/Game/NetworkEvents/__pycache__/Login.cpython-311.pyc create mode 100644 New_Client/Classes/Game/NetworkEvents/__pycache__/PlaceCard.cpython-311.pyc rename {Game Client => New_Client}/Classes/Game/Player.py (100%) create mode 100644 New_Client/Classes/Game/World.py create mode 100644 New_Client/Classes/Game/__pycache__/Player.cpython-311.pyc create mode 100644 New_Client/Classes/Game/__pycache__/World.cpython-311.pyc create mode 100644 New_Client/__pycache__/App.cpython-311.pyc create mode 100644 New_Client/log/aruudvef.log create mode 100644 New_Client/log/azkihdia.log create mode 100644 New_Client/log/cssmtaso.log create mode 100644 New_Client/log/dypjnvwx.log create mode 100644 New_Client/log/ecnwzwpv.log create mode 100644 New_Client/log/ezuxqfek.log create mode 100644 New_Client/log/hpyfylsj.log create mode 100644 New_Client/log/jqqeltiy.log create mode 100644 New_Client/log/mhtlvsqm.log create mode 100644 New_Client/log/pbwegfvw.log create mode 100644 New_Client/log/qqebhbex.log create mode 100644 New_Client/log/rnwforll.log create mode 100644 New_Client/log/rrffvbhc.log create mode 100644 New_Client/log/snqncicq.log create mode 100644 New_Client/log/sstwdlli.log create mode 100644 New_Client/log/vzybrxrc.log create mode 100644 New_Client/log/wqfhotaq.log create mode 100644 New_Client/log/xqetosuq.log create mode 100644 New_Client/log/xwrmortx.log create mode 100644 New_Client/log/xxfpqmla.log create mode 100644 New_Client/log/ysnrngup.log create mode 100644 New_Client/log/zlnfjkpf.log create mode 100644 New_Client/log/zoukqhzj.log create mode 100644 New_Client/log/zpvgppfk.log rename {Game Client => New_Client}/main.py (59%) create mode 100644 OLD_Server/.env create mode 100644 OLD_Server/.vscode/settings.json create mode 100644 OLD_Server/Assets/Arenas/default.png create mode 100644 OLD_Server/Assets/Cards/Arena/field.png create mode 100644 OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json create mode 100644 OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.png create mode 100644 OLD_Server/Assets/Cards/SpeelCards/testspellcard/artworkjson.png create mode 100644 OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json create mode 100644 OLD_Server/Assets/Cards/TrapCards/testtrapcard/artworkjson.png create mode 100644 OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json create mode 100644 OLD_Server/Classes/Game/Player.py create mode 100644 OLD_Server/Classes/Game/__pycache__/Player.cpython-311.pyc create mode 100644 OLD_Server/Classes/Game/__pycache__/Player.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/GameManager.py create mode 100644 OLD_Server/Classes/System/Logger.py create mode 100644 OLD_Server/Classes/System/Network/EventHandler.py create mode 100644 OLD_Server/Classes/System/Network/NetworkManger.py create mode 100644 OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/PlayerManager.py create mode 100644 OLD_Server/Classes/System/QueueManager.py create mode 100644 OLD_Server/Classes/System/Server.py create mode 100644 OLD_Server/Classes/System/Utils/Path.py create mode 100644 OLD_Server/Classes/System/Utils/StringUtils.py create mode 100644 OLD_Server/Classes/System/Utils/__pycache__/Path.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/World.py create mode 100644 OLD_Server/Classes/System/__pycache__/GameManager.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/GameManager.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/Logger.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/Logger.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/PlayerManager.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/Server.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/Server.cpython-312.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/World.cpython-311.pyc create mode 100644 OLD_Server/Classes/System/__pycache__/World.cpython-312.pyc create mode 100644 OLD_Server/index.py create mode 100644 OLD_Server/log/jopxlbza.log create mode 100644 OLD_Server/log/jsrrepta.log create mode 100644 OLD_Server/log/kawhnrji.log create mode 100644 OLD_Server/log/olchcxfi.log create mode 100644 OLD_Server/log/ploaokwx.log create mode 100644 OLD_Server/log/tmqifhet.log create mode 100644 OLD_Server/log/usujxxks.log create mode 100644 OLD_Server/log/votjjlwn.log create mode 100644 OLD_Server/log/wdqxolbm.log create mode 100644 OLD_Server/log/yxojocbd.log create mode 100644 OLD_Server/server logic notes.md diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..23c2a55 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Old Shadowcrest Engine Server", + "type": "python", + "request": "launch", + "program": "OLD_Server/index.py", + "console": "integratedTerminal", + "justMyCode": true + }, + { + "name": "Shadowcrest Engine Server", + "type": "python", + "request": "launch", + "program": "OLD_Server/index.py", + "console": "integratedTerminal", + "justMyCode": true + }, + { + "name": "ShadowCrest Python GameEngine Client", + "type": "python", + "request": "launch", + "program": "Client/main.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/Client/.vscode/settings.json b/Client/.vscode/settings.json new file mode 100644 index 0000000..6b1a4ea --- /dev/null +++ b/Client/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "cSpell.words": [ + "pygame", + "yvel" + ], + "cSpell.ignoreWords": [ + "activateeffectcard", + "activatemonstereffect", + "attackcard", + "attackplayer", + "movecard", + "placecard", + "removecard" + ] +} \ No newline at end of file diff --git a/Client/Assets/Arenas/default.png b/Client/Assets/Arenas/default.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5da22ccc75f0be2ff44b31e702347d8e45ddc5 GIT binary patch literal 10988 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 literal 0 HcmV?d00001 diff --git a/Client/Assets/Cards/1/card.json b/Client/Assets/Cards/1/card.json new file mode 100644 index 0000000..3ce8af5 --- /dev/null +++ b/Client/Assets/Cards/1/card.json @@ -0,0 +1,23 @@ +{ + "id": 1, + "type":"MonsterCard", + "name": "Test Monster", + "image": "Assets/Cards/1/cards.png", + "description": "can attack other monsters", + "costs": 30, + "defense": 40, + "attacks":[ + { + "id": 1, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + }, + { + "id": 2, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + } + ] +} diff --git a/Client/Assets/Cards/1/card.png b/Client/Assets/Cards/1/card.png new file mode 100644 index 0000000000000000000000000000000000000000..320d60d34af39518b06c3adcf397345b883d202c GIT binary patch literal 9570 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 literal 0 HcmV?d00001 diff --git a/Client/Assets/Cards/2/artworkjson.png b/Client/Assets/Cards/2/artworkjson.png new file mode 100644 index 0000000000000000000000000000000000000000..9955a0cbf1966ebc0956bef3cc107754ed7011da GIT binary patch literal 2389 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VEn?t1{8T15PXG!fm6oQ#WAE}&fA-TE1d#G zTrbu>Wi@D!FEF zConP`VG(0+@EK){2Eu4c7|jI(oeSQ)FW6NT{NVMq>&1EhyA>OJBl@P7nyP-teg8c9 z-SfS&4Za^-IT!?lfhD0~BkL$*G!RBp!e}nQ%mqtl{$%KP6?(pDVM0Byxy0b<>gTe~ HDWM4fLIJZ> literal 0 HcmV?d00001 diff --git a/Client/Assets/Cards/2/testspellcard.json b/Client/Assets/Cards/2/testspellcard.json new file mode 100644 index 0000000..f812019 --- /dev/null +++ b/Client/Assets/Cards/2/testspellcard.json @@ -0,0 +1,9 @@ +{ + "name": "testspell", + "type":"EffectCard", + "image":"Assets/Cards/2/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test spell card", + "attacks": [] +} \ No newline at end of file diff --git a/Client/Assets/Cards/3/artworkjson.png b/Client/Assets/Cards/3/artworkjson.png new file mode 100644 index 0000000000000000000000000000000000000000..9955a0cbf1966ebc0956bef3cc107754ed7011da GIT binary patch literal 2389 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VEn?t1{8T15PXG!fm6oQ#WAE}&fA-TE1d#G zTrbu>Wi@D!FEF zConP`VG(0+@EK){2Eu4c7|jI(oeSQ)FW6NT{NVMq>&1EhyA>OJBl@P7nyP-teg8c9 z-SfS&4Za^-IT!?lfhD0~BkL$*G!RBp!e}nQ%mqtl{$%KP6?(pDVM0Byxy0b<>gTe~ HDWM4fLIJZ> literal 0 HcmV?d00001 diff --git a/Client/Assets/Cards/3/testtrapcard.json b/Client/Assets/Cards/3/testtrapcard.json new file mode 100644 index 0000000..13ed51a --- /dev/null +++ b/Client/Assets/Cards/3/testtrapcard.json @@ -0,0 +1,9 @@ +{ + "name": "testtrap", + "type":"EffectCard", + "image":"Assets/Cards/3/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test trap card", + "attacks": [] +} \ No newline at end of file diff --git a/Client/Classes/Game/BoardField.py b/Client/Classes/Game/BoardField.py new file mode 100644 index 0000000..c490fee --- /dev/null +++ b/Client/Classes/Game/BoardField.py @@ -0,0 +1,85 @@ +import os +import pygame + +class BoardField(pygame.sprite.Sprite): + __fieldID:str + __name:str + __side:str + __type:str + __pos:pygame.Vector2 + __size:tuple + __color:tuple = (255,255,255) + __holdsCard = None + image:pygame.image + rect:pygame.rect + + def __init__(self, name:str, side:str, type:str, pos:pygame.Vector2, imagePath:str, fid:str): + pygame.sprite.Sprite.__init__(self) + self.__name = name + self.__side = side + self.__type = type + self.__pos = pos + self.__holdsCard = None + self.__fieldID = fid + + # Überprüfen des Dateipfads + if not os.path.exists(imagePath): + print("Der Dateipfad zur Bilddatei ist ungültig oder die Datei existiert nicht.") + else: + # Wenn der Pfad gültig ist, versuchen Sie, das Bild zu laden + self.image = pygame.image.load(imagePath).convert_alpha() + self.rect = self.image.get_rect() + self.rect.center = self.__pos + + def getName(self) -> str: + return self.__name + + def getSide(self) -> str: + return self.__side + + def getType(self) -> str: + return self.__type + + def getPos(self) -> pygame.Vector2: + return self.__pos + + def getSize(self) -> tuple: + return self.__size + + def getColor(self) -> tuple: + return self.__color + + def getRect(self) -> pygame.Rect: + return self.rect + + def getImage(self) -> pygame.image: + return self.image + + def getHoldingCard(self): + return self.__holdsCard + + def setName(self, name:str) -> str: + self.__name = name + return self.__name + + def setType(self,type:str) -> str: + self.__type = type + return self.__type + + def setPos(self, pos:pygame.Vector2) -> pygame.Vector2: + self.pos = pos + return self.__pos + + def setSize(self, size:tuple) -> tuple: + self.__size = size + return self.__size + + def setColor(self, color:tuple) -> tuple: + self.__color = color + return self.__color + + def setCardHolding(self, card): + self.__holdsCard = card + + def getFieldID(self) -> str: + return self.__fieldID \ No newline at end of file diff --git a/Client/Classes/Game/Cards/Card.py b/Client/Classes/Game/Cards/Card.py new file mode 100644 index 0000000..3ef646b --- /dev/null +++ b/Client/Classes/Game/Cards/Card.py @@ -0,0 +1,105 @@ +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 = "Monster" + __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.__type = "Monster" + + 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) -> pygame.Vector2: + return self.__pos + + def getX(self) -> int: + return self.__pos.x + + def getY(self) -> int: + return self.__pos.y + + 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/Client/Classes/Game/Cards/MonsterCard.py b/Client/Classes/Game/Cards/MonsterCard.py new file mode 100644 index 0000000..63f1e28 --- /dev/null +++ b/Client/Classes/Game/Cards/MonsterCard.py @@ -0,0 +1,88 @@ +import json +import pygame + +from Classes.System.Components.InputHandler import InputHandler +from Classes.Game.Player import Player + +class MonsterCard(pygame.sprite.Sprite): + __name:str + __id:int + __description:str + __attacks = [] + __type:str = "Monster" + __pos:pygame.Vector2 + __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, 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"] + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.rect = self.image.get_rect() + self.dragging = False + self.offset = pygame.Vector2(0, 0) # Offset zwischen der Karte und der Mausposition + 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 + + for attack in data["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 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 \ No newline at end of file diff --git a/Client/Classes/Game/Cards/SpellCard.py b/Client/Classes/Game/Cards/SpellCard.py new file mode 100644 index 0000000..5209399 --- /dev/null +++ b/Client/Classes/Game/Cards/SpellCard.py @@ -0,0 +1,72 @@ +import json +from typing import Any + +import pygame + +from Classes.System.Components.InputHandler import InputHandler + +class SpellCard(pygame.sprite.Sprite): + __name:str + __description:str + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __type:str = "Effect" + image:pygame.image + rect:pygame.rect + + def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler): + if assetDir == "": + return ValueError.add_note("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + data = json.load(open(assetDir + "/card.json")) + self.__pos = pos + self.__name = data["name"] + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.rect = self.image.get_rect() + self.dragging = False + self.offset = pygame.Vector2(0, 0) # Offset zwischen der Karte und der Mausposition + 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 + + def update(self): + if self.getDragging(): + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + 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 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 \ No newline at end of file diff --git a/Client/Classes/Game/Cards/TrapCard.py b/Client/Classes/Game/Cards/TrapCard.py new file mode 100644 index 0000000..dcb6f76 --- /dev/null +++ b/Client/Classes/Game/Cards/TrapCard.py @@ -0,0 +1,72 @@ +import json +from typing import Any + +import pygame + +from Classes.System.Components.InputHandler import InputHandler + +class TrapCard(pygame.sprite.Sprite): + __name:str + __description:str + __pos:pygame.Vector2 + __dragging:bool = False + __offset:pygame.Vector2 = pygame.Vector2(0,0) + __inputHandler: InputHandler + __type:str = "Effect" + image:pygame.image + rect:pygame.rect + + def __init__(self, pos:pygame.Vector2, assetDir:str, inputHandler:InputHandler): + if assetDir == "": + return ValueError.add_note("Card: imagePath cannot be empty") + + pygame.sprite.Sprite.__init__(self) + + data = json.load(open(assetDir + "/card.json")) + self.__pos = pos + self.__name = data["name"] + self.__inputHandler = inputHandler + self.__description = data["description"] + self.original_size = self.image.get_size() + self.original_position = self.rect.center + self.offset = pygame.Vector2(0, 0) # Offset zwischen der Karte und der Mausposition + self.rect = self.image.get_rect() + self.rect.center = self.__pos + self.image = pygame.image.load(assetDir + "/card.png").convert_alpha() + self.__dragging = False + + def update(self): + if self.getDragging(): + mouse_pos = self.__inputHandler.getMousePos() + self.__pos = mouse_pos + self.rect.center = self.__pos + + 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 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 \ No newline at end of file diff --git a/Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/Card.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c81c6ad80164f0a64cb4e4031a635e59c72fac04 GIT binary patch literal 6423 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 literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/Card.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e97a3179d5b944e2ffeac541ca4e00d99083993 GIT binary patch literal 5777 zcmbtYTW=f36`m!RtL06yE|e(oB2uzt(-$Sq#et33Dk4?397lF4$4wa3EW=&Nq$!e~ zT{$5`J4WpSWZ*zH0@Tz?q$C$G zw1Q^NW#-JcXXcza%fGwb4g$}}*dOI(p#Fu7`Pd9%BL&0*A`yv8lc?TvQ4V-Z+OlAc zS~-+i)BJ)hYU7B7oF)=~he$S=OSw#An|-Q%lQyX*R-KB9c`hRS2bt*zr@5vwxkdF% zJR_xL3cPS39nZ@&VNSzdG?)#+f+%Hz$fA}Hh-{U4iF+H=vJEH;qfll=YMw*|iI29i zQ8uO%Q(cCwrVhpnsFm8H4%rEuh@6GUJC2s@lKlzbz$fb3c?{Tau=U(PIT_Usl#5Y_ z&&?PLz7?@X=1mbB9E`q+V#d zr9Rm@XOX-h?*V#81fcH+y+;~=8NHGZ+CIq-tyc;_+b;#79e~+37&!RLu$tX<}RfOA|>L*ggZ>?-8t0Rc6t8QW+Z0;c@}%rr z1i%)FX^|tU)6~P-)&ejRZ$`nJL?lQ8js#gF7Zrt+4@b5>Qd^U?MviLo)(-KQ>S(or9QZ&) zADGrs;q7Cd7$QK`uuvpBMSN=b|ITh?tfCccHT(m%dbiI5>E7+qSdS?y3Xmzmd`%}Gee zX7IMt+TyAjPh3?Ze$8 zs%CSu=QHVKMvh$^KRtUIJQf>ICjtBHcpB5H!eq0!hYD*)b9uTC%of}z8#TR&IFt_| zao!?zXZJn&<*BD#{?)*#TG!aBYwQQHeaT&RuZjMu=wB1}RmFV|rEkSUKe#*Z9jMG! zyCRQXueo1YC!Brwn>U_z_dPg%|9Iu%*JGuLpRFKU7l=1d;_tei_ViWw%Ee{J*XMz? z*F9e79QEFT%CY-tAe}%yxN`qW<$A4m1o@{P--FrvvumD_s%PZkXWtyE?mt=coLcjo zt9s7WJkxA?kN3gZ`)AjB_E&rM*Lor#v)6+MOZ>N@ukIUMIk9}A#4p*)_HRXRJrI6) zq#Ae?l>@-6M31cC`y9$zCkeQ`e(lnx^@#`{?Sma z_sBDN<%6Zkx@*tUba{Hs6|TC%4@bUpMSg_$KKS!Kc=;dEE6)`?jeoKCP7YiDI&7Of z(w1o4SfIdrirs5}00Qncf_3QDhn@s^<3`)mrkZa^Lu_WK8yveM&^CL(!Vb3{NEqIBo!d9?{i>F6NyU8G1v(%7Q^#>j+gl zLaSnEx8PVl-Ug=~mWFI-*0+Uj6Hk-y7h3>@s~zE0F}yoKa9mhGY~3!5jR~V_F6?Qb zF(l&%WpmrUD1Wgk26qhvoxRO7b^vmo73zg{6Nb)Dwt~1(zOgF$cMXDFxm&#<00>AD zM!f6HRO|AEa$!~M-`(;M!t9FQx;)0tMXW^hAU3#j=q}ueT`$UNjjfB?V410jg2QzB z)WrGLH_n&ytD<+;i(|>NZP&4&Igj5?#wBmEzkX%PgiX%^Yg{yR7U-5M#)%)4tpV61 z!Sxla>>xP}43+q=I&?IG{!RPxSl(;Gf=FAi*kR?C7;Nw#H{tLG0f$@PjFbgB$cXix;7pEUCAFlDeb$iE>uk5SwJ?nhG?ODbcA^2s&l NVAVPJUxE^5>VH$Gg3AB^ literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/MonsterCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..704782a5835ef0e525b43fee49e200d878f4da8a GIT binary patch literal 5665 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 literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f31c7ed0a7e9e48f392c8995af33f9f709b23d68 GIT binary patch literal 4754 zcmbUlU2hx5agRJwM^Y3e@x!DjN|YVTpzSFBXza#KoTl=Z)I>=j$0=AL2S$66$xtM- zcQPtgPF27UM4^W~2#p?8fDeUh!zd7-f1p2sCmbN+00RMvJoKq5+^0NsW{-Eeqnd~6 z?l`+MvpX}pJ2N}dU!u`4f#+Yp{;Tq-M94o7v7bP%^XfC`d_yRqLX{M;^;Ly6U(qL6 zG=I?#G=EiG3lswa@sYcPicbg)DE>;&7FHRsdr$p@ynvte6eTJwl0xvGh%OWa)Bj#= z1De6PT4PdaYvvNZ#*K20X&1lrsJ7&U7p{%sJTCS}!++TCl&8n}gsETH$-L$gH3C!T_ zl@(=K^ID^AG!!#XUMsCCrpS=(2d$=5QbE|QGBXF=GL}XAAfQD@LO*=BSz4o5CiML-wpqk%}1`A;95rj|7k15qn76iC3F~EocrL*W7ko-aYmyATJyO zXmn(6l8V!ByH@KACdcLu**qEqNiiGKTzgs>wyAW04tRqY<~aMe=?84o9t*Y{?GdRs zdgQn>0s`H$a|wszUPscVy4z#xNZDM_>*%T+=_2wedjusAhM@(MG$%0#Z{)d?e^k;Q z=9f#gT3yS3uH==qhPKfRzp)G>W-2NKposC=3|W*$ZS{^7Y7tkE7Sd+;L8-c~+-9uK zAXX@qL7rj;8yl+_-9fd%%7`yott89kT3M52Q?ztc>m_Q6^@dVoxO)tph2g1~(dByW zk-{{&RBb#gnbNAF$rzRlPsfz(_%{b00I|-lm_aM<8TybJTvlqD!WdjdFc{~m<)&gr z>#Ph}qg1uf5eJ1(FJsy%1WZv?sw)gnnc?9w+*4DeC9R~QljQOF;oj_xrB76asY|M+ zD36wIDe4zmy|MIRty-=r^8MMnOS9E7*Z>V?5OwJ;?8g%Bzq;h)z?sGd%Yn@1=n=`@ zAylglLR#1&-AMdv_J^B?L#bs3DCXNN4w@ zvu&zN7Yyk_N4oHREWW+*r^N2VXXEDe)4@ixnLw0_>@F?XZ|2@Za;BOPZW$q z0f?b)ItNYkWomq<*8cdJpr_6osq-kdI{}R$WxLtQy&E{xkkZ}URQq)!cL^C|fb10y za+mgVm-O5fBX`B3PM!U8#+bT{$V7*KuV7QivXd(T!92@z?+$bz_mVcW#~*L}u&WR? zj+8df)%|n4Gad^(3p&{t=DYh&ZkC-qf>DRR=fXlEXhy&VZ`oHC_fVvKP+wP-kLs%B z`{>wg8bHCv&O>8{){rlQZ>nfwKF=;9Ik?^cZ&aGYM^0l=aIX3R0CbtyK_t5$$?B1u z5y>4Af9QNSJ#M5g9Hg)Br?2bjw~X{#t+{UIbnDjke0TE9UK2WV#^88|e}@AwgHL0x zbEQnt)>+N7_qc<6@6mGH`wFzyvq;z*&?^W$qMr+VK`Kt@En)zczkms5s9Oz%JP@%rD~7kS2YHI>d3qfD`5qq$}$@R!R$2z7-^>XdA(j`JYGa3av#DX ziPu8Bf?!t>y^a8VmA!)i!`Q&( zvN3Ua>t5@@_GcaOGJLvtxtqv$MErCy-yO+p-DzFzh#B~FF@usXcEl8Xx|r&QV%s1z z0iP}=4#kncmECK5P!U1r+gaZHy~>+@Ff9h)8gsy)5XkPvp^^$@`$13$Ozl3}+eG?Q zKLF-wr1b!xlZf^Jpm4=H0MIc+djL?kGCiFR;_r9l-H!J= d6n`!Vu)hBdzYgw1jp5h+&DsC?kwM(P{{jaF`zHVZ literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/SpellCard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90a425e01b13278829e25b30847d10fe73aee0c4 GIT binary patch literal 4612 zcmbtY&2JmW6`v)S)RGiMN&FBgQWWJ6xr|&Tb{o5O6D5IE+Y%flff64GAq$4PlF3j@ zW_D$ijGP##3y?(uMJGu>5UH2et}po$dhbO99gx_%r?`jSgeblE)c0n&n89`zwwQn5(xPo1@m*Xn3EhZyF?-qmnSJ~ZFz3Pma=h%&YrS^ z&YtHt94QA!Y~%)!_ytj}pB&!*kEo#| zf|mG5PRJWYtyFfuoPi#*ITaF-$2={&3{6p4ziyXFWi zOdM&8kos9HKS_tqt8#vg4ud1bV4!&JIxnTQw2Fb0!0-9n^Ve2CP-UvFu4uA+cXdHl zKh_Gx)pwM9R*}W`=WndufDI7m^H~70I-kd~qB7ko9s>B8#c{S+q8LTx(T>X8CX6KY zIgtCL>G6L>|2X&5Khf|{*Zk8*7jD-5i${Zt&xE0EZ`IonVl^Sw5YE?x^M}$CVdk07 zzg?=9z7Fi&c^Iq3U#&;3)O}Ygd@~rX@L#x_q4B*dJ9%I|PlM6j)t%KwaJm+pKK$Lc zGqnq^*MoD7;H_HlRz0}Px(C9$OFK)Az=c}iLOqZKovRt1fX4eY6x&sHl*9KPa`n(l zIAAjl%@ZNoj7}b0+rL)fw_R1&6CvE3m^%DO)j)QQJ+D|nmUI9&g;75+ORegdl}nO5OM9xm=y`TYhMD8D3UwPFwW%;cf3gS~Z|8y17++C`zG zHGS@JtQ59OIE>JzNQ1UdnHJmQmPm;_;+B(6-2<_^VBT9SJW=y@VN;dgEvQD|V^q`g zK$13^ghqF5pk0K(R1tn6L9s;W&dnl(qFf&C1dE};5}?ij!BFuvJkgpb`ouHQ496Pb znObI1F3GV>e#Ei0sOZ|lKL9IV#=(ip0q+0)&zPL2__gl10-WDh{&_N#)}T}8ef6H z8DGiBXNrTgDia%_t0sBy#oUSjYhYN^Z-Kvxy9a4Aex|~I=`+xr1JzGQ^CoziXmErs zG%lF-#lUDQ7qEW|NjMHjyvB+AsMy+q2c#Iv;L^qW707TAhzJ;}`eV4wQZ6;d>81smCwfzgfAx z{bBXPI)AAdNYwd6b0l{EdgT{&K8EfWs~78hsOj=;N2}2~A2{Ym9GCa59L(*{9TQ-` zooCJ8@+T<$FwHw&Iv(U4(LMhOf#%rBIi~jR9&GJzp*-~i$Y+pDBAGxkj)ZkQd-zN2 zbQYZ^!RfR8&rqI3IkFczi0{XL1lh=6w(O*fPQapdC;XJeU!<5s>?ri<)_ZSurKD=| z#_W7yqgYVjA*jw;|L36WbnrT*_`}B7&=urZrs5_)7hW?WVUFGg5ie2|p9jZwj^qA8 lJpUx2?}_(cc22;r0)O# literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc b/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0871a3bfe128d7a0a6b36a1d317c04b7c955485f GIT binary patch literal 4730 zcmbUlT~8y|b;cf>v5hg{4{VH$S+uOYY{{}|pxLH05oB3tLK3mrMlQ<8@eHgTV>@?- zRdLyrO8a0{JoEu2JW$CG)pl2_N|E{p`V%~8Bt|2x6sgKX->B%*KJ}bCo?*r`4`pUJ z_nvd_J?GqW&pG#)zlOs>2ADwrQcc!GeTWj z*g@;3tHMsM;(+88BT{hFFAhHC3IpQMQ>G9Rhb8Z(M~nhx5c&?zK#c))NQ}e0VKD(P zDvkh*iAjKQF$FLoj!HbtOvB6(am*p$gj>CcE4E_NrHWrISG$Ml4 z6@*%GTQU+3f+)!)Qf?^add(Pc&>MC6o)L8rL{i+^D%Z9Mn${R{jMO(bWl1qc9Hg@2 z^bP;}o10Qeap|G#HYCGW-Y#xQ21jtz3la^!CyF9dYgc{SGut$+#b8f2mx!=9w%}s3t?b{#yb-BynuzQA(-cL&9mKjkEz(2wFj*E z&h{A~FKq&FjaUe*9klutdnYhs*rF;9>r|o^^>P@(nwT}}(kO0Go$V!!Y%O5zg>4+# z3AT2w^Ss!(oxhxN;6(Z^pGZ65oMZJb>16X3dDz{EHBV$9`~qtR(;Ua>yPKm<{&7)x zlq(f$wYrk~Ldr?o4Q00(e4_+2W-2no9!DcHT{N02=Inme- zm+H005>bR=wehG((1-IrgOjD|Cc%Rv=uZUQ$Kb@GQk2oFa`?PnUc9^UsVotBLslf| z@y3!Qf2q_P8z0rG<(ecsSX|y%td>D3XfS!m8_Qsd4K%&HVdcG<#xBVK%jS?xu}p(P z3b4SbEF{u;R|B})sW)aE0N{k)W+MhgU)x=FL z0X%?JEP1$k8oO~4yP?MNS}YI5fSw*dzKb1=Priz$4>wNZQz!AM_HVzNR&V@5jW1~N zh12*4C-D!|_?i}9gQ-D%bR3#U3*K`u2~)CDBp{exY05o>4y0VB4ejN}9U|mS2v(a* zo2KaAHSQHpSepFoBn<1FeLE!!cGAIM!@n2oTHbGjz;&0bYYN?(Qa-Hj$kNAk*>rjI zVloLJ?;&}d64=IZ0o+(d6>~WzG-9sPPV-2FAIcRU9OF?nx7>2M5 zaNXZ^_))6D|1H{xJ8pf%nwtK>kb9YeR!zEZzfai~1vobN&i(tyRic0UoI!h&*ww(Db0KzYMf=ye3rItF$ zET|K1!E2t%6^yg!&;;*$mvQ_c)$JB0fm*R^67vde1zSO?!&-jSfZ_&ACMa%#g0Ni| zcdFR$7lf~Niq-CjS5^r8>=0<(Rm3Vq76dX18j$M<(AN#_i+a6EXt;1lq)vpT5UqG< z-9RuQkU0c*5#Uci8pH(8ji9y2Jp?NVeuV(9h!>_~(F=w6k%|CIE&1<|ruQAM9vawR z-CzB~sy-a=aQLZQTn`Q&%yhUUd@7gJ6Y2fcmeS$U@Tpu{&)z!PJgzc2>*I z?%!`cJovoB&BCX0vwAGo;qX(roIaG=zt?)R!=>O;xfF7~)!`EGsa!%2L=J#y3_g{M zopD3H+|k@I6hhGXZjmHD4=}lUf^ea6GxAa_mDo(3t;dX z(z*c9aYVZSP`F%e0O%;9T>z+47@(8wpW^srFMy$OP~mH&JNZ)-22)3g<17xQeiWDi ziKmzkkSsKYAAZT=uVTETsb?8e-9mI`eHTjB?U}{;cB5W{3RRwQ{!@fdXG`OCJ Y{rzv)dVKIii%kBT4*%yzCQ<$V3sdy*fdBvi literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc b/Client/Classes/Game/Cards/__pycache__/TrapCard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fb7dd7234903ab6a2e6cb85a42c7bd1899d81ab GIT binary patch literal 4590 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 literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc b/Client/Classes/Game/Events/__pycache__/Login.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..436d90072b8706d4696481c9100a279d76846230 GIT binary patch literal 1513 zcmds1&1(}u6rV|EcPG{K8?00z6%})6kJgH)G?5}`6h9C`K$e|pSi9McGn;Bll^_L+ z7sZP`CkuZ+#w|`uYpaLQC?>nH<-@j zvxFJTBu^Q>iPCgKZJA5sP`l#^hk>DAcgzJYEW8b-CIt+|pv{Y*02s4a5dhv|MqbAs z;U!c9|KDQ?zlUAcc6L%_0jQP>HODL3Zm5?dtn~PXiV^hxRq1%B@pb3R|layjRF<-#@B zv0Z-mR%WKq&VgN|%MDhiDfm(ncqP0W2tgGBLPN4njc`i zLjDd75D;iTF_wV4hdY@-tvQv6#6VXT*`KB8)D@xak66OBJ-9mn$k%plrZXMzja__L z(cRU1p#Pe>0@2uy5K%gjTO5vhdxOie=SrTkOvm9Y)TM9w6&V_`Vp-6u#e)&^Q?sTG zuNO}VZgG3wc8jUD-}2m9Ta--S_T1F0@JcE8>hoL()!C3lyouRN(WxwKU`j%AzkOqc zDlr`sgD{C9P}}4YeJVBCRh}3Hp9+)}P*t=}5-1=Y9t}G3nzYSQHMzGr=J^ws;df!gH9)9)^PnfaFe zdbK_>-58m!(@cYAf{us*Ku#w@a!-2dPq0u_cVcjxzY~hT6VX3OC@O?QT`%^WIASy0 zCEN0&Q+)!~KtgotEqboxv5Ldbi(}wZOpuR3wc;4#COS}!o+e6Gqo;|E2i?*{CxdQj bQ3D@op&d1B;4EG}t~^;>}!5LxUwBd|$kc-1skcZx_2ipLTiSoYfqn0rnYVA=`{tXkrP3IJF?at1{bC^W zTTM;|%=H*9f!jd@5zJ6?ZaN=Lgbtjif03!Dkxa2^a4 zhl$aKB0geby*FRuK3YE;J^Bar@#o`JjB@1L4QaEa-HD}>>cjlohiacIPX1Hlo6@Em zz_s*xg7P?wsI&-eb%AnA(3toJcc6XgreV&KkO(D%O6BNL?N0Cv{t&@(M(IZIfQoLG zq`{Mzbz-`@QmY4bNVYn& zW@Neh$F(jxoAp5v+2ijTZyMVRd)Cz<#6VRM6(VfYb6QY3&|0_!UmpIo%iHP_ zD#wgfmvfQPsM?^}i-dQpr;mfH7UjfAm?FEX9}8D+K~A3A7(E_t!;Yp|SN93&qjmL1 z-rXo6Jx1^G8xW-05{kZoi80qu*#k5;@LW8zy*NbR22&=!zB~IDfz#Rk E0s0~EKL7v# literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc b/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca1ef0eef13ca2405691fb77ea83c11e16c7592e GIT binary patch literal 1727 zcmZux&u<$=6rS0gUH|CXNlTRi2`JEjuqciM2PA}wz-dDcIF-`U#I-<{XHo*|-PO*< z!N?%10#zU+(yCIB0LiBk6d~ovfkO}d16(NwYfea^DK%Rd0r+CZ=`4=aB$sU6JHh?X{38yY8p*37uGfDAG#cXv)~2m(T5d}yCQ@+D^x)% zodI(!9Hh@Is#M@sssgiGi^VxfcjbMM@#d^Oc$?UqOztd<}VHZSz4xr3SO`0))rfN)D<;;w(8k z)g3>-mA;?8=R9x_I`^G>*$3I~_{0Ea&i=IW!^-!!e!SH^f^jA>X2%3nYd$_ltnA(5 zo#N)(PuS!ho9y(*KD>u0YXkc)#1>bUzv00bn}IKtvo_R@Rm^N(5bFlK3}A~u>H0e( z78~;y`1k#0Hd)hxLPGv_Fo#+Oh5Rb>KBOp;vzQV&dq8KQ_fs;cY8$c_8W!-hyacL6{$Z)Ri+2_~=U;Enf$ELzrQJ)9 ztS9X19=qDa9)VagP%41{Y^$ijt8}({` zW2phXS<4svTHt%wclqJ#CB!uDMdv@SDOj+p`%#%|UZhMJ!QbFxQH}iYO`TLt zGMqs-%#_ajLGs<2&(~dXIeY`wFhLS7S`wR-(k{ug^sh^1I-{dY-s_BxE_tmpI%0c_ zPW{Yd0_M1yG3Y$qyb%+$?Pq#+`>mect@i9+^}oOAp-%a;9ymoODNSu&i3ymtsm=C9 jZFZNmc{K6(MGZR3pX@EKY8Vqzrym%H7*3vsbe8@H-|LHB literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc b/Client/Classes/Game/Events/__pycache__/PlaceCard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5ef877e699436b563b1ddf162910a280ca3d69f GIT binary patch literal 1797 zcmahJTWB0r^xk>x%)XlRWo@=GZMC?d30SQlMX8&b7U{NPEIT(f>FmsKXPR_n zQ&K2sDbkdFq~L>muI6VyBM9o30YNq)(&b9O{PJ%#e&x$^Zg-P4P3wg@uX|o|9`~0- zB1+&~d-rR0Lnq`9WZEa$BG$hJVxHK$+IZZK-PCf{V>a<8*d(4HM_)-h3BICbn%?y%hRLR>&_D3F zV*?RC>-ty2GX>Xn7%wVYX%GWw6~6Uf0l-hv3Z0}K_bqanT}4@JsaE3~le zGeNHjT2326zs$n3gCYWG1my-07rcPuba0F$w1ByGS`}7U^fS%`IO3R{i1>xF;}z@x z>(bZPw~@`fk-r!)9^{8Z#-{RvEVvSSe*V1cOt@@pBr}vBDwNpRBPaQcQwRbUNLl_g zCK%)|VA2`LvfnQYYm?)9AOsdMI0ImoG?Sz|)#%zgAH5sB7e^v~H-0bKNOa%1bnDXX z5ATfK8v76PSIpRD%nmiXh@Sj3dm}sd`fpm#I`|?&pT<#mA1I zf30=j<1i_@)l86Ra;|69 zdZeCOF;n+vsw35RYKQBGUab|EPA>0TGtZ;CiRuwlKe%f3Nbfx>X3zanb+CG()?H5> zuMID~w5+e0Sx|3iCf|#h8lGdr)(FF8(}0T+5OyB<&|u5waXo4F8 int: + return self.__id + + def getName(self) -> str: + return self.__name + + def getHP(self) -> 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: + return self.__handCards + + def AddToHand(self, card) -> pygame.sprite.Group: + self.__handCards.add(card) + return self.__handCards + + def removeFromHand(self, pos:int) -> pygame.sprite.Group: + self.__handCards.remove(pos) + return self.__handCards + + def setMana(self, mana:int): + self.__mana = mana \ No newline at end of file diff --git a/Game Client/Classes/Game/World.py b/Client/Classes/Game/World.py similarity index 76% rename from Game Client/Classes/Game/World.py rename to Client/Classes/Game/World.py index a5fbaae..d5761c1 100644 --- a/Game Client/Classes/Game/World.py +++ b/Client/Classes/Game/World.py @@ -1,18 +1,18 @@ import pygame -from Classes.Engine.Logger import Logger -from Classes.Engine.Components.BoardField import BoardField -from Classes.Engine.Components.Label import Label +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.Engine.InputHandler import InputHandler +from Classes.System.Components.InputHandler import InputHandler from Classes.Game.Player import Player from Classes.Game.Cards.Card import Card +from Classes.System.Utils.Path import PathUtil class World(): __boardFields:list - __player:Player - __enemy:Player + player:Player + enemy:Player __labels:list __cards:pygame.sprite.Group() __PlayerHandCards:pygame.sprite.Group() @@ -20,12 +20,8 @@ class World(): __cardWidth:int = 150 __cardHeight:int = 200 __cardOffset:int = 400 - __logger:Logger - def __init__(self, logger:Logger, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): - self.__logger = logger - - self.__logger.info("initializing world") + def __init__(self, screen:pygame.surface, cardWidth:int=200, cardHeight:int=250, cardOffset:int=400): self.__boardFields = [] self.__labels = [] self.__cards = pygame.sprite.Group() @@ -34,13 +30,13 @@ class World(): self.__cardWidth = cardWidth self.__cardHeight = cardHeight self.__cardOffset = cardOffset - self.__player = None - self.__enemy = None + self.player = None + self.enemy = None self.buildGameWorld() def buildGameWorld(self): # construct elements arround the playerfield - self.__logger.info("building game world") + # Todo add lifepoint label for player and enemy and make them scriptable move to player class # presets the y position later passed down to the vector2 eRow1Height = 85 @@ -52,33 +48,36 @@ class World(): eGravePos = pygame.Vector2((self.__cardOffset + ((self.__cardWidth + 10) * 0)), eRow2Height) eNamePos = pygame.Vector2(15, 45) eHPPos = pygame.Vector2(15, 75) + pGravePos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow1Height) pDeckPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30 ) * 5)), pRow2Height) - 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/0/field.png", "e-deck")) - self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, "Assets/Cards/0/field.png", "e-grave")) - 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.__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")) + 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, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-deck")) + self.__boardFields.append(BoardField("EnemyGraveyard", "Enemy", "Grave", eGravePos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "e-grave")) + self.__boardFields.append(BoardField("PlayerDeck", "Player", "Deck", pDeckPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "P-deck")) + self.__boardFields.append(BoardField("PlayerGraveyard", "Player", "Grave", pGravePos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "p-grave")) # handle field creation for i in range(5): pMonsterPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * i)), pRow1Height) pEffectPos = pygame.Vector2((self.__cardOffset + (((self.__cardWidth + 10) - 30) * i)), pRow2Height) - self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "Monster", pMonsterPos, "Assets/Cards/0/field.png", "pm"+str(id))) - self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "Effect", pEffectPos, "Assets/Cards/0/field.png", "pe"+str(id))) - 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("EnemyMonsterField-"+str(i), "Enemy", "Monster", eMonsterPos, "Assets/Cards/0/field.png", "em"+str(id))) - self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "Effect", eEffectPos, "Assets/Cards/0/field.png", "ee"+str(id))) + + self.__boardFields.append(BoardField("PlayerMonsterField-"+str(i), "Player", "Monster", pMonsterPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "pm"+str(id))) + self.__boardFields.append(BoardField("PlayerEffectField-"+str(i), "Player", "Effect", pEffectPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "pe"+str(id))) + self.__boardFields.append(BoardField("EnemyMonsterField-"+str(i), "Enemy", "Monster", eMonsterPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "em"+str(id))) + self.__boardFields.append(BoardField("EnemySpellTrapField-"+str(i), "Enemy", "Effect", eEffectPos, PathUtil.getAbsolutePathTo("Assets/Cards/0/field.png"), "ee"+str(id))) def getBoardFields(self) -> list: return self.__boardFields @@ -108,13 +107,13 @@ class World(): for label in self.__labels: if label.getName() == "PlayerName": label.setText(player.getName()) - self.__player = player + self.player = player def setEnemy(self, player:Player): for label in self.__labels: if label.getName() == "EnemyName": label.setText(player.getName()) - self.__enemy = player + self.enemy = player def spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> Card: card = Card(pos, asset, inputHandler, owner) diff --git a/Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc b/Client/Classes/Game/__pycache__/BoardField.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72f14ce69bc343978edefc4686690df17989a297 GIT binary patch literal 5037 zcmbtXO>7&-72YM6)JmeLf10FdiH@znlpLdJ>J|yov<>ASIkuWqb`GqP1;Jg(tI{Mp zyGm=8FlfLBw-C@C3PcATcnI7W?xBYsatM$^uRV|k0TT=4)Ke~n3bmJ9+V9Q&h`UsP zMqZL{zIpG>yf<&&yjlKfY-~ip^Yb5lqWx1Agnv-SeIgDxyaMpCpbDy377BJN7Q~Qn zRZv3@1vRXR+aY(*cGyLafu4H3f~1P;LQeXM#A_v2iQ1UcIsB_gb~K?NszM=jThPK9 zM!g9!MX$<%y&K#qCbBuD` zm=;#Y@QdR&j!~W!bpo78ExZ|1ryfd$m^uv{QfGk296SpgcW?rD9Jp@=XrBUi0^A|s zB=DqzQ@~SPd)oB~8fkE6IM?$X+&OS()yzYokWk56@_1?_W&(rGyM+#&NJ2Q6K#WIKSyVw zGsqqZSDhVD~OUlbZ*Lr^4Frx8NWJ$phUjGmWw4GBHZBNcNgIJNfEh@v;__RJX< z3BtCQ*)8|19SMON5x+;qq&at_po)H}hzhVS_|_hGwOivZ>TiSdw9x(Gnyv4!?Av-- zRf&_;4Kuq_+4|e(WmDhER#m8~x@N0qwO>Q5Ys}16^wJ&kVs6HY*6wXlmPd^m(@nJN zb}K82UeQfOVYID`ykoS9jP}k-`11BnwX7O>oGeBOVTF*NQjJnG$_*M;1anqQHbzpZ zTrH~BSgBh12#zSla_vshlD9Ndp?qf)LMvL*DyGJALzZM{CG)XlDcxTm&%|U|4&qynA-i-@9+Qa{+`|$Ki?fce;`DMm%fZmwx>Sm z#6IlCK5V;RD5tagndhmcXQ`!6U+<(YbyJs~r}EEI`A+I`H+A{Z%I@`EGP6JOJh}WV zx!g&<(oMbs=4x-@?0%g9wutWkZn+;Nq=m? zT84UGXzOh`b;6a>{tOtVU0v7f11lxo#TQvALQAE7z#x@_JY9yq1L!he#SnuWwG*k) zmgi2gT7;R3&46)Q?axq(g8NFm@A*yNYs<+Knx>y<64;PsS0x%xzJV7NhdG!J`se4#Bb*q(T=)esWqwPPLtwS!(7fb7R# zN%(PQIf!y0UP*YJH)w{eTThH*>WRbqA@mOEK7c=x5$m7l6$``pXT|Uo44?yNPkfj#TrqR zyH$0kOgN?}zuYO79ZA?QnKiB`#Y&}W7EQfcG4NuUz@*mD`zWhb_FXGt?$pYfeIM{j z#VaJQ(DW+C=#FFjwt1D%YeaZOq`G8DRGk_99cFJ4;m0sf=n9c*MBX8?Mueiu)T&6^;BMrMzTGOZmFV%dHodw%m3V4?H0*J!?x z@WaM)GZ$g>ua_Slc8XAv2&F9BAVSv;&*!h@H|^v27W)7^x?PL{$U#^X#hx(Ss51JGuBTF8=p7C~@2W1Dc5y^#A|> literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/__pycache__/BoardField.cpython-312.pyc b/Client/Classes/Game/__pycache__/BoardField.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..690b53acd5c86ca02a65e930c6d4ea80e03d57f0 GIT binary patch literal 4938 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 YN>WYv*VW%sz|eW{7s~#=Kp`#s1G2eQng9R* literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/__pycache__/Player.cpython-312.pyc b/Client/Classes/Game/__pycache__/Player.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab0480619ecba378371550c030f38b1239fe8eae GIT binary patch literal 2688 zcmcgt&1)M+6rcT)SJtPkSpJG?IZB&~n)DJ14W^~Y)OMk+AQ*>`JU1Cp0y5L2rKV&AfRZ^PACc ziNqj*@12i-WPfUe{DDgE(*w}W1K1;!P^CsziAv@PRqqk1Jy!h{t4dQT>VKiKRPjx| zj08$|UBMj~Syd=mRc{ieF`X*2FfEbVN18+i%<2+FHj?2DeY}x=*#;g4de8{d=m7jo zW~@bM^q#&NrGrdcQ)vwFAdO3$02~8sfISH~9@tZW69G;GPRjkzN2f!er(o`1=LCBX zgHQSmeKO!PL@z)MZxTzVBj7jO%oazz$a2kYGVaAJA6QnEhLrV&m*~%I+KwGk9ea~` z!~NNH+o2_!Q{k!LrOU-SuBr6cfk%Nn0QQjXRS zQ>!}6S}Dz!=OIU{RI4(_EthJx5KKs0+3(2JM$=`hw7zOb)Ilhp+ zuYVgo&Q8D(lf%PU7p91(R%xYQ2^jia7zX8Z7n+14lMfYcz))0q3I?75A;1ZnPb~0!}pkub7 z6z)8@b7W4OF9j%GGVgQ>283K#?w^9x#vnYOM1j3HPt}s=r$b`ZpTkuQSB<)i_*Osc znS7gp=~tcgj|nQRE2VN=3$aZR~m6|#-r~K0iw+XLtYwb1 z&5JGb;{M7L^AcRSlLdNOqb^Q7KL1~p@a$~XZ?hhCkbEcVO#1Vm^7^JMb|fhFr1{-5 zE1qhZQwQ1;^YTj-FBLQRVB=qpWqE^^wOOZIHNQ{Ra*5X30|F=s)O{%|Aqh mPonI{b92@|n2-2%u;Kj?IN8w@MR`gR&-5!w{%-<8`n&*&6!}g7 literal 0 HcmV?d00001 diff --git a/Client/Classes/Game/__pycache__/World.cpython-311.pyc b/Client/Classes/Game/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acaf9b6a687d36d4114db663971fa6fdda94cd87 GIT binary patch literal 11103 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 On)ZDM3lXiw{(k|3p9cv5 literal 0 HcmV?d00001 diff --git a/Client/Classes/System/App.py b/Client/Classes/System/App.py new file mode 100644 index 0000000..a19a257 --- /dev/null +++ b/Client/Classes/System/App.py @@ -0,0 +1,140 @@ +import pygame +from pygame.locals import * + +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.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 +from Classes.System.Utils.Path import PathUtil + +class App: + + __window:Window + __running:bool = True + __FPS = 60 + __clock = pygame.time.Clock() + __myFont:pygame.font + __world:World + __inputHandler: InputHandler + __tcpClient: TCPClient + + def __init__(self, width:int=1920, height:int=1080, title:str="default title"): + pygame.font.init() + self.__myFont = pygame.font.SysFont('Comic Sans MS', 30) + self.__window = Window(width=width, height=height, title=title) + self.__inputHandler = InputHandler() + self.selectedCard = None + + # game word + self.__world = World(self.__window.getScreen()) + + try: + 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 + + self.startGameLoop() + self.onCleanup() + + def startGameLoop(self): + + # create sprite groups + # todo: remove these and let server handle card creation instead + # blocker: server - client communication [WIP] + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(500, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(600, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(700, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(800, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(900, 1050), self.__inputHandler, Player(1000, 0, "test")) + self.__world.spawnCard(PathUtil.getAbsolutePathTo("Assets/Cards/1/"), pygame.Vector2(1000, 1050), self.__inputHandler, Player(1000, 0, "test")) + + while self.__running: + self.__clock.tick(self.__FPS) + + self.__window.getScreen().fill((0,0,0)) + + # render world + self.__window.drawWorld(self.__world) + + # 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()) + self.__window.drawSpriteGroup(self.__world.getHandCards()) + + # event handler + self.handleEvent(pygame.event.get()) + + # emits update to the game + pygame.display.update() + + # handles incoming event queue + def handleEvent(self, events): + # TODO: fix bug that stacks cards when dragging them around + try: + for event in events: + if event.type == pygame.QUIT: + self.onCleanup() + elif self.__inputHandler.getMousePressed()[0]: + for card in self.__world.getCards(): + if card.rect.collidepoint(self.__inputHandler.getMousePos()): + #self.__logger.info(f"dragging card {card}") + self.selectedCard = card + + # failsafe to prevent NoneType errors + if self.selectedCard != None: + #self.__logger.info(f"working with card: {self.selectedCard}") + self.selectedCard.setDragging(True) + elif event.type == pygame.MOUSEBUTTONUP: + print("left mousebutton") + if event.button == 1: + if self.selectedCard != None: + self.selectedCard.setDragging(False) + print(self.selectedCard) + for field in self.__world.getBoardFields(): + print(f"checking field {field} is field mathinc? {field.getRect().collidepoint(self.__inputHandler.getMousePos())}") + if field.getRect().collidepoint(self.__inputHandler.getMousePos()): + print(f"is position valid? {field.getSide() == 'Player' and field.getType() == self.selectedCard.getType()} ") + print(f"side {field.getSide()} fieldtype {field.getType()} card type {self.selectedCard.getType()}") + + if field.getSide() == "Player" and field.getType() == self.selectedCard.getType(): + print(f"found field {field}") + try: + print(f"placing card {self.selectedCard} in field {field}") + # snap card into the correct field + self.selectedCard.rect.center = field.rect.center + self.selectedCard.setDragging(False) + + print(self.selectedCard) + # TODO: adapt this into the new game engine version + PlaceCard(self.__tcpClient, self.selectedCard, self.__world.getPlayer()) # tells te server that the player placed this card + self.selectedCard = None + except Exception as e: + print(f"failed to place card on server due to error: {e}") + + if self.selectedCard != None: + self.selectedCard = None + else: + raise ValueError("selected card in event handler was found empty this should never happen!") + pass + except: + pass + + # sets the running state for the gameloop + def setRunning(self, running:bool): + self.__running = running + + # ensures the gameloop stops running and the pygame instance is stopped properly + def onCleanup(self): + self.__running = False + pygame.quit() \ No newline at end of file diff --git a/Game Client/Classes/Engine/InputHandler.py b/Client/Classes/System/Components/InputHandler.py similarity index 100% rename from Game Client/Classes/Engine/InputHandler.py rename to Client/Classes/System/Components/InputHandler.py diff --git a/Client/Classes/System/Components/Label.py b/Client/Classes/System/Components/Label.py new file mode 100644 index 0000000..ed04c54 --- /dev/null +++ b/Client/Classes/System/Components/Label.py @@ -0,0 +1,47 @@ +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/Game Client/Classes/Engine/Window.py b/Client/Classes/System/Components/Window.py similarity index 100% rename from Game Client/Classes/Engine/Window.py rename to Client/Classes/System/Components/Window.py diff --git a/Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc b/Client/Classes/System/Components/__pycache__/InputHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0402a9a9a6bf0eecc9c39160af9afd11e0a7a2a GIT binary patch literal 3562 zcmcH+TWk|YaPNHQx4BSA!mCjTgy5(OlsZ(ZTBJf~K!$(_P~jR*!M7n!&X4Y0$V2BU zANlYHs%V82KB$xrN{di`Dpl$ypZ%bc9a)WaQl&^OAN+-;l@LGe?4Iw=j%h_3y3Wna z&dkov&g{-^zKTSG2-=&MzQLdR5c-97>?YKRwHOc!NI?pxq6Edf%4PTj&mkTSBE>V0 z6yY9^&;$6amhdRtFp7##Xm=>enZcvE5u$vM#;TI4=`a+kb=JNGVgX^4;1rbLF^r!_ z_kj1HrhrgF050Fe6@lx)-ceo==7n`5d`#va57J&QvC1*a2RYy zMuSSQY1Aeq1S<@i;gi|?q<&%~tEiYXtc^y)1K-*a01HUBod7(}*_}lvW;Tc7#&ry% z``l2}V|w#5*G4kf^i1FxGjt8>a-LvK!^(ZMMn^qAckG?y1q~A|sp%MBPYz&hLeJ%s zXR>NKi{7FKZYq6P0 zgo-3^_cWE-i`lh)G4)dFaoviHWvORL>M2XniWDvRqs*@9C0L&%*@l(TL&K8(2oej2 zhAYsIt55!-lYG#1T4Ty}`|yE$oZ4e;yG~>b=M-{6~550N&mH&ln+*sb7vh~XRWW}C3>RM#+dgJn`;~$(ip`)0-xP0#9;0e~7GKIK& z;VczsRBPbOheM{QPv%t|Fl)5Z5YliJE`war?uJb>kq9X+6-ef zKln9=R-~4qP^I7xFA8s44s|Vsy2_!wmC)WVFWya5LI+n77ijzL)N(Ao6pNQ*rz^43 zKaM`iRANacscva44*VQy|C^DmO(V0F*kwAhwYp{NKaFgjbD|PU{I@x6Z>>2WOIvR$ zw+C(}%TiZG>MHrWnyao;o328v;6ie;TYn+d*OhUa2-X&z8f0@QZme1BcZ^k;1#4^g zF5;A)BZo)}j5B?ZR5_p1))#4dsaa(>r_F9#pKDvv1tzpk0M>Q$$rqz{)a8ytOC5*G z9kEJBtSt3cr2dk>-zw9A3@!U~Ius0eDlzK&!H1JB%T@bfs&omL&tRA1YB8$XzUyX~{+_K!TZ%f{;6qW# z^viM7ZaY1+<8hJrr~U zFg@w4ZVGBz(+NHPq@RMuXO(pW&})Ex+OGiSoZpJLd6nnH{ouK{|EULgUz<-_3_sA6 z>ZPLII#KVcCE6tJp^*jT0!NK_GqoXwbx$MeS?sOKKH*JD{}0fY>eD<|GQS6 sj*#~tYV??D=K!pFIF75L$Q=8vpuSS$->Pts1J|0tQ_B1O1p?;mU(2%IPXGV_ literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Components/__pycache__/InputHandler.cpython-312.pyc b/Client/Classes/System/Components/__pycache__/InputHandler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7761966aff68e87571f9e2bd1ebc0eadc49cb1df GIT binary patch literal 2996 zcmb^zTWk|YaPQ^U+1NlHJc^YDlGH5<6&R3ON>vgF)DTd^Lv>BB#1g)5f~?BU0%He(@Ia)72pl`F*%ji zk49xt!s;sf$!Qtr%Lf6>AiZJ3M9mM42|y;eX3E0rrx`={sL=pp*izYx(IhsQNt`wK zi&z&@D%LbC-b2e|#j|rmZ$!>$Sk)q9I>whG!&sZtl~m-UEG1+toE{p9jDP}RNJ?N? zj|@psSPjBiO~=W|kdjO(GBC7A^O*)yS;GaJowD}Ib+2NsFd#IL)(PMWdhG4Ip1Yb` z@b;CweP!>!oMS+B1IMtbSWm0+DmRf3GTk%{Zh;V@3Zzp_?jqclR(FkF4?r|wYY_o* zGjy%*KWlQd*QC-SU1+|>7qiPup4A%HXcuu|OCy@VE@lmOt!q&QpuV5Ah$950mr3NM&PZarjrh`+3sxLwP=UzOu37g`_7RPR<9zFRHt4 z3Fv<8?YJS%4&R8By}fgeUb9fNFAyS}8R}^5qM&BBsiRHF-Y5;Qtkxz-k!or6QnC^N zDv=7X)=k^b;+U?eyA3X>q%~~V&AO{-Di1=YvDWR8dVGRNoKm#hrq;`=bGE@E%@4pT zl9#Vu{vv)$x+yLAcbELT%l=^5yLZm9*Q%CIb4MYiXohb}Q6*7`!9yubB}9GPSl=`= zjuRKhb;EsuJfuRLyrf#J`S=7kYpe^LH-qwM0w!8pp31?Q3M_EjI5tn4TrSTHqw^nu zoGowrw@0hp4h8#j*0kBT;K)-2XPz#&^7cF%qcim67I3^1C}$3iFbQik>e{<9d^N6} z$UE{}L&go1t4Su3x5Yqe41weY7G;rj(TqW53@U5b$Xljp0bbn!deuGx`Uw~SU~n1p zBDkzIm`*nA<{)J12t3QyjCDtDi?FUoBLUO1(yXxY)WhbeatW)sEo}qGgq3!{BvT< ztHn@d>(1iwMQ_(^-y`q-+XG*RO1=Ak_U`|7S$n{;SdCw{4NB;B?w7HOiKiJ3&O|gs8r*)H9e{)Vo9uzE233T zx5ANBk`iXVsXYYS4!~d%vTm?aLeo_eyXqbSR%e}6mPu_UUAqBb8ZC0`pVAcf$})p& z8>$4WI!tUGw|%y63Bgcf0aop)3GJKhy5+y=UqTeOud#ApZKa3nxZQQvf5%@%fIiq` z4s#!TXpORJj#Y#*)FFC_h?p9l(tuedf|ysYDBZPx*C6?e4X%8Cty2=omQy}+9I)JZ hP<<1)r2d&7ttvxN)Gx^MI~x3xeU0i^LIBMD{stfpX;T0I literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc b/Client/Classes/System/Components/__pycache__/Label.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31d3e3d288869629954f3285dcbea850943ef275 GIT binary patch literal 3676 zcmbsrO-~y~bk-i*i$C}XwqqbAsS-p?(zH!NL_S&-(I!<=(WoSqO08}k??6nbXmpcf!^}m`|0i!A9Wu?Zd$H)OZ0G&ntK`tkT+Q zlWWyi;|a@<5BvPD;RPHiGGgjGYKX~d81y^3)Ch2zf#b+mTUbbKW%5{9ZCmh-hSej0 zd(`#?IvN4oJK<;rZWOr9g6o_IZVb3BwR3U6Th(s$DCj|{R84@?HsA!@vK*~`wFB0V z)ZYnYc7mLCwQGTlM%7~wh2y60i}XE~Gbv{o!}Mh*)8ou+Rs>T~^bBWAGs8A*ut$a& zvZ<-Oey}u_*9?;i=xo>0lk8;_d}jJ)?q>~VQskKanpi5tc~K12vvbV!W%9W^&p2*{ zlNe$z{Pwp*N*I9JV*)tVSap)i=HRSK1z&yY6^Mee#Q5Km9PI_-x`~sfwjP`dUe#0Z zuYv9jM?c&J3dtHE!NFIZq_$UaUW4C;!$^Ua#{u}rkDCeZpAh89Ena9I%-W14Fj zS7s5!MOC7&pApC;+$zQhS(k>Bk_gVa#E%10$L%NhNq}Ym0(%F#$XvwoPK`{!+CGM5 zo>W`fmwqhCoxBIgH`mJX^#Q#ogeL(sYQ;=*X+^RN_ntxU7P`PV%*{i({9w}UygnCp z3hFkL6SfTkV0kuj*liu=A2V$5WW+-z%t&KAU<0P6`l3E_aj(O0_bX1KU z?7(mC{06@v*$bQW%K++I&Z#Y0j`vsM*gis4IlL<;cI3ozbfshUv$EV*k^4&a*Yc+m zTM&h~@FzwO@&%hdVAgP~9MYkZCJ;1_I3SmKUaxZ6y~XpO%j7F`qn`}-HC{n ziwoQa#Lt0T{S*K& zK@KlPcID0;xpVpA%9SGBY%0qaD)NPr{S~eq1|Ol#9N$f-ZZXC15y5{-ied&8Wiqc$ z=MWDo%ERe&&RVgu2Q$rVQIxc%<&CtF&1<@%SWjp`pXOuf3^TpD!Og(e@Pg*~dF$o% zjpg!bgX2|sAAOW&0!EO(V@S2ff;e{=rkPd9PXxe`slw@ee&P}|bggCq6g z>?3=$$=9_<04xuQsp#Kq7RdI9n0_DoLla2p+wZOUfkg|#1>zFOXx}3+H3B~_#a9mT z#a>wKT=uVkQa~DkIQg$aFXQ&h%Na2h#Wss27#8q*d}sCufaOaoR|QhME2iy}Vrm4k zq+V0;usykE)JtR(!H-vAy~qy7niJ+CB5 YRT7yOpFMh30`Z5zU&#CWH48$+KQ)%uKL7v# literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Components/__pycache__/Label.cpython-312.pyc b/Client/Classes/System/Components/__pycache__/Label.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ff947a38c7c8bde120428eba3d8ccee49291369 GIT binary patch literal 3603 zcmbsrOKcNY@U6YJ*WV<>Hi-jK+7yC;Mx~?(2yGRmB~__X)IcR%i>>i)f*ofa-fkKk zjD*y*ilw47rzDpKPB_XTIp)}&dZ<(pSt!<)TTk3VeW=8xoq4-n8)GU_UX{_rPRa}e?;64k|_dk9r!J#t{~v8(g7(1R^Uy%6o#AHV8_*5zh#qC+7FWZUS>Po z(*e5MrOtU03+5uxgSz9h#5Fmi^Hff1x+67}n2_~=$Tme$O;TA_bYGR$yBhLlch;lT}qvR+u^_RJ1aiTVx`Tp zwKf1rL-98*iOV~xC7vfD>SF7)HGw_G%9EzHxU2lyH*c40dFO^{16X6(3p!W}*JKe( zS6i=cd&9)z(Ac+K@F(1M=Xua&MNP9TOSje?G*P&zNs%`z?w3e5De1hBcW;=31}yPb zZ_V3)vW7t34wU6ljzsOFx?_l@5}7AxaWtSir*jifCKMIuuCbhY9tw$KV00&y6-lNP z>p>SLWKF~(r5I$L{{rikyQyw43W}pC>Ve9VGvgGmrRXOcWgogk;O}}XU?j_jHba%9Rco+`IP292Aj<^m2fmGKjI48` zQI4f&oudbVuj0WT`UXJV1*yFRlV#3t#K$D}1FwRWbcd8%+81vXZaowtv==u1j|KEF z90VIM-LwxtqXk%Zbrv9rKG7(G*SZy4#+rTMRwp=mF{{q`EVqGT!KryYSD1S!biUsG z;590I;eL$!DAaPD*GTrDtmU=tQsh}2+DUVS0hbVLIhOWM0C`#3)Ac9t6s$Z4!`W6h z4y}<6!@)L6Lm(5ivuQv(0B6k)8yFUP0s(ffikhKk&H7QFuOE}_MZp6Apnjffmx%THBXq0;*E&}_?|uA8IBEpZ$|RgeoCOiH1@*x}AOJI#=@5Mz$f(V* z7N@g{r>Yh@!KAw8FsP#_g+auW!ZfSquYMv~`IA8Il}eMO@od9_{NVf3u&Vj3Wrt@k zkj`Jrq%>Bv#IN29hU_!R4o+3P7yhQ59usAveE82ptbin>P>r?S#a263M#-k3>b431Ge*tdF% zC?*sot0lBlR#8RKcwk-X3>{A-W!iP9ZprU=YB%F*I4ZQH(1CSQF|$0KOw-cgtc|p{v9P%bwQ74?EMWS@fUnU&-o?4K#J ztus%ZHpj7*Q)`2(gL?$f;$`;P?yVrTCvc8VP~N@TjmkPJpkRQdlSKp?fVDLX(Rqwh nF9LiRp9$xTTz)`DfW#tKv7h$r9LN1Z{D1SuxPiY20CwhIFMp6h literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc b/Client/Classes/System/Components/__pycache__/Window.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1867184feb2f90acf6a4b439ca9cb808da86ecff GIT binary patch literal 3667 zcmbtW-)mD>96vWXH@U4zs;z0FwzYQB87sAHqC+}mi(2tVWL9xxahELjw5HxB*}1n9 zU4=4aWFz3%2KK>+Jc!fzus!U-4PpO6QUVPZ1VMZ#j8W;HeA@SWZtiUof4q2d^F806 z=hydhe*6*)b`mI`9lpb!`UrW7f>UUNSvwBQEus-k(n%6)k1n0V+N*nJy-BZxJk{x} zoRlTvArnNCZxGFQ*F(qy_}eAv)1*lf^RJ+oh)I^T8%XEJ`83y#WtpylBwxsLUCT5g zMCES?YySdsi!hRuG?Mh3htVXxj51mCjDtn?IgS}S^vk36Lz(=(Rtko9FcOje8@>f;{y@XgH z)s|HCN>(#3t$Ye=YjwHGODsEm$$ZgWxN2U?=LV$YRk+p9n%*(tqPgK;4GVcKi^bN@il8Xb=$tW0S z+!pVG^q}ESh(t_4qf=&NhbuQ}9UUR_WX2VMcl(|4+y(xDE5j(idK`1Xii62azHyAfkhRN7h zsUys|Y~~B8GdUgLs-BBaq$Z#(HLhn_&P>Jiv|%tKHF*`>XH)U~Y$2ZmgORc~#ApGA zuBtc}RlU~LP&x{nit!VW1yYan6=^9@j}AZ;Y)H?PP-(+=!BVgod=?$J9a@g=U5f7g zee)lE56wr{D`Tgt(L^np5D`kC6kJxeE-70V4_B3unle&RMjk^0p=D)gNf|2dyE9%@ z#%jt~MHzb*>Hqob<;bq3$gXN+cP+A8^u4XWNNY;8BEB^k7Rk5>1p#@nuMp~Z>Q0jT zQsO=kz5_G{+6Va%P|J6g9NdNq{Ei5&eo(8W=g)=pC_g0nZ_K!5syTa}8nUE_g9e47|lS5Vy`a5KS%P=zwmI zi=*$_#>PUp8l1Y(7>S+pB4qh3MuKfQBN32pUy*ZozBaFjP`nFad=C;Fk>%seoa4Dy z=N64<66 z#lSuwFbgGkv-A7TANKwHVO7~tQ+8CGuQ9JH;swzRcianNUIVaqUO%tallBO?cx zY-(ryJTGHwFBMo9>L}+uW%tfI8@onnOmKEv>tZz<5Xc<%Padq;mu{F!L-2vR&+4{W-5;`^&s(5$K>Bt9E^~<@mZd=4bYI(Cc6JB0wI+x3vX}nDhRc*SHy@tuf zN?ZQPIX;!nFg}3&Y)A4Ak{FT^B)B8^7!b>EG<@Gj$!Cb&WXWPb@dN0FNaP)pe)eYir0t8};? z>?wU-q1)iA(rtB2NiEP{q4-s4|0)g01FHnc;-skV+110iklM+BM-HwMmnf3lk8x17 z6Q3k+Uo=p=y`6yR4N?7z`)?m=Z%y<7y$zL*-8o&`c>wK0?L?vSmPNKopn5G4fDx-3 z^V?Ys+HbB=csiwZ!-_OsHKX{_8C~CPoI*CN?iQ=qA9f-|(pnSwLK(MlcZi>XSjZzW u3P1q8l2j+b1@WtsZ58KxLPjgCU!Cl%w0^5}uLRS3nLJ0`f3GlzDgO@}*bS@z literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Components/__pycache__/Window.cpython-312.pyc b/Client/Classes/System/Components/__pycache__/Window.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ffb5fcfd857019970c05e32bfe454cd19349bd0 GIT binary patch literal 3426 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%0D+pV(N+E!!tQ+U~Yb4(`Z9wmg)VhhE5s z*6GG{?w;KjdbViy4gMlOr@yCvOYdBrwy#d_-jC*I;`zC>J(I~lT(D;r^Gjcq2)V?M z@~;V5=EitH*Z7+*nm}}mzlYs@eg=iNcoos-{G5vth~{|%JClEe!g>A+L|Oilz|gSp zlE8oLXNa%^q>LZ{3U)yETZ~p*v%~8P8}Z!icj;$K+lxOwe(wFlYhRk!oxEpH&g`mM zp6dBz#-+<4H3f9Lp}Mx#zkG@49n3p(<0H2QEs)m;s{PZ;gsVBq;Suwol$f&4&N z7k<05`pgd9oD^-xTE1f!8UhNr-66+ z$~Tt~Ug1LS*A{|LImYUV`yrpI*toZw&`3H7H#(?qW~lx~$P#oqE5KorD?w(vUE`kDYKIYFrU?VxMNR(Cf z`>V!$oF@%Wk$jqOe2V0qeB)CjXY-9uk(|mmK6`CSVlM}0X)k$+ve)}4SX%!9*J$7` literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc b/Client/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a62a2d3df813e48052d4c2d74211ea1290e03f73 GIT binary patch literal 2343 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 W&3r}-a~zCkbNQUbzt|#`4fbEy(@}f? literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc b/Client/Classes/System/Network/__pycache__/TCPClient.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..62eed0f0a8dbb34f322082533ab301f828e2838f GIT binary patch literal 3475 zcmb7H-ESMm5#RgbmyY@}tq)sHL^Xbpp8J}O7PYWCGyDb zo#j}d1hvhBniz-+q_BacfF2xIsRdLodAIxr6r^#0i30=#$Wz`}s1HV-GPB1!l9COy zdwa99AG0@{{mty~AJJ%pKzVrl8~SR1kRP$*6}isrrGU9ZbfOD6GViv+yukb7ya=tB zlk)PsEa04!Q}TiN0O#dgFdv!^2}C59iLQJ`^uT?QkO%O(Wj?G6b0iV`3A?ii!Rbg& z{bqWJ8rHAUhMuDghLqnHSWX8fCjIMdJy=K9{P-c7Gax5Ymyb;|R$zmff??2%l{Kyn0ulzzLS~U#!49&>UW=^pFJtsWL*DLhtHJ8#WCQD1tjzO-@a-pr=8b+a5l zTT#btb-c{$)7_4~8WF-{4YI3tmAlVu9|r=pqK?|?X!$^W3Z*82AhsbAj(*wpdD~y2 zx1#I(F%gM7Bd<*MlSloL$&1pXc=zPE^k`fG-U;TZX{N8yjE`qn?R$R}I(J;}0M0EN zzOQ>D*jm2NHv4)>X!XYp-`|^MTQS@!;UXIR$@f)){&Z|bw4#kYz@NnD`jfZ{aeWRw z3%G_yp_lZzUSd*1_gq9zTWN5RAnStdoghx7b2&#|FcHi8^?cEE0@TP9bjo6|gdGNw zkXSGB=;93RZK9h1j9EXlhf@81gd;h-M)cN4_!6M(huhAhXLWZ@y#i!PO<=VDD-mFidn zu7R~%e@n=-$t(f*FCTF+$7qITm-eBq%|)FIlS}Lc_@JZY3TYh>r&EqN)XY&o;RyxL zEleJG-5A<{qs-yx$OvXfb!Bx8doDWB4Kc{N@C>@T(B-ZMLhD0=u+ZEBf*=irdun1Z z+EeX4`qk=_-V={|Pi($X={;rlp1Lhp5B1iF*!6p1H~uQ1SO3@IKNr8tZ{;iT^LG6F z?JE#c?byptVk3`ZBirX6#_Wj?%E{l^$&V{B&5mj1nD+GP?x6wLBihp-yPb#2J)_&F zfk3Tvj@g}K<<7Bc=i%Fm_i!jHAcpZT3QF>b_veY%CQg!_laa|o(#~l2WV`gJT>-uY z(0K6p?iGRDAyyOE7ks|?vftVl&{hOpED4$qppx*v0JwflOPD1F;7qPjE16K>mi>g$ zG)5vPkmM{&fL?I;X`09AW5QZ1A-ac)ce1<6#MoUwOx6SZa%bZp-D~%C7&XrTStGl# zV|Hu^uBFFQW(sD%3A9xHow4+J5lZNvN1z$;gC zBAS*j=+|?|tD5$Q>*-v5MlvnN5MT_Ql3|zwAZ9ZbJC1$)MO?}62s@2DMo5Of$q6PS z<_eHC|EY=XO3&T78i8h0;?4FM-aIVvWxss&n`jKz6OG~KRNu{#y1kW{rVR7cpBu(`#ha*aF;&PH3kD?V z=5X`>0@r}tG-LRA-&{Y3&b!9Hz|O%0BGvo?2xI|*P$g|^{Hc=Y8h@&!v+UI$$i;GN et&*W~Ypu2}fb})`WdRIzko*V7{`-sxuIw*-#0*3L literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc b/Client/Classes/System/Network/__pycache__/TCPClient.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1471f32dfc9f4ff3e3e84e1774937e3cafc00bf7 GIT binary patch literal 3142 zcmb7GO>7%Q6rTOFz47L^uJhMGz%5{YA`;PthCoQ&Py)r!#t3RftSs-e*s<4UcAJvO zjVkD&m5N%#Aw`IvN|l-@NX>yG5~P*5aEX;v4%=`-9JpCcC8~1a&Fqies^Vv)o%i0n zw=-|v`{vF3+}PNFpglJ76@J`@&~H?5o9HlG31H@thBPjRk~Za%9FzGZ50uXdc`+$+ zR43%5yf5ivyqNRn1IYk~cys`1(rKjmmUw&Cq&&k#{eMs)9_6g&MC`4xX{?*CrgSZb z2@FZ^6i7}3Mj6+O$6ZC*{@v~aj<7Wh%sj$~dIcVFSkQR*1T1PImW~EsZ87Q7eAs`K z*ZjZ-w7_YUlrO+YuA=OixRKr?{UjjXCpm$<`km&6*Y^JX!d zU7HfhDlT86bsl=_l?0eUc5O-`NZx8P?Bzl8WZPZ)8U@Rm;BheOqRbmZ=%^Pfj;_#C zr*haOhjM5JMUdIyTI@umM^aOVTeJC73C%7md zpY0hVq(FMp1zpE!Gov5t1yuAJh4d6QhkB#UgvP}ZGP+4EZ$9cne&?`3Q{2ni-9xdV$+rzmjL8WT%gB6eW% zKq`+_8|#y?T*@#o7|*~u`N=po0q|3k-eKq~&R79e&FC3ZRcG63oIJRxw62EwmmgW)w%WG4qUzWI5EoG(ve-d^1wYwzWm&kp-V#x$JQcyDv=kd!~RBj^Wtv{zUOG>vu(E8P#|;QYhxv9+fQ#(f~gi zX8575SjzkCvS;_c!AhZB)oS1p8MrKwLeo<0e>Ig#HrBuoiZuspe%lv3+gih$Gt>)) z#%buFN;S1rd4FSgqrH26?$fzS`;+DNCl{VuYk&5F_{+BT&B)^nfZElm#i^zIT4eab zK`3mM(5`Z5S0yx14h<|1{}`%_9xjg_UQN7PNxWB1ytf`wt3lMf?apllg?erwzA?Pn zvVFB;W%4gqCiI*V1UNszV>Y$Vj<6*>R4E$_MEk*Vf_Y{m8Pe6AHZH9U( zp`GQ>PPiWqE*@MD?L8xJbU%DXUJrC^1X|BGpKZPo=-dKZcsmB^^`z4qO|=?SHDAz< z=P0kJ>IcVDIY%QHCLuIBgw|w2D-fV6lQzjCRHmC?ek~%>PkCCr2z{Kfj@D;mFLbA& zU^PkMixX7@WI;w1KKl;tbMD~2`uDK?fM|0q=?&h;-p6cH)?=>1nIcxm7YjPPWsSc2$Fse8wyi str: + return os.path.abspath("Client/" + notAbsolutPath) \ No newline at end of file diff --git a/Game Client/Classes/Engine/Utils/StringUtils.py b/Client/Classes/System/Utils/StringUtils.py similarity index 100% rename from Game Client/Classes/Engine/Utils/StringUtils.py rename to Client/Classes/System/Utils/StringUtils.py diff --git a/Client/Classes/System/Utils/__pycache__/Path.cpython-311.pyc b/Client/Classes/System/Utils/__pycache__/Path.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36eabe238a3018a3f5b23ceebe0de8b97c093934 GIT binary patch literal 747 zcmZutK~EDw6n-9q*3=Ux-`j0BO<*STzBliC?|bv+tW+8YT;FHDs!xc&=`vVu z-|0O<=NKeN7C-|ytbpYEAe~bVaDgXV4JO$usJMUVTHowPQ^=KO@p=pjFc%tJGUZ6F zoY$^&_T7dnU92y}#Z}+FS+~s~z8gk%al=GG+fpnZ(aN@UxXFgZN!!8Gdy#6}A?j_O zcapzyh{kz7LI(qTeiwDohu!&QQ(6>*ZS2 zTQ^D@&se2CcuUH>vr)@?83xTziM85_mx&?x#wg=0hg-;aG^6oovbol7Jh`O?!zzlc zMVVk5UKXo8q@hkfDn#gSD zA+{sg4#=Mn;(gl>`ix_&))QFp1#}5P-yuW4n;LS=6Exj?C!7`L&!-YV_?AKH-)1sN z5~*-q9Ej?BO9)`w3&+bSER6%_nfv{H55xTZpv7e+`bT AfdBvi literal 0 HcmV?d00001 diff --git a/Client/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc b/Client/Classes/System/Utils/__pycache__/StringUtils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4052b1a4c16bbf923e3a13bdea86858748cdf313 GIT binary patch literal 1233 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 McnS)ERzKN)0Rt<8 literal 0 HcmV?d00001 diff --git a/Client/Classes/System/__pycache__/InputHandler.cpython-311.pyc b/Client/Classes/System/__pycache__/InputHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6739cf537d6d16054ed8a9ae54e550f19b409ab9 GIT binary patch literal 3476 zcmbssOK2NMbau6?k0nQeNOmHpisJeckzgE0Nuh+$)=unHjveZJs8G5%-f?1kExEgL z{6Q+FgjRXX{8XFr3v~!6$`kR-KUl6gIusL|~4h)uwOk_?W8SHt5o8~h-hhvZ8nHDkv zM|jdtWZ^E6#fLm0PvEm!MwGb`lJq`DbSTN0;`O|$$S`PlFF&fv7bd78k8Luu&M|xe z&}BkNhLcH#m$|znYeo2qA)AKtX~#s04NRPg6su6DEq*?-wa*M z&CC`CMsu=4)jE6Vst3Lo=a{{Mtq}T2&PG<91=%y$KZNgzGciIQb3;jw>77})H9AdA z&lFuSgSTiwno+5yQTZ`>fy^%ld*9Ap)u^gvwF0GgvVByWD&%Lf!#QOlN2M#h{n>s{ zAoVH}G*`&>Dx)B+Wk(i(eLA~!Azd>IW&>EbY#CT=t|PhxKbX~;04$Mb;pn}^YPh`; zZr8(|M!0j$->EhN$@HqUFstV3f`gmEg7Xvt09nA5@Z+`yY1Ii5@H(wNGzEK8fj)`) zSUY47h?d-wMn}7=QRQX6ME0arwB2*H?$J*;V^(uDf}fr}`so}2SL+`A#B^cJ)yU$x zw|x)n)VfDMS@lA#b$)svKbvh^gcM1U8|NQFmOgPZ6-t6Iq~e)={tvY0NJxfM+#fZJ z0DUz*X=&8-rlrC27p@>8o4&O4!NvXohRvBmTDp1}2^wx z4U~+c)&G#(X>-a*W&WQ{+gr=#ui?mjd8O}uRu8ut;np>OE2~js&JIF&oZ55~kY!TX zLURlE)(S9*8^PMDQ-kao?CWdR_KZ>SR3rr}HGJ3TSRt?WnBsJPR->kmmHE5|_nM$l zWn4pNHn$wFfJ?}AIj=1q+`i*B@1!{^aZNuas)MrxNec<0&Ja(!-~X@aZ-G zX{%U^b9jx8IV%D|CmseEUxvJ2g~^?*ew8J@$h*-ha=W?c7K4P8JRs*p5#-SNj#h7r z$qB&gRMxEm^}K!L#%Cq5D6V?9^4Q~gUf2JUcb5{5=Oy3n)?D)MZjGft(OdM4@$>u? z%SRP){~|a(#hh1TIe0nU%NKn`p^nQ}3~b@@F|JRG;uvs`kb9rY0Idx4sqLW24i7c^$EFf+vFC^M#war7@!lkZWqjbfVz(?C{ln!4kjDaHqfAUpqc>7Uuh<!f*m052MAW{w#RS;%c>P{VqhaGF){&?lDT1Nl2tU5vdl{~0X-(%Mmo z8kD@q!D^(f5^2*T9Y&<19H{L-^dPuGtMTqiyjzd=7;r51_mo9v{$wS7Qjec9;-~ce zr^@1bG**o!E77DLJ#IvgZxCPL4F<~RYfUZ7%9qL)xd%C;siWM#1CJf4#!ggXC-hjC z5$h_aYb}XtOIM|(OK<5mTDr@F>*1!AcBpcVpc23z&Ss7Das&88kjfN7-SK~VARs%H@3wZpWt&9g2+p#Z$se3W8j?) z{QJZ=F)Yw+2MJC*vvTdLkC6M!b^vmbRVEjC^gc>PUJESG(3hmws>9LE$8p#2%}J=p zS{M88g00GoZKt_s!CEmY+P31C{iz}WYr^sX literal 0 HcmV?d00001 diff --git a/Client/Classes/System/__pycache__/InputHandler.cpython-312.pyc b/Client/Classes/System/__pycache__/InputHandler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e4c10994ee5b541912be060c28fed5e5926743d5 GIT binary patch literal 3083 zcmbUjOKcNY@a=lnpV+|>*hz4xanm@#DvCldP*o{Xn?RD9eAMt!EyF6!K0}iAr@J<> zEgNyj!AMAj_K+Y|f=ZPN;#yTb_6TaF#xbpgxH7Tv77$BBBqAe`ApTj2iLgPILE0c0B3zJT z2up^E$So3)zsu?~gM6Ct86P7v?qgK`OiY$UAe!EbP0Ql(St^M$x~7h+3yuT7L?{U| zA_=l0vq*vlk)>Ri6%C7AkO$g0x1)BdPJ^5Sxmo0?1$3IioM;5znl|~&s%l}{w&67{hvm%2zLl}iIwa2=0F##pE}s3ono-c8La zncekeRuy3yC_e$ZOxAWe@|=dA8HugEWbG_iJB!w?FHe6J{35t&?fd#f$sZ{A14aMX z58)pp_am$R(Aq9%e(0gK?Pc20`_WbZS+xEt+Vl74SN*|PwO#Q9Z2xX|Toadvu7!&B z&J}Z~)+lDm!GKK?Qf&|-Fwi-xvPPY=rr4{kL9?QvInyRxp(?FpGXZ3506tESwCOaR zNyOxSm5;=d3RO*7r;RCa#c&Fh!V0=mjv#j7G1QujDVg^A09GV>V1nWXq&Lb-S1x@X zzA4?1O78xGyT9o67wv~u%!l-j$uHo2HdA{?RL|oZSbB+M$z1hBz-SpNyUMXyw$V9d znHSwL87m<<1I%pDRADBTKpj-p(`Is@0~YF`qBBI!X2Cw6<>&BLsDp}DBd>GDm&|G4 zZ_f1Mz2?j>-cinyHD(PnY>J(CVfh1R&VbMJ5EF&D8jivf!pGP?@ya44H%jBXsusg@n2T*v06ciytrvU|yT-MUOm?!JP%uLv36 z(x2yRh7T0n2a4{4g_eVP{*lvFa{3BRU(xyIQ)05bmOr-E+OZ^Emp+S@TDuFa-TC2v z54iT0T>A^I{Y6)AKCsr|DRuM~I(my8efblQ?5)e*2lgYkdTs{_okxDQANh9pyX1ob zdT(LnLt2=i#R0n3w&zpZ69aiC%&a%Vn(I4Bi$kl$ai2{!3qlm1O@i7a2$7hWl#sRw z!pF&JNtfui1Qxlx7ZDbV{5m3xwv3Mk8B16`j0l^#W?egD{hGlf#!o?wMe>wm_1-VFl3bq~WIUOs*E+>LV^1W1%QZh6;1=D7X-GyLf$(TLBe_c3SriPt;v(HwL% zrB{0>YwoD7df8^K>8_%oI#-{Y2lV|Pl?OnIEl6nxv~FM+<`>fZ2kH5h9Qcdd$2gu6 IK$=JY0QSsnFaQ7m literal 0 HcmV?d00001 diff --git a/Client/Classes/System/__pycache__/Window.cpython-311.pyc b/Client/Classes/System/__pycache__/Window.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a9adcb8ea3d49e8acdb762e4f9c609ea1bc8588 GIT binary patch literal 3318 zcmbtXO>7fK6rQzr?TxXWkl^5w7)%O51{$EM+6tu{YLXxo94QW>vP`$eJ4qZiwmZ8a zN))6VaEGAt6;gaH&$ICr*8D*1P@*&;yh4 zoA=(lnR)x(H$VA45bzNw8<7S2okYl=DA+};GkaHnxkpr@3K~ga>(YctY~7k`&Yf}# z$cvgdC#58TxX2h$rB$MOHeG~l!Otowk18Zd%=;Y0L`*P+(?EP57cxv8%~4GSNxD&B znwqVT;ElH~?EMYQJwi!JP)W*l9lS}osYoT&H4HtfJLTb$$R#P|r84w+P@)~P{3~%L z(0S{+11Mve^;<3PmHGIv+CfFt2fqVUp7N;vRVfuv1FIwz#GWaa8eA1qooE4kC-7a| z(xr9*e^5OLYj)eSf<-rId(>I1f&h$;pCh%L1ED%`vf4o;Z zY;%<)$s-{V^D$I0#25qIUlN7#Vl;j+eO;$aPwNJychZ-se%mM% z)8ly!0H939$I@f4yb{-PG;gHiT1MBYo=z@;`CQt<)ld<9>Ha zklNw?lDOutg^xlLs7rr^kKPaNgwJh<&;4}h=l;jWle^{f*Z#Ou9sj%%&Q!x0w0$ZE z*Md88-?rRWkt0<(QkEmnPR1Ujzw)dFtMWjZ*F9K;WSwk-fILSVrW((pBw@Id9zn2K zA22#vL|H#j(=$QyDrHN7`WIN@5wt=)fd8_;B(kHxXPv}?fIMFWXKshIvt&%*sg1e# zx;!B|j*Qk<$GqOa{pm!|Rz$#R55eF>u;efK-@p$V3DoXhrv1G7CMlX&hlM}#ZhhGFa^5=@5aVbqvs`Il!Nkq=2}IuYs^ zfP^46*>NDvFzA@3Mv@OuAll-k0IBHgS-V@7`z;rwX;zpow!i`*!C`R`7=*5CtIHHsmRaB)+W~tAtXfjni6+S+%NcYG-C63bC$LR_8V4fe z5z>LLeP8;%dGFhgD)RBFe7tPe`gbkxo3$D4xEJ_${SM5lzpM2$yi9Ihz3VcX=4qUb z8#vp(0&x*-<+AJL=X~oLV1?U!Uum`4gw?j36$P?(tr2Cf8H7|fo)$X8%a)x3Vv3Ar z4eOkh!6;tP3e5BZHv#&X+uGF^&{CShXNit$z!7VmEghHw{z`E`^(V@_?z$Vpc{&r|Cth6)AqS?TrmM=W8;l3c^d{%oR3=MJ(a6EwCB^Y^!0;Sn14vFF zIfWz!#PsTxIXjDzN9PDOC5~Zs9?kHUXCESoBEenHoFJo5z}{JD`m1$^R>n&4 zvKWF|5ks|}-jyq*WLfNmS`m9|-Gf&DU|Afjh=a92&)R2Yu@7oR?5knCtNut?#99#} zyP_<;yGwwqCwcSGY97bA)K0>J6oA~>#3M)%90yH1fv#igI%X#CbJ zYzBR(v4fZh!^}{-0pAH$R(S@aVAaU#3whYW;U$LuL*Rj^F988O3qp+qR`_3y^p)-U ej9e(U)*3lgZmqjwOu$clIsJ$0|9wR-_w7FwRLYwG literal 0 HcmV?d00001 diff --git a/Client/Classes/System/__pycache__/Window.cpython-312.pyc b/Client/Classes/System/__pycache__/Window.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f345dc886b58d5002e3e0b867c60a3501fe1295b GIT binary patch literal 3104 zcmbVO-ER{|5Z^oB*%xCwA;G~V379l|9HjxOs#FMgz=Tji5($H-EW=@Zo5bc~yL%TR zM~TEkDkTyq?NdTuC{KVQ)bdnNEAa=km55T5=t`wZZ6A0Gq*5iGIlcnFn;!p(63}d{y@PSlFO`|0A_~hL>CN_!dWzghoXR-&k%=vDIe!0 zLmHA(vOq-AO>}vJ=>9p;*(2pI3u@pc3cade3;TcsPZTpuKb50~4w8Ja$P7K}m^(D! z3M+dBJfD)3pp%q%0pdvcs6=I5JPIbdFXiWw#3eZupbD({QKEJEE$%Kg6RZZ@)#e(t z%jRS2b>N}!-D7$kmGmI|Hc_SDuZJe&R9FvBkW>U$`b9l5A*Jfk0{D918@Q#YHvqp` z-wY9TtluAO8)3akZ-Vu`>(}%9*6YA$3-~naQMwiQX5eGxt?E0r|6;D77e`*keT3K% z&5<;1B&S=0FF%Ef*!30VAk7U7T5lRlWoxilh!13jXq*-Xas^uBY2_?~);O72MronO zAZrw}*KC=eVEdgtZJE1eJrv;ukcXhi$`M}CF=32osOMu$1PS!6&qNZw;>X3$pltg8FPn*Bpny~lYdhKM{&{$E6!J>Tj)=duEUC~C9f>T6=y z;Er0Iw^Nxs5PH=hLj}W|voH|bUn*nu?0}v#OGc(_D<-wHp`uRh;He8|&n6S+y1IH< z1Z|~UA!pf}&>)*BS-E0Cm2AnRMn7x74KaGw2*kuV<1pSN5=YV(Ov=o3(xUWw`Xn{4 zS;bQNe4;zv)6lGS|7DOww{hZ8Gm-L=cnt7eOKoD zt}Mhd=mG%`lg=8y0LkR|lCEj+1lnKM8 z@c{D7T7WUpHqKgs+WvF2pi?#)cH?)%ZDfpfBykCqqxYw^} z;%Mx~fQ7pie(NkCn!Ok}2G?fcJhr3SEO5oU;Kp_#!SvgHMy+91SXF1NBQFEi3(Bxz zi%2@vhjJh$*-jv}0H_N)jrX-Dr#b0}4^!G(A2w{!D3g!jT79ak#V!6c`DQ z<_Itdiu_tkf_~$MHRoCi9#&P+mUNaG;W2y3dmsE)6|f#nk|mb2Xg7v4+U%BbjUFEx z6H||H4o?TCf?s?%bL`7w&y}6-ZASQGT?=t+jQln~0P|nB@mks zsd=e!x1-y=6mFWnJau_NYFYB~*ESz&TaembNs9czY;u{vbl;gCCst5;9TVj6vR{zf zW|J!fCggX_n#k{1t8bhA=+5!m#~nLGklVjLb+6}c&tk{n`HsV=ZC_SIxlfp-e-oUY z+hF`^z)4@&dAmCyYZ=3|x492!XW!L4K+5c_;*d$;W=Gc=a6CCl;|Yp`RW)gEl%r0W nkF(RTfX&0i+ARA7LHLz~Uyzo+$f4iJo_{1&=o4NOq}=^q+2D8t literal 0 HcmV?d00001 diff --git a/Client/Classes/System/__pycache__/World.cpython-311.pyc b/Client/Classes/System/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65cde385dc53a0d2865d6deef9810b25a09215d4 GIT binary patch literal 880 zcmZ`%zi-n(6nI`@0wfz(uGYwK*UaVL1FrP6^;qw`|>_pK&E-enn2bh?a+L;Jy9iyMX6f$>Fq=W&IL*GT1p09<& z3Y!Z!haxM~-`#${OQHIIAuCRGQGgBHvK}>JG=S-Q=I&(o-c{EzMk<@;3!5=^3e~Au T3#Z7i(Pj8eu|NMfFdhB^6?D4! literal 0 HcmV?d00001 diff --git a/Client/Classes/System/__pycache__/World.cpython-312.pyc b/Client/Classes/System/__pycache__/World.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5851d52f0980325e79b5057193d513f59243661 GIT binary patch literal 774 zcmY*Xzi-n(6no54L>WXH}DrTnpQBR!{ zMZ3;LZ6hI3Lq^Hx&m4wl7qJdXR^9^xly7x?OH*17r2R=eNVJO{3{)skLs+js(|{S5 zI(l|gE#@cgQN|SnoZZ`eU3*!3v$qW11|J(gyqkIh16{vD(#NzRkyUZg6FG~C*MvBj zMR5_)bitWBP4_V|tLzri^(J~hL*6K#K$HF)XbI*T!U9e>b8Z~F%-MQ(=R@m#>n|WJ uYA7AmTrR70gBZ<~w>$N=i*Z`|D*9-ZhW?ggn=$qa>i@XQwoU*culWzF@t(W@ literal 0 HcmV?d00001 diff --git a/Client/main.py b/Client/main.py new file mode 100644 index 0000000..d243f0c --- /dev/null +++ b/Client/main.py @@ -0,0 +1,7 @@ +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/Game Client/App.py b/New_Client/App.py similarity index 78% rename from Game Client/App.py rename to New_Client/App.py index 31aeebe..6b0b928 100644 --- a/Game Client/App.py +++ b/New_Client/App.py @@ -6,6 +6,7 @@ from Classes.Engine.TCPClient import TCPClient from Classes.Engine.Window import Window from Classes.Game.World import World +from Classes.Game.NetworkEvents.Login import Login class App: @@ -29,9 +30,18 @@ class App: pygame.font.init() self.__myFont = pygame.font.SysFont('Comic Sans MS', 30) self.__window = Window(width=width, height=height, title=title) + self.__world = World(self.logger, self.__window.getScreen()) self.__inputHandler = InputHandler() - self.__eventHandler = EngineEventHandler(self.__inputHandler, self.__world, self.logger, self.__tcpClient) - pass + + # attempt to connect to server + try: + self.logger.info("logging into 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 def startGameLoop(self): self.__running = True diff --git a/New_Client/Assets/Cards/0/field.png b/New_Client/Assets/Cards/0/field.png new file mode 100644 index 0000000000000000000000000000000000000000..472f0a12fdbcaa451d9a8e19d34e8284e4fb1d56 GIT binary patch literal 612 zcmeAS@N?(olHy`uVBq!ia0vp^(}4H{2OE&&YL!T3U|`brba4!+nDh3^Ma~un0oH?& zi+BE6Y&hGLRyG&c@kk-#(m}cX^?lmEFck=LN+$6DJCcFe0M*+}kbRul>1a o_c63aN9d4};)o;u<)`Ug-pZab=h|0sVCrG;boFyt=akR{0KU7UqyPW_ literal 0 HcmV?d00001 diff --git a/New_Client/Assets/Cards/1/card.json b/New_Client/Assets/Cards/1/card.json new file mode 100644 index 0000000..3ce8af5 --- /dev/null +++ b/New_Client/Assets/Cards/1/card.json @@ -0,0 +1,23 @@ +{ + "id": 1, + "type":"MonsterCard", + "name": "Test Monster", + "image": "Assets/Cards/1/cards.png", + "description": "can attack other monsters", + "costs": 30, + "defense": 40, + "attacks":[ + { + "id": 1, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + }, + { + "id": 2, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + } + ] +} diff --git a/New_Client/Assets/Cards/1/card.png b/New_Client/Assets/Cards/1/card.png new file mode 100644 index 0000000000000000000000000000000000000000..76bef2df3a641b3c7f8b306c2431a68d97e45abf GIT binary patch literal 4204 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 literal 0 HcmV?d00001 diff --git a/New_Client/Assets/Cards/2/artworkjson.png b/New_Client/Assets/Cards/2/artworkjson.png new file mode 100644 index 0000000000000000000000000000000000000000..9955a0cbf1966ebc0956bef3cc107754ed7011da GIT binary patch literal 2389 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VEn?t1{8T15PXG!fm6oQ#WAE}&fA-TE1d#G zTrbu>Wi@D!FEF zConP`VG(0+@EK){2Eu4c7|jI(oeSQ)FW6NT{NVMq>&1EhyA>OJBl@P7nyP-teg8c9 z-SfS&4Za^-IT!?lfhD0~BkL$*G!RBp!e}nQ%mqtl{$%KP6?(pDVM0Byxy0b<>gTe~ HDWM4fLIJZ> literal 0 HcmV?d00001 diff --git a/New_Client/Assets/Cards/2/testspellcard.json b/New_Client/Assets/Cards/2/testspellcard.json new file mode 100644 index 0000000..f812019 --- /dev/null +++ b/New_Client/Assets/Cards/2/testspellcard.json @@ -0,0 +1,9 @@ +{ + "name": "testspell", + "type":"EffectCard", + "image":"Assets/Cards/2/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test spell card", + "attacks": [] +} \ No newline at end of file diff --git a/New_Client/Assets/Cards/3/artworkjson.png b/New_Client/Assets/Cards/3/artworkjson.png new file mode 100644 index 0000000000000000000000000000000000000000..9955a0cbf1966ebc0956bef3cc107754ed7011da GIT binary patch literal 2389 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VEn?t1{8T15PXG!fm6oQ#WAE}&fA-TE1d#G zTrbu>Wi@D!FEF zConP`VG(0+@EK){2Eu4c7|jI(oeSQ)FW6NT{NVMq>&1EhyA>OJBl@P7nyP-teg8c9 z-SfS&4Za^-IT!?lfhD0~BkL$*G!RBp!e}nQ%mqtl{$%KP6?(pDVM0Byxy0b<>gTe~ HDWM4fLIJZ> literal 0 HcmV?d00001 diff --git a/New_Client/Assets/Cards/3/testtrapcard.json b/New_Client/Assets/Cards/3/testtrapcard.json new file mode 100644 index 0000000..13ed51a --- /dev/null +++ b/New_Client/Assets/Cards/3/testtrapcard.json @@ -0,0 +1,9 @@ +{ + "name": "testtrap", + "type":"EffectCard", + "image":"Assets/Cards/3/artwork.png", + "costs": 30, + "defense": 0, + "description":"this is a test trap card", + "attacks": [] +} \ No newline at end of file diff --git a/New_Client/Assets/Cards/Arenas/default.png b/New_Client/Assets/Cards/Arenas/default.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5da22ccc75f0be2ff44b31e702347d8e45ddc5 GIT binary patch literal 10988 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 T(vt#+-w*ym-ruiS;2Qn`mQT`T literal 0 HcmV?d00001 diff --git a/Game Client/Classes/Engine/EventHandler.py b/New_Client/Classes/Engine/EventHandler.py similarity index 82% rename from Game Client/Classes/Engine/EventHandler.py rename to New_Client/Classes/Engine/EventHandler.py index b049a8d..8cb9a0b 100644 --- a/Game Client/Classes/Engine/EventHandler.py +++ b/New_Client/Classes/Engine/EventHandler.py @@ -2,7 +2,6 @@ import socket import pygame from Classes.Engine.Logger import Logger -from Classes.Engine.TCPClient import TCPClient from Classes.Game.NetworkEvents.PlaceCard import CardPlaced from Classes.Game.NetworkEvents.GameStart import GameStart @@ -10,6 +9,7 @@ from Classes.Game.NetworkEvents.PlaceCard import PlaceCard from Classes.Engine.InputHandler import InputHandler from Classes.Game.World import World from Classes.Game.Player import Player +from Classes.Game.NetworkEvents.Login import LoginResponse # network event handler this only handles events coming from the server class TCPEventHandler: @@ -18,14 +18,26 @@ class TCPEventHandler: self.__world = world self.__inputHandler = inputHandler - def handleEvents(self, message): - if message["event"] == "login": + def handleEvents(self, message:dict): + if message["event"] == "loginresponse": + LoginResponse(message) pass elif message["event"] == "startgame": + print("gamestart") + GameStart(self.__world, message["hand"], self.__inputHandler, self.__world.getPlayer()) pass elif message["event"] == "PlaceCard": + CardPlaced(self.__world, message["card"], message["type"], message["owner"], pygame.Vector2(int(message["x"]), int(message["y"]), self.__inputHandler)) pass elif message["event"] == "MoveCard": + CardMoved( + self.__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"])), + self.__inputHandler) pass elif message["event"] == "RemoveCard": pass @@ -44,9 +56,9 @@ class EngineEventHandler: __inputHandler:InputHandler __world:World __logger:Logger - __tcpClient:TCPClient - def __init__(self, inputHandler:InputHandler, world:World, logger:Logger, tcpClient:TCPClient): + def __init__(self, inputHandler:InputHandler, world:World, logger:Logger, tcpClient): + self.__logger = logger self.__logger.info("initializing engine Event Handler") if inputHandler == None: raise ValueError("InputHandler was found to be None") @@ -62,7 +74,7 @@ class EngineEventHandler: self.__tcpClient = tcpClient # handles the incoming event queue - def handleEvent(self, events:list[pygame.Event]): + def handleEvent(self, events): # TODO: fix bug that stacks cards when dragging them around self.selectedCard = None self.mousePos = self.__inputHandler.getMousePos() diff --git a/New_Client/Classes/Engine/InputHandler.py b/New_Client/Classes/Engine/InputHandler.py new file mode 100644 index 0000000..8df7dd3 --- /dev/null +++ b/New_Client/Classes/Engine/InputHandler.py @@ -0,0 +1,53 @@ +import pygame + +from Classes.Engine.Components.BoardField import BoardField + +class InputHandler: + # returns pressed key + @staticmethod + def getPressed(): + return pygame.key.get_pressed() + + # returns pressed key + @staticmethod + def getMousePressed(): + return pygame.mouse.get_pressed() + + # takes in movement inputs and maps them to x and y axis + @staticmethod + def getInputAxis() -> 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/Game Client/Classes/Engine/Logger.py b/New_Client/Classes/Engine/Logger.py similarity index 100% rename from Game Client/Classes/Engine/Logger.py rename to New_Client/Classes/Engine/Logger.py diff --git a/New_Client/Classes/Engine/TCPClient.py b/New_Client/Classes/Engine/TCPClient.py new file mode 100644 index 0000000..a44fbc9 --- /dev/null +++ b/New_Client/Classes/Engine/TCPClient.py @@ -0,0 +1,52 @@ +import json +import socket +import threading + +from Classes.Engine.EventHandler import TCPEventHandler +from Classes.Game.World import World +from Classes.Engine.InputHandler import InputHandler + +class TCPClient: + + __running:bool + + 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 + self.eventHandler = TCPEventHandler(self.tcpSocket, self.inputHandler, self.world) + + try: + self.tcpSocket.connect((self.addr, self.port)) + self.__running = True + + except Exception as e: + print(f"Error connecting TCP socket: {e}") + self.__running = False + + # 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): + self.tcpThread = threading.Thread(target=self.receive) + self.tcpThread.daemon = True + self.tcpThread.start() \ No newline at end of file diff --git a/New_Client/Classes/Engine/Utils/Path.py b/New_Client/Classes/Engine/Utils/Path.py new file mode 100644 index 0000000..9b01eb9 --- /dev/null +++ b/New_Client/Classes/Engine/Utils/Path.py @@ -0,0 +1,6 @@ +import os + + +class PathUtil: + def getAbsolutePathTo(notAbsolutPath:str) -> str: + return os.path.abspath("Client/" + notAbsolutPath) \ No newline at end of file diff --git a/New_Client/Classes/Engine/Utils/StringUtils.py b/New_Client/Classes/Engine/Utils/StringUtils.py new file mode 100644 index 0000000..e4d02a1 --- /dev/null +++ b/New_Client/Classes/Engine/Utils/StringUtils.py @@ -0,0 +1,11 @@ +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/New_Client/Classes/Engine/Utils/__pycache__/Path.cpython-311.pyc b/New_Client/Classes/Engine/Utils/__pycache__/Path.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36eabe238a3018a3f5b23ceebe0de8b97c093934 GIT binary patch literal 747 zcmZutK~EDw6n-9q*3=Ux-`j0BO<*STzBliC?|bv+tW+8YT;FHDs!xc&=`vVu z-|0O<=NKeN7C-|ytbpYEAe~bVaDgXV4JO$usJMUVTHowPQ^=KO@p=pjFc%tJGUZ6F zoY$^&_T7dnU92y}#Z}+FS+~s~z8gk%al=GG+fpnZ(aN@UxXFgZN!!8Gdy#6}A?j_O zcapzyh{kz7LI(qTeiwDohu!&QQ(6>*ZS2 zTQ^D@&se2CcuUH>vr)@?83xTziM85_mx&?x#wg=0hg-;aG^6oovbol7Jh`O?!zzlc zMVVk5UKXo8q@hkfDn#gSD zA+{sg4#=Mn;(gl>`ix_&))QFp1#}5P-yuW4n;LS=6Exj?C!7`L&!-YV_?AKH-)1sN z5~*-q9Ej?BO9)`w3&+bSER6%_nfv{H55xTZpv7e+`bT AfdBvi literal 0 HcmV?d00001 diff --git a/New_Client/Classes/Engine/Utils/__pycache__/StringUtils.cpython-311.pyc b/New_Client/Classes/Engine/Utils/__pycache__/StringUtils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4052b1a4c16bbf923e3a13bdea86858748cdf313 GIT binary patch literal 1233 zcmZ`%&1(}u6o0duq}ym(TZsLjk=!%~W1*l>N-3mLBod*qErf(6WT)xY?QY!J_z@!H zAXvqdAh{^?6e~ICv4VpB2QB1K7CebiZ;^N?J^5z0*``!ycYg29`+jfcT__X;TpzwQ zs6qgK@I!a`j+xFRGIdZuAsS>{N-{)%1yF>ipok3tpo!aE89^awi1~i;W2$g0bx7By zGmghPP{p%GocO^ z((YRKEMH*ot!~<`+M%1mD#4VJ)psJULIXXUp7%U7P}%ehPHUeKtKU=M7^rjQ^x=nETfdY zqid>8<-3W6Y(i71ZXwAtMp^czUPMjSxsGhl)x=AWkNRhdRHu(h=4@rMS5>5z?3N@m z=Q86nno-DWY&PzB@cFT;2!{u705#a1NaDXk-Y&n%ZQt07Otm6YuB;b3=m3?GMW^4W z8$4>PMm4Gzt+k4%vgw%L4!88cV*pFGw088v^WY!TtG20w>KTf(^)1Ab)KHH4b?wFSR_ zd@J1sB>x3B77r5>O@5o^5C 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/New_Client/Classes/Engine/__pycache__/EventHandler.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f41445ce6f4b8cc4dd1d450bdead19e0c3ebbc3e GIT binary patch literal 7252 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 literal 0 HcmV?d00001 diff --git a/New_Client/Classes/Engine/__pycache__/InputHandler.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/InputHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3df4b9d67cf980be6a9ea15a2abbb352fd46410a GIT binary patch literal 3564 zcmcH+TWk|YaPNHQx4F=egjb^w2*FVm5Ot{32U1BOAVWaBs=9_#@NE(&=d*ivArGCa zeB{F)e9#IhNTpIfC@n($sZ^<-eD;G%c4RfyNtGhCeDG(QRzm!=vwOZfJEj$F=sGtu zJ2N{wJF`2x`6?0#B519!I&;$6amhec-1r+6#TnZ#1g_N!AK~=O z?g8&XO#z_<2VAy^%LCVgy<@DzEpi)1_^8Z38L*9j7T=^51T8PF(~^8RB>CYB;4s*Z zj0L4&)2J;{2v!(2!>5$ow0?3_kz}kktc^s&1K;{l082=>od7(^*qvo3W;Tc5#&ujk z_nDEX$Mojr#z!;Q^i1J7Gc=BMF{ffp!_s}UPDVW+9(+4_NyDm^)O3umCx@^$rDt== zvx=Nnuy}EBI5{Y%v7!SSg@Ib~xH1lsWc?cYb8}`8jGwb?&v!HkT>)$tq_qQBK#zsC z8}q9|&x+7f5_-!*Z_(eYhC%dy#X}{NM?I<^kjZDV)39i=kyWyv=*((_hy-x=43XN4 z*}ZWw^-|(--HMD=p?5{-EeX-G5H0$n)UN4Ou|BOT4J#ujg=YE@WD`yblP4cjpYdfU zK&6S7Y&&SiBTFQ;wbaaqLm197|G3 zrM0av^mC}=Z$`E?ja169D`aF_rFGjsjclHCsvJxFw>fQZtvMeH+ips?hi)cILU&o{ zF8aHhtFBX$A$31kR(lCJKtL3L$lydw2!f;c6XI~*++4V-@^qSCqy9Z8h1cn0m&7qcizmAu> z-*OqQ5~aQ$emL#2T(uu&iXY-?KHLwV=}tJ`xp7zbGp39u!40 zD2kb^G%XW4EQ%jbkIFSkSkp)KbSi`OiL7K*ZBjJVP6GB2K#I7!mw+AsrYEiFCMTyg zT_wj~9U!3bS!LY-?2eX-6R)P1m*6;qmV}+4knvG$6?tj-x t+EMjA2q8JM+Iav~55q7O6j`9ZHS|ug@vq7qV!+R4@Raa=e}RB{{uj{r-p~L5 literal 0 HcmV?d00001 diff --git a/New_Client/Classes/Engine/__pycache__/Logger.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/Logger.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0dec2369ea2df30b7fcea6d2699bb3033d436fdb GIT binary patch literal 1304 zcmcgs%}d-s6rX(UM%`U)X|-RjOG{t_rN>gFl-gD7!EPy5T9!aaH?tu&o3%4h=;FbH z2MZoN6ukCOEMotJ{t*fumVlS`)Z5B>^3?Z|Y{Y7>eaZah&C8qj=J(!^Z~6Qn0r@fV zmHre6`Gt$V$cfS`gR)I*VhbLr5s}OiTU;l$v?CI-2P2l6U<>m^mw)53T2HLe1d$`@ zm0;Q?lz=a(iMFs#Y7)k($+iTj*fK;=!pvODaVV>&v0+;lh6JNG7sUwrF=4fs>Z@=D zTePJBtbJKbqkNZl6gV-ASOnmN`KqB{wI69^i`N6UNp*f-D>pf~v* zUb<>h&MgPNv{mi-r1oM`n}?ID4cDXS6Kl1KKeGI6>&1haT)C=URsC`bW!Fg&k|i z^Qo{|*eC$=&D_?T19kjR9pCT2>?-*EA8za#q|zmJ9j2I@LK$l@HU@@sjBbIUol6)+ zK1lR(O8G74KrJ4s#r^&pQL5@0ybyR{O*0%cO}Mbj9_l&M{IG0A*WEPP6+8@9kYUnY z5^av_ihl`)fP+r~tffy^R1~--DHKGd*d-~bqB4QYzafr}@pLgNK@^`A!El!NRDB#D l_6eJS4|tRKQ-H1{2ttPx)}p7IDF_h$A{?XbK8 literal 0 HcmV?d00001 diff --git a/New_Client/Classes/Engine/__pycache__/TCPClient.cpython-311.pyc b/New_Client/Classes/Engine/__pycache__/TCPClient.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd3e928efe2dff304dfd266d70b7bdd70dcd0ef7 GIT binary patch literal 3578 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 literal 0 HcmV?d00001 diff --git a/New_Client/Classes/Game/NetworkEvents/__pycache__/PlaceCard.cpython-311.pyc b/New_Client/Classes/Game/NetworkEvents/__pycache__/PlaceCard.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bea892b0fe7209f6baf7e06d1b4fc27a1ef6d7a GIT binary patch literal 1944 zcma)6O>7%Q6rR~X@A|LlFBMKpXaLC)BoZwkp$Z9-5PGPSC@EB_LuGlUAL6j~$S1pD6uSVaU8?4oJOH5V^v(;Ajocl8Bh+5l`kK+`5M zsYWbnkrYi48$O4kyLQVZNmJuamSi3n)6NmiY?o%POOkeZk_Wpq!IP+X;veafEcX z*R6F|?ym-T{XhCfOP^>znfJ9iT7&W&9d&ITV%%)UDN6$B(M!S!+)9;JD~uFPVbU7) zLSaZz7~xVt1^!&%rJ^OwSsGp&7Aas;a@_(j?sF#lf@OdRgHw+bb>W27V91>VM@$w} zq=L$l>sJVuXY1?hI~X5&w|s+B#>+gUv{oLbd_MGp@|fq&dGz+w&}jM49$1BQ%FCmb z1zIlAaM5S;BQiu@9+zPcL7W4@l5pA*I}Mx2Lh>0P%P7gClf7}znbq{;^rP&Ptc2Oe z*+=;&`8ap-hg;v>`gZ2w%){GVLXxpgSP25MJeu?%GyiqztJ2ClyGCKpC`7Hf4;vt1 zLQF1ECuNRW@E1MGgdX@@Wam12O@`GP602T|0j#3BM)16qgzI>+4Ya&364U@;(GFMu(SnwL9HB*GoTmF+02*+l9~b;vDvuRT7!&z6WJyvQ%H> z-iLCAd{7E}@Bj}AXELC!D`jC%u}UBj^iU5EDvMr+smQC9XWBU>w@oZ|7EbxB4D6f~ zUy$TH5H9l#y$6Gx0w~gQBh@v8y$lOdlRpKrjN(-0oBNGaZ-Q(y7u&f%?28TiV)WA6 z8zGRxxvg)Pci!5yC-&@#$exJpZ0zJ#3JnLW%%)Xu!|shPT-lfcayYlD+gEqa?%HE} z_E=<(HLYH3IE4ghO{+q~E=0YTH->>6&aKJq*LTcayR>JQBD*B5410N)oss9Te3!sA z6qZL9fmc(o*c!6_s>kHv<--g&9+#e?V(QprT>>rEFNw;S^rRBjN||%ruTdiN#$JQ} zq$Zb2kg;|=#f-3mrCGSH;#BkU4#>+ppk7}lqY;JHA0yr@-1mXb_n66kR(DwFbMO-B zJY*vEF|CF^ds7uk?af}5YBB+;ng{mP1)tn=>3i%ASd-`Ge*#H#jB$)|%jy@SSEBA2 zqbpJOOsqVH61K^uGW^>56Ui jE4DSM*l*{4zo list: + return self.__boardFields + + def getLabels(self) -> list: + return self.__labels + + def getCardWidth(self) -> int: + return self.__cardWidth + + def getCardHeight(self) -> int: + return self.__cardHeight + + def getCards(self) -> pygame.sprite.Group: + return self.__cards + + 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 spawnCard(self, asset:str, pos:pygame.Vector2, inputHandler:InputHandler, owner:Player) -> Card: + card = Card(pos, asset, inputHandler, owner) + self.__cards.add(card) + return card + + def spawnCards(self, cards:pygame.sprite.Group): + for card in cards: + self.__cards.add(card) + + def AddToPlayerHand(self, Card:Card): + self.__PlayerHandCards.add(Card) \ No newline at end of file diff --git a/New_Client/Classes/Game/__pycache__/Player.cpython-311.pyc b/New_Client/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab1a2f63875ad21665cf9264fcfe3aa7fcf7459b GIT binary patch literal 2756 zcmcIl&1)M+6rcT)SJtP$6o16EV!5QEq3xj*8caX1sU1VzK%9#aEQ@BG$dy;>%sOD# z2L)X4A%_+M@gWBtN*a^?F>(;p?6tl0rr@4(>U*;vT`6uMhK{87e($~6d7rcTC6gH@ zuzn~$Wq)Xd{EkAn^Z=Z{2jB^zgerBiNmQ~zsCr1K_Dm(@1^oQAsZiw(DeHftxLysk zk|hG+d|JVi7=gWHQ@u-=#&oJIf>|OpLYhPdSapdK+e6`j+h&NsYM_-Sm_~=-XEI|e zL6e92W|9swZA+yoz{4~xaRzV-umSok;B=tR0nP+C4>&8&!)J6l0&)&)7y5^DM!}x{ z5BnI{N9Z`j_HSqCbOQE_(gM`(ikG-uxAz$LQkD-at43qO{ic_REIYPi$3(~8VcuwD zy>B~o$>vmeDmhJD2{V)vl$Y|3>D~7%m8VTv+=@_{wR4? zmklJVP+| z*7ANj2un)1Q)GZdF&!n3l6(~RCpdF=xl@fw3`)eZA$TH0LbieXD~N(mfC!<;lW}|K z{a&AUDWRKlEDLzgjXm1yn3K}=Te>VOvbTH+P7*PfL*Qf`y0f1RQVwK{Fy{9AjyZi9 zw~(Y9u0gj3xLLg&)mciD;F4qSFXIUElLI{H2=n_IZdp7(l%=0{B4-y)(gK+K`*)!1 zgD!r-qRHY#u!M6Z$2dM$rcJkZ1*RNMe5k+}1kNE&*W}|{ZS|*hocn0T-oDXEIPJnl zufhu@UI>)0p?|#Oa=yB`xsEyKHy~aUoM$=H%K-Xo(#C0eV;v~ZK>s4LDHq)XC>O@+ zX*Q)n={&uPZ@hTzl3!A~(U7s{gCUJH*dj3x1fn<7U32m`^Xg0U>hZ>@Io~zsJLWuG znpjev)@+Er_s0L58N45M8V^`F7dJ56cy3wW{uOWR$OI>X1pC$a?>&&^+)Hz=t(}?+ zU2~yhF7#))ULM1DEdEtkmN#r!I}N&9N1V2-?{@8aV9{!h>*XxVcASQ5yS0WRV2>tT z?j@Rg_uz3aA)37AGS67yjol_6fk=1($uyE#Bsf95gydZ$*O9!B==pR;7Twc1*JxcU!BWm{{lwTEkG5y%%FXS(@PN5}7}Uh3(ZF>_q%5n$~l z$(~mw8zjSuapgzRBfthpLNTU%(-fNG1WYr>W2l`OB$s}wgz+jysqHg~V+77E9v7a@ zcBgKjwm3)1X~|Ddzpg+$Z<1H2`|ARO^zb($qbkAx literal 0 HcmV?d00001 diff --git a/New_Client/Classes/Game/__pycache__/World.cpython-311.pyc b/New_Client/Classes/Game/__pycache__/World.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4f207bdcc06606915adfcc61347d64d7ea7d3cc GIT binary patch literal 11690 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 GpZ^8dy^Z?- literal 0 HcmV?d00001 diff --git a/New_Client/__pycache__/App.cpython-311.pyc b/New_Client/__pycache__/App.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4f4b15d393d8a47ca4e1b44f367bc88b8e1c957 GIT binary patch literal 4698 zcmb7IO>7&-6`mz`DN-EjhmvJlmMl85Vv|-C|0i`+|4~2vv814~8-x+SvfP!t@@mQK zuB=#43>ol21$6MuF6sh26s`k1fR8@pP@pN`<1VqNhy?@~C{VyR1#W@Br@l8!E`Q_z z%Ixs%n>X*x-+S}TEdLgXv=T@Qzxzf?1NUz%R1;re-mC%hfQUro6q3fbPvMq)X&;BY zU-2*TX`b=CA}j^c0mchT%Th2MWPCsgEw!dw8Q-FWmuQ+YKBz>N+R|+t@sUX)hVBuu z^|6nTr|@%Ax?SXENh16ji_;0tiH@ravMP<=l2qfDSyfad4W#r}YGJvq9JrcaSYS1w zYpG9CiVWJI7WhkLa(owPN9!YnJ-9Wp=eXyYW9slJ* z!HHymW-{8cs>ip;g6y~+pL?Gm~2{G_CB1-ewWyOdavY|+hup*1b4JU9zk{50m zj=-cj(DqUQI6wT}d<*6e$QrjsGG65xS@ifK=dpE+$UO%6Q?HIAMqTTR*fL9v{sgV+ zR)N|@k1u-q6|6_8wY56k!p0+ zY1gd`tdgfw^y0IoOGxAFca0}p)in-Oxn>&}N2FR8B75+Qu*)y~ReOm0fY<_Uc>MzJ zwf-2q@znDO^y{sWak$n3Sa|a0o11Cl+>Io>8p`ceo4;7 zXS1pvpPGGr2!@jIYrXK&4kGCTvf73F2~B0y$j5a_yCrF>p_8XR9615cNk=$)=Jcsk ztNrs?S&_sz=zxK&#>Hg`3zDYgwfO2$*D#*TtE!YUC`n@%fwFj~rV>a#Erk(eX*wObaI%v~DvzmX{ZjbE{f2gxYK+}w# zeSR1SWQ(4&={b|0W8#l3I%?BVla9g&HpZ&Y50G|RpcQ!QxQPGgzT7@GM7|qp9Y5&* z?t{bQJ^p|82*Bq&3!hb2l}dr3=S+t^s1p zisFPsExW?5$_$j9Ab@l#tBJZ3ST2ZJLvkoc@E-0;+fjcOP}z_swfu5H+lOt1Z?KCx zyR&O}>N*0u_c?wrc3MPPFDTjDUvt_qsMB%t#MRX&p8Iy31T+QbTtDOkJ4Wbb= zm;?*J;RF4EfNihZqMPdXq&sxv6+qwBE!tnA{SU=Qixy4TG-1*N%BQyIV2KV|bjYSd zTQpgs$tNFr=(rOgkGEqcW4%>9tq{9ffP(M_n zLl!-1)1zB-q(nz7dcvkBOnSm=J5izu0P^9jALCw0BjOX=j-94&cgd!1D&ylQcjt1`dPX^T0Giui?QcTzfsJZ47t(&Vw-Y zO;11=vY=xTz<;qU8`?+EXuZQjc{Qa-S#`Ov8bN1!#b2Xh3(h6q%N^16@r}VsfkyE_$EddG00e-^W48E#GC2Bk zlaE2R_!yMdXVz!#&Xj5A`qcW=-KlbS+~hG^e7xM*Yx0;azPH@{zR6>@`1i}6RE@N0JAGfgR$Jk9%-*@+2749RD^r>c-&(Z3Ze3@bs5JcKjU2l}Tis zJ!NvPVf literal 0 HcmV?d00001 diff --git a/New_Client/log/aruudvef.log b/New_Client/log/aruudvef.log new file mode 100644 index 0000000..6d420c6 --- /dev/null +++ b/New_Client/log/aruudvef.log @@ -0,0 +1,6 @@ +18:31:53,299 root INFO starting game engine +18:31:53,300 root INFO initializing dependencies +18:31:53,543 root INFO initializing world +18:31:53,545 root INFO building game world +18:31:53,562 root INFO initializing engine Event Handler +18:31:53,562 root INFO attempting to login to server diff --git a/New_Client/log/azkihdia.log b/New_Client/log/azkihdia.log new file mode 100644 index 0000000..3e6a943 --- /dev/null +++ b/New_Client/log/azkihdia.log @@ -0,0 +1,6 @@ +18:35:17,398 root INFO starting game engine +18:35:17,399 root INFO initializing dependencies +18:35:17,647 root INFO initializing world +18:35:17,647 root INFO building game world +18:35:17,664 root INFO initializing engine Event Handler +18:35:17,664 root INFO attempting to login to server diff --git a/New_Client/log/cssmtaso.log b/New_Client/log/cssmtaso.log new file mode 100644 index 0000000..507a8b3 --- /dev/null +++ b/New_Client/log/cssmtaso.log @@ -0,0 +1,6 @@ +18:28:36,740 root INFO starting game engine +18:28:36,740 root INFO initializing dependencies +18:28:36,976 root INFO initializing world +18:28:36,976 root INFO building game world +18:28:36,995 root INFO initializing engine Event Handler +18:28:36,995 root INFO attempting to login to server diff --git a/New_Client/log/dypjnvwx.log b/New_Client/log/dypjnvwx.log new file mode 100644 index 0000000..9c3683e --- /dev/null +++ b/New_Client/log/dypjnvwx.log @@ -0,0 +1,6 @@ +18:24:39,228 root INFO starting game engine +18:24:39,229 root INFO initializing dependencies +18:24:39,473 root INFO initializing world +18:24:39,473 root INFO building game world +18:24:39,489 root INFO initializing engine Event Handler +18:24:39,490 root INFO attempting to login to server diff --git a/New_Client/log/ecnwzwpv.log b/New_Client/log/ecnwzwpv.log new file mode 100644 index 0000000..3f8fd1c --- /dev/null +++ b/New_Client/log/ecnwzwpv.log @@ -0,0 +1,6 @@ +18:24:07,392 root INFO starting game engine +18:24:07,392 root INFO initializing dependencies +18:24:07,636 root INFO initializing world +18:24:07,636 root INFO building game world +18:24:07,653 root INFO initializing engine Event Handler +18:24:07,653 root INFO attempting to login to server diff --git a/New_Client/log/ezuxqfek.log b/New_Client/log/ezuxqfek.log new file mode 100644 index 0000000..a669868 --- /dev/null +++ b/New_Client/log/ezuxqfek.log @@ -0,0 +1,6 @@ +18:34:47,406 root INFO starting game engine +18:34:47,406 root INFO initializing dependencies +18:34:47,651 root INFO initializing world +18:34:47,651 root INFO building game world +18:34:47,668 root INFO initializing engine Event Handler +18:34:47,669 root INFO attempting to login to server diff --git a/New_Client/log/hpyfylsj.log b/New_Client/log/hpyfylsj.log new file mode 100644 index 0000000..3890461 --- /dev/null +++ b/New_Client/log/hpyfylsj.log @@ -0,0 +1,6 @@ +18:15:16,227 root INFO starting game engine +18:15:16,227 root INFO initializing dependencies +18:15:16,469 root INFO initializing world +18:15:16,469 root INFO building game world +18:15:16,486 root INFO initializing engine Event Handler +18:15:16,487 root INFO attempting to login to server diff --git a/New_Client/log/jqqeltiy.log b/New_Client/log/jqqeltiy.log new file mode 100644 index 0000000..abcb170 --- /dev/null +++ b/New_Client/log/jqqeltiy.log @@ -0,0 +1,6 @@ +18:26:41,981 root INFO starting game engine +18:26:41,982 root INFO initializing dependencies +18:26:42,202 root INFO initializing world +18:26:42,202 root INFO building game world +18:26:44,431 root INFO initializing engine Event Handler +18:26:44,431 root INFO attempting to login to server diff --git a/New_Client/log/mhtlvsqm.log b/New_Client/log/mhtlvsqm.log new file mode 100644 index 0000000..5e1a630 --- /dev/null +++ b/New_Client/log/mhtlvsqm.log @@ -0,0 +1,6 @@ +18:03:55,272 root INFO starting game engine +18:03:55,273 root INFO initializing dependencies +18:03:55,522 root INFO initializing world +18:03:55,524 root INFO building game world +18:03:55,541 root INFO initializing engine Event Handler +18:03:55,541 root INFO attempting to login to server diff --git a/New_Client/log/pbwegfvw.log b/New_Client/log/pbwegfvw.log new file mode 100644 index 0000000..85b8c96 --- /dev/null +++ b/New_Client/log/pbwegfvw.log @@ -0,0 +1,4 @@ +18:28:05,511 root INFO starting game engine +18:28:05,512 root INFO initializing dependencies +18:28:05,733 root INFO initializing world +18:28:05,735 root INFO building game world diff --git a/New_Client/log/qqebhbex.log b/New_Client/log/qqebhbex.log new file mode 100644 index 0000000..150872d --- /dev/null +++ b/New_Client/log/qqebhbex.log @@ -0,0 +1,6 @@ +18:12:06,302 root INFO starting game engine +18:12:06,302 root INFO initializing dependencies +18:12:06,552 root INFO initializing world +18:12:06,553 root INFO building game world +18:12:06,570 root INFO initializing engine Event Handler +18:12:06,571 root INFO attempting to login to server diff --git a/New_Client/log/rnwforll.log b/New_Client/log/rnwforll.log new file mode 100644 index 0000000..17f202d --- /dev/null +++ b/New_Client/log/rnwforll.log @@ -0,0 +1,6 @@ +18:26:02,924 root INFO starting game engine +18:26:02,925 root INFO initializing dependencies +18:26:03,152 root INFO initializing world +18:26:03,153 root INFO building game world +18:26:15,219 root INFO initializing engine Event Handler +18:26:15,219 root INFO attempting to login to server diff --git a/New_Client/log/rrffvbhc.log b/New_Client/log/rrffvbhc.log new file mode 100644 index 0000000..8877eee --- /dev/null +++ b/New_Client/log/rrffvbhc.log @@ -0,0 +1,6 @@ +18:31:12,770 root INFO starting game engine +18:31:12,771 root INFO initializing dependencies +18:31:13,6 root INFO initializing world +18:31:13,6 root INFO building game world +18:31:13,23 root INFO initializing engine Event Handler +18:31:13,23 root INFO attempting to login to server diff --git a/New_Client/log/snqncicq.log b/New_Client/log/snqncicq.log new file mode 100644 index 0000000..df03f86 --- /dev/null +++ b/New_Client/log/snqncicq.log @@ -0,0 +1,6 @@ +18:32:14,21 root INFO starting game engine +18:32:14,22 root INFO initializing dependencies +18:32:14,268 root INFO initializing world +18:32:14,268 root INFO building game world +18:32:14,285 root INFO initializing engine Event Handler +18:32:14,285 root INFO attempting to login to server diff --git a/New_Client/log/sstwdlli.log b/New_Client/log/sstwdlli.log new file mode 100644 index 0000000..3142c48 --- /dev/null +++ b/New_Client/log/sstwdlli.log @@ -0,0 +1,6 @@ +18:17:42,689 root INFO starting game engine +18:17:42,689 root INFO initializing dependencies +18:17:42,927 root INFO initializing world +18:17:42,928 root INFO building game world +18:17:42,946 root INFO initializing engine Event Handler +18:17:42,946 root INFO attempting to login to server diff --git a/New_Client/log/vzybrxrc.log b/New_Client/log/vzybrxrc.log new file mode 100644 index 0000000..52e5aed --- /dev/null +++ b/New_Client/log/vzybrxrc.log @@ -0,0 +1,6 @@ +18:25:06,487 root INFO starting game engine +18:25:06,487 root INFO initializing dependencies +18:25:06,730 root INFO initializing world +18:25:06,730 root INFO building game world +18:25:06,748 root INFO initializing engine Event Handler +18:25:06,748 root INFO attempting to login to server diff --git a/New_Client/log/wqfhotaq.log b/New_Client/log/wqfhotaq.log new file mode 100644 index 0000000..825538c --- /dev/null +++ b/New_Client/log/wqfhotaq.log @@ -0,0 +1,6 @@ +18:35:28,383 root INFO starting game engine +18:35:28,383 root INFO initializing dependencies +18:35:28,619 root INFO initializing world +18:35:28,620 root INFO building game world +18:35:28,637 root INFO initializing engine Event Handler +18:35:28,638 root INFO attempting to login to server diff --git a/New_Client/log/xqetosuq.log b/New_Client/log/xqetosuq.log new file mode 100644 index 0000000..9822c82 --- /dev/null +++ b/New_Client/log/xqetosuq.log @@ -0,0 +1,6 @@ +18:28:22,876 root INFO starting game engine +18:28:22,876 root INFO initializing dependencies +18:28:23,117 root INFO initializing world +18:28:23,117 root INFO building game world +18:28:23,134 root INFO initializing engine Event Handler +18:28:23,135 root INFO attempting to login to server diff --git a/New_Client/log/xwrmortx.log b/New_Client/log/xwrmortx.log new file mode 100644 index 0000000..76c0ab5 --- /dev/null +++ b/New_Client/log/xwrmortx.log @@ -0,0 +1,6 @@ +18:14:40,491 root INFO starting game engine +18:14:40,492 root INFO initializing dependencies +18:14:40,714 root INFO initializing world +18:14:40,715 root INFO building game world +18:14:41,59 root INFO initializing engine Event Handler +18:14:41,168 root INFO attempting to login to server diff --git a/New_Client/log/xxfpqmla.log b/New_Client/log/xxfpqmla.log new file mode 100644 index 0000000..3a73195 --- /dev/null +++ b/New_Client/log/xxfpqmla.log @@ -0,0 +1,6 @@ +18:17:28,90 root INFO starting game engine +18:17:28,90 root INFO initializing dependencies +18:17:28,335 root INFO initializing world +18:17:28,336 root INFO building game world +18:17:28,352 root INFO initializing engine Event Handler +18:17:28,352 root INFO attempting to login to server diff --git a/New_Client/log/ysnrngup.log b/New_Client/log/ysnrngup.log new file mode 100644 index 0000000..a45e4ca --- /dev/null +++ b/New_Client/log/ysnrngup.log @@ -0,0 +1,4 @@ +18:30:56,421 root INFO starting game engine +18:30:56,421 root INFO initializing dependencies +18:30:56,654 root INFO initializing world +18:30:56,654 root INFO building game world diff --git a/New_Client/log/zlnfjkpf.log b/New_Client/log/zlnfjkpf.log new file mode 100644 index 0000000..0086ccb --- /dev/null +++ b/New_Client/log/zlnfjkpf.log @@ -0,0 +1,6 @@ +18:14:31,193 root INFO starting game engine +18:14:31,193 root INFO initializing dependencies +18:14:31,416 root INFO initializing world +18:14:31,416 root INFO building game world +18:14:36,438 root INFO initializing engine Event Handler +18:14:36,864 root INFO attempting to login to server diff --git a/New_Client/log/zoukqhzj.log b/New_Client/log/zoukqhzj.log new file mode 100644 index 0000000..4ead003 --- /dev/null +++ b/New_Client/log/zoukqhzj.log @@ -0,0 +1,6 @@ +18:34:33,865 root INFO starting game engine +18:34:33,865 root INFO initializing dependencies +18:34:34,103 root INFO initializing world +18:34:34,104 root INFO building game world +18:34:34,121 root INFO initializing engine Event Handler +18:34:34,121 root INFO attempting to login to server diff --git a/New_Client/log/zpvgppfk.log b/New_Client/log/zpvgppfk.log new file mode 100644 index 0000000..11d7f19 --- /dev/null +++ b/New_Client/log/zpvgppfk.log @@ -0,0 +1,5 @@ +18:37:44,978 root INFO starting game engine +18:37:44,978 root INFO initializing dependencies +18:37:45,225 root INFO initializing world +18:37:45,225 root INFO building game world +18:37:45,242 root INFO logging into server diff --git a/Game Client/main.py b/New_Client/main.py similarity index 59% rename from Game Client/main.py rename to New_Client/main.py index e4e3cba..ec7ad0e 100644 --- a/Game Client/main.py +++ b/New_Client/main.py @@ -1,9 +1,11 @@ from App import App from Classes.Engine.Logger import Logger from Classes.Engine.Utils.StringUtils import StringUtils +from Classes.Engine.Utils.Path import PathUtil if __name__ == "__main__": - logger = Logger("log/"+StringUtils.get_random_string(8)+".log") + + logger = Logger(PathUtil.getAbsolutePathTo("log/"+StringUtils.get_random_string(8)+".log")) logger.info("starting game engine") game = App(logger) \ No newline at end of file diff --git a/OLD_Server/.env b/OLD_Server/.env new file mode 100644 index 0000000..56fba80 --- /dev/null +++ b/OLD_Server/.env @@ -0,0 +1,4 @@ +HOST="127.0.0.1" +TCPPORT=54322 +UDPPORT=54323 +ENV="DEV" \ No newline at end of file diff --git a/OLD_Server/.vscode/settings.json b/OLD_Server/.vscode/settings.json new file mode 100644 index 0000000..1341321 --- /dev/null +++ b/OLD_Server/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "cSpell.words": [ + "DGRAM" + ], + "cSpell.ignoreWords": [ + "activateeffectcard", + "activatemonstereffect", + "attackcard", + "attackplayer", + "movecard", + "placecard", + "removecard" + ] +} \ No newline at end of file diff --git a/OLD_Server/Assets/Arenas/default.png b/OLD_Server/Assets/Arenas/default.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5da22ccc75f0be2ff44b31e702347d8e45ddc5 GIT binary patch literal 10988 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 literal 0 HcmV?d00001 diff --git a/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json new file mode 100644 index 0000000..0df2ece --- /dev/null +++ b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.json @@ -0,0 +1,22 @@ +{ + "id": 1, + "name": "Test Monster", + "image": "Assets/Cards/testmonstercard/cards.png", + "description": "can attack other monsters", + "costs": 30, + "defense": 40, + "attacks":[ + { + "id": 1, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + }, + { + "id": 2, + "name":"test attack", + "description": "can attack another Monster", + "damage": 80 + } + ] +} diff --git a/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.png b/OLD_Server/Assets/Cards/MonsterCards/testmonstercard/card.png new file mode 100644 index 0000000000000000000000000000000000000000..320d60d34af39518b06c3adcf397345b883d202c GIT binary patch literal 9570 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 literal 0 HcmV?d00001 diff --git a/OLD_Server/Assets/Cards/SpeelCards/testspellcard/artworkjson.png b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/artworkjson.png new file mode 100644 index 0000000000000000000000000000000000000000..9955a0cbf1966ebc0956bef3cc107754ed7011da GIT binary patch literal 2389 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VEn?t1{8T15PXG!fm6oQ#WAE}&fA-TE1d#G zTrbu>Wi@D!FEF zConP`VG(0+@EK){2Eu4c7|jI(oeSQ)FW6NT{NVMq>&1EhyA>OJBl@P7nyP-teg8c9 z-SfS&4Za^-IT!?lfhD0~BkL$*G!RBp!e}nQ%mqtl{$%KP6?(pDVM0Byxy0b<>gTe~ HDWM4fLIJZ> literal 0 HcmV?d00001 diff --git a/OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json new file mode 100644 index 0000000..51d4083 --- /dev/null +++ b/OLD_Server/Assets/Cards/SpeelCards/testspellcard/testspellcard.json @@ -0,0 +1,6 @@ +{ + "name": "testspell", + "image":"Assets/Cards/testspelltcard/artwork.png", + "costs": 30, + "description":"this is a test spell card" +} \ No newline at end of file diff --git a/OLD_Server/Assets/Cards/TrapCards/testtrapcard/artworkjson.png b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/artworkjson.png new file mode 100644 index 0000000000000000000000000000000000000000..9955a0cbf1966ebc0956bef3cc107754ed7011da GIT binary patch literal 2389 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1VEn?t1{8T15PXG!fm6oQ#WAE}&fA-TE1d#G zTrbu>Wi@D!FEF zConP`VG(0+@EK){2Eu4c7|jI(oeSQ)FW6NT{NVMq>&1EhyA>OJBl@P7nyP-teg8c9 z-SfS&4Za^-IT!?lfhD0~BkL$*G!RBp!e}nQ%mqtl{$%KP6?(pDVM0Byxy0b<>gTe~ HDWM4fLIJZ> literal 0 HcmV?d00001 diff --git a/OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json new file mode 100644 index 0000000..6d1cd5a --- /dev/null +++ b/OLD_Server/Assets/Cards/TrapCards/testtrapcard/testtrapcard.json @@ -0,0 +1,6 @@ +{ + "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/OLD_Server/Classes/Game/Player.py b/OLD_Server/Classes/Game/Player.py new file mode 100644 index 0000000..2d337be --- /dev/null +++ b/OLD_Server/Classes/Game/Player.py @@ -0,0 +1,57 @@ +import random + + +class Player: + __id:int + __hp:int + __mana:int + __name:str + __handCards:list + __deck:list + + def __init__(self, name:str, deck:list, hp:int=1000, mana:int=0): + self.__hp = hp + self.__mana = mana + 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 + + def getHP(self) -> int: + return self.__hp + + def adjustHP(self, hp:int) -> int: + self.__hp = self.__hp + hp + + def getID(self) -> int: + return self.__id + + def getHand(self) -> list: + return self.__handCards + + def getMana(self) -> int: + return self.__mana + + def addMana(self, amount) -> int: + self.__mana + amount + return self.__mana + + def AddToHand(self, card) -> list: + 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/OLD_Server/Classes/Game/__pycache__/Player.cpython-311.pyc b/OLD_Server/Classes/Game/__pycache__/Player.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c346f11d0705b950a8a46a90872d88571659a4e GIT binary patch literal 3485 zcmcIm&2JM&6rc63?M-aQAu%Szp|+Z&sw-$q3u;9vYMY28Kn)UbNiD4`&juX)k=@(iRm=W1qbf}Y%$KbQf7-Rz~&eaY%s1q3NZE*f2S=fT)ED& z+H+!aMOP}j0hc-W7hsE-40G9H;3hLwQ{&2cNF@q*NR=pvQB9%{P|!mmLi{a0Uc8cFQ{w$^CJ zB9iPiN-(CggC@upYp4xo06DFpfm1wA0q3Rq76V5sWorb$b&7@6BON(o%b^bD3J-Lb z3)Y0aQHJoSx#zTH>BsLCmemC<6*NQWM5u%W)v6s5@V!>C!_=3mbwMs=gSKXw6f73FBmAC4qxt5) zwOxJ8WuGO+ALd%8TjoyUq=#8DcLxZ|^^qV*BiU7t+OKaQDA z_AEK^u-dxu(>FWG)4R#jFBJC0> zV82!2TV`EaG~`<3@}%m3iUjeGkKX^Tt&dCfudi0tTtBrr)WW(?E%D>fC^AIIfY(%p zpvzM4RThL#^Vim+haS#fJAv(e{@rcsV~$EM@t8nZhII;{JFE?59WtCeP^VEj$WRNK zoejtWkVnU&eKKwt=moyKYLPvilJ5vIm}QNEP|1%yTxbP;$aM<&O~Qec({X(%Wm@TXsKf`@%+0hNDpYE#)p}R5!v)T}EOGghSZ9$Dh=3lwA9=8}qffN; ziSDE3H;~Fumf|cxcPX~K+X+KnYbf0}S6>HUJ7o^GudJ9=-f=}M()-X~wF6&rexoLn zIqV)IPx2vlu-*od&fre|Lr?#%r(4>NKE10?xAkeb<;$|I(JQy;_l~gijxIrXN3TdA zryU+F3R~x3eG1%VV%X}bHkUs`6X{-rd8xE~Y2dJT&bzIy)T}OB{^v*wvr=0#J6?R& z>&1{Weo@paGTKMoXm^W0p=EtSuI}hlyZTgHpXv^I4*KZ8$tCY8c?5yUoN=tl&;mbsl{JB2ss%&Q^%6Z0 z%(UPhx?ZAV|LrrqYNXZ>t&$sN9`|4DZ78o>nOu}1eJeTHzDS5JL0JJW^z%+3UJ!GT i(Vb>}0kW?uin7OIP5JDH&ML6-W%4)4{^>IyHT(xuq{IXO literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/Game/__pycache__/Player.cpython-312.pyc b/OLD_Server/Classes/Game/__pycache__/Player.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2da2dbac598e88b67ae05002c0423b4ca7d6b69f GIT binary patch literal 3265 zcmcgu%WoS+7@vLF>-d!>Zg3vOhO~f1DQc;BR0V_*+JuLR)b`?9TCF^j)~US?vrZ+a zK2&NzsRU|sa!z1QH0nRV|G=fCMGZ@DTuwH)YqNAT^|%`T&`H$rZUY z;xXO70JI1r1&NY^e14L zNe}M@JnY$w0p3HO6X&G?kI-@O2+vpP1n{Gc$=p6Cv`{e{j5|@o1%^?k0p|R&6YpuN zrey|L%d9eIq^CV^T6D(b)DD^B9h3i;Xw$tn2<6O4t9R1H}j%u^YB9Ee73`rbG0*H+USsagMXO0!m*o@o7Q+38J z7H64#pQZMPC@J5p?`S;Kl!F+Q&2v377CkgjBng*QZM!y zgm7gyE{HDN$%Q;L%xb^|E*8p`#!z~4$1~w;)J`oqp#{IHhx9BEaTCveH|6ce4 zOofddhxa1gn%|gj%Nu#@``sl7S_3cl6Rm*>nx73OXnyuZG(3Q0w>1%O(O^xm8|UCf z3bq3Bc%qHZkm$yH$;|C!=9Zq>wG&~CWG5#+g*QFu1oE$-@#B8nu_4|Dn`bwK^z3`e z55W#zb2uThT3fN|ef<$ODed#l<6nh!Hr{kdksiAiy&Ao~_>(?0czJ_fV+)HmUI6ek zub0qbU^FHFQT&%^AP}rG1hTx$Eb7Olmhi(G?E1(Dl%B4M(hqwVvL|^RcCfMWL}d5$ z^ld$TPtV-eGi~@99DoS>8^TfX+g%DqidaNC0stb#Z!jQt_}3CM=wHjX0QWf|6>z@c2*3Fq|R7sMhF81#!$UK3_2_o<@Pc9!}CQOv|d( z&3d_J*fi6*Xmv@OVR>W-S)jwY{s{D-P(uWinB2uy7%rW>}HekgTO z_%I=9M>-)%o7_xw2}~{??cwq3HsW!VPj60l08h84Q8bOBpgQYrk?r3?)+XDq9ZVfv z*0OCl2BwZKY1z%AxDVK)e6)k|8>v5W5-+2O6}kYw8E)_&BEpwjB;=8P+^x%d`~=AG Z?}UvPq@zfZ^ec(~9Xcvy9}*y9%|A*bbZGzp literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/GameManager.py b/OLD_Server/Classes/System/GameManager.py new file mode 100644 index 0000000..f3a19b8 --- /dev/null +++ b/OLD_Server/Classes/System/GameManager.py @@ -0,0 +1,137 @@ +import json +import socket +from Classes.Game.Player import Player + + +class GameManager: + __players:dict + __playingPlayer:Player + __state:str + __round:str + __cards:list + + def __init__(self, logger): + self.__players = {} + self.__playingPlayer = None + self.__state = "waiting" + self.__round = "none" + self.logger = logger + self.__cards = [] + pass + + def getLogger(self): + return self.logger + + # card management + def spawnCard(self, card, owner, x, y): + self.logger("spawning card") + + self.__cards.append(card) + + payload = { + "event":"PlacedCard", + "owner": owner, + "card": card, + "x": x, + "y": y, + } + + for userAddr in self.__players.keys(): + self.logger.info(f"send to client {self.__players[userAddr]['player'].getID() != owner}") + if self.__players[userAddr]["player"].getID() != owner: + self.__players[userAddr]["socket"].send(json.dumps(payload).encode()) + + # game round management + # this section manages the flow of rounds this should inherit itself + # ============================================================================= + + # this function iterates all + def progressRound(self): + # phases + # - playerPrep => playing player switches, gets a mana point and gets verified + if self.__playingPlayer != None: + for player in self.__players: + if self.__playingPlayer != player: + self.__playingPlayer = player + else: + self.__playingPlayer = next(iter(self.__players)) + # - playerDraw => player draws a card + # - playerPlay => player can place cards and active effects + # - playerEnd => player ends his turn and the code reiterates with the remaining player + pass + + # game state management + # this section mostly only used by the networking and event handling classes + # other parts should never need to interface with this unless really required + # ============================================================================= + def startGame(self, tcpSocket:socket): + self.__state = "running" + + players = list(self.__players.values()) + + print("game starts") + self.logger.info("game manager is starting the game") + for userAddr, player_data in self.__players.items(): + try: + user = self.__players[userAddr]["player"] + user.addMana(1000) + user.adjustHP(1000) + user.shuffleDeck() + cards = self.__players[userAddr]["deck"] + user.setHand(cards[:5]) + + # iterates until the enemy player is not anymore equal to current player + enemy = next(player_data["player"] for player_data in players if player_data["player"] != user) + + payload = { + "event": "startgame", + "player": { + "mana": user.getMana(), + "hp": user.getHP(), + "hand": user.getHand() + }, + "enemy": { + "id": enemy.getID(), + "name": enemy.getName(), + "hp": enemy.getHP(), + }, + } + + tcpSocket.send(json.dumps(payload).encode()) + except Exception as e: + self.logger.error(f"failed to start game due to error: {e}") + break + # handles notifying all players that the game starts + pass + + def stopGame(self): + # handles notifying all players that the game stops + # handles stoping the game itself and notifies server to stop itself + pass + + # player management + # the network manager will create a player instance + # ============================================================= + + # gets all player known to the game manager and returns them + def getPlayers(self) -> dict: + return self.__players + + # creates a player and handles counting all players and if conditions met starting the game + # returns the new dict in which the new player now is added + def addPlayers(self, player:Player, socket:socket, clientAddr, deck) -> dict: + + self.logger.info(f"creating user with id: {player.getID}") + self.__players[clientAddr] = { + "player": player, + "deck": deck, + "socket":socket + } + self.logger.info(f"new length of user dictionary: {len(self.__players)}") + + # counts participating players and starts the game if enough have joined + if len(self.__players) == 2: + self.logger.info("2 players have join game starts") + self.startGame(socket) + + return self.__players \ No newline at end of file diff --git a/OLD_Server/Classes/System/Logger.py b/OLD_Server/Classes/System/Logger.py new file mode 100644 index 0000000..b548160 --- /dev/null +++ b/OLD_Server/Classes/System/Logger.py @@ -0,0 +1,18 @@ +import logging + + +class Logger: + def __init__(self, filename): + logging.basicConfig(filename=filename, + filemode='a', + format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s', + datefmt='%H:%M:%S', + level=logging.DEBUG) + + def info(self, message): + print(message) + logging.info(message) + + def error(self, message): + print(message) + logging.error(message) \ No newline at end of file diff --git a/OLD_Server/Classes/System/Network/EventHandler.py b/OLD_Server/Classes/System/Network/EventHandler.py new file mode 100644 index 0000000..6cca201 --- /dev/null +++ b/OLD_Server/Classes/System/Network/EventHandler.py @@ -0,0 +1,32 @@ +import socket +from Classes.Game.Player import Player +from Classes.System.GameManager import GameManager + +from Classes.System.World import World + + +class TCPEventHandler: + __tcpSocket:socket + + def __init__(self, socket:socket): + self.__tcpSocket = socket + + # handles passing of event data to the right functions + def handleTCPEvents(self, event, gameManager:GameManager, address): + gameManager.getLogger().info(f"incommingevent {event}") + if event["event"] == "placecard": + gameManager.spawnCard(event["card"], event["user"], event["x"], event["y"]) + pass + elif event["event"] == "MoveCard": + pass + elif event["event"] == "RemoveCard": + pass + elif event["event"] == "AttackCard": + pass + elif event["event"] == "AttackPlayer": + pass + elif event["event"] == "ActivateEffectCard": + pass + elif event["event"] == "ActivateMonsterCard": + pass + pass \ No newline at end of file diff --git a/OLD_Server/Classes/System/Network/NetworkManger.py b/OLD_Server/Classes/System/Network/NetworkManger.py new file mode 100644 index 0000000..a08faa6 --- /dev/null +++ b/OLD_Server/Classes/System/Network/NetworkManger.py @@ -0,0 +1,142 @@ +import json +import signal +import socket +import sys +import threading +from Classes.Game.Player import Player +from Classes.System.GameManager import GameManager + +from Classes.System.Network.EventHandler import TCPEventHandler +from Classes.System.World import World + +class NetworkManager: + class TCP: + __Addr:str + __Port:str + __BufferSize:int = 1024 + __tcpSocket:socket + __eventHandler: dict + __users: dict + __TCPClientThread:threading.Thread + __gameManager:GameManager + + def __init__(self, Addr:str, Port:str, gameManager:GameManager): + gameManager.getLogger().info("starting up network manager") + + self.running = True + self.__Addr = Addr + self.__Port = int(Port) + self.__gameManager = gameManager + self.__eventHandler = {} + + gameManager.getLogger().info("starting up tcp server") + self.__tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.__tcpSocket.bind((self.__Addr, self.__Port)) + self.__tcpSocket.listen() + + gameManager.getLogger().info("starting up thread for client socket accepting") + self.__TCPClientThread = threading.Thread(target=self.accept_connections) + self.__TCPClientThread.daemon = True + self.__TCPClientThread.start() + + def accept_connections(self): + while self.running: + try: + client_tcp_socket, client_address = self.__tcpSocket.accept() + self.__gameManager.getLogger().info(f"Connected with {client_address}") + self.__gameManager.getPlayers()[client_address] = client_tcp_socket + self.__eventHandler[client_address] = TCPEventHandler(client_tcp_socket) + + client_handler_thread = threading.Thread( + target=self.receive, + args=(client_tcp_socket, client_address) + ) + + self.__gameManager.getLogger().info(f"starting client handler thread for client at address {client_address}") + client_handler_thread.daemon = True + client_handler_thread.start() + + except Exception as e: + self.__gameManager.getLogger().error(f"tcp socket failed to accept connection due to error: {e}") + pass + client_handler_thread.join() + + def receive(self, client_socket, client_address): + while self.running: + try: + data = client_socket.recv(self.__BufferSize) + if not data: + self.__gameManager.getLogger().info(f"Connection with {client_address} closed.") + break + + try: + + message = data.decode() + messageJson = json.loads(message) + self.__gameManager.getLogger().info(f"decoded message {messageJson}") + user = messageJson.get("user") + self.__gameManager.getLogger().info(f"user in message {user}") + + except Exception as ex: + self.__gameManager.getLogger().info(f"decoding incoming packet failed due to exception: {ex}") + + # creates a user and counts how many currently are connected to the server + # if enough users for a round are connected the server has to start the game + if user not in self.__gameManager.getPlayers(): + if messageJson["event"] == "login": + self.__gameManager.getLogger().info("user logging in") + self.__gameManager.getLogger().info("task passed off to gameManager") + user = self.__gameManager.addPlayers(Player(messageJson["username"], messageJson["deck"]), client_socket, client_address, messageJson["deck"]) + self.__gameManager.getLogger().info(f"connected users {len(self.__gameManager.getPlayers())}") + + self.__gameManager.getLogger().info(f"confirming login for user") + self.send({ + "event":"loginresponse", + "status": "success", + "id": user[client_address]["player"].getID(), + "name": user[client_address]["player"].getName() + }, client_address) + + self.__eventHandler[client_address].handleTCPEvents(messageJson, self.__gameManager, client_address) + self.__gameManager.getLogger().info(f"Received message from {client_address}: {message}") + + except socket.error as e: + + if e.errno == 10054: + self.__gameManager.getLogger().error(f"Connection with {client_address} forcibly closed by remote host.") + break + + self.__gameManager.getLogger().error(f"Socket error receiving data from {client_address}: {e}") + + except json.JSONDecodeError as e: + self.__gameManager.getLogger().error(f"JSON decoding error receiving data from {client_address}: {e}") + + # except Exception as e: + # self.__gameManager.getLogger().error(f"UknownError receiving data from {client_address} due to error: {e}") + + def broadcast(self, payload:dict): + for user in self.__gameManager.getPlayers().values(): + user["socket"].send(json.dumps(payload).encode()) + + def send(self, payload: dict, user: str): + players = self.__gameManager.getPlayers() + + if user in players and "socket" in players[user]: + players[user]["socket"].send(json.dumps(payload).encode()) + else: + self.__gameManager.getLogger().error(f"user '{user}' or socket was not found 'socket' failed to send data.") + + def stop(self): + self.__TCPClientThread.join() # Wait for the thread to finish before exiting + + tcp: TCP + # udp: UDP + + def __init__(self, Addr:str, TCPPort:str, UDPPort:str, gameManager:GameManager): + self.tcp = self.TCP(Addr, TCPPort, gameManager) + signal.signal(signal.SIGINT, self.handle_interrupt) # Register the signal handler + + def handle_interrupt(self, signum, frame): + self.__gameManager.getLogger().info("Received keyboard interrupt. Stopping the server.") + self.tcp().stop() + sys.exit(0) \ No newline at end of file diff --git a/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc b/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e128bb5dc72da44ac3a94766869908a2d6b6bc8 GIT binary patch literal 1903 zcmZ`)&rjS&6rSJGyc&udl0mbHh!T4Dnfq=qtn2a?Q8*tT|^MUE-HvoadAZ{C|KwzH&sy!s?=3i ztE3BQj1)AFi1rMT^nrrVA>2_bWC&hH`OM$KT*_mfe(c(tl!2C;w<~nf_UtujYO6kT ziPL^g4ym?rb`O+YL{R|~R8UqBO;MHL2Y?cVrb-G)JyQ!BQE3`<4fG62i&=T!XS0vz zYSarqu|48a#)qv0Vp*Y6UG|-I8uD}?M<-rAOdxczj= z(-SlAB$!;x+(@Zo_Sx`&8OIv+q&+#jjvbRP>;f`@ljyzj+ZHGEGBV3K- z29y=Y-*5~CvFO+6tl)Z{&`PY&grV)MOWcU`X!r3eGfr5p*&&@Pm8cU+kHHSM=zCCo zOn~_m&#uvM!C!+-%GI)0@_9C>+D|>ns!Ws_8xW!o1kc!nFd77bNc$KxW(c_NE4lqT zwHj=VcGUL1oJcr`mj&X?fa=u;PxX<8K60#&p6H{e`mKh3tA2axXafZFV}1HWpRViE z&0PP>>o2DEzG&p$ZK2-mK-0K>YK%9G@%`IBrGL14^wv@B*O6D+E9bYK-{*3QhM8}noOnFOwj1XAEtGu&mg&O2ZJ2jkNV|yDNAEYx z`z@5}1}7WlWDDU4)Q#sV>xF2S^19gD9_&ra;yspC@yUiObi=Z~-mu+>kp~R#vn<>5 z{Ll`|@WCvLneYZC63@m#{EXx)A5#14*NSuuFwf-Q=*A#mXFmd7pH4v>7#<+>h9eFj;oqBg~qI>o3{%5xX__xwS R7=pem{t?)}Zy@Bl{sW&n(pUfh literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc b/OLD_Server/Classes/System/Network/__pycache__/EventHandler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc97bd5e938289e59a673294dae3d6d2b004b7fe GIT binary patch literal 1503 zcmZvc&ube;6vt;)yQ|fYwH&*3ez?X;NkW!VQ5r*`1ef3h_fWf`PAI6N!?H6{6|HvN z*|my{X?sYax#eas!+(O@6Br6RA>%wzVn$kvv1zK z*`IB@NT98){3ssf2>BfcS<@$Cd=tbW;e=D4)Unrm+STeBMV<3=UA?X=t@}pTtecc* zWRq~?KH=uEmhMu|_oxB4<_jAFb1=8zoF1H#k8ZV!qw%boE#@azUW^Di5)M;wjObLU)`~8{>moI*+|7x8Z!-yoM)_*zovTMc} z)asxE5O7fK9!32Bc03v0%P!`nX-*I5cjSBRc(RT{vbc60Jb12il@O^FAYrFWpTUe7 z%$&jUGnh4l6%?cRU8lIcUug$k*zLB1mcW{*CWh*h0#u|YHeAUQYb)%fs`!!Up6VNM z?0OyLQBHMQ#L2=9FK+kTSlnthg%>N2#f)u*0oU%C!V{^8jN>qnmqN>_*F`OyVZut(>~+~UJ`9(;PVKd>F7 zOGsbM=)u5#1L*?NGt+bqsh!a;2lkujTSQuz(8sIS2KF_?CSv0huMO-qz(cDn=OFlP z$HGbvpk5hEii~wbzUQMZGxqtO>!&m7y(JaK+#m>JH*Q1H8Iv~bATf{fH84LBwWZ3Z z%p*mE&o-)p`GySVm!9fNBb^$rA2r7Wx{)<+*eA<>6X?>#xWuv2?=4QAY7L)nEiDF# zk0QB{&7_Z5IZXa>DxTz(DF^k}lLo9!BfE$S6QH7fVO>wpy)G{U!?zVJgBj&0rN0sT WIl1zjy!{8c@{f6z+J6x+YVp6>{eH0k literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc b/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a79516b405b0637595363c8d65b4bed0955483c0 GIT binary patch literal 11204 zcmb_iZ)_81njhO^dy+WBfgy1cLk#(AASV0?2_dB+1OhA@{v<$~hPoy*0SCv<&Wsb{ zI+T^FUD`uhcEzc=y{^``>UFbfE1}bU;69vmr}m_N*t?yv=45LmB&1V6+_#|iL)B0B zJnwkM9>=L*kMZm0edhiD_xC=}^Ufb@YpW@E{J;5v|8)yR{SUqv4_#osy#vfg6i0Ek z7&WE)wkaEVw@=xL@0fBBpPr(@x5u3Gt|^xd(>h}Ad1i_sJRPf=ub!$Vyfaoa@0s%0 zC_6Pqajy3%&i$#KqCSJa{!G}Nmv1iv^AW{U*o7(k6}etM+o7 z_yorZ27fUjNKpz_j^@=PN0PI%yf6_>@mif8BF!vJBxY{&lD1V3;7g`XtI@-fA}@&A zcKrovIT?$>{7&8y_z0)f>%ljRi$J4EBWSE%t0{??F%~fn5AqK9fBR3c$UdUdjtsnP zd_IMs&&=SA&16d$&h{yUe`dzPlD4O*u(^2CHh9Cj$Rkx597Uz=)|`;eX~d=-@Mf$O zDoVkdyBL=-Sd0Hct#w%Iv{6!hv5+}qXHb&2B-CuPCDdGN*1ZBPtugYZsX3F+c#P0e zA5xfO1H9S)*|M>*!3dO;Ra;ty!CU(eIUE@y%HmtoZ8EF$hH=_aEM%_E;GtFKNPX_K z=7Etg#}?PbocR{sT9V%k&1^G5OMPo=5insFy2ev2q7;E07QY!tE(GE_+yv%zB%Dk& zl*Yn73&1W~7TzU^XEHX2`Azh-5nkA~Q4m0+x+f3)S4@r68+SfpG0X{Q+#|^V0>)Gkm~x7>3Zovc`nN(Rfq}hf^&ZaWP~>HeyS507l%S z@}9<=XIIvz|yuY7U!^SA%?s`}amrS+oPdJ%K_ z^Bylyy&;*ypB#Hk|8tGJdr0xTrg~nJJ+B$@ZCOv7;^|O59kQomlj`17JX5M?O7=`W z?FgwIeNQIU*CyqTD@w-|wc`p_w>!VDm-wnDNJ`$VcU$r7Q9XNP!+i^*M9r8;3NMHU z1gF<@oTlb533(pcguW_71v7od#9Si{`quq34QWJq#tp8Sx`#9TOg?6daI z%cPkVI9p0u_t*E{QMvaVopyvxvF*+30P6=$CG3$p{w9;+$!^ z(mcHhXu3k*rQ?k5FWHu;JB~N0C7eGq`$OB~KInys^JWAv)>$l~bKOZDt#~f56qRlT zf_4EhK%)Un#Z;e(!Uf#DrHiWp9sNoXIU)rjAXV|A7?@1;5hT|!dNvY`LFrPWfYyN` zJ_fiXj}g2eB!t00uwH0}x^=j9>1e8Bv=4)uuwB)F?YdAc3b@n>d<(mf+l}#VfuG@{ zaDudBPzMH8ow`F#2}EF0lSa=aqVb?p=)~xHy=!4;a=35`Y$*g4I;3qcycc>O)_bqn zcoCa`pdAppu)a1Rsg4Txy76e(14+eS>PWk_;nBY5)YjUjb$fk%Q+{Ab9XOL4xR4#V zpbT762QDdWpUie-?&eva%68`1-Ynazum@H4V2Pm3>QQ-^!o9 z_HdM>K9FS(DC{AXJ@j~7VNX6CJS(4jOBtM22d6Pb*V-0^?f+(9pSo`--`e(ZI=^%O z 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 JlUOnn{|7>jn^6D& literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-312.pyc b/OLD_Server/Classes/System/Network/__pycache__/NetworkManger.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4845ff9545cdc4ecba8a687f01386bd5ad7f1877 GIT binary patch literal 10000 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 literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/PlayerManager.py b/OLD_Server/Classes/System/PlayerManager.py new file mode 100644 index 0000000..e149622 --- /dev/null +++ b/OLD_Server/Classes/System/PlayerManager.py @@ -0,0 +1,23 @@ +import json +class Player: + + def createUser(self, user:json): + self.__users.append(user) + + def createUser(self, user:json): + if self.getUser(user["username"]) == None: + self.__users.append(Player(user["username"])) + + def removeUser(self, user:int): + self.__users.remove(user) + + def removeUser(self, user:str): + self.__users.remove(user) + + def getUsers(self) -> list: + return self.__users + + def getUser(self, user:int): + for user in self.__users: + if int(user["id"]) == user: + return user \ No newline at end of file diff --git a/OLD_Server/Classes/System/QueueManager.py b/OLD_Server/Classes/System/QueueManager.py new file mode 100644 index 0000000..be82662 --- /dev/null +++ b/OLD_Server/Classes/System/QueueManager.py @@ -0,0 +1,34 @@ + + +from Classes.Game.Player import Player + + +class QueueManager: + __queue:list + + def __init__(self): + self.__queue = [] + + def getQueue(self) -> list: + return self.__queue + + def addToQueue(self, user) -> list: + if self.isInQueue(user["id"]): + self.__queue.append(user) + return self.__queue + + def removeFromQueue(self, player:Player) -> list: + self.__queue.remove(player) + return self.__queue + + def isInQueue(self, user:int) -> bool: + for user in self.__queue: + if int(user["id"]) == user: + return True + return False + + def isInQueue(self, user:str) -> bool: + for user in self.__queue: + if user["username"] == user: + return True + return False \ No newline at end of file diff --git a/OLD_Server/Classes/System/Server.py b/OLD_Server/Classes/System/Server.py new file mode 100644 index 0000000..c3485db --- /dev/null +++ b/OLD_Server/Classes/System/Server.py @@ -0,0 +1,40 @@ +import json +import socket +import threading +from Classes.System.GameManager import GameManager + +from Classes.System.Network.NetworkManger import NetworkManager +from Classes.System.PlayerManager import Player +from Classes.System.World import World +from Classes.System.Logger import Logger + +class Server: + + __address:str + __tcpPort:str + __udpPort:str + __world:World + __gameManager:GameManager + + networkManager:NetworkManager + + def __init__(self, address:str, tcpPort:str, udpPort:str, logger:Logger): + self.__address = address + self.__tcpPort = tcpPort + self.__udpPort = udpPort + self.__world = World() + self.logger = logger + + self.logger.info("starting up game manager") + self.__gameManager = GameManager(logger) + + self.logger.info("preparing to start server") + self.startServer(self.__gameManager) + + # handles starting the server and assigning socket values to the local reference + def startServer(self, gameManager:GameManager): + self.logger.info("starting up network manager") + self.__networkManager = NetworkManager(self.__address, self.__tcpPort, self.__udpPort, gameManager) + + def getNetworkManager(self) -> NetworkManager: + return self.__networkManager \ No newline at end of file diff --git a/OLD_Server/Classes/System/Utils/Path.py b/OLD_Server/Classes/System/Utils/Path.py new file mode 100644 index 0000000..a274f43 --- /dev/null +++ b/OLD_Server/Classes/System/Utils/Path.py @@ -0,0 +1,6 @@ +import os + + +class PathUtil: + def getAbsolutePathTo(notAbsolutPath:str) -> str: + return os.path.abspath("OLD_Server/" + notAbsolutPath) \ No newline at end of file diff --git a/OLD_Server/Classes/System/Utils/StringUtils.py b/OLD_Server/Classes/System/Utils/StringUtils.py new file mode 100644 index 0000000..e4d02a1 --- /dev/null +++ b/OLD_Server/Classes/System/Utils/StringUtils.py @@ -0,0 +1,11 @@ +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/OLD_Server/Classes/System/Utils/__pycache__/Path.cpython-311.pyc b/OLD_Server/Classes/System/Utils/__pycache__/Path.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fdc48708a9a0efeecaa3c2f2094979ac589986c GIT binary patch literal 755 zcmZutL2DC16n--aZF7#4}h;rdR_i{%^Y0*N4%}NdjUQWU!fYc>u$j$+A#(XL~nbv7nW+8&<%!%W+aQP1=;@Yp7Pn|inqtXTpTW(rtqsqV(< zquL#@YPGS#I;}Uwg0?SQ+!o7GxDjc&Qd<=N1w}0ktkqUDwlKRTXjUs|!nyWVGV@fA zhSn5YiMvwBN-3mLBod*qErf(6WT)xY?QY!J_z@!H zAXvqdAh{^?6e~ICv4VpB2QB1K7CebiZ;^N?J^5z0*``!ycYg29`+jfcT__X;TpzwQ zs6qgK@I!a`j+xFRGIdZuAsS>{N-{)%1yF>ipok3tpo!aE89^awi1~i;W2$g0bx7By zGmghPP{p%GocO^ z((YRKEMH*ot!~<`+M%1mD#4VJ)psJULIXXUp7%U7P}%ehPHUeKtKU=M7^rjQ^x=nETfdY zqid>8<-3W6Y(i71ZXwAtMp^czUPMjSxsGhl)x=AWkNRhdRHu(h=4@rMS5>5z?3N@m z=Q86nno-DWY&PzB@cFT;2!{u705#a1NaDXk-Y&n%ZQt07Otm6YuB;b3=m3?GMW^4W z8$4>PMm4Gzt+k4%vgw%L4!88cV*pFGw088v^WY!TtG20w>KTf(^)1Ab)KHH4b?wFSR_ zd@J1sB>x3B77r5>O@5o^5C list: + return self.__players + + def addPlayers(self, player:Player, socket:socket, clientAddr) -> list: + self.__players[clientAddr] = { + player: player, + socket:socket + } + + return self.__players \ No newline at end of file diff --git a/OLD_Server/Classes/System/__pycache__/GameManager.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/GameManager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..240b40b8841b12e0e5578b9aebf0cee4eb50fb0f GIT binary patch literal 6395 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 literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/__pycache__/GameManager.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/GameManager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..963cabf859066f1de879a492cfec478ba7456afc GIT binary patch literal 4142 zcmb6cTWB2D_0I0hX!faf^jN($mQ>q=jUcXZ8%K5HTE=eWDsE-dS}0kTohx})t6BBV z$g(yoV@L`T7%YEDj$N#fLTp^9^VPHznvWC;{n17WS|%+RT1fr3kqj;FPtUotvoFh~ zy|DM5d(OG{o;mORb138|Ftom3(yzjV{0%qm5KF-BF#uMHPIMtn#+_9d7hvy6duF`j zUV(VXS)zO2Bf9v=|5X|tOJV3kmUcaD255$dI) zE(`&dN&tB{Bm?9vLn1=D^d1>+&}Envy#Z#Qu2BD^NB6xajt6u%SH%$yjr zD7`u{OwDO4GduC7kxm*kcJcJt2~?9hM%h)$CQhg0rb&T$!L;ZMCzbR$IJ;mgu~^bb zTCrHRxk|T#E;fkoYB1d(h4#)R@n*Qt+rK1kDP4uA3fo{I+Rc~NE?5EuCAbUBBvIB5 zY!K$U>;PaDbeDp)evFZa0(c|;(1!v8hbJZ;R9Pd;wr`4B=ebI%LOX4zuWLZ{*C zv*l8JIBw(UF*M6EQ;eGCkJ06`?bW)hA$7r}=36k`AVrx3Bin)Ae4uyz*yn+Rg^r&4 zgLejZh$nP(MJ_Z&x0?>;n+`rWzS;C@;qa>~!(TKXDoQ{sMu;!;%tr2YEc0qH<0bK60>8O#5A>PVh}aNZS_8U0VFw$B|tgDD#w`aadjl1 zZ9k)^!EMP=DaD4&bk5Vwq!w& z%9}zbt{Zh6=&E(Ym66|o7OxvFeNluLTIz_f&52M5qz+P%M3;dx`XZ-$6HxJ^>P8i{ zvyKGYDr)!3sd~dbX;I1vsoocPto<%7)#pN$H7B|9r@m3ax{&+2%OjARPchQ^iFLr` z8Gu+`l)=7-Tufz69j?GGq$@f3F8M{3UtNZrzbIdq1-RLP=7o83&3l>53z`pdI-4^L z$m!X@6lPv1GR!g=sxtWxaMY(5_O_3skwKGeiC(3KW&52Noq+;pD-L{R*2NmYYKvFm z5UBl=@no9ns+DmrSNS{o97POeEW=KyS}QLgwlvFi_>($wA<@yA}XZF_!S6n4k%~9C#KAdVN3el%&ck4)JSA>YWvPyOVC*>nK5`302SePX$?G^G4woJ z!LK-_>&zArvZX|v=^*HAd?B5Q>$X5mjCIu+rP9IGj)|_ebd=G9aKdbXXob?@6t%xA zp`{tDacy1qgLi`4ZCbuf+iW|$Lz;c9OXrH7rci4k+PNLo@=6bzOvE)iFRMdYWQ~eo^?Na zC;Q;wX7ADM-q-TIuWk0e{zYV{*bj0Sk3hox7o_9nZcN>+_-x>IU^}uuAKAY#aQ08a zr{+fA$X4Y1Um`6}l;FRMKHz$8wt;#+K0Pqp=J~A6cg8P$w!i0$B>hp60IsR6z~|&^ zOu?&em3l}Rug#bZOT}C(>0LpWgSMU zT)lw1G@!l-dsVO6OaxtpNB7)=E;EHM)s37Nn{S}i;c>g?n_dgsO+NO%(ao#1Qv9!{ zba5JTE<5snNL0@DyqX7G=_+fkDlhLX^BB?O(QGuqXdD}D6;p*epR}&1NgdLphZ~O# z!Z$pj{$I9oWOKE>uK+j~@XaK@>33ouVhCOZNY1^MjC!qvjHZ#$IFlRX#%MW?CHJ#q9`G-Tx5CTe zm26(==If&yC*Is>zp$nJ=ovJAjZ4-o@cYd`&-(t)1O0_y zr>s=Kkqgo^W!N58ei`o8IY$l`6r4bIs zVn3UUr%MzORc<%NVsXRBz#lZwz8Q-#3=-RGT8u>iV%Xs@jC5`~u2pslw-~}~1gAG} z!cK}Sl40596NU=!W`9l!;aA=rEi`v*iXDYu{I_x4nR97NnlF;avht(I1w2*5x9B<-t|He5yago%1q23jgYk;oInAc2nse*dQjE zLC3KC+Z_4cK*qAn&y^uZNhjGD5HQ1;_{~MHAP8TQz?UTSS90K=a$FF4b_mY=?0*0% CA$EWO literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/__pycache__/Logger.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/Logger.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dc2efc75de4596d9c47dfe4c615a38a80afac96 GIT binary patch literal 1309 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 A5&!@I literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/__pycache__/Server.cpython-311.pyc b/OLD_Server/Classes/System/__pycache__/Server.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c11ea7f48ed176cc115e364215a5d9a6efa9036 GIT binary patch literal 2529 zcma)8O=#mr6duX4Jn>(CH-8%!ElsyE-Da0IX`n3ILrVA3qzh?UFa}|wN$NzF(~+_v z!Gsh-*~4B6h23KgB~3}8*FCh*V-G#Z#jr*Y2=vsOOM2Q<-y2!7<)qN@=)G^=n|U*O z@6D6H&t#GW+Ume}?6o){f8ro$N*i1{0G<(p7?Mc}K9>rT7|R72xNOEMNDn28E4P=VuSUnN;c3apx`O1hAih)f<5BXL9wdLk2Y29Mtg8ADnj`M$q!xSW@~ z)WcGREtRa&2IDZyE;DDh%C|Za^^sZH6T0~4Rc;zEN&UFG0n^voHU*>Y!DS7=Gr|bI zM?qdCEXEW=x(`x;=CWF%P3pz!p;lVo(A8mS|t&}XEXx-J_T zz)2&^5`g;wr;Gu3w?R)`Vf-=U-hl1{T`w61XSUrXan`mURk_n8*)e=cHe3acFb!`c z9B*`7+b& z)*SbBtalLD3hnl;F$jb4;E^$;jRZUFOY>^20 zB*)9hQ%KTC&E`GZu+#-jKTW-)ri{WSncZ?Xy8Z^vPh1rp@fBw(1b1lOZA(ExYSyeqM5(h11V zx^#M&>LPjM<^7x8$<_i0*p*SQ<3ucP5XkNby;r9T4Z7gcg>!B8)cNt?h4b^lZ_e)ruD)5y@gpVVI#3Pe zTm^ew$z2TJauw`#x&Ww5yh<+SRo!=6HS17o3$0sBYe5yLim{#bXxhO8a{)YM3|OGoc;R z*-mWX>n$AYP4!ImKlXt&yn^0H&lK@5Km^LW(WCPJ7jO|Z5t`dzpcAfF^uC`A5BObB zVCLCB0cph~NotbRq4+gP=1}~aWWWu2lf2_b`vv*HjrJzF>qdK%+;*eANoL$=Zz(wm QB65}djk15PQHU4%7rk?0IRF3v literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/__pycache__/Server.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/Server.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7700f6370bb88b162f56b69c89b85f4ae5dd62b3 GIT binary patch literal 2281 zcmb7FPiP!f7=JT6J3IS7|C(getV}VjU8<>QsvxBvBIaUaAy#2o8J5gT+|BIF`exFy z%d!Yoh#+|I&>lSW;2|Xkul1xy#e)q=Nth%M5D(shD+oRLeecceKlR{)`M%%x=Y4PH z`}5}KbUHy`E#$wU&qWFO6@_pq0q9r&?h})kl0}MwOGSyxa#02@TalVlR3x-TtY}Rw zsvIj;tfmz;j-yt*mMA7TR;^?$RZK}lCQHPO-6N*9Ba73D>4sE@|Bk|PLGqJJ(?yliN1DWMjkhUF#yBdQ$kmvGm37`MkkJJORv z)Z5h{g~)Pq+V#rJtJv%MW?jc3=rz%<&0L+)dYPfgb9C;eyS(^?1jBDDNXC%hMiMQqYg-kY8t*MGm2kFn5wx^um0g#DbHnv$tt7Pb^@gt*M#ZjphSAIh%206* z543@NLJo8KmhwerkR4CWesversl&-xV98T0^=0z&5~ySXb*wHG^ZB4nhm-&ea02o}sFZ{Du~K=YC+@ZnWO zkD)ctX8mo75r-B;?Y3Oc1loUT>6Ww;i~uxhHx@LHyxctB-#o$4hW%5B@scu3Gs6f& zJ>ySxXMb?q3o@HR_wztpOpUIyX;e%CX^sU|?CYrK(eWA(DCA&`Ufb7RKi22By>Hu( z+K;{O+uyZ+^nPjo)P7=A_wJ47{&FSC^{$Y6m_u{<3cVx#8vU9uHxhL8jf5GKK3R~HRmNyJP zVHh>X+_Vs<4CCX?vK3e&uE+c=T*|iXcxA8R*sfuS@x)INg}`f$<&a=XnGWO;;m3$X z$5D#}2i*M-$Y%w=C*ygAjIUH($M#j%S>2$XANM|Dv~0p1GujvoCGZs_H`oVmcJtPdeYeNAI4D_Oa5ee)n5(ja=s$fmQ?<76lg8AU)jd%b>C20 z+}KWYoQH9kaK2N_d?)7|X3+(NCUh=c-ggd)`?z}OfYehm*;MhFN{E%IWD<=Q*71U_ z8mWMye^a9bG~cWQHI8PQe=d`37>mWz9@I-Kee0 zq;~Q)Fa~5BCO6PPCJdLgYlYS@r(K)oIqVr`S#lJmR#ODi2x-0+g)&a=386G4m`CXs z5D0OufPsg|>gxzi_&z>$_@IMutLxeedFtrl&bQpPZXPCQ2BnotV>FZ)XUBP(=e*t! zn-SULoWI-*qJG2?VJ*SO#e+C*Bta53V$HdtiKR{y>O@^YQ&A&K1?nPNZ7}UK#Fa}S z0@_+3G>2BFIMpmS%dg8_hq+g}a0(uC=iaQ4W9~e7o;&x>>jJ8eTSk2mM*SBuIz#|l zZW=w^f2oV~dKa_CW>pxzvv_q-!*OmYYtJ2Z6$A7J^<#vt%^2%Ip=nkJ7LLyTy50ms P_J6}K^8Nltz~uY`cWn-( literal 0 HcmV?d00001 diff --git a/OLD_Server/Classes/System/__pycache__/World.cpython-312.pyc b/OLD_Server/Classes/System/__pycache__/World.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e42711557ed5fe8ba39f429614f0fef67e571807 GIT binary patch literal 1078 zcmZuvJ!lj`6n?XR*<5m$n5f`SVz3AvND2!J2~kNj-6_N%EDOVOGm$lWdvRtHxDZ0X z2uUGHcUEHQVQ+13qg_}L1S`8ECkUy0Z};*`X4yCIZ)U#lz4x_PEC8JXiGODZMH50;1AY{2K#NscOcAUWOD!#<1x=^N4jxV4^XIix z+Mi3LT=8e5UQFss{*yQgW67UQ&-$}LO^(e;wIY>29R*rTOm65z*8B|6#8M-5IS=D7 z;e54}`wndvU(vlNHem0{wJqyyse=Zjj*`i;icfJML>Y&xs5FtmOG-Vn=0MS%itbd@ z*_?>#M>Q?HkV)PSy*ii!Irj8XGNmDuf#IF??e%Z&h$_)JCogI0=z4WgCe_2az!;F8 zp?ZJ{qGI?NYes0Ck8jPS?w%hziM?zo0;H&4Y8XXYs79fTlZQemO^=S@>e32?I792$ zLj?3K6dUlXe`xpd9*Vnd+Z-=!Sv#fe((dYa_h!2QgBMRyu9W+zX)*Se^R&QutuB@$ z()&4owH!p&m{x?CWiZ*`x1fI)Gc-aqQ6#P8)FhxRPyO#9y-V>*xY3TUM;$?j%mo xbWY^O$x&qQjbQ3Ah68spr#Gc;V1VXKUqaC~8Dl@7_!GweIRk8TA5dh+{sVUm?y&#> literal 0 HcmV?d00001 diff --git a/OLD_Server/index.py b/OLD_Server/index.py new file mode 100644 index 0000000..27fd861 --- /dev/null +++ b/OLD_Server/index.py @@ -0,0 +1,31 @@ +import logging +import os +import random +import string +import sys + +from Classes.System.Server import Server +from Classes.System.Logger import Logger +from Classes.System.Utils.Path import PathUtil + +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 + +def main(): + # retrieves host data from environment + HOST = "127.0.0.1" + TCPPORT = "54322" + UDPPORT = "54323" + + logger = Logger(PathUtil.getAbsolutePathTo("log/"+get_random_string(8)+".log")) + logger.info("starting up server") + server = Server(HOST, TCPPORT, UDPPORT, logging) + server.getNetworkManager().tcp.stop() + sys.exit(0) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/OLD_Server/log/jopxlbza.log b/OLD_Server/log/jopxlbza.log new file mode 100644 index 0000000..c904742 --- /dev/null +++ b/OLD_Server/log/jopxlbza.log @@ -0,0 +1,28 @@ +21:35:45,88 root INFO starting up server +21:35:45,89 root INFO starting up game manager +21:35:45,89 root INFO preparing to start server +21:35:45,89 root INFO starting up network manager +21:35:45,89 root INFO starting up network manager +21:35:45,89 root INFO starting up tcp server +21:35:45,89 root INFO starting up thread for client socket accepting +21:35:51,856 root INFO Connected with ('127.0.0.1', 49747) +21:35:51,856 root INFO starting client handler thread for client at address ('127.0.0.1', 49747) +21:35:51,859 root INFO decoded message {'event': 'login', '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]} +21:35:51,860 root INFO user in message None +21:35:51,861 root INFO user logging in +21:35:51,861 root INFO task passed off to gameManager +21:35:51,861 root INFO creating user with id: > +21:35:56,111 root INFO new length of user dictionary: 1 +21:36:08,506 root INFO connected users 1 +21:36:08,506 root INFO confirming login for user +21:36:08,507 root INFO incommingevent {'event': 'login', '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]} +21:36:08,507 root INFO Received message from ('127.0.0.1', 49747): {"event": "login", "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]} +21:37:40,56 root INFO Connected with ('127.0.0.1', 49795) +21:37:40,56 root INFO starting client handler thread for client at address ('127.0.0.1', 49795) +21:37:40,57 root INFO decoded message {'event': 'login', '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]} +21:37:40,58 root INFO user in message None +21:37:40,58 root INFO user logging in +21:37:40,58 root INFO task passed off to gameManager +21:37:40,58 root INFO creating user with id: > +21:37:43,614 root INFO new length of user dictionary: 2 +21:37:50,2 root INFO 2 players have join game starts diff --git a/OLD_Server/log/jsrrepta.log b/OLD_Server/log/jsrrepta.log new file mode 100644 index 0000000..62fc73f --- /dev/null +++ b/OLD_Server/log/jsrrepta.log @@ -0,0 +1,28 @@ +21:02:55,541 root INFO starting up server +21:02:55,542 root INFO starting up game manager +21:02:55,542 root INFO preparing to start server +21:02:55,542 root INFO starting up network manager +21:02:55,543 root INFO starting up network manager +21:02:55,543 root INFO starting up tcp server +21:02:55,543 root INFO starting up thread for client socket accepting +21:03:03,608 root INFO Connected with ('127.0.0.1', 65384) +21:03:03,609 root INFO starting client handler thread for client at address ('127.0.0.1', 65384) +21:03:03,610 root INFO decoded message {'event': 'login', '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]} +21:03:03,613 root INFO user in message None +21:03:03,613 root INFO user logging in +21:03:03,613 root INFO task passed off to gameManager +21:03:03,613 root INFO creating user with id: > +21:03:03,613 root INFO new length of user dictionary: 1 +21:03:03,613 root INFO connected users 1 +21:03:03,613 root INFO confirming login for user +21:03:03,614 root INFO incommingevent {'event': 'login', '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]} +21:03:03,614 root INFO Received message from ('127.0.0.1', 65384): {"event": "login", "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]} +21:03:21,850 root INFO Connected with ('127.0.0.1', 65399) +21:03:21,850 root INFO starting client handler thread for client at address ('127.0.0.1', 65399) +21:03:21,852 root INFO decoded message {'event': 'login', '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]} +21:03:21,852 root INFO user in message None +21:03:21,852 root INFO user logging in +21:03:21,852 root INFO task passed off to gameManager +21:03:21,852 root INFO creating user with id: > +21:03:21,852 root INFO new length of user dictionary: 2 +21:03:21,852 root INFO 2 players have join game starts diff --git a/OLD_Server/log/kawhnrji.log b/OLD_Server/log/kawhnrji.log new file mode 100644 index 0000000..8a5fbfd --- /dev/null +++ b/OLD_Server/log/kawhnrji.log @@ -0,0 +1,32 @@ +22:18:28,492 root INFO starting up server +22:18:28,493 root INFO starting up game manager +22:18:28,493 root INFO preparing to start server +22:18:28,493 root INFO starting up network manager +22:18:28,493 root INFO starting up network manager +22:18:28,493 root INFO starting up tcp server +22:18:28,493 root INFO starting up thread for client socket accepting +22:18:33,537 root INFO Connected with ('127.0.0.1', 50893) +22:18:33,537 root INFO starting client handler thread for client at address ('127.0.0.1', 50893) +22:18:33,539 root INFO decoded message {'event': 'login', '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]} +22:18:33,540 root INFO user in message None +22:18:36,99 root INFO user logging in +22:18:36,131 root INFO task passed off to gameManager +22:18:36,195 root INFO creating user with id: > +22:18:36,427 root INFO new length of user dictionary: 1 +22:18:36,454 root INFO connected users 1 +22:18:36,467 root INFO confirming login for user +22:18:37,23 root INFO incommingevent {'event': 'login', '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]} +22:18:37,87 root INFO Received message from ('127.0.0.1', 50893): {"event": "login", "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]} +22:18:42,538 root INFO Connected with ('127.0.0.1', 50897) +22:18:42,538 root INFO starting client handler thread for client at address ('127.0.0.1', 50897) +22:18:42,540 root INFO decoded message {'event': 'login', '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]} +22:18:42,540 root INFO user in message None +22:18:44,273 root INFO user logging in +22:18:44,305 root INFO task passed off to gameManager +22:18:44,369 root INFO creating user with id: > +22:18:44,475 root INFO new length of user dictionary: 2 +22:18:45,389 root INFO 2 players have join game starts +22:18:47,378 root INFO connected users 2 +22:18:47,410 root INFO confirming login for user +22:18:47,948 root INFO incommingevent {'event': 'login', '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]} +22:18:48,11 root INFO Received message from ('127.0.0.1', 50897): {"event": "login", "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]} diff --git a/OLD_Server/log/olchcxfi.log b/OLD_Server/log/olchcxfi.log new file mode 100644 index 0000000..119245f --- /dev/null +++ b/OLD_Server/log/olchcxfi.log @@ -0,0 +1,33 @@ +22:30:19,522 root INFO starting up server +22:30:19,523 root INFO starting up game manager +22:30:19,523 root INFO preparing to start server +22:30:19,523 root INFO starting up network manager +22:30:19,523 root INFO starting up network manager +22:30:19,523 root INFO starting up tcp server +22:30:19,523 root INFO starting up thread for client socket accepting +22:30:25,764 root INFO Connected with ('127.0.0.1', 51190) +22:30:25,765 root INFO starting client handler thread for client at address ('127.0.0.1', 51190) +22:30:25,767 root INFO decoded message {'event': 'login', '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]} +22:30:25,769 root INFO user in message None +22:30:28,438 root INFO user logging in +22:30:28,469 root INFO task passed off to gameManager +22:30:28,531 root INFO creating user with id: > +22:30:28,679 root INFO new length of user dictionary: 1 +22:30:28,898 root INFO connected users 1 +22:30:28,910 root INFO confirming login for user +22:30:29,365 root INFO incommingevent {'event': 'login', '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]} +22:30:29,397 root INFO Received message from ('127.0.0.1', 51190): {"event": "login", "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]} +22:30:35,73 root INFO Connected with ('127.0.0.1', 51194) +22:30:35,73 root INFO starting client handler thread for client at address ('127.0.0.1', 51194) +22:30:35,75 root INFO decoded message {'event': 'login', '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]} +22:30:35,75 root INFO user in message None +22:30:35,940 root INFO user logging in +22:30:35,982 root INFO task passed off to gameManager +22:30:36,3 root INFO creating user with id: > +22:30:36,98 root INFO new length of user dictionary: 2 +22:30:36,277 root INFO 2 players have join game starts +22:30:36,468 root INFO game manager is starting the game +22:30:36,805 root INFO connected users 2 +22:30:36,817 root INFO confirming login for user +22:30:42,749 root INFO incommingevent {'event': 'login', '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]} +22:30:42,781 root INFO Received message from ('127.0.0.1', 51194): {"event": "login", "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]} diff --git a/OLD_Server/log/ploaokwx.log b/OLD_Server/log/ploaokwx.log new file mode 100644 index 0000000..a6fdccd --- /dev/null +++ b/OLD_Server/log/ploaokwx.log @@ -0,0 +1,59 @@ +22:53:50,717 root INFO starting up server +22:53:50,718 root INFO starting up game manager +22:53:50,718 root INFO preparing to start server +22:53:50,718 root INFO starting up network manager +22:53:50,718 root INFO starting up network manager +22:53:50,718 root INFO starting up tcp server +22:53:50,719 root INFO starting up thread for client socket accepting +22:53:57,759 root INFO Connected with ('127.0.0.1', 51806) +22:53:57,759 root INFO starting client handler thread for client at address ('127.0.0.1', 51806) +22:53:57,761 root INFO decoded message {'event': 'login', '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]} +22:53:57,764 root INFO user in message None +22:53:58,552 root INFO user logging in +22:53:58,584 root INFO task passed off to gameManager +22:53:58,657 root INFO creating user with id: > +22:53:58,751 root INFO new length of user dictionary: 1 +22:53:58,980 root INFO connected users 1 +22:53:59,2 root INFO confirming login for user +22:53:59,505 root INFO incommingevent {'event': 'login', '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]} +22:53:59,516 root INFO Received message from ('127.0.0.1', 51806): {"event": "login", "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]} +22:54:02,832 root INFO Connected with ('127.0.0.1', 51810) +22:54:02,832 root INFO starting client handler thread for client at address ('127.0.0.1', 51810) +22:54:02,832 root INFO decoded message {'event': 'login', '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]} +22:54:02,834 root INFO user in message None +22:54:03,426 root INFO user logging in +22:54:03,448 root INFO task passed off to gameManager +22:54:03,480 root INFO creating user with id: > +22:54:03,586 root INFO new length of user dictionary: 2 +22:54:03,818 root INFO 2 players have join game starts +22:54:03,923 root INFO game manager is starting the game +22:54:04,230 root INFO connected users 2 +22:54:04,262 root INFO confirming login for user +22:54:04,741 root INFO incommingevent {'event': 'login', '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]} +22:54:04,774 root INFO Received message from ('127.0.0.1', 51810): {"event": "login", "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]} +23:01:35,624 root INFO Connected with ('127.0.0.1', 51984) +23:01:35,624 root INFO starting client handler thread for client at address ('127.0.0.1', 51984) +23:01:35,625 root ERROR Connection with ('127.0.0.1', 51806) forcibly closed by remote host. +23:01:35,625 root ERROR Connection with ('127.0.0.1', 51810) forcibly closed by remote host. +23:01:36,21 root INFO decoded message {'event': 'login', '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]} +23:01:36,22 root INFO user in message None +23:01:36,637 root INFO user logging in +23:01:36,700 root INFO task passed off to gameManager +23:01:36,762 root INFO creating user with id: > +23:01:36,975 root INFO new length of user dictionary: 3 +23:01:37,228 root INFO connected users 3 +23:01:37,312 root INFO confirming login for user +23:01:37,756 root INFO incommingevent {'event': 'login', '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]} +23:01:37,852 root INFO Received message from ('127.0.0.1', 51984): {"event": "login", "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]} +23:01:41,725 root INFO Connected with ('127.0.0.1', 51989) +23:01:41,725 root INFO starting client handler thread for client at address ('127.0.0.1', 51989) +23:01:41,727 root INFO decoded message {'event': 'login', '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]} +23:01:41,727 root INFO user in message None +23:01:42,769 root INFO user logging in +23:01:42,801 root INFO task passed off to gameManager +23:01:42,853 root INFO creating user with id: > +23:01:43,191 root INFO new length of user dictionary: 4 +23:01:43,244 root INFO connected users 4 +23:01:43,349 root INFO confirming login for user +23:01:43,822 root INFO incommingevent {'event': 'login', '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]} +23:01:43,843 root INFO Received message from ('127.0.0.1', 51989): {"event": "login", "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]} diff --git a/OLD_Server/log/tmqifhet.log b/OLD_Server/log/tmqifhet.log new file mode 100644 index 0000000..f6bd341 --- /dev/null +++ b/OLD_Server/log/tmqifhet.log @@ -0,0 +1,23 @@ +22:17:17,848 root INFO starting up server +22:17:17,849 root INFO starting up game manager +22:17:17,849 root INFO preparing to start server +22:17:17,849 root INFO starting up network manager +22:17:17,849 root INFO starting up network manager +22:17:17,849 root INFO starting up tcp server +22:17:17,849 root INFO starting up thread for client socket accepting +22:17:23,920 root INFO Connected with ('127.0.0.1', 50854) +22:17:23,921 root INFO starting client handler thread for client at address ('127.0.0.1', 50854) +22:17:23,923 root INFO decoded message {'event': 'login', '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]} +22:17:23,923 root INFO user in message None +22:17:26,307 root INFO user logging in +22:17:26,339 root INFO task passed off to gameManager +22:17:26,370 root INFO creating user with id: > +22:17:26,466 root INFO new length of user dictionary: 1 +22:17:26,654 root INFO connected users 1 +22:17:26,665 root INFO confirming login for user +22:17:27,185 root INFO incommingevent {'event': 'login', '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]} +22:17:27,239 root INFO Received message from ('127.0.0.1', 50854): {"event": "login", "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]} +22:17:35,108 root INFO Connected with ('127.0.0.1', 50858) +22:17:35,109 root INFO starting client handler thread for client at address ('127.0.0.1', 50858) +22:17:35,110 root INFO decoded message {'event': 'login', '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]} +22:17:35,110 root INFO user in message None diff --git a/OLD_Server/log/usujxxks.log b/OLD_Server/log/usujxxks.log new file mode 100644 index 0000000..61d04d6 --- /dev/null +++ b/OLD_Server/log/usujxxks.log @@ -0,0 +1,7 @@ +22:18:11,454 root INFO starting up server +22:18:11,455 root INFO starting up game manager +22:18:11,455 root INFO preparing to start server +22:18:11,455 root INFO starting up network manager +22:18:11,456 root INFO starting up network manager +22:18:11,456 root INFO starting up tcp server +22:18:11,457 root INFO starting up thread for client socket accepting diff --git a/OLD_Server/log/votjjlwn.log b/OLD_Server/log/votjjlwn.log new file mode 100644 index 0000000..fa08189 --- /dev/null +++ b/OLD_Server/log/votjjlwn.log @@ -0,0 +1,35 @@ +21:49:14,507 root INFO starting up server +21:49:14,507 root INFO starting up game manager +21:49:14,507 root INFO preparing to start server +21:49:14,507 root INFO starting up network manager +21:49:14,507 root INFO starting up network manager +21:49:14,507 root INFO starting up tcp server +21:49:14,509 root INFO starting up thread for client socket accepting +21:49:17,561 root INFO Connected with ('127.0.0.1', 50136) +21:49:17,561 root INFO starting client handler thread for client at address ('127.0.0.1', 50136) +21:49:17,562 root INFO decoded message {'event': 'login', '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]} +21:49:17,562 root INFO user in message None +21:49:20,150 root INFO user logging in +21:49:20,182 root INFO task passed off to gameManager +21:49:20,214 root INFO creating user with id: > +21:49:20,319 root INFO new length of user dictionary: 1 +21:49:20,508 root INFO connected users 1 +21:49:20,539 root INFO confirming login for user +21:49:21,932 root INFO incommingevent {'event': 'login', '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]} +21:49:21,995 root INFO Received message from ('127.0.0.1', 50136): {"event": "login", "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]} +21:49:28,5 root INFO Connected with ('127.0.0.1', 50140) +21:49:28,5 root INFO starting client handler thread for client at address ('127.0.0.1', 50140) +21:49:28,6 root INFO decoded message {'event': 'login', '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]} +21:49:28,7 root INFO user in message None +21:49:28,943 root INFO user logging in +21:49:28,975 root INFO task passed off to gameManager +21:49:29,39 root INFO creating user with id: > +21:49:29,153 root INFO new length of user dictionary: 2 +21:49:29,375 root INFO 2 players have join game starts +21:50:40,445 root INFO connected users 2 +21:51:12,743 root INFO confirming login for user +21:51:14,842 root INFO incommingevent {'event': 'login', '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]} +21:51:15,515 root INFO Received message from ('127.0.0.1', 50140): {"event": "login", "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]} +21:51:22,712 root INFO decoded message {'event': 'placecard', 'card': 1, 'type': 'Monster', 'user': 35452, 'x': 1114.0, 'y': 599.0} +21:51:22,712 root INFO user in message 35452 +21:51:28,960 root INFO incommingevent {'event': 'placecard', 'card': 1, 'type': 'Monster', 'user': 35452, 'x': 1114.0, 'y': 599.0} diff --git a/OLD_Server/log/wdqxolbm.log b/OLD_Server/log/wdqxolbm.log new file mode 100644 index 0000000..ad78473 --- /dev/null +++ b/OLD_Server/log/wdqxolbm.log @@ -0,0 +1,47 @@ +22:46:35,887 root INFO starting up server +22:46:35,888 root INFO starting up game manager +22:46:35,888 root INFO preparing to start server +22:46:35,888 root INFO starting up network manager +22:46:35,889 root INFO starting up network manager +22:46:35,889 root INFO starting up tcp server +22:46:35,890 root INFO starting up thread for client socket accepting +22:46:43,643 root INFO Connected with ('127.0.0.1', 51606) +22:46:43,643 root INFO starting client handler thread for client at address ('127.0.0.1', 51606) +22:46:43,645 root INFO decoded message {'event': 'login', '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]} +22:46:43,649 root INFO user in message None +22:46:45,928 root INFO user logging in +22:46:45,961 root INFO task passed off to gameManager +22:46:45,994 root INFO creating user with id: > +22:46:46,152 root INFO new length of user dictionary: 1 +22:46:46,427 root INFO connected users 1 +22:46:46,461 root INFO confirming login for user +22:46:47,23 root INFO incommingevent {'event': 'login', '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]} +22:46:47,87 root INFO Received message from ('127.0.0.1', 51606): {"event": "login", "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]} +22:46:54,634 root INFO Connected with ('127.0.0.1', 51611) +22:46:54,634 root INFO starting client handler thread for client at address ('127.0.0.1', 51611) +22:46:54,636 root INFO decoded message {'event': 'login', '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]} +22:46:54,636 root INFO user in message None +22:46:55,649 root INFO user logging in +22:46:55,670 root INFO task passed off to gameManager +22:46:55,753 root INFO creating user with id: > +22:46:55,912 root INFO new length of user dictionary: 2 +22:46:56,217 root INFO 2 players have join game starts +22:46:56,281 root INFO game manager is starting the game +22:46:56,639 root INFO connected users 2 +22:46:56,744 root INFO confirming login for user +22:46:57,245 root INFO incommingevent {'event': 'login', '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]} +22:46:57,267 root INFO Received message from ('127.0.0.1', 51611): {"event": "login", "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]} +22:51:59,765 root ERROR Connection with ('127.0.0.1', 51611) forcibly closed by remote host. +22:52:04,500 root ERROR Connection with ('127.0.0.1', 51606) forcibly closed by remote host. +22:52:08,317 root INFO Connected with ('127.0.0.1', 51743) +22:52:08,317 root INFO starting client handler thread for client at address ('127.0.0.1', 51743) +22:52:08,318 root INFO decoded message {'event': 'login', '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]} +22:52:08,319 root INFO user in message None +22:52:10,75 root INFO user logging in +22:52:10,140 root INFO task passed off to gameManager +22:52:10,203 root INFO creating user with id: > +22:52:11,567 root INFO new length of user dictionary: 3 +22:52:11,673 root INFO connected users 3 +22:52:11,684 root INFO confirming login for user +22:52:12,84 root INFO incommingevent {'event': 'login', '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]} +22:52:12,95 root INFO Received message from ('127.0.0.1', 51743): {"event": "login", "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]} diff --git a/OLD_Server/log/yxojocbd.log b/OLD_Server/log/yxojocbd.log new file mode 100644 index 0000000..59118dd --- /dev/null +++ b/OLD_Server/log/yxojocbd.log @@ -0,0 +1,33 @@ +22:52:35,47 root INFO starting up server +22:52:35,47 root INFO starting up game manager +22:52:35,47 root INFO preparing to start server +22:52:35,48 root INFO starting up network manager +22:52:35,48 root INFO starting up network manager +22:52:35,48 root INFO starting up tcp server +22:52:35,48 root INFO starting up thread for client socket accepting +22:52:39,563 root INFO Connected with ('127.0.0.1', 51765) +22:52:39,563 root INFO starting client handler thread for client at address ('127.0.0.1', 51765) +22:52:39,564 root INFO decoded message {'event': 'login', '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]} +22:52:39,566 root INFO user in message None +22:52:40,945 root INFO user logging in +22:52:40,976 root INFO task passed off to gameManager +22:52:41,8 root INFO creating user with id: > +22:52:41,125 root INFO new length of user dictionary: 1 +22:52:41,303 root INFO connected users 1 +22:52:41,324 root INFO confirming login for user +22:52:41,819 root INFO incommingevent {'event': 'login', '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]} +22:52:41,851 root INFO Received message from ('127.0.0.1', 51765): {"event": "login", "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]} +22:52:45,441 root INFO Connected with ('127.0.0.1', 51768) +22:52:45,441 root INFO starting client handler thread for client at address ('127.0.0.1', 51768) +22:52:45,442 root INFO decoded message {'event': 'login', '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]} +22:52:45,443 root INFO user in message None +22:52:46,369 root INFO user logging in +22:52:46,401 root INFO task passed off to gameManager +22:52:46,453 root INFO creating user with id: > +22:52:46,549 root INFO new length of user dictionary: 2 +22:52:46,783 root INFO 2 players have join game starts +22:52:46,867 root INFO game manager is starting the game +22:52:47,205 root INFO connected users 2 +22:52:47,216 root INFO confirming login for user +22:52:47,857 root INFO incommingevent {'event': 'login', '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]} +22:52:47,868 root INFO Received message from ('127.0.0.1', 51768): {"event": "login", "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]} diff --git a/OLD_Server/server logic notes.md b/OLD_Server/server logic notes.md new file mode 100644 index 0000000..7370d4a --- /dev/null +++ b/OLD_Server/server logic notes.md @@ -0,0 +1,42 @@ +# 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