From 7481a639ad2b1191cc37ee6216c9a2a659b799dd Mon Sep 17 00:00:00 2001 From: potkan Date: Tue, 28 Apr 2026 23:40:24 +0200 Subject: [PATCH] Upload files to "/" --- KiwiSoda.ttf | Bin 0 -> 49292 bytes LICENSE | 674 +++++++++++++++++++++++++++++++++++++++++ README.md | 4 + README.txt | 9 + game/__init__.py | 1 + game/__main__.py | 1 + game/asset_loader.py | 1 + game/game.py | 1 + levels.py | 691 +++++++++++++++++++++++++++++++++++++++++++ main.py | 79 +++++ project.pxo | Bin 0 -> 49886 bytes render_sprites.py | 49 +++ requirements.txt | 4 + sprites.png | Bin 0 -> 50853 bytes tests/test_game.py | 20 ++ variables.py | 156 ++++++++++ 16 files changed, 1690 insertions(+) create mode 100644 KiwiSoda.ttf create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.txt create mode 100644 game/__init__.py create mode 100644 game/__main__.py create mode 100644 game/asset_loader.py create mode 100644 game/game.py create mode 100644 levels.py create mode 100644 main.py create mode 100644 project.pxo create mode 100644 render_sprites.py create mode 100644 requirements.txt create mode 100644 sprites.png create mode 100644 tests/test_game.py create mode 100644 variables.py diff --git a/KiwiSoda.ttf b/KiwiSoda.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e544946f8918a85776a2f7b9cf96483a2f43c231 GIT binary patch literal 49292 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≦n9*?tlb|NaG_$A$&|i(z5>!Q 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 literal 0 HcmV?d00001 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..f846ad3 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# sas2py +swords and sandals 2 pygame remake, unfinished + +feel free to continue for me by contributing diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..636370a --- /dev/null +++ b/README.txt @@ -0,0 +1,9 @@ +FONT BY - https://fontenddev.com/fonts/kiwi-soda/ + +MAIN INSPIRATION - Swords and Sandals 2 by **Oliver Joyce** + +DISCLOSURE: +This is an original gladiator arena fighter game made in Pygame. +Gameplay and mechanics are inspired by classic flash-era arena games like **Sword and Sandals 2**. +All code, art, and assets are original and created by me. +This is a non-commercial fan tribute with **no affiliation** to the official series. \ No newline at end of file diff --git a/game/__init__.py b/game/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/game/__init__.py @@ -0,0 +1 @@ + diff --git a/game/__main__.py b/game/__main__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/game/__main__.py @@ -0,0 +1 @@ + diff --git a/game/asset_loader.py b/game/asset_loader.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/game/asset_loader.py @@ -0,0 +1 @@ + diff --git a/game/game.py b/game/game.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/game/game.py @@ -0,0 +1 @@ + diff --git a/levels.py b/levels.py new file mode 100644 index 0000000..5be042e --- /dev/null +++ b/levels.py @@ -0,0 +1,691 @@ +import random, variables +from main import pygame +from render_sprites import load_sprite, render_character +from variables import playerstrength, unlimited_slappeartext, lastclickpos, enemyreadytoattack, playerstamina + + +def level1(screen, sheet, font, buttonx, buttony, mouse, clicked, lastclickpos): + #print("level 1") + playbutton = pygame.surface.Surface((210, 60), pygame.SRCALPHA) + playbutton_inside = pygame.surface.Surface((200, 50), pygame.SRCALPHA) + playbutton_text = font.render("PLAY", True, (255, 255, 255)) + playbutton_collision = pygame.Rect(buttonx, buttony, 210, 60) + if playbutton_collision.collidepoint(mouse.get_pos()): + playbutton_inside.fill((255, 105, 15)) + if playbutton_collision.collidepoint(lastclickpos) and clicked: + variables.clicked = False + variables.level = 2 + else: + playbutton_inside.fill((210, 105, 40)) + playbutton_inside.blit(playbutton_text, (52, 5)) + playbutton.fill((130, 50, 0)) + playbutton.blit(playbutton_inside, (5, 5)) + screen.blit(load_sprite(sheet, 0, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + screen.blit(playbutton, (buttonx, buttony)) +def level2(screen, sheet, font, buttonx, buttony, mouse, clicked, lastclickpos): + #print("level 2") + playbutton = pygame.surface.Surface((210, 60), pygame.SRCALPHA) + playbutton_inside = pygame.surface.Surface((200, 50), pygame.SRCALPHA) + playbutton_text = font.render("Create a gladiator", True, (255, 255, 255)) + playbutton_collision = pygame.Rect(buttonx, buttony, 210, 60) + if playbutton_collision.collidepoint(mouse.get_pos()): + playbutton_inside.fill((255, 105, 15)) + if playbutton_collision.collidepoint(lastclickpos) and clicked: + variables.clicked = False + variables.level = 3 + else: + playbutton_inside.fill((210, 105, 40)) + playbutton_inside.blit(playbutton_text, (15, 12)) + playbutton.fill((130, 50, 0)) + playbutton.blit(playbutton_inside, (5, 5)) + screen.blit(load_sprite(sheet, 0, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + screen.blit(playbutton, (buttonx, buttony)) +def level3(screen, sheet, font, mouse, clicked, lastclickpos, playername, smallerfont, ticks, fps, chunkfont): + # FOR ENTER NAME SQUARE BOX + namesquare = pygame.surface.Surface((300, 70), pygame.SRCALPHA) + namesquare.fill((190, 115, 65)) + namesquare_entersquare = pygame.surface.Surface((290, 35), pygame.SRCALPHA) + namesquare_entersquare_collision = pygame.Rect(85, 90, 290, 35) + namesquare_entersquare_inside = pygame.surface.Surface((286, 31), pygame.SRCALPHA) + namesquare_entersquare.fill((0, 0, 0)) + namesquare_entersquare_inside.fill((190, 115, 65)) + if namesquare_entersquare_collision.collidepoint(mouse.get_pos()): + namesquare_entersquare.fill((255, 255, 255)) + if clicked: + namesquare_entersquare_inside.fill((255, 200, 125)) + else: + if clicked: + if not namesquare_entersquare_collision.collidepoint(lastclickpos): + namesquare_entersquare_inside.fill((190, 115, 65)) + else: + namesquare_entersquare_inside.fill((255, 200, 125)) + namesquare_entersquare.fill((255, 255, 255)) + variables.clicked = False + if namesquare_entersquare_collision.collidepoint(lastclickpos): + variables.canyoutypethename = True + namesquare_entersquare.fill((255, 255, 255)) + namesquare_entersquare_inside.fill((255, 200, 125)) + else: + variables.canyoutypethename = False + playernametext = smallerfont.render(str(playername), True, (0, 0, 0)) + namesquare_entersquare_inside.blit(playernametext, (2, 2)) + namesquare_entersquare.blit(namesquare_entersquare_inside, (2, 2)) + nametext = font.render("enter name below", True, (255, 255, 255)) + appearance_square = pygame.surface.Surface((300, 150), pygame.SRCALPHA) + appearance_square.fill((190, 115, 65)) + textskincolor = font.render("skin color", True, (255, 255, 255)) + skinleft = pygame.Rect(260, 143, 20, 20) + skinright = pygame.Rect(286, 143, 20, 20) + appearance_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 20, 20), (180, 5)) + appearance_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 20, 20), (205, 5)) + texthairstyle = font.render("hair style", True, (255, 255, 255)) + hairleft = pygame.Rect(260, 188, 20, 20) + hairright = pygame.Rect(286, 188, 20, 20) + appearance_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 20, 20), (180, 50)) + appearance_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 20, 20), (205, 50)) + haircolorleft = pygame.Rect(330, 188, 10, 15) + haircolorright = pygame.Rect(350, 188, 10, 15) + appearance_square.blit(load_sprite(sheet, 1907, 14, 2, 3, 10, 15), (250, 52)) + appearance_square.blit(load_sprite(sheet, 1910, 14, 2, 3, 10, 15), (270, 52)) + textstubble = font.render("stubble", True, (255, 255, 255)) + stubbleleft = pygame.Rect(260, 238, 20, 20) + stubbleright = pygame.Rect(286, 238, 20, 20) + appearance_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 20, 20), (180, 100)) + appearance_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 20, 20), (205, 100)) + randomisecol = pygame.Rect(353, 260, 25, 25) + appearance_square.blit(load_sprite(sheet, 1912, 17, 8, 8, 25, 25), (272, 122)) + skills_square = pygame.surface.Surface((175, 225), pygame.SRCALPHA) + skills_square.fill((190, 115, 65)) + textstrength = smallerfont.render("strength - "+str(variables.playerstrength), True, (255, 255, 255)) + textagility = smallerfont.render("agility - "+str(variables.playeragility), True, (255, 255, 255)) + textattack = smallerfont.render("attack - "+str(variables.playerattack), True, (255, 255, 255)) + textdefense = smallerfont.render("defence - "+str(variables.playerdefense), True, (255, 255, 255)) + textvitality = smallerfont.render("vitality - "+str(variables.playervitality), True, (255, 255, 255)) + textcharisma = smallerfont.render("charisma - "+str(variables.playercharisma), True, (255, 255, 255)) + textstamina = smallerfont.render("stamina - "+str(variables.playerstamina), True, (255, 255, 255)) + textmagicka = smallerfont.render("magicka - "+str(variables.playermagicka), True, (255, 255, 255)) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 5)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 5)) + strengthdown = pygame.Rect(220, 297, 15, 15) + strengthup = pygame.Rect(237, 297, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 30)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 30)) + agilitydown = pygame.Rect(220, 322, 15, 15) + agilityup = pygame.Rect(237, 322, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 55)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 55)) + attackdown = pygame.Rect(220, 347, 15, 15) + attackup = pygame.Rect(237, 347, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 80)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 80)) + defensedown = pygame.Rect(220, 372, 15, 15) + defenseup = pygame.Rect(237, 372, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 105)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 105)) + vitalitydown = pygame.Rect(220, 397, 15, 15) + vitalityup = pygame.Rect(237, 397, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 130)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 130)) + charismadown = pygame.Rect(220, 422, 15, 15) + charismaup = pygame.Rect(237, 422, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 155)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 155)) + staminadown = pygame.Rect(220, 447, 15, 15) + staminaup = pygame.Rect(237, 447, 15, 15) + skills_square.blit(load_sprite(sheet, 1913, 0, 7, 7, 15, 15), (140, 180)) + skills_square.blit(load_sprite(sheet, 1913, 7, 7, 7, 15, 15), (157, 180)) + magickadown = pygame.Rect(220, 472, 15, 15) + magickaup = pygame.Rect(237, 472, 15, 15) + + + screen.blit(load_sprite(sheet, 162, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + screen.blit(load_sprite(sheet, 1884, 0, 10, 10, 75, 75), (variables.screen_width/10*9, variables.screen_height/11*9)) + screen.blit(load_sprite(sheet, 1894, 0, 10, 10, 75, 75), (variables.screen_width/10*9, variables.screen_height/13.2*9)) + backbutt = pygame.Rect(variables.screen_width/10*9, variables.screen_height/11*9, 75, 75) + continuebutt = pygame.Rect(variables.screen_width/10*9, variables.screen_height/13.2*9, 75, 75) + + + if skinleft.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 20, 20), (180, 5)) + if clicked: + if variables.skincolor <= 1: + variables.skincolor = 3 + else: + variables.skincolor -= 1 + variables.clicked = False + elif skinright.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 20, 20), (205, 5)) + if clicked: + if variables.skincolor >= 3: + variables.skincolor = 1 + else: + variables.skincolor += 1 + variables.clicked = False + elif hairleft.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 20, 20), (180, 50)) + if clicked: + if variables.hairstyle <= 1: + variables.hairstyle = 5 + else: + variables.hairstyle -= 1 + variables.clicked = False + elif hairright.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 20, 20), (205, 50)) + if clicked: + if variables.hairstyle >= 5: + variables.hairstyle = 1 + else: + variables.hairstyle += 1 + variables.clicked = False + elif haircolorleft.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1914, 14, 2, 3, 10, 15), (250, 52)) + if clicked: + if variables.haircolor <= 1: + variables.haircolor = 4 + else: + variables.haircolor -= 1 + variables.clicked = False + elif haircolorright.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1917, 14, 2, 3, 10, 15), (270, 52)) + if clicked: + if variables.haircolor >= 4: + variables.haircolor = 1 + else: + variables.haircolor += 1 + variables.clicked = False + elif stubbleleft.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 20, 20), (180, 100)) + if clicked: + if variables.stubble <= 1: + variables.stubble = 6 + else: + variables.stubble -= 1 + variables.clicked = False + elif stubbleright.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 20, 20), (205, 100)) + if clicked: + if variables.stubble >= 6: + variables.stubble = 1 + else: + variables.stubble += 1 + variables.clicked = False + elif randomisecol.collidepoint(mouse.get_pos()): + appearance_square.blit(load_sprite(sheet, 1904, 17, 8, 8, 25, 25), (272, 122)) + if clicked: + variables.skincolor, variables.hairstyle, variables.haircolor, variables.stubble = random.randint(1, 3), random.randint(1, 5), random.randint(1, 4), random.randint(1, 6) + elif strengthdown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 5)) + if clicked: + if variables.playerstrength <= 1: + pass + else: + variables.playerstrength -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif strengthup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 5)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playerstrength += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif agilitydown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 30)) + if clicked: + if variables.playeragility <= 1: + pass + else: + variables.playeragility -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif agilityup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 30)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playeragility += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif attackdown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 55)) + if clicked: + if variables.playerattack <= 1: + pass + else: + variables.playerattack -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif attackup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 55)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playerattack += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif defensedown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 80)) + if clicked: + if variables.playerdefense <= 1: + pass + else: + variables.playerdefense -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif defenseup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 80)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playerdefense += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif vitalitydown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 105)) + if clicked: + if variables.playervitality <= 1: + pass + else: + variables.playervitality -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif vitalityup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 105)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playervitality += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif charismadown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 130)) + if clicked: + if variables.playercharisma <= 1: + pass + else: + variables.playercharisma -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif charismaup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 130)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playercharisma += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif staminadown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 155)) + if clicked: + if variables.playerstamina <= 1: + pass + else: + variables.playerstamina -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif staminaup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 155)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playerstamina += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif magickadown.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 7, 7, 7, 15, 15), (140, 180)) + if clicked: + if variables.playermagicka <= 1: + pass + else: + variables.playermagicka -= 1 + variables.availablepoints += 1 + variables.clicked = False + elif magickaup.collidepoint(mouse.get_pos()): + skills_square.blit(load_sprite(sheet, 1906, 0, 7, 7, 15, 15), (157, 180)) + if clicked: + if variables.availablepoints <= 0: + pass + else: + variables.playermagicka += 1 + variables.availablepoints -= 1 + variables.clicked = False + elif backbutt.collidepoint(mouse.get_pos()): + screen.blit(load_sprite(sheet, 1884, 10, 10, 10, 75, 75), (variables.screen_width/10*9, variables.screen_height/11*9)) + if clicked: + variables.level = 1 + variables.player_reset() + variables.clicked = False + elif continuebutt.collidepoint(mouse.get_pos()): + screen.blit(load_sprite(sheet, 1894, 10, 10, 10, 75, 75), (variables.screen_width/10*9, variables.screen_height/13.2*9)) + if clicked and variables.availablepoints == 0: + if variables.playername == "": + variables.playername = "Nameless" + variables.level = 4 + variables.clicked = False + match variables.haircolor: + case 1: + variables.haircolormodifier = 0 + case 2: + variables.haircolormodifier = 1 + case 3: + variables.haircolormodifier = 2 + case 4: + variables.haircolormodifier = 3 + + skillspoints_square = pygame.surface.Surface((118, 118), pygame.SRCALPHA) + skillspoints_square.fill((190, 115, 65)) + textskillpoints = chunkfont.render(str(variables.availablepoints), True, (255, 255, 255)) + textskillsinfo = font.render("skill points", True, (255, 255, 255)) + skillspoints_square.blit(textskillsinfo, (10, 5)) + skillspoints_square.blit(textskillpoints, (40, 40)) + # ACTUALLY DISPLAYS THE SHIT + namesquare.blit(namesquare_entersquare, (5, 30)) + namesquare.blit(nametext, (5, 5)) + appearance_square.blit(textskincolor, (5, 5)) + appearance_square.blit(texthairstyle, (5, 50)) + appearance_square.blit(textstubble, (5, 100)) + skills_square.blit(textstrength, (5, 5)) + skills_square.blit(textagility, (5, 30)) + skills_square.blit(textattack, (5, 55)) + skills_square.blit(textdefense, (5, 80)) + skills_square.blit(textvitality, (5, 105)) + skills_square.blit(textcharisma, (5, 130)) + skills_square.blit(textstamina, (5, 155)) + skills_square.blit(textmagicka, (5, 180)) + screen.blit(namesquare, (80, 60)) + screen.blit(appearance_square, (80, 135)) + screen.blit(skills_square, (80, 292)) + screen.blit(skillspoints_square, (262, 292)) + playertex = pygame.surface.Surface((190+variables.playerstrength, 435+variables.playerstrength), pygame.SRCALPHA) + match variables.skincolor: + case 1: + playertex.blit(load_sprite(sheet, 1901 - variables.ticksanimation * 2, 1886, 19, 34, 190+variables.playerstrength, 340+variables.playerstrength/19*34), (0,70)) + case 2: + playertex.blit(load_sprite(sheet, 1901 - variables.ticksanimation * 2, 1851, 19, 34, 190+variables.playerstrength, 340+variables.playerstrength/19*34), (0,70)) + case 3: + playertex.blit(load_sprite(sheet, 1901 - variables.ticksanimation * 2, 1816, 19, 34, 190+variables.playerstrength, 340+variables.playerstrength/19*34), (0,70)) + match variables.hairstyle: + case 1: + pass + case 2: + playertex.blit(load_sprite(sheet, 1869, 1911 + variables.haircoloroffset * variables.haircolormodifier, 11, 9, 110, 90), (40 + variables.playerstrength/2+1, 12 + variables.ticksanimation)) + case 3: + playertex.blit(load_sprite(sheet, 1857, 1911 + variables.haircoloroffset * variables.haircolormodifier, 11, 9, 110, 90), (40 + variables.playerstrength/2+1, 12 + variables.ticksanimation)) + case 4: + playertex.blit(load_sprite(sheet, 1845, 1911 + variables.haircoloroffset * variables.haircolormodifier, 11, 9, 110, 90), (40 + variables.playerstrength/2+1, 12 + variables.ticksanimation)) + case 5: + playertex.blit(load_sprite(sheet, 1833, 1911 + variables.haircoloroffset * variables.haircolormodifier, 11, 9, 110, 90), (40 + variables.playerstrength/2+1, 12 + variables.ticksanimation)) + match variables.stubble: + case 1: + pass + case 2: + playertex.blit(load_sprite(sheet, 1821, 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 110, 40), (40 + variables.playerstrength/2+1, 111 + variables.ticksanimation + variables.playerstrength/3)) + case 3: + playertex.blit(load_sprite(sheet, 1809, 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 110, 40), (40 + variables.playerstrength/2+1, 111 + variables.ticksanimation + variables.playerstrength/3)) + case 4: + playertex.blit(load_sprite(sheet, 1797, 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 110, 40), (40 + variables.playerstrength/2+1, 111 + variables.ticksanimation + variables.playerstrength/3)) + case 5: + playertex.blit(load_sprite(sheet, 1785, 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 110, 40), (40 + variables.playerstrength/2+1, 111 + variables.ticksanimation + variables.playerstrength/3)) + case 6: + playertex.blit(load_sprite(sheet, 1773, 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 110, 40), (40 + variables.playerstrength/2+1, 111 + variables.ticksanimation + variables.playerstrength/3)) + screen.blit(playertex, (575, 80-variables.playerstrength/19*34)) + if ticks >= fps/2: + variables.ticksanimation = 0 + else: + variables.ticksanimation = 10 +def level4(screen, sheet, font, mouse, clicked, lastclickpos, playername, smallerfont, ticks, fps, chunkfont, chgfont, slappeartext): + screensurface = pygame.surface.Surface((variables.screen_width, variables.screen_height), pygame.SRCALPHA) + #print(str(slappeartext)+"x"+str(variables.unlimited_slappeartext)) + variables.unlimited_slappeartext += 1 + if slappeartext < 255: + variables.textcolor = (slappeartext, slappeartext, slappeartext) + variables.slowly_appearing_text = variables.unlimited_slappeartext + else: + variables.textcolor = (255, 255, 255) + match variables.dialognum: + case 1: + screensurface.fill((0,0,0)) + currenttext = chunkfont.render("Prologue", True, variables.textcolor) + currentsubtext = chgfont.render("Enslaved", True, variables.textcolor) + screensurface.blit(currenttext, (variables.screen_width/2-150, variables.screen_height/2-75)) + screensurface.blit(currentsubtext, (variables.screen_width/2-111, variables.screen_height/2)) + if slappeartext > 350: + variables.unlimited_slappeartext = 0 + variables.dialognum = 2 + case 2: #MISSING HAIR AND STUBBLE TOO LAZY TO FIX RN + screensurface.blit(load_sprite(sheet, 323, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + screensurface.blit(load_sprite(sheet, variables.hangingx, variables.getskinhangingcolory(), 33, 34, 330, 340+variables.ticksanimation/2), (variables.screen_width/2-165, variables.screen_height/2-75)) + if variables.gethairstylex() != None: + screensurface.blit(load_sprite(sheet, variables.gethairstylex(), 1911 + variables.haircoloroffset * variables.haircolormodifier, 11, 9, 105,85), (447, 167.5+variables.ticksanimation/10)) + if variables.getstubblex() != None: + screensurface.blit(load_sprite(sheet, variables.getstubblex(), 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 110,40), (445, 265+variables.ticksanimation/9.9)) + dialogsquare = pygame.surface.Surface((variables.screen_width/25*23, variables.screen_height/5), pygame.SRCALPHA) + dialogsquare.fill((190, 115, 65)) + if slappeartext > 600: + variables.unlimited_slappeartext = 0 + variables.dialognum = 3 + if variables.playername != "Nameless": + dialogue = font.render(str(variables.playername)+"..."+str(variables.playername)+".... yes... that was your name.", True, (190-int(variables.slowly_appearing_text/3*2), 115-int(variables.slowly_appearing_text/3), 65-int(variables.slowly_appearing_text/4))) + dialogue2 = font.render("But it seems an eternity since anyone has called you that.", True, (190-int(variables.slowly_appearing_text/3*2), 115-int(variables.slowly_appearing_text/3), 65-int(variables.slowly_appearing_text/4))) + dialogsquare.blit(dialogue, (315 - len(variables.playername) * 9, 30)) + else: + dialogue = font.render("Once... you had a name of your own.", True, (190 - int(variables.slowly_appearing_text / 3 * 2), 115 - int(variables.slowly_appearing_text / 3), 65 - int(variables.slowly_appearing_text / 4))) + dialogue2 = font.render("But it seems an eternity since anyone has called you it.", True, (190-int(variables.slowly_appearing_text/3*2), 115-int(variables.slowly_appearing_text/3), 65-int(variables.slowly_appearing_text/4))) + dialogsquare.blit(dialogue, (300, 30)) + dialogsquare.blit(dialogue2, (200, 70)) + screensurface.blit(dialogsquare, (variables.screen_width/25, variables.screen_height/25)) + case 3: + screensurface.blit(load_sprite(sheet, 323, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + #screensurface.blit(load_sprite(sheet, 1901, variables.getskincolory(), 19, 34, 510, 920), (variables.screen_width/2-253, variables.screen_height/3)) + screensurface.blit(render_character(sheet, variables.skincolor, variables.hairstyle, variables.stubble, variables.haircolor, variables.playerstrength, 380, 680), (variables.screen_width/2-190, 150-variables.ticksanimation*2)) + dialogsquare = pygame.surface.Surface((variables.screen_width/25*23, variables.screen_height/5), pygame.SRCALPHA) + dialogsquare.fill((190, 115, 65)) + dialogue = font.render("And so, in a frenzy of blood and with the stench of fear, your days as a gladiator begin.", True, (190-int(variables.slowly_appearing_text/3*2), 115-int(variables.slowly_appearing_text/3), 65-int(variables.slowly_appearing_text/4))) + dialogsquare.blit(dialogue, (45, 45)) + if slappeartext > 600: + variables.unlimited_slappeartext = 0 + variables.dialognum = 4 + #if variables.gethairstylex() != None: + # screensurface.blit(load_sprite(sheet, variables.gethairstylex(), 1911 + variables.haircoloroffset * variables.haircolormodifier, 11, 9, 294,247), (355, 35)) + #if variables.getstubblex() != None: + # screensurface.blit(load_sprite(sheet, variables.getstubblex(), 1916 + variables.stubbleoffset * variables.haircolormodifier, 11, 4, 300,110), (352, 308)) + screensurface.blit(dialogsquare, (variables.screen_width/25, variables.screen_height/25)) + case 4: + screensurface.blit(load_sprite(sheet, 643, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + screensurface.blit(render_character(sheet, variables.skincolor, variables.hairstyle, variables.stubble, variables.haircolor, variables.playerstrength, 190, 340), (100, variables.screen_height-420-variables.playerstrength/340*420)) + screensurface.blit(render_character(sheet, 1, 5, 6, 5, 1, 190, 340), (variables.screen_width/1.55, variables.screen_height-420-variables.playerstrength/340*420)) + name1 = chgfont.render(variables.playername, True, (255,255,0)) + name2 = chgfont.render("Fearful Prisoner", True, (255,255,0)) + level1_1 = font.render("Level 1", True, (255,255,255)) + level1_2 = font.render("Level 1", True, (255,255,255)) + versusdialog = font.render("Live from the Dungeon", True, (255,255,255)) + screensurface.blit(name1, (50, 50)) + screensurface.blit(level1_1, (50, 100)) + screensurface.blit(name2, (variables.screen_width-450, 50)) + screensurface.blit(level1_2, (variables.screen_width-125, 100)) + screensurface.blit(load_sprite(sheet, 483, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + screensurface.blit(versusdialog, (variables.screen_width/2-85, 390)) + screensurface.blit(load_sprite(sheet, 1894, 0, 10, 10, 100, 100), (variables.screen_width/2-35, variables.screen_height/2-18)) + continuebutt = pygame.Rect(variables.screen_width/2-35, variables.screen_height/2-18, 100, 100) + if continuebutt.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1894, 10, 10, 10, 100, 100), (variables.screen_width/2-35, variables.screen_height/2-18)) + if continuebutt.collidepoint(lastclickpos): + variables.player_active = True + variables.level = 5 + variables.playermana = 10 + variables.playerstamina * 20 # this is the players mana, calculated from stamina + variables.playerhealth = 10 + variables.playervitality * 20 # this is the players health, calculated from vitality + # OK so this is basically the animation for the character. + if ticks >= fps/2: + variables.ticksanimation = 0 + else: + variables.ticksanimation = 10 + + screen.blit(screensurface, (0, 0)) +def level5(screen, sheet, font, mouse, clicked, lastclickpos, playername, smallerfont, ticks, fps, chunkfont, chgfont, slappeartext): + enemyrect = pygame.Rect(variables.enemyX, variables.enemyY, 95, 170) + playerrect = pygame.Rect(variables.playerX, variables.playerY, 95, 170) + screensurface = pygame.surface.Surface((variables.screen_width, variables.screen_height), pygame.SRCALPHA) + screensurface.blit(load_sprite(sheet, 803, 0, 160, 96, variables.screen_width, variables.screen_height), (0, 0)) + if not variables.enemyreadytoattack: + screensurface.blit(render_character(sheet, 1, 5, 6, 5, 1, 95, 170), (variables.enemyX, variables.enemyY)) + if variables.playerhealth < 0: + variables.playerhealth = 0 + if variables.enemyhealth < 0: + variables.enemyhealth = 0 + + if variables.playerhealth >= variables.playervitality*20+10: + screensurface.blit(load_sprite(sheet, 1913, 49, 7, 8, 96, 110), (30, 30)) + elif (variables.playervitality * 20 + 10) > variables.playerhealth >= (variables.playervitality * 20 + 10)/5: + screensurface.blit(load_sprite(sheet, 1913, 57, 7, 8, 96, 110), (30, 30)) + elif 0 < variables.playerhealth < (variables.playervitality*20+10)/5: + screensurface.blit(load_sprite(sheet, 1913, 65, 7, 8, 96, 110), (30, 30)) + else: + screensurface.blit(load_sprite(sheet, 1913, 73, 7, 8, 96, 110), (30, 30)) + if variables.playermana >= variables.playerstamina*20+10: + screensurface.blit(load_sprite(sheet, 1906, 49, 7, 8, 96, 110), (160, 30)) + elif (variables.playerstamina * 20 + 10) > variables.playermana >= (variables.playerstamina * 20 + 10)/5: + screensurface.blit(load_sprite(sheet, 1906, 57, 7, 8, 96, 110), (160, 30)) + elif 0 < variables.playermana < (variables.playerstamina*20+10)/5: + screensurface.blit(load_sprite(sheet, 1906, 65, 7, 8, 96, 110), (160, 30)) + else: + screensurface.blit(load_sprite(sheet, 1906, 73, 7, 8, 96, 110), (160, 30)) + + if variables.enemyhealth >= 10: + screensurface.blit(load_sprite(sheet, 1913, 49, 7, 8, 96, 110), (variables.screen_width-30-96, 30)) + elif 10 > variables.enemyhealth >= 3: + screensurface.blit(load_sprite(sheet, 1913, 57, 7, 8, 96, 110), (variables.screen_width-30-96, 30)) + elif 0 < variables.enemyhealth < 3: + screensurface.blit(load_sprite(sheet, 1913, 65, 7, 8, 96, 110), (variables.screen_width-30-96, 30)) + else: + screensurface.blit(load_sprite(sheet, 1913, 73, 7, 8, 96, 110), (variables.screen_width-30-96, 30)) + if variables.enemymana >= 100: + screensurface.blit(load_sprite(sheet, 1906, 49, 7, 8, 96, 110), (variables.screen_width-160-96, 30)) + elif 100 > variables.enemymana >= 30: + screensurface.blit(load_sprite(sheet, 1906, 57, 7, 8, 96, 110), (variables.screen_width-160-96, 30)) + elif 0 < variables.enemymana < 30: + screensurface.blit(load_sprite(sheet, 1906, 65, 7, 8, 96, 110), (variables.screen_width-160-96, 30)) + else: + screensurface.blit(load_sprite(sheet, 1906, 73, 7, 8, 96, 110), (variables.screen_width-160-96, 30)) + playerhealthtext = font.render("HP="+str(variables.playerhealth)+"/"+str((10+variables.playervitality*20)), True, (255, 255, 255)) + playermanatext = font.render("ST="+str(variables.playermana)+"/"+str((90+variables.playerstamina*20)), True, (255, 255, 255)) + screensurface.blit(playerhealthtext, (32, 140)) + screensurface.blit(playermanatext, (162, 140)) + enemyhealthtext = font.render("HP=" + str(variables.enemyhealth) + "/" + str((10)), True, (255, 255, 255)) + enemymanatext = font.render("ST=" + str(variables.enemymana) + "/" + str((90 + 1 * 20)),True, (255, 255, 255)) + screensurface.blit(enemyhealthtext, (variables.screen_width-32-96, 140)) + screensurface.blit(enemymanatext, (variables.screen_width-162-96, 140)) + if variables.blocked0: + variables.slowly_appearing_text += 1 + if variables.slowly_appearing_text < 100: + screensurface.blit(font.render("blocked", True, (255, 255, 255)), (variables.enemyX+20, variables.enemyY - 10)) + else: + variables.blocked0 = False + + if variables.whoseturn: + screensurface.blit(render_character(sheet, variables.skincolor, variables.hairstyle, variables.stubble, variables.haircolor, variables.playerstrength, 95, 170), (variables.playerX, variables.playerY)) + screensurface.blit(load_sprite(sheet, 1894, 21, 10, 10, 40, 40),(variables.playerX+130, variables.playerY+80)) + screensurface.blit(load_sprite(sheet, 1884, 21, 10, 10, 40, 40),(variables.playerX+115, variables.playerY+35)) + screensurface.blit(load_sprite(sheet, 1874, 21, 10, 10, 40, 40),(variables.playerX+100, variables.playerY-10)) + screensurface.blit(load_sprite(sheet, 1844, 21, 10, 10, 40, 40), (variables.playerX+65, variables.playerY-45)) + screensurface.blit(load_sprite(sheet, 1854, 21, 10, 10, 40, 40), (variables.playerX+22, variables.playerY-45)) + screensurface.blit(load_sprite(sheet, 1864, 21, 10, 10, 40, 40), (variables.playerX-21, variables.playerY-45)) + fight = pygame.Rect(variables.playerX+130, variables.playerY+80, 40, 40) + goright = pygame.Rect(variables.playerX+115, variables.playerY+35, 40, 40) + jumpright = pygame.Rect(variables.playerX+100, variables.playerY-10, 40, 40) + scream = pygame.Rect(variables.playerX+65, variables.playerY-45, 40, 40) + goleft = pygame.Rect(variables.playerX+22, variables.playerY-45, 40, 40) + jumpleft = pygame.Rect(variables.playerX-21, variables.playerY-45, 40, 40) + if fight.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1894, 31, 10, 10, 40, 40), (variables.playerX+130, variables.playerY+80)) + if fight.collidepoint(lastclickpos) and clicked: + variables.lastplayerX = variables.playerX + variables.fightingright = True + variables.whoseturn = 0 + clicked = False + elif goright.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1884, 31, 10, 10, 40, 40), (variables.playerX+115, variables.playerY+35)) + if goright.collidepoint(lastclickpos) and clicked: + variables.lastplayerX = variables.playerX + variables.walkingright = True + variables.whoseturn = 0 + clicked = False + elif jumpright.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1874, 31, 10, 10, 40, 40), (variables.playerX+100, variables.playerY-10)) + if jumpright.collidepoint(lastclickpos): + print("yo") + elif scream.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1844, 31, 10, 10, 40, 40), (variables.playerX+65, variables.playerY-45)) + if scream.collidepoint(lastclickpos): + print("yo") + elif goleft.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1854, 31, 10, 10, 40, 40), (variables.playerX+22, variables.playerY-45)) + if goleft.collidepoint(lastclickpos): + print("yo") + elif jumpleft.collidepoint(pygame.mouse.get_pos()): + screensurface.blit(load_sprite(sheet, 1864, 31, 10, 10, 40, 40), (variables.playerX-21, variables.playerY-45)) + if jumpleft.collidepoint(lastclickpos): + print("yo") + if not variables.whoseturn and variables.enemyreadytoattack: + screensurface.blit(render_character(sheet, variables.skincolor, variables.hairstyle, variables.stubble, variables.haircolor,variables.playerstrength, 95, 170), (variables.playerX, variables.playerY)) + match variables.enemyattack: + case _: + if variables.enemychoosing: + variables.lastenemyX = variables.enemyX + variables.enemychoosing = False + elif variables.enemyX > variables.lastenemyX-1 * 3 - 100 and variables.enemyX-variables.playerX>100: # WALKING RIGHT FUNCTION + variables.enemyX -= 2 + else: + variables.enemyreadytoattack = False + variables.whoseturn = 1 + screensurface.blit(render_character(sheet, 1, 5, 6, 5, 1, 95, 170, "leftwalk"),(variables.enemyX, variables.enemyY)) + #case 2: + # print() +# + # case _: + # print() + + if variables.playerX <= variables.lastplayerX+variables.playeragility*3+100 and variables.walkingright and variables.enemyX-variables.playerX>100: # WALKING RIGHT FUNCTION + variables.playerX += 3.5 + screensurface.blit(render_character(sheet, variables.skincolor, variables.hairstyle, variables.stubble, variables.haircolor,variables.playerstrength, 95, 170, "rightwalk"), (variables.playerX, variables.playerY)) + if variables.playerX <= variables.lastplayerX+variables.playeragility*3+100 and variables.fightingright: # WALKING RIGHT FUNCTION + screensurface.blit(render_character(sheet, variables.skincolor, variables.hairstyle, variables.stubble, variables.haircolor,variables.playerstrength, 95, 170, "rightattack"), (variables.playerX, variables.playerY+50)) + if not playerrect.colliderect(enemyrect) and variables.enemyX-variables.playerX>100: + variables.playerX += 2 + else: + if random.randint(1, 100) <= 55+variables.playerattack*3: + variables.enemyhealth -= random.randint(1, 8+variables.playerstrength*2) + + screensurface.blit(font.render("ST=" + str(variables.enemymana) + "/" + str((90 + 1 * 20)), True, (255, 255, 255)),(variables.screen_width - 162 - 96, 140)) + else: + variables.blocked0 = True + variables.slowly_appearing_text = 0 + variables.whoseturn = 0 + variables.enemyattack = random.randint(1, 4) + variables.enemyreadytoattack = True + variables.enemychoosing = True + variables.walkingright = False + variables.fightingright = False + variables.clicked = False + elif (variables.walkingright or variables.fightingright): + if variables.playerX >= variables.lastplayerX+variables.playeragility*3+100 or not variables.enemyX-variables.playerX>100: + print("READY") + variables.whoseturn = 0 + variables.enemyattack = random.randint(1,4) + variables.enemyreadytoattack = True + variables.enemychoosing = True + variables.walkingright = False + variables.fightingright = False + variables.clicked = False + if ticks >= fps / 2: + variables.ticksanimation = 0 + else: + variables.ticksanimation = 10 + screen.blit(screensurface, (0, 0)) \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..0a887dd --- /dev/null +++ b/main.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +import pygame +import variables +import levels + +def main(width=variables.screen_width, height=variables.screen_height, fps=variables.screen_fps): + pygame.init() + screen = pygame.display.set_mode((width, height)) + pygame.display.set_caption("Untitled") + basicfont = pygame.font.Font(None, 24) + gamefont = pygame.font.Font("KiwiSoda.ttf", 40) + chunkygamefont = pygame.font.Font("KiwiSoda.ttf", 60) + chunkyfont = pygame.font.Font(None, 100) + smallergamefont = pygame.font.Font("KiwiSoda.ttf", 23) + clock = pygame.time.Clock() + sheet = pygame.image.load("sprites.png").convert_alpha() + running = True + while running: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + # Fill these in with your logic + if event.type == pygame.KEYDOWN: + if variables.level == 3 and variables.canyoutypethename == True: + name = pygame.key.name(event.key) + if name == "backspace": + variables.playername = variables.playername[:-1] + elif len(variables.playername) >= 12: + pass + elif name == "return" or name == "space": + pass + elif len(name) == 1:# and name.isalpha(): + variables.playername += str(name) + # Example: print(event.key) or handle input + match event.key: + case pygame.K_ESCAPE: + running = False + case pygame.K_SLASH: + if variables.devmode: + variables.level = 4 + variables.dialognum = 4 + variables.playername = "BlackNigger" + case pygame.K_SPACE: + if variables.devmode: + variables.hairstyle += 1 + variables.stubble += 1 + variables.skincolor += 1 + case pygame.K_BACKSPACE: + if variables.devmode: + variables.skincolor -= 1 + variables.hairstyle -= 1 + variables.stubble -= 1 + case pygame.K_CAPSLOCK: + if variables.devmode: + variables.playerstrength += 1 + if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: + variables.clicked = True + variables.lastclickpos = pygame.mouse.get_pos() + match variables.level: + case 1: + levels.level1(screen, sheet, gamefont, variables.screen_width/2-100, variables.screen_height/2+120, pygame.mouse, variables.clicked, variables.lastclickpos) + case 2: + levels.level2(screen, sheet, smallergamefont, variables.screen_width/2-100, variables.screen_height/2+120, pygame.mouse, variables.clicked, variables.lastclickpos) + case 3: + levels.level3(screen, sheet, smallergamefont, pygame.mouse, variables.clicked, variables.lastclickpos, variables.playername, smallergamefont, variables.ticks, variables.screen_fps, chunkyfont) + case 4: + levels.level4(screen, sheet, smallergamefont, pygame.mouse, variables.clicked, variables.lastclickpos, variables.playername, smallergamefont, variables.ticks, variables.screen_fps, chunkyfont, chunkygamefont, variables.unlimited_slappeartext) + case 5: + levels.level5(screen, sheet, smallergamefont, pygame.mouse, variables.clicked, variables.lastclickpos, variables.playername, smallergamefont, variables.ticks, variables.screen_fps, chunkyfont, chunkygamefont, variables.unlimited_slappeartext) + clock.tick(fps) + variables.ticks += 1 + if variables.ticks > fps: + variables.ticks = 0 + fps_text = basicfont.render(str(int(clock.get_fps())), True, (0, 255, 0)) + screen.blit(fps_text, (5, 5)) + pygame.display.flip() + pygame.quit() +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/project.pxo b/project.pxo new file mode 100644 index 0000000000000000000000000000000000000000..35622f3f6ed4efb892f09b422cea1cddb8fc4498 GIT binary patch literal 49886 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 KFByxw? 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 literal 0 HcmV?d00001 diff --git a/render_sprites.py b/render_sprites.py new file mode 100644 index 0000000..4d78340 --- /dev/null +++ b/render_sprites.py @@ -0,0 +1,49 @@ +import pygame, variables +# basically the screen, x and y of the sprite +def load_sprite(sheet, x, y, width, height, screen_width, screen_height): + rect = pygame.Rect(x, y, width, height) + sprite = sheet.subsurface(rect) + scaled = pygame.transform.scale(sprite, (screen_width, screen_height)) + return scaled +def render_character(sheet, skincolor, hairstyle, stubble, haircolor, playerstrength, width, height, animated="basic"): #basic just standing animation, leftwalk, leftattack, rightwalk, rightattack, scream + if animated=="basic": + rect = pygame.Rect(1901 - variables.ticksanimation * 2, variables.getskincolory(skincolor), 19, 34) + sprite = sheet.subsurface(rect) + combined = pygame.Surface((19, 42), pygame.SRCALPHA) + combined.blit(sprite, (0, 8)) + if 5 >= hairstyle > 1: + combined.blit(load_sprite(sheet, variables.gethairstylex(hairstyle), 1912+variables.haircoloroffset*(haircolor-1), 11, 8, 11, 8), (4, 3+variables.ticksanimation/10)) + if 6 >= stubble > 1: + combined.blit(load_sprite(sheet, variables.getstubblex(stubble), 1916+variables.stubbleoffset*(haircolor-1), 11, 4, 11, 4), (4, 12+variables.ticksanimation/10)) + scaled = pygame.transform.scale(combined, (width+playerstrength/width*170, height/34*42+playerstrength/height*420)) + elif animated=="rightwalk": + rect = pygame.Rect(1901 - variables.ticksanimation * 4, variables.getskincolory(skincolor)-variables.ticksanimation*7, 19, 34) + sprite = sheet.subsurface(rect) + combined = pygame.Surface((19, 42), pygame.SRCALPHA) + combined.blit(sprite, (0, 8)) + if 5 >= hairstyle > 1: + combined.blit(load_sprite(sheet, variables.gethairstylex(hairstyle), 1912+variables.haircoloroffset*(haircolor-1), 11, 8, 11, 8), (4, 3)) + if 6 >= stubble > 1: + combined.blit(load_sprite(sheet, variables.getstubblex(stubble), 1916+variables.stubbleoffset*(haircolor-1), 11, 4, 11, 4), (4, 12)) + scaled = pygame.transform.scale(combined, (width+playerstrength/width*170, height/34*42+playerstrength/height*420)) + elif animated=="leftwalk": + rect = pygame.Rect(1901 - variables.ticksanimation * 6, variables.getskincolory(skincolor)-variables.ticksanimation*7, 19, 34) + sprite = sheet.subsurface(rect) + combined = pygame.Surface((19, 42), pygame.SRCALPHA) + combined.blit(sprite, (0, 8)) + if 5 >= hairstyle > 1: + combined.blit(load_sprite(sheet, variables.gethairstylex(hairstyle), 1912+variables.haircoloroffset*(haircolor-1), 11, 8, 11, 8), (4, 3)) + if 6 >= stubble > 1: + combined.blit(load_sprite(sheet, variables.getstubblex(stubble), 1916+variables.stubbleoffset*(haircolor-1), 11, 4, 11, 4), (4, 12)) + scaled = pygame.transform.scale(combined, (width+playerstrength/width*170, height/34*42+playerstrength/height*420)) + elif animated=="rightattack": + rect = pygame.Rect(1811 - variables.ticksanimation * 3, variables.getskincolory(skincolor)-70, 29, 32) + sprite = sheet.subsurface(rect) + combined = pygame.Surface((29, 40), pygame.SRCALPHA) + combined.blit(sprite, (0, 8)) + if 5 >= hairstyle > 1: + combined.blit(load_sprite(sheet, variables.gethairstylex(hairstyle), 1912+variables.haircoloroffset*(haircolor-1), 11, 8, 11, 8), (4, 3)) + if 6 >= stubble > 1: + combined.blit(load_sprite(sheet, variables.getstubblex(stubble), 1916+variables.stubbleoffset*(haircolor-1), 11, 4, 11, 4), (4, 12)) + scaled = pygame.transform.scale(combined, ((width+playerstrength/width*290)/19*29, (height/34*42+playerstrength/height*320)/42*32)) + return scaled \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d3ed66a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +pygame==2.5.0 + + + diff --git a/sprites.png b/sprites.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5ffb8d6a21243ffa216864236a1f035295f488 GIT binary patch literal 50853 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