From 2fde952e58bca6f823f3c0114835386765b4780a Mon Sep 17 00:00:00 2001 From: csd4ni3l Date: Mon, 13 Oct 2025 11:07:58 +0200 Subject: [PATCH] First commit from game template --- .github/workflows/main.yml | 92 ++++ .gitignore | 182 ++++++++ .python-version | 1 + CREDITS | 11 + LICENSE | 674 +++++++++++++++++++++++++++++ README.md | 1 + assets/fonts/OFL.txt | 93 ++++ assets/fonts/Roboto-Black.ttf | Bin 0 -> 147424 bytes assets/graphics/button.png | Bin 0 -> 280 bytes assets/graphics/button_hovered.png | Bin 0 -> 291 bytes game/play.py | 11 + menus/main.py | 67 +++ menus/settings.py | 284 ++++++++++++ pyproject.toml | 10 + requirements.txt | 22 + run.py | 93 ++++ utils/constants.py | 42 ++ utils/preload.py | 4 + utils/utils.py | 90 ++++ uv.lock | 220 ++++++++++ 20 files changed, 1897 insertions(+) create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 .python-version create mode 100644 CREDITS create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/fonts/OFL.txt create mode 100644 assets/fonts/Roboto-Black.ttf create mode 100644 assets/graphics/button.png create mode 100644 assets/graphics/button_hovered.png create mode 100644 game/play.py create mode 100644 menus/main.py create mode 100644 menus/settings.py create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 run.py create mode 100644 utils/constants.py create mode 100644 utils/preload.py create mode 100644 utils/utils.py create mode 100644 uv.lock diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..321fadc --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,92 @@ +name: Build and Release + +on: push + +jobs: + build: + name: Build on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + architecture: "x64" + cache: "pip" + cache-dependency-path: | + **/requirements*.txt + + - name: Install Dependencies + run: pip install -r requirements.txt + + - name: Build Executable + uses: Nuitka/Nuitka-Action@main + with: + nuitka-version: main + script-name: run.py + nofollow-import-to: "*tk*,_codecs,encodings,multiprocessing,gi" + disable-plugins: tk-inter,dill-compat,eventlet,gevent,pyqt5,pyqt6,pyside2,pyside6,delvewheel,pywebview,matplotlib,spacy,enum-compat,pbr-compat,gevent,pmw-freezer,transformers,upx,kivy,options-nanny,multiprocessing,gi + include-data-dir: assets=assets + include-data-files: CREDITS=CREDITS + mode: standalone + output-file: LogicalSignals + + - name: Zip Build Output + shell: bash + run: | + mkdir -p zip_output + if [ "${{ runner.os }}" = "Windows" ]; then + powershell.exe -Command "Compress-Archive -Path 'build/run.dist/*' -DestinationPath 'zip_output/LogicalSignals-${{ runner.os }}.zip'" + else + cd build/run.dist + zip -r "../../zip_output/LogicalSignals-${{ runner.os }}.zip" . + fi + + - name: Upload Zipped Build Artifact + uses: actions/upload-artifact@v4 + with: + name: LogicalSignals-${{ runner.os }}.zip + path: zip_output/LogicalSignals-${{ runner.os }}.zip + release: + name: Create GitHub Release + needs: build + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Download All Zipped Builds + uses: actions/download-artifact@v4 + with: + path: downloads + + - name: Delete Old Release (if exists) + continue-on-error: true + run: gh release delete latest -y + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Delete Git tag (if exists) + continue-on-error: true + run: | + git push origin :refs/tags/latest + git tag -d latest + + - name: Recreate Git tag at HEAD + run: | + git tag latest + git push origin latest + + - name: Create the new release + run: gh release create latest downloads/**/LogicalSignals-*.zip --title "Latest Build" --notes "Most recent multi-platform builds of LogicalSignals" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81c71f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,182 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +.vscode + +test*.py +.zed/ +logs/ +logs +settings.json diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/CREDITS b/CREDITS new file mode 100644 index 0000000..015b4a1 --- /dev/null +++ b/CREDITS @@ -0,0 +1,11 @@ +The Roboto Black font used in this project is licensed under the Open Font License. Read assets/fonts/OFL.txt for more information. + +Huge Thanks to Python for being the programming language used in this game. +https://www.python.org/ + +Huge thanks to Arcade and Pyglet for being the graphical engines used in this game. +https://arcade.academy/ +https://pyglet.readthedocs.io/en/latest/ + +Thanks to the following other libraries used in this game: +pypresence - https://github.com/qwertyquerty/pypresence - Used for Discord Rich Presence diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ + diff --git a/assets/fonts/OFL.txt b/assets/fonts/OFL.txt new file mode 100644 index 0000000..a417551 --- /dev/null +++ b/assets/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011 The Roboto Project Authors (https://github.com/googlefonts/roboto-classic) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/Roboto-Black.ttf b/assets/fonts/Roboto-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d51221af2b255560bcb313fbcc22cc43167c173f GIT binary patch literal 147424 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%0ALi}h*0#?{JL~Z zQJBXAPexC_b9SU06POaN^0&IbWFd9kJeF;cUYd9R7{p=$hO-%LNa{<Z7m{#4~dt<9Q%^AXW~P z%?3kerd~LOU&kS^EH%-eelMq_B^%g1yN0x|k?eM9kslBWF&lo*=;vN|R{Cc@qPj7@ z$7_7IhxBWDm)z=f`WW~BO^57b6IMpKZ#DTgyVRo5Ns@qmUlyrZetWq zD;f_2Hiw7@*6U54WbW$Gc_BjCGD{GSP0%GY`rb=6-dPqh^PlMYWS0d!&7a#aj&|(^%r^2f|qs;8@B7E1yhbMuV$hC$(4yoH5oy; zRexYZbXs&;j+bdp2R`tY{PPKiZ80)M?M(1K9w zebQ(;zZ&>{#TVx}$=~RU(bL6Xh9NYP(X{sK3vC5)lJ)5eZ70!}##I+r!#;I!W!GzF z{(NvzI^~hM$5b;E9Q~GCG*8C0l`k8Tt;Z#SLDK;yuw5<2dF^n<9g)Sv>1EYmlB2v$ zxvKci#Q)`}*I2|r{{Ca9KIR|RFw-migIX5# z&Z_zJ<169av#e5%b~mY3(2?;h3{46oBf?n~K+1HiR74nKb0cE?96QSO-eicxC05pSjA{LGV6YC=wcnsy&MnzdxI5l)FonJV6 zWmjQp;HkHU4wtY_2^Ai&Ir_DaYp_A0Tl*_j4EKH|P-Sb-XH z;f`Y+xbs2WdDwO*TLp|9QBM~2Rbn&w;d>hk+0*KK7b-iBAr$&b5x>OVRZo!@7FuvF zvQe5)IRvrgWk9N@ZfZ3tSik>y_xqpR?|=R8?Ek<1clLjab^qMC6DQ4`lbn;CBsG}v z**rHXH!JBW?J_9deMG&R_3{=Dsj^<(>o zKiU6u-u6NH!TzV~?!kQR=9Af5uvC)WiljxVG#&|WpRS4|L+_|q?@X4Rs~Sy4gDD$z zY)pR4&!EPlvW=X}a{asw+;x-lk_mgdT$W5=e|2T`R{~u5BkG8W5-YE~I(?$VFIKT} zlRWp7$uCUuysf;*jX$K9-B_a~W{b$;S1teHOJV;AqR1pBsXAGYdPrU#5ZyJoy%$E3 zI)Ezm6v1V8Woz+kL=_ktvoS>-_AM*jZI7(JLq$MM5;Pv?dr11-&uccM)GeH zbI%x+SJYlYfG?{)+`jeA1)u_ZJw~$Eg#w$|RO+LX)0mWI3dA`B69h`V>U)AcG>8$c zFBFyi-zzkRf=?jRb|>36iBDS&XW;*=(+E)C90K)aUvsZU_HXv5|6Q-K2isSh(UFEM zNCu9e6DLWpml1I(3aVoX1@l6m8TH#!8HxUsAY%Q9A)|~!`99@!tgwnbhLZ+pI^JG=FqlNSHq52y z4-7aY-IBbUi%AnjjWuwli>zYZ`*)AZUGwoVHeyne3o}(uF1Dw%Sava`dgq7xCja^D z+@I^_nq$YT8=gSaHJblJL;(393YDUuP;J345E;18)Ci)D0#smffWZNzjO-v^XxxOt zMJa3A1pV~dN#?RwN*J@H^-xx0IvZdf#%`l=vV%)=0A*3( zQBPS`q&-vn;4~iY?x?~iyCKiP6$k>Fwg!1p*r4pYg!Tvxn{tG5nKa#cTrNOb(0#~n z*^uxp^DpAZyV*}5LqtK4CDgKm4UjV7Bw7BocOc|yvZR0`IXF7{*f7G#sg3kK!4ohJ@x^YylkC`GO7e}_62+s_ z0b|*IBgTZ0@^AFdVx(04BN%!c=rPpK-=FwXNU+`<)So|Lz`_I~(lD;&QJJ=G%3-YV zQD!{Y%d5(kjo_bIyD2*IGJlBOcLRpCr(eV*s@Fgt9|#SlLWjtld>5A}f*xip#ZM@Z z=!eb4&}Kxcj$JVj#u!^AGs-82VC*SSU+h`({Xn?%1K;Ei{%3vhyd#rlKC-%c*6aN9 zhwkU!Ug~Vv{ra+miWL9!aa|)O9GF?)i8#lg_z<^-1ONC>_sl;qpZlMfkC>>@_x@w! zt%vvzugsnL#4p=ETk-DE(fsq&=DFox4BydNP`&(tN$1AQ9pL9*FsH7g&Sd{4(C8wL&A`Mh~9!W9PcpVaW|nxuL86Ki6l%SL70XDUex3P{Qie;A2+ zdDz_w_AOHCuy1h=(C(Hmihax6VFB$qTU_`-WvtlUW3{`ahp)X0d)kj5(f=ZLw zR^8Fn)d86Ds)tJtQ>55MJ4a;DL3{JSX_>@!em_*zo0G>`y17D ziI0GXxH_p2Dhvh>MFf8d66@W6_MNT8jY|Kq4$uNinjWTjNi9;57@!tkVvm`mlXU|) zATZ=HM<3fb;9N0!DI}oJ91X)v`iVLE%{G(Bc?JiRg5XovW)gEmenuwdh;Z+)S7q7B z$q4*wqXP81AVoVliTi1%7D+RhBbZVsm++e0Hpy~~JNC(M6UoOt`E5$3Y zo28FkFAc(m*`ry%VY=%XgT|F|r~*#&bMt1d zJwI9QSpUcEb!BUxUo-#ll@*pPQj#%oKwNH3oJRyquT>k;_C?-uzdT{;!q=u=u(~(x zdZrUd_;<7n+I(rrrauP~4wpc}FPc;plU4M1>PW(0n!~rNX<`=;zB;0doDd6!o$Kf8 z20DpV1Kj(Hi=%yPJK>LLWB@fJ$r*6RyJ5)=YLGNzO!f=vVpl)?fmFK>)TH)?5>|XD{}PO=6H(RTgabP5G{gFj#>u2 zuhEh61)Lz*GDuexd2JJ|5_>Y}saM|At6rI3z*LBW9PYe`|25{JN3cr^A7egrpl)ux zlZ1a(zH}ssmvGAnfy-JZj@06HE1&~}4HPi zok&v`yypk)E}@}|yGTJN4FPA@OjOy(!K{mYhU_^%RIqhYHDO&$HatxvALGjwrE0IN zLDyy?LD$7rSR>gjNEFtv{zRCk)}vBu|FRlVo%KAmNVPShF{4z|!yTFuTGV+uxto#t z-K!y7*J@8u4YWEM!GE!=anjjUfb+N2(Lk&&rErZ#!be|lb9R`|7V>I~9*7Edc@;CZ zM4K^RC;MFBF0ySHd*xN=Epu*g*KFQmSS#L@uFb3Zfp%Ard!N}~2>Z%z@va}WyOe)x zcLktgSp5g@DBjZG1L z1W+5nP>EDS5+Q!lKYMGd{13({`hS2GHQz6s_MOppj52 z)#4V6nrPRL3cvr?eyx>1VLbB}R%PAKBF-QGZso8&e^@;6+}_cwDY-enVti)d{1!x^ zy~}-;vkLyCan3sjfn-44nw>HzDYYSe{DN%Smqt+b-GVaCAV4cdD&0cb^ehJ8r0(u+ zD=(9e2#WZoUZ;zdO1tNE4;6ne?EVE$E7*xIil-rU(REVQaoq)PeL_5kvze|-*w5HU zWjLu1Vs-p=US|PI;p`zma_#00Y!iD>yO7{1^&JP4)W!1oOLbEzd;2jq-ulgH{@aem z{qM+s<3E&4DS+Kd0eZ;F54TT$WJ4`kI98*{7|}{HXuvJV+1bNnLUVzAn$yG*aO9gb z$_SoVJHI9@#ziwW{H7i za_q9y*afQ>#AZJ5K+g7`_7J}w(fv>T4w09eh}y~_r5>4;&gQ~oW+oWiSUU_Z5GCO! zy%`KH;@ZU-0wsgu7D>uNUS|$K!hC&^${VGRi5ZatFx=`n!%Guf+zVURjcg|{++m(E zWocz&Qe`PHvo1|w;pVYneu<&+#fkos6cNhm0+BG)wDs|}HBWa+*I?o{4c$qYxb1cE z1vBgIkht$Cw_TkcUv6S?gF4EmygFs#t5di9v8z&QdK_yr5M$M0ZNh=bi1RWoHWpqv zw~Pu$bAhXy*q|6D2}{~}X}70BGQmP=b}-ohDv3fU8#E3Wr35s*$b`6dz%a!8{ASCv zH2=(|LjEutviZ+D21Qp*-Pie}0mj*L_>T-$hiD<;FRWMfO9K3Esj zZ2h%s3gWa)0r(etg#S@Gn~>$_mzBV;=$Xr|S3ARtM;FSfB1gKji7YTGATAh5RNcGDa<i3sg@noc9vL(qV=Ql z>+h|vKiV+of!Vn%uwYzSU69G=bn)~mqTxcmN;!vh4TGha@NeA;@=KCju)QO~!x>W8 zv`|SBhHTl#J=W@;amqAK$m4<=(}E&LNXT~(^Z+g^tdQC4Z+y4Jf-A?SrL|V^i;k@J zfnPR+7L1r%O-9{7SC8qV9)7jiB|MDZ6B=wtn;?D477agc%!rm!n36CozhD%??>nB~ zls{ouS%xZ! zYTYckv+*u|k;a&Ucwa`WWfX0;=B;Pj*1a?f;@34uHGttlnCsPdl=!Rfgl3w2V*6~d zu1atd(R=+CtPAx%6IACB8ylMHEP9XhJ7JfnzW48cZ&uBX`=25q2Uklj?weP$i2Jh{ zY?wz_a&TB$gm>>gs$cWKxTz1^QU($D`s|wjFh^^xbkYAV+1>v%Y{LqWJv53k1bltnkO4yQKgg1I5Slc_YD2iv7J*Qu$O3yqCLha2 zNk3TKz9L{4xt)zS#s$X|#6eya)14r(=53hn3o{+$M*f35gG`NA--#=Z?#IButeem7 zMvp4GztT^`{8Hacy2w(m0Ql6M&Cn)9=&jzYA_7(D687FN_lI+3# zW+AzF9dgyQnT*6tMudPPffNR>#Z2D4pi;Vz{|2Ad9-&tB%pO=!-|1t?lMj+ikp_wH zd)Vg^$+P3-jPL7o;}O61FE?s~1Z7Gcj4-O~APJ0K%e!!h4czkT+6mi|Qc@OI=MKs63&Iv}X-{2x zWatQ-UkNjwzkNhhShp@XG`(R`dP4f7Vd*%NLSQqPBd9H0hdg2*AD0k{jIr7JZ6sz} zKru(x2ocJmtEPHb3kjwvjiD9C=M)vtY!D5wHz)fJ}Kb{>f$ z0Vx%UmD?*SwpNSNi%17K)mWh)K{??#v0%Z{MV6FEl3#Xul5F;L)y%v75g-V)9qS@^ z9-@J6g4&L=_!`vqDa`$H(bxguQ56$Q%G&Z->y-Omowoktd&bmkdVy`_-mkJkma$@b1P$|i!|^rg+iR?hzO=Y0Ny;fce`#wlxqSiX@z z`~Bo`c_V`+gl|MUcd+lJ@1FGa;mZlFs{sE+)q4ok2qE?(Jl7f7Eh)RhvK6nR6}K);Xvp6@ z=?I=Fm%n6NVWjBuOc{CBsd89$Hrtxrl)5K8Td%uEduYqVyNN3`@mJVk-EV!LYSR$% z#Z!kR@mRud=j=~CMNd_stsS8%ws!}Am` zIYb|a`ts`xSXs7?wTqc=kiV2wJ&-oodN;bho>AQ&2|asUc4V&TnNjERh=+>&)YJ@7 zX{xt>5xpPTVJUS;%Hi+?X$H$~PPr>Qo4Nk6de54qh5>t~UGDvaH)le-^RS&{;KlH2 z6JHU{f{a zA<1q_qj!n-S&<)hz!D|DPw)Kow4nj-gh$Qt3jL&+-N?R_*2v$$)9G+VfuGy9@*-SG z6k*=DY2Ko)jSJ^*mi}Vu+_5hB#}Xq7C-P?!}JlPECS?+KFO|~EA%3Y3lVw( z^d=@UK}2fLP47X)d4jeP_M4l&2iB~%+KuC;?yRrh(caos`<#E8DLT~;$i>lVev&+7 z*OUosDk|2rw(TDB*N}|Rlw^19Pt3J)ZEHI{)i!=zY98SM16YCr4YNPh+uKF;#8m9f4@n8NXkGZ;SsA8raFhe(A zs*`uayXvU(Ds^Nkf8#3raVtg0j;|s@Eg$yS`;ca38q$_r%lC&qSK(aN@<65UOfji=Z`Uj1GthS9gv<^ zPwNd*f$d5W?s-gHDYRWF#g)tI^SB508Szvao_a#uGr)F5d-HkRQ*66ZCT*3TQt3(w zUBOrzq;1kSYLnQP6g4PGvH^v9ZO$DLR!>Y99vlF6*8_Lk9pN2!bPRTEsy zQ%@MIB5XzD=Qi;PIY4ql^V;eurm|T7_>90Q*=>#K@}nMie!DMtWBkl}S9*=#HnlEj zqjA#i=WhN^8^4E{p8N~3xuG)qQ}dddDN$t!esP(>+Dk8a9Qt-&$VSu5V=KJIZ)qDG zro9xStCF_M&ML)R1fVv&FG4(=B~Lp0N;IzwdB!rmwN!O%I{Z(7Ct$NCeD;Jf)r7KB zEsIJ%4bF|vuLw~U2%^s7Op(Wp2U?8ZC4WT)N^!2%C}v~!9CBjhj0b7C7vq6J&%bipe=Ew6jv^@ zi?|20C9b65sVBrepe=Dl>kqvdv?Z>T@y*gxqAk#txYEGylfGfo(I1HO7Ju})q5GJ$ zUpEz3V1=|@agz2k1FqajS7@cIhyg>(K6H|Mh$z`beO4aEgFY*tP!=iH$id_Gf9wp} z7}LIgq1U|qQzAC{jNbGZ?Zv)t^Uz{$+q5%YtU0oc`mT9gX^ePXq{nTa;B}Ghcj9$> zC!4g_DY{N!<$NC0Oi2DQ(3?CWBTNvUg8aNxvm@edU9=ov&E`vV4!0m8L~KS5+0K6L zVx(%5Xp}pyzNsWzp9`F@?1j(()oadcoA>{DCO-?9|H#Z>XqwK_&sJat1Fq!Zwl%4f z9g@pUQrqU|r%u1Ps;Dv~deBo3KFGg6b__j(qewr~cG5!fEk%;B-q{UVC$64uirLAP zdMLbZ`Cj?`b|Q{jI&twsKl8Wq`pVzVtE&NBY!TqLvi$Yo!~F5Xhh?A?%bP6=5$>^2 z-i-Fv0HK94Y$=v98Pc{_WV~xIm0=+BpNqRM2(v#az5tGddB8d`0{YcF$v$b?Yqhv(|Z=*)X59_>dUS#Bn(@?r2~?vXFvtnQ6`0 zS26k}Z*AE6{z|FltFM@=C9rRG8&Kiw?r$7!6_RugPIQBAgaW54@~LR%$c9ZaimS+V z3ehE$`h*yroTz>nd{JJC**hr6!IS0?N3+n6FT;xuw?nUV$`DWMhfFI2lHX$iI7Xl3 zT>Zh{w(95owp9wxdi3PjSNLbggFk?telp-eHkSX$-+U_f!W$EmmoUjc96oHRS*Iq= zz49!is8^PdD79Km6|qCFEmO-7q9o}ip|4kkeIyc=1$V%Ac=|Z_ICwe%P*s>8GfFfR zL=vc)gsBQ^OMc)8&v=QJnN|S55q&sG9<*@($Y_2tAf?2_7bAk^pVq%ZjqggYPiBqF zUj0ES$egx+8h@K5<`joGSYDA{;RPOL1EoXO$x{zZgK#J#mgZl|NZ>$gb>Jc2B_smo z(hz`cf%2EVt~A;bZK&WX3Nk?S)e6ek^2TiHySHsq$SYDu#w89|U$y3MM@Ef#;EP)e z7UU&HjY=3eXK-9X{qz>gCAr9Q>57{N|Iy8(YRlzKtaaD>w-5G2jYK!ksKHA{^205& ziUXu`ciqLmIDA;!8|r(u6%Hf$ODwC8laHUHlasHXV)k_*Uzb<@a$(i<%11Vn{jd^S z)i!U$#rwwMs_$K?S0A}jFMWtQM;-m5aW`$UDk~2keisW{bAxDH85xs0#aHx+Vxy8v zjbY*8z>+{U??4G(iif9S2Eww~Lg<%>bRdcolCmKp7ev;xn*gdPEX&Ygn9&=5RD5zQ zgK`lyn9aVZ9-S0BYB0B!J@@!8%Lg4?#`bQ_wS1bZ6uo__O9oNe*&(GyoLSfVCC^YOINT z-!gDUReVcfz+hd#CXGMw&n+{Lm$H#n(+8U7S=({=w`-b$wYKy={>xL7T^xA+?E7X) zt3EjQ!FGHTt>+>Bf~uBKRR;f3X9uG(6g5lSSSTe)YnzbxEKYFbIg)sQk6t9_hRPyC zUv1&1Li2}C$g7#(oXk&7KJ)FC*)QI`u#5-sllP3=F{>`7X#RtRwndBA|O!A&VMbhVt07nwtDH zS96%^R$J@qhMh(B6cjkI{lXg9N>B4ef24Dl5CD zOx;-iZc?x?V9pLZJqFr#1lMG0HR3fxqyPt^0b3^$} z5o*yBBSJ<%>6hK_Y^^Gov2Xmat|_^VhyTgnc=8NCI>g!A-__0E%gLDD$fEemrHk%w zmom+dE-OnPx4tQ1$f*Z54LjGc{;nZOUSa-jUZ%Vl>&Mwm`Jvbcb8uK3Q!j##7?3LX7p!L?!bme2mIg949nS*!^h7!uzdj7eBC8-YFuKoB0WB^!=>e`mq!? zpO0eq&qs^9z&*CYS{ed*$*{ zsN{}K6ceK$-sk+Jna}JPHtP0slcqk>Rd3bh-a2I5IsRqc)_f^AYx9fKvWiFUe{J6U zSND$`w(ErjvR5E~BD1hi?kLaWU$fAx0VGLxpt9O8>K#ff`>6YG(gs~D)VD;4ijZVw zYrr%c~lmkzH1pI3RlD z+}e&ux3}f6q~R;>YbW5l;-!xq$*E27@=6$(O~2h^QgRiq^n$WkBZ|YFe7!&RHU(6y zdx`&gZ{fVxA6!;Bbo+Dj1dKDcpx#)nz-~@&o;6^tUu+0Wg-myp|Db#W9twNjV-$KU zkq#(QgGmm-m+}oi!CUzW_4IG$>T_3$_0M3BW#Xx?#HoXrBJw--sZHzzw0kY`ic%u! zB&@<~7=0VNyKyFoF0V!Xy`w_rB05{&Q6MhgDAWKeNS|w4Jbp%eD{lzDO6hm zRM$`Z$X|>0c%A$8Hn!!@%KM0x|Hk_Evp`*jAB6vgx1qYILkRYVAF#V?fTaW3X-rN| zsJF9uNJT}W79$`6Me#!zHN`?xv0N;Cie%3Smr*Pi7Z4<1%kPze$*K@Zz~}?9FVamm z7(;QPSZb}^^xTqZ_pcl`z|(WU*j4vVTl)N_T2>vB-<+E}qAbyuG2eu;k@-1I`62pS z25!EzblSbE#uj^e7LQwbKixZ!KN*tOoRdGYEP?J#EE|!V(_9cD`FJjT<@TmZ^VZuc z{VMnEUR=|3`yV!X4wyPPA+x@*+||#exPD-2QvK9I&xL=uy{TsL?tQrLwyoyMrrTfH z=vg?mJ}GrzeX)z5Yk6aRX2Rg9pq=jhyiR&c?~9Y)<7|)*LmgQSu8`b6wh*wMU@T3! zB4f6IP-K55XhOtf`9(%1FiPOLaF%Ej?F zRSn693INnL-4{x-!l2V<>VklFpsaH8EKLtx6`cs83w%E#@B^*fd{Z`rj2vH}y@OBL z^c50%BlYr4|I(Jap{&7NQaF83+1%9B_Oe0K3roxmWjj+-mzFimEh(HasBBqk>RkKv z4bp)t8F^A-cxY@z;g$6K*wFAqse(t`;37%kt8{~vFl9eJk(D*96vc}fprOFp4F)~7 zjHavfNRK$@DWrt%>gn90YLX4?)R z%@Woe#X+wEu@=aT&@59kmw8-H&B%b*EbMKnk!71yHJb^MzD$~A*&;8n9^(I&7dTjU zN^jr)D-v4=9V>W}MOhAg_Z|8@8*O~3v|QH)8bC8QY6B^YM%838G7`|GKUxpVb1XZg z3CzQ?1D|$EXYcAm;lrT5-RBMB*xO79&BJrIhJ&}=jjlwtz`K?S9#2=?CVy6UcF*S@;8)peVYci-=G zX6}7?3ApR`_xtC!E|8a;%$zxM=FDkxj+X^)Xb?(oqT|T???mn-wOA|SWxSX*3~eqf zt*^dO@Z-|gUo8I#q1Zcql>Z>Vul=HBqDndHDZkI&W)@qLEd{s7GUeR^Ci(WbJ)^oJyAoP9BC zWe9@eJ*~O{&S(Bg7XA!9WYIdV=wNIbi>#adVr5&ws!8L41=^*WCYuA{=We1qMrx8* z;9uTbO1%p&etr16jPNS&5Oc6wH#`+62?_@sg@2(~rr{=}%x3O3)~kC2Qi)fR+p?tH zx8{q(laEizD%&_?(%g4!!_>VfO+9wki}PZ_w14?TjBStjh6FJ#R)sK8k6=bW-X{Sw zhT?TvfYj}U`TTjkW15gI2FHw!f+C{S7UpIB+I`*c@2`2`<@)O;+&i{%TqYaCI{y1S09IT5KUf=fDC_>oHePn%lO9JytjL50Az74!UlGR@xo^*UtX1PJ7 zecFBMZZ3BIV^Se@#&arNmTrS_r=HE(uv~-Fr0#e^KOi7O$3I0!pNJ?L*&uJ#LCMSG ze|h>|ZUxpqF`j7N37S`2W)Z)>3##M^t0o`2K((&PTZBD`Lsfo%Jco;j z@bpBF@Q{H}F^MV84Lt0Zs}kY$Jpk{4BQNhSVz+Bc<%YYN-)!xq&zNBl_S(t0Pby<= zE4Hu>-D5OW^gV`m=)}_w^TlWhm->t#jpE_udJCC+WP|3Q`%X?(cv)`M z?CF!-yIEahm8Cl|!@WDo2X<+Io8IZ1?*oi8@&!`eP%CsYL%-Gie-v=0RTN#~^)kW5 zz*}w8Z9gRLOnqc|krXPujBE#Za+Htu<<6=uTzuEk%?~dx)K2C%#&wnlM+eJakfUtS zvTg4tOzv#mc12m)@?%}Q-$7T+@bX-1NnBuhZT6xkR@JOKx#-sS7UA7)#>m{vVKMR# z>rU(#HEdx=X8D30ZIyN5GxN)4OkKp(Z@!t>|9VPxfTH~5f_`sR`)OKjONO#=HPm#L%a3kGGC1zp&&Y}qo)jZ40syr6CT zqAA7MDTTIY_Og{__}`RikJU`ei>uCJs_fzQaQ2q`yuAEXY@e5hC9O1SzIN66x$`z| zm^*L76&F|h@{9cU3l}a-T_#ul z@{1a>V#SL7ANu>*>I)aN>-zhDW>;$0v`%jC%*-h2u1`ryiPEyvv0QTU%?F*0r=?hbPl%dg&r?Iti<9aqR&|+BEsDt@fy9(#T*>P1h}olUZO+>y&xdH)qdjZ##ABMq5;Awx>0vGI`|sk!4HU%co5)tEJm|CuWLP{NP!(Rt2gi zlcHov>m}J6O8zMcDb@hVdVR_=-GZT5k)s9>ve~<&?@4Axo(OUF&e@uzt z(PNJXf)ON!qV*guCmy|`XfSah#}$qST|^r3VfnH4>nBgy+1|F3{{AF5H6lDED2V|I z=8@RvY`K#`!GmX9=hokVB~klrju^*F_tIFcEHR*I!}LO*n4H*@vgp{FoTU6HPkFvN z^S03|PS0HT?$s0Sy1He>bN|>7`khbls(C+BD~HUM?3}9TfQSfJul5~dJ5F4);_05e zrRT5ieD1=wLJ+ae{-g3Y;OK{lOg_3Fp%ZX&aB#Jkm#HMDFB(Y@hMR#KXw`<`)Fm;= z*#XRPr|_SXq!t7n`g7%Pb-nk_z2@Du4eO83nsZ|P2<=o{c~U}ITwHl#Qdul3sOmX1 zbNb;`HQg_*-~8fI?Nm@^LR@BWaAtf$Mj#tLcKztorhVP*Ye%Q0jb59TkQEe^m0-<_ zh{%(@8SbS4+^G#R9qy`41Mn`3ZhiB1Fz)P%rrS1SPd7U*ebFTvZ3{D#2 z0X!#w{{EGQ=k@GQwj=6}v;E1+79>Y7snY(V>Zaa}8w)<$py+6?BzHx^_T}=VR{Szv zx^s`Ik@%!jBRC0tpbXx3I1?19)Tep(s(Rn}(v+0y#KfAkqLJ}zoT>e;-kzi5*S&kq z+_PI-*T40PdbjpVP~G-bXHthH`K8pSWEY3VXZQp(+_GT$sZ}e^&o5YZepAyU{d;SG zVIg+!bF9ls92V>9Du?>Io8(@{rUAzU|JcA-i!(k*e~3lOv=Kv!GqXwBKSs+Jw4eyz zCBv>dGjYxvcdUMY3u9y1h+)OWezCO$4Grw?mGb2N^Ooqb$5zdKe9hR~7vv|U*C%Dy zC#2wv;qAI|5qOZ@1X@Y3n^gB+DhFctsH%Nqsgb6Ik+pQOzcZNGnTPi0`_QWE6#GHD z@SgmpHt`qv;Kk(_1|vpeW&Z(RMoPnoC!-}PGAhb1Kh@pUZ{Pq4o^)D?Q+oyCL~9^Q zLK@dSxN_hL3ru>}cU4YhbVzw&T&Yz%x#`Un3m@22U$^R((T_Yb@lbEWsI8AIY`<&A zIM$iem{U|05rplKAB`%C56+75jSXFPQ&ZZQ-i{GnBjOvc3a?&1zGMCP%%pMG&x^>5 zwH8HLv!lGQKbfG*U$KfPyz6ie=u@KLV#4N7PbX{*E?j2FO9OKfm`L}wD1Ysr&hE^q zj47*3EsN4lE_rS1{&$xocW$1zm?;_pOe@pJ)CUxlrPn1bdvxj8W2=WRp1YuWHs;)e zIbGE2!0T=gn0sa7bUv4_sUSgdLA$Cy$>Y@PF0NMmO8@l;C|wUq|DfIuogxjVBf_^Y z3AQesdipKnJc~dR)Gg8FTMspn^iqDP>pd}d-o3qbwY?|i&Aqp;PCMlvmlH*`%>1l5 zQIXkk{_^vhZPn@J#l_1{uVTuoGb>9=SDw+89Y;MM zg24o$*HT242Wn5?opG-P9#%>Y;M5cTB2dtm(UYJ&via2D{#nXxwy=KrA3x0N?Qw(vrQSNXVD6r|+2dAcwUw{8=olauDljc+h33O-U4k|y~P zFI2j;@uyES--J`z1VpOtlXGw&zEVPMw?BlxZn3>Dqd%GbC(N)EGtfD3v$&~Dbu}px z#zlrdAJ?B^ny`!UH(Pt`9<~X-=+)Y?$IfWIFo;j6J0OQ<+n%tUWec=DaAf2{Zl<%m{&b^FA> zoV?Sr~(a_(7HZGU>(56vh4KD9<|UUcyjb;rfCHT0L-Oy`h3#4N&TwBy~IdRV8M z_gRYqN+HXIrUa8vS18^|U2gsto1xA9`!he4|4X}q)hK)vyw-gLzY5MA4S8CNF9Rj- zvmU-?sTZEiN+^sN0~)-3<$>BFgk4x5|DAQL`Q-NfU-Yrggyy2+hImwL2;BC}oH@^I zlfShER?7h}?Y@*m-1f8pZqu`;ZVvjngz z0#+6f4WIKl~kXTQxWNxT9>>0_>!WUwfA;Sdw9{4HTQ*L~>pZ*$S7KaNAPj&o&yea#ePcQ|jL%G)x^F>RMUtNtw;H_MSoJilIu!B+ zxQD~P;}I4TtaBS&+|+PEM6XF9x6q>tt}ycOE48x=Y?sxA_iv~hzM^?KxSEw^SI5Lx zr{9lE^uyZEY##GdcchQoGi71wwe5TF>f~$Q-QU)> z|J{=*qgHjKrFEt=chbVwy}q}jeb4LbuB3(E8&%Sdg%|RL=d~9{$rFFelJzzBVa=%5 z@DLs>F^j<)#MF+6ncAnF)KI7#Nef%(Y{S*;wnv ztD=Yu{T7P=!K7dZVKLd#Gr86r%fv

hBlH)yO@%iY6|t~izjPn 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 CN~Ki* literal 0 HcmV?d00001 diff --git a/assets/graphics/button.png b/assets/graphics/button.png new file mode 100644 index 0000000000000000000000000000000000000000..92bebf98fb533a044035366d7a49e2007434b8f1 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=_dQ)4Ln`LHoo&e1pdfI7FRsr1 z`pFiBO=d-J)vUg(D%>q5ZS?up-T%TfZ-zZTeRwk4{F%;QjxrzTlm9qx{rkLmr!3Or zWy2oK+}wIuFiSLuEih!zbx3B2YB= 1440: + font_size = 14 + else: + font_size = 12 + + self.credits_label = arcade.gui.UILabel(text=text, text_color=arcade.color.WHITE, font_name="Roboto", font_size=font_size, align="center", multiline=True) + + self.key_layout.add(self.credits_label) + + def set_highlighted_style(self, element): + element.texture = button_hovered_texture + element.texture_hovered = button_texture + + def set_normal_style(self, element): + element.texture_hovered = button_hovered_texture + element.texture = button_texture + + def main_exit(self): + from menus.main import Main + self.window.show_view(Main(self.pypresence_client, *self.args)) + + def ui_cleanup(self): + self.ui.clear() + del self.ui diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..54d9977 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +[project] +name = "logical-signals" +version = "0.1.0" +description = "logical-signals" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "arcade==3.2.0", + "pypresence>=4.3.0", +] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ee52a4d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,22 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml -o requirements.txt +arcade==3.2.0 + # via logical-signals (pyproject.toml) +attrs==25.3.0 + # via pytiled-parser +cffi==1.17.1 + # via pymunk +pillow==11.0.0 + # via arcade +pycparser==2.22 + # via cffi +pyglet==2.1.6 + # via arcade +pymunk==6.9.0 + # via arcade +pypresence==4.3.0 + # via logical-signals (pyproject.toml) +pytiled-parser==2.2.9 + # via arcade +typing-extensions==4.14.1 + # via pytiled-parser diff --git a/run.py b/run.py new file mode 100644 index 0000000..fa335a3 --- /dev/null +++ b/run.py @@ -0,0 +1,93 @@ +import pyglet + +pyglet.options.debug_gl = False + +import logging, datetime, os, json, sys, arcade + +from utils.utils import get_closest_resolution, print_debug_info, on_exception +from utils.constants import log_dir, menu_background_color +from menus.main import Main + +sys.excepthook = on_exception + +pyglet.resource.path.append(os.getcwd()) +pyglet.font.add_directory('./assets/fonts') + +if not log_dir in os.listdir(): + os.makedirs(log_dir) + +while len(os.listdir(log_dir)) >= 5: + files = [(file, os.path.getctime(os.path.join(log_dir, file))) for file in os.listdir(log_dir)] + oldest_file = sorted(files, key=lambda x: x[1])[0][0] + os.remove(os.path.join(log_dir, oldest_file)) + +timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") +log_filename = f"debug_{timestamp}.log" +logging.basicConfig(filename=f'{os.path.join(log_dir, log_filename)}', format='%(asctime)s %(name)s %(levelname)s: %(message)s', level=logging.DEBUG) + +for logger_name_to_disable in ['arcade', "numba"]: + logging.getLogger(logger_name_to_disable).propagate = False + logging.getLogger(logger_name_to_disable).disabled = True + +if os.path.exists('settings.json'): + with open('settings.json', 'r') as settings_file: + settings = json.load(settings_file) + + resolution = list(map(int, settings['resolution'].split('x'))) + + if not settings.get("anti_aliasing", "4x MSAA") == "None": + antialiasing = int(settings.get("anti_aliasing", "4x MSAA").split('x')[0]) + else: + antialiasing = 0 + + fullscreen = settings['window_mode'] == 'Fullscreen' + style = arcade.Window.WINDOW_STYLE_BORDERLESS if settings['window_mode'] == 'borderless' else arcade.Window.WINDOW_STYLE_DEFAULT + vsync = settings['vsync'] + fps_limit = settings['fps_limit'] +else: + resolution = get_closest_resolution() + antialiasing = 4 + fullscreen = False + style = arcade.Window.WINDOW_STYLE_DEFAULT + vsync = True + fps_limit = 0 + + settings = { + "resolution": f"{resolution[0]}x{resolution[1]}", + "antialiasing": "4x MSAA", + "window_mode": "Windowed", + "vsync": True, + "fps_limit": 60, + "discord_rpc": True + } + + with open("settings.json", "w") as file: + file.write(json.dumps(settings)) + +window = arcade.Window(width=resolution[0], height=resolution[1], title='Logical Signals', samples=antialiasing, antialiasing=antialiasing > 0, fullscreen=fullscreen, vsync=vsync, resizable=False, style=style) + +if vsync: + window.set_vsync(True) + display_mode = window.display.get_default_screen().get_mode() + refresh_rate = display_mode.rate + window.set_update_rate(1 / refresh_rate) + window.set_draw_rate(1 / refresh_rate) +elif not fps_limit == 0: + window.set_update_rate(1 / fps_limit) + window.set_draw_rate(1 / fps_limit) +else: + window.set_update_rate(1 / 99999999) + window.set_draw_rate(1 / 99999999) + +arcade.set_background_color(menu_background_color) + +print_debug_info() +main = Main() + +window.show_view(main) + +logging.debug('Game started.') + +arcade.run() + +logging.info('Exited with error code 0.') diff --git a/utils/constants.py b/utils/constants.py new file mode 100644 index 0000000..f5f0f77 --- /dev/null +++ b/utils/constants.py @@ -0,0 +1,42 @@ +import arcade.color +from arcade.types import Color +from arcade.gui.widgets.buttons import UITextureButtonStyle, UIFlatButtonStyle +from arcade.gui.widgets.slider import UISliderStyle + +menu_background_color = (30, 30, 47) +log_dir = 'logs' +discord_presence_id = 1427213145667276840 + +button_style = {'normal': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK), 'hover': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK), + 'press': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK), 'disabled': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK)} +big_button_style = {'normal': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, font_size=26), 'hover': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, font_size=26), + 'press': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, font_size=26), 'disabled': UITextureButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, font_size=26)} + +dropdown_style = {'normal': UIFlatButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, bg=Color(128, 128, 128)), 'hover': UIFlatButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, bg=Color(49, 154, 54)), + 'press': UIFlatButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, bg=Color(128, 128, 128)), 'disabled': UIFlatButtonStyle(font_name="Roboto", font_color=arcade.color.BLACK, bg=Color(128, 128, 128))} + +slider_default_style = UISliderStyle(bg=Color(128, 128, 128), unfilled_track=Color(128, 128, 128), filled_track=Color(49, 154, 54)) +slider_hover_style = UISliderStyle(bg=Color(49, 154, 54), unfilled_track=Color(128, 128, 128), filled_track=Color(49, 154, 54)) + +slider_style = {'normal': slider_default_style, 'hover': slider_hover_style, 'press': slider_hover_style, 'disabled': slider_default_style} + +settings = { + "Graphics": { + "Window Mode": {"type": "option", "options": ["Windowed", "Fullscreen", "Borderless"], "config_key": "window_mode", "default": "Windowed"}, + "Resolution": {"type": "option", "options": ["1366x768", "1440x900", "1600x900", "1920x1080", "2560x1440", "3840x2160"], "config_key": "resolution"}, + "Anti-Aliasing": {"type": "option", "options": ["None", "2x MSAA", "4x MSAA", "8x MSAA", "16x MSAA"], "config_key": "anti_aliasing", "default": "4x MSAA"}, + "VSync": {"type": "bool", "config_key": "vsync", "default": True}, + "FPS Limit": {"type": "slider", "min": 0, "max": 480, "config_key": "fps_limit", "default": 60}, + }, + "Sound": { + "Music": {"type": "bool", "config_key": "music", "default": True}, + "SFX": {"type": "bool", "config_key": "sfx", "default": True}, + "Music Volume": {"type": "slider", "min": 0, "max": 100, "config_key": "music_volume", "default": 50}, + "SFX Volume": {"type": "slider", "min": 0, "max": 100, "config_key": "sfx_volume", "default": 50}, + }, + "Miscellaneous": { + "Discord RPC": {"type": "bool", "config_key": "discord_rpc", "default": True}, + }, + "Credits": {} +} +settings_start_category = "Graphics" diff --git a/utils/preload.py b/utils/preload.py new file mode 100644 index 0000000..18b76e3 --- /dev/null +++ b/utils/preload.py @@ -0,0 +1,4 @@ +import arcade.gui, arcade + +button_texture = arcade.gui.NinePatchTexture(64 // 4, 64 // 4, 64 // 4, 64 // 4, arcade.load_texture("assets/graphics/button.png")) +button_hovered_texture = arcade.gui.NinePatchTexture(64 // 4, 64 // 4, 64 // 4, 64 // 4, arcade.load_texture("assets/graphics/button_hovered.png")) diff --git a/utils/utils.py b/utils/utils.py new file mode 100644 index 0000000..c355a73 --- /dev/null +++ b/utils/utils.py @@ -0,0 +1,90 @@ +import logging, arcade, arcade.gui, sys, traceback + +from utils.constants import menu_background_color + +import pyglet.info, pyglet.event + +def dump_platform(): + import platform + logging.debug(f'Platform: {platform.platform()}') + logging.debug(f'Release: {platform.release()}') + logging.debug(f'Machine: {platform.machine()}') + logging.debug(f'Architecture: {platform.architecture()}') + +def dump_gl(context=None): + if context is not None: + info = context.get_info() + else: + from pyglet.gl import gl_info as info + logging.debug(f'gl_info.get_version(): {info.get_version()}') + logging.debug(f'gl_info.get_vendor(): {info.get_vendor()}') + logging.debug(f'gl_info.get_renderer(): {info.get_renderer()}') + +def print_debug_info(): + logging.debug('########################## DEBUG INFO ##########################') + logging.debug('') + dump_platform() + dump_gl() + logging.debug('') + logging.debug(f'Number of screens: {len(pyglet.display.get_display().get_screens())}') + logging.debug('') + for n, screen in enumerate(pyglet.display.get_display().get_screens()): + logging.debug(f"Screen #{n+1}:") + logging.debug(f'DPI: {screen.get_dpi()}') + logging.debug(f'Scale: {screen.get_scale()}') + logging.debug(f'Size: {screen.width}, {screen.height}') + logging.debug(f'Position: {screen.x}, {screen.y}') + logging.debug('') + logging.debug('########################## DEBUG INFO ##########################') + logging.debug('') + +class ErrorView(arcade.gui.UIView): + def __init__(self, message, title): + super().__init__() + + self.message = message + self.title = title + + def exit(self): + logging.fatal('Exited with error code 1.') + sys.exit(1) + + def on_show_view(self): + super().on_show_view() + + self.window.set_caption('Logical Signals - Error') + self.window.set_mouse_visible(True) + self.window.set_exclusive_mouse(False) + arcade.set_background_color(menu_background_color) + + msgbox = arcade.gui.UIMessageBox(width=self.window.width / 2, height=self.window.height / 2, message_text=self.message, title=self.title) + msgbox.on_action = lambda _: self.exit() + self.add_widget(msgbox) + +def on_exception(*exc_info): + logging.error(f"Unhandled exception:\n{''.join(traceback.format_exception(exc_info[1], limit=None))}") + +def get_closest_resolution(): + allowed_resolutions = [(1366, 768), (1440, 900), (1600,900), (1920,1080), (2560,1440), (3840,2160)] + screen_width, screen_height = arcade.get_screens()[0].width, arcade.get_screens()[0].height + if (screen_width, screen_height) in allowed_resolutions: + if not allowed_resolutions.index((screen_width, screen_height)) == 0: + closest_resolution = allowed_resolutions[allowed_resolutions.index((screen_width, screen_height))-1] + else: + closest_resolution = (screen_width, screen_height) + else: + target_width, target_height = screen_width // 2, screen_height // 2 + + closest_resolution = min( + allowed_resolutions, + key=lambda res: abs(res[0] - target_width) + abs(res[1] - target_height) + ) + return closest_resolution + +class FakePyPresence(): + def __init__(self): + ... + def update(self, *args, **kwargs): + ... + def close(self, *args, **kwargs): + ... diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..50a8562 --- /dev/null +++ b/uv.lock @@ -0,0 +1,220 @@ +version = 1 +revision = 2 +requires-python = ">=3.11" + +[[package]] +name = "arcade" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pillow" }, + { name = "pyglet" }, + { name = "pymunk" }, + { name = "pytiled-parser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e5/39/87eaffdfc50ec9d4b4573652ef8b80cca0592e5ccafb5fc5bc8612b1445d/arcade-3.2.0.tar.gz", hash = "sha256:1c2c56181560665f6542157b9ab316b9551274a9ee8468bae017ed5b8fee18fd", size = 41941030, upload_time = "2025-05-09T20:16:20.112Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/9a/ac86f5cbccfe5455a28308fcf2d7179af8d9c3087ad4eb45706c2a7b089b/arcade-3.2.0-py3-none-any.whl", hash = "sha256:7bb47cf643b43272e4300d8a5ca5f1b1e9e131b0f3f1d3fad013cb29528d3062", size = 42635264, upload_time = "2025-05-09T20:16:15.98Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload_time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload_time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload_time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload_time = "2024-09-04T20:43:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload_time = "2024-09-04T20:43:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload_time = "2024-09-04T20:43:56.123Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload_time = "2024-09-04T20:43:57.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload_time = "2024-09-04T20:44:00.18Z" }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload_time = "2024-09-04T20:44:01.585Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload_time = "2024-09-04T20:44:03.467Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload_time = "2024-09-04T20:44:05.023Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload_time = "2024-09-04T20:44:06.444Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload_time = "2024-09-04T20:44:08.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload_time = "2024-09-04T20:44:09.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload_time = "2024-09-04T20:44:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload_time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload_time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload_time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload_time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload_time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload_time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload_time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload_time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload_time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload_time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload_time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload_time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload_time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload_time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload_time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload_time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload_time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload_time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload_time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload_time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload_time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload_time = "2024-09-04T20:44:45.309Z" }, +] + +[[package]] +name = "logical-signals" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "arcade" }, + { name = "pypresence" }, +] + +[package.metadata] +requires-dist = [ + { name = "arcade", specifier = "==3.2.0" }, + { name = "pypresence", specifier = ">=4.3.0" }, +] + +[[package]] +name = "pillow" +version = "11.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/26/0d95c04c868f6bdb0c447e3ee2de5564411845e36a858cfd63766bc7b563/pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", size = 46737780, upload_time = "2024-10-15T14:24:29.672Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/eb/f7e21b113dd48a9c97d364e0915b3988c6a0b6207652f5a92372871b7aa4/pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc", size = 3154705, upload_time = "2024-10-15T14:22:15.419Z" }, + { url = "https://files.pythonhosted.org/packages/25/b3/2b54a1d541accebe6bd8b1358b34ceb2c509f51cb7dcda8687362490da5b/pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a", size = 2979222, upload_time = "2024-10-15T14:22:17.681Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/1a41eddad8265c5c19dda8fb6c269ce15ee25e0b9f8f26286e6202df6693/pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3", size = 4190220, upload_time = "2024-10-15T14:22:19.826Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9b/8a8c4d07d77447b7457164b861d18f5a31ae6418ef5c07f6f878fa09039a/pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5", size = 4291399, upload_time = "2024-10-15T14:22:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/fc/e4/130c5fab4a54d3991129800dd2801feeb4b118d7630148cd67f0e6269d4c/pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b", size = 4202709, upload_time = "2024-10-15T14:22:23.953Z" }, + { url = "https://files.pythonhosted.org/packages/39/63/b3fc299528d7df1f678b0666002b37affe6b8751225c3d9c12cf530e73ed/pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa", size = 4372556, upload_time = "2024-10-15T14:22:25.706Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a6/694122c55b855b586c26c694937d36bb8d3b09c735ff41b2f315c6e66a10/pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306", size = 4287187, upload_time = "2024-10-15T14:22:27.362Z" }, + { url = "https://files.pythonhosted.org/packages/ba/a9/f9d763e2671a8acd53d29b1e284ca298bc10a595527f6be30233cdb9659d/pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9", size = 4418468, upload_time = "2024-10-15T14:22:29.093Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0e/b5cbad2621377f11313a94aeb44ca55a9639adabcaaa073597a1925f8c26/pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5", size = 2249249, upload_time = "2024-10-15T14:22:31.268Z" }, + { url = "https://files.pythonhosted.org/packages/dc/83/1470c220a4ff06cd75fc609068f6605e567ea51df70557555c2ab6516b2c/pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291", size = 2566769, upload_time = "2024-10-15T14:22:32.974Z" }, + { url = "https://files.pythonhosted.org/packages/52/98/def78c3a23acee2bcdb2e52005fb2810ed54305602ec1bfcfab2bda6f49f/pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9", size = 2254611, upload_time = "2024-10-15T14:22:35.496Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a3/26e606ff0b2daaf120543e537311fa3ae2eb6bf061490e4fea51771540be/pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", size = 3147642, upload_time = "2024-10-15T14:22:37.736Z" }, + { url = "https://files.pythonhosted.org/packages/4f/d5/1caabedd8863526a6cfa44ee7a833bd97f945dc1d56824d6d76e11731939/pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", size = 2978999, upload_time = "2024-10-15T14:22:39.654Z" }, + { url = "https://files.pythonhosted.org/packages/d9/ff/5a45000826a1aa1ac6874b3ec5a856474821a1b59d838c4f6ce2ee518fe9/pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", size = 4196794, upload_time = "2024-10-15T14:22:41.598Z" }, + { url = "https://files.pythonhosted.org/packages/9d/21/84c9f287d17180f26263b5f5c8fb201de0f88b1afddf8a2597a5c9fe787f/pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", size = 4300762, upload_time = "2024-10-15T14:22:45.952Z" }, + { url = "https://files.pythonhosted.org/packages/84/39/63fb87cd07cc541438b448b1fed467c4d687ad18aa786a7f8e67b255d1aa/pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9", size = 4210468, upload_time = "2024-10-15T14:22:47.789Z" }, + { url = "https://files.pythonhosted.org/packages/7f/42/6e0f2c2d5c60f499aa29be14f860dd4539de322cd8fb84ee01553493fb4d/pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", size = 4381824, upload_time = "2024-10-15T14:22:49.668Z" }, + { url = "https://files.pythonhosted.org/packages/31/69/1ef0fb9d2f8d2d114db982b78ca4eeb9db9a29f7477821e160b8c1253f67/pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", size = 4296436, upload_time = "2024-10-15T14:22:51.911Z" }, + { url = "https://files.pythonhosted.org/packages/44/ea/dad2818c675c44f6012289a7c4f46068c548768bc6c7f4e8c4ae5bbbc811/pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", size = 4429714, upload_time = "2024-10-15T14:22:53.967Z" }, + { url = "https://files.pythonhosted.org/packages/af/3a/da80224a6eb15bba7a0dcb2346e2b686bb9bf98378c0b4353cd88e62b171/pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", size = 2249631, upload_time = "2024-10-15T14:22:56.404Z" }, + { url = "https://files.pythonhosted.org/packages/57/97/73f756c338c1d86bb802ee88c3cab015ad7ce4b838f8a24f16b676b1ac7c/pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", size = 2567533, upload_time = "2024-10-15T14:22:58.087Z" }, + { url = "https://files.pythonhosted.org/packages/0b/30/2b61876e2722374558b871dfbfcbe4e406626d63f4f6ed92e9c8e24cac37/pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", size = 2254890, upload_time = "2024-10-15T14:22:59.918Z" }, + { url = "https://files.pythonhosted.org/packages/63/24/e2e15e392d00fcf4215907465d8ec2a2f23bcec1481a8ebe4ae760459995/pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", size = 3147300, upload_time = "2024-10-15T14:23:01.855Z" }, + { url = "https://files.pythonhosted.org/packages/43/72/92ad4afaa2afc233dc44184adff289c2e77e8cd916b3ddb72ac69495bda3/pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", size = 2978742, upload_time = "2024-10-15T14:23:03.749Z" }, + { url = "https://files.pythonhosted.org/packages/9e/da/c8d69c5bc85d72a8523fe862f05ababdc52c0a755cfe3d362656bb86552b/pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", size = 4194349, upload_time = "2024-10-15T14:23:06.055Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e8/686d0caeed6b998351d57796496a70185376ed9c8ec7d99e1d19ad591fc6/pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", size = 4298714, upload_time = "2024-10-15T14:23:07.919Z" }, + { url = "https://files.pythonhosted.org/packages/ec/da/430015cec620d622f06854be67fd2f6721f52fc17fca8ac34b32e2d60739/pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", size = 4208514, upload_time = "2024-10-15T14:23:10.19Z" }, + { url = "https://files.pythonhosted.org/packages/44/ae/7e4f6662a9b1cb5f92b9cc9cab8321c381ffbee309210940e57432a4063a/pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", size = 4380055, upload_time = "2024-10-15T14:23:12.08Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/1a807779ac8a0eeed57f2b92a3c32ea1b696e6140c15bd42eaf908a261cd/pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", size = 4296751, upload_time = "2024-10-15T14:23:13.836Z" }, + { url = "https://files.pythonhosted.org/packages/38/8c/5fa3385163ee7080bc13026d59656267daaaaf3c728c233d530e2c2757c8/pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", size = 4430378, upload_time = "2024-10-15T14:23:15.735Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1d/ad9c14811133977ff87035bf426875b93097fb50af747793f013979facdb/pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", size = 2249588, upload_time = "2024-10-15T14:23:17.905Z" }, + { url = "https://files.pythonhosted.org/packages/fb/01/3755ba287dac715e6afdb333cb1f6d69740a7475220b4637b5ce3d78cec2/pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", size = 2567509, upload_time = "2024-10-15T14:23:19.643Z" }, + { url = "https://files.pythonhosted.org/packages/c0/98/2c7d727079b6be1aba82d195767d35fcc2d32204c7a5820f822df5330152/pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", size = 2254791, upload_time = "2024-10-15T14:23:21.601Z" }, + { url = "https://files.pythonhosted.org/packages/eb/38/998b04cc6f474e78b563716b20eecf42a2fa16a84589d23c8898e64b0ffd/pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", size = 3150854, upload_time = "2024-10-15T14:23:23.91Z" }, + { url = "https://files.pythonhosted.org/packages/13/8e/be23a96292113c6cb26b2aa3c8b3681ec62b44ed5c2bd0b258bd59503d3c/pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", size = 2982369, upload_time = "2024-10-15T14:23:27.184Z" }, + { url = "https://files.pythonhosted.org/packages/97/8a/3db4eaabb7a2ae8203cd3a332a005e4aba00067fc514aaaf3e9721be31f1/pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", size = 4333703, upload_time = "2024-10-15T14:23:28.979Z" }, + { url = "https://files.pythonhosted.org/packages/28/ac/629ffc84ff67b9228fe87a97272ab125bbd4dc462745f35f192d37b822f1/pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", size = 4412550, upload_time = "2024-10-15T14:23:30.846Z" }, + { url = "https://files.pythonhosted.org/packages/d6/07/a505921d36bb2df6868806eaf56ef58699c16c388e378b0dcdb6e5b2fb36/pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", size = 4461038, upload_time = "2024-10-15T14:23:32.687Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b9/fb620dd47fc7cc9678af8f8bd8c772034ca4977237049287e99dda360b66/pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", size = 2253197, upload_time = "2024-10-15T14:23:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/df/86/25dde85c06c89d7fc5db17940f07aae0a56ac69aa9ccb5eb0f09798862a8/pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", size = 2572169, upload_time = "2024-10-15T14:23:37.33Z" }, + { url = "https://files.pythonhosted.org/packages/51/85/9c33f2517add612e17f3381aee7c4072779130c634921a756c97bc29fb49/pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", size = 2256828, upload_time = "2024-10-15T14:23:39.826Z" }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload_time = "2024-03-30T13:22:22.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload_time = "2024-03-30T13:22:20.476Z" }, +] + +[[package]] +name = "pyglet" +version = "2.1.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/bc/0533ccb30566ee59b540d700dbbf916dafa89132a4d582d0fd1fe158243d/pyglet-2.1.6.tar.gz", hash = "sha256:18483880b1411b39692eaf7756819285797b1aaf9ef63d40eb9f9b5d01c63416", size = 6546705, upload_time = "2025-04-27T01:12:30.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/ad/e16f9b56c4a935934341e385753d0d0a2a83b7d320e52906b44f32698feb/pyglet-2.1.6-py3-none-any.whl", hash = "sha256:52ef9e75f3969b6a28bfa5c223e50ff03a05c2baa67bfe00d2a9eec4e831a7c5", size = 983998, upload_time = "2025-04-27T01:12:26.307Z" }, +] + +[[package]] +name = "pymunk" +version = "6.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/08/1513c868bc2a6bfa22d47acded27f5525c1db10bf1db4fdfa39160991616/pymunk-6.9.0.tar.gz", hash = "sha256:765f7c561a859a1b565bc517a47cc3992d6258e860f9174c533033c218af63c3", size = 3104088, upload_time = "2024-10-13T09:02:40.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/ba/34524aac6c57990aa9561c4a949543794e5f7128a0b01537ed061bdaed08/pymunk-6.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:536cf3ef9a3add0ea04d83a4c01fe090ff137fb591c3b6fff6e69102384ec5d5", size = 364338, upload_time = "2024-10-13T08:58:08.889Z" }, + { url = "https://files.pythonhosted.org/packages/19/9a/0d4931e3114495c31b600a17f27d5541f2ee35883e7c693199e1ccdf1ab0/pymunk-6.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e474bb748ded01d96d6eac8e282446baef324b67e0280213b495b1f936c06e7", size = 346937, upload_time = "2024-10-13T08:58:10.604Z" }, + { url = "https://files.pythonhosted.org/packages/61/d0/acd6a6cd8266ac0333792ac3ae36558a58859ca806e0add8f5ea01627b24/pymunk-6.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f54bd14512ca5fed0e77f964b1de4e7da1a31386dbf125e33482874d69bb6537", size = 1065273, upload_time = "2024-10-13T08:58:13.012Z" }, + { url = "https://files.pythonhosted.org/packages/5d/d3/2e5763d2eea69e8953782da83fe81a0235650339c22a4f8c65ecdd07cec0/pymunk-6.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc8d6fe79f77f3ed6e2f33682d355eedb6864684120b845a3501fdf2d3efdcb6", size = 988611, upload_time = "2024-10-13T08:58:15.262Z" }, + { url = "https://files.pythonhosted.org/packages/ac/db/ff2cfa5b87d3e60992b2264a03ffedc738de64d0107b4ce96c623f9098e7/pymunk-6.9.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:70ee413899672c2d7d2ffbecabee133dba49a109867b520d77c829c0d9b3fe92", size = 974971, upload_time = "2024-10-13T08:58:17.706Z" }, + { url = "https://files.pythonhosted.org/packages/ff/44/8fd8677048aa864d91915702522c70c5aaadedfd7cd95000b75d7aabeffd/pymunk-6.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d163dcba2e5814bc5f1274e0ee6ec2a7e06bed8bf0050f30f22b604634bf7dbc", size = 1037097, upload_time = "2024-10-13T08:58:20.264Z" }, + { url = "https://files.pythonhosted.org/packages/19/fc/e6b8bf53255f2012dbdf4a2b063b6c02f8c13ce13b21fdfd84dda64fea80/pymunk-6.9.0-cp311-cp311-win32.whl", hash = "sha256:5d3ae7df3d39afe5b11633496cd464b198d5c62bec69f767f3b61f9fe7f09b98", size = 315321, upload_time = "2024-10-13T08:58:22.475Z" }, + { url = "https://files.pythonhosted.org/packages/bc/3c/925a0193bbcca7203f46fc531f4f0703885c102c1e2c118c8db35816aee3/pymunk-6.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:2db4797ecec3668d51bc112a37192ee1836e236bbacdf5ed12f5a994cf1bae33", size = 366711, upload_time = "2024-10-13T08:58:24.796Z" }, + { url = "https://files.pythonhosted.org/packages/93/96/d8505f4e9661c0e5343db5492895b90b2ada6ec4547fdc7a2df50eb0cdf2/pymunk-6.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02bb0fbbbce2b12c18a033e2cec747e6c4b0db93d2cb9a20f45e569b571ba184", size = 364703, upload_time = "2024-10-13T08:58:27.144Z" }, + { url = "https://files.pythonhosted.org/packages/54/3e/610a2f2b0c6c14038168f6f862148cb245aef867b01906ce18704acafe1c/pymunk-6.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6aae4f93ac686d5e2ec60b01faa1b3722a8ab630464d0c127e16462e7bef6292", size = 347056, upload_time = "2024-10-13T08:58:29.39Z" }, + { url = "https://files.pythonhosted.org/packages/4a/dd/4e12fb3671a6c4f2c0604420f0f15b5402b05c4964bba001088a3d92e3b9/pymunk-6.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7734d13e490e84665b1f03e616270b248d5279ed34e03859267f67868f1b94c", size = 1071014, upload_time = "2024-10-13T08:58:32.274Z" }, + { url = "https://files.pythonhosted.org/packages/91/f8/0618a9204aff896da8b2a9df44179390b178bf00b189851affd4809b1f03/pymunk-6.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b05dbfa58d366dea860f7259ca48483922a83620ab6a19effaa74e85a4251966", size = 990358, upload_time = "2024-10-13T08:58:35.295Z" }, + { url = "https://files.pythonhosted.org/packages/af/67/ea2ff4a26b66acad394e4f28e4e316fbe306d34909eca401baae211ca182/pymunk-6.9.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cb9520c52c043de4b2b1f83979f0d097929f6ff13c8a4059d9d211b98ae25887", size = 976300, upload_time = "2024-10-13T08:58:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/91/d9/a69b268712dceacf227cfff74401e2292b53050383661d456605a1928a84/pymunk-6.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:da0e153d321073cd07a48380cfc1b7bd8d40bf4ee1b14a7ede33d90a69ee0452", size = 1042511, upload_time = "2024-10-13T08:58:40.044Z" }, + { url = "https://files.pythonhosted.org/packages/f0/40/21c2a08b027d99f351b75daa36f8a2e2385daba45098078d225811275ff8/pymunk-6.9.0-cp312-cp312-win32.whl", hash = "sha256:8325c9092345764876b1c3855126cb14450dc83dc5b141ff54983a7c77fbae52", size = 315339, upload_time = "2024-10-13T09:01:37.995Z" }, + { url = "https://files.pythonhosted.org/packages/78/b4/0a18c632f96924f969924cc5903689afcaf474d4c472305805dab391b247/pymunk-6.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:13246a79b599c44d174f5619596c62b656d8539797f28bdb2797c4b700c90a33", size = 366671, upload_time = "2024-10-13T09:01:39.965Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/c76904d21f3fdb0b713b3a8056622733a0b773f7e55ef974fa4546068cbd/pymunk-6.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5c59e5cf904e148dd0d35cffb7bafe146835042de9280672cafecc3a41caf7a3", size = 364703, upload_time = "2024-10-13T09:01:42.628Z" }, + { url = "https://files.pythonhosted.org/packages/63/b2/378d54b79812da5312b10de272c27aa0ac621498e059aa50eb4eec33ab52/pymunk-6.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4cbc2d37f69d85fedc1097af64edc8f4c43973a13429d51004883cbb9342875e", size = 347058, upload_time = "2024-10-13T09:01:44.529Z" }, + { url = "https://files.pythonhosted.org/packages/ba/a8/c7ea141a1d0e3f5b08ad653f0b5a4ebc0e5854f92bc7049a2a921fbe0d65/pymunk-6.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd64ef76e9e47fda929a2961fe98759ac46b5a7b6126d1ba3e6f04493da6519b", size = 1070851, upload_time = "2024-10-13T09:01:46.638Z" }, + { url = "https://files.pythonhosted.org/packages/10/a2/f40bcc9be90c2af1fe8cf4ba4281385b48d9f5667f03f6834c49aba600fd/pymunk-6.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c568c7402acd5d9a55e3965565ae0a596e4603ba8a7b7b7f0952efadd0e69524", size = 990371, upload_time = "2024-10-13T09:01:49.622Z" }, + { url = "https://files.pythonhosted.org/packages/01/ae/ff7fdf1c8d32ba89d1ccada39b5f7ed66e35420b8d31bdc9af6d5d20ea2f/pymunk-6.9.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f6cbe3d06e468be11a615d4facecc4a870bf58c1a27c365e655b5a85685ec942", size = 976294, upload_time = "2024-10-13T09:01:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/c6/90/64ef000011f0c930b42354f0d91a07b4bc7f70819ec5b6034b84198bf53f/pymunk-6.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:65a9a93a51dbaf1c77efa4d2425549888a1eda9f5c9cd9a5a89b7ca66310968a", size = 1042493, upload_time = "2024-10-13T09:01:55.665Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fb/6516bd5fe565ea51a88308869632dfc896ca6b05b2579b016ffa8047a8ec/pymunk-6.9.0-cp313-cp313-win32.whl", hash = "sha256:a78b37bb360e715657c76caedaf40cdaaf6dab354d497eda481a976cc5cab3d7", size = 315341, upload_time = "2024-10-13T09:01:58.049Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7c/1542df7ffbff70a4523ccb02c9241c9fe4dc24c77b747e2c16fb94891156/pymunk-6.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:d6419e1531df80ff0bb6f1f8215e044f57415514386b7b212dc148919ca629ed", size = 366673, upload_time = "2024-10-13T09:01:59.733Z" }, +] + +[[package]] +name = "pypresence" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/2e/d110f862720b5e3ba1b0b719657385fc4151929befa2c6981f48360aa480/pypresence-4.3.0.tar.gz", hash = "sha256:a6191a3af33a9667f2a4ef0185577c86b962ee70aa82643c472768a6fed1fbf3", size = 10696, upload_time = "2023-07-08T00:33:53.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/40/1d30b30e18f81eb71365681223971a9822a89b3d6ee5269dd2aa955bc228/pypresence-4.3.0-py2.py3-none-any.whl", hash = "sha256:af878c6d49315084f1b108aec86b31915080614d9421d6dd3a44737aba9ff13f", size = 11778, upload_time = "2023-07-08T00:33:52.018Z" }, +] + +[[package]] +name = "pytiled-parser" +version = "2.2.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/62/0d8a2220ee0747522f3b73e4f38bea7c78aefdf707afb86decf26f799fc5/pytiled_parser-2.2.9.tar.gz", hash = "sha256:225269fdd37afcbcd3b76ea3e2cab6b1e742387027106055990db43fd7451ebd", size = 45958, upload_time = "2025-01-23T18:43:30.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/f7/6b6c51b50ed8681a31146e5e7ac325b78fe776ff48b1ec8f56d7e4995d72/pytiled_parser-2.2.9-py2.py3-none-any.whl", hash = "sha256:37f73d31950bf4d02ee3bda59f3d6123c55194dc8d8e876821dd2080af5f1f91", size = 44452, upload_time = "2025-01-23T18:43:28.207Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload_time = "2025-07-04T13:28:34.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload_time = "2025-07-04T13:28:32.743Z" }, +]