diff --git a/PyGame/LICENSE b/PyGame/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/PyGame/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/PyGame/README.md b/PyGame/README.md new file mode 100644 index 0000000..1f3049b --- /dev/null +++ b/PyGame/README.md @@ -0,0 +1,46 @@ + +# Pneuma: Reinforcement Learning Platform + +## Introduction + +Pneuma is a Reinforcement Learning platform created as part of a thesis project. It is developed using PyGame and offers a customizable environment for testing and implementing reinforcement learning algorithms. + +## Installation + +To install Pneuma, clone this repository and install the requirements (`requirements.txt`) + +After cloning, you can edit the agents, create your own, and modify pneuma.py (the main file). Additionally, consider editing player.setup_agent() for further customization. +Note + +- [] TODO: Separate the update logic from the network logic inside the player. + +## Usage + +To run Pneuma, use the command-line interface with the following options: + +- `--no_seed`: If set to True, runs the program without a seed. Default is False. +- `--seed [int]`: Specifies the seed for the random number generator. Default is 1. +- `--n_episodes [int]`: Defines the number of episodes. Default is 300. +- `--ep_length [int]`: Sets the length of each episode. Default is 5000. +- `--n_players [int]`: Number of players. Default is 1. +- `--chkpt_path [str]`: Path for saving/loading agent models. Default is "agents/saved_models". +- `--figure_path [str]`: Path for saving figures. Default is "figures". +- `--horizon [int]`: Number of steps per update. Default is 200. +- `--show_pg`: If True, opens a PyGame window on the desktop. Default is False. +- `--no_load`: If True, ignores saved models. Default is False. +- `--gamma [float]`: The gamma parameter for PPO. Default is 0.99. +- `--alpha [float]`: The alpha parameter for PPO. Default is 0.0003. +- `--policy_clip [float]`: The policy clip. Default is 0.2. +- `--batch_size [int]`: Size of each batch. Default is 64. +- `--n_epochs [int]`: Number of epochs. Default is 10. +- `--gae_lambda [float]`: The lambda parameter of the GAE. Default is 0.95. + +### Example Command + +```bash +$ python pneuma.py --seed 42 --n_episodes 300 --ep_length 5000 --n_players 2 --no_load +``` + +## License + +Pneuma is licensed under the Mozilla Public License 2.0. \ No newline at end of file diff --git a/PyGame/__init__.py b/PyGame/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/args.py b/PyGame/args.py new file mode 100644 index 0000000..53fde64 --- /dev/null +++ b/PyGame/args.py @@ -0,0 +1,96 @@ +import argparse +from utils.hyperparams import HPARAMS + + +def parse_args(): + + parser = argparse.ArgumentParser( + prog='Pneuma', + description='A Reinforcement Learning platform made with PyGame' + ) + + # Define seed + parser.add_argument('--no_seed', + default=False, + action="store_true", + help="Set to run without a seed.") + + parser.add_argument('--seed', + type=int, + default=1, + help="The seed for the RNG.") + + # Define episodes and agents + parser.add_argument('--n_episodes', + type=int, + default=12000, + help="Number of episodes.") + + parser.add_argument('--ep_length', + type=int, + default=700, + help="Length of each episode.") + + parser.add_argument('--n_agents', + type=int, + default=1, + help="Number of agents.") + + # Define hyperparameters + parser.add_argument('--horizon', + type=int, + default=HPARAMS["horizon"], + help="The number of steps per update") + + parser.add_argument('--gamma', + type=float, + default=HPARAMS["discount_factor"], + help="The discount factor for PPO") + + parser.add_argument('--entropy_coeff', + type=float, + default=HPARAMS["entropy_coeff"], + help="The entropy coefficient") + + parser.add_argument('--alpha', + type=float, + default=HPARAMS["learning_rate"], + help="The learning_rate for PPO") + + parser.add_argument('--policy_clip', + type=float, + default=HPARAMS["policy_clip"], + help="The policy clip for PPO") + + parser.add_argument('--batch_size', + type=int, + default=HPARAMS["batch_size"], + help="The size of each batch") + + parser.add_argument('--n_epochs', + type=int, + default=HPARAMS["num_epochs"], + help="The number of epochs") + + parser.add_argument('--gae_lambda', + type=float, + default=HPARAMS["GAE_lambda"], + help="The lambda parameter of the GAE") + + # Misc + parser.add_argument('--no_training', + default=False, + action="store_true", + help="Set flag to disable learning. Useful for viewing trained agents interact in the environment.") + + parser.add_argument('--load', + type=int, + default=None, + help="Run id to load within chkpt_path") + + parser.add_argument('--show_pg', + default=False, + action="store_true", + help="Set flag to open a PyGame window on desktop") + + return parser.parse_args() diff --git a/PyGame/assets/font/joystix.ttf b/PyGame/assets/font/joystix.ttf new file mode 100644 index 0000000..5fd36a5 Binary files /dev/null and b/PyGame/assets/font/joystix.ttf differ diff --git a/PyGame/assets/graphics/grass/grass_1.png b/PyGame/assets/graphics/grass/grass_1.png new file mode 100644 index 0000000..e59c1d4 Binary files /dev/null and b/PyGame/assets/graphics/grass/grass_1.png differ diff --git a/PyGame/assets/graphics/grass/grass_2.png b/PyGame/assets/graphics/grass/grass_2.png new file mode 100644 index 0000000..74c656a Binary files /dev/null and b/PyGame/assets/graphics/grass/grass_2.png differ diff --git a/PyGame/assets/graphics/grass/grass_3.png b/PyGame/assets/graphics/grass/grass_3.png new file mode 100644 index 0000000..da65a05 Binary files /dev/null and b/PyGame/assets/graphics/grass/grass_3.png differ diff --git a/PyGame/assets/graphics/icon.png b/PyGame/assets/graphics/icon.png new file mode 100644 index 0000000..ad7de97 Binary files /dev/null and b/PyGame/assets/graphics/icon.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/attack/0.png b/PyGame/assets/graphics/monsters/bamboo/attack/0.png new file mode 100644 index 0000000..c14d75b Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/attack/0.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/idle/0.png b/PyGame/assets/graphics/monsters/bamboo/idle/0.png new file mode 100644 index 0000000..c14d75b Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/idle/0.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/idle/1.png b/PyGame/assets/graphics/monsters/bamboo/idle/1.png new file mode 100644 index 0000000..9dd1acc Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/idle/1.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/idle/2.png b/PyGame/assets/graphics/monsters/bamboo/idle/2.png new file mode 100644 index 0000000..c14d75b Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/idle/2.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/idle/3.png b/PyGame/assets/graphics/monsters/bamboo/idle/3.png new file mode 100644 index 0000000..6411298 Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/idle/3.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/move/0.png b/PyGame/assets/graphics/monsters/bamboo/move/0.png new file mode 100644 index 0000000..c14d75b Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/move/0.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/move/1.png b/PyGame/assets/graphics/monsters/bamboo/move/1.png new file mode 100644 index 0000000..9dd1acc Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/move/1.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/move/2.png b/PyGame/assets/graphics/monsters/bamboo/move/2.png new file mode 100644 index 0000000..c14d75b Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/move/2.png differ diff --git a/PyGame/assets/graphics/monsters/bamboo/move/3.png b/PyGame/assets/graphics/monsters/bamboo/move/3.png new file mode 100644 index 0000000..6411298 Binary files /dev/null and b/PyGame/assets/graphics/monsters/bamboo/move/3.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/attack/0.png b/PyGame/assets/graphics/monsters/raccoon/attack/0.png new file mode 100644 index 0000000..2e53f25 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/attack/0.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/attack/1.png b/PyGame/assets/graphics/monsters/raccoon/attack/1.png new file mode 100644 index 0000000..21c4d49 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/attack/1.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/attack/2.png b/PyGame/assets/graphics/monsters/raccoon/attack/2.png new file mode 100644 index 0000000..3319c79 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/attack/2.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/attack/3.png b/PyGame/assets/graphics/monsters/raccoon/attack/3.png new file mode 100644 index 0000000..aa2d58f Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/attack/3.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/0.png b/PyGame/assets/graphics/monsters/raccoon/idle/0.png new file mode 100644 index 0000000..cf0fb7f Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/idle/0.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/1.png b/PyGame/assets/graphics/monsters/raccoon/idle/1.png new file mode 100644 index 0000000..cf0fb7f Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/idle/1.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/2.png b/PyGame/assets/graphics/monsters/raccoon/idle/2.png new file mode 100644 index 0000000..8d16e08 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/idle/2.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/3.png b/PyGame/assets/graphics/monsters/raccoon/idle/3.png new file mode 100644 index 0000000..dc57a96 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/idle/3.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/4.png b/PyGame/assets/graphics/monsters/raccoon/idle/4.png new file mode 100644 index 0000000..fb12e6c Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/idle/4.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/idle/5.png b/PyGame/assets/graphics/monsters/raccoon/idle/5.png new file mode 100644 index 0000000..c0ede56 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/idle/5.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/move/0.png b/PyGame/assets/graphics/monsters/raccoon/move/0.png new file mode 100644 index 0000000..a60b9d0 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/move/0.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/move/1.png b/PyGame/assets/graphics/monsters/raccoon/move/1.png new file mode 100644 index 0000000..34410ca Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/move/1.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/move/2.png b/PyGame/assets/graphics/monsters/raccoon/move/2.png new file mode 100644 index 0000000..c299286 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/move/2.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/move/3.png b/PyGame/assets/graphics/monsters/raccoon/move/3.png new file mode 100644 index 0000000..7d9ee77 Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/move/3.png differ diff --git a/PyGame/assets/graphics/monsters/raccoon/move/4.png b/PyGame/assets/graphics/monsters/raccoon/move/4.png new file mode 100644 index 0000000..656981c Binary files /dev/null and b/PyGame/assets/graphics/monsters/raccoon/move/4.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/attack/0.png b/PyGame/assets/graphics/monsters/spirit/attack/0.png new file mode 100644 index 0000000..0afa8f1 Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/attack/0.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/idle/0.png b/PyGame/assets/graphics/monsters/spirit/idle/0.png new file mode 100644 index 0000000..0aee4b5 Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/idle/0.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/idle/1.png b/PyGame/assets/graphics/monsters/spirit/idle/1.png new file mode 100644 index 0000000..efe735c Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/idle/1.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/idle/2.png b/PyGame/assets/graphics/monsters/spirit/idle/2.png new file mode 100644 index 0000000..a46d5e2 Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/idle/2.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/idle/3.png b/PyGame/assets/graphics/monsters/spirit/idle/3.png new file mode 100644 index 0000000..15e5d4c Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/idle/3.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/move/0.png b/PyGame/assets/graphics/monsters/spirit/move/0.png new file mode 100644 index 0000000..0afa8f1 Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/move/0.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/move/1.png b/PyGame/assets/graphics/monsters/spirit/move/1.png new file mode 100644 index 0000000..bf8f85b Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/move/1.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/move/2.png b/PyGame/assets/graphics/monsters/spirit/move/2.png new file mode 100644 index 0000000..809ebc2 Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/move/2.png differ diff --git a/PyGame/assets/graphics/monsters/spirit/move/3.png b/PyGame/assets/graphics/monsters/spirit/move/3.png new file mode 100644 index 0000000..463875f Binary files /dev/null and b/PyGame/assets/graphics/monsters/spirit/move/3.png differ diff --git a/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (2).png b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (2).png new file mode 100644 index 0000000..644197e Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (2).png differ diff --git a/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (3).png b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (3).png new file mode 100644 index 0000000..644197e Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy (3).png differ diff --git a/PyGame/assets/graphics/monsters/squid/attack/0 - Copy.png b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy.png new file mode 100644 index 0000000..644197e Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/attack/0 - Copy.png differ diff --git a/PyGame/assets/graphics/monsters/squid/attack/0.png b/PyGame/assets/graphics/monsters/squid/attack/0.png new file mode 100644 index 0000000..644197e Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/attack/0.png differ diff --git a/PyGame/assets/graphics/monsters/squid/idle/0.png b/PyGame/assets/graphics/monsters/squid/idle/0.png new file mode 100644 index 0000000..a9beba8 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/idle/0.png differ diff --git a/PyGame/assets/graphics/monsters/squid/idle/1.png b/PyGame/assets/graphics/monsters/squid/idle/1.png new file mode 100644 index 0000000..f854919 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/idle/1.png differ diff --git a/PyGame/assets/graphics/monsters/squid/idle/2.png b/PyGame/assets/graphics/monsters/squid/idle/2.png new file mode 100644 index 0000000..a9beba8 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/idle/2.png differ diff --git a/PyGame/assets/graphics/monsters/squid/idle/3.png b/PyGame/assets/graphics/monsters/squid/idle/3.png new file mode 100644 index 0000000..9c588e1 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/idle/3.png differ diff --git a/PyGame/assets/graphics/monsters/squid/idle/4.png b/PyGame/assets/graphics/monsters/squid/idle/4.png new file mode 100644 index 0000000..9c588e1 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/idle/4.png differ diff --git a/PyGame/assets/graphics/monsters/squid/move/0.png b/PyGame/assets/graphics/monsters/squid/move/0.png new file mode 100644 index 0000000..a9beba8 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/move/0.png differ diff --git a/PyGame/assets/graphics/monsters/squid/move/1.png b/PyGame/assets/graphics/monsters/squid/move/1.png new file mode 100644 index 0000000..f854919 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/move/1.png differ diff --git a/PyGame/assets/graphics/monsters/squid/move/2.png b/PyGame/assets/graphics/monsters/squid/move/2.png new file mode 100644 index 0000000..9c588e1 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/move/2.png differ diff --git a/PyGame/assets/graphics/monsters/squid/move/3.png b/PyGame/assets/graphics/monsters/squid/move/3.png new file mode 100644 index 0000000..9c588e1 Binary files /dev/null and b/PyGame/assets/graphics/monsters/squid/move/3.png differ diff --git a/PyGame/assets/graphics/objects/0.png b/PyGame/assets/graphics/objects/0.png new file mode 100644 index 0000000..05fc485 Binary files /dev/null and b/PyGame/assets/graphics/objects/0.png differ diff --git a/PyGame/assets/graphics/objects/01.png b/PyGame/assets/graphics/objects/01.png new file mode 100644 index 0000000..3fa3af9 Binary files /dev/null and b/PyGame/assets/graphics/objects/01.png differ diff --git a/PyGame/assets/graphics/objects/02.png b/PyGame/assets/graphics/objects/02.png new file mode 100644 index 0000000..c91ceec Binary files /dev/null and b/PyGame/assets/graphics/objects/02.png differ diff --git a/PyGame/assets/graphics/objects/03.png b/PyGame/assets/graphics/objects/03.png new file mode 100644 index 0000000..186ff45 Binary files /dev/null and b/PyGame/assets/graphics/objects/03.png differ diff --git a/PyGame/assets/graphics/objects/04.png b/PyGame/assets/graphics/objects/04.png new file mode 100644 index 0000000..f3a3e7a Binary files /dev/null and b/PyGame/assets/graphics/objects/04.png differ diff --git a/PyGame/assets/graphics/objects/05.png b/PyGame/assets/graphics/objects/05.png new file mode 100644 index 0000000..eab8994 Binary files /dev/null and b/PyGame/assets/graphics/objects/05.png differ diff --git a/PyGame/assets/graphics/objects/06.png b/PyGame/assets/graphics/objects/06.png new file mode 100644 index 0000000..a7859b7 Binary files /dev/null and b/PyGame/assets/graphics/objects/06.png differ diff --git a/PyGame/assets/graphics/objects/07.png b/PyGame/assets/graphics/objects/07.png new file mode 100644 index 0000000..a436b83 Binary files /dev/null and b/PyGame/assets/graphics/objects/07.png differ diff --git a/PyGame/assets/graphics/objects/08.png b/PyGame/assets/graphics/objects/08.png new file mode 100644 index 0000000..7fde04e Binary files /dev/null and b/PyGame/assets/graphics/objects/08.png differ diff --git a/PyGame/assets/graphics/objects/09.png b/PyGame/assets/graphics/objects/09.png new file mode 100644 index 0000000..fbd0ebb Binary files /dev/null and b/PyGame/assets/graphics/objects/09.png differ diff --git a/PyGame/assets/graphics/objects/10.png b/PyGame/assets/graphics/objects/10.png new file mode 100644 index 0000000..067a503 Binary files /dev/null and b/PyGame/assets/graphics/objects/10.png differ diff --git a/PyGame/assets/graphics/objects/11.png b/PyGame/assets/graphics/objects/11.png new file mode 100644 index 0000000..37edc1e Binary files /dev/null and b/PyGame/assets/graphics/objects/11.png differ diff --git a/PyGame/assets/graphics/objects/12.png b/PyGame/assets/graphics/objects/12.png new file mode 100644 index 0000000..d1967c2 Binary files /dev/null and b/PyGame/assets/graphics/objects/12.png differ diff --git a/PyGame/assets/graphics/objects/13.png b/PyGame/assets/graphics/objects/13.png new file mode 100644 index 0000000..f01d839 Binary files /dev/null and b/PyGame/assets/graphics/objects/13.png differ diff --git a/PyGame/assets/graphics/objects/14.png b/PyGame/assets/graphics/objects/14.png new file mode 100644 index 0000000..6a7b4bc Binary files /dev/null and b/PyGame/assets/graphics/objects/14.png differ diff --git a/PyGame/assets/graphics/objects/15.png b/PyGame/assets/graphics/objects/15.png new file mode 100644 index 0000000..783c417 Binary files /dev/null and b/PyGame/assets/graphics/objects/15.png differ diff --git a/PyGame/assets/graphics/objects/16.png b/PyGame/assets/graphics/objects/16.png new file mode 100644 index 0000000..69b3119 Binary files /dev/null and b/PyGame/assets/graphics/objects/16.png differ diff --git a/PyGame/assets/graphics/objects/17.png b/PyGame/assets/graphics/objects/17.png new file mode 100644 index 0000000..23cfa85 Binary files /dev/null and b/PyGame/assets/graphics/objects/17.png differ diff --git a/PyGame/assets/graphics/objects/18.png b/PyGame/assets/graphics/objects/18.png new file mode 100644 index 0000000..8497695 Binary files /dev/null and b/PyGame/assets/graphics/objects/18.png differ diff --git a/PyGame/assets/graphics/objects/19.png b/PyGame/assets/graphics/objects/19.png new file mode 100644 index 0000000..425d16f Binary files /dev/null and b/PyGame/assets/graphics/objects/19.png differ diff --git a/PyGame/assets/graphics/objects/20.png b/PyGame/assets/graphics/objects/20.png new file mode 100644 index 0000000..7028a89 Binary files /dev/null and b/PyGame/assets/graphics/objects/20.png differ diff --git a/PyGame/assets/graphics/observer.png b/PyGame/assets/graphics/observer.png new file mode 100644 index 0000000..0c0702e Binary files /dev/null and b/PyGame/assets/graphics/observer.png differ diff --git a/PyGame/assets/graphics/particles/aura/0.png b/PyGame/assets/graphics/particles/aura/0.png new file mode 100644 index 0000000..ca3080c Binary files /dev/null and b/PyGame/assets/graphics/particles/aura/0.png differ diff --git a/PyGame/assets/graphics/particles/aura/1.png b/PyGame/assets/graphics/particles/aura/1.png new file mode 100644 index 0000000..587df6e Binary files /dev/null and b/PyGame/assets/graphics/particles/aura/1.png differ diff --git a/PyGame/assets/graphics/particles/aura/2.png b/PyGame/assets/graphics/particles/aura/2.png new file mode 100644 index 0000000..345b25a Binary files /dev/null and b/PyGame/assets/graphics/particles/aura/2.png differ diff --git a/PyGame/assets/graphics/particles/aura/3.png b/PyGame/assets/graphics/particles/aura/3.png new file mode 100644 index 0000000..f5aa4c5 Binary files /dev/null and b/PyGame/assets/graphics/particles/aura/3.png differ diff --git a/PyGame/assets/graphics/particles/bamboo/0.png b/PyGame/assets/graphics/particles/bamboo/0.png new file mode 100644 index 0000000..a28b25a Binary files /dev/null and b/PyGame/assets/graphics/particles/bamboo/0.png differ diff --git a/PyGame/assets/graphics/particles/bamboo/1.png b/PyGame/assets/graphics/particles/bamboo/1.png new file mode 100644 index 0000000..234355a Binary files /dev/null and b/PyGame/assets/graphics/particles/bamboo/1.png differ diff --git a/PyGame/assets/graphics/particles/claw/0.png b/PyGame/assets/graphics/particles/claw/0.png new file mode 100644 index 0000000..b9af05a Binary files /dev/null and b/PyGame/assets/graphics/particles/claw/0.png differ diff --git a/PyGame/assets/graphics/particles/claw/1.png b/PyGame/assets/graphics/particles/claw/1.png new file mode 100644 index 0000000..60ab800 Binary files /dev/null and b/PyGame/assets/graphics/particles/claw/1.png differ diff --git a/PyGame/assets/graphics/particles/claw/2.png b/PyGame/assets/graphics/particles/claw/2.png new file mode 100644 index 0000000..e3c239b Binary files /dev/null and b/PyGame/assets/graphics/particles/claw/2.png differ diff --git a/PyGame/assets/graphics/particles/claw/3.png b/PyGame/assets/graphics/particles/claw/3.png new file mode 100644 index 0000000..2a579b7 Binary files /dev/null and b/PyGame/assets/graphics/particles/claw/3.png differ diff --git a/PyGame/assets/graphics/particles/flame/fire.png b/PyGame/assets/graphics/particles/flame/fire.png new file mode 100644 index 0000000..2fb9ffc Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/fire.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/0.png b/PyGame/assets/graphics/particles/flame/frames/0.png new file mode 100644 index 0000000..fe33ae5 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/0.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/01.png b/PyGame/assets/graphics/particles/flame/frames/01.png new file mode 100644 index 0000000..734a74f Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/01.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/02.png b/PyGame/assets/graphics/particles/flame/frames/02.png new file mode 100644 index 0000000..63536a7 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/02.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/03.png b/PyGame/assets/graphics/particles/flame/frames/03.png new file mode 100644 index 0000000..49c4995 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/03.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/04.png b/PyGame/assets/graphics/particles/flame/frames/04.png new file mode 100644 index 0000000..77e0474 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/04.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/05.png b/PyGame/assets/graphics/particles/flame/frames/05.png new file mode 100644 index 0000000..04691a5 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/05.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/06.png b/PyGame/assets/graphics/particles/flame/frames/06.png new file mode 100644 index 0000000..4738aa7 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/06.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/07.png b/PyGame/assets/graphics/particles/flame/frames/07.png new file mode 100644 index 0000000..1faa1d3 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/07.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/08.png b/PyGame/assets/graphics/particles/flame/frames/08.png new file mode 100644 index 0000000..44b7e28 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/08.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/09.png b/PyGame/assets/graphics/particles/flame/frames/09.png new file mode 100644 index 0000000..cd35c03 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/09.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/10.png b/PyGame/assets/graphics/particles/flame/frames/10.png new file mode 100644 index 0000000..7164544 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/10.png differ diff --git a/PyGame/assets/graphics/particles/flame/frames/11.png b/PyGame/assets/graphics/particles/flame/frames/11.png new file mode 100644 index 0000000..5555377 Binary files /dev/null and b/PyGame/assets/graphics/particles/flame/frames/11.png differ diff --git a/PyGame/assets/graphics/particles/heal/frames/0.png b/PyGame/assets/graphics/particles/heal/frames/0.png new file mode 100644 index 0000000..cd93684 Binary files /dev/null and b/PyGame/assets/graphics/particles/heal/frames/0.png differ diff --git a/PyGame/assets/graphics/particles/heal/frames/1.png b/PyGame/assets/graphics/particles/heal/frames/1.png new file mode 100644 index 0000000..83b4cf1 Binary files /dev/null and b/PyGame/assets/graphics/particles/heal/frames/1.png differ diff --git a/PyGame/assets/graphics/particles/heal/frames/2.png b/PyGame/assets/graphics/particles/heal/frames/2.png new file mode 100644 index 0000000..de0b9bd Binary files /dev/null and b/PyGame/assets/graphics/particles/heal/frames/2.png differ diff --git a/PyGame/assets/graphics/particles/heal/frames/3.png b/PyGame/assets/graphics/particles/heal/frames/3.png new file mode 100644 index 0000000..d5ab576 Binary files /dev/null and b/PyGame/assets/graphics/particles/heal/frames/3.png differ diff --git a/PyGame/assets/graphics/particles/heal/frames/4.png b/PyGame/assets/graphics/particles/heal/frames/4.png new file mode 100644 index 0000000..e26afd3 Binary files /dev/null and b/PyGame/assets/graphics/particles/heal/frames/4.png differ diff --git a/PyGame/assets/graphics/particles/heal/heal.png b/PyGame/assets/graphics/particles/heal/heal.png new file mode 100644 index 0000000..ad7de97 Binary files /dev/null and b/PyGame/assets/graphics/particles/heal/heal.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00000.png new file mode 100644 index 0000000..b3d34ea Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00000.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00001.png new file mode 100644 index 0000000..22fce58 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00001.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00002.png new file mode 100644 index 0000000..f8d2b65 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00002.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00003.png new file mode 100644 index 0000000..e3e59b6 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00003.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00004.png new file mode 100644 index 0000000..a703f36 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00004.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00005.png new file mode 100644 index 0000000..39e159a Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00005.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00006.png new file mode 100644 index 0000000..a83b3d0 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00006.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00007.png new file mode 100644 index 0000000..ed3fca8 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00007.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00008.png new file mode 100644 index 0000000..f6bf4c9 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00008.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00009.png new file mode 100644 index 0000000..1e27176 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00009.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00010.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00010.png new file mode 100644 index 0000000..4be9658 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00010.png differ diff --git a/PyGame/assets/graphics/particles/leaf1/leaf1_00011.png b/PyGame/assets/graphics/particles/leaf1/leaf1_00011.png new file mode 100644 index 0000000..57f0d06 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf1/leaf1_00011.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00000.png new file mode 100644 index 0000000..bd43308 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00000.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00001.png new file mode 100644 index 0000000..3013b91 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00001.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00002.png new file mode 100644 index 0000000..30300af Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00002.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00003.png new file mode 100644 index 0000000..8f0b661 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00003.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00004.png new file mode 100644 index 0000000..8248fba Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00004.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00005.png new file mode 100644 index 0000000..ecf4ffa Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00005.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00006.png new file mode 100644 index 0000000..ece22b8 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00006.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00007.png new file mode 100644 index 0000000..1f1f7ee Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00007.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00008.png new file mode 100644 index 0000000..33f28bd Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00008.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00009.png new file mode 100644 index 0000000..6d6ff48 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00009.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00010.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00010.png new file mode 100644 index 0000000..d1a770e Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00010.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00011.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00011.png new file mode 100644 index 0000000..0435cea Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00011.png differ diff --git a/PyGame/assets/graphics/particles/leaf2/leaf1_00012.png b/PyGame/assets/graphics/particles/leaf2/leaf1_00012.png new file mode 100644 index 0000000..3848e8d Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf2/leaf1_00012.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00000.png new file mode 100644 index 0000000..c31c69f Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00000.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00001.png new file mode 100644 index 0000000..ad36fe5 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00001.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00002.png new file mode 100644 index 0000000..8338ffd Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00002.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00003.png new file mode 100644 index 0000000..444a0e1 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00003.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00004.png new file mode 100644 index 0000000..4f62188 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00004.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00005.png new file mode 100644 index 0000000..99dc366 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00005.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00006.png new file mode 100644 index 0000000..50c0d9a Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00006.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00007.png new file mode 100644 index 0000000..d7a7a37 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00007.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00008.png new file mode 100644 index 0000000..8df60d4 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00008.png differ diff --git a/PyGame/assets/graphics/particles/leaf3/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf3/leaf1_00009.png new file mode 100644 index 0000000..d14ee99 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf3/leaf1_00009.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00000.png new file mode 100644 index 0000000..a6309fe Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00000.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00001.png new file mode 100644 index 0000000..3d31420 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00001.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00002.png new file mode 100644 index 0000000..cfcc565 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00002.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00003.png new file mode 100644 index 0000000..af077e3 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00003.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00004.png new file mode 100644 index 0000000..7b0be93 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00004.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00005.png new file mode 100644 index 0000000..7b5ac2a Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00005.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00006.png new file mode 100644 index 0000000..8229334 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00006.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00007.png new file mode 100644 index 0000000..1915fab Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00007.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00008.png new file mode 100644 index 0000000..157a04a Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00008.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00009.png new file mode 100644 index 0000000..27fb1fd Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00009.png differ diff --git a/PyGame/assets/graphics/particles/leaf4/leaf1_00010.png b/PyGame/assets/graphics/particles/leaf4/leaf1_00010.png new file mode 100644 index 0000000..5030b8c Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf4/leaf1_00010.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00000.png new file mode 100644 index 0000000..b0e81b0 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00000.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00001.png new file mode 100644 index 0000000..b7828b6 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00001.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00002.png new file mode 100644 index 0000000..ccc2714 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00002.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00003.png new file mode 100644 index 0000000..f1fd9b1 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00003.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00004.png new file mode 100644 index 0000000..de90457 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00004.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00005.png new file mode 100644 index 0000000..661a16a Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00005.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00006.png new file mode 100644 index 0000000..996ed74 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00006.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00007.png new file mode 100644 index 0000000..bc0ab50 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00007.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00008.png new file mode 100644 index 0000000..9de760e Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00008.png differ diff --git a/PyGame/assets/graphics/particles/leaf5/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf5/leaf1_00009.png new file mode 100644 index 0000000..ec73497 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf5/leaf1_00009.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00000.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00000.png new file mode 100644 index 0000000..4969977 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00000.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00001.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00001.png new file mode 100644 index 0000000..4212765 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00001.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00002.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00002.png new file mode 100644 index 0000000..7237076 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00002.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00003.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00003.png new file mode 100644 index 0000000..a03d0fe Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00003.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00004.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00004.png new file mode 100644 index 0000000..e585fb4 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00004.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00005.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00005.png new file mode 100644 index 0000000..13d8d55 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00005.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00006.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00006.png new file mode 100644 index 0000000..8b153dc Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00006.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00007.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00007.png new file mode 100644 index 0000000..aab3b60 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00007.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00008.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00008.png new file mode 100644 index 0000000..9d32aa9 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00008.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00009.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00009.png new file mode 100644 index 0000000..1f87666 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00009.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00010.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00010.png new file mode 100644 index 0000000..c54c793 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00010.png differ diff --git a/PyGame/assets/graphics/particles/leaf6/leaf1_00011.png b/PyGame/assets/graphics/particles/leaf6/leaf1_00011.png new file mode 100644 index 0000000..3659600 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf6/leaf1_00011.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/0.png b/PyGame/assets/graphics/particles/leaf_attack/0.png new file mode 100644 index 0000000..a9dc64d Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/0.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/1.png b/PyGame/assets/graphics/particles/leaf_attack/1.png new file mode 100644 index 0000000..2cfe1a5 Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/1.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/2.png b/PyGame/assets/graphics/particles/leaf_attack/2.png new file mode 100644 index 0000000..19eabbd Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/2.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/3.png b/PyGame/assets/graphics/particles/leaf_attack/3.png new file mode 100644 index 0000000..b7c453f Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/3.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/4.png b/PyGame/assets/graphics/particles/leaf_attack/4.png new file mode 100644 index 0000000..d26d38e Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/4.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/5.png b/PyGame/assets/graphics/particles/leaf_attack/5.png new file mode 100644 index 0000000..73c1f4f Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/5.png differ diff --git a/PyGame/assets/graphics/particles/leaf_attack/6.png b/PyGame/assets/graphics/particles/leaf_attack/6.png new file mode 100644 index 0000000..d68a09d Binary files /dev/null and b/PyGame/assets/graphics/particles/leaf_attack/6.png differ diff --git a/PyGame/assets/graphics/particles/nova/0.png b/PyGame/assets/graphics/particles/nova/0.png new file mode 100644 index 0000000..fdcc423 Binary files /dev/null and b/PyGame/assets/graphics/particles/nova/0.png differ diff --git a/PyGame/assets/graphics/particles/nova/1.png b/PyGame/assets/graphics/particles/nova/1.png new file mode 100644 index 0000000..320b930 Binary files /dev/null and b/PyGame/assets/graphics/particles/nova/1.png differ diff --git a/PyGame/assets/graphics/particles/nova/2.png b/PyGame/assets/graphics/particles/nova/2.png new file mode 100644 index 0000000..91766d8 Binary files /dev/null and b/PyGame/assets/graphics/particles/nova/2.png differ diff --git a/PyGame/assets/graphics/particles/nova/3.png b/PyGame/assets/graphics/particles/nova/3.png new file mode 100644 index 0000000..98371b1 Binary files /dev/null and b/PyGame/assets/graphics/particles/nova/3.png differ diff --git a/PyGame/assets/graphics/particles/nova/4.png b/PyGame/assets/graphics/particles/nova/4.png new file mode 100644 index 0000000..26924ab Binary files /dev/null and b/PyGame/assets/graphics/particles/nova/4.png differ diff --git a/PyGame/assets/graphics/particles/nova/5.png b/PyGame/assets/graphics/particles/nova/5.png new file mode 100644 index 0000000..f6aae60 Binary files /dev/null and b/PyGame/assets/graphics/particles/nova/5.png differ diff --git a/PyGame/assets/graphics/particles/raccoon/0.png b/PyGame/assets/graphics/particles/raccoon/0.png new file mode 100644 index 0000000..cc1a9eb Binary files /dev/null and b/PyGame/assets/graphics/particles/raccoon/0.png differ diff --git a/PyGame/assets/graphics/particles/raccoon/1.png b/PyGame/assets/graphics/particles/raccoon/1.png new file mode 100644 index 0000000..7385737 Binary files /dev/null and b/PyGame/assets/graphics/particles/raccoon/1.png differ diff --git a/PyGame/assets/graphics/particles/raccoon/2.png b/PyGame/assets/graphics/particles/raccoon/2.png new file mode 100644 index 0000000..8b384be Binary files /dev/null and b/PyGame/assets/graphics/particles/raccoon/2.png differ diff --git a/PyGame/assets/graphics/particles/raccoon/3.png b/PyGame/assets/graphics/particles/raccoon/3.png new file mode 100644 index 0000000..d6feaf3 Binary files /dev/null and b/PyGame/assets/graphics/particles/raccoon/3.png differ diff --git a/PyGame/assets/graphics/particles/raccoon/4.png b/PyGame/assets/graphics/particles/raccoon/4.png new file mode 100644 index 0000000..e550c15 Binary files /dev/null and b/PyGame/assets/graphics/particles/raccoon/4.png differ diff --git a/PyGame/assets/graphics/particles/raccoon/5.png b/PyGame/assets/graphics/particles/raccoon/5.png new file mode 100644 index 0000000..13797ad Binary files /dev/null and b/PyGame/assets/graphics/particles/raccoon/5.png differ diff --git a/PyGame/assets/graphics/particles/slash/0.png b/PyGame/assets/graphics/particles/slash/0.png new file mode 100644 index 0000000..75b73d5 Binary files /dev/null and b/PyGame/assets/graphics/particles/slash/0.png differ diff --git a/PyGame/assets/graphics/particles/slash/1.png b/PyGame/assets/graphics/particles/slash/1.png new file mode 100644 index 0000000..011e4a9 Binary files /dev/null and b/PyGame/assets/graphics/particles/slash/1.png differ diff --git a/PyGame/assets/graphics/particles/slash/2.png b/PyGame/assets/graphics/particles/slash/2.png new file mode 100644 index 0000000..922e970 Binary files /dev/null and b/PyGame/assets/graphics/particles/slash/2.png differ diff --git a/PyGame/assets/graphics/particles/slash/3.png b/PyGame/assets/graphics/particles/slash/3.png new file mode 100644 index 0000000..58821d9 Binary files /dev/null and b/PyGame/assets/graphics/particles/slash/3.png differ diff --git a/PyGame/assets/graphics/particles/smoke/0.png b/PyGame/assets/graphics/particles/smoke/0.png new file mode 100644 index 0000000..73e9a59 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke/0.png differ diff --git a/PyGame/assets/graphics/particles/smoke/1.png b/PyGame/assets/graphics/particles/smoke/1.png new file mode 100644 index 0000000..f21e130 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke/1.png differ diff --git a/PyGame/assets/graphics/particles/smoke/2.png b/PyGame/assets/graphics/particles/smoke/2.png new file mode 100644 index 0000000..8e2ecb9 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke/2.png differ diff --git a/PyGame/assets/graphics/particles/smoke/3.png b/PyGame/assets/graphics/particles/smoke/3.png new file mode 100644 index 0000000..244b1a1 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke/3.png differ diff --git a/PyGame/assets/graphics/particles/smoke/4.png b/PyGame/assets/graphics/particles/smoke/4.png new file mode 100644 index 0000000..e60a29b Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke/4.png differ diff --git a/PyGame/assets/graphics/particles/smoke/5.png b/PyGame/assets/graphics/particles/smoke/5.png new file mode 100644 index 0000000..6475ce3 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke/5.png differ diff --git a/PyGame/assets/graphics/particles/smoke2/0.png b/PyGame/assets/graphics/particles/smoke2/0.png new file mode 100644 index 0000000..c3267c0 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke2/0.png differ diff --git a/PyGame/assets/graphics/particles/smoke2/1.png b/PyGame/assets/graphics/particles/smoke2/1.png new file mode 100644 index 0000000..f392845 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke2/1.png differ diff --git a/PyGame/assets/graphics/particles/smoke2/2.png b/PyGame/assets/graphics/particles/smoke2/2.png new file mode 100644 index 0000000..d611b6f Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke2/2.png differ diff --git a/PyGame/assets/graphics/particles/smoke2/3.png b/PyGame/assets/graphics/particles/smoke2/3.png new file mode 100644 index 0000000..c817380 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke2/3.png differ diff --git a/PyGame/assets/graphics/particles/smoke2/4.png b/PyGame/assets/graphics/particles/smoke2/4.png new file mode 100644 index 0000000..abd4af8 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke2/4.png differ diff --git a/PyGame/assets/graphics/particles/smoke2/5.png b/PyGame/assets/graphics/particles/smoke2/5.png new file mode 100644 index 0000000..c89158a Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke2/5.png differ diff --git a/PyGame/assets/graphics/particles/smoke_orange/0.png b/PyGame/assets/graphics/particles/smoke_orange/0.png new file mode 100644 index 0000000..e4baa13 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke_orange/0.png differ diff --git a/PyGame/assets/graphics/particles/smoke_orange/1.png b/PyGame/assets/graphics/particles/smoke_orange/1.png new file mode 100644 index 0000000..7cce227 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke_orange/1.png differ diff --git a/PyGame/assets/graphics/particles/smoke_orange/2.png b/PyGame/assets/graphics/particles/smoke_orange/2.png new file mode 100644 index 0000000..4425e33 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke_orange/2.png differ diff --git a/PyGame/assets/graphics/particles/smoke_orange/3.png b/PyGame/assets/graphics/particles/smoke_orange/3.png new file mode 100644 index 0000000..a817e8d Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke_orange/3.png differ diff --git a/PyGame/assets/graphics/particles/smoke_orange/4.png b/PyGame/assets/graphics/particles/smoke_orange/4.png new file mode 100644 index 0000000..b6ff7a5 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke_orange/4.png differ diff --git a/PyGame/assets/graphics/particles/smoke_orange/5.png b/PyGame/assets/graphics/particles/smoke_orange/5.png new file mode 100644 index 0000000..3dfab88 Binary files /dev/null and b/PyGame/assets/graphics/particles/smoke_orange/5.png differ diff --git a/PyGame/assets/graphics/particles/sparkle/0.png b/PyGame/assets/graphics/particles/sparkle/0.png new file mode 100644 index 0000000..2bc0bf2 Binary files /dev/null and b/PyGame/assets/graphics/particles/sparkle/0.png differ diff --git a/PyGame/assets/graphics/particles/sparkle/1.png b/PyGame/assets/graphics/particles/sparkle/1.png new file mode 100644 index 0000000..5b3a810 Binary files /dev/null and b/PyGame/assets/graphics/particles/sparkle/1.png differ diff --git a/PyGame/assets/graphics/particles/sparkle/2.png b/PyGame/assets/graphics/particles/sparkle/2.png new file mode 100644 index 0000000..d13930a Binary files /dev/null and b/PyGame/assets/graphics/particles/sparkle/2.png differ diff --git a/PyGame/assets/graphics/particles/sparkle/3.png b/PyGame/assets/graphics/particles/sparkle/3.png new file mode 100644 index 0000000..8384774 Binary files /dev/null and b/PyGame/assets/graphics/particles/sparkle/3.png differ diff --git a/PyGame/assets/graphics/particles/sparkle/4.png b/PyGame/assets/graphics/particles/sparkle/4.png new file mode 100644 index 0000000..b07148f Binary files /dev/null and b/PyGame/assets/graphics/particles/sparkle/4.png differ diff --git a/PyGame/assets/graphics/particles/thunder/0.png b/PyGame/assets/graphics/particles/thunder/0.png new file mode 100644 index 0000000..781f52b Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/0.png differ diff --git a/PyGame/assets/graphics/particles/thunder/1.png b/PyGame/assets/graphics/particles/thunder/1.png new file mode 100644 index 0000000..ac1fa39 Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/1.png differ diff --git a/PyGame/assets/graphics/particles/thunder/2.png b/PyGame/assets/graphics/particles/thunder/2.png new file mode 100644 index 0000000..c4bb34b Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/2.png differ diff --git a/PyGame/assets/graphics/particles/thunder/3.png b/PyGame/assets/graphics/particles/thunder/3.png new file mode 100644 index 0000000..91c92a3 Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/3.png differ diff --git a/PyGame/assets/graphics/particles/thunder/4.png b/PyGame/assets/graphics/particles/thunder/4.png new file mode 100644 index 0000000..0d51893 Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/4.png differ diff --git a/PyGame/assets/graphics/particles/thunder/5.png b/PyGame/assets/graphics/particles/thunder/5.png new file mode 100644 index 0000000..55d2698 Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/5.png differ diff --git a/PyGame/assets/graphics/particles/thunder/6.png b/PyGame/assets/graphics/particles/thunder/6.png new file mode 100644 index 0000000..4d79092 Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/6.png differ diff --git a/PyGame/assets/graphics/particles/thunder/7.png b/PyGame/assets/graphics/particles/thunder/7.png new file mode 100644 index 0000000..0b8b41c Binary files /dev/null and b/PyGame/assets/graphics/particles/thunder/7.png differ diff --git a/PyGame/assets/graphics/player/down/down_0.png b/PyGame/assets/graphics/player/down/down_0.png new file mode 100644 index 0000000..dbbe852 Binary files /dev/null and b/PyGame/assets/graphics/player/down/down_0.png differ diff --git a/PyGame/assets/graphics/player/down/down_1.png b/PyGame/assets/graphics/player/down/down_1.png new file mode 100644 index 0000000..8545561 Binary files /dev/null and b/PyGame/assets/graphics/player/down/down_1.png differ diff --git a/PyGame/assets/graphics/player/down/down_2.png b/PyGame/assets/graphics/player/down/down_2.png new file mode 100644 index 0000000..dbbe852 Binary files /dev/null and b/PyGame/assets/graphics/player/down/down_2.png differ diff --git a/PyGame/assets/graphics/player/down/down_3.png b/PyGame/assets/graphics/player/down/down_3.png new file mode 100644 index 0000000..eb692a2 Binary files /dev/null and b/PyGame/assets/graphics/player/down/down_3.png differ diff --git a/PyGame/assets/graphics/player/down_attack/attack_down.png b/PyGame/assets/graphics/player/down_attack/attack_down.png new file mode 100644 index 0000000..0ecc144 Binary files /dev/null and b/PyGame/assets/graphics/player/down_attack/attack_down.png differ diff --git a/PyGame/assets/graphics/player/down_idle/idle_down.png b/PyGame/assets/graphics/player/down_idle/idle_down.png new file mode 100644 index 0000000..dbbe852 Binary files /dev/null and b/PyGame/assets/graphics/player/down_idle/idle_down.png differ diff --git a/PyGame/assets/graphics/player/left/left_0.png b/PyGame/assets/graphics/player/left/left_0.png new file mode 100644 index 0000000..dafb10b Binary files /dev/null and b/PyGame/assets/graphics/player/left/left_0.png differ diff --git a/PyGame/assets/graphics/player/left/left_1.png b/PyGame/assets/graphics/player/left/left_1.png new file mode 100644 index 0000000..b84ec9c Binary files /dev/null and b/PyGame/assets/graphics/player/left/left_1.png differ diff --git a/PyGame/assets/graphics/player/left/left_2.png b/PyGame/assets/graphics/player/left/left_2.png new file mode 100644 index 0000000..0e22f2e Binary files /dev/null and b/PyGame/assets/graphics/player/left/left_2.png differ diff --git a/PyGame/assets/graphics/player/left/left_3.png b/PyGame/assets/graphics/player/left/left_3.png new file mode 100644 index 0000000..b771463 Binary files /dev/null and b/PyGame/assets/graphics/player/left/left_3.png differ diff --git a/PyGame/assets/graphics/player/left_attack/attack_left.png b/PyGame/assets/graphics/player/left_attack/attack_left.png new file mode 100644 index 0000000..0b6c05a Binary files /dev/null and b/PyGame/assets/graphics/player/left_attack/attack_left.png differ diff --git a/PyGame/assets/graphics/player/left_idle/idle_left.png b/PyGame/assets/graphics/player/left_idle/idle_left.png new file mode 100644 index 0000000..dafb10b Binary files /dev/null and b/PyGame/assets/graphics/player/left_idle/idle_left.png differ diff --git a/PyGame/assets/graphics/player/right/right_0.png b/PyGame/assets/graphics/player/right/right_0.png new file mode 100644 index 0000000..fe82409 Binary files /dev/null and b/PyGame/assets/graphics/player/right/right_0.png differ diff --git a/PyGame/assets/graphics/player/right/right_1.png b/PyGame/assets/graphics/player/right/right_1.png new file mode 100644 index 0000000..983fbc9 Binary files /dev/null and b/PyGame/assets/graphics/player/right/right_1.png differ diff --git a/PyGame/assets/graphics/player/right/right_2.png b/PyGame/assets/graphics/player/right/right_2.png new file mode 100644 index 0000000..8fcb491 Binary files /dev/null and b/PyGame/assets/graphics/player/right/right_2.png differ diff --git a/PyGame/assets/graphics/player/right/right_3.png b/PyGame/assets/graphics/player/right/right_3.png new file mode 100644 index 0000000..0a7a454 Binary files /dev/null and b/PyGame/assets/graphics/player/right/right_3.png differ diff --git a/PyGame/assets/graphics/player/right_attack/attack_right.png b/PyGame/assets/graphics/player/right_attack/attack_right.png new file mode 100644 index 0000000..9fa1657 Binary files /dev/null and b/PyGame/assets/graphics/player/right_attack/attack_right.png differ diff --git a/PyGame/assets/graphics/player/right_idle/idle_right.png b/PyGame/assets/graphics/player/right_idle/idle_right.png new file mode 100644 index 0000000..fe82409 Binary files /dev/null and b/PyGame/assets/graphics/player/right_idle/idle_right.png differ diff --git a/PyGame/assets/graphics/player/up/up_0.png b/PyGame/assets/graphics/player/up/up_0.png new file mode 100644 index 0000000..d0dae1c Binary files /dev/null and b/PyGame/assets/graphics/player/up/up_0.png differ diff --git a/PyGame/assets/graphics/player/up/up_1.png b/PyGame/assets/graphics/player/up/up_1.png new file mode 100644 index 0000000..2b0de88 Binary files /dev/null and b/PyGame/assets/graphics/player/up/up_1.png differ diff --git a/PyGame/assets/graphics/player/up/up_2.png b/PyGame/assets/graphics/player/up/up_2.png new file mode 100644 index 0000000..d0dae1c Binary files /dev/null and b/PyGame/assets/graphics/player/up/up_2.png differ diff --git a/PyGame/assets/graphics/player/up/up_3.png b/PyGame/assets/graphics/player/up/up_3.png new file mode 100644 index 0000000..b6ebf56 Binary files /dev/null and b/PyGame/assets/graphics/player/up/up_3.png differ diff --git a/PyGame/assets/graphics/player/up_attack/attack_up.png b/PyGame/assets/graphics/player/up_attack/attack_up.png new file mode 100644 index 0000000..d165d7c Binary files /dev/null and b/PyGame/assets/graphics/player/up_attack/attack_up.png differ diff --git a/PyGame/assets/graphics/player/up_idle/idle_up.png b/PyGame/assets/graphics/player/up_idle/idle_up.png new file mode 100644 index 0000000..d0dae1c Binary files /dev/null and b/PyGame/assets/graphics/player/up_idle/idle_up.png differ diff --git a/PyGame/assets/graphics/tilemap/Floor.png b/PyGame/assets/graphics/tilemap/Floor.png new file mode 100644 index 0000000..2971cdd Binary files /dev/null and b/PyGame/assets/graphics/tilemap/Floor.png differ diff --git a/PyGame/assets/graphics/tilemap/details.png b/PyGame/assets/graphics/tilemap/details.png new file mode 100644 index 0000000..8e43aaa Binary files /dev/null and b/PyGame/assets/graphics/tilemap/details.png differ diff --git a/PyGame/assets/graphics/tilemap/ground.png b/PyGame/assets/graphics/tilemap/ground.png new file mode 100644 index 0000000..548b57f Binary files /dev/null and b/PyGame/assets/graphics/tilemap/ground.png differ diff --git a/PyGame/assets/graphics/weapons/axe/down.png b/PyGame/assets/graphics/weapons/axe/down.png new file mode 100644 index 0000000..66761cd Binary files /dev/null and b/PyGame/assets/graphics/weapons/axe/down.png differ diff --git a/PyGame/assets/graphics/weapons/axe/full.png b/PyGame/assets/graphics/weapons/axe/full.png new file mode 100644 index 0000000..99f0318 Binary files /dev/null and b/PyGame/assets/graphics/weapons/axe/full.png differ diff --git a/PyGame/assets/graphics/weapons/axe/left.png b/PyGame/assets/graphics/weapons/axe/left.png new file mode 100644 index 0000000..fbd9b02 Binary files /dev/null and b/PyGame/assets/graphics/weapons/axe/left.png differ diff --git a/PyGame/assets/graphics/weapons/axe/right.png b/PyGame/assets/graphics/weapons/axe/right.png new file mode 100644 index 0000000..72c1d42 Binary files /dev/null and b/PyGame/assets/graphics/weapons/axe/right.png differ diff --git a/PyGame/assets/graphics/weapons/axe/up.png b/PyGame/assets/graphics/weapons/axe/up.png new file mode 100644 index 0000000..5f49b89 Binary files /dev/null and b/PyGame/assets/graphics/weapons/axe/up.png differ diff --git a/PyGame/assets/graphics/weapons/lance/down.png b/PyGame/assets/graphics/weapons/lance/down.png new file mode 100644 index 0000000..f58aeba Binary files /dev/null and b/PyGame/assets/graphics/weapons/lance/down.png differ diff --git a/PyGame/assets/graphics/weapons/lance/full.png b/PyGame/assets/graphics/weapons/lance/full.png new file mode 100644 index 0000000..76ce170 Binary files /dev/null and b/PyGame/assets/graphics/weapons/lance/full.png differ diff --git a/PyGame/assets/graphics/weapons/lance/left.png b/PyGame/assets/graphics/weapons/lance/left.png new file mode 100644 index 0000000..b961b43 Binary files /dev/null and b/PyGame/assets/graphics/weapons/lance/left.png differ diff --git a/PyGame/assets/graphics/weapons/lance/right.png b/PyGame/assets/graphics/weapons/lance/right.png new file mode 100644 index 0000000..af7fd12 Binary files /dev/null and b/PyGame/assets/graphics/weapons/lance/right.png differ diff --git a/PyGame/assets/graphics/weapons/lance/up.png b/PyGame/assets/graphics/weapons/lance/up.png new file mode 100644 index 0000000..96040e5 Binary files /dev/null and b/PyGame/assets/graphics/weapons/lance/up.png differ diff --git a/PyGame/assets/graphics/weapons/rapier/down.png b/PyGame/assets/graphics/weapons/rapier/down.png new file mode 100644 index 0000000..dd103a5 Binary files /dev/null and b/PyGame/assets/graphics/weapons/rapier/down.png differ diff --git a/PyGame/assets/graphics/weapons/rapier/full.png b/PyGame/assets/graphics/weapons/rapier/full.png new file mode 100644 index 0000000..a5f2835 Binary files /dev/null and b/PyGame/assets/graphics/weapons/rapier/full.png differ diff --git a/PyGame/assets/graphics/weapons/rapier/left.png b/PyGame/assets/graphics/weapons/rapier/left.png new file mode 100644 index 0000000..31f5b8b Binary files /dev/null and b/PyGame/assets/graphics/weapons/rapier/left.png differ diff --git a/PyGame/assets/graphics/weapons/rapier/right.png b/PyGame/assets/graphics/weapons/rapier/right.png new file mode 100644 index 0000000..30910a2 Binary files /dev/null and b/PyGame/assets/graphics/weapons/rapier/right.png differ diff --git a/PyGame/assets/graphics/weapons/rapier/up.png b/PyGame/assets/graphics/weapons/rapier/up.png new file mode 100644 index 0000000..5839792 Binary files /dev/null and b/PyGame/assets/graphics/weapons/rapier/up.png differ diff --git a/PyGame/assets/graphics/weapons/sai/down.png b/PyGame/assets/graphics/weapons/sai/down.png new file mode 100644 index 0000000..bda7e15 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sai/down.png differ diff --git a/PyGame/assets/graphics/weapons/sai/full.png b/PyGame/assets/graphics/weapons/sai/full.png new file mode 100644 index 0000000..6f752d6 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sai/full.png differ diff --git a/PyGame/assets/graphics/weapons/sai/left.png b/PyGame/assets/graphics/weapons/sai/left.png new file mode 100644 index 0000000..c9847e2 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sai/left.png differ diff --git a/PyGame/assets/graphics/weapons/sai/right.png b/PyGame/assets/graphics/weapons/sai/right.png new file mode 100644 index 0000000..0631803 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sai/right.png differ diff --git a/PyGame/assets/graphics/weapons/sai/up.png b/PyGame/assets/graphics/weapons/sai/up.png new file mode 100644 index 0000000..366e70b Binary files /dev/null and b/PyGame/assets/graphics/weapons/sai/up.png differ diff --git a/PyGame/assets/graphics/weapons/sword/down.png b/PyGame/assets/graphics/weapons/sword/down.png new file mode 100644 index 0000000..ebcfa93 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sword/down.png differ diff --git a/PyGame/assets/graphics/weapons/sword/full.png b/PyGame/assets/graphics/weapons/sword/full.png new file mode 100644 index 0000000..3b395d8 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sword/full.png differ diff --git a/PyGame/assets/graphics/weapons/sword/left.png b/PyGame/assets/graphics/weapons/sword/left.png new file mode 100644 index 0000000..34abbfa Binary files /dev/null and b/PyGame/assets/graphics/weapons/sword/left.png differ diff --git a/PyGame/assets/graphics/weapons/sword/right.png b/PyGame/assets/graphics/weapons/sword/right.png new file mode 100644 index 0000000..fd96c2c Binary files /dev/null and b/PyGame/assets/graphics/weapons/sword/right.png differ diff --git a/PyGame/assets/graphics/weapons/sword/up.png b/PyGame/assets/graphics/weapons/sword/up.png new file mode 100644 index 0000000..5cac8d4 Binary files /dev/null and b/PyGame/assets/graphics/weapons/sword/up.png differ diff --git a/PyGame/assets/map/Entities.csv b/PyGame/assets/map/Entities.csv new file mode 100644 index 0000000..5923096 --- /dev/null +++ b/PyGame/assets/map/Entities.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,392,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,391,-1,-1,-1,391,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,391,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,400,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,391,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,390,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,392,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,393,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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/PyGame/assets/map/FloorBlocks.csv b/PyGame/assets/map/FloorBlocks.csv new file mode 100644 index 0000000..a59ba69 --- /dev/null +++ b/PyGame/assets/map/FloorBlocks.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,395,395,395,395,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,395,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,700,-1,395,-1,-1,-1 +-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,395,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,395,395,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,395,395,395,395,395,395,395,-1,-1,395,395,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,395,-1,-1,395,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,395,395,395,395,395,395,395,395,395,395,395,395,395,-1,-1,395,395,395,395,395,395,395,395,395,395,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,395,395,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,395,395,395,395,-1,-1,-1,-1,395,395,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,395,-1,-1,395,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,-1,-1,395,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,395,-1,-1,395,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,395,395,395,-1,-1,395,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,395,395,395,395,395,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,395,395,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,395,-1,395,395,395,395,395,395,395,395,395,-1,395,395,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,395,395,395,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,600 diff --git a/PyGame/assets/map/Grass.csv b/PyGame/assets/map/Grass.csv new file mode 100644 index 0000000..c29bae0 --- /dev/null +++ b/PyGame/assets/map/Grass.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,10,8,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,9,9,8,10,10,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,8,10,9,10,10,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,8,-1,10,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,10,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,9,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,8,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,10,9,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,10,9,8,-1,9,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,9,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,10,-1,-1,8,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,10,9,9,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,8,10,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,9,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,9,-1,-1,10,9,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,8,-1,9,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,9,8,10,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,8,8,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,10,-1,-1,9,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,8,-1,10,9,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,8,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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/PyGame/assets/map/Objects.csv b/PyGame/assets/map/Objects.csv new file mode 100644 index 0000000..0157972 --- /dev/null +++ b/PyGame/assets/map/Objects.csv @@ -0,0 +1,50 @@ +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,19,-1,-1,-1,-1,6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,14,5,-1,-1,-1,-1,10,-1,-1,-1,-1,14,-1,2,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,4,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,2,-1,-1,-1,-1,2,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,8,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,15,-1,12,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,13,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-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/PyGame/camera.py b/PyGame/camera.py new file mode 100644 index 0000000..19999fa --- /dev/null +++ b/PyGame/camera.py @@ -0,0 +1,67 @@ +import os +import pygame + +from utils.resource_loader import import_assets + + +class Camera(pygame.sprite.Group): + + def __init__(self): + super().__init__() + + # General Setup + self.display_surface = pygame.display.get_surface() + self.display_size = self.display_surface.get_size() + + self.floor_surf = pygame.image.load( + import_assets( + os.path.join('graphics', + 'tilemap', + 'ground.png') + ) + ).convert() + + self.floor_rect = self.floor_surf.get_rect(topleft=(0, 0)) + + self.calculate_scale() + + def calculate_scale(self): + map_width, map_height = self.floor_rect.size + screen_width, screen_height = self.display_size + + # Calculating the scale to fit the map on the screen + self.scale = min(screen_width / map_width, screen_height / map_height) + self.scaled_floor_surf = pygame.transform.scale(self.floor_surf, + (int(map_width * self.scale), + int(map_height * self.scale))) + self.scaled_floor_rect = self.scaled_floor_surf.get_rect() + + def custom_draw(self): + # Drawing the scaled floor + self.display_surface.blit( + self.scaled_floor_surf, self.scaled_floor_rect.topleft) + + for sprite in sorted(self.sprites(), key=lambda sprite: sprite.rect.centery if not hasattr(sprite, 'animation') else sprite.animation.rect.centery): + # Check for sprites with 'animation' attribute + if hasattr(sprite, 'animation'): + scaled_sprite_image = pygame.transform.scale(sprite.animation.image, + (int(sprite.animation.rect.width * self.scale), + int(sprite.animation.rect.height * self.scale))) + scaled_position = (int(sprite.animation.rect.x * self.scale), + int(sprite.animation.rect.y * self.scale)) + for sprite in sorted(self.sprites(), key=lambda sprite: sprite.rect.centery if not hasattr(sprite, 'animation') else sprite.animation.rect.centery): + # Check for sprites with 'animation' attribute + if hasattr(sprite, 'animation'): + scaled_sprite_image = pygame.transform.scale(sprite.animation.image, + (int(sprite.animation.rect.width * self.scale), + int(sprite.animation.rect.height * self.scale))) + scaled_position = (int(sprite.animation.rect.x * self.scale), + int(sprite.animation.rect.y * self.scale)) + else: + scaled_sprite_image = pygame.transform.scale(sprite.image, + (int(sprite.rect.width * self.scale), + int(sprite.rect.height * self.scale))) + scaled_position = (int(sprite.rect.x * self.scale), + int(sprite.rect.y * self.scale)) + + self.display_surface.blit(scaled_sprite_image, scaled_position) diff --git a/PyGame/config/__init__.py b/PyGame/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/config/game/__init__.py b/PyGame/config/game/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/config/game/monster_config.py b/PyGame/config/game/monster_config.py new file mode 100644 index 0000000..56f5d37 --- /dev/null +++ b/PyGame/config/game/monster_config.py @@ -0,0 +1,41 @@ +monster_data = { + 'squid': {'id': 1, + 'health': 1, + 'exp': 10, + 'attack': 2, + 'attack_type': 'slash', + 'speed': 3, + 'knockback': 20, + 'attack_radius': 100, + 'notice_radius': 200}, + + 'raccoon': {'id': 2, + 'health': 1, + 'exp': 25, + 'attack':5, + 'attack_type': 'claw', + 'speed': 2, + 'knockback': 10, + 'attack_radius': 100, + 'notice_radius': 180}, + + 'spirit': {'id': 3, + 'health': 1, + 'exp': 11, + 'attack': 2, + 'attack_type': 'thunder', + 'speed': 4, + 'knockback': 20, + 'attack_radius': 100, + 'notice_radius': 220}, + + 'bamboo': {'id': 4, + 'health': 1, + 'exp': 9, + 'attack': 1, + 'attack_type': 'leaf_attack', + 'speed': 3, + 'knockback': 20, + 'attack_radius': 100, + 'notice_radius': 300} +} diff --git a/PyGame/config/game/player_config.py b/PyGame/config/game/player_config.py new file mode 100644 index 0000000..b7ccdea --- /dev/null +++ b/PyGame/config/game/player_config.py @@ -0,0 +1,51 @@ +tank_stats = { + 'role_id': 1, + 'health': 150, + 'energy': 70, + 'attack': 10, + 'magic': 5, + 'speed': 5 +} + +mage_stats = { + 'role_id': 2, + 'health': 70, + 'energy': 80, + 'attack': 7, + 'magic': 6, + 'speed': 5 +} + +warrior_stats = { + 'role_id': 3, + 'health': 100, + 'energy': 60, + 'attack': 12, + 'magic': 4, + 'speed': 5 +} + +base_stats = { + 'role_id': 0, + 'health': 150, + 'energy': 70, + 'attack': 10, + 'magic': 5, + 'speed': 5 +} + +max_stats = { + 'health': 300, + 'energy': 150, + 'attack': 20, + 'magic': 10, + 'speed': 10 +} + +upgrade_costs = { + 'health': 100, + 'energy': 100, + 'attack': 100, + 'magic': 100, + 'speed': 100 +} diff --git a/PyGame/config/game/spell_config.py b/PyGame/config/game/spell_config.py new file mode 100644 index 0000000..3f74a9d --- /dev/null +++ b/PyGame/config/game/spell_config.py @@ -0,0 +1,22 @@ +import os + +from utils.resource_loader import import_assets + + +magic_data = { + 'flame': {'strength': 5, 'cost': .020, 'graphic': import_assets( + os.path.join('graphics', + 'particles', + 'flame', + 'fire.png') + ) + }, + + 'heal': {'strength': 20, 'cost': .010, 'graphic': import_assets( + os.path.join('graphics', + 'particles', + 'heal', + 'heal.png') + ) + } +} diff --git a/PyGame/config/game/weapon_config.py b/PyGame/config/game/weapon_config.py new file mode 100644 index 0000000..3eb1b42 --- /dev/null +++ b/PyGame/config/game/weapon_config.py @@ -0,0 +1,43 @@ +import os + +from utils.resource_loader import import_assets + + +weapon_data = { + 'sword': {'cooldown': 100, 'damage': 15, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'sword', + 'full.png') + ) + }, + + 'lance': {'cooldown': 400, 'damage': 30, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'lance', + 'full.png') + ) + }, + 'axe': {'cooldown': 300, 'damage': 20, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'axe', + 'full.png') + ) + }, + 'rapier': {'cooldown': 50, 'damage': 8, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'rapier', + 'full.png') + ) + }, + 'sai': {'cooldown': 80, 'damage': 10, 'graphic': import_assets( + os.path.join('graphics', + 'weapons', + 'sai', + 'full.png') + ) + }, +} diff --git a/PyGame/config/system/window.py b/PyGame/config/system/window.py new file mode 100644 index 0000000..5a59b22 --- /dev/null +++ b/PyGame/config/system/window.py @@ -0,0 +1,15 @@ +# game setup +WIDTH = 1280 +HEIGHT = 720 +FPS = 1000 +TILESIZE = 64 +HITBOX_OFFSET = { + 'player': (-6, -26), + 'camera': (-50, -50), + 'object': (0, -40), + 'grass': (0, -10), + 'invisible': (0, 0) +} + +# general colors +WATER_COLOR = '#71ddee' diff --git a/PyGame/effects/__init__.py b/PyGame/effects/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/effects/magic_effects.py b/PyGame/effects/magic_effects.py new file mode 100644 index 0000000..a87a0ac --- /dev/null +++ b/PyGame/effects/magic_effects.py @@ -0,0 +1,57 @@ +import pygame +from random import randint + +from config.system.window import TILESIZE + + +class MagicPlayer: + def __init__(self, animation_player): + self.animation_player = animation_player + + def heal(self, player, strength, cost, groups): + if player.energy >= cost: + self.sounds['heal'].play() + player.health += strength + player.energy -= cost + if player.health >= player.stats['health']: + player.health = player.stats['health'] + self.animation_player.generate_particles( + 'aura', + player.rect.center, + groups) + + self.animation_player.generate_particles( + 'heal', + player.rect.center + pygame.math.Vector2(0, -50), + groups) + + def flame(self, player, cost, groups): + if player.energy >= cost: + player.energy -= cost + + if player.status.split('_')[0] == 'right': + direction = pygame.math.Vector2(1, 0) + elif player.status.split('_')[0] == 'left': + direction = pygame.math.Vector2(-1, 0) + elif player.status.split('_')[0] == 'up': + direction = pygame.math.Vector2(0, -1) + else: + direction = pygame.math.Vector2(0, 1) + + for i in range(1, 6): + if direction.x: + offset_x = direction.x * i * TILESIZE + x = player.rect.centerx + offset_x + \ + randint(-TILESIZE // 3, TILESIZE // 3) + y = player.rect.centery + \ + randint(-TILESIZE // 3, TILESIZE // 3) + self.animation_player.generate_particles( + 'flame', (x, y), groups) + else: + offset_y = direction.y * i * TILESIZE + x = player.rect.centerx + \ + randint(-TILESIZE // 3, TILESIZE // 3) + y = player.rect.centery + offset_y + \ + randint(-TILESIZE // 3, TILESIZE // 3) + self.animation_player.generate_particles( + 'flame', (x, y), groups) diff --git a/PyGame/effects/particle_effects.py b/PyGame/effects/particle_effects.py new file mode 100644 index 0000000..2faed8f --- /dev/null +++ b/PyGame/effects/particle_effects.py @@ -0,0 +1,160 @@ +import os +import pygame + +from utils.resource_loader import import_folder +from random import choice + + +class AnimationPlayer: + def __init__(self): + + self.frames = { + # Spells + 'flame': import_folder(os.path.join('graphics', + 'particles', + 'flame', + 'frames')), + + 'aura': import_folder(os.path.join('graphics', + 'particles', + 'aura')), + + 'heal': import_folder(os.path.join('graphics', + 'particles', + 'heal', + 'frames')), + + # Attacks + 'claw': import_folder(os.path.join('graphics', + 'particles', + 'claw')), + + 'slash': import_folder(os.path.join('graphics', + 'particles', + 'slash')), + + 'sparkle': import_folder(os.path.join('graphics', + 'particles', + 'sparkle')), + + 'leaf_attack': import_folder(os.path.join('graphics', + 'particles', + 'leaf_attack')), + 'thunder': import_folder(os.path.join('graphics', + 'particles', + 'thunder')), + + # Monster Deaths + 'squid': import_folder(os.path.join('graphics', + 'particles', + 'smoke_orange')), + + 'raccoon': import_folder(os.path.join('graphics', + 'particles', + 'raccoon')), + + 'spirit': import_folder(os.path.join('graphics', + 'particles', + 'nova')), + + 'bamboo': import_folder(os.path.join('graphics', + 'particles', + 'bamboo')), + + # Leafs + 'leaf': ( + import_folder(os.path.join('graphics', + 'particles', + 'leaf1')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf2')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf3')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf4')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf5')), + + import_folder(os.path.join('graphics', + 'particles', + 'leaf6')), + + self.reflect_images( + import_folder(os.path.join('graphics', + 'particles', + 'leaf1'))), + + self.reflect_images( + import_folder(os.path.join('graphics', + 'particles', + 'leaf2'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf3'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf4'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf5'))), + + self.reflect_images( + import_folder( + os.path.join('graphics', + 'particles', + 'leaf6'))) + ) + } + + def reflect_images(self, frames): + new_frames = [] + for frame in frames: + flipped_frame = pygame.transform.flip(frame, True, False) + new_frames.append(flipped_frame) + return new_frames + + def create_grass_particles(self, position, groups): + animation_frames = choice(self.frames['leaf']) + ParticleEffect(position, animation_frames, groups) + + def generate_particles(self, animation_type, position, groups): + animation_frames = self.frames[animation_type] + ParticleEffect(position, animation_frames, groups) + + +class ParticleEffect(pygame.sprite.Sprite): + def __init__(self, position, animation_frames, groups): + super().__init__(groups) + self.frame_index = 0 + self.animation_speed = 0.15 + self.frames = animation_frames + self.image = self.frames[self.frame_index] + self.rect = self.image.get_rect(center=position) + self.sprite_type = 'magic' + + def animate(self): + self.frame_index += self.animation_speed + if self.frame_index >= len(self.frames): + self.kill() + else: + self.image = self.frames[int(self.frame_index)] + + def update(self): + self.animate() diff --git a/PyGame/effects/weapon_effects.py b/PyGame/effects/weapon_effects.py new file mode 100644 index 0000000..f7febf2 --- /dev/null +++ b/PyGame/effects/weapon_effects.py @@ -0,0 +1,35 @@ +import os +import pygame + +from utils.resource_loader import import_assets + + +class Weapon(pygame.sprite.Sprite): + + def __init__(self, player, groups): + super().__init__(groups) + + self.sprite_type = 'weapon' + direction = player.status.split('_')[0] + + # Graphic + self.image = pygame.image.load(import_assets(os.path.join( + 'graphics', + 'weapons', + player.weapon, + f"{direction}.png")) + ).convert_alpha() + + # Sprite Placement + if direction == 'right': + self.rect = self.image.get_rect( + midleft=player.rect.midright + pygame.math.Vector2(0, 16)) + elif direction == 'left': + self.rect = self.image.get_rect( + midright=player.rect.midleft + pygame.math.Vector2(0, 16)) + elif direction == 'down': + self.rect = self.image.get_rect( + midtop=player.rect.midbottom + pygame.math.Vector2(-10, 0)) + else: + self.rect = self.image.get_rect( + midbottom=player.rect.midtop + pygame.math.Vector2(-10, 0)) diff --git a/PyGame/entities/__init__.py b/PyGame/entities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/entities/components/__init__.py b/PyGame/entities/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/entities/components/_input.py b/PyGame/entities/components/_input.py new file mode 100644 index 0000000..6f282c9 --- /dev/null +++ b/PyGame/entities/components/_input.py @@ -0,0 +1,173 @@ +import pygame +from random import randint, choice + +from config.game.spell_config import magic_data +from config.game.weapon_config import weapon_data +# +from .movement import MovementHandler +from .combat import CombatHandler + + +class InputHandler(MovementHandler, CombatHandler): + + def __init__(self): + + MovementHandler.__init__(self) + CombatHandler.__init__(self) + + self.status = 'down' + + # Setup Movement + self.move_cooldown = 15 + self.can_move = True + self.move_time = None + + # Setup Combat + self.attacking = False + self.attack_cooldown = 400 + self.attack_time = None + + # Setup Special Actions + self.can_rotate_weapon = True + self.weapon_rotation_time = None + self.rotate_attack_cooldown = 600 + + self.can_swap_magic = True + self.magic_swap_time = None + + # Setup Action Space + self.possible_actions = [0, 1, 2, 3, 4] + self.action = 10 + + def check_input(self, + button, + speed, + hitbox, + obstacle_sprites, + rect + ): + + if not self.attacking and self.can_move: + + self.move_time = pygame.time.get_ticks() + + # Movement Input + if self.action == 0: # keys[pygame.K_w]: + self.direction.y = -1 + self.status = 'up' + self.can_move = False + self.action = 0 + + elif self.action == 1: # keys[pygame.K_s]: + self.direction.y = 1 + self.status = 'down' + self.can_move = False + self.action = 1 + + else: + self.direction.y = 0 + + if self.action == 2: # keys[pygame.K_a]: + self.direction.x = -1 + self.status = 'left' + self.can_move = False + self.action = 2 + + elif self.action == 3: # keys[pygame.K_d]: + self.direction.x = 1 + self.status = 'right' + self.can_move = False + self.action = 3 + + else: + self.direction.x = 0 + + self.move(speed, hitbox, obstacle_sprites, rect) + + # Combat Input + if self.action == 4 and not self.attacking: # keys[pygame.K_e] + self.attacking = True + self.attack_time = pygame.time.get_ticks() + self.create_attack_sprite() + self.action = 4 + + # Magic Input + if self.action == 5: + self.attacking = True + self.attack_time = pygame.time.get_ticks() + + self.magic = list(magic_data.keys())[ + self.magic_index] + + strength = list(magic_data.values())[ + self.magic_index]['strength'] + self.stats['magic'] + + cost = list(magic_data.values())[ + self.magic_index]['cost'] + self.create_magic_sprite( + self.magic, strength, cost) + self.action = 5 + + # Rotating Weapons + if self.action == 6 and self.can_rotate_weapon: + + self.can_rotate_weapon = False + self.weapon_rotation_time = pygame.time.get_ticks() + + if self.weapon_index\ + < len(list(weapon_data.keys())) - 1: + + self.weapon_index += 1 + else: + self.weapon_index = 0 + + self.weapon = list(weapon_data.keys())[ + self.weapon_index] + self.action = 6 + + # Swap Spells + if self.action == 7 and self.can_swap_magic: + self.can_swap_magic = False + self.magic_swap_time = pygame.time.get_ticks() + if self.magic_index < len(list(magic_data.keys())) - 1: + self.magic_index += 1 + else: + self.magic_index = 0 + self.action = 7 + + def cooldowns(self, vulnerable): + current_time = pygame.time.get_ticks() + self.vulnerable = vulnerable + + if self.attacking: + if current_time - self.attack_time\ + > self.attack_cooldown\ + + weapon_data[self.weapon]['cooldown']: + + self.attacking = False + if self.current_attack: + self.delete_attack_sprite() + + if not self.can_rotate_weapon: + if current_time - self.weapon_rotation_time\ + > self.rotate_attack_cooldown: + + self.can_rotate_weapon = True + + if not self.can_swap_magic: + if current_time - self.magic_swap_time\ + > self.rotate_attack_cooldown: + + self.can_swap_magic = True + + if not vulnerable: + if current_time - self.hurt_time\ + >= self.invulnerability_duration: + + self.vulnerable = True + + if not self.can_move: + if current_time - self.move_time\ + >= self.move_cooldown: + + self.can_move = True diff --git a/PyGame/entities/components/animation.py b/PyGame/entities/components/animation.py new file mode 100644 index 0000000..d2dd0cf --- /dev/null +++ b/PyGame/entities/components/animation.py @@ -0,0 +1,97 @@ +import os +import pygame + +from math import sin + +from config.system.window import HITBOX_OFFSET + +from effects.particle_effects import AnimationPlayer + +from .stats import StatsHandler + +from utils.resource_loader import import_folder, import_assets + + +class AnimationHandler(StatsHandler): + + def __init__(self): + + self.frame_index = 0 + self.animation_speed = 0.15 + + def import_assets(self, position): + + # Import graphic assets + if self.sprite_type == 'player': + self.image = pygame.image.load( + import_assets(os.path.join('graphics', + 'player', + 'down', + 'down_0.png'))).convert_alpha() + + self.rect = self.image.get_rect(topleft=position) + self.hitbox = self.rect.inflate(HITBOX_OFFSET[self.sprite_type]) + + self.animations = { + 'up': [], 'down': [], + 'left': [], 'right': [], + 'up_idle': [], 'down_idle': [], + 'left_idle': [], 'right_idle': [], + 'up_attack': [], 'down_attack': [], + 'left_attack': [], 'right_attack': [] + } + + for animation in self.animations.keys(): + self.animations[animation]\ + = import_folder(os.path.join('graphics', + 'player', + animation + )) + + elif self.sprite_type == 'enemy': + + self.status = 'idle' + + self.animations = {'idle': [], 'move': [], 'attack': []} + + for animation in self.animations.keys(): + self.animations[animation]\ + = import_folder(os.path.join('graphics', + 'monsters', + self.name, + animation)) + + self.image = self.animations[self.status][self.frame_index] + self.rect = self.image.get_rect(topleft=position) + self.hitbox = self.rect.inflate(0, -10) + + def animate(self, status, vulnerable=True, can_attack=False): + + animation = self.animations[status] + self.frame_index += self.animation_speed + if self.frame_index >= len(animation): + if self.sprite_type == 'enemy': + if status == 'attack': + self.can_attack = False + self.frame_index = 0 + + # Set the image + self.image = animation[int(self.frame_index)] + self.rect = self.image.get_rect(center=self.hitbox.center) + + if not vulnerable: + alpha = self.wave_value() + self.image.set_alpha(alpha) + else: + self.image.set_alpha(255) + + def trigger_death_particles(self, position, particle_type, groups): + AnimationPlayer().generate_particles( + particle_type, position, groups) + + def wave_value(self): + value = sin(pygame.time.get_ticks()) + if value >= 0: + return 255 + else: + return 0 diff --git a/PyGame/entities/components/combat.py b/PyGame/entities/components/combat.py new file mode 100644 index 0000000..c1baee4 --- /dev/null +++ b/PyGame/entities/components/combat.py @@ -0,0 +1,47 @@ +from config.game.weapon_config import weapon_data +from config.game.spell_config import magic_data + +from effects.magic_effects import MagicPlayer +from effects.particle_effects import AnimationPlayer +from effects.weapon_effects import Weapon + + + + +class CombatHandler: + + def __init__(self): + + # Setup Combat + self.magic_player = MagicPlayer(AnimationPlayer()) + self.current_attack = None + + # Spell and Weapon Rotation + self.weapon_index = 0 + self.weapon = list(weapon_data.keys())[self.weapon_index] + + self.magic_index = 0 + self.magic = list(magic_data.keys())[self.magic_index] + + # Damage Timer + self.vulnerable = True + self.hurt_time = None + self.invulnerability_duration = 300 + + def create_attack_sprite(self): + self.current_attack = Weapon( + self, [self.visible_sprites, self.attack_sprites]) + + def delete_attack_sprite(self): + if self.current_attack: + self.current_attack.kill() + self.current_attack = None + + def create_magic_sprite(self, style, strength, cost): + if style == 'heal': + self.magic_player.heal(self, strength, cost, [ + self.visible_sprites]) + + if style == 'flame': + self.magic_player.flame( + self, cost, [self.visible_sprites, self.attack_sprites]) diff --git a/PyGame/entities/components/movement.py b/PyGame/entities/components/movement.py new file mode 100644 index 0000000..e50190d --- /dev/null +++ b/PyGame/entities/components/movement.py @@ -0,0 +1,40 @@ +import pygame + + +class MovementHandler: + + def __init__(self): + self.direction = pygame.math.Vector2() + + def move(self, speed, hitbox, obstacle_sprites, rect): + if self.direction.magnitude() != 0: + self.direction = self.direction.normalize() + + hitbox.x += self.direction.x * speed + self.collision('horizontal', hitbox, obstacle_sprites) + hitbox.y += self.direction.y * speed + self.collision('vertical', hitbox, obstacle_sprites) + rect.center = hitbox.center + + def collision(self, direction, hitbox, obstacle_sprites): + if direction == 'horizontal': + for sprite in obstacle_sprites: + # The following works for static obstacles only + if sprite.hitbox.colliderect(hitbox): + # Moving Right + if self.direction.x > 0: + hitbox.right = sprite.hitbox.left + # Moving Left + if self.direction.x < 0: + hitbox.left = sprite.hitbox.right + + if direction == 'vertical': + for sprite in obstacle_sprites: + # The following works for static obstacles only + if sprite.hitbox.colliderect(hitbox): + # Moving Down + if self.direction.y > 0: + hitbox.bottom = sprite.hitbox.top + # Moving Up + if self.direction.y < 0: + hitbox.top = sprite.hitbox.bottom diff --git a/PyGame/entities/components/stats.py b/PyGame/entities/components/stats.py new file mode 100644 index 0000000..a0b4f8d --- /dev/null +++ b/PyGame/entities/components/stats.py @@ -0,0 +1,54 @@ +from config.game.player_config import warrior_stats, mage_stats, tank_stats +from config.game.monster_config import monster_data + +class StatsHandler: + + def get_stats(self, sprite_type, role=None, monster_name=None): + + if sprite_type == 'player': + if role == 'warrior': + self.stats = warrior_stats + elif role == 'tank': + self.stats = tank_stats + elif role == 'mage': + self.stats = mage_stats + else: + self.stats = base_stats + + self.role_id = self.stats['role_id'] + self.health = self.stats['health'] + self.energy = self.stats['energy'] + self.attack = self.stats['attack'] + self.magic = self.stats['magic'] + self.speed = self.stats['speed'] + self.exp = 0 + + if sprite_type == 'enemy': + self.monster_info = monster_data[monster_name] + self.monster_id = self.monster_info['id'] + self.health = self.monster_info['health'] + self.attack = self.monster_info['attack'] + self.attack_type = self.monster_info['attack_type'] + self.attack_radius = self.monster_info['attack_radius'] + self.speed = self.monster_info['speed'] + self.knockback = self.monster_info['knockback'] + self.notice_radius = self.monster_info['notice_radius'] + self.exp = self.monster_info['exp'] + + def energy_recovery(self): + if self.energy < self.stats['energy']: + self.energy += 0.01 * self.magic + else: + self.energy = self.stats['energy'] + + def health_recovery(self): + if self.energy < self.stats['health']: + self.energy += 0.15 + else: + self.energy = self.stats['energy'] + + def get_value_by_index(self, index): + return list(self.stats.values())[index] + + def get_cost_by_index(self, index): + return list(self.upgrade_costs.values())[index] diff --git a/PyGame/entities/enemy.py b/PyGame/entities/enemy.py new file mode 100644 index 0000000..d73773d --- /dev/null +++ b/PyGame/entities/enemy.py @@ -0,0 +1,83 @@ +import pygame + +from .entity import Entity + +from effects.particle_effects import AnimationPlayer + + +class Enemy(Entity): + + def __init__(self, + name, + position, + groups, + visible_sprites, + obstacle_sprites + ): + + super().__init__(groups=groups, + visible_sprites=visible_sprites, + obstacle_sprites=obstacle_sprites, + attack_sprites=None, + attackable_sprites=None) + + # Setup stats + self.sprite_type = 'enemy' + self.name = name + self.get_stats(self.sprite_type, monster_name=self.name) + + # Graphics Setup + self.animation_player = AnimationPlayer() + self.import_assets(position) + + self.distance_direction_from_player = None + + def get_action(self): + player_distance = sorted( + self.distance_direction_from_player, key=lambda x: x[0])[0] + + if player_distance[0] < self.notice_radius and player_distance[0] >= self.attack_radius: + self.direction = player_distance[1] + self.status = "move" + self.move( + self.speed, self.hitbox, self.obstacle_sprites, self.rect) + elif player_distance[0] <= self.attack_radius: + self.status = 'attack' + else: + self.status = 'idle' + + def add_exp(self, player): + player.exp += self.exp + + def check_death(self, player): + if self.health <= 0: + self.add_exp(player) + self.trigger_death_particles( + self.rect.center, self.name, self.visible_sprites) + self.kill() + + def get_damaged(self, player, attack_type): + if self.vulnerable: + for _, direction, attacking_player in self.distance_direction_from_player: + if attacking_player == player: + self.direction = -direction + self.move( + self.speed * self.knockback, self.hitbox, self.obstacle_sprites, self.rect) + break + if attack_type == 'weapon': + self.health -= player.get_full_weapon_damage() + else: + self.health -= player.get_full_magic_damage() + self.check_death(player) + self.hurt_time = pygame.time.get_ticks() + self.vulnerable = False + + def update(self): + + self.get_action() + + self.animate(self.status, self.vulnerable) + self.image = self.image + self.rect = self.rect + + self.cooldowns(self.vulnerable) diff --git a/PyGame/entities/entity.py b/PyGame/entities/entity.py new file mode 100644 index 0000000..852d011 --- /dev/null +++ b/PyGame/entities/entity.py @@ -0,0 +1,33 @@ +import pygame +import numpy as np + +from random import randint + +from .components._input import InputHandler +from .components.animation import AnimationHandler + +from effects.particle_effects import AnimationPlayer + + +class Entity(pygame.sprite.Sprite, AnimationHandler, InputHandler): + def __init__( + self, + groups, + obstacle_sprites, + visible_sprites, + attack_sprites = None, + attackable_sprites = None + ): + + super().__init__(groups) + AnimationHandler.__init__(self) + InputHandler.__init__(self) + + # Sprite Setup + self.obstacle_sprites = obstacle_sprites + self.visible_sprites = visible_sprites + self.attack_sprites = attack_sprites + self.attackable_sprites = attackable_sprites + + + diff --git a/PyGame/entities/observer.py b/PyGame/entities/observer.py new file mode 100644 index 0000000..ae53fae --- /dev/null +++ b/PyGame/entities/observer.py @@ -0,0 +1,66 @@ +import os +import pygame + +from configs.system.window_config import HITBOX_OFFSET + +from utils.resource_loader import import_assets + + +class Observer(pygame.sprite.Sprite): + + def __init__(self, position, groups): + super().__init__(groups) + + self.sprite_type = 'camera' + + self.image = pygame.image.load( + import_assets(os.path.join('graphics', + 'observer.png')) + ).convert_alpha() + + self.rect = self.image.get_rect(topleft=position) + self.hitbox = self.rect.inflate(HITBOX_OFFSET[self.sprite_type]) + + # Stats + self.exp = -1 # This prints OBSERVER in the UI + self.speed = 10 # Speed for moving around + + # Movement + self.direction = pygame.math.Vector2() + + def input(self): + keys = pygame.key.get_pressed() + + # Movement Input + if keys[pygame.K_w]: + self.direction.y = -1 + self.status = 'up' + self.can_move = False + elif keys[pygame.K_s]: + self.direction.y = 1 + self.status = 'down' + self.can_move = False + else: + self.direction.y = 0 + + if keys[pygame.K_a]: + self.direction.x = -1 + self.status = 'left' + self.can_move = False + elif keys[pygame.K_d]: + self.direction.x = 1 + self.status = 'right' + self.can_move = False + else: + self.direction.x = 0 + + def move(self, speed): + if self.direction.magnitude() != 0: + self.direction = self.direction.normalize() + self.hitbox.x += self.direction.x * speed + self.hitbox.y += self.direction.y * speed + self.rect.center = self.hitbox.center + + def update(self): + self.input() + self.move(self.speed) diff --git a/PyGame/entities/player.py b/PyGame/entities/player.py new file mode 100644 index 0000000..e80b38e --- /dev/null +++ b/PyGame/entities/player.py @@ -0,0 +1,232 @@ +import pygame +import numpy as np +from random import randint + +from config.game.weapon_config import weapon_data +from config.game.spell_config import magic_data + +from .entity import Entity + +from effects.particle_effects import AnimationPlayer + +from ml.ppo.agent import Agent + + +class Player(Entity): + def __init__(self, + player_id, + role, + position, + map_edge, + groups, + obstacle_sprites, + visible_sprites, + attack_sprites, + attackable_sprites + ): + + super().__init__(groups=groups, + obstacle_sprites=obstacle_sprites, + visible_sprites=visible_sprites, + attack_sprites=attack_sprites, attackable_sprites=attackable_sprites) + + # Setup stats + self.sprite_type = 'player' + self.get_stats(self.sprite_type, role=role) + + # Graphics Setup + self.animation_player = AnimationPlayer() + self.import_assets(position) + + # Set misc + self.initial_position = position + self.map_edge = map_edge + self.player_id = player_id + self.distance_direction_from_enemy = None + + def setup_agent(self, + gamma, + alpha, + policy_clip, + batch_size, + n_epochs, + gae_lambda, + chkpt_dir, + entropy_coef, + load=None): + + self.max_num_enemies = len(self.distance_direction_from_enemy) + self.get_current_state() + self.num_features = len(self.state_features) + + self.agent = Agent( + input_dims=self.num_features, + n_actions=len(self.possible_actions), + gamma=gamma, + alpha=alpha, + policy_clip=policy_clip, + batch_size=batch_size, + n_epochs=n_epochs, + gae_lambda=gae_lambda, + entropy_coef=entropy_coef, + chkpt_dir=chkpt_dir + ) + print( + f"\nAgent initialized on player {self.player_id} using {self.agent.actor.device}.") + + if load: + print("Attempting to load models ...") + try: + self.agent.load_models( + actr_chkpt=f"{chkpt_dir}/../run{load}/A{self.player_id}", + crtc_chkpt=f"{chkpt_dir}/../run{load}/C{self.player_id}" + ) + print("Models loaded ...\n") + + except FileNotFoundError: + print( + f"FileNotFound for player {self.player_id}.\ + \nSkipping loading ...\n") + + def get_status(self): + if self.direction.x == 0\ + and self.direction.y == 0: + + if 'idle' not in self.status and 'attack' not in self.status: + self.status += '_idle' + + if self.attacking: + self.direction.x = 0 + self.direction.y = 0 + if 'attack' not in self.status: + if 'idle' in self.status: + self.status = self.status.replace( + 'idle', 'attack') + else: + self.status += '_attack' + else: + if 'attack' in self.status: + self.status = self.status.replace('_attack', '') + + def attack_logic(self): + if self.attack_sprites: + for attack_sprite in self.attack_sprites: + collision_sprites = pygame.sprite.spritecollide( + attack_sprite, self.attackable_sprites, False) + if collision_sprites: + for target_sprite in collision_sprites: + if target_sprite.sprite_type == 'grass': + pos = target_sprite.rect.center + offset = pygame.math.Vector2(0, 75) + for leaf in range(randint(3, 6)): + self.animation_player.create_grass_particles( + position=pos - offset, + groups=[self.visible_sprites]) + + target_sprite.kill() + else: + target_sprite.get_damaged( + self, attack_sprite.sprite_type) + + def get_full_weapon_damage(self): + base_damage = self.attack + weapon_damage = weapon_data[self.weapon]['damage'] + return (base_damage + weapon_damage) + + def get_full_magic_damage(self): + base_damage = self.stats['magic'] + spell_damage = magic_data[self.magic]['strength'] + return (base_damage + spell_damage) + + def get_current_state(self): + + if self.distance_direction_from_enemy != []: + sorted_distances = sorted( + self.distance_direction_from_enemy, key=lambda x: x[0]) + else: + sorted_distances = np.zeros(self.num_features) + + nearest_dist, nearest_en_dir, nearest_enemy = sorted_distances[0] + + self.action_features = [self.action] + + if hasattr(self, 'state_features'): + self.old_state_features = self.state_features + + self.reward = self.exp\ + + self.health/self.stats['health'] + # - nearest_dist/np.sqrt(np.sum(self.map_edge)) + + self.state_features = [ + self.rect.center[0]/self.map_edge[0], + self.rect.center[1]/self.map_edge[1], + self.direction.x, + self.direction.y, + self.health/self.stats['health'], + self.energy/self.stats['energy'], + ] + + for distance, direction, enemy in sorted_distances[:5]: + self.state_features.extend([ + + distance/np.sqrt(np.sum(self.map_edge)), + + direction[0], + + direction[1], + + enemy.health / + enemy.monster_info['health'], + + enemy.exp, + ]) + + if hasattr(self, 'num_features'): + while len(self.state_features) < self.num_features: + self.state_features.append(0) + + self.state_features = np.array(self.state_features) + + def is_dead(self): + if self.health <= 0: + self.health = 0 + self.import_assets((3264, 448)) + return True + else: + return False + + def agent_update(self): + + # Get the current state + self.get_current_state() + + # Choose action based on current state + self.action, probs, value\ + = self.agent.choose_action(self.state_features) + + # Apply chosen action + self.check_input(self.action, + self.speed, + self.hitbox, + self.obstacle_sprites, + self.rect + ) + + self.agent.remember(self.state_features, self.action, + probs, value, self.reward, self.is_dead()) + + self.get_current_state() + + def update(self): + + self.agent_update() + + # Cooldowns and Regen + self.health_recovery() + self.energy_recovery() + + # Refresh player based on input and animate + self.get_status() + self.animate( + self.status, self.vulnerable) + self.cooldowns(self.vulnerable) diff --git a/PyGame/entities/terrain.py b/PyGame/entities/terrain.py new file mode 100644 index 0000000..7cfb5cf --- /dev/null +++ b/PyGame/entities/terrain.py @@ -0,0 +1,31 @@ +import pygame + +from config.system.window import TILESIZE,\ + HITBOX_OFFSET + + +class Terrain(pygame.sprite.Sprite): + + def __init__(self, + position, + groups, + sprite_type, + surface=pygame.Surface((TILESIZE, TILESIZE)) + ): + + super().__init__(groups) + + self.sprite_type = sprite_type + + self.position = position + + self.image = surface + + if sprite_type == 'object': + # Offset + self.rect = self.image.get_rect( + topleft=(position[0], position[1] - TILESIZE)) + else: + self.rect = self.image.get_rect(topleft=position) + + self.hitbox = self.rect.inflate(HITBOX_OFFSET[sprite_type]) diff --git a/PyGame/folder_struct.py b/PyGame/folder_struct.py new file mode 100644 index 0000000..8db37af --- /dev/null +++ b/PyGame/folder_struct.py @@ -0,0 +1,30 @@ +import os + + +def set_directories(base_path): + + if not os.path.exists(base_path): + os.makedirs(base_path) + + trial_dirs = [directory for directory in os.listdir( + base_path) if os.path.isdir(os.path.join(base_path, directory))] + trial_nums = sorted([int(directory[-1]) + for directory in trial_dirs if directory.startswith("run") and directory[-1].isdigit()]) + next_trial_num = trial_nums[-1] + 1 if trial_nums else 1 + new_trial_path = os.path.join(base_path, f"run{next_trial_num}") + + os.makedirs(new_trial_path) + return new_trial_path + + +def setup_dirs(): + + home_folder = os.path.dirname(os.path.abspath(__file__)) + + chkpt_path = os.path.join(home_folder, 'chkpts') + chkpt_path = set_directories(chkpt_path) + + figure_path = os.path.join(home_folder, 'figures') + figure_path = set_directories(figure_path) + + return chkpt_path, figure_path diff --git a/PyGame/game.py b/PyGame/game.py new file mode 100644 index 0000000..c2ad11f --- /dev/null +++ b/PyGame/game.py @@ -0,0 +1,62 @@ +import os +os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" + +from config.system.window import WIDTH,\ + HEIGHT,\ + WATER_COLOR,\ + FPS +from level import Level +import pygame +import sys + + + + + +class Pneuma: + + def __init__(self, show_pg=False, n_players=1,): + print(f"Initializing Pneuma with {n_players} player(s).\ + \nShowing PyGame screen: {'True' if show_pg else 'False'}") + + pygame.init() + + if show_pg: + + self.screen = pygame.display.set_mode( + (WIDTH, HEIGHT) + ) + + else: + self.screen = pygame.display.set_mode( + (WIDTH, HEIGHT), + pygame.HIDDEN + ) + + pygame.display.set_caption("Pneuma") + + img = pygame.image.load(os.path.join('assets', + 'graphics', + 'icon.png')) + pygame.display.set_icon(img) + + self.level = Level(n_players) + + def run(self): + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + self.quit() + elif event.type == pygame.KEYDOWN: + if event.key == pygame.K_m: + self.level.pause() + + self.screen.fill(WATER_COLOR) + + self.level.run() + + pygame.display.update() + + def quit(self): + pygame.quit() + sys.exit() diff --git a/PyGame/interface/__init__.py b/PyGame/interface/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/interface/ui.py b/PyGame/interface/ui.py new file mode 100644 index 0000000..ce3fb98 --- /dev/null +++ b/PyGame/interface/ui.py @@ -0,0 +1,112 @@ +import pygame + +from config.game.weapon_config import weapon_data +from config.game.spell_config import magic_data + +from .ui_settings import UI_FONT,\ + UI_FONT_SIZE,\ + HEALTH_BAR_WIDTH,\ + HEALTH_COLOR,\ + ENERGY_BAR_WIDTH,\ + ENERGY_COLOR,\ + BAR_HEIGHT,\ + UI_BG_COLOR,\ + UI_BORDER_COLOR_ACTIVE,\ + UI_BORDER_COLOR,\ + TEXT_COLOR,\ + ITEM_BOX_SIZE + + +class UI: + def __init__(self): + + # General info + self.display_surface = pygame.display.get_surface() + self.font = pygame.font.Font(UI_FONT, UI_FONT_SIZE) + + # Bar setup + self.health_bar_rect = pygame.Rect( + 10, 10, HEALTH_BAR_WIDTH, BAR_HEIGHT) + self.energy_bar_rect = pygame.Rect( + 10, 34, ENERGY_BAR_WIDTH, BAR_HEIGHT) + + # Convert weapon dictionary + self.weapon_graphics = [] + for weapon in weapon_data.values(): + path = weapon['graphic'] + weapon = pygame.image.load(path).convert_alpha() + self.weapon_graphics.append(weapon) + + # Convert weapon dictionary + self.magic_graphics = [] + for spell in magic_data.values(): + path = spell['graphic'] + spell = pygame.image.load(path).convert_alpha() + self.magic_graphics.append(spell) + + def show_bar(self, current_amount, max_amount, bg_rect, color): + + # Draw background + pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect) + + # Convert stat amount to pixels + ratio = current_amount / max_amount + current_width = bg_rect.width * ratio + current_rect = bg_rect.copy() + current_rect.width = current_width + + # Draw stat bar + pygame.draw.rect(self.display_surface, color, current_rect) + pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, bg_rect, 4) + + def show_exp(self, exp): + if exp >= 0: + text_surf = self.font.render( + f"EXP: {str(int(exp))}", False, TEXT_COLOR) + x = self.display_surface.get_size()[0] - 20 + y = self.display_surface.get_size()[1] - 20 + text_rect = text_surf.get_rect(bottomright=(x, y)) + + pygame.draw.rect(self.display_surface, UI_BG_COLOR, + text_rect.inflate(10, 10)) + self.display_surface.blit(text_surf, text_rect) + pygame.draw.rect(self.display_surface, + UI_BORDER_COLOR, text_rect.inflate(10, 10), 4) + else: + text_surf = self.font.render("OBSERVER", False, TEXT_COLOR) + x = self.display_surface.get_size()[0] - 20 + y = self.display_surface.get_size()[1] - 20 + text_rect = text_surf.get_rect(bottomright=(x, y)) + + pygame.draw.rect(self.display_surface, UI_BG_COLOR, + text_rect.inflate(10, 10)) + self.display_surface.blit(text_surf, text_rect) + pygame.draw.rect(self.display_surface, + UI_BORDER_COLOR, text_rect.inflate(10, 10), 4) + + def selection_box(self, left, top, has_rotated): + bg_rect = pygame.Rect(left, top, ITEM_BOX_SIZE, ITEM_BOX_SIZE) + pygame.draw.rect(self.display_surface, UI_BG_COLOR, bg_rect) + if not has_rotated: + pygame.draw.rect(self.display_surface, + UI_BORDER_COLOR_ACTIVE, bg_rect, 4) + else: + pygame.draw.rect(self.display_surface, UI_BORDER_COLOR, bg_rect, 4) + return bg_rect + + def weapon_overlay(self, weapon_index, has_rotated): + bg_rect = self.selection_box(10, 630, has_rotated) + weapon_surf = self.weapon_graphics[weapon_index] + weapon_rect = weapon_surf.get_rect(center=bg_rect.center) + + self.display_surface.blit(weapon_surf, weapon_rect) + + def magic_overlay(self, magic_index, has_swaped): + bg_rect = self.selection_box(100, 630, has_swaped) + magic_surf = self.magic_graphics[magic_index] + magic_rect = magic_surf.get_rect(center=bg_rect.center) + + self.display_surface.blit(magic_surf, magic_rect) + + def display(self): + self.show_exp(-1) diff --git a/PyGame/interface/ui_settings.py b/PyGame/interface/ui_settings.py new file mode 100644 index 0000000..c45fe59 --- /dev/null +++ b/PyGame/interface/ui_settings.py @@ -0,0 +1,27 @@ +import os +from utils.resource_loader import import_assets + +# UI +BAR_HEIGHT = 20 +HEALTH_BAR_WIDTH = 200 +ENERGY_BAR_WIDTH = 140 +ITEM_BOX_SIZE = 80 +UI_FONT = import_assets(path=os.path.join('font', 'joystix.ttf')) +UI_FONT_SIZE = 18 + +# General Colors +WATER_COLOR = '#71ddee' +UI_BG_COLOR = '#222222' +UI_BORDER_COLOR = '#111111' +TEXT_COLOR = '#EEEEEE' + +# UI Colors +HEALTH_COLOR = 'red' +ENERGY_COLOR = 'blue' +UI_BORDER_COLOR_ACTIVE = 'gold' + +# Upgrade Menu +TEXT_COLOR_SELECTED = '#111111' +BAR_COLOR = '#EEEEEE' +BAR_COLOR_SELECTED = '#111111' +UPGRADE_BG_COLOR_SELECTED = '#EEEEEE' diff --git a/PyGame/interface/upgrade.py b/PyGame/interface/upgrade.py new file mode 100644 index 0000000..17cf502 --- /dev/null +++ b/PyGame/interface/upgrade.py @@ -0,0 +1,156 @@ +import pygame + +from .ui_settings import UI_FONT,\ + UI_FONT_SIZE,\ + TEXT_COLOR,\ + TEXT_COLOR_SELECTED,\ + UPGRADE_BG_COLOR_SELECTED,\ + UI_BORDER_COLOR,\ + UI_BG_COLOR,\ + BAR_COLOR_SELECTED,\ + BAR_COLOR + + +class Upgrade: + + def __init__(self, player): + + # General setup + self.display_surface = pygame.display.get_surface() + self.player = player + self.attribute_num = len(player.stats.stats) + self.attribute_names = list(player.stats.stats.keys()) + self.max_values = list(player.stats.max_stats.values()) + self.font = pygame.font.Font(UI_FONT, UI_FONT_SIZE) + + # Defining upgrade boxes + self.height = self.display_surface.get_size()[1] * 0.8 + self.width = self.display_surface.get_size()[ + 0] // (self.attribute_num + 1) + self.create_boxes() + + # Selection System + self.selection_index = 0 + self.selection_time = None + self.can_move = True + + def input(self): + keys = pygame.key.get_pressed() + + if self.can_move: + if keys[pygame.K_d]: + self.selection_index += 1 + if self.selection_index == self.attribute_num: + self.selection_index = 0 + self.can_move = False + self.selection_time = pygame.time.get_ticks() + elif keys[pygame.K_a]: + self.selection_index -= 1 + if self.selection_index == -1: + self.selection_index = self.attribute_num - 1 + self.can_move = False + self.selection_time = pygame.time.get_ticks() + + if keys[pygame.K_SPACE]: + self.can_move = False + self.selection_time = pygame.time.get_ticks() + self.box_list[self.selection_index].trigger(self.player) + + def selection_cooldown(self): + if not self.can_move: + current_time = pygame.time.get_ticks() + if current_time - self.selection_time >= 150: + self.can_move = True + + def create_boxes(self): + self.box_list = [] + + for box, index in enumerate(range(self.attribute_num)): + + # Horizontal position + full_width = self.display_surface.get_size()[0] + increment = full_width // self.attribute_num + left = (box * increment) + (increment - self.width) // 2 + + # Vertical position + top = self.display_surface.get_size()[1] * 0.1 + + box = Box(left, top, self.width, self.height, index, self.font) + self.box_list.append(box) + + def display(self): + + self.input() + self.selection_cooldown() + + for index, box in enumerate(self.box_list): + # Get attributes + name = self.attribute_names[index] + value = self.player.stats.get_value_by_index(index) + max_value = self.max_values[index] + cost = self.player.stats.get_cost_by_index(index) + box.display(self.display_surface, self.selection_index, + name, value, max_value, cost) + + +class Box: + def __init__(self, left, top, width, height, index, font): + self.rect = pygame.Rect(left, top, width, height) + self.index = index + self.font = font + + def display_names(self, surface, name, cost, selected): + color = TEXT_COLOR_SELECTED if selected else TEXT_COLOR + + # Title + title_surf = self.font.render(name, False, color) + title_rect = title_surf.get_rect( + midtop=self.rect.midtop + pygame.math.Vector2(0, 20)) + # Cost + cost_surf = self.font.render(f'Cost: {int(cost)}', False, color) + cost_rect = cost_surf.get_rect( + midbottom=self.rect.midbottom + - pygame.math.Vector2(0, 20)) + + # Draw + surface.blit(title_surf, title_rect) + surface.blit(cost_surf, cost_rect) + + def display_bar(self, surface, value, max_value, selected): + + # Line setup + top = self.rect.midtop + pygame.math.Vector2(0, 60) + bottom = self.rect.midbottom - pygame.math.Vector2(0, 60) + color = BAR_COLOR_SELECTED if selected else BAR_COLOR + + # Bar setup + full_height = bottom[1] - top[1] + relative_number = (value / max_value) * full_height + value_rect = pygame.Rect( + top[0] - 15, bottom[1] - relative_number, 30, 10) + + # Draw elements + pygame.draw.line(surface, color, top, bottom, 5) + pygame.draw.rect(surface, color, value_rect) + + def trigger(self, player): + upgrade_attribute = list(player.stats.stats.keys())[self.index] + + if player.stats.exp >= player.stats.upgrade_costs[upgrade_attribute] and player.stats.stats[upgrade_attribute] < player.stats.max_stats[upgrade_attribute]: + player.stats.exp -= player.stats.upgrade_costs[upgrade_attribute] + player.stats.stats[upgrade_attribute] *= 1.2 + player.stats.upgrade_costs[upgrade_attribute] *= 1.4 + + if player.stats.stats[upgrade_attribute] > player.stats.max_stats[upgrade_attribute]: + player.stats.stats[upgrade_attribute] = player.stats.max_stats[upgrade_attribute] + + def display(self, surface, selection_num, name, value, max_value, cost): + if self.index == selection_num: + pygame.draw.rect(surface, UPGRADE_BG_COLOR_SELECTED, self.rect) + pygame.draw.rect(surface, UI_BORDER_COLOR, self.rect, 4) + else: + pygame.draw.rect(surface, UI_BG_COLOR, self.rect) + pygame.draw.rect(surface, UI_BORDER_COLOR, self.rect, 4) + + self.display_names(surface, name, cost, self.index == selection_num) + self.display_bar(surface, value, max_value, + self.index == selection_num) diff --git a/PyGame/level.py b/PyGame/level.py new file mode 100644 index 0000000..02637a3 --- /dev/null +++ b/PyGame/level.py @@ -0,0 +1,297 @@ +import os +import pygame +import numpy as np + +from random import choice + +from config.system.window import TILESIZE + +from utils.debug import debug +from utils.resource_loader import import_csv_layout, import_folder + +from interface.ui import UI + +from entities.player import Player +from entities.enemy import Enemy +from entities.terrain import Terrain + +from camera import Camera + + +class Level: + + def __init__(self, n_players): + + self.paused = False + self.done = False + + # Get display surface + self.display_surface = pygame.display.get_surface() + + # Setup Sprite groups + self.visible_sprites = Camera() + self.obstacle_sprites = pygame.sprite.Group() + self.attack_sprites = pygame.sprite.Group() + self.attackable_sprites = pygame.sprite.Group() + + # Map generation + self.n_players = n_players + self.generate_map() + + # Handle generated entities + self.get_entities() + self.get_distance_direction() + self.dead_players = np.zeros(self.n_players) + + # Setup UI + self.ui = UI() + + def generate_map(self): + + self.possible_player_locations = [] + + self.layouts = { + 'boundary': import_csv_layout(os.path.join('map', + 'FloorBlocks.csv')), + 'grass': import_csv_layout(os.path.join('map', + 'Grass.csv')), + 'objects': import_csv_layout(os.path.join('map', + 'Objects.csv')), + 'entities': import_csv_layout(os.path.join('map', + 'Entities.csv')) + } + + self.graphics = { + 'grass': import_folder(os.path.join('graphics', 'grass')), + 'objects': import_folder(os.path.join('graphics', 'objects')) + } + + for style, layout in self.layouts.items(): + for row_index, row in enumerate(layout): + for col_index, col in enumerate(row): + if int(col) != -1: + + x = col_index * TILESIZE + y = row_index * TILESIZE + + # Generate unpassable terrain + if style == 'boundary': + + if col == '600': + self.map_edge = (x, y) + + elif col != '700': + Terrain((x, y), + [self.obstacle_sprites], + 'invisible') + elif col == '700' and self.n_players > 1: + print(f"Prison set at:{(x, y)}") + # # Generate grass + # if style == 'grass': + # random_grass_image = choice(self.graphics['grass']) + # + # Terrain((x, y), [ + # self.visible_sprites, + # self.obstacle_sprites, + # self.attackable_sprites + # ], + # 'grass', + # random_grass_image) + # + # # Generate objects like trees and statues + # if style == 'objects': + # surface = self.graphics['objects'][int(col)] + # Terrain((x, y), [ + # self.visible_sprites, + # self.obstacle_sprites + # ], + # 'object', + # surface) + + # Generate observer, players and monsters + if style == 'entities': + + # Generate player(s) + if col == '400': + self.possible_player_locations.append((x, y)) + + # Monster generation + elif col in ['390', '391', '392', '393']: + if col == '390': + monster_name = 'bamboo' + elif col == '391': + monster_name = 'spirit' + elif col == '392': + monster_name = 'raccoon' + elif col == '393': + monster_name = 'squid' + Enemy(name=monster_name, + position=(x, y), + groups=[self.visible_sprites, + self.attackable_sprites], + visible_sprites=self.visible_sprites, + obstacle_sprites=self.obstacle_sprites) + + for player_id in range(self.n_players): + Player( + player_id, + 'tank', + choice(self.possible_player_locations), + self.map_edge, + [self.visible_sprites], + self.obstacle_sprites, + self.visible_sprites, + self.attack_sprites, + self.attackable_sprites + ) + + def reset(self): + + for grass in self.grass_sprites: + grass.kill() + + for enemy in self.enemy_sprites: + enemy.kill() + + for style, layout in self.layouts.items(): + for row_index, row in enumerate(layout): + for col_index, col in enumerate(row): + if int(col) != -1: + x = col_index * TILESIZE + y = row_index * TILESIZE + # # Regenerate grass + # if style == 'grass': + # random_grass_image = choice( + # self.graphics['grass']) + # + # Terrain((x, y), [ + # self.visible_sprites, + # self.obstacle_sprites, + # self.attackable_sprites + # ], + # 'grass', + # random_grass_image) + + if style == 'entities': + + if col in ['390', '391', '392', '393']: + if col == '390': + monster_name = 'bamboo' + elif col == '391': + monster_name = 'spirit' + elif col == '392': + monster_name = 'raccoon' + elif col == '393': + monster_name = 'squid' + + Enemy(monster_name, + (x, y), + [self.visible_sprites, + self.attackable_sprites], + self.visible_sprites, + self.obstacle_sprites) + + for player in self.player_sprites: + + player.import_assets( + choice(self.possible_player_locations)) + + player.health\ + = player.stats['health'] + + player.energy\ + = player.stats['energy'] + + player.exp = 0 + + self.get_entities() + self.get_distance_direction() + self.dead_players = np.zeros(self.n_players) + self.done = False + + def get_entities(self): + + self.player_sprites = [sprite + for sprite in self.visible_sprites.sprites() + if sprite.sprite_type == 'player'] + + self.enemy_sprites = [sprite + for sprite in self.visible_sprites.sprites() + if sprite.sprite_type == 'enemy'] + + self.grass_sprites = [sprite + for sprite in self.visible_sprites.sprites() + if sprite.sprite_type == 'grass'] + + def get_distance_direction(self): + for player in self.player_sprites: + player.distance_direction_from_enemy = [] + + for enemy in self.enemy_sprites: + enemy.distance_direction_from_player = [] + + for player in self.player_sprites: + if not player.is_dead(): + player_vector = pygame.math.Vector2( + player.rect.center + ) + + for enemy in self.enemy_sprites: + enemy_vector = pygame.math.Vector2( + enemy.rect.center + ) + distance\ + = (player_vector - enemy_vector).magnitude() + + if distance > 0: + direction\ + = (player_vector - enemy_vector).normalize() + else: + direction\ + = pygame.math.Vector2() + + enemy.distance_direction_from_player.append( + (distance, direction, player)) + player.distance_direction_from_enemy.append( + (distance, -direction, enemy)) + + def apply_damage_to_player(self): + for enemy in self.enemy_sprites: + for distance, _, player in enemy.distance_direction_from_player: + + if (distance < enemy.attack_radius + and player.vulnerable): + + player.health -= enemy.attack + player.vulnerable = False + player.hurt_time = pygame.time.get_ticks() + + def toggle_pause(self): + self.paused = not self.paused + + def run(self): + # Draw the game + self.visible_sprites.custom_draw() + self.ui.display() + + if not self.paused: + # Update the game + for player in self.player_sprites: + if player.health > 0: + player.attack_logic() + + self.get_entities() + self.get_distance_direction() + self.visible_sprites.update() + self.apply_damage_to_player() + + else: + debug('PAUSED') + + for player in self.player_sprites: + if player.is_dead(): + print(f"\nPlayer {player.player_id} is dead\n") + self.dead_players[player.player_id] = player.is_dead() + + self.done = True if (self.dead_players.all() == 1 + or self.enemy_sprites == []) else False diff --git a/PyGame/main.py b/PyGame/main.py new file mode 100644 index 0000000..fef7969 --- /dev/null +++ b/PyGame/main.py @@ -0,0 +1,217 @@ +import os +import random +import torch as T +import numpy as np +import matplotlib.pyplot as plt + +from tqdm import tqdm + +import args +import folder_struct + +import utils.seeds as seeds +import utils.metrics as metrics + +from game import Pneuma + +def main(): + + parsed_args = args.parse_args() + + if not parsed_args.no_seed: + seeds.set_seeds(parsed_args.seed) + print(f"Seed set as {parsed_args.seed}") + else: + print("No seed set") + + chkpt_path, figure_path = folder_struct.setup_dirs() + + # Setup AI params + n_episodes = parsed_args.n_episodes + episode_length = parsed_args.ep_length + n_agents = parsed_args.n_agents + + horizon = parsed_args.horizon + no_training = parsed_args.no_training + + learnings_per_episode = int(episode_length/horizon) + learn_iters = 0 + + show_pygame = parsed_args.show_pg + + # Setup parameter monitoring + score_history = np.zeros( + shape=(parsed_args.n_agents, parsed_args.n_episodes)) + + best_score = np.zeros(parsed_args.n_agents) + + actor_loss = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + critic_loss = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + total_loss = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + entropy = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + advantage = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + + time_alive = np.zeros(shape=(parsed_args.n_agents, + parsed_args.n_episodes)) + game = Pneuma(show_pg=show_pygame, n_players=parsed_args.n_agents) + + print("Initializing agents ...") + for player in tqdm(game.level.player_sprites, + dynamic_ncols=True): + player.setup_agent( + gamma=parsed_args.gamma, + alpha=parsed_args.alpha, + policy_clip=parsed_args.policy_clip, + batch_size=parsed_args.batch_size, + n_epochs=parsed_args.n_epochs, + gae_lambda=parsed_args.gae_lambda, + entropy_coef=parsed_args.entropy_coeff, + chkpt_dir=chkpt_path, + load=parsed_args.load + ) + + # Episodes start + for episode in tqdm(range(n_episodes), + dynamic_ncols=True): + + game.level.reset() + + episode_reward = np.zeros( + shape=(n_agents, episode_length)) + + episode_actor_loss = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_critic_loss = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_total_loss = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_entropy = np.zeros( + shape=(n_agents, learnings_per_episode)) + + episode_advantage = np.zeros( + shape=(n_agents, learnings_per_episode)) + + # Main game loop + for step in tqdm(range(episode_length), + leave=False, + ascii=True, + dynamic_ncols=True): + + if not game.level.done: + game.run() + + for player in game.level.player_sprites: + + episode_reward[player.player_id][step] = player.reward + + if not no_training and (step % horizon == 0 and step != 0): + + player.agent.learn() + + episode_actor_loss[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.actor_loss + + episode_critic_loss[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.critic_loss + + episode_total_loss[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.total_loss + + episode_entropy[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.entropy + + episode_advantage[player.player_id][learn_iters % learnings_per_episode]\ + = player.agent.gae + + learn_iters += 1 + + + + # Gather information about the episode + for player in game.level.player_sprites: + + score = np.mean(episode_reward[player.player_id]) + + # Update score + score_history[player.player_id][episode] = score + + # Update actor/critic loss + actor_loss[player.player_id][episode] = np.mean( + episode_actor_loss) + + critic_loss[player.player_id][episode] = np.mean( + episode_critic_loss) + + total_loss[player.player_id][episode] = np.mean( + episode_total_loss) + + time_alive[player.player_id][episode] = step + + entropy[player.player_id][episode] = np.mean( + episode_entropy) + + advantage[player.player_id][episode] = np.mean( + episode_advantage) + + # Check for new best score + if score > best_score[player.player_id]: + print(f"\nEpisode:\ + {episode}\ + \nNew best score for player {player.player_id}:\ + {score}\ + \nOld best score for player {player.player_id}: \ + {best_score[player.player_id]}") + + best_score[player.player_id] = score + + print(f"Saving models for player {player.player_id}...") + + # Save models + player.agent.save_models( + os.path.join(chkpt_path, f"A{player.player_id}"), + os.path.join(chkpt_path, f"C{player.player_id}") + ) + + print(f"Models saved to {chkpt_path}") + + metrics.plot_learning_curve(score_history, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_score(score_history, parsed_args.n_agents, figure_path) + + metrics.plot_loss('actor', actor_loss, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_loss('critic', critic_loss, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_parameter('entropy', entropy, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_parameter('advantage', advantage, parsed_args.n_agents, figure_path, n_episodes) + + metrics.plot_avg_time(time_alive, parsed_args.n_agents, figure_path) + + # End of training session + print("End of episodes.\ + \n Saving models and exiting game...") + + # Save models + player.agent.save_models( + f"A{player.player_id}_end", + f"C{player.player_id}_end") + + print(f"Models saved to {chkpt_path}") + + game.quit() + +if __name__ == '__main__': + main() diff --git a/PyGame/ml/ppo/__init__.py b/PyGame/ml/ppo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/ml/ppo/agent.py b/PyGame/ml/ppo/agent.py new file mode 100644 index 0000000..f9d8ed3 --- /dev/null +++ b/PyGame/ml/ppo/agent.py @@ -0,0 +1,122 @@ +import numpy as np +import torch as T + +from tqdm import tqdm + +from .brain import ActorNetwork, CriticNetwork, PPOMemory + + +class Agent: + + def __init__(self, input_dims, n_actions, gamma=0.99, alpha=0.0003, + policy_clip=0.2, batch_size=64, n_epochs=10, + gae_lambda=0.95, entropy_coef=0.001, chkpt_dir='tmp/ppo'): + + self.gamma = gamma + self.policy_clip = policy_clip + self.n_epochs = n_epochs + self.gae_lambda = gae_lambda + self.entropy_coef = entropy_coef + + self.actor = ActorNetwork( + input_dims, n_actions, alpha, chkpt_dir=chkpt_dir) + + self.critic = CriticNetwork( + input_dims, alpha, chkpt_dir=chkpt_dir) + + self.memory = PPOMemory(batch_size) + + def remember(self, state, action, probs, vals, reward, done): + self.memory.store_memory(state, action, probs, vals, reward, done) + + def save_models(self, actr_chkpt='actor_ppo', crtc_chkpt='critic_ppo'): + self.actor.save_checkpoint(actr_chkpt) + self.critic.save_checkpoint(crtc_chkpt) + + def load_models(self, actr_chkpt='actor_ppo', crtc_chkpt='critic_ppo'): + self.actor.load_checkpoint(actr_chkpt) + self.critic.load_checkpoint(crtc_chkpt) + + def choose_action(self, observation): + state = T.tensor(observation, dtype=T.float).to(self.actor.device) + dist = self.actor(state) + value = self.critic(state) + action = dist.sample() + + probs = T.squeeze(dist.log_prob(action)).item() + action = T.squeeze(action).item() + value = T.squeeze(value).item() + + self.entropy = dist.entropy().mean().item() + + return action, probs, value + + def learn(self): + for _ in tqdm(range(self.n_epochs), + desc='Learning...', + dynamic_ncols=True, + leave=False, + ascii=True): + + state_arr, action_arr, old_probs_arr, vals_arr, reward_arr, dones_arr, batches = self.memory.generate_batches() + + values = vals_arr + advantage = np.zeros(len(reward_arr), dtype=np.float64) + + for t in range(len(reward_arr)-1): + discount = 1 + a_t = 0 + for k in range(t, len(reward_arr)-1): + a_t += discount * \ + (reward_arr[k] + self.gamma*values[k+1] + * (1-int(dones_arr[k])) - values[k]) + discount *= self.gamma * self.gae_lambda + advantage[t] = a_t + self.gae = np.sum(advantage) + advantage = T.tensor(advantage).to(self.actor.device) + + values = T.tensor(values).to(self.actor.device) + + for batch in batches: + states = T.tensor(state_arr[batch], dtype=T.float).to( + self.actor.device) + old_probs = T.tensor(old_probs_arr[batch]).to( + self.actor.device) + actions = T.tensor(action_arr[batch]).to(self.actor.device) + + dist = self.actor(states) + critic_value = self.critic(states) + + critic_value = T.squeeze(critic_value) + + new_probs = dist.log_prob(actions) + prob_ratio = new_probs.exp() / old_probs.exp() + weighted_probs = advantage[batch] * prob_ratio + + weighted_clipped_probs = T.clamp( + prob_ratio, 1-self.policy_clip, 1+self.policy_clip)*advantage[batch] + + self.actor_loss = -T.min(weighted_probs, + weighted_clipped_probs).mean() + + returns = advantage[batch] + values[batch] + self.critic_loss = (returns - critic_value)**2 + self.critic_loss = self.critic_loss.mean() + + self.total_loss = self.actor_loss + 0.5 * \ + self.critic_loss - self.entropy_coef*self.entropy + + self.actor.optimizer.zero_grad() + self.critic.optimizer.zero_grad() + self.total_loss.backward() + + T.nn.utils.clip_grad_norm_( + self.actor.parameters(), max_norm=2) + + T.nn.utils.clip_grad_norm_( + self.critic.parameters(), max_norm=2) + + self.actor.optimizer.step() + self.critic.optimizer.step() + + self.memory.clear_memory() diff --git a/PyGame/ml/ppo/brain.py b/PyGame/ml/ppo/brain.py new file mode 100644 index 0000000..3e8ddf7 --- /dev/null +++ b/PyGame/ml/ppo/brain.py @@ -0,0 +1,135 @@ +import os +import numpy as np +import torch as T +import torch.nn as nn +import torch.optim as optim +from torch.distributions.categorical import Categorical + + +class PPOMemory: + def __init__(self, batch_size): + self.states = [] + self.probs = [] + self.vals = [] + self.actions = [] + self.rewards = [] + self.dones = [] + + self.batch_size = batch_size + + def generate_batches(self): + + n_states = len(self.states) + batch_start = np.arange(0, n_states, self.batch_size) + indices = np.arange(n_states, dtype=np.int64) + np.random.shuffle(indices) + batches = [indices[i:i+self.batch_size] for i in batch_start] + + return np.array(self.states),\ + np.array(self.actions),\ + np.array(self.probs),\ + np.array(self.vals),\ + np.array(self.rewards),\ + np.array(self.dones),\ + batches + + def store_memory(self, state, action, probs, vals, reward, done): + self.states.append(state) + self.actions.append(action) + self.probs.append(probs) + self.vals.append(vals) + self.rewards.append(reward) + self.dones.append(done) + + def clear_memory(self): + self.states = [] + self.probs = [] + self.vals = [] + self.actions = [] + self.rewards = [] + self.dones = [] + + +class ActorNetwork(nn.Module): + + def __init__(self, input_dim, output_dim, alpha, fc1_dims=1024, fc2_dims=1024, chkpt_dir='tmp'): + super(ActorNetwork, self).__init__() + + self.chkpt_dir = chkpt_dir + + self.actor = nn.Sequential( + nn.Linear(input_dim, fc1_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc2_dims, output_dim), + nn.Softmax(dim=-1) + ) + + self.optimizer = optim.Adam(self.parameters(), lr=alpha, betas=(0.9, 0.9), eps=1e-5) + + self.device = T.device('cuda' if T.cuda.is_available() else 'cpu') + + self.to(self.device) + + def forward(self, state): + dist = self.actor(state) + dist = Categorical(dist) + + return dist + + def save_checkpoint(self, filename): + T.save(self.state_dict(), os.path.join(filename)) + + def load_checkpoint(self, filename): + print(filename) + self.load_state_dict( + T.load(os.path.join(filename), + map_location=self.device)) + + +class CriticNetwork(nn.Module): + + def __init__(self, input_dims, alpha, fc1_dims=4096, fc2_dims=4096, chkpt_dir='tmp'): + super(CriticNetwork, self).__init__() + + self.chkpt_dir = chkpt_dir + + self.critic = nn.Sequential( + nn.Linear(input_dims, fc1_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc1_dims, fc2_dims), + nn.Tanh(), + nn.Linear(fc2_dims, 1) + ) + + self.optimizer = optim.Adam(self.parameters(), lr=alpha, betas=(0.9, 0.9), eps=1e-5) + + self.device = T.device('cuda' if T.cuda.is_available() else 'cpu') + + self.to(self.device) + + def forward(self, state): + value = self.critic(state) + return value + + def save_checkpoint(self, filename): + T.save(self.state_dict(), os.path.join(filename)) + + def load_checkpoint(self, filename): + print(filename) + self.load_state_dict( + T.load(os.path.join(filename), + map_location=self.device)) diff --git a/PyGame/poetry.lock b/PyGame/poetry.lock new file mode 100644 index 0000000..52fe68b --- /dev/null +++ b/PyGame/poetry.lock @@ -0,0 +1,1190 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "contourpy" +version = "1.2.1" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040"}, + {file = "contourpy-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da"}, + {file = "contourpy-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd"}, + {file = "contourpy-1.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619"}, + {file = "contourpy-1.2.1-cp310-cp310-win32.whl", hash = "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8"}, + {file = "contourpy-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5"}, + {file = "contourpy-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2"}, + {file = "contourpy-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205"}, + {file = "contourpy-1.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8"}, + {file = "contourpy-1.2.1-cp311-cp311-win32.whl", hash = "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec"}, + {file = "contourpy-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc"}, + {file = "contourpy-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0"}, + {file = "contourpy-1.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce"}, + {file = "contourpy-1.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4"}, + {file = "contourpy-1.2.1-cp312-cp312-win32.whl", hash = "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f"}, + {file = "contourpy-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b"}, + {file = "contourpy-1.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"}, + {file = "contourpy-1.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02"}, + {file = "contourpy-1.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083"}, + {file = "contourpy-1.2.1-cp39-cp39-win32.whl", hash = "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba"}, + {file = "contourpy-1.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3"}, + {file = "contourpy-1.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f"}, + {file = "contourpy-1.2.1.tar.gz", hash = "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c"}, +] + +[package.dependencies] +numpy = ">=1.20" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.8.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "docstring-to-markdown" +version = "0.13" +description = "On the fly conversion of Python docstrings to markdown" +optional = false +python-versions = ">=3.6" +files = [ + {file = "docstring-to-markdown-0.13.tar.gz", hash = "sha256:3025c428638ececae920d6d26054546a20335af3504a145327e657e7ad7ce1ce"}, + {file = "docstring_to_markdown-0.13-py3-none-any.whl", hash = "sha256:aa487059d0883e70e54da25c7b230e918d9e4d40f23d6dfaa2b73e4225b2d7dd"}, +] + +[[package]] +name = "filelock" +version = "3.13.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fonttools" +version = "4.51.0" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "fsspec" +version = "2023.12.2" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2023.12.2-py3-none-any.whl", hash = "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960"}, + {file = "fsspec-2023.12.2.tar.gz", hash = "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +devel = ["pytest", "pytest-cov"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +tqdm = ["tqdm"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.4" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014"}, + {file = "matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10"}, + {file = "matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0"}, + {file = "matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef"}, + {file = "matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661"}, + {file = "matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa"}, + {file = "matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71"}, + {file = "matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b"}, + {file = "matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616"}, + {file = "matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb"}, + {file = "matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30"}, + {file = "matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25"}, + {file = "matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6"}, + {file = "matplotlib-3.8.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc"}, + {file = "matplotlib-3.8.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9"}, + {file = "matplotlib-3.8.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54"}, + {file = "matplotlib-3.8.4-cp39-cp39-win_amd64.whl", hash = "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f"}, + {file = "matplotlib-3.8.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94"}, + {file = "matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.21" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "mpmath" +version = "1.3.0" +description = "Python library for arbitrary-precision floating-point arithmetic" +optional = false +python-versions = "*" +files = [ + {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, + {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, +] + +[package.extras] +develop = ["codecov", "pycodestyle", "pytest (>=4.6)", "pytest-cov", "wheel"] +docs = ["sphinx"] +gmpy = ["gmpy2 (>=2.1.0a4)"] +tests = ["pytest (>=4.6)"] + +[[package]] +name = "networkx" +version = "3.3" +description = "Python package for creating and manipulating graphs and networks" +optional = false +python-versions = ">=3.10" +files = [ + {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"}, + {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"}, +] + +[package.extras] +default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"] +developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"] +doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"] +extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"] +test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.1.3.1" +description = "CUBLAS native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:ee53ccca76a6fc08fb9701aa95b6ceb242cdaab118c3bb152af4e579af792728"}, + {file = "nvidia_cublas_cu12-12.1.3.1-py3-none-win_amd64.whl", hash = "sha256:2b964d60e8cf11b5e1073d179d85fa340c120e99b3067558f3cf98dd69d02906"}, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.1.105" +description = "CUDA profiling tools runtime libs." +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:e54fde3983165c624cb79254ae9818a456eb6e87a7fd4d56a2352c24ee542d7e"}, + {file = "nvidia_cuda_cupti_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:bea8236d13a0ac7190bd2919c3e8e6ce1e402104276e6f9694479e48bb0eb2a4"}, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.1.105" +description = "NVRTC native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:339b385f50c309763ca65456ec75e17bbefcbbf2893f462cb8b90584cd27a1c2"}, + {file = "nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:0a98a522d9ff138b96c010a65e145dc1b4850e9ecb75a0172371793752fd46ed"}, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.1.105" +description = "CUDA Runtime native Libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:6e258468ddf5796e25f1dc591a31029fa317d97a0a94ed93468fc86301d61e40"}, + {file = "nvidia_cuda_runtime_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:dfb46ef84d73fababab44cf03e3b83f80700d27ca300e537f85f636fac474344"}, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "8.9.2.26" +description = "cuDNN runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.0.2.54" +description = "CUFFT native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl", hash = "sha256:794e3948a1aa71fd817c3775866943936774d1c14e7628c74f6f7417224cdf56"}, + {file = "nvidia_cufft_cu12-11.0.2.54-py3-none-win_amd64.whl", hash = "sha256:d9ac353f78ff89951da4af698f80870b1534ed69993f10a4cf1d96f21357e253"}, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.2.106" +description = "CURAND native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:9d264c5036dde4e64f1de8c50ae753237c12e0b1348738169cd0f8a536c0e1e0"}, + {file = "nvidia_curand_cu12-10.3.2.106-py3-none-win_amd64.whl", hash = "sha256:75b6b0c574c0037839121317e17fd01f8a69fd2ef8e25853d826fec30bdba74a"}, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.4.5.107" +description = "CUDA solver native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd"}, + {file = "nvidia_cusolver_cu12-11.4.5.107-py3-none-win_amd64.whl", hash = "sha256:74e0c3a24c78612192a74fcd90dd117f1cf21dea4822e66d89e8ea80e3cd2da5"}, +] + +[package.dependencies] +nvidia-cublas-cu12 = "*" +nvidia-cusparse-cu12 = "*" +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.1.0.106" +description = "CUSPARSE native runtime libraries" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c"}, + {file = "nvidia_cusparse_cu12-12.1.0.106-py3-none-win_amd64.whl", hash = "sha256:b798237e81b9719373e8fae8d4f091b70a0cf09d9d85c95a557e11df2d8e9a5a"}, +] + +[package.dependencies] +nvidia-nvjitlink-cu12 = "*" + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.19.3" +description = "NVIDIA Collective Communication Library (NCCL) Runtime" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nccl_cu12-2.19.3-py3-none-manylinux1_x86_64.whl", hash = "sha256:a9734707a2c96443331c1e48c717024aa6678a0e2a4cb66b2c364d18cee6b48d"}, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +description = "Nvidia JIT LTO Library" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57"}, + {file = "nvidia_nvjitlink_cu12-12.4.127-py3-none-win_amd64.whl", hash = "sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1"}, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.1.105" +description = "NVIDIA Tools Extension" +optional = false +python-versions = ">=3" +files = [ + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl", hash = "sha256:dc21cf308ca5691e7c04d962e213f8a4aa9bbfa23d95412f452254c2caeb09e5"}, + {file = "nvidia_nvtx_cu12-12.1.105-py3-none-win_amd64.whl", hash = "sha256:65f4d98982b31b60026e0e6de73fbdfc09d08a96f4656dd3665ca616a11e1e82"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pillow" +version = "10.3.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pluggy" +version = "1.4.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pygame" +version = "2.5.2" +description = "Python Game Development" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pygame-2.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a0769eb628c818761755eb0a0ca8216b95270ea8cbcbc82227e39ac9644643da"}, + {file = "pygame-2.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed9a3d98adafa0805ccbaaff5d2996a2b5795381285d8437a4a5d248dbd12b4a"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30d1618672a55e8c6669281ba264464b3ab563158e40d89e8c8b3faa0febebd"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39690e9be9baf58b7359d1f3b2336e1fd6f92fedbbce42987be5df27f8d30718"}, + {file = "pygame-2.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03879ec299c9f4ba23901b2649a96b2143f0a5d787f0b6c39469989e2320caf1"}, + {file = "pygame-2.5.2-cp310-cp310-win32.whl", hash = "sha256:74e1d6284100e294f445832e6f6343be4fe4748decc4f8a51131ae197dae8584"}, + {file = "pygame-2.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:485239c7d32265fd35b76ae8f64f34b0637ae11e69d76de15710c4b9edcc7c8d"}, + {file = "pygame-2.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34646ca20e163dc6f6cf8170f1e12a2e41726780112594ac061fa448cf7ccd75"}, + {file = "pygame-2.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b8a6e351665ed26ea791f0e1fd649d3f483e8681892caef9d471f488f9ea5ee"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc346965847aef00013fa2364f41a64f068cd096dcc7778fc306ca3735f0eedf"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35632035fd81261f2d797fa810ea8c46111bd78ceb6089d52b61ed7dc3c5d05f"}, + {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e24d05184e4195fe5ebcdce8b18ecb086f00182b9ae460a86682d312ce8d31f"}, + {file = "pygame-2.5.2-cp311-cp311-win32.whl", hash = "sha256:f02c1c7505af18d426d355ac9872bd5c916b27f7b0fe224749930662bea47a50"}, + {file = "pygame-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d58c8cf937815d3b7cdc0fa9590c5129cb2c9658b72d00e8a4568dea2ff1d42"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1a2a43802bb5e89ce2b3b775744e78db4f9a201bf8d059b946c61722840ceea8"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c289f2613c44fe70a1e40769de4a49c5ab5a29b9376f1692bb1a15c9c1c9bfa"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074aa6c6e110c925f7f27f00c7733c6303407edc61d738882985091d1eb2ef17"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0228501ec616779a0b9c4299e837877783e18df294dd690b9ab0eed3d8aaab"}, + {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31648d38ecdc2335ffc0e38fb18a84b3339730521505dac68514f83a1092e3f4"}, + {file = "pygame-2.5.2-cp312-cp312-win32.whl", hash = "sha256:224c308856334bc792f696e9278e50d099a87c116f7fc314cd6aa3ff99d21592"}, + {file = "pygame-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:dd2d2650faf54f9a0f5bd0db8409f79609319725f8f08af6507a0609deadcad4"}, + {file = "pygame-2.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b30bc1220c457169571aac998e54b013aaeb732d2fd8744966cb1cfab1f61d1"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78fcd7643358b886a44127ff7dec9041c056c212b3a98977674f83f99e9b12d3"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35cf093a51cb294ede56c29d4acf41538c00f297fcf78a9b186fb7d23c0577b6"}, + {file = "pygame-2.5.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fe323acbf53a0195c8c98b1b941eba7ac24e3e2b28ae48e8cda566f15fc4945"}, + {file = "pygame-2.5.2-cp36-cp36m-win32.whl", hash = "sha256:5697528266b4716d9cdd44a5a1d210f4d86ef801d0f64ca5da5d0816704009d9"}, + {file = "pygame-2.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edda1f7cff4806a4fa39e0e8ccd75f38d1d340fa5fc52d8582ade87aca247d92"}, + {file = "pygame-2.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9bd738fd4ecc224769d0b4a719f96900a86578e26e0105193658a32966df2aae"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30a8d7cf12363b4140bf2f93b5eec4028376ca1d0fe4b550588f836279485308"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc12e4dea3e88ea8a553de6d56a37b704dbe2aed95105889f6afeb4b96e62097"}, + {file = "pygame-2.5.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b34c73cb328024f8db3cb6487a37e54000148988275d8d6e5adf99d9323c937"}, + {file = "pygame-2.5.2-cp37-cp37m-win32.whl", hash = "sha256:7d0a2794649defa57ef50b096a99f7113d3d0c2e32d1426cafa7d618eadce4c7"}, + {file = "pygame-2.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:41f8779f52e0f6e6e6ccb8f0b5536e432bf386ee29c721a1c22cada7767b0cef"}, + {file = "pygame-2.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:677e37bc0ea7afd89dde5a88ced4458aa8656159c70a576eea68b5622ee1997b"}, + {file = "pygame-2.5.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:47a8415d2bd60e6909823b5643a1d4ef5cc29417d817f2a214b255f6fa3a1e4c"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ff21201df6278b8ca2e948fb148ffe88f5481fd03760f381dd61e45954c7dff"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29a84b2e02814b9ba925357fd2e1df78efe5e1aa64dc3051eaed95d2b96eafd"}, + {file = "pygame-2.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d78485c4d21133d6b2fbb504cd544ca655e50b6eb551d2995b3aa6035928adda"}, + {file = "pygame-2.5.2-cp38-cp38-win32.whl", hash = "sha256:d851247239548aa357c4a6840fb67adc2d570ce7cb56988d036a723d26b48bff"}, + {file = "pygame-2.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:88d1cdacc2d3471eceab98bf0c93c14d3a8461f93e58e3d926f20d4de3a75554"}, + {file = "pygame-2.5.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4f1559e7efe4efb9dc19d2d811d702f325d9605f9f6f9ececa39ee6890c798f5"}, + {file = "pygame-2.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf2191b756ceb0e8458a761d0c665b0c70b538570449e0d39b75a5ba94ac5cf0"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cf2257447ce7f2d6de37e5fb019d2bbe32ed05a5721ace8bc78c2d9beaf3aee"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75cbbfaba2b81434d62631d0b08b85fab16cf4a36e40b80298d3868927e1299"}, + {file = "pygame-2.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daca456d5b9f52e088e06a127dec182b3638a775684fb2260f25d664351cf1ae"}, + {file = "pygame-2.5.2-cp39-cp39-win32.whl", hash = "sha256:3b3e619e33d11c297d7a57a82db40681f9c2c3ae1d5bf06003520b4fe30c435d"}, + {file = "pygame-2.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:1822d534bb7fe756804647b6da2c9ea5d7a62d8796b2e15d172d3be085de28c6"}, + {file = "pygame-2.5.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:e708fc8f709a0fe1d1876489345f2e443d47f3976d33455e2e1e937f972f8677"}, + {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c13edebc43c240fb0532969e914f0ccefff5ae7e50b0b788d08ad2c15ef793e4"}, + {file = "pygame-2.5.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:263b4a7cbfc9fe2055abc21b0251cc17dea6dff750f0e1c598919ff350cdbffe"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e58e2b0c791041e4bccafa5bd7650623ba1592b8fe62ae0a276b7d0ecb314b6c"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0bd67426c02ffe6c9827fc4bcbda9442fbc451d29b17c83a3c088c56fef2c90"}, + {file = "pygame-2.5.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dcff6cbba1584cf7732ce1dbdd044406cd4f6e296d13bcb7fba963fb4aeefc9"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce4b6c0bfe44d00bb0998a6517bd0cf9455f642f30f91bc671ad41c05bf6f6ae"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68c4e8e60b725ffc7a6c6ecd9bb5fcc5ed2d6e0e2a2c4a29a8454856ef16ad63"}, + {file = "pygame-2.5.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f3849f97372a3381c66955f99a0d58485ccd513c3d00c030b869094ce6997a6"}, + {file = "pygame-2.5.2.tar.gz", hash = "sha256:c1b89eb5d539e7ac5cf75513125fb5f2f0a2d918b1fd6e981f23bf0ac1b1c24a"}, +] + +[[package]] +name = "pyparsing" +version = "3.1.2" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-lsp-jsonrpc" +version = "1.1.2" +description = "JSON RPC 2.0 server library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-lsp-jsonrpc-1.1.2.tar.gz", hash = "sha256:4688e453eef55cd952bff762c705cedefa12055c0aec17a06f595bcc002cc912"}, + {file = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl", hash = "sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c"}, +] + +[package.dependencies] +ujson = ">=3.0.0" + +[package.extras] +test = ["coverage", "pycodestyle", "pyflakes", "pylint", "pytest", "pytest-cov"] + +[[package]] +name = "python-lsp-server" +version = "1.11.0" +description = "Python Language Server for the Language Server Protocol" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-lsp-server-1.11.0.tar.gz", hash = "sha256:89edd6fb3f7852e4bf5a3d1d95ea41484d1a28fa94b6e3cbff12b9db123b8e86"}, + {file = "python_lsp_server-1.11.0-py3-none-any.whl", hash = "sha256:278cb41ea69ca9f84ec99d4edc96ff5f2f9e795d240771dc46dc1653f56ddfe3"}, +] + +[package.dependencies] +docstring-to-markdown = "*" +jedi = ">=0.17.2,<0.20.0" +pluggy = ">=1.0.0" +python-lsp-jsonrpc = ">=1.1.0,<2.0.0" +ujson = ">=3.0.0" + +[package.extras] +all = ["autopep8 (>=2.0.4,<2.1.0)", "flake8 (>=7,<8)", "mccabe (>=0.7.0,<0.8.0)", "pycodestyle (>=2.11.0,<2.12.0)", "pydocstyle (>=6.3.0,<6.4.0)", "pyflakes (>=3.2.0,<3.3.0)", "pylint (>=3.1,<4)", "rope (>=1.11.0)", "whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] +autopep8 = ["autopep8 (>=2.0.4,<2.1.0)"] +flake8 = ["flake8 (>=7,<8)"] +mccabe = ["mccabe (>=0.7.0,<0.8.0)"] +pycodestyle = ["pycodestyle (>=2.11.0,<2.12.0)"] +pydocstyle = ["pydocstyle (>=6.3.0,<6.4.0)"] +pyflakes = ["pyflakes (>=3.2.0,<3.3.0)"] +pylint = ["pylint (>=3.1,<4)"] +rope = ["rope (>=1.11.0)"] +test = ["coverage", "flaky", "matplotlib", "numpy", "pandas", "pylint (>=3.1,<4)", "pyqt5", "pytest", "pytest-cov"] +websockets = ["websockets (>=10.3)"] +yapf = ["whatthepatch (>=1.0.2,<2.0.0)", "yapf (>=0.33.0)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sympy" +version = "1.12" +description = "Computer algebra system (CAS) in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "sympy-1.12-py3-none-any.whl", hash = "sha256:c3588cd4295d0c0f603d0f2ae780587e64e2efeedb3521e46b9bb1d08d184fa5"}, + {file = "sympy-1.12.tar.gz", hash = "sha256:ebf595c8dac3e0fdc4152c51878b498396ec7f30e7a914d6071e674d49420fb8"}, +] + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +name = "torch" +version = "2.2.2" +description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "torch-2.2.2-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:bc889d311a855dd2dfd164daf8cc903a6b7273a747189cebafdd89106e4ad585"}, + {file = "torch-2.2.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15dffa4cc3261fa73d02f0ed25f5fa49ecc9e12bf1ae0a4c1e7a88bbfaad9030"}, + {file = "torch-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:11e8fe261233aeabd67696d6b993eeb0896faa175c6b41b9a6c9f0334bdad1c5"}, + {file = "torch-2.2.2-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:b2e2200b245bd9f263a0d41b6a2dab69c4aca635a01b30cca78064b0ef5b109e"}, + {file = "torch-2.2.2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:877b3e6593b5e00b35bbe111b7057464e76a7dd186a287280d941b564b0563c2"}, + {file = "torch-2.2.2-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb"}, + {file = "torch-2.2.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf"}, + {file = "torch-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c"}, + {file = "torch-2.2.2-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059"}, + {file = "torch-2.2.2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1"}, + {file = "torch-2.2.2-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:cf12cdb66c9c940227ad647bc9cf5dba7e8640772ae10dfe7569a0c1e2a28aca"}, + {file = "torch-2.2.2-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:89ddac2a8c1fb6569b90890955de0c34e1724f87431cacff4c1979b5f769203c"}, + {file = "torch-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:451331406b760f4b1ab298ddd536486ab3cfb1312614cfe0532133535be60bea"}, + {file = "torch-2.2.2-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:eb4d6e9d3663e26cd27dc3ad266b34445a16b54908e74725adb241aa56987533"}, + {file = "torch-2.2.2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:bf9558da7d2bf7463390b3b2a61a6a3dbb0b45b161ee1dd5ec640bf579d479fc"}, + {file = "torch-2.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd2bf7697c9e95fb5d97cc1d525486d8cf11a084c6af1345c2c2c22a6b0029d0"}, + {file = "torch-2.2.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b421448d194496e1114d87a8b8d6506bce949544e513742b097e2ab8f7efef32"}, + {file = "torch-2.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:3dbcd563a9b792161640c0cffe17e3270d85e8f4243b1f1ed19cca43d28d235b"}, + {file = "torch-2.2.2-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:31f4310210e7dda49f1fb52b0ec9e59382cfcb938693f6d5378f25b43d7c1d29"}, + {file = "torch-2.2.2-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:c795feb7e8ce2e0ef63f75f8e1ab52e7fd5e1a4d7d0c31367ade1e3de35c9e95"}, + {file = "torch-2.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:a6e5770d68158d07456bfcb5318b173886f579fdfbf747543901ce718ea94782"}, + {file = "torch-2.2.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:67dcd726edff108e2cd6c51ff0e416fd260c869904de95750e80051358680d24"}, + {file = "torch-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:539d5ef6c4ce15bd3bd47a7b4a6e7c10d49d4d21c0baaa87c7d2ef8698632dfb"}, + {file = "torch-2.2.2-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:dff696de90d6f6d1e8200e9892861fd4677306d0ef604cb18f2134186f719f82"}, + {file = "torch-2.2.2-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:3a4dd910663fd7a124c056c878a52c2b0be4a5a424188058fe97109d4436ee42"}, +] + +[package.dependencies] +filelock = "*" +fsspec = "*" +jinja2 = "*" +networkx = "*" +nvidia-cublas-cu12 = {version = "12.1.3.1", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-cupti-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-nvrtc-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cuda-runtime-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cudnn-cu12 = {version = "8.9.2.26", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cufft-cu12 = {version = "11.0.2.54", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-curand-cu12 = {version = "10.3.2.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusolver-cu12 = {version = "11.4.5.107", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-cusparse-cu12 = {version = "12.1.0.106", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nccl-cu12 = {version = "2.19.3", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +nvidia-nvtx-cu12 = {version = "12.1.105", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\""} +sympy = "*" +triton = {version = "2.2.0", markers = "platform_system == \"Linux\" and platform_machine == \"x86_64\" and python_version < \"3.12\""} +typing-extensions = ">=4.8.0" + +[package.extras] +opt-einsum = ["opt-einsum (>=3.3)"] +optree = ["optree (>=0.9.1)"] + +[[package]] +name = "tqdm" +version = "4.66.2" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "triton" +version = "2.2.0" +description = "A language and compiler for custom Deep Learning operations" +optional = false +python-versions = "*" +files = [ + {file = "triton-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2294514340cfe4e8f4f9e5c66c702744c4a117d25e618bd08469d0bfed1e2e5"}, + {file = "triton-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da58a152bddb62cafa9a857dd2bc1f886dbf9f9c90a2b5da82157cd2b34392b0"}, + {file = "triton-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af58716e721460a61886668b205963dc4d1e4ac20508cc3f623aef0d70283d5"}, + {file = "triton-2.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8fe46d3ab94a8103e291bd44c741cc294b91d1d81c1a2888254cbf7ff846dab"}, + {file = "triton-2.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ce26093e539d727e7cf6f6f0d932b1ab0574dc02567e684377630d86723ace"}, + {file = "triton-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:227cc6f357c5efcb357f3867ac2a8e7ecea2298cd4606a8ba1e931d1d5a947df"}, +] + +[package.dependencies] +filelock = "*" + +[package.extras] +build = ["cmake (>=3.20)", "lit"] +tests = ["autopep8", "flake8", "isort", "numpy", "pytest", "scipy (>=1.7.1)", "torch"] +tutorials = ["matplotlib", "pandas", "tabulate", "torch"] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "ujson" +version = "5.9.0" +description = "Ultra fast JSON encoder and decoder for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, + {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, + {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, + {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, + {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, + {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, + {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, + {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, + {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, + {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, + {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, + {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, + {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "f1ac9f8912b4e220c40bd29453219d15897f96ae13f070641ba8dedc36e86957" diff --git a/PyGame/pyproject.toml b/PyGame/pyproject.toml new file mode 100644 index 0000000..886840c --- /dev/null +++ b/PyGame/pyproject.toml @@ -0,0 +1,45 @@ +[tool.poetry] +name = "thesis" +version = "0.8.1" +description = "A training environment for MARL" +authors = ["Vasilis Valatsos "] +license = "MPL-2.0" +readme = "README.md" +package-mode = false + +[tool.poetry.dependencies] +python = "^3.11" +contourpy = "^1.2.0" +cycler = "^0.12.1" +docstring-to-markdown = "^0.13" +filelock = "^3.13.1" +fonttools = "^4.45.1" +fsspec = "^2023.10.0" +jedi = "^0.19.1" +jinja2 = "^3.1.2" +kiwisolver = "^1.4.5" +markupsafe = "^2.1.3" +matplotlib = "^3.8.2" +mpmath = "^1.3.0" +networkx = "^3.2.1" +numpy = "^1.26.2" +packaging = "^23.2" +parso = "^0.8.3" +pillow = "^10.1.0" +pluggy = "^1.3.0" +pygame = "^2.5.2" +pyparsing = "^3.1.1" +python-dateutil = "^2.8.2" +python-lsp-jsonrpc = "^1.1.2" +python-lsp-server = "^1.9.0" +six = "^1.16.0" +sympy = "^1.12" +torch = "^2.1.0" +tqdm = "^4.66.1" +typing-extensions = "^4.8.0" +ujson = "^5.8.0" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/PyGame/utils/__init__.py b/PyGame/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PyGame/utils/debug.py b/PyGame/utils/debug.py new file mode 100644 index 0000000..6cdc42c --- /dev/null +++ b/PyGame/utils/debug.py @@ -0,0 +1,13 @@ +import pygame + +pygame.init() + +font = pygame.font.Font(None, 30) + + +def debug(info, y=10, x=10): + display_surface = pygame.display.get_surface() + debug_surf = font.render(str(info), True, 'White') + debug_rect = debug_surf.get_rect(topleft=(x, y)) + pygame.draw.rect(display_surface, 'Black', debug_rect) + display_surface.blit(debug_surf, debug_rect) diff --git a/PyGame/utils/hyperparams.py b/PyGame/utils/hyperparams.py new file mode 100644 index 0000000..0cd7274 --- /dev/null +++ b/PyGame/utils/hyperparams.py @@ -0,0 +1,16 @@ +HPARAMS = { + + "horizon": 256, + "num_epochs": 10, + "batch_size": 15, + + "policy_clip": 0.1, + "discount_factor": 0.99, + "GAE_lambda": 0.95, + + "entropy_coeff": 0.01, + "value_coeff": 0.5, + + "learning_rate": 0.0003, + +} diff --git a/PyGame/utils/metrics.py b/PyGame/utils/metrics.py new file mode 100644 index 0000000..318ccc9 --- /dev/null +++ b/PyGame/utils/metrics.py @@ -0,0 +1,75 @@ +import os +import numpy as np +import matplotlib.pyplot as plt + + +def plot_learning_curve(scores, num_players, figure_path, n_episodes): + + plt.figure() + plt.title("Running Average - Score") + plt.xlabel("Episode") + plt.ylabel("Score") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for score in scores: + running_avg = np.zeros(len(score)) + for i in range(len(score)): + if score[i] != 0: + running_avg[i] = np.mean(score[max(0, i-int(n_episodes/10)):i+1]) + plt.plot(running_avg) + plt.savefig(os.path.join(figure_path, "avg_score.png")) + plt.close() + +def plot_avg_time(time_steps, num_players, fig_path): + + plt.figure() + plt.title("Average Time Steps per Episode") + for player in time_steps: + plt.plot(player) + plt.savefig(os.path.join(fig_path, 'avg_time.png')) + plt.close() + +def plot_score(scores, num_players, figure_path): + + plt.figure() + plt.title("Agent Rewards - No Averaging") + plt.xlabel("Episode") + plt.ylabel("Score") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for player_score in scores: + plt.plot(player_score) + plt.savefig(os.path.join(figure_path, 'score.png')) + plt.close() + + +def plot_loss(nn_type, losses, num_players, figure_path, n_episodes): + + plt.figure() + plt.title(f"Running Average - {nn_type.capitalize()} Loss") + plt.xlabel("Learning Iterations") + plt.ylabel("Loss") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for loss in losses: + running_avg = np.zeros(len(loss)) + for i in range(len(loss)): + if loss[i] != 0: + running_avg[i] = np.mean(loss[max(0, i-int(n_episodes/10)):(i+1)]) + plt.plot(running_avg) + plt.savefig(os.path.join(figure_path, f"{nn_type}_loss.png")) + plt.close() + + +def plot_parameter(name, parameter, num_players, figure_path, n_episodes): + + plt.figure() + plt.title(f"Running Average - {name.capitalize()}") + plt.xlabel("Learning Iterations") + plt.ylabel(f"{name.capitalize()}") + plt.legend([f"Agent {num}" for num in range(num_players)]) + for param in parameter: + running_avg = np.zeros(len(param)) + for i in range(len(param)): + if param[i] != 0: + running_avg[i] = np.mean(param[max(0, i-int(n_episodes/10)):(i+1)]) + plt.plot(running_avg) + plt.savefig(os.path.join(figure_path, f"{name}.png")) + plt.close() diff --git a/PyGame/utils/resource_loader.py b/PyGame/utils/resource_loader.py new file mode 100644 index 0000000..21c406f --- /dev/null +++ b/PyGame/utils/resource_loader.py @@ -0,0 +1,42 @@ +import pygame +from csv import reader +import os + + +def import_csv_layout(path): + script_dir = os.path.dirname(os.path.abspath(__file__)) + path = os.path.join(script_dir, + '..', + 'assets', + path) + terrain_map = [] + with open(path) as level_map: + layout = reader(level_map, delimiter=',') + for row in layout: + terrain_map.append(list(row)) + return terrain_map + + +def import_folder(path): + script_dir = os.path.dirname(os.path.abspath(__file__)) + + path = os.path.join(script_dir, + '..', + 'assets', + path) + surface_list = [] + + for _, __, img_files in os.walk(path): + for image in img_files: + full_path = os.path.join(path, image) + image_surf = pygame.image.load(full_path).convert_alpha() + + surface_list.append(image_surf) + return surface_list + + +def import_assets(path): + script_dir = os.path.dirname(os.path.abspath(__file__)) + return os.path.join(script_dir, + '..', + 'assets', path) diff --git a/PyGame/utils/seeds.py b/PyGame/utils/seeds.py new file mode 100644 index 0000000..5787159 --- /dev/null +++ b/PyGame/utils/seeds.py @@ -0,0 +1,11 @@ +import random +import torch as T +import numpy as np + + +def set_seeds(value): + + random.seed(value) + np.random.seed(value) + T.manual_seed(value) + T.cuda.manual_seed_all(value)