commit b0765653d9a2dddf50ecb5a81924e8d12add5257 Author: potkan Date: Tue Apr 28 23:38:11 2026 +0200 Upload files to "/" diff --git a/Flowey01.png b/Flowey01.png new file mode 100644 index 0000000..84d8cc8 Binary files /dev/null and b/Flowey01.png differ diff --git a/Flowey01m.png b/Flowey01m.png new file mode 100644 index 0000000..091b7bd Binary files /dev/null and b/Flowey01m.png differ diff --git a/Flowey02.png b/Flowey02.png new file mode 100644 index 0000000..029dd0b Binary files /dev/null and b/Flowey02.png differ diff --git a/Flowey02m.png b/Flowey02m.png new file mode 100644 index 0000000..7a4763f Binary files /dev/null and b/Flowey02m.png differ diff --git a/Flowey_goofy.png b/Flowey_goofy.png new file mode 100644 index 0000000..0c728bf Binary files /dev/null and b/Flowey_goofy.png differ diff --git a/Floweypissed01.png b/Floweypissed01.png new file mode 100644 index 0000000..be1f108 Binary files /dev/null and b/Floweypissed01.png differ diff --git a/Floweypissed02.png b/Floweypissed02.png new file mode 100644 index 0000000..9e4c623 Binary files /dev/null and b/Floweypissed02.png differ diff --git a/Floweypissed03.png b/Floweypissed03.png new file mode 100644 index 0000000..192f723 Binary files /dev/null and b/Floweypissed03.png differ diff --git a/Floweywinky.png b/Floweywinky.png new file mode 100644 index 0000000..647cc03 Binary files /dev/null and b/Floweywinky.png differ diff --git a/Floweywinky.png~ b/Floweywinky.png~ new file mode 100644 index 0000000..647cc03 Binary files /dev/null and b/Floweywinky.png~ differ 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..ae4d517 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# underpygametale +an unfinished undertale remake in pygame. + +feel free to change smth and contribute ill be happy to check it out and accept it diff --git a/assets.py b/assets.py new file mode 100644 index 0000000..06fdc5b --- /dev/null +++ b/assets.py @@ -0,0 +1,110 @@ +import pygame +import pygame, random, time, sys +from ffpyplayer.player import MediaPlayer + +target = (300, 300) +pellets = [] +num_pellets = 24 +radius = 120 +pw, ph = 43, 60 +displaysize, playersize = (640,480), (pw,ph) +game_surface = pygame.Surface((640, 480)) +map = pygame.Surface((640, 480)) +level = 1 +angle = 0 +escapecounter = 0 +dialognum = 1 +battlemodestart = False +battlemode = False +defaultborders = True +BX, BY = 0, 0 +playerX, playerY = 250, 250 +oldX, oldY = playerX, playerY +playerXc, playerYc = 0, 0 +camera_x = playerX - 640 // 2 +randomblock = pygame.Surface((100, 100)) +randomblock.fill((0, 0, 255)) +playeractive = False +floweytalking = False +floweypissed = False +blocks = [ + (0, 312, 75, 200), + (0, 355, 120, 200), + (0, 398, 165, 200), + (0, 0, 120, 88), + (480, 0, 165, 88), + (550, 0, 1000, 245), + (478, 360, 1000, 100), + (440, 400, 100, 100) + #(x, y, w, h) + #(420, 400, 100, 100) +] +selectormenu = False +GOBACKONLY = False +goingblack = 0 +animation_delay = 10 +startdelay = 0 +player_sprites = [ + pygame.transform.scale(pygame.image.load('players1.png'), playersize), + pygame.transform.scale(pygame.image.load('players2.png'), playersize), + pygame.transform.scale(pygame.image.load('players3.png'), playersize), + pygame.transform.scale(pygame.image.load('playerb1.png'), playersize), + pygame.transform.scale(pygame.image.load('playerb2.png'), playersize), + pygame.transform.scale(pygame.image.load('playerb3.png'), playersize), + pygame.transform.scale(pygame.image.load('playerr1.png'), playersize), + pygame.transform.scale(pygame.image.load('playerr2.png'), playersize), + pygame.transform.scale(pygame.image.load('playerl1.png'), playersize), + pygame.transform.scale(pygame.image.load('playerl2.png'), playersize), +] +player_soul = pygame.transform.scale(pygame.image.load('soul.png'), (16,16)) +rect_surf = pygame.transform.scale(pygame.image.load('pellet.png'), (20,10)) +monstersize = (108, 124) +Flowey02 = pygame.transform.scale(pygame.image.load("Flowey02.png"), monstersize) +Flowey01 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) +current_music = None +dialogue = pygame.transform.scale(pygame.image.load('dialogue.png'), (580,180)) +escapping = False +last_surf = None # keep last drawn frame +fullscreen = False +inmenu = False +x_start = None +fontsize = 32 +char, color = None, "white" +dialogue_text = "" +letters_shown = 0 # start with nothing shown +floweygoofy = False +xkey, ykey = 1, 1 +pelletx, pellety = 300, 30 +pelletxr1 = 200 +pelletxr2 = 250 +pelletyr3 = 350 +pelletyr4 = 400 +font = pygame.font.Font("determination.ttf", fontsize).render(char, True, color) +#things that will be in save files +hp, maxhp = 20, 20 +LV = 1 +level = 1 +playername = "" +current_run = "neutral" +#all the pygame setups and shit +clock = pygame.time.Clock() +screen = pygame.display.set_mode(displaysize) +player = player_sprites[0] +#player_rect = player.get_rect() +start_time = time.time() # wall clock start +iconpng = pygame.image.load('icon.png') +iconpng = pygame.transform.scale(iconpng, (32,32)) +#intro +video = MediaPlayer("intro.mkv") +game_option = 1 +blip_channel = pygame.mixer.Channel(5) +blip_variants = [ + pygame.mixer.Sound("blip.ogg"), + pygame.mixer.Sound("scaryblip.wav") +] +dialogue_text = "* Howdy!\n* I'm FLOWEY.\n* FLOWEY the FLOWER!" +letters_shown = 0 +last_tick = pygame.time.get_ticks() +delay_ms = 40 # reveal speed (ms per character) +#all the music +start_menu_mus = "mus_menu0.ogg" \ No newline at end of file diff --git a/backup main.py b/backup main.py new file mode 100644 index 0000000..cc805ab --- /dev/null +++ b/backup main.py @@ -0,0 +1,1294 @@ +from typing import Dict +import pygame, random, time, sys +from ffpyplayer.player import MediaPlayer +import numpy as np +from pygame import sndarray + +pygame.init() +pygame.mixer.pre_init(buffer=1500) +pygame.mixer.init() +#all the variables +pw, ph = 43, 60 +displaysize, playersize = (640,480), (pw,ph) +game_surface = pygame.Surface((640, 480)) +map = pygame.Surface((640, 480)) +level = 1 +angle = 0 +escapecounter = 0 +dialognum = 1 +battlemodestart = False +battlemode = False +defaultborders = True +BX, BY = 0, 0 +playerX, playerY = 250, 250 +oldX, oldY = playerX, playerY +playerXc, playerYc = 0, 0 +camera_x = playerX - 640 // 2 +randomblock = pygame.Surface((100, 100)) +randomblock.fill((0, 0, 255)) +playeractive = False +floweytalking = False +floweypissed = False +blocks = [ + (0, 312, 75, 200), + (0, 355, 120, 200), + (0, 398, 165, 200), + (0, 0, 120, 88), + (480, 0, 165, 88), + (550, 0, 1000, 245), + (478, 360, 1000, 100), + (440, 400, 100, 100) + #(x, y, w, h) + #(420, 400, 100, 100) +] +selectormenu = False +GOBACKONLY = False +goingblack = 0 +animation_delay = 10 +startdelay = 0 +player_sprites = [ + pygame.transform.scale(pygame.image.load('players1.png'), playersize), + pygame.transform.scale(pygame.image.load('players2.png'), playersize), + pygame.transform.scale(pygame.image.load('players3.png'), playersize), + pygame.transform.scale(pygame.image.load('playerb1.png'), playersize), + pygame.transform.scale(pygame.image.load('playerb2.png'), playersize), + pygame.transform.scale(pygame.image.load('playerb3.png'), playersize), + pygame.transform.scale(pygame.image.load('playerr1.png'), playersize), + pygame.transform.scale(pygame.image.load('playerr2.png'), playersize), + pygame.transform.scale(pygame.image.load('playerl1.png'), playersize), + pygame.transform.scale(pygame.image.load('playerl2.png'), playersize), +] +player_soul = pygame.transform.scale(pygame.image.load('soul.png'), (16,16)) +rect_surf = pygame.transform.scale(pygame.image.load('pellet.png'), (20,10)) +monstersize = (108, 124) +Flowey02 = pygame.transform.scale(pygame.image.load("Flowey02.png"), monstersize) +Flowey01 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) +current_music = None +dialogue = pygame.transform.scale(pygame.image.load('dialogue.png'), (580,180)) +escapping = False +last_surf = None # keep last drawn frame +fullscreen = False +inmenu = False +x_start = None +fontsize = 32 +char, color = None, "white" +dialogue_text = "" +letters_shown = 0 # start with nothing shown +floweygoofy = False +xkey, ykey = 1, 1 +pelletx, pellety = 300, 30 +pelletxr1 = 200 +pelletxr2 = 250 +pelletyr3 = 350 +pelletyr4 = 400 +font = pygame.font.Font("determination.ttf", fontsize).render(char, True, color) +#things that will be in save files +hp, maxhp = 20, 20 +LV = 1 +level = 1 +playername = "" +current_run = "neutral" +#all the pygame setups and shit +clock = pygame.time.Clock() +screen = pygame.display.set_mode(displaysize) +player = player_sprites[0] +#player_rect = player.get_rect() +start_time = time.time() # wall clock start +iconpng = pygame.image.load('icon.png') +iconpng = pygame.transform.scale(iconpng, (32,32)) +#intro +video = MediaPlayer("intro.mkv") +game_option = 1 +blip_channel = pygame.mixer.Channel(5) +blip_variants = [ + pygame.mixer.Sound("blip.ogg"), + pygame.mixer.Sound("scaryblip.wav") +] +def play_letter_blip(num): + sound = blip_variants[num] + blip_channel.play(sound) + + +def play_music(filename, loop=-1): + """ + Switch music without blocking. + The old track fades out in the background while the new one starts instantly. + """ + global current_music + + if current_music == filename: + return # same track, do nothing + if filename == "stop": + pygame.mixer.music.stop() + current_music = None + if filename != "stop": + # Start new track immediately + pygame.mixer.music.load(filename) + pygame.mixer.music.play(loop) + current_music = filename + +#defines borders +def def_borders(x,y, b1, b2, b3, b4): + if x < b1: + x = oldX + elif y > b2: + y = oldY + if x > b3: + x = oldX + elif y < b4: + y = oldY + return x, y + +def check_collision(x1, y1, w1, h1, x2, y2, w2, h2): + """ + Returns True if the two rectangles overlap. + Works like pygame.Rect.colliderect. + + x1, y1 = top-left of first rectangle + w1, h1 = width/height of first rectangle + x2, y2 = top-left of second rectangle + w2, h2 = width/height of second rectangle + """ + return (x1 < x2 + w2 and + x1 + w1 > x2 and + y1 < y2 + h2 and + y1 + h1 > y2) + +def draw_text(text, color, pos, fontsize, space_width=10, letter_spacing=0, line_spacing=5, shake_amount=0, select=False, xkeyboard=1, ykeyboard=1, surface=game_surface): + """ + Draws text to game_surface with: + - '\n' converted to new lines + - custom space width + - adjustable spacing between letters + - shaking effect + - optional selection highlight based on xkeyboard/ykeyboard + """ + # convert color names to RGB + colors = { + "black" : (0,0,0), + "white": (255,255,255), + "red": (255,0,0), + "green": (0,255,0), + "blue": (0,0,255), + "yellow": (255,255,0) + } + color = colors.get(color, (255,255,255)) + + font = pygame.font.Font("determination.ttf", fontsize) + x_start, y = pos + + row = 1 + for line in text.split("\n"): + x = x_start + col = 1 + for char in line: + if char == " ": + x += space_width + col += 1 + continue + + # if select mode is on, highlight the letter at (xkeyboard, ykeyboard) + if select and col == xkeyboard and row == ykeyboard: + char_color = colors.get("yellow") + else: + char_color = color + + char_surf = font.render(char, True, char_color) + + shake_x = random.uniform(-shake_amount, shake_amount) + shake_y = random.uniform(-shake_amount, shake_amount) + surface.blit(char_surf, (x + shake_x, y + shake_y)) + x += char_surf.get_width() + letter_spacing + col += 1 + y += font.get_linesize() + line_spacing + row += 1 + +dialogue_text = "* Howdy!\n* I'm FLOWEY.\n* FLOWEY the FLOWER!" +letters_shown = 0 +last_tick = pygame.time.get_ticks() +delay_ms = 40 # reveal speed (ms per character) + +def draw_dialogue_text( + text, + color, + pos, + fontsize, + letters_shown, + surface, + space_width=10, + letter_spacing=0, + line_spacing=5, + shake_amount=0, + debug=False, + num=0 +): + """ + Draw up to `letters_shown` characters of `text` onto `surface`. + pos is relative to the top-left of `surface`. + Returns how many characters were drawn (useful for debugging). + """ + colors = { + "black" : (0,0,0), + "white": (255,255,255), + "red": (255,0,0), + "green": (0,255,0), + "blue": (0,0,255), + "yellow": (255,255,0) + } + fg = colors.get(color, color if isinstance(color, tuple) else (255,255,255)) + + font = pygame.font.Font("determination.ttf", fontsize) + x_start, y = pos + + drawn = 0 + # iterate line-by-line so '\n' is respected + for line in text.split("\n"): + x = x_start + for ch in line: + if drawn >= letters_shown: + return drawn + if ch == " ": + x += space_width + drawn += 1 + continue + + ch_surf = font.render(ch, True, fg) + shake_x = random.uniform(-shake_amount, shake_amount) + shake_y = random.uniform(-shake_amount, shake_amount) + dest_x = x + shake_x + dest_y = y + shake_y + + surface.blit(ch_surf, (dest_x, dest_y)) + if ch not in " \n" and not blip_channel.get_busy(): + if len(dialogue_text) > letters_shown-1: + play_letter_blip(num) + if debug: + # draw a small rect showing the glyph area (visible overlay) + pygame.draw.rect(surface, (255,0,0), pygame.Rect(int(dest_x), int(dest_y), + ch_surf.get_width(), ch_surf.get_height()), 1) + + x += ch_surf.get_width() + letter_spacing + drawn += 1 + # move to next line. use font.get_linesize if available + try: + line_h = font.get_linesize() + except Exception: + line_h = fontsize + y += line_h + line_spacing + + return drawn + + + + +#all the music +start_menu_mus = "mus_menu0.ogg" + +pygame.display.set_caption("UNDERTALE", icontitle="Inspired by Toby Fox <3") +pygame.display.set_icon(iconpng) +paused = False +running = True +while running == True: + #print(pygame.time.get_ticks()) + oldX, oldY = playerX, playerY + playerY += playerYc*3 + playerX += playerXc*3 + if not battlemode: + if playerYc > 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[0]: + player = player_sprites[1] + elif player == player_sprites[1]: + player = player_sprites[2] + else: + player = player_sprites[0] + startdelay = 0 + elif playerYc < 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[3]: + player = player_sprites[4] + elif player == player_sprites[4]: + player = player_sprites[5] + else: + player = player_sprites[3] + startdelay = 0 + elif playerXc > 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[6]: + player = player_sprites[7] + else: + player = player_sprites[6] + startdelay = 0 + elif playerXc < 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[8]: + player = player_sprites[9] + else: + player = player_sprites[8] + startdelay = 0 + window_size = screen.get_size() + scale = min(window_size[0] / (640,480)[0], window_size[1] / (640,480)[1]) + new_size = (int((640,480)[0] * scale), int((640,480)[1] * scale)) + scaled_surface = pygame.transform.scale(game_surface, new_size) + + for event in pygame.event.get(): + + if event.type == pygame.QUIT: + running = False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_z or event.key == pygame.K_RETURN: + if level == 1 or level == 1.5: + video.close_player() + level = 2 + elif level == 2: + if game_option == 1: + level = 3 + else: + level = 2.5 + game_option = 1 + elif level == 2.5: + if game_option == 1: + level = 2 + elif level == 3: + if len(playername) < 6: + if ykey == 1: + if xkey == 1: + playername += "A" + elif xkey == 3: + playername += "B" + elif xkey == 5: + playername += "C" + elif xkey == 7: + playername += "D" + elif xkey == 9: + playername += "E" + elif xkey == 11: + playername += "F" + elif xkey == 13: + playername += "G" + elif ykey == 2: + if xkey == 1: + playername += "H" + elif xkey == 3: + playername += "I" + elif xkey == 5: + playername += "J" + elif xkey == 7: + playername += "K" + elif xkey == 9: + playername += "L" + elif xkey == 11: + playername += "M" + elif xkey == 13: + playername += "N" + elif ykey == 3: + if xkey == 1: + playername += "O" + elif xkey == 3: + playername += "P" + elif xkey == 5: + playername += "Q" + elif xkey == 7: + playername += "R" + elif xkey == 9: + playername += "S" + elif xkey == 11: + playername += "T" + elif xkey == 13: + playername += "U" + elif ykey == 4: + if xkey == 1: + playername += "V" + elif xkey == 3: + playername += "W" + elif xkey == 5: + playername += "X" + elif xkey == 7: + playername += "Y" + elif xkey == 9: + playername += "Z" + if ykey == 5: + if xkey == 1: + playername += "a" + elif xkey == 3: + playername += "b" + elif xkey == 5: + playername += "c" + elif xkey == 7: + playername += "d" + elif xkey == 9: + playername += "e" + elif xkey == 11: + playername += "f" + elif xkey == 13: + playername += "g" + elif ykey == 6: + if xkey == 1: + playername += "h" + elif xkey == 3: + playername += "i" + elif xkey == 5: + playername += "j" + elif xkey == 7: + playername += "k" + elif xkey == 9: + playername += "l" + elif xkey == 11: + playername += "m" + elif xkey == 13: + playername += "n" + elif ykey == 7: + if xkey == 1: + playername += "o" + elif xkey == 3: + playername += "p" + elif xkey == 5: + playername += "q" + elif xkey == 7: + playername += "r" + elif xkey == 9: + playername += "s" + elif xkey == 11: + playername += "t" + elif xkey == 13: + playername += "u" + elif ykey == 8: + if xkey == 1: + playername += "v" + elif xkey == 3: + playername += "w" + elif xkey == 5: + playername += "x" + elif xkey == 7: + playername += "y" + elif xkey == 9: + playername += "z" + if ykey == 9: + if xkey == 5: + if playername != "": + playername = playername[:-1] + elif xkey == 9: + if playername != "": + level = 3.5 + xkey, ykey = 1, 1 + elif level == 3.5: + if GOBACKONLY: + GOBACKONLY, level = False, 3 + else: + if xkey == 1: + level = 3 + xkey, ykey = 9, 9 + elif xkey == 2: + level = 3.75 + elif level == 5: + if floweytalking: + if len(dialogue_text) > letters_shown: + letters_shown = len(dialogue_text) + else: + if dialognum < 8: + if not battlemode: + dialogue = pygame.transform.scale(pygame.image.load('dialogue.png'), (580,180)) + letters_shown = 0 + dialognum += 1 + elif level == 6: + if floweytalking: + if len(dialogue_text) > letters_shown: + letters_shown = len(dialogue_text) + else: + if dialognum < 20: + if not battlemode: + dialogue = pygame.transform.scale(pygame.image.load('dialogue.png'), (580,180)) + if dialognum == 7 or dialognum == 11 or dialognum == 14: + pass + else: + if dialognum != 15: + letters_shown = 0 + dialognum += 1 + if event.key == pygame.K_F4: + if not fullscreen: + screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) + fullscreen = True + else: + screen = pygame.display.set_mode(displaysize) + fullscreen = False + + if event.key == pygame.K_ESCAPE: + escapping = True + + if event.key == pygame.K_SPACE: + print("playerX="+str(playerX)+", playerY="+str(playerY)+"\nmouse pos: "+str(pygame.mouse.get_pos())) + + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + #if randomblock not in player.colliderect(): + if not inmenu: + if playeractive: + playerXc = -1 + startdelay = animation_delay + else: + if selectormenu: + if level == 3: + if (xkey, ykey) != (1, 1): + xkey -= 1 + if xkey < 1 and ykey != 1 and ykey != 9: + xkey = 13 + ykey += -1 + if ykey < 8.5: + if xkey % 2 == 0: + xkey -= 1 + else: + if xkey == 8: + xkey = 5 + elif xkey == 4: + xkey = 1 + elif xkey == 0: + xkey = 9 + elif level == 3.5: + if not GOBACKONLY: + if xkey != 1: + xkey = 1 + else: + xkey = 2 + + else: + xkey -= 1 + print(str(xkey)) + + if event.key == pygame.K_RIGHT or event.key == pygame.K_d: + if not inmenu: + if playeractive: + playerXc = 1 + startdelay = animation_delay + else: + if selectormenu: + if level == 3: + if ykey < 8.5: + xkey += 1 + if xkey % 2 == 0: + xkey += 1 + else: + if xkey == 1: + xkey = 5 + elif xkey == 5: + xkey = 9 + elif xkey == 9: + xkey = 1 + elif level == 3.5: + if not GOBACKONLY: + if xkey != 2: + xkey = 2 + else: + xkey = 1 + + print(str(xkey)) + + if event.key == pygame.K_UP or event.key == pygame.K_w: + #print(game_option) + if not inmenu: + if playeractive: + playerYc = -1 + startdelay = animation_delay + else: + if selectormenu: + if ykey > 1: + ykey -= 1 + else: + if game_option > 1: + game_option -= 1 + print(str(ykey)) + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + #print(game_option) + if not inmenu: + if playeractive: + playerYc = 1 + startdelay = animation_delay + else: + if selectormenu: + ykey +=1 + if ykey > 8.5 and ykey != 10: + if xkey == 2 or xkey == 3 or xkey == 4: + xkey = 1 + elif xkey == 6 or xkey == 7 or xkey == 8 or xkey == 9: + xkey = 5 + else: + if xkey != 1 and xkey != 5 and xkey != 9: + xkey = 9 + else: + game_option += 1 + print(str(ykey)) + + + print("posx="+str(xkey)+" posy="+str(ykey)) + if event.type == pygame.KEYUP: + + if event.key == pygame.K_ESCAPE: + escapecounter = 0 + escapping = False + + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + if not battlemode: + player = player_sprites[8] + playerXc = 0 + + if event.key == pygame.K_RIGHT or event.key == pygame.K_d: + if not battlemode: + player = player_sprites[6] + playerXc = 0 + + if event.key == pygame.K_UP or event.key == pygame.K_w: + if not battlemode: + player = player_sprites[3] + playerYc = 0 + + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + if not battlemode: + player = player_sprites[0] + playerYc = 0 + + if defaultborders: + playerX, playerY = def_borders(playerX, playerY, 0, 420, 600, 0) + for bx, by, bw, bh in blocks: + if check_collision(playerX, playerY, pw, ph, bx, by, bw, bh): + playerX, playerY = oldX, oldY + break # stop checking after first collision + game_surface.fill((0, 0, 0)) + if level == 1: + inmenu = True + play_music("stop") + frame, val = video.get_frame() # get next frame (or None) + if frame is not None: + img, t = frame + last_surf = pygame.image.frombuffer(img.to_bytearray()[0], img.get_size(), 'RGB') + # always draw last frame, even if no new frame + clock.tick(30) + if last_surf: + game_surface.blit(last_surf, (0, 0)) + if val == 'eof': + level = 1.5 + elif level == 1.5: + game_surface.blit(last_surf, (0, 0)) + elif level == 2: + inmenu = True + play_music(start_menu_mus) + if game_option == 1: + game_surface.blit(pygame.transform.scale(pygame.image.load("instructions.png"), (640, 480)), (0,0)) + elif game_option == 2: + game_surface.blit(pygame.transform.scale(pygame.image.load("instructions2.png"), (640, 480)), (0,0)) + else: + game_surface.blit(pygame.transform.scale(pygame.image.load("instructions2.png"), (640, 480)), (0,0)) + game_option = 2 + elif level == 2.5: + play_music(start_menu_mus) + if game_option == 1: + game_surface.blit(pygame.transform.scale(pygame.image.load("settings1.png"), (640, 480)), (0,0)) + elif game_option == 2: + game_surface.blit(pygame.transform.scale(pygame.image.load("settings2.png"), (640, 480)), (0,0)) + else: + game_surface.blit(pygame.transform.scale(pygame.image.load("settings2.png"), (640, 480)), (0,0)) + game_option = 2 + elif level == 3: + play_music(start_menu_mus) + selectormenu = True + draw_text("Name the fallen human.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (275, 111), 32, letter_spacing=-0.6) + if playername.lower() == "gaster": + selectormenu = False + inmenu = False + level = 1 + video = MediaPlayer("intro.mkv") + playername = "" + if xkey > 13 and ykey < 9: + xkey = 1 + ykey += 1 + if ykey < 5: + if ykey == 4: + if xkey > 9: + xkey = 1 + ykey += 1 + draw_text("A B C D E F G\nH I J K L M N\nO P Q R S T U\nV W X Y Z", "white", (120, 150), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135, select=True, xkeyboard=xkey, ykeyboard=ykey) + draw_text("a b c d e f g\nh i j k l m n\no p q r s t u\nv w x y z", "white", (120, 276), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif 4 < ykey < 9: + if ykey == 8: + if xkey > 9: + xkey = 9 + draw_text("A B C D E F G\nH I J K L M N\nO P Q R S T U\nV W X Y Z", "white", (120, 150), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + draw_text("a b c d e f g\nh i j k l m n\no p q r s t u\nv w x y z", "white", (120, 276), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135, select=True, xkeyboard=xkey, ykeyboard=ykey-4) + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif ykey > 8: + draw_text("A B C D E F G\nH I J K L M N\nO P Q R S T U\nV W X Y Z", "white", (120, 150), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + draw_text("a b c d e f g\nh i j k l m n\no p q r s t u\nv w x y z", "white", (120, 276), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + if ykey > 9: + ykey = 1 + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + if xkey == 1: + draw_text("Quit", "yellow", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif xkey == 5: + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "yellow", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif xkey == 9: + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "yellow", (465, 405), 34, letter_spacing=-0.6) + elif xkey < 1: + xkey = 9 + else: + xkey = 1 + else: + ykey = 9 + increasinglybig = 32 + elif level == 3.5: + play_music(start_menu_mus) + if GOBACKONLY: + draw_text("Go back", "yellow", (120, 405), 34, letter_spacing=-0.6) + if playername.lower() == "sans": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("nope.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "alphys": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("D-don't do that.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "asgore": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("You cannot.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "asriel": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("...","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "flowey": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("I already CHOSE\nthat name.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "toriel": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("I think you should\nthink of your own\nname, my child.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "undyne": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("Get your OWN name!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + else: + if xkey == 1: + draw_text("No", "yellow", (120, 405), 34, letter_spacing=-0.6) + draw_text("Yes", "white", (465, 405), 34, letter_spacing=-0.6) + elif xkey == 2: + draw_text("No", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Yes", "yellow", (465, 405), 34, letter_spacing=-0.6) + if playername.lower() == "frisk": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("WARNING: This name will\nmake your life hell.\nProceed anyway?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + elif playername.lower() == "murder" or playername.lower() == "mercy ": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("That's a little on-\nthe-nose, isn't it...?" ,"white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "aaaaaa": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Not very creative...?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "aaron": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Is this name correct? ;)","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "alphy": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Uh.... OK?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "catty": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Bratty! Bratty!\nThat's MY name!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "bratty": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Like, OK I guess.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "bpants": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("You are really scraping the\nbottom of the barrel.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "chara": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("the true name.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "gerson": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Wah ha ha! Why not?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "jerry": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Jerry.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "metta" or playername.lower() == "mett" or playername.lower() == "mtt": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("OOOOH!!! ARE YOU\nPROMOTING MY BRAND?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "napsta" or playername.lower() == "blooky": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("........\n(They are powerless to\nstop you.)","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "papyru": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("I'LL ALLOW IT!!!!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "shyren": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("...?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "temmie": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("hOI!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "woshua": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Clean name.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + else: + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Is this name correct?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + + + #game_surface.blit(pygame.font.Font("determination.ttf", 32).render("Name the fallen human.", True, (255, 255, 255)), (181, 70)) + elif level == 3.75: + play_music("mus_cymbal.ogg") + game_surface.fill((goingblack, goingblack, goingblack)) # black borders + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + if goingblack < 255: + goingblack += 0.65 + else: + inmenu, selectormenu, playeractive = False, False, True + map = pygame.Surface((1400, 480)) + map.blit(pygame.transform.scale(pygame.image.load("startingroom.png"), (1400, 480)), (0,0)) + defaultborders = False + level = 4 + playerX, playerY = 285, 205 + player = player_sprites[0] + play_music("stop") + elif level == 4: + camera_x = playerX - 640 // 2 + if camera_x < 0: + camera_x = 0 + elif camera_x > 1400 - 640: + camera_x = 1400 - 640 + # draw the visible slice of the map + game_surface.blit(map, (0, 0), (camera_x, 0, 640, 480)) + # draw the player at the correct position + player_screen_x = playerX - camera_x + game_surface.blit(player, (player_screen_x, playerY)) + if playerX > 1205 and playerY < 250: + blocks.clear() + player = player_sprites[3] + map = pygame.Surface((640, 480)) + customtimer = 0 + print("Before reset:", playerX, playerY) + playerX, playerY = 300, 405 + print("After reset:", playerX, playerY) + level = 5 + else: + playerX, playerY = def_borders(playerX, playerY,40,382,1315,45) + elif level == 5: + playerX, playerY = def_borders(playerX, playerY, 231, 420, 360, 0) + + # draw the visible slice of the map + #print(customtimer) + if floweytalking: + playeractive = False + play_music("mus_flowey.ogg") + customtimer += 1 + if 20 > customtimer: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom2.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey02, (30,30)) + elif 20 < customtimer < 40: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey01, (30,30)) + elif customtimer > 40: + customtimer = 0 + map.blit(pygame.transform.scale(pygame.image.load("floweyroom2.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey02, (30,30)) + else: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey01, (30,30)) + + + letters_shown += 1 + # safely play blip + index = min(int(letters_shown)-1, len(dialogue_text)-1) # cap at last character + #if int(letters_shown) > 0 and dialogue_text[index] not in " \n": + # if letters_shown+1 < len(dialogue_text): + # generate_blip(frequency=random.randint(600,605), duration_ms=60, volume=0.4).play() + + print(letters_shown) + if dialognum < 7: + game_surface.blit(map, (0, 0)) + game_surface.blit(dialogue, (25,0)) + draw_dialogue_text(dialogue_text, "white", (150, 30), 36, letters_shown, dialogue, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0, debug=False, num=0) + # draw the player at the correct position + game_surface.blit(player_sprites[3], (playerX, playerY)) + if dialognum == 1: + dialogue_text = "* Howdy!\n* I'm FLOWEY.\n* FLOWEY the FLOWER!" + #draw_dialogue_text(dialogue_text, "white", (40, 380), 24, letters_shown, surface=dialogue) + elif dialognum == 2: + dialogue_text = "* Hmmm..." + elif dialognum == 3: + dialogue_text = "* You're new to the\nUNDERGROUND, aren'tcha?" + elif dialognum == 4: + dialogue_text = "* Golly, you must be\nso confused." + elif dialognum == 5: + dialogue_text = "* Someone ought to teach\nyou how things work\naround here!" + elif dialognum == 6: + dialogue_text = "* Ready? Here we go!" + else: + battlemodestart = True + level = 6 + customtimer = 0 + dialognum = 1 + pygame.mixer.Sound("encounter.ogg").play() + + + elif not floweytalking: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom.png"), (640, 480)), (0,0)) + if playerY < 301: + dialognum = 1 + floweytalking = True + playeractive = False + playerYc, playerXc = 0, 0 + elif playerY > 408: + defaultborders = False + level = 4 + playerX, playerY = 1257, 260 + camera_x = playerX - 640 // 2 + if camera_x < 0: + camera_x = 0 + elif camera_x > 1400 - 640: + camera_x = 1400 - 640 + blocks = [ + (0, 312, 75, 200), + (0, 355, 120, 200), + (0, 398, 165, 200), + (0, 0, 120, 88), + (480, 0, 165, 88), + (550, 0, 1000, 245), + (478, 360, 1000, 100), + (440, 400, 100, 100) + #(x, y, w, h) + #(420, 400, 100, 100) + ] + player = player_sprites[0] + inmenu, selectormenu, playeractive = False, False, True + map = pygame.Surface((1400, 480)) + map.blit(pygame.transform.scale(pygame.image.load("startingroom.png"), (1400, 480)), (0,0)) + game_surface.blit(map, (0, 0)) + # draw the player at the correct position + game_surface.blit(player, (playerX, playerY)) + elif level == 6: + #left,down,right,up + if battlemode: + playerX,playerY = def_borders(playerX,playerY,230,370,370,230) + pygame.draw.rect(game_surface, (0, 0, 0), pygame.Rect(225, 225, 166, 166)) + pygame.draw.rect(game_surface, (255, 255, 255), pygame.Rect(225, 225, 166, 166), 3) + draw_text("LV "+str(LV), "white", (200, 400), 34, space_width=4.5, letter_spacing=-0.6) + draw_text(str(hp)+"/"+str(maxhp), "white", (345, 400), 34, space_width=4.5, letter_spacing=-0.6) + + if floweytalking: + letters_shown += 1 + # safely play blip + index = min(int(letters_shown)-1, len(dialogue_text)-1) # cap at last character + if dialognum == 1: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "See that heart?\nThat is your SOUL,\nthe very culmination\nof your being!" + elif dialognum == 2: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "Your SOUL starts off\nweak, but can grow\nstrong if you gain\na lot of LV." + elif dialognum == 3: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "What's LV stand for?\nWhy, LOVE, of\ncourse!" + elif dialognum == 4: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "You want some LOVE,\ndon't you?" + elif dialognum == 5: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "Don't worry, I'll\nshare some with you!" + elif dialognum == 6: + floweygoofy = True + dialogue_text = "" + game_surface.blit(pygame.transform.scale(pygame.image.load('Flowey_goofy.png'), monstersize), (255, 85)) + #draw_dialogue_text(dialogue_text, "white", (40, 380), 24, letters_shown, surface=dialogue) + elif dialognum == 8: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "Down here, LOVE\nis shared\nthrough..." + elif dialognum == 9: + angle += 8 + #game_surface.blit(pygame.transform.rotate(pygame.Surface((1, 2), pygame.SRCALPHA).fill((255, 255, 255)) or pygame.Surface((1, 2), pygame.SRCALPHA), angle), (250, 40)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (250, 40)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (275, 30)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (300, 20)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (325, 30)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (350, 40)) + Flowey02 = pygame.transform.scale(pygame.image.load("Flowey02m.png"), monstersize) + Flowey01 = pygame.transform.scale(pygame.image.load("Flowey01m.png"), monstersize) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "Little white...\n\"friendliness\npellets.\"" + elif dialognum == 10: + angle += 8 + Flowey02 = pygame.transform.scale(pygame.image.load("Flowey02.png"), monstersize) + Flowey01 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 24)) + dialogue_text = "Are you ready?" + elif dialognum == 11: + angle += 8 + #rect_surf = pygame.Surface((10, 20), pygame.SRCALPHA) + #rect_surf.fill((255, 255, 255)) + pellety += 3 + pelletxr1 += 0.8 + pelletxr2 += 0.5 + pelletyr3 -= 0.5 + pelletyr4 -= 0.8 + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "Move around!\nGet as many as\nyou can!" + floweypellets = [ + (pelletxr1, pellety+50, 20, 10), + (pelletxr2, pellety+25, 20, 10), + (pelletx, pellety, 20, 10), + (pelletyr3, pellety+25, 20, 10), + (pelletyr4, pellety+50, 20, 10) + ] + if pellety > 800: + dialognum = 12 + letters_shown = 0 + elif dialognum == 12: + pelletx, pellety = 300, 30 + pelletxr1 = 200 + pelletxr2 = 250 + pelletyr3 = 350 + pelletyr4 = 400 + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweywinky.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweywinky.png"), monstersize) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "Hey buddy,\nyou missed them." + elif dialognum == 13: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "Let's try again,\nokay?" + elif dialognum == 14: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize), pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) + angle += 8 + #rect_surf = pygame.Surface((10, 20), pygame.SRCALPHA) + #rect_surf.fill((255, 255, 255)) + pellety += 3 + pelletxr1 += 1 + pelletxr2 += 0.7 + pelletyr3 -= 0.7 + pelletyr4 -= 1 + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + #pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "" + if 800 > pellety > 480: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize) + if pellety > 800: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize) + dialognum = 15 + letters_shown = 0 + elif dialognum == 15: + pelletx, pellety = 300, 30 + pelletxr1 = 200 + pelletxr2 = 250 + pelletyr3 = 350 + pelletyr4 = 400 + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "Is this a joke?\nAre you braindead?\nRUN. INTO. THE.\nBULLETS!!!" + elif dialognum == 16: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize), pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) + angle += 8 + #rect_surf = pygame.Surface((10, 20), pygame.SRCALPHA) + #rect_surf.fill((255, 255, 255)) + pellety += 3 + pelletxr1 += 1.1 + pelletxr2 += 0.75 + pelletyr3 -= 0.75 + pelletyr4 -= 1.1 + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + if pellety < 480: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "Is this a joke?\nAre you braindead?\nRUN. INTO. THE.\nfriendliness pellets" + elif 800 > pellety > 480: + dialogue_text = "" + if 800 > pellety: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed02.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed03.png"), monstersize) + dialognum = 17 + floweypissed = True + letters_shown = 0 + play_music("stop") + elif dialognum == 17: + if floweypissed: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "You know what's\ngoing on here,\ndon't you?" + + + + if 18 > dialognum > 10: + for bx, by, bw, bh in floweypellets: + if check_collision(playerX, playerY, pw, ph, bx, by, bw, bh): + hp = 1 + letters_shown = 0 + dialognum = 17 + floweypissed = False + break + + if floweygoofy: + game_surface.blit(pygame.transform.scale(pygame.image.load('Flowey_goofy.png'), monstersize), (255, 85)) + if customtimer < 175: + angle += 5 + game_surface.blit(pygame.transform.rotate(pygame.transform.scale(pygame.image.load("star.png"), (10, 10)), angle), (370, 100)) + else: + letters_shown = 0 + dialognum = 8 + floweygoofy = False + + + if dialognum < 16: + play_music("mus_flowey.ogg") + customtimer += 1 + if not floweygoofy: + if 20 > customtimer: + game_surface.blit(Flowey02, (255, 85)) + elif 20 < customtimer < 40: + game_surface.blit(Flowey01, (255, 85)) + elif customtimer > 40: + customtimer = 0 + game_surface.blit(Flowey02, (255, 85)) + else: + game_surface.blit(Flowey01, (255, 85)) + + game_surface.blit(player, (playerX, playerY)) + if dialognum < 17: + draw_dialogue_text(dialogue_text, "black", (400, 100), 20, letters_shown, game_surface, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0, debug=False, num=0) + else: + draw_dialogue_text(dialogue_text, "black", (400, 100), 20, letters_shown, game_surface, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0.25, debug=False, num=1) + + + if battlemodestart: + playeractive = True + playerX, playerY = BX, BY + playerX, playerY = 300, 300 + defaultborders = False + game_surface.blit(player, (playerX, playerY)) + customtimer += 1 + if 75 > customtimer > 33: + player = player_soul + elif customtimer > 75: + battlemodestart = False + battlemode = True + #print(str(dialognum)+" "+str(letters_shown)) + if level != 1: + clock.tick(75) + + + if escapping: + game_surface.blit(pygame.transform.scale(pygame.image.load("quitting.png"), (90, 20)), (0,0)) + print(str(escapecounter)) + escapecounter += 1 + if escapecounter > 15: + sys.exit() + x = (window_size[0] - new_size[0]) // 2 + y = (window_size[1] - new_size[1]) // 2 + if level != 3.75: + screen.fill((0, 0, 0)) # black borders + screen.blit(scaled_surface, (x, y)) + pygame.display.flip() + pygame.display.update() diff --git a/blip.mp3 b/blip.mp3 new file mode 100644 index 0000000..5c096b5 Binary files /dev/null and b/blip.mp3 differ diff --git a/determination.ttf b/determination.ttf new file mode 100644 index 0000000..36901fe Binary files /dev/null and b/determination.ttf differ diff --git a/dialogue.png b/dialogue.png new file mode 100644 index 0000000..21376f5 Binary files /dev/null and b/dialogue.png differ diff --git a/dialogue.png-autosave.kra b/dialogue.png-autosave.kra new file mode 100644 index 0000000..36b85eb Binary files /dev/null and b/dialogue.png-autosave.kra differ diff --git a/floweyroom.png b/floweyroom.png new file mode 100644 index 0000000..0459e99 Binary files /dev/null and b/floweyroom.png differ diff --git a/floweyroom.png-autosave.kra b/floweyroom.png-autosave.kra new file mode 100644 index 0000000..1c00790 Binary files /dev/null and b/floweyroom.png-autosave.kra differ diff --git a/floweyroom2.png b/floweyroom2.png new file mode 100644 index 0000000..4ef3c83 Binary files /dev/null and b/floweyroom2.png differ diff --git a/functions.py b/functions.py new file mode 100644 index 0000000..c7e58f1 --- /dev/null +++ b/functions.py @@ -0,0 +1,171 @@ +from assets import blip_variants, blip_channel, pygame, game_surface, random, dialogue_text, current_music +#all the variables + +def def_borders(x,y, b1, b2, b3, b4, ox, oy): + if x < b1: + x = ox + if y > b2: + y = oy + if x > b3: + x = ox + if y < b4: + y = oy + return x, y + +def play_letter_blip(num): + sound = blip_variants[num] + blip_channel.play(sound) + + +def play_music(filename, loop=-1): + """ + Switch music without blocking. + The old track fades out in the background while the new one starts instantly. + """ + global current_music + + if current_music == filename: + return # same track, do nothing + if filename == "stop": + pygame.mixer.music.stop() + current_music = None + if filename != "stop": + # Start new track immediately + pygame.mixer.music.load(filename) + pygame.mixer.music.play(loop) + current_music = filename + +def check_collision(x1, y1, w1, h1, x2, y2, w2, h2): + """ + Returns True if the two rectangles overlap. + Works like pygame.Rect.colliderect. + + x1, y1 = top-left of first rectangle + w1, h1 = width/height of first rectangle + x2, y2 = top-left of second rectangle + w2, h2 = width/height of second rectangle + """ + return (x1 < x2 + w2 and + x1 + w1 > x2 and + y1 < y2 + h2 and + y1 + h1 > y2) + +def draw_text(text, color, pos, fontsize, space_width=10, letter_spacing=0, line_spacing=5, shake_amount=0, select=False, xkeyboard=1, ykeyboard=1, surface=game_surface): + """ + Draws text to game_surface with: + - '\n' converted to new lines + - custom space width + - adjustable spacing between letters + - shaking effect + - optional selection highlight based on xkeyboard/ykeyboard + """ + # convert color names to RGB + colors = { + "black" : (0,0,0), + "white": (255,255,255), + "red": (255,0,0), + "green": (0,255,0), + "blue": (0,0,255), + "yellow": (255,255,0) + } + color = colors.get(color, (255,255,255)) + + font = pygame.font.Font("determination.ttf", fontsize) + x_start, y = pos + + row = 1 + for line in text.split("\n"): + x = x_start + col = 1 + for char in line: + if char == " ": + x += space_width + col += 1 + continue + + # if select mode is on, highlight the letter at (xkeyboard, ykeyboard) + if select and col == xkeyboard and row == ykeyboard: + char_color = colors.get("yellow") + else: + char_color = color + + char_surf = font.render(char, True, char_color) + + shake_x = random.uniform(-shake_amount, shake_amount) + shake_y = random.uniform(-shake_amount, shake_amount) + surface.blit(char_surf, (x + shake_x, y + shake_y)) + x += char_surf.get_width() + letter_spacing + col += 1 + y += font.get_linesize() + line_spacing + row += 1 + +def draw_dialogue_text( + text, + color, + pos, + fontsize, + letters_shown, + surface, + space_width=10, + letter_spacing=0, + line_spacing=5, + shake_amount=0, + debug=False, + num=0, + speed=0.5 +): + """ + Draw up to `letters_shown` characters of `text` onto `surface`. + pos is relative to the top-left of `surface`. + Returns how many characters were drawn (useful for debugging). + """ + colors = { + "black" : (0,0,0), + "white": (255,255,255), + "red": (255,0,0), + "green": (0,255,0), + "blue": (0,0,255), + "yellow": (255,255,0) + } + fg = colors.get(color, color if isinstance(color, tuple) else (255,255,255)) + letters_shown += speed + font = pygame.font.Font("determination.ttf", fontsize) + x_start, y = pos + + drawn = 0 + # iterate line-by-line so '\n' is respected + for line in text.split("\n"): + x = x_start + for ch in line: + if drawn >= letters_shown: + return drawn, letters_shown + if ch == " ": + x += space_width + drawn += 1 + continue + + ch_surf = font.render(ch, True, fg) + shake_x = random.uniform(-shake_amount, shake_amount) + shake_y = random.uniform(-shake_amount, shake_amount) + dest_x = x + shake_x + dest_y = y + shake_y + + surface.blit(ch_surf, (dest_x, dest_y)) + if letters_shown+1 < len(text):# only if this char is newly revealed + if ch not in " \n" and blip_channel and not blip_channel.get_busy(): + play_letter_blip(num) + if debug: + # draw a small rect showing the glyph area (visible overlay) + pygame.draw.rect(surface, (255,0,0), pygame.Rect(int(dest_x), int(dest_y), + ch_surf.get_width(), ch_surf.get_height()), 1) + + x += ch_surf.get_width() + letter_spacing + drawn += 1 + # move to next line. use font.get_linesize if available + try: + line_h = font.get_linesize() + except Exception: + line_h = fontsize + y += line_h + line_spacing + + return drawn \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..c5feded Binary files /dev/null and b/icon.png differ diff --git a/instructions.png b/instructions.png new file mode 100644 index 0000000..f64cbaa Binary files /dev/null and b/instructions.png differ diff --git a/instructions.png~ b/instructions.png~ new file mode 100644 index 0000000..8617f41 Binary files /dev/null and b/instructions.png~ differ diff --git a/instructions2.png b/instructions2.png new file mode 100644 index 0000000..7ebca0d Binary files /dev/null and b/instructions2.png differ diff --git a/instructions2.png~ b/instructions2.png~ new file mode 100644 index 0000000..7cae604 Binary files /dev/null and b/instructions2.png~ differ diff --git a/intro.mkv b/intro.mkv new file mode 100644 index 0000000..7096b92 Binary files /dev/null and b/intro.mkv differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..e2c0466 --- /dev/null +++ b/main.py @@ -0,0 +1,1116 @@ +# GENERAL MODULES + +from typing import Dict +import pygame, random, time, sys, math +from ffpyplayer.player import MediaPlayer +import numpy as np +from pygame import sndarray + +pygame.init() +pygame.mixer.pre_init(buffer=1500) +pygame.mixer.init() + +#GAME SPECIFIC MODULES + +from assets import * +from functions import * + +pygame.display.set_caption("UNDERTALE", icontitle="Inspired by Toby Fox <3") +pygame.display.set_icon(iconpng) +paused = False +running = True +while running == True: + #print(pygame.time.get_ticks()) + oldX, oldY = playerX, playerY + playerY += playerYc*3 + playerX += playerXc*3 + if not battlemode: + if playerYc > 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[0]: + player = player_sprites[1] + elif player == player_sprites[1]: + player = player_sprites[2] + else: + player = player_sprites[0] + startdelay = 0 + elif playerYc < 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[3]: + player = player_sprites[4] + elif player == player_sprites[4]: + player = player_sprites[5] + else: + player = player_sprites[3] + startdelay = 0 + elif playerXc > 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[6]: + player = player_sprites[7] + else: + player = player_sprites[6] + startdelay = 0 + elif playerXc < 0: + startdelay += 1 + if startdelay > animation_delay: + if player == player_sprites[8]: + player = player_sprites[9] + else: + player = player_sprites[8] + startdelay = 0 + window_size = screen.get_size() + scale = min(window_size[0] / (640,480)[0], window_size[1] / (640,480)[1]) + new_size = (int((640,480)[0] * scale), int((640,480)[1] * scale)) + scaled_surface = pygame.transform.scale(game_surface, new_size) + + for event in pygame.event.get(): + + if event.type == pygame.QUIT: + running = False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_z or event.key == pygame.K_RETURN: + if level == 1 or level == 1.5: + video.close_player() + level = 2 + elif level == 2: + if game_option == 1: + level = 3 + else: + level = 2.5 + game_option = 1 + elif level == 2.5: + if game_option == 1: + level = 2 + elif level == 3: + if len(playername) < 6: + if ykey == 1: + if xkey == 1: + playername += "A" + elif xkey == 3: + playername += "B" + elif xkey == 5: + playername += "C" + elif xkey == 7: + playername += "D" + elif xkey == 9: + playername += "E" + elif xkey == 11: + playername += "F" + elif xkey == 13: + playername += "G" + elif ykey == 2: + if xkey == 1: + playername += "H" + elif xkey == 3: + playername += "I" + elif xkey == 5: + playername += "J" + elif xkey == 7: + playername += "K" + elif xkey == 9: + playername += "L" + elif xkey == 11: + playername += "M" + elif xkey == 13: + playername += "N" + elif ykey == 3: + if xkey == 1: + playername += "O" + elif xkey == 3: + playername += "P" + elif xkey == 5: + playername += "Q" + elif xkey == 7: + playername += "R" + elif xkey == 9: + playername += "S" + elif xkey == 11: + playername += "T" + elif xkey == 13: + playername += "U" + elif ykey == 4: + if xkey == 1: + playername += "V" + elif xkey == 3: + playername += "W" + elif xkey == 5: + playername += "X" + elif xkey == 7: + playername += "Y" + elif xkey == 9: + playername += "Z" + if ykey == 5: + if xkey == 1: + playername += "a" + elif xkey == 3: + playername += "b" + elif xkey == 5: + playername += "c" + elif xkey == 7: + playername += "d" + elif xkey == 9: + playername += "e" + elif xkey == 11: + playername += "f" + elif xkey == 13: + playername += "g" + elif ykey == 6: + if xkey == 1: + playername += "h" + elif xkey == 3: + playername += "i" + elif xkey == 5: + playername += "j" + elif xkey == 7: + playername += "k" + elif xkey == 9: + playername += "l" + elif xkey == 11: + playername += "m" + elif xkey == 13: + playername += "n" + elif ykey == 7: + if xkey == 1: + playername += "o" + elif xkey == 3: + playername += "p" + elif xkey == 5: + playername += "q" + elif xkey == 7: + playername += "r" + elif xkey == 9: + playername += "s" + elif xkey == 11: + playername += "t" + elif xkey == 13: + playername += "u" + elif ykey == 8: + if xkey == 1: + playername += "v" + elif xkey == 3: + playername += "w" + elif xkey == 5: + playername += "x" + elif xkey == 7: + playername += "y" + elif xkey == 9: + playername += "z" + if ykey == 9: + if xkey == 5: + if playername != "": + playername = playername[:-1] + elif xkey == 9: + if playername != "": + level = 3.5 + xkey, ykey = 1, 1 + elif level == 3.5: + if GOBACKONLY: + GOBACKONLY, level = False, 3 + else: + if xkey == 1: + level = 3 + xkey, ykey = 9, 9 + elif xkey == 2: + level = 3.75 + elif level == 5: + if floweytalking: + if len(dialogue_text) > letters_shown: + letters_shown = len(dialogue_text) + else: + if dialognum < 8: + if not battlemode: + dialogue = pygame.transform.scale(pygame.image.load('dialogue.png'), (580,180)) + letters_shown = 0 + dialognum += 1 + elif level == 6: + if floweytalking: + if len(dialogue_text) > letters_shown: + letters_shown = len(dialogue_text) + else: + if dialognum < 20: + if not battlemode: + dialogue = pygame.transform.scale(pygame.image.load('dialogue.png'), (580,180)) + if dialognum == 7 or dialognum == 11 or dialognum == 14: + pass + elif dialognum == 19: + letters_shown = 0 + dialognum += 1 + speed = 0 + for i in range(num_pellets): + angle = (2 * math.pi / num_pellets) * i + x = target[0] + math.cos(angle) * radius + y = target[1] + math.sin(angle) * radius + pellets.append([x, y]) + + else: + if dialognum != 15: + letters_shown = 0 + dialognum += 1 + elif dialognum == 20: + letters_shown = 0 + dialognum = 21 + if event.key == pygame.K_F4: + if not fullscreen: + screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) + fullscreen = True + else: + screen = pygame.display.set_mode(displaysize) + fullscreen = False + + if event.key == pygame.K_ESCAPE: + escapping = True + + if event.key == pygame.K_SPACE: + print("playerX="+str(playerX)+", playerY="+str(playerY)+"\nmouse pos: "+str(pygame.mouse.get_pos())) + + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + #if randomblock not in player.colliderect(): + if not inmenu: + if playeractive: + playerXc = -1 + startdelay = animation_delay + else: + if selectormenu: + if level == 3: + if (xkey, ykey) != (1, 1): + xkey -= 1 + if xkey < 1 and ykey != 1 and ykey != 9: + xkey = 13 + ykey += -1 + if ykey < 8.5: + if xkey % 2 == 0: + xkey -= 1 + else: + if xkey == 8: + xkey = 5 + elif xkey == 4: + xkey = 1 + elif xkey == 0: + xkey = 9 + elif level == 3.5: + if not GOBACKONLY: + if xkey != 1: + xkey = 1 + else: + xkey = 2 + + else: + xkey -= 1 + print(str(xkey)) + + if event.key == pygame.K_RIGHT or event.key == pygame.K_d: + if not inmenu: + if playeractive: + playerXc = 1 + startdelay = animation_delay + else: + if selectormenu: + if level == 3: + if ykey < 8.5: + xkey += 1 + if xkey % 2 == 0: + xkey += 1 + else: + if xkey == 1: + xkey = 5 + elif xkey == 5: + xkey = 9 + elif xkey == 9: + xkey = 1 + elif level == 3.5: + if not GOBACKONLY: + if xkey != 2: + xkey = 2 + else: + xkey = 1 + + print(str(xkey)) + + if event.key == pygame.K_UP or event.key == pygame.K_w: + #print(game_option) + if not inmenu: + if playeractive: + playerYc = -1 + startdelay = animation_delay + else: + if selectormenu: + if ykey > 1: + ykey -= 1 + else: + if game_option > 1: + game_option -= 1 + print(str(ykey)) + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + #print(game_option) + if not inmenu: + if playeractive: + playerYc = 1 + startdelay = animation_delay + else: + if selectormenu: + ykey +=1 + if ykey > 8.5 and ykey != 10: + if xkey == 2 or xkey == 3 or xkey == 4: + xkey = 1 + elif xkey == 6 or xkey == 7 or xkey == 8 or xkey == 9: + xkey = 5 + else: + if xkey != 1 and xkey != 5 and xkey != 9: + xkey = 9 + else: + game_option += 1 + print(str(ykey)) + + + print("posx="+str(xkey)+" posy="+str(ykey)) + if event.type == pygame.KEYUP: + + if event.key == pygame.K_ESCAPE: + escapecounter = 0 + escapping = False + + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + if not battlemode: + player = player_sprites[8] + playerXc = 0 + + if event.key == pygame.K_RIGHT or event.key == pygame.K_d: + if not battlemode: + player = player_sprites[6] + playerXc = 0 + + if event.key == pygame.K_UP or event.key == pygame.K_w: + if not battlemode: + player = player_sprites[3] + playerYc = 0 + + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + if not battlemode: + player = player_sprites[0] + playerYc = 0 + + if defaultborders: + playerX, playerY = def_borders(playerX, playerY, 0, 420, 600, 0, oldX, oldY) + for bx, by, bw, bh in blocks: + if check_collision(playerX, playerY, pw, ph, bx, by, bw, bh): + playerX, playerY = oldX, oldY + break # stop checking after first collision + game_surface.fill((0, 0, 0)) + if level == 1: + inmenu = True + play_music("stop") + frame, val = video.get_frame() # get next frame (or None) + if frame is not None: + img, t = frame + last_surf = pygame.image.frombuffer(img.to_bytearray()[0], img.get_size(), 'RGB') + # always draw last frame, even if no new frame + clock.tick(30) + if last_surf: + game_surface.blit(last_surf, (0, 0)) + if val == 'eof': + level = 1.5 + elif level == 1.5: + game_surface.blit(last_surf, (0, 0)) + elif level == 2: + inmenu = True + play_music(start_menu_mus) + if game_option == 1: + game_surface.blit(pygame.transform.scale(pygame.image.load("instructions.png"), (640, 480)), (0,0)) + elif game_option == 2: + game_surface.blit(pygame.transform.scale(pygame.image.load("instructions2.png"), (640, 480)), (0,0)) + else: + game_surface.blit(pygame.transform.scale(pygame.image.load("instructions2.png"), (640, 480)), (0,0)) + game_option = 2 + elif level == 2.5: + play_music(start_menu_mus) + if game_option == 1: + game_surface.blit(pygame.transform.scale(pygame.image.load("settings1.png"), (640, 480)), (0,0)) + elif game_option == 2: + game_surface.blit(pygame.transform.scale(pygame.image.load("settings2.png"), (640, 480)), (0,0)) + else: + game_surface.blit(pygame.transform.scale(pygame.image.load("settings2.png"), (640, 480)), (0,0)) + game_option = 2 + elif level == 3: + play_music(start_menu_mus) + selectormenu = True + draw_text("Name the fallen human.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (275, 111), 32, letter_spacing=-0.6) + if playername.lower() == "gaster": + selectormenu = False + inmenu = False + level = 1 + video = MediaPlayer("intro.mkv") + playername = "" + if xkey > 13 and ykey < 9: + xkey = 1 + ykey += 1 + if ykey < 5: + if ykey == 4: + if xkey > 9: + xkey = 1 + ykey += 1 + draw_text("A B C D E F G\nH I J K L M N\nO P Q R S T U\nV W X Y Z", "white", (120, 150), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135, select=True, xkeyboard=xkey, ykeyboard=ykey) + draw_text("a b c d e f g\nh i j k l m n\no p q r s t u\nv w x y z", "white", (120, 276), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif 4 < ykey < 9: + if ykey == 8: + if xkey > 9: + xkey = 9 + draw_text("A B C D E F G\nH I J K L M N\nO P Q R S T U\nV W X Y Z", "white", (120, 150), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + draw_text("a b c d e f g\nh i j k l m n\no p q r s t u\nv w x y z", "white", (120, 276), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135, select=True, xkeyboard=xkey, ykeyboard=ykey-4) + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif ykey > 8: + draw_text("A B C D E F G\nH I J K L M N\nO P Q R S T U\nV W X Y Z", "white", (120, 150), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + draw_text("a b c d e f g\nh i j k l m n\no p q r s t u\nv w x y z", "white", (120, 276), 34, space_width=47, letter_spacing=0, line_spacing=-7, shake_amount=0.135) + if ykey > 9: + ykey = 1 + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + if xkey == 1: + draw_text("Quit", "yellow", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif xkey == 5: + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "yellow", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "white", (465, 405), 34, letter_spacing=-0.6) + elif xkey == 9: + draw_text("Quit", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Backspace", "white", (253, 405), 34, letter_spacing=-0.6) + draw_text("Done", "yellow", (465, 405), 34, letter_spacing=-0.6) + elif xkey < 1: + xkey = 9 + else: + xkey = 1 + else: + ykey = 9 + increasinglybig = 32 + elif level == 3.5: + play_music(start_menu_mus) + if GOBACKONLY: + draw_text("Go back", "yellow", (120, 405), 34, letter_spacing=-0.6) + if playername.lower() == "sans": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("nope.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "alphys": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("D-don't do that.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "asgore": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("You cannot.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "asriel": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("...","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "flowey": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("I already CHOSE\nthat name.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "toriel": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("I think you should\nthink of your own\nname, my child.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "undyne": + if increasinglybig < 107: + increasinglybig += 0.28 + GOBACKONLY = True + draw_text("Get your OWN name!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + else: + if xkey == 1: + draw_text("No", "yellow", (120, 405), 34, letter_spacing=-0.6) + draw_text("Yes", "white", (465, 405), 34, letter_spacing=-0.6) + elif xkey == 2: + draw_text("No", "white", (120, 405), 34, letter_spacing=-0.6) + draw_text("Yes", "yellow", (465, 405), 34, letter_spacing=-0.6) + if playername.lower() == "frisk": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("WARNING: This name will\nmake your life hell.\nProceed anyway?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + elif playername.lower() == "murder" or playername.lower() == "mercy ": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("That's a little on-\nthe-nose, isn't it...?" ,"white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "aaaaaa": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Not very creative...?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "aaron": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Is this name correct? ;)","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "alphy": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Uh.... OK?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "catty": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Bratty! Bratty!\nThat's MY name!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "bratty": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Like, OK I guess.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "bpants": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("You are really scraping the\nbottom of the barrel.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "chara": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("the true name.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "gerson": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Wah ha ha! Why not?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "jerry": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Jerry.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "metta" or playername.lower() == "mett" or playername.lower() == "mtt": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("OOOOH!!! ARE YOU\nPROMOTING MY BRAND?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "napsta" or playername.lower() == "blooky": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("........\n(They are powerless to\nstop you.)","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "papyru": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("I'LL ALLOW IT!!!!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "shyren": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("...?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "temmie": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("hOI!","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + elif playername.lower() == "woshua": + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Clean name.","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + else: + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text("Is this name correct?","white", (170, 60), 32, space_width=4.5, letter_spacing=-0.6) + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + + + + #game_surface.blit(pygame.font.Font("determination.ttf", 32).render("Name the fallen human.", True, (255, 255, 255)), (181, 70)) + elif level == 3.75: + play_music("mus_cymbal.ogg") + game_surface.fill((goingblack, goingblack, goingblack)) # black borders + if increasinglybig < 107: + increasinglybig += 0.28 + draw_text(playername, "white", (float(275-increasinglybig*1.5/2+random.uniform(-0.8, 0.8)), float(111+increasinglybig*1.2+random.uniform(-1.5, 1.5))), int(increasinglybig), letter_spacing=-0.6) + if goingblack < 255: + goingblack += 0.65 + else: + inmenu, selectormenu, playeractive = False, False, True + map = pygame.Surface((1400, 480)) + map.blit(pygame.transform.scale(pygame.image.load("startingroom.png"), (1400, 480)), (0,0)) + defaultborders = False + level = 4 + playerX, playerY = 285, 205 + player = player_sprites[0] + play_music("stop") + elif level == 4: + camera_x = playerX - 640 // 2 + if camera_x < 0: + camera_x = 0 + elif camera_x > 1400 - 640: + camera_x = 1400 - 640 + # draw the visible slice of the map + game_surface.blit(map, (0, 0), (camera_x, 0, 640, 480)) + # draw the player at the correct position + player_screen_x = playerX - camera_x + game_surface.blit(player, (player_screen_x, playerY)) + if playerX > 1205 and playerY < 250: + blocks.clear() + player = player_sprites[3] + map = pygame.Surface((640, 480)) + customtimer = 0 + print("Before reset:", playerX, playerY) + playerX, playerY = 300, 405 + print("After reset:", playerX, playerY) + level = 5 + else: + playerX, playerY = def_borders(playerX, playerY,40,382,1315,45, oldX, oldY) + elif level == 5: + playerX, playerY = def_borders(playerX, playerY, 231, 420, 360, 0, oldX, oldY) + + # draw the visible slice of the map + #print(customtimer) + if floweytalking: + playeractive = False + play_music("mus_flowey.ogg") + customtimer += 1 + if 20 > customtimer: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom2.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey02, (30,30)) + elif 20 < customtimer < 40: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey01, (30,30)) + elif customtimer > 40: + customtimer = 0 + map.blit(pygame.transform.scale(pygame.image.load("floweyroom2.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey02, (30,30)) + else: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom.png"), (640, 480)), (0,0)) + dialogue.blit(Flowey01, (30,30)) + + + letters_shown += 1 + # safely play blip + index = min(int(letters_shown)-1, len(dialogue_text)-1) # cap at last character + #if int(letters_shown) > 0 and dialogue_text[index] not in " \n": + # if letters_shown+1 < len(dialogue_text): + # generate_blip(frequency=random.randint(600,605), duration_ms=60, volume=0.4).play() + + print(letters_shown) + if dialognum < 7: + game_surface.blit(map, (0, 0)) + game_surface.blit(dialogue, (25,0)) + draw_dialogue_text(dialogue_text, "white", (150, 30), 36, letters_shown, dialogue, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0, debug=False, num=0) + # draw the player at the correct position + game_surface.blit(player_sprites[3], (playerX, playerY)) + if dialognum == 1: + dialogue_text = "* Howdy!\n* I'm FLOWEY.\n* FLOWEY the FLOWER!" + #draw_dialogue_text(dialogue_text, "white", (40, 380), 24, letters_shown, surface=dialogue) + elif dialognum == 2: + dialogue_text = "* Hmmm..." + elif dialognum == 3: + dialogue_text = "* You're new to the\nUNDERGROUND, aren'tcha?" + elif dialognum == 4: + dialogue_text = "* Golly, you must be\nso confused." + elif dialognum == 5: + dialogue_text = "* Someone ought to teach\nyou how things work\naround here!" + elif dialognum == 6: + dialogue_text = "* Ready? Here we go!" + else: + battlemodestart = True + level = 6 + customtimer = 0 + dialognum = 1 + pygame.mixer.Sound("encounter.ogg").play() + + + elif not floweytalking: + map.blit(pygame.transform.scale(pygame.image.load("floweyroom.png"), (640, 480)), (0,0)) + if playerY < 301: + dialognum = 1 + floweytalking = True + playeractive = False + playerYc, playerXc = 0, 0 + elif playerY > 408: + defaultborders = False + level = 4 + playerX, playerY = 1257, 260 + camera_x = playerX - 640 // 2 + if camera_x < 0: + camera_x = 0 + elif camera_x > 1400 - 640: + camera_x = 1400 - 640 + blocks = [ + (0, 312, 75, 200), + (0, 355, 120, 200), + (0, 398, 165, 200), + (0, 0, 120, 88), + (480, 0, 165, 88), + (550, 0, 1000, 245), + (478, 360, 1000, 100), + (440, 400, 100, 100) + #(x, y, w, h) + #(420, 400, 100, 100) + ] + player = player_sprites[0] + inmenu, selectormenu, playeractive = False, False, True + map = pygame.Surface((1400, 480)) + map.blit(pygame.transform.scale(pygame.image.load("startingroom.png"), (1400, 480)), (0,0)) + game_surface.blit(map, (0, 0)) + # draw the player at the correct position + game_surface.blit(player, (playerX, playerY)) + elif level == 6: + #left,down,right,up + if battlemode: + playerX,playerY = def_borders(playerX,playerY,230,370,370,230, oldX, oldY) + pygame.draw.rect(game_surface, (0, 0, 0), pygame.Rect(225, 225, 166, 166)) + pygame.draw.rect(game_surface, (255, 255, 255), pygame.Rect(225, 225, 166, 166), 3) + draw_text("LV "+str(LV), "white", (200, 400), 34, space_width=4.5, letter_spacing=-0.6) + draw_text(str(hp)+"/"+str(maxhp), "white", (345, 400), 34, space_width=4.5, letter_spacing=-0.6) + + if floweytalking: + letters_shown += 0.5 + # safely play blip + index = min(int(letters_shown)-1, len(dialogue_text)-1) # cap at last character + + if not floweygoofy: + if 20 > customtimer: + game_surface.blit(Flowey02, (255, 85)) + elif 20 < customtimer < 40: + game_surface.blit(Flowey01, (255, 85)) + elif customtimer > 40: + customtimer = 0 + game_surface.blit(Flowey02, (255, 85)) + else: + game_surface.blit(Flowey01, (255, 85)) + + if dialognum == 1: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "See that heart?\nThat is your SOUL,\nthe very culmination\nof your being!" + elif dialognum == 2: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "Your SOUL starts off\nweak, but can grow\nstrong if you gain\na lot of LV." + elif dialognum == 3: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "What's LV stand for?\nWhy, LOVE, of\ncourse!" + elif dialognum == 4: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "You want some LOVE,\ndon't you?" + elif dialognum == 5: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "Don't worry, I'll\nshare some with you!" + elif dialognum == 6: + floweygoofy = True + dialogue_text = "" + game_surface.blit(pygame.transform.scale(pygame.image.load('Flowey_goofy.png'), monstersize), (255, 85)) + #draw_dialogue_text(dialogue_text, "white", (40, 380), 24, letters_shown, surface=dialogue) + elif dialognum == 8: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "Down here, LOVE\nis shared\nthrough..." + elif dialognum == 9: + angle += 8 + #game_surface.blit(pygame.transform.rotate(pygame.Surface((1, 2), pygame.SRCALPHA).fill((255, 255, 255)) or pygame.Surface((1, 2), pygame.SRCALPHA), angle), (250, 40)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (250, 40)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (275, 30)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (300, 20)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (325, 30)) + #game_surface.blit(pygame.transform.rotate(pygame.Surface((10, 20)).fill((255, 255, 255)), angle), (350, 40)) + Flowey02 = pygame.transform.scale(pygame.image.load("Flowey02m.png"), monstersize) + Flowey01 = pygame.transform.scale(pygame.image.load("Flowey01m.png"), monstersize) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "Little white...\n\"friendliness\npellets.\"" + elif dialognum == 10: + angle += 8 + Flowey02 = pygame.transform.scale(pygame.image.load("Flowey02.png"), monstersize) + Flowey01 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 24)) + dialogue_text = "Are you ready?" + elif dialognum == 11: + angle += 8 + #rect_surf = pygame.Surface((10, 20), pygame.SRCALPHA) + #rect_surf.fill((255, 255, 255)) + pellety += 3 + pelletxr1 += 0.8 + pelletxr2 += 0.5 + pelletyr3 -= 0.5 + pelletyr4 -= 0.8 + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "Move around!\nGet as many as\nyou can!" + floweypellets = [ + (pelletxr1, pellety+50, 20, 10), + (pelletxr2, pellety+25, 20, 10), + (pelletx, pellety, 20, 10), + (pelletyr3, pellety+25, 20, 10), + (pelletyr4, pellety+50, 20, 10) + ] + if pellety > 800: + dialognum = 12 + letters_shown = 0 + elif dialognum == 12: + pelletx, pellety = 300, 30 + pelletxr1 = 200 + pelletxr2 = 250 + pelletyr3 = 350 + pelletyr4 = 400 + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweywinky.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweywinky.png"), monstersize) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "Hey buddy,\nyou missed them." + elif dialognum == 13: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "Let's try again,\nokay?" + elif dialognum == 14: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize), pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) + angle += 8 + #rect_surf = pygame.Surface((10, 20), pygame.SRCALPHA) + #rect_surf.fill((255, 255, 255)) + pellety += 3 + pelletxr1 += 1 + pelletxr2 += 0.7 + pelletyr3 -= 0.7 + pelletyr4 -= 1 + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + #pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "" + if 800 > pellety > 480: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize) + if pellety > 800: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize) + dialognum = 15 + letters_shown = 0 + elif dialognum == 15: + pelletx, pellety = 300, 30 + pelletxr1 = 200 + pelletxr2 = 250 + pelletyr3 = 350 + pelletyr4 = 400 + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed01.png"), monstersize) + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "Is this a joke?\nAre you braindead?\nRUN. INTO. THE.\nBULLETS!!!" + elif dialognum == 16: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize), pygame.transform.scale(pygame.image.load("Flowey01.png"), monstersize) + angle += 8 + #rect_surf = pygame.Surface((10, 20), pygame.SRCALPHA) + #rect_surf.fill((255, 255, 255)) + pellety += 3 + pelletxr1 += 1.1 + pelletxr2 += 0.75 + pelletyr3 -= 0.75 + pelletyr4 -= 1.1 + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr1, pellety+50)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletxr2, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletx, pellety)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr3, pellety+25)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pelletyr4, pellety+50)) + if pellety < 480: + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 100)) + dialogue_text = "Is this a joke?\nAre you braindead?\nRUN. INTO. THE.\nfriendliness pellets" + elif 800 > pellety > 480: + dialogue_text = "" + elif 800 < pellety: + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed02.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed03.png"), monstersize) + dialognum = 17 + floweypissed = True + letters_shown = 0 + play_music("stop") + elif dialognum == 17: + if floweypissed: + letters_shown -= 0.2 + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "You know what's\ngoing on here,\ndon't you?" + else: + letters_shown -= 0.2 + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 24)) + dialogue_text = "You idiot." + elif dialognum == 18: + if floweypissed: + letters_shown -= 0.2 + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 48)) + dialogue_text = "You just wanted to\nsee me suffer." + else: + letters_shown -= 0.2 + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 72)) + dialogue_text = "In this world,\nit's kill or\nBE killed." + elif dialognum == 19: + if floweypissed: + dialognum = 20 + else: + letters_shown -= 0.2 + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 96)) + dialogue_text = "Why would ANYONE\npass up an\nopportunity like\nthis!?" + elif dialognum == 20: + dialogue_text = "" + # spawn pellets in a circle + # draw pellet + speed = 0 + angle += 8 + for pellet in pellets: + dx = target[0] - pellet[0] + dy = target[1] - pellet[1] + dist = math.hypot(dx, dy) + if dist > speed: # still moving + pellet[0] += dx / dist * speed + pellet[1] += dy / dist * speed + + # draw pellet + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pellet[0], pellet[1])) + + + elif dialognum == 21: + letters_shown -= 0.3 + pygame.draw.rect(game_surface, (255, 255, 255), (400, 100, 200, 24)) + dialogue_text = "Die." + # update loop + speed = 0.2 + angle += 8 + for pellet in pellets: + dx = target[0] - pellet[0] + dy = target[1] - pellet[1] + dist = math.hypot(dx, dy) + if dist > speed: # still moving + pellet[0] += dx / dist * speed + pellet[1] += dy / dist * speed + + # draw pellet + floweypellets.append((pellet[0],pellet[1], 1, 1)) + game_surface.blit(pygame.transform.rotate(rect_surf, angle), (pellet[0], pellet[1])) + + + + + if 18 > dialognum > 10: + for bx, by, bw, bh in floweypellets: + if check_collision(playerX, playerY, pw, ph, bx, by, bw, bh): + hp = 1 + letters_shown = 0 + dialognum = 17 + floweypissed = False + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed02.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed03.png"), monstersize) + letters_shown = 0 + play_music("stop") + floweypellets.clear() + break + if dialognum > 20: + for bx, by, bw, bh in floweypellets: + if check_collision(playerX, playerY, pw, ph, bx, by, bw, bh): + hp = 20 + letters_shown = 0 + dialognum = 22 + floweypissed = False + Flowey01, Flowey02 = pygame.transform.scale(pygame.image.load("Floweypissed02.png"), monstersize), pygame.transform.scale(pygame.image.load("Floweypissed03.png"), monstersize) + letters_shown = 0 + play_music("stop") + floweypellets.clear() + break + + if floweygoofy: + game_surface.blit(pygame.transform.scale(pygame.image.load('Flowey_goofy.png'), monstersize), (255, 85)) + if customtimer < 175: + angle += 5 + game_surface.blit(pygame.transform.rotate(pygame.transform.scale(pygame.image.load("star.png"), (10, 10)), angle), (370, 100)) + else: + letters_shown = 0 + dialognum = 8 + floweygoofy = False + + + if dialognum < 16: + play_music("mus_flowey.ogg") + customtimer += 1 + + + game_surface.blit(player, (playerX, playerY)) + if dialognum < 17: + draw_dialogue_text(dialogue_text, "black", (400, 100), 20, letters_shown, game_surface, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0, debug=False, num=0, speed=0.5) + else: + draw_dialogue_text(dialogue_text, "black", (400, 100), 20, letters_shown, game_surface, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0.25, debug=False, num=1,speed=0.2) + + + if battlemodestart: + playeractive = True + playerX, playerY = BX, BY + playerX, playerY = 300, 300 + defaultborders = False + game_surface.blit(player, (playerX, playerY)) + customtimer += 1 + if 75 > customtimer > 33: + player = player_soul + elif customtimer > 75: + battlemodestart = False + battlemode = True + print(clock.get_time()) + #print(str(dialognum)+" "+str(letters_shown)) + #if level != 1: + # clock.tick(60) + + + if escapping: + game_surface.blit(pygame.transform.scale(pygame.image.load("quitting.png"), (90, 20)), (0,0)) + print(str(escapecounter)) + escapecounter += 1 + if escapecounter > 15: + sys.exit() + x = (window_size[0] - new_size[0]) // 2 + y = (window_size[1] - new_size[1]) // 2 + if level != 3.75: + screen.fill((0, 0, 0)) # black borders + screen.blit(scaled_surface, (x, y)) + pygame.display.flip() + pygame.display.update() diff --git a/old_main.py b/old_main.py new file mode 100644 index 0000000..1fa966f --- /dev/null +++ b/old_main.py @@ -0,0 +1,95 @@ +from typing import Dict +import pygame, random +#import pygame.mixer +pygame.init() +#all the variables +displaysize, playersize = (1000,750), (100,100) +level = 1 +defaultborders = True +playerX, playerY = 250, 250 +oldX, oldY = playerX, playerY +playerXc, playerYc = 0, 0 +randomblock = pygame.Surface((100, 100)) +randomblock.fill((0, 0, 255)) +blocks = [ #(x, y, w, h) + (420, 400, 100, 100) +] +#all the pygame setups and shit +screen = pygame.display.set_mode(displaysize) +player = pygame.image.load('player.png') +player = pygame.transform.scale(player, playersize) +player_rect = player.get_rect() +#defines borders +def def_borders(x,y, b1, b2, b3, b4): + if x < b1: + x = 1 + elif y > b2: + y = 649 + if x > b3: + x = 899 + elif y < b4: + y = 1 + return x, y + +def check_collision(x1, y1, w1, h1, x2, y2, w2, h2): + """ + Returns True if the two rectangles overlap. + Works like pygame.Rect.colliderect. + + x1, y1 = top-left of first rectangle + w1, h1 = width/height of first rectangle + x2, y2 = top-left of second rectangle + w2, h2 = width/height of second rectangle + """ + return (x1 < x2 + w2 and + x1 + w1 > x2 and + y1 < y2 + h2 and + y1 + h1 > y2) + +pygame.display.set_caption("UNDERTALE", icontitle="Inspired by Toby Fox <3") +pygame.display.set_icon("icon.png") +paused = False +running = True +while running == True: + oldX, oldY = playerX, playerY + screen.fill((0, 0, 0)) + playerY += playerYc + playerX += playerXc + for event in pygame.event.get(): + if event.type == pygame.QUIT: + running = False + if event.type == pygame.KEYDOWN: + if event.key == pygame.K_ESCAPE: + pygame.quit() + if event.key == pygame.K_SPACE: + print("playerX="+str(playerX)+", playerY="+str(playerY)) + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + #if randomblock not in player.colliderect(): + playerXc = -1 + if event.key == pygame.K_RIGHT or event.key == pygame.K_d: + playerXc = 1 + if event.key == pygame.K_UP or event.key == pygame.K_w: + playerYc = -1 + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + playerYc = 1 + if event.type == pygame.KEYUP: + if event.key == pygame.K_LEFT or event.key == pygame.K_a: + playerXc = 0 + if event.key == pygame.K_RIGHT or event.key == pygame.K_d: + playerXc = 0 + if event.key == pygame.K_UP or event.key == pygame.K_w: + playerYc = 0 + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + playerYc = 0 + if defaultborders: + playerX, playerY = def_borders(playerX, playerY, 0, 650, 900, 0) + for bx, by, bw, bh in blocks: + if check_collision(playerX, playerY, 100, 100, bx, by, bw, bh): + playerX, playerY = oldX, oldY + break # stop checking after first collision + + screen.blit(randomblock, (420, 400)) + screen.blit(player, (playerX, playerY)) + #print() + clock = pygame.time.Clock() + pygame.display.update() diff --git a/pellet.png b/pellet.png new file mode 100644 index 0000000..5ea80f6 Binary files /dev/null and b/pellet.png differ diff --git a/player.png b/player.png new file mode 100644 index 0000000..9cf771c Binary files /dev/null and b/player.png differ diff --git a/playerb1.png b/playerb1.png new file mode 100644 index 0000000..e5744e7 Binary files /dev/null and b/playerb1.png differ diff --git a/playerb1.png-autosave.kra b/playerb1.png-autosave.kra new file mode 100644 index 0000000..62ff6a3 Binary files /dev/null and b/playerb1.png-autosave.kra differ diff --git a/playerb2.png b/playerb2.png new file mode 100644 index 0000000..b580581 Binary files /dev/null and b/playerb2.png differ diff --git a/playerb2.png-autosave.kra b/playerb2.png-autosave.kra new file mode 100644 index 0000000..8243677 Binary files /dev/null and b/playerb2.png-autosave.kra differ diff --git a/playerb3.png b/playerb3.png new file mode 100644 index 0000000..87554a9 Binary files /dev/null and b/playerb3.png differ diff --git a/playerl1.png b/playerl1.png new file mode 100644 index 0000000..bbd1e57 Binary files /dev/null and b/playerl1.png differ diff --git a/playerl2.png b/playerl2.png new file mode 100644 index 0000000..d129d61 Binary files /dev/null and b/playerl2.png differ diff --git a/playerr1.png b/playerr1.png new file mode 100644 index 0000000..6265cff Binary files /dev/null and b/playerr1.png differ diff --git a/playerr2.png b/playerr2.png new file mode 100644 index 0000000..dd02d9f Binary files /dev/null and b/playerr2.png differ diff --git a/playerr2.png-autosave.kra b/playerr2.png-autosave.kra new file mode 100644 index 0000000..7db24a7 Binary files /dev/null and b/playerr2.png-autosave.kra differ diff --git a/players1.png b/players1.png new file mode 100644 index 0000000..db46a02 Binary files /dev/null and b/players1.png differ diff --git a/players1.png-autosave.kra b/players1.png-autosave.kra new file mode 100644 index 0000000..a8c0ff7 Binary files /dev/null and b/players1.png-autosave.kra differ diff --git a/players2.png b/players2.png new file mode 100644 index 0000000..fd8f448 Binary files /dev/null and b/players2.png differ diff --git a/players2.png-autosave.kra b/players2.png-autosave.kra new file mode 100644 index 0000000..cf2daf5 Binary files /dev/null and b/players2.png-autosave.kra differ diff --git a/players3.png b/players3.png new file mode 100644 index 0000000..e3ced55 Binary files /dev/null and b/players3.png differ diff --git a/quitting.png b/quitting.png new file mode 100644 index 0000000..e017d6e Binary files /dev/null and b/quitting.png differ diff --git a/scaryblip.wav b/scaryblip.wav new file mode 100644 index 0000000..726c38a Binary files /dev/null and b/scaryblip.wav differ diff --git a/settings1.png b/settings1.png new file mode 100644 index 0000000..c6bce24 Binary files /dev/null and b/settings1.png differ diff --git a/settings2.png b/settings2.png new file mode 100644 index 0000000..a8abb9c Binary files /dev/null and b/settings2.png differ diff --git a/soul.png b/soul.png new file mode 100644 index 0000000..1b53a23 Binary files /dev/null and b/soul.png differ diff --git a/splash.png b/splash.png new file mode 100644 index 0000000..2f1b03f Binary files /dev/null and b/splash.png differ diff --git a/star.png b/star.png new file mode 100644 index 0000000..80a664b Binary files /dev/null and b/star.png differ diff --git a/startingroom.png b/startingroom.png new file mode 100644 index 0000000..eaf9cfe Binary files /dev/null and b/startingroom.png differ diff --git a/template.py b/template.py new file mode 100644 index 0000000..06d7405 Binary files /dev/null and b/template.py differ diff --git a/test.py b/test.py new file mode 100644 index 0000000..b71b03a --- /dev/null +++ b/test.py @@ -0,0 +1,117 @@ +import random +import pygame + +def draw_dialogue_text( + text, + color, + pos, + fontsize, + letters_shown, + surface, + space_width=10, + letter_spacing=0, + line_spacing=5, + shake_amount=0, + debug=False +): + """ + Draw up to `letters_shown` characters of `text` onto `surface`. + pos is relative to the top-left of `surface`. + Returns how many characters were drawn (useful for debugging). + """ + colors = { + "white": (255,255,255), + "red": (255,0,0), + "green": (0,255,0), + "blue": (0,0,255), + "yellow": (255,255,0) + } + fg = colors.get(color, color if isinstance(color, tuple) else (255,255,255)) + + font = pygame.font.Font("determination.ttf", fontsize) + x_start, y = pos + + drawn = 0 + # iterate line-by-line so '\n' is respected + for line in text.split("\n"): + x = x_start + for ch in line: + if drawn >= letters_shown: + return drawn + if ch == " ": + x += space_width + drawn += 1 + continue + + ch_surf = font.render(ch, True, fg) + shake_x = random.uniform(-shake_amount, shake_amount) + shake_y = random.uniform(-shake_amount, shake_amount) + dest_x = x + shake_x + dest_y = y + shake_y + + surface.blit(ch_surf, (dest_x, dest_y)) + + if debug: + # draw a small rect showing the glyph area (visible overlay) + pygame.draw.rect(surface, (255,0,0), pygame.Rect(int(dest_x), int(dest_y), + ch_surf.get_width(), ch_surf.get_height()), 1) + + x += ch_surf.get_width() + letter_spacing + drawn += 1 + # move to next line. use font.get_linesize if available + try: + line_h = font.get_linesize() + except Exception: + line_h = fontsize + y += line_h + line_spacing + + return drawn +import pygame, sys, time +from pygame.locals import * +pygame.init() + +# paste the draw_dialogue_text() function here (or import it) + +SCREEN = pygame.display.set_mode((640, 480)) +clock = pygame.time.Clock() + +# create dialogue surface (width x height) and a semi-transparent background +dialogue = pygame.Surface((590, 120), pygame.SRCALPHA) +dialogue.fill((0,0,0,180)) + +dialogue_text = "* Howdy!\n* I'm FLOWEY.\n* FLOWEY the FLOWER!" +letters_shown = 0 +last_tick = pygame.time.get_ticks() +delay_ms = 40 # reveal speed (ms per character) + +running = True +while running: + for ev in pygame.event.get(): + if ev.type == QUIT: + running = False + if ev.type == KEYDOWN and ev.key == K_ESCAPE: + running = False + + # increment letters_shown on a timer + now = pygame.time.get_ticks() + if now - last_tick >= delay_ms: + letters_shown += 1 + last_tick = now + + # clear and draw + dialogue.fill((0,0,0,180)) + # draw flowey sprite placeholder (comment/remove if you have actual image) + # pygame.draw.circle(dialogue, (0,255,0), (30,30), 20) + + # draw the text onto the dialogue surface (pos inside dialogue) + draw_dialogue_text(dialogue_text, "white", (40, 10), 24, letters_shown, dialogue, + space_width=10, letter_spacing=-1, line_spacing=2, shake_amount=0.5, debug=True) + + # blit to main screen at a visible place + SCREEN.fill((30,30,30)) + SCREEN.blit(dialogue, (25, 340)) # same placement you used + pygame.display.flip() + clock.tick(60) + +pygame.quit() +sys.exit()