commit c47501d9bfefd033c6486e1607212e805317d190 Author: Arzumify Date: Fri Jul 19 01:26:40 2024 +0100 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4709183 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Godot 4+ specific ignores +.godot/ diff --git a/CREDITS.md b/CREDITS.md new file mode 100644 index 0000000..dd79543 --- /dev/null +++ b/CREDITS.md @@ -0,0 +1,16 @@ +# CREDITS + +Created by Arzumify + +Depicts Shounic as character + +Image of VALVe HQ By Tim Eulitz - Own work, CC BY 4.0, [View on wikimedia](https://commons.wikimedia.org/w/index.php?curid=46976775) + +Image of shounic by... shounic, used with explicit permission + +All other images are in the public domain + + +This game is dedicated to a friend who sadly passed away due to cancer. Support this game by donating to your local cancer research charity! + +💛 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..496acdb --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,675 @@ +# 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..75520b7 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Shounic dating simulator + +Cute game about getting stabbed by everyone's favourite YouTuber + +## Designation + +💛 This game is dedicated for a private friend who passed away recently from cancer... +Support this game and my work by donating to your local cancer research charity! + diff --git a/addons/wakatime/.gitignore b/addons/wakatime/.gitignore new file mode 100644 index 0000000..6edb29d --- /dev/null +++ b/addons/wakatime/.gitignore @@ -0,0 +1 @@ +settings.cfg \ No newline at end of file diff --git a/addons/wakatime/api_key_prompt.tscn b/addons/wakatime/api_key_prompt.tscn new file mode 100644 index 0000000..4703679 --- /dev/null +++ b/addons/wakatime/api_key_prompt.tscn @@ -0,0 +1,47 @@ +[gd_scene format=3 uid="uid://dbavhjsqdffsd"] + +[node name="api_key_modal" type="PopupPanel"] +size = Vector2i(321, 100) +visible = true + +[node name="vbox_container" type="VBoxContainer" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -4.0 +offset_bottom = -4.0 +theme_override_constants/separation = 25 +alignment = 1 + +[node name="hbox_container_top" type="HBoxContainer" parent="vbox_container"] +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_override_constants/separation = 5 +alignment = 1 + +[node name="line_edit" type="LineEdit" parent="vbox_container/hbox_container_top"] +custom_minimum_size = Vector2(200, 25) +layout_mode = 2 +size_flags_horizontal = 3 +placeholder_text = "Enter your Wakatime API Key" +max_length = 43 +secret = true +expand_to_text_length = true + +[node name="show_btn" type="Button" parent="vbox_container/hbox_container_top"] +custom_minimum_size = Vector2(60, 25) +layout_mode = 2 +text = "Show" + +[node name="hbox_container_bottom" type="HBoxContainer" parent="vbox_container"] +custom_minimum_size = Vector2(0, 25) +layout_mode = 2 +theme_override_constants/separation = 25 +alignment = 1 + +[node name="save_btn" type="Button" parent="vbox_container/hbox_container_bottom"] +custom_minimum_size = Vector2(125, 0) +layout_mode = 2 +text = "Ok" diff --git a/addons/wakatime/heartbeat.gd b/addons/wakatime/heartbeat.gd new file mode 100644 index 0000000..8f2b828 --- /dev/null +++ b/addons/wakatime/heartbeat.gd @@ -0,0 +1,10 @@ +const FILE_MODIFIED_DELAY = 120 + +var filepath +var timestamp +var is_write + +func _init(filepath = '', timestamp = 0, is_write = false): + self.filepath = filepath + self.timestamp = timestamp + self.is_write = is_write diff --git a/addons/wakatime/plugin.cfg b/addons/wakatime/plugin.cfg new file mode 100644 index 0000000..89dead6 --- /dev/null +++ b/addons/wakatime/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="godot-wakatime" +description="Godot plugin for metrics, insights, and time tracking automatically generated from your Godot usage." +author="Thomaz Soares" +version="1.5.0" +script="wakatime.gd" diff --git a/addons/wakatime/wakatime.gd b/addons/wakatime/wakatime.gd new file mode 100644 index 0000000..cac374f --- /dev/null +++ b/addons/wakatime/wakatime.gd @@ -0,0 +1,432 @@ +@tool +extends EditorPlugin + +const HeartBeat = preload('res://addons/wakatime/heartbeat.gd') + +const PLUGIN_PATH = 'res://addons/wakatime' +const WAKATIME_ZIP_FILEPATH = '%s/wakatime.zip' % PLUGIN_PATH + +const WAKATIME_URL_FMT = 'https://github.com/wakatime/wakatime-cli/releases/download/v1.54.0/{wakatime_build}.zip' +const DECOMPRESSOR_URL_FMT = 'https://github.com/ouch-org/ouch/releases/download/0.3.1/{ouch_build}' + +const API_KEY_MENU_ITEM_NAME = 'Wakatime API Key' +const CONFIG_MENU_ITEM_NAME = 'Wakatime Config File' + +var last_heartbeat = HeartBeat.new() + +var wakatime_dir = null +var wakatime_cli = null +var decompressor_cli = null + +const ApiKeyPrompt = preload('res://addons/wakatime/api_key_prompt.tscn') + +var is_windows = OS.has_feature('windows') or OS.has_feature('uwp') +var is_linux = OS.has_feature('linux') +var is_macos = OS.has_feature('macos') +var is_amd64 = OS.has_feature('x86_64') +var is_arm64 = OS.has_feature('arm64') + +var debug = false + + +func get_wakatime_build(): + # Default system = Linux + var platform = 'linux' + if is_windows: + platform = 'windows' + elif is_macos: + platform = 'darwin' + + # Default architecture = x86_64 (amd64) + var architecture = 'amd64' + if is_amd64: + architecture = 'amd64' + elif is_arm64: + architecture = 'arm64' + + return 'wakatime-cli-%s-%s' % [platform, architecture] + +func get_ouch_build(): + # Default system = Linux + var platform = 'linux-musl' + if is_windows: + platform = 'pc-windows-msvc' + elif is_macos: + platform = 'apple-darwin' + + return 'ouch-%s-%s' % ['x86_64', platform] + + +func get_wakatime_directory() -> String: + if wakatime_dir == null: + wakatime_dir = '%s/.wakatime' % get_home_directory() + + return wakatime_dir + + +func get_wakatime_cli() -> String: + if wakatime_cli == null: + var build = get_wakatime_build() + var ext = '.exe' if is_windows else '' + wakatime_cli = '%s/%s%s' % [get_wakatime_directory(), build, ext] + + return wakatime_cli + + +func get_decompressor_cli() -> String: + if decompressor_cli == null: + var build = get_ouch_build() + var ext = '.exe' if is_windows else '' + decompressor_cli = '%s/%s%s' % [PLUGIN_PATH, build, ext] + + return decompressor_cli + + +func get_home_directory(): + var home = null + for env in ['WAKATIME_HOME', 'USERPROFILE', 'HOME']: + home = OS.get_environment(env) + if home: + if is_windows: + home = home.replace('\\', '/') + return home + + return PLUGIN_PATH + + +func get_config_filepath() -> String: + return '%s/.wakatime.cfg' % get_home_directory() + + +func has_decompression_lib(): + return FileAccess.file_exists(get_decompressor_cli()) + + +func has_wakatime_cli(): + return FileAccess.file_exists(get_wakatime_cli()) + + +func has_wakatime_zip(): + return FileAccess.file_exists(WAKATIME_ZIP_FILEPATH) + + +func download_decompressor(): + pprint('Downloading Ouch! (decompression lib)...') + var url = DECOMPRESSOR_URL_FMT.format({'ouch_build': get_ouch_build()}) + if is_windows: + url = '%s.exe' % url + + var http = HTTPRequest.new() + http.download_file = get_decompressor_cli() + http.connect('request_completed', Callable(self, '_decompressor_download_completed')) + add_child(http) + + var error = http.request(url) + if error != OK: + disable_plugin() + pprint_error('Failed to download decompression lib: %s' % error) + + +func _decompressor_download_completed(result, status_code, headers, body): + if result != HTTPRequest.RESULT_SUCCESS: + pprint_error('Failed to download decompression lib') + disable_plugin() + return + + if !has_decompression_lib(): + pprint_error('Failed to save decompression lib') + disable_plugin() + return + + var decompressor = ProjectSettings.globalize_path(get_decompressor_cli()) + if is_linux or is_macos: + OS.execute('chmod', ['+x', decompressor], [], true) + + pprint('Ouch! download completed. Saved at %s' % get_decompressor_cli()) + + extract_files(WAKATIME_ZIP_FILEPATH, get_wakatime_directory()) + + +func download_wakatime(): + pprint('Downloading Wakatime CLI...') + var url = WAKATIME_URL_FMT.format({'wakatime_build': get_wakatime_build()}) + + var http = HTTPRequest.new() + http.download_file = WAKATIME_ZIP_FILEPATH + http.connect('request_completed', Callable(self, '_wakatime_download_completed')) + add_child(http) + + var error = http.request(url) + if error != OK: + pprint_error('Failed to download Wakatime CLI: %s' % error) + disable_plugin() + + +func _wakatime_download_completed(result, status_code, headers, body): + if result != HTTPRequest.RESULT_SUCCESS: + pprint_error('Failed to download Wakatime') + disable_plugin() + return + + pprint('Wakatime download completed. Saved at %s' % WAKATIME_ZIP_FILEPATH) + + extract_files(WAKATIME_ZIP_FILEPATH, get_wakatime_directory()) + + +func extract_files(source_file, output_dir): + # Both decompression lib and Wakatime zip downloads must be complete + if not (has_decompression_lib() and has_wakatime_zip()): + return + + pprint('Extracting files from Wakatime zip') + var decompressor = ProjectSettings.globalize_path(get_decompressor_cli()) + var source = ProjectSettings.globalize_path(source_file) + var destination = ProjectSettings.globalize_path(output_dir) + var errors = [] + var args = ['--yes', 'decompress', source, '--dir', destination] + var error = OS.execute(decompressor, args, errors, true) + if error: + pprint_error(errors) + disable_plugin() + return + + if has_wakatime_cli(): + pprint('Wakatime CLI installed at %s' % get_wakatime_cli()) + else: + disable_plugin() + pprint_error('Failed to install Wakatime CLI') + + # Remove unnecessary files + pprint('Cleaning downloaded files') + clean_downloaded_files() + + +func clean_downloaded_files(): + if has_wakatime_zip(): + delete_file(WAKATIME_ZIP_FILEPATH) + + if has_decompression_lib(): + delete_file(get_decompressor_cli()) + + +func delete_file(path): + var dir = DirAccess.open('res://') + var error = dir.remove(path) + if error != OK: + pprint_error('Failed to remove %s' % path) + else: + pprint('File %s removed' % path) + + +func check_dependencies(): + if has_wakatime_cli(): + return + + download_wakatime() + + if !has_decompression_lib(): + download_decompressor() + +func get_api_key(): + var output = [] + var err = OS.execute(get_wakatime_cli(), ['--config-read', 'api_key'], output) + if err == -1: + return null + + var api_key = output[0].strip_edges() + if api_key.is_empty(): + return null + + return api_key + + +func request_api_key(): + var prompt = ApiKeyPrompt.instantiate() + _set_api_key_on_prompt(prompt, get_api_key()) + _register_api_key_signals(prompt) + add_child(prompt) + prompt.popup_centered() + await prompt.popup_hide + prompt.queue_free() + + +func open_config_file(): + OS.shell_open(get_config_filepath()) + + +func setup_plugin(): + pprint('Initializing %s plugin.' % get_user_agent()) + + check_dependencies() + + var api_key = get_api_key() + if api_key == null: + request_api_key() + + await get_tree().process_frame + + # Adds tool menu item command to open API key prompt + add_tool_menu_item(API_KEY_MENU_ITEM_NAME, request_api_key) + # Adds tool menu item command to open global WakaTime config file + add_tool_menu_item(CONFIG_MENU_ITEM_NAME, open_config_file) + # Register editor changed callback + var script_editor = get_editor_interface().get_script_editor() + script_editor.call_deferred('connect', 'editor_script_changed', Callable(self, '_on_script_changed')) + + +func _disable_plugin(): + remove_tool_menu_item(API_KEY_MENU_ITEM_NAME) + remove_tool_menu_item(CONFIG_MENU_ITEM_NAME) + var script_editor = get_editor_interface().get_script_editor() + if script_editor.is_connected('editor_script_changed', Callable(self, '_on_script_changed')): + script_editor.disconnect('editor_script_changed', Callable(self, '_on_script_changed')) + + +func _ready(): + setup_plugin() + + +func _exit_tree(): + _disable_plugin() + + +func get_current_file(): + return get_editor_interface().get_script_editor().get_current_script() + + +func handle_activity(file, is_write=false): + if not (file and has_wakatime_cli()): + return + + var filepath = ProjectSettings.globalize_path(file.resource_path) + + if is_write or filepath != last_heartbeat.filepath or enough_time_has_passed(last_heartbeat.timestamp): + send_heartbeat(filepath, is_write) + + +func _send_heartbeat(cmd_args): + if wakatime_cli == null: + wakatime_cli = get_wakatime_cli() + + var output = [] + var exit_code = OS.execute(wakatime_cli, cmd_args, output, true) + if debug: + if exit_code == -1: + pprint('Failed to send heartbeat: %s' % output) + else: + pprint('Heartbeat sent: %s' % output) + + +func send_heartbeat(filepath, is_write): + var wakatime_api_key = get_api_key() + if wakatime_api_key == null: + pprint_error('Failed to get API key') + return + + var heartbeat = HeartBeat.new(filepath, Time.get_unix_time_from_system(), is_write) + var cmd = ['--entity', heartbeat.filepath, + '--key', wakatime_api_key, + '--plugin', get_user_agent()] + + if is_write: + cmd.append('--write') + + cmd.append('--project') + cmd.append(ProjectSettings.get('application/config/name')) + + var cmd_callable = Callable(self, '_send_heartbeat').bind(cmd) + WorkerThreadPool.add_task(cmd_callable) + + last_heartbeat = heartbeat + + +func enough_time_has_passed(last_sent_time): + return Time.get_unix_time_from_system() - last_heartbeat.timestamp >= HeartBeat.FILE_MODIFIED_DELAY + + +# file changed +func _on_script_changed(file): + handle_activity(file) + + +# file modfied +func _unhandled_key_input(ev): + var file = get_current_file() + handle_activity(file) + + +# file saved +func _save_external_data(): + var file = get_current_file() + handle_activity(file, true) + + +func _set_api_key_on_prompt(instance: PopupPanel, api_key): + if api_key == null: + api_key = '' + var text_edit = instance.get_node('vbox_container/hbox_container_top/line_edit') + text_edit.text = api_key + + +func _register_api_key_signals(instance: PopupPanel): + var show_btn = instance.get_node('vbox_container/hbox_container_top/show_btn') + var save_btn = instance.get_node('vbox_container/hbox_container_bottom/save_btn') + var text_edit = instance.get_node('vbox_container/hbox_container_top/line_edit') + + show_btn.connect('pressed', Callable(self, '_on_toggle_secret_text').bind(instance)) + save_btn.connect('pressed', Callable(self, '_on_save_api_key').bind(instance)) + instance.connect('popup_hide', Callable(self, '_on_popup_hide').bind(instance)) + + +func disable_plugin(): + pprint_error('Disabling wakatime-godot plugin due some setup error. ' \ + + 'Check your internet connection and reload the plugin') + get_editor_interface().call_deferred('set_plugin_enabled', 'wakatime', false) + + +func _on_popup_hide(prompt: PopupPanel): + prompt.queue_free() + + +func _on_toggle_secret_text(prompt: PopupPanel): + var text_edit = prompt.get_node('vbox_container/hbox_container_top/line_edit') + var show_btn = prompt.get_node('vbox_container/hbox_container_top/show_btn') + + text_edit.secret = not text_edit.secret + show_btn.text = 'Show' if text_edit.secret else 'Hide' + + +func _on_save_api_key(prompt: PopupPanel): + var text_edit = prompt.get_node('vbox_container/hbox_container_top/line_edit') + var api_key = text_edit.text.strip_edges() + var err = OS.execute(get_wakatime_cli(), ['--config-write', 'api_key=%s' % api_key]) + if err == -1: + pprint_error('Failed to save API key') + + prompt.visible = false + + +func pprint(message): + print('[godot-wakatime] %s' % message) + + +func pprint_error(message): + push_error('[godot-wakatime] %s' % message) + + +func get_user_agent(): + return 'godot/%s %s/%s' % [get_engine_version(), _get_plugin_name(), get_plugin_version()] + + +func _get_plugin_name(): + return 'godot-wakatime' + + +func get_plugin_version(): + return '1.5.0' + + +func get_engine_version(): + return '%s.%s.%s' % [ Engine.get_version_info()['major'], + Engine.get_version_info()['minor'], + Engine.get_version_info()['patch']] diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..7a9603c --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,265 @@ +[preset.0] + +name="Windows Desktop" +platform="Windows Desktop" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="./Shounic Dating Sim.exe" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.0.options] + +custom_template/debug="" +custom_template/release="" +debug/export_console_wrapper=0 +binary_format/embed_pck=true +texture_format/bptc=true +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +binary_format/architecture="x86_64" +codesign/enable=false +codesign/timestamp=true +codesign/timestamp_server_url="" +codesign/digest_algorithm=1 +codesign/description="" +codesign/custom_options=PackedStringArray() +application/modify_resources=false +application/icon="" +application/console_wrapper_icon="" +application/icon_interpolation=4 +application/file_version="" +application/product_version="" +application/company_name="" +application/product_name="" +application/file_description="" +application/copyright="" +application/trademarks="" +application/export_angle=0 +ssh_remote_deploy/enabled=false +ssh_remote_deploy/host="user@host_ip" +ssh_remote_deploy/port="22" +ssh_remote_deploy/extra_args_ssh="" +ssh_remote_deploy/extra_args_scp="" +ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}' +$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}' +$trigger = New-ScheduledTaskTrigger -Once -At 00:00 +$settings = New-ScheduledTaskSettingsSet +$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings +Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true +Start-ScheduledTask -TaskName godot_remote_debug +while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 } +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue" +ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue +Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue +Remove-Item -Recurse -Force '{temp_dir}'" + +[preset.1] + +name="Android" +platform="Android" +runnable=true +dedicated_server=false +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="" +encryption_include_filters="" +encryption_exclude_filters="" +encrypt_pck=false +encrypt_directory=false + +[preset.1.options] + +custom_template/debug="" +custom_template/release="" +gradle_build/use_gradle_build=false +gradle_build/export_format=0 +gradle_build/min_sdk="" +gradle_build/target_sdk="" +architectures/armeabi-v7a=false +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +version/code=1 +version/name="" +package/unique_name="com.example.$genname" +package/name="" +package/signed=true +package/app_category=2 +package/retain_data_on_uninstall=false +package/exclude_from_recents=false +package/show_in_android_tv=false +package/show_in_app_library=true +package/show_as_launcher_app=false +launcher_icons/main_192x192="" +launcher_icons/adaptive_foreground_432x432="" +launcher_icons/adaptive_background_432x432="" +graphics/opengl_debug=false +xr_features/xr_mode=0 +screen/immersive_mode=true +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +user_data_backup/allow=false +command_line/extra_args="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +permissions/custom_permissions=PackedStringArray() +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/manage_external_storage=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/post_notifications=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false diff --git a/icon.svg b/icon.svg new file mode 100644 index 0000000..3fe4f4a --- /dev/null +++ b/icon.svg @@ -0,0 +1 @@ + diff --git a/icon.svg.import b/icon.svg.import new file mode 100644 index 0000000..17d94dd --- /dev/null +++ b/icon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3s03u7vq5ewg" +path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.svg" +dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..4272c41 --- /dev/null +++ b/project.godot @@ -0,0 +1,30 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="Shounic Dating Sim" +run/main_scene="res://scenes/menu/menu.tscn" +config/features=PackedStringArray("4.2", "Forward Plus") +config/icon="res://icon.svg" + +[display] + +window/size/resizable=false + +[editor_plugins] + +enabled=PackedStringArray("res://addons/wakatime/plugin.cfg") + +[rendering] + +renderer/rendering_method="gl_compatibility" +renderer/rendering_method.mobile="gl_compatibility" +textures/vram_compression/import_etc2_astc=true diff --git a/scenes/global/assets/img/spr_sho.webp b/scenes/global/assets/img/spr_sho.webp new file mode 100644 index 0000000..3487b7a Binary files /dev/null and b/scenes/global/assets/img/spr_sho.webp differ diff --git a/scenes/global/assets/img/spr_sho.webp.import b/scenes/global/assets/img/spr_sho.webp.import new file mode 100644 index 0000000..912dd24 --- /dev/null +++ b/scenes/global/assets/img/spr_sho.webp.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0eqsc8687qvi" +path="res://.godot/imported/spr_sho.webp-32b0509e8949c707eecc39bfc7bffbd3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/global/assets/img/spr_sho.webp" +dest_files=["res://.godot/imported/spr_sho.webp-32b0509e8949c707eecc39bfc7bffbd3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/global/assets/nodes/shounic.tscn b/scenes/global/assets/nodes/shounic.tscn new file mode 100644 index 0000000..0cf96ab --- /dev/null +++ b/scenes/global/assets/nodes/shounic.tscn @@ -0,0 +1,49 @@ +[gd_scene load_steps=7 format=3 uid="uid://0eryipo3upvb"] + +[ext_resource type="Texture2D" uid="uid://b0eqsc8687qvi" path="res://scenes/global/assets/img/spr_sho.webp" id="1_adetk"] +[ext_resource type="Script" path="res://scenes/global/assets/scripts/shounicSlide.gd" id="2_p60yl"] +[ext_resource type="Texture2D" uid="uid://eqqe3xwadwf7" path="res://scenes/house/assets/img/spr_shophone.png" id="3_gux02"] +[ext_resource type="Script" path="res://scenes/house/assets/scripts/shoPhone.gd" id="4_f17nh"] +[ext_resource type="Texture2D" uid="uid://2vpoq7chiukj" path="res://scenes/house/assets/img/spr_spyknife.png" id="5_6i2wh"] +[ext_resource type="Script" path="res://scenes/house/assets/scripts/shoKnife.gd" id="6_v6wcf"] + +[node name="Shounic" type="TextureRect"] +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -500.0 +offset_top = -500.0 +grow_horizontal = 0 +grow_vertical = 0 +texture = ExtResource("1_adetk") +expand_mode = 1 +stretch_mode = 6 +script = ExtResource("2_p60yl") + +[node name="phone" type="TextureRect" parent="."] +show_behind_parent = true +layout_mode = 0 +offset_left = 350.0 +offset_top = 175.0 +offset_right = 474.0 +offset_bottom = 447.0 +rotation = 0.214676 +texture = ExtResource("3_gux02") +expand_mode = 1 +stretch_mode = 6 +script = ExtResource("4_f17nh") + +[node name="knife" type="TextureRect" parent="."] +show_behind_parent = true +layout_mode = 0 +offset_left = 350.0 +offset_top = 175.0 +offset_right = 474.0 +offset_bottom = 447.0 +rotation = 0.214676 +texture = ExtResource("5_6i2wh") +expand_mode = 1 +stretch_mode = 6 +script = ExtResource("6_v6wcf") diff --git a/scenes/global/assets/scripts/fadetoblack.gd b/scenes/global/assets/scripts/fadetoblack.gd new file mode 100644 index 0000000..26a4b0b --- /dev/null +++ b/scenes/global/assets/scripts/fadetoblack.gd @@ -0,0 +1,36 @@ +extends ColorRect +var fade = false +var unfade = false +var transparency = 0 + +func _process(_delta): + if fade and not unfade: + await get_tree().create_timer(0.01).timeout + if color.a < 1: + color = Color(0, 0, 0, transparency) + else: + color = Color(0, 0, 0, 1) + fade = false + transparency += 0.01 + + if unfade and not fade: + await get_tree().create_timer(0.01).timeout + if color.a > 0: + color = Color(0, 0, 0, transparency) + else: + color = Color(0, 0, 0, 0) + unfade = false + transparency -= 0.01 + + if fade and unfade: + color = Color(0, 0, 0, 100) + +func _on_dialog_fade_to_black(): + transparency = 0 + unfade = false + fade = true + +func _on_dialog_unfade(): + transparency = 1 + fade = false + unfade = true diff --git a/scenes/global/assets/scripts/shounicSlide.gd b/scenes/global/assets/scripts/shounicSlide.gd new file mode 100644 index 0000000..0db5566 --- /dev/null +++ b/scenes/global/assets/scripts/shounicSlide.gd @@ -0,0 +1,31 @@ +extends TextureRect +var slide = false +var exit = false +var originalPosition + +func _ready(): + position.x = get_viewport_rect().size.x + 500 + position.y = get_viewport_rect().size.y - 500 + originalPosition = position + +func _physics_process(delta): + if slide: + var targetPosition = Vector2.ONE + targetPosition.y = position.y + targetPosition.x = get_viewport_rect().size.x / 2 - 250 + position = position.lerp(targetPosition, 5 * delta) + elif exit: + position = position.lerp(originalPosition, 5 * delta) + originalPosition.x = get_viewport_rect().size.x + 500 + originalPosition.y = get_viewport_rect().size.y - 500 + +func _on_dialog_shounic_trigger(): + visible = true + exit = false + slide = true + + +func _on_dialog_shounic_exit(): + visible = true + exit = true + slide = false diff --git a/scenes/global/assets/themes/dialogButton.tres b/scenes/global/assets/themes/dialogButton.tres new file mode 100644 index 0000000..fa35242 --- /dev/null +++ b/scenes/global/assets/themes/dialogButton.tres @@ -0,0 +1,58 @@ +[gd_resource type="Theme" load_steps=6 format=3 uid="uid://yd1uwltn3go"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yo84y"] +bg_color = Color(0.41598, 0.41598, 0.41598, 0.6) +border_width_left = 20 +border_width_top = 18 +border_width_right = 20 +border_width_bottom = 19 +border_color = Color(0.415686, 0.415686, 0.415686, 0.6) +corner_detail = 1 +expand_margin_left = 2.0 +expand_margin_right = 2.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_6m2xn"] +bg_color = Color(0, 0, 0, 0) +corner_detail = 1 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_odakq"] +bg_color = Color(0.787759, 0.787759, 0.787759, 0.6) +border_width_left = 20 +border_width_top = 18 +border_width_right = 20 +border_width_bottom = 19 +border_color = Color(0.788235, 0.788235, 0.788235, 0.6) +corner_detail = 1 +expand_margin_left = 2.0 +expand_margin_right = 2.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5evmu"] +bg_color = Color(0.6, 0.6, 0.6, 0.6) +border_width_left = 20 +border_width_top = 18 +border_width_right = 20 +border_width_bottom = 19 +border_color = Color(0.6, 0.6, 0.6, 0.6) +corner_detail = 1 +expand_margin_left = 2.0 +expand_margin_right = 2.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oenea"] +bg_color = Color(0.454524, 0.454524, 0.454524, 0.6) +border_width_left = 20 +border_width_top = 18 +border_width_right = 20 +border_width_bottom = 19 +border_color = Color(0.454902, 0.454902, 0.454902, 0.6) +corner_detail = 1 +expand_margin_left = 2.0 +expand_margin_right = 2.0 + +[resource] +Button/colors/font_disabled_color = Color(0.489622, 0.489622, 0.489622, 0.5) +Button/font_sizes/font_size = 16 +Button/styles/disabled = SubResource("StyleBoxFlat_yo84y") +Button/styles/focus = SubResource("StyleBoxFlat_6m2xn") +Button/styles/hover = SubResource("StyleBoxFlat_odakq") +Button/styles/normal = SubResource("StyleBoxFlat_5evmu") +Button/styles/pressed = SubResource("StyleBoxFlat_oenea") diff --git a/scenes/global/assets/wav/Chat_display_text.wav b/scenes/global/assets/wav/Chat_display_text.wav new file mode 100644 index 0000000..9a26ff4 Binary files /dev/null and b/scenes/global/assets/wav/Chat_display_text.wav differ diff --git a/scenes/global/assets/wav/Chat_display_text.wav.import b/scenes/global/assets/wav/Chat_display_text.wav.import new file mode 100644 index 0000000..c4e63cc --- /dev/null +++ b/scenes/global/assets/wav/Chat_display_text.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://bg8puefh5thwx" +path="res://.godot/imported/Chat_display_text.wav-3768ee81d15e5aee97ce6395bc858c36.sample" + +[deps] + +source_file="res://scenes/global/assets/wav/Chat_display_text.wav" +dest_files=["res://.godot/imported/Chat_display_text.wav-3768ee81d15e5aee97ce6395bc858c36.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/scenes/global/assets/wav/snd_shounic_byte.wav b/scenes/global/assets/wav/snd_shounic_byte.wav new file mode 100644 index 0000000..09e9a86 Binary files /dev/null and b/scenes/global/assets/wav/snd_shounic_byte.wav differ diff --git a/scenes/global/assets/wav/snd_shounic_byte.wav.import b/scenes/global/assets/wav/snd_shounic_byte.wav.import new file mode 100644 index 0000000..b17b40c --- /dev/null +++ b/scenes/global/assets/wav/snd_shounic_byte.wav.import @@ -0,0 +1,24 @@ +[remap] + +importer="wav" +type="AudioStreamWAV" +uid="uid://dtd5bdeqy4m0r" +path="res://.godot/imported/snd_shounic_byte.wav-a4e53a3b18c5b19bbec5f1a7001c0939.sample" + +[deps] + +source_file="res://scenes/global/assets/wav/snd_shounic_byte.wav" +dest_files=["res://.godot/imported/snd_shounic_byte.wav-a4e53a3b18c5b19bbec5f1a7001c0939.sample"] + +[params] + +force/8_bit=false +force/mono=false +force/max_rate=false +force/max_rate_hz=44100 +edit/trim=false +edit/normalize=false +edit/loop_mode=0 +edit/loop_begin=0 +edit/loop_end=-1 +compress/mode=0 diff --git a/scenes/house/assets/img/bg_shobedroom.jpg b/scenes/house/assets/img/bg_shobedroom.jpg new file mode 100644 index 0000000..38965ed Binary files /dev/null and b/scenes/house/assets/img/bg_shobedroom.jpg differ diff --git a/scenes/house/assets/img/bg_shobedroom.jpg.import b/scenes/house/assets/img/bg_shobedroom.jpg.import new file mode 100644 index 0000000..bbefce1 --- /dev/null +++ b/scenes/house/assets/img/bg_shobedroom.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dxgus7oa4j58f" +path="res://.godot/imported/bg_shobedroom.jpg-554aa5df5242fa4fcf27c0f145a4fcf0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/house/assets/img/bg_shobedroom.jpg" +dest_files=["res://.godot/imported/bg_shobedroom.jpg-554aa5df5242fa4fcf27c0f145a4fcf0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/house/assets/img/bg_shohouse.jpg b/scenes/house/assets/img/bg_shohouse.jpg new file mode 100644 index 0000000..deac46d Binary files /dev/null and b/scenes/house/assets/img/bg_shohouse.jpg differ diff --git a/scenes/house/assets/img/bg_shohouse.jpg.import b/scenes/house/assets/img/bg_shohouse.jpg.import new file mode 100644 index 0000000..ebaf8fe --- /dev/null +++ b/scenes/house/assets/img/bg_shohouse.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7jjn7nnvwy1q" +path="res://.godot/imported/bg_shohouse.jpg-68603ab3022cdd6f4bbbdcc48b7a3963.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/house/assets/img/bg_shohouse.jpg" +dest_files=["res://.godot/imported/bg_shohouse.jpg-68603ab3022cdd6f4bbbdcc48b7a3963.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/house/assets/img/spr_shophone.png b/scenes/house/assets/img/spr_shophone.png new file mode 100644 index 0000000..ba3b4fd Binary files /dev/null and b/scenes/house/assets/img/spr_shophone.png differ diff --git a/scenes/house/assets/img/spr_shophone.png.import b/scenes/house/assets/img/spr_shophone.png.import new file mode 100644 index 0000000..3e7dd9f --- /dev/null +++ b/scenes/house/assets/img/spr_shophone.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://eqqe3xwadwf7" +path="res://.godot/imported/spr_shophone.png-de12d33c48f574868b4ac0c36a095552.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/house/assets/img/spr_shophone.png" +dest_files=["res://.godot/imported/spr_shophone.png-de12d33c48f574868b4ac0c36a095552.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/house/assets/img/spr_spyknife.png b/scenes/house/assets/img/spr_spyknife.png new file mode 100644 index 0000000..0fdb792 Binary files /dev/null and b/scenes/house/assets/img/spr_spyknife.png differ diff --git a/scenes/house/assets/img/spr_spyknife.png.import b/scenes/house/assets/img/spr_spyknife.png.import new file mode 100644 index 0000000..0d5127b --- /dev/null +++ b/scenes/house/assets/img/spr_spyknife.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://2vpoq7chiukj" +path="res://.godot/imported/spr_spyknife.png-055610b35c7e408d830ff67a5e50b25f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/house/assets/img/spr_spyknife.png" +dest_files=["res://.godot/imported/spr_spyknife.png-055610b35c7e408d830ff67a5e50b25f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/house/assets/scripts/dialog.gd b/scenes/house/assets/scripts/dialog.gd new file mode 100644 index 0000000..39c9233 --- /dev/null +++ b/scenes/house/assets/scripts/dialog.gd @@ -0,0 +1,101 @@ +extends RichTextLabel + +var shoBedroom = preload("res://scenes/house/assets/img/bg_shobedroom.jpg") +var dnum = 0 +var currentlyDisplaying = "" +var displaying = false +var freeze = false +signal shounicTrigger +signal shounicExit +signal shoPhoneTrigger +signal shoPhoneExit +signal shoKnifeTrigger +signal shoKnifeExit +signal fadeToBlack +signal unfade + +func _ready(): + dnum = 0 + displaySlow("Outside shounic's house") + var save = FileAccess.open("user://chapter.sds", FileAccess.WRITE) + save.store_string(Marshalls.utf8_to_base64(JSON.stringify({"chShoHouse": "1"}))) + unfade.emit() + +func displaySlow(txt): + currentlyDisplaying = txt + displaying = true + var doneChars = "" + for character in txt: + if displaying: + doneChars = doneChars + character + await get_tree().create_timer(0.015).timeout + if displaying: + text = doneChars + if not get_child(0).playing: + get_child(0).play() + else: + break + else: + break + currentlyDisplaying = "" + displaying = false + +func _on_continue_pressed(): + if not currentlyDisplaying and not freeze: + match dnum: + 0: + displaySlow("...I must find a way to break into the house of that cat I saw earlier") + 1: + displaySlow("They are too beautiful for me to not attempt to commit a serious federal crime") + 2: + displaySlow("I've stolen a crowbar from the HL2 exhibit and I'm ready to break in") + 3: + displaySlow("Do I really want to though?") + 4: + displaySlow("Yes. Yes I do.") + fadeToBlack.emit() + 5: + displaySlow("*glass breaking noises*") + 6: + displaySlow("I'm in") + get_node("/root/Control/Background").set_texture(shoBedroom) + unfade.emit() + 7: + shounicTrigger.emit() + get_parent().get_child(1).text = "Shounic" + get_parent().get_child(1).visible = true + displaySlow("What the hell are you doing here??") + 8: + displaySlow("Aren't you that random homeless person from the trivia quiz yesterday?") + 9: + displaySlow("I'm calling the police.") + shoPhoneTrigger.emit() + 10: + displaySlow("...") + 11: + displaySlow("...") + 12: + displaySlow("...") + 13: + displaySlow("They are coming in 5 minutes.") + shoPhoneExit.emit() + 14: + displaySlow("You have exactly that amount of time to leave.") + 15: + displaySlow("...") + 16: + displaySlow("...") + 17: + displaySlow("...") + 18: + displaySlow("Still not leaving?") + 19: + displaySlow("Then I will have to evict you...") + 20: + displaySlow("By force.") + shoKnifeTrigger.emit() + dnum += 1 + elif not freeze: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" diff --git a/scenes/house/assets/scripts/shoKnife.gd b/scenes/house/assets/scripts/shoKnife.gd new file mode 100644 index 0000000..b3a83e8 --- /dev/null +++ b/scenes/house/assets/scripts/shoKnife.gd @@ -0,0 +1,37 @@ +extends TextureRect +var slide = false +var exit = false +var originalPosition = Vector2.ONE + +func _ready(): + visible = false + originalPosition.x = get_viewport_rect().size.x / 2 + 100 + originalPosition.y = get_viewport_rect().size.y - 325 + +func _physics_process(delta): + if slide: + show_behind_parent = false + visible = true + var targetPosition = Vector2.ONE + targetPosition.y = originalPosition.y - 150 + targetPosition.x = originalPosition.x + 150 + global_position = global_position.lerp(targetPosition, 5 * delta) + elif exit: + show_behind_parent = true + global_position = global_position.lerp(originalPosition, 5 * delta) + originalPosition.x = get_viewport_rect().size.x / 2 + 100 + originalPosition.y = get_viewport_rect().size.y - 325 + else: + originalPosition.x = get_viewport_rect().size.x / 2 + 100 + originalPosition.y = get_viewport_rect().size.y - 325 + +func _on_dialog_sho_knife_exit(): + visible = true + exit = true + slide = false + + +func _on_dialog_sho_knife_trigger(): + visible = true + exit = false + slide = true diff --git a/scenes/house/assets/scripts/shoPhone.gd b/scenes/house/assets/scripts/shoPhone.gd new file mode 100644 index 0000000..745856b --- /dev/null +++ b/scenes/house/assets/scripts/shoPhone.gd @@ -0,0 +1,37 @@ +extends TextureRect +var slide = false +var exit = false +var originalPosition = Vector2.ONE + +func _ready(): + visible = false + originalPosition.x = get_viewport_rect().size.x / 2 + 100 + originalPosition.y = get_viewport_rect().size.y - 325 + +func _physics_process(delta): + if slide: + show_behind_parent = false + visible = true + var targetPosition = Vector2.ONE + targetPosition.y = originalPosition.y - 150 + targetPosition.x = originalPosition.x + 150 + global_position = global_position.lerp(targetPosition, 5 * delta) + elif exit: + show_behind_parent = true + global_position = global_position.lerp(originalPosition, 5 * delta) + originalPosition.x = get_viewport_rect().size.x / 2 + 100 + originalPosition.y = get_viewport_rect().size.y - 325 + else: + originalPosition.x = get_viewport_rect().size.x / 2 + 100 + originalPosition.y = get_viewport_rect().size.y - 325 + +func _on_dialog_sho_phone_exit(): + visible = true + exit = true + slide = false + + +func _on_dialog_sho_phone_trigger(): + visible = true + exit = false + slide = true diff --git a/scenes/house/house.tscn b/scenes/house/house.tscn new file mode 100644 index 0000000..2e7b262 --- /dev/null +++ b/scenes/house/house.tscn @@ -0,0 +1,144 @@ +[gd_scene load_steps=9 format=3 uid="uid://cn418hkj8mraj"] + +[ext_resource type="Texture2D" uid="uid://b7jjn7nnvwy1q" path="res://scenes/house/assets/img/bg_shohouse.jpg" id="1_sjqws"] +[ext_resource type="PackedScene" uid="uid://0eryipo3upvb" path="res://scenes/global/assets/nodes/shounic.tscn" id="2_oi53i"] +[ext_resource type="Script" path="res://scenes/global/assets/scripts/fadetoblack.gd" id="4_m4lsv"] +[ext_resource type="Theme" uid="uid://yd1uwltn3go" path="res://scenes/global/assets/themes/dialogButton.tres" id="5_08u6q"] +[ext_resource type="Script" path="res://scenes/house/assets/scripts/dialog.gd" id="6_olgy2"] +[ext_resource type="AudioStream" uid="uid://dtd5bdeqy4m0r" path="res://scenes/global/assets/wav/snd_shounic_byte.wav" id="7_bxtx8"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jkt8c"] +bg_color = Color(0.184314, 0.184314, 0.184314, 0.898039) +border_width_left = 5 +border_width_right = 5 +border_color = Color(0.184314, 0.184314, 0.184314, 0.898039) + +[sub_resource type="Theme" id="Theme_1ajjm"] +Label/styles/normal = SubResource("StyleBoxFlat_jkt8c") + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Background" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_sjqws") +expand_mode = 3 +stretch_mode = 6 + +[node name="Shounic" parent="." instance=ExtResource("2_oi53i")] +layout_mode = 0 +anchors_preset = 0 +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +offset_left = 0.0 +offset_top = 0.0 +offset_right = 500.0 +offset_bottom = 500.0 +grow_horizontal = 1 +grow_vertical = 1 + +[node name="FadeToBlack" type="ColorRect" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) +script = ExtResource("4_m4lsv") + +[node name="Continue" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -60.0 +grow_horizontal = 2 +grow_vertical = 0 +theme = ExtResource("5_08u6q") +text = "Continue +" + +[node name="YesNo" type="HFlowContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -60.0 +grow_horizontal = 2 +grow_vertical = 0 + +[node name="No" type="Button" parent="YesNo"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("5_08u6q") +text = "No" + +[node name="Yes" type="Button" parent="YesNo"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("5_08u6q") +text = "Yes" + +[node name="DContainer" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -260.0 +offset_bottom = -60.0 +grow_horizontal = 2 +grow_vertical = 0 +color = Color(0.184314, 0.184314, 0.184314, 0.560784) + +[node name="Dialog" type="RichTextLabel" parent="DContainer"] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 25.0 +offset_top = -175.0 +offset_right = -52.0 +offset_bottom = -25.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_colors/default_color = Color(1, 1, 1, 1) +theme_override_font_sizes/normal_font_size = 30 +script = ExtResource("6_olgy2") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="DContainer/Dialog"] +stream = ExtResource("7_bxtx8") + +[node name="Label" type="Label" parent="DContainer"] +visible = false +layout_mode = 0 +offset_top = -40.0 +offset_right = 176.0 +theme = SubResource("Theme_1ajjm") +theme_override_font_sizes/font_size = 29 +text = "Placeholder" + +[connection signal="pressed" from="Continue" to="DContainer/Dialog" method="_on_continue_pressed"] +[connection signal="pressed" from="YesNo/No" to="DContainer/Dialog" method="_on_no_pressed"] +[connection signal="pressed" from="YesNo/Yes" to="DContainer/Dialog" method="_on_yes_pressed"] +[connection signal="fadeToBlack" from="DContainer/Dialog" to="FadeToBlack" method="_on_dialog_fade_to_black"] +[connection signal="unfade" from="DContainer/Dialog" to="FadeToBlack" method="_on_dialog_unfade"] diff --git a/scenes/menu/assets/img/bg_2fort.jpg b/scenes/menu/assets/img/bg_2fort.jpg new file mode 100644 index 0000000..bf96a15 Binary files /dev/null and b/scenes/menu/assets/img/bg_2fort.jpg differ diff --git a/scenes/menu/assets/img/bg_2fort.jpg.import b/scenes/menu/assets/img/bg_2fort.jpg.import new file mode 100644 index 0000000..81049dc --- /dev/null +++ b/scenes/menu/assets/img/bg_2fort.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://canmjdb8gvy4j" +path="res://.godot/imported/bg_2fort.jpg-a4dfce502e9285c80a040cfbd1decdf1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/menu/assets/img/bg_2fort.jpg" +dest_files=["res://.godot/imported/bg_2fort.jpg-a4dfce502e9285c80a040cfbd1decdf1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/menu/assets/scripts/continue.gd b/scenes/menu/assets/scripts/continue.gd new file mode 100644 index 0000000..9c41db8 --- /dev/null +++ b/scenes/menu/assets/scripts/continue.gd @@ -0,0 +1,5 @@ +extends Button + +func _ready(): + if FileAccess.file_exists("user://chapter.sds"): + visible = true diff --git a/scenes/menu/assets/scripts/credits.gd b/scenes/menu/assets/scripts/credits.gd new file mode 100644 index 0000000..1b1f53a --- /dev/null +++ b/scenes/menu/assets/scripts/credits.gd @@ -0,0 +1,4 @@ +extends Button + +func _on_pressed(): + get_tree().change_scene_to_file("res://scenes/menu/credits.tscn") diff --git a/scenes/menu/assets/scripts/delete.gd b/scenes/menu/assets/scripts/delete.gd new file mode 100644 index 0000000..5032a4f --- /dev/null +++ b/scenes/menu/assets/scripts/delete.gd @@ -0,0 +1,6 @@ +extends Button + +func _on_pressed(): + DirAccess.remove_absolute("user:///endings.sds") + DirAccess.remove_absolute("user:///chapter.sds") + DirAccess.remove_absolute("user:///secrets.sds") diff --git a/scenes/menu/assets/scripts/newgame.gd b/scenes/menu/assets/scripts/newgame.gd new file mode 100644 index 0000000..5f7faad --- /dev/null +++ b/scenes/menu/assets/scripts/newgame.gd @@ -0,0 +1,8 @@ +extends Button + +func _ready(): + if FileAccess.file_exists("user://chapter.sds"): + position.y = 198 + +func _on_pressed(): + get_tree().change_scene_to_file("res://scenes/quiz/quiz.tscn") diff --git a/scenes/menu/assets/scripts/returnToMenu.gd b/scenes/menu/assets/scripts/returnToMenu.gd new file mode 100644 index 0000000..bfcc36c --- /dev/null +++ b/scenes/menu/assets/scripts/returnToMenu.gd @@ -0,0 +1,4 @@ +extends Button + +func _on_pressed(): + get_tree().change_scene_to_file("res://scenes/menu/menu.tscn") diff --git a/scenes/menu/assets/scripts/secret.gd b/scenes/menu/assets/scripts/secret.gd new file mode 100644 index 0000000..772f181 --- /dev/null +++ b/scenes/menu/assets/scripts/secret.gd @@ -0,0 +1,8 @@ +extends Button + +func _ready(): + if FileAccess.file_exists("user://secrets.sds"): + visible = true + + if FileAccess.file_exists("user://chapter.sds"): + position.y = 261 diff --git a/scenes/menu/credits.tscn b/scenes/menu/credits.tscn new file mode 100644 index 0000000..a85c110 --- /dev/null +++ b/scenes/menu/credits.tscn @@ -0,0 +1,65 @@ +[gd_scene load_steps=3 format=3 uid="uid://c02rtrdoh04tx"] + +[ext_resource type="Theme" uid="uid://yd1uwltn3go" path="res://scenes/global/assets/themes/dialogButton.tres" id="1_dk3p3"] +[ext_resource type="Script" path="res://scenes/menu/assets/scripts/returnToMenu.gd" id="2_lf3j5"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) + +[node name="RichTextLabel" type="RichTextLabel" parent="ColorRect"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 50.0 +offset_top = 50.0 +offset_right = -50.0 +offset_bottom = -50.0 +grow_horizontal = 2 +grow_vertical = 2 +bbcode_enabled = true +text = "CREDITS + +Created by Arzumify + +Depicts Shounic as character + +Image of VALVe HQ By Tim Eulitz - Own work, CC BY 4.0, [url=https://commons.wikimedia.org/w/index.php?curid=46976775]View on wikimedia[/url] + +Image of shounic by... shounic, used with explicit permission + +All other images are in the public domain + + +This game is dedicated to a friend who sadly passed away due to cancer. Support this game by donating to your local cancer research charity! + +💛" + +[node name="Button" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -8.0 +grow_horizontal = 2 +grow_vertical = 0 +theme = ExtResource("1_dk3p3") +text = "Return to menu" +script = ExtResource("2_lf3j5") + +[connection signal="pressed" from="Button" to="Button" method="_on_pressed"] diff --git a/scenes/menu/menu.tscn b/scenes/menu/menu.tscn new file mode 100644 index 0000000..85b641a --- /dev/null +++ b/scenes/menu/menu.tscn @@ -0,0 +1,123 @@ +[gd_scene load_steps=9 format=3 uid="uid://bxmuw1of73jvn"] + +[ext_resource type="Texture2D" uid="uid://canmjdb8gvy4j" path="res://scenes/menu/assets/img/bg_2fort.jpg" id="1_5buff"] +[ext_resource type="Script" path="res://scenes/menu/assets/scripts/newgame.gd" id="2_0nlbt"] +[ext_resource type="Script" path="res://scenes/menu/assets/scripts/secret.gd" id="2_r406j"] +[ext_resource type="Script" path="res://scenes/menu/assets/scripts/continue.gd" id="2_tmv70"] +[ext_resource type="Script" path="res://scenes/menu/assets/scripts/credits.gd" id="5_qpmnf"] +[ext_resource type="Theme" uid="uid://yd1uwltn3go" path="res://scenes/global/assets/themes/dialogButton.tres" id="6_2dxck"] +[ext_resource type="Script" path="res://scenes/menu/assets/scripts/delete.gd" id="7_un6ji"] + +[sub_resource type="LabelSettings" id="LabelSettings_lecc8"] +font_size = 50 +outline_size = 1 +outline_color = Color(0, 0, 0, 1) + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_5buff") +expand_mode = 3 +stretch_mode = 6 + +[node name="Label" type="Label" parent="."] +layout_mode = 0 +offset_left = 50.0 +offset_top = 50.0 +offset_right = 247.0 +offset_bottom = 73.0 +text = "Shounic Dating Simulator" +label_settings = SubResource("LabelSettings_lecc8") + +[node name="Button" type="Button" parent="."] +layout_mode = 1 +offset_left = 51.0 +offset_top = 135.0 +offset_right = 311.0 +offset_bottom = 193.0 +text = "New Game" +script = ExtResource("2_0nlbt") + +[node name="Button4" type="Button" parent="."] +visible = false +layout_mode = 1 +offset_left = 51.0 +offset_top = 135.0 +offset_right = 311.0 +offset_bottom = 193.0 +text = "Continue" +script = ExtResource("2_tmv70") + +[node name="Button5" type="Button" parent="."] +layout_mode = 1 +offset_left = 51.0 +offset_top = 198.0 +offset_right = 311.0 +offset_bottom = 256.0 +text = "Use secret code" +script = ExtResource("2_r406j") + +[node name="Button3" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_left = 50.0 +offset_top = -98.0 +offset_right = 310.0 +offset_bottom = -40.0 +grow_vertical = 0 +text = "View credits" +script = ExtResource("5_qpmnf") + +[node name="ColorRect" type="ColorRect" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(1, 0, 0, 1) + +[node name="Label2" type="RichTextLabel" parent="ColorRect"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_font_sizes/normal_font_size = 80 +text = "ERROR! + +YOUR SAVE DATA IS CORRUPTED!" + +[node name="Button" type="Button" parent="ColorRect"] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -99.0 +grow_horizontal = 2 +grow_vertical = 0 +theme = ExtResource("6_2dxck") +theme_override_font_sizes/font_size = 30 +text = "Permanently delete save data" +script = ExtResource("7_un6ji") + +[connection signal="pressed" from="Button" to="Button" method="_on_pressed"] +[connection signal="pressed" from="Button3" to="Button3" method="_on_pressed"] +[connection signal="pressed" from="ColorRect/Button" to="ColorRect/Button" method="_on_pressed"] diff --git a/scenes/quiz/assets/img/bg_valve.jpg b/scenes/quiz/assets/img/bg_valve.jpg new file mode 100644 index 0000000..276b794 Binary files /dev/null and b/scenes/quiz/assets/img/bg_valve.jpg differ diff --git a/scenes/quiz/assets/img/bg_valve.jpg.import b/scenes/quiz/assets/img/bg_valve.jpg.import new file mode 100644 index 0000000..bde8aa5 --- /dev/null +++ b/scenes/quiz/assets/img/bg_valve.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dqf36vgpolfwp" +path="res://.godot/imported/bg_valve.jpg-c0ac986ed1dafe40aad8334a3ff079e7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/quiz/assets/img/bg_valve.jpg" +dest_files=["res://.godot/imported/bg_valve.jpg-c0ac986ed1dafe40aad8334a3ff079e7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/quiz/assets/img/spr_gaben.png b/scenes/quiz/assets/img/spr_gaben.png new file mode 100644 index 0000000..59db213 Binary files /dev/null and b/scenes/quiz/assets/img/spr_gaben.png differ diff --git a/scenes/quiz/assets/img/spr_gaben.png.import b/scenes/quiz/assets/img/spr_gaben.png.import new file mode 100644 index 0000000..630076a --- /dev/null +++ b/scenes/quiz/assets/img/spr_gaben.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://osremlye7c4g" +path="res://.godot/imported/spr_gaben.png-ca26bcc03916ff70fec997c15eccb1da.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/quiz/assets/img/spr_gaben.png" +dest_files=["res://.godot/imported/spr_gaben.png-ca26bcc03916ff70fec997c15eccb1da.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/quiz/assets/scripts/dialog.gd b/scenes/quiz/assets/scripts/dialog.gd new file mode 100644 index 0000000..0d37fbf --- /dev/null +++ b/scenes/quiz/assets/scripts/dialog.gd @@ -0,0 +1,224 @@ +extends RichTextLabel +var dnum +var displaying = false +var currentlyDisplaying = "" +var secretCode = randi_range(100000, 999999) +var quizCorrect = false +var quizAnswered = false +var freeze = false +signal gabeTrigger +signal gabeExit +signal shounicTrigger +signal shounicExit +signal fadeToBlack +signal unfade + +func _ready(): + dnum = 0 + displaySlow("A peaceful day in VALVe HQ") + unfade.emit() + +func displaySlow(txt): + currentlyDisplaying = txt + displaying = true + var doneChars = "" + for character in txt: + if displaying: + doneChars = doneChars + character + await get_tree().create_timer(0.015).timeout + if displaying: + text = doneChars + if not get_child(0).playing: + get_child(0).play() + else: + break + else: + break + currentlyDisplaying = "" + displaying = false + +func _on_continue_pressed(): + if not currentlyDisplaying and not freeze: + match dnum: + -1: + var save = FileAccess.open("user://secrets.sds", FileAccess.WRITE) + var json = JSON.new() + var err = json.parse(Marshalls.base64_to_utf8(save.get_as_text())) + if err == OK: + var data = json.data + data["quizSecretOne"] = secretCode + save.store_string(Marshalls.utf8_to_base64(JSON.stringify(data))) + else: + save.store_string(Marshalls.utf8_to_base64(JSON.stringify({"quizSecretOne": secretCode}))) + text = "Psst, use code " + str(secretCode) + "!" + dnum = -2 + 0: + displaySlow("Oh?") + 1: + gabeTrigger.emit() + displaySlow("Hi, I'm Gabe Newell!") + get_parent().get_child(1).text = "Gabe Newell" + get_parent().get_child(1).visible = true + 2: + displaySlow("I'd like to invite you to a quiz at VALVe HQ!") + 3: + displaySlow("It's a TF2 Trivia thing. You will be going against many famous TF2ubers, like Shounic... Shounic... and erm, shounic (we couldn't get permission from LazyPurple).") + 4: + displaySlow("Will you accept?") + get_node("/root/Control/Continue").visible = false + get_node("/root/Control/YesNo").visible = true + 6: + displaySlow("I'll see you then soon!") + fadeToBlack.emit() + 7: + get_parent().get_child(1).visible = false + displaySlow("2 Hours later...") + unfade.emit() + 8: + get_parent().get_child(1).visible = true + displaySlow("Hi!") + 9: + displaySlow("The quiz is ready now! I'll go call shounic.") + gabeExit.emit() + 10: + get_parent().get_child(1).text = "Shounic" + displaySlow("Hi.") + shounicTrigger.emit() + 11: + displaySlow("So apparently to celebrate them embracing treadmill work, we are doing a trivia quiz.") + 12: + displaySlow("Neat.") + 13: + displaySlow("What's your name?") + 14: + displaySlow("Your name is \"Chat\"? That's a very strange name.") + 15: + displaySlow("It also sounds oddly familiar...") + 16: + displaySlow("Anyways, let's get on with the quiz.") + 17: + shounicExit.emit() + gabeTrigger.emit() + get_node("/root/Control/Continue").visible = false + get_parent().get_child(1).text = "Gabe Newell" + displaySlow("Which one of these is not a real item?") + get_node("/root/Control/QuizAnswers").visible = true + for i in range(500): + await get_tree().create_timer(0.01).timeout + if quizAnswered: + break + get_node("/root/Control/QuizAnswers").visible = false + get_node("/root/Control/Continue").visible = true + get_parent().get_child(1).text = "Shounic" + if !quizCorrect: + dnum = 21 + get_node("/root/Control/Continue").emit_signal("pressed") + gabeExit.emit() + shounicTrigger.emit() + 18: + displaySlow("That's... right (it got removed).") + 19: + get_parent().get_child(1).text = "Gabe Newell" + displaySlow("Welp, that's all we have time for. See you in another 2-4 years for the next quiz!") + 20: + get_parent().get_child(1).text = "Shounic" + displaySlow("That was underwealming...") + var transparency = 0 + freeze = true + for i in range(100): + transparency += 0.01 + await get_tree().create_timer(0.01).timeout + get_node("/root/Control/FadeToBlack").color = Color(0, 0, 0, transparency) + await get_tree().create_timer(0.01).timeout + get_tree().change_scene_to_file("res://scenes/house/house.tscn") + 21: + displaySlow("It's the community jarate. It used to exist but got removed.") + dnum = 20 + 22: + freeze = true + displaySlow("Congratulations. You are a loser.") + var transparency = 0 + for i in range(100): + transparency += 0.01 + await get_tree().create_timer(0.01).timeout + get_node("/root/Control/FadeToBlack").color = Color(0, 0, 0, transparency) + await get_tree().create_timer(0.01).timeout + get_tree().change_scene_to_file("res://scenes/house/house.tscn") + dnum += 1 + elif not freeze: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" + + +func _on_no_pressed(): + if not currentlyDisplaying: + match dnum: + 5: + get_parent().get_child(1).visible = false + get_node("/root/Control/YesNo").visible = false + get_node("/root/Control/Continue").visible = true + displaySlow("You get up slowly, and leave the building") + DirAccess.remove_absolute("user:///chapter.sds") + var save = FileAccess.open("user://endings.sds", FileAccess.READ_WRITE) + var json = JSON.new() + var err = json.parse(Marshalls.base64_to_utf8(save.get_as_text())) + if err == OK: + var data = json.data + data["end_bldleave"] = "1" + save.store_string(Marshalls.utf8_to_base64(JSON.stringify(data))) + else: + save.store_string(Marshalls.utf8_to_base64(JSON.stringify({"end_bldleave": "1"}))) + var transparency = 0 + dnum = -2 + for i in range(100): + transparency += 0.01 + await get_tree().create_timer(0.01).timeout + get_node("/root/Control/FadeToBlack").color = Color(0, 0, 0, transparency) + await get_tree().create_timer(0.01).timeout + get_tree().change_scene_to_file("res://scenes/menu/menu.tscn") + dnum += 1 + else: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" + +func _on_yes_pressed(): + if not currentlyDisplaying: + match dnum: + 5: + get_node("/root/Control/YesNo").visible = false + get_node("/root/Control/Continue").visible = true + displaySlow("Great!") + dnum += 1 + else: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" + + +func _on_three_years_pressed(): + if not currentlyDisplaying: + quizAnswered = true + else: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" + + +func _on_five_years_pressed(): + if not currentlyDisplaying: + quizAnswered = true + else: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" + +func _on_nine_years_pressed(): + if not currentlyDisplaying: + quizCorrect = true + quizAnswered = true + else: + displaying = false + text = currentlyDisplaying + currentlyDisplaying = "" diff --git a/scenes/quiz/assets/scripts/gabeSlide.gd b/scenes/quiz/assets/scripts/gabeSlide.gd new file mode 100644 index 0000000..74da5d0 --- /dev/null +++ b/scenes/quiz/assets/scripts/gabeSlide.gd @@ -0,0 +1,31 @@ +extends TextureRect +var slide = false +var exit = false +var originalPosition + +func _ready(): + position.x = get_viewport_rect().size.x + 500 + position.y = get_viewport_rect().size.y - 500 + originalPosition = position + +func _physics_process(delta): + if slide: + var targetPosition = Vector2.ONE + targetPosition.y = position.y + targetPosition.x = get_viewport_rect().size.x / 2 - 250 + position = position.lerp(targetPosition, 5 * delta) + elif exit: + position = position.lerp(originalPosition, 5 * delta) + originalPosition.x = get_viewport_rect().size.x + 500 + originalPosition.y = get_viewport_rect().size.y - 500 + +func _on_dialog_gabe_trigger(): + visible = true + slide = true + exit = false + + +func _on_dialog_gabe_exit(): + visible = true + exit = true + slide = false diff --git a/scenes/quiz/quiz.tscn b/scenes/quiz/quiz.tscn new file mode 100644 index 0000000..c4fb28e --- /dev/null +++ b/scenes/quiz/quiz.tscn @@ -0,0 +1,200 @@ +[gd_scene load_steps=12 format=3 uid="uid://cjcf0u7x52y1g"] + +[ext_resource type="Texture2D" uid="uid://dqf36vgpolfwp" path="res://scenes/quiz/assets/img/bg_valve.jpg" id="1_1cyln"] +[ext_resource type="Theme" uid="uid://yd1uwltn3go" path="res://scenes/global/assets/themes/dialogButton.tres" id="2_1mnp5"] +[ext_resource type="Texture2D" uid="uid://osremlye7c4g" path="res://scenes/quiz/assets/img/spr_gaben.png" id="2_teunp"] +[ext_resource type="Script" path="res://scenes/quiz/assets/scripts/dialog.gd" id="2_yei7c"] +[ext_resource type="Script" path="res://scenes/quiz/assets/scripts/gabeSlide.gd" id="3_j3iw5"] +[ext_resource type="Texture2D" uid="uid://b0eqsc8687qvi" path="res://scenes/global/assets/img/spr_sho.webp" id="4_2ctld"] +[ext_resource type="Script" path="res://scenes/global/assets/scripts/fadetoblack.gd" id="4_asb44"] +[ext_resource type="Script" path="res://scenes/global/assets/scripts/shounicSlide.gd" id="5_073wf"] +[ext_resource type="AudioStream" uid="uid://dtd5bdeqy4m0r" path="res://scenes/global/assets/wav/snd_shounic_byte.wav" id="6_jccdi"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jkt8c"] +bg_color = Color(0.184314, 0.184314, 0.184314, 0.898039) +border_width_left = 5 +border_width_right = 5 +border_color = Color(0.184314, 0.184314, 0.184314, 0.898039) + +[sub_resource type="Theme" id="Theme_1ajjm"] +Label/styles/normal = SubResource("StyleBoxFlat_jkt8c") + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Background" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("1_1cyln") +expand_mode = 3 +stretch_mode = 6 + +[node name="GabeN" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -500.0 +offset_top = -500.0 +grow_horizontal = 0 +grow_vertical = 0 +texture = ExtResource("2_teunp") +expand_mode = 1 +stretch_mode = 6 +script = ExtResource("3_j3iw5") + +[node name="Shounic" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -500.0 +offset_top = -500.0 +grow_horizontal = 0 +grow_vertical = 0 +texture = ExtResource("4_2ctld") +expand_mode = 1 +stretch_mode = 6 +script = ExtResource("5_073wf") + +[node name="FadeToBlack" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +color = Color(0, 0, 0, 1) +script = ExtResource("4_asb44") + +[node name="Continue" type="Button" parent="."] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -60.0 +grow_horizontal = 2 +grow_vertical = 0 +theme = ExtResource("2_1mnp5") +text = "Continue +" + +[node name="YesNo" type="HFlowContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -60.0 +grow_horizontal = 2 +grow_vertical = 0 + +[node name="No" type="Button" parent="YesNo"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_1mnp5") +text = "No" + +[node name="Yes" type="Button" parent="YesNo"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_1mnp5") +text = "Yes" + +[node name="QuizAnswers" type="HFlowContainer" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -60.0 +grow_horizontal = 2 +grow_vertical = 0 + +[node name="threeYears" type="Button" parent="QuizAnswers"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_1mnp5") +text = "Self Made Short Circuit" + +[node name="fiveYears" type="Button" parent="QuizAnswers"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_1mnp5") +text = "Unusual Golden Frying Pan" + +[node name="nineYears" type="Button" parent="QuizAnswers"] +layout_mode = 2 +size_flags_horizontal = 3 +theme = ExtResource("2_1mnp5") +text = "Community Jarate" + +[node name="DContainer" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -260.0 +offset_bottom = -60.0 +grow_horizontal = 2 +grow_vertical = 0 +color = Color(0.184314, 0.184314, 0.184314, 0.560784) + +[node name="Dialog" type="RichTextLabel" parent="DContainer"] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 25.0 +offset_top = -175.0 +offset_right = -52.0 +offset_bottom = -25.0 +grow_horizontal = 2 +grow_vertical = 0 +theme_override_colors/default_color = Color(1, 1, 1, 1) +theme_override_font_sizes/normal_font_size = 30 +script = ExtResource("2_yei7c") + +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="DContainer/Dialog"] +stream = ExtResource("6_jccdi") + +[node name="Label" type="Label" parent="DContainer"] +visible = false +layout_mode = 0 +offset_top = -40.0 +offset_right = 176.0 +theme = SubResource("Theme_1ajjm") +theme_override_font_sizes/font_size = 29 +text = "Placeholder" + +[connection signal="pressed" from="Continue" to="DContainer/Dialog" method="_on_continue_pressed"] +[connection signal="pressed" from="YesNo/No" to="DContainer/Dialog" method="_on_no_pressed"] +[connection signal="pressed" from="YesNo/Yes" to="DContainer/Dialog" method="_on_yes_pressed"] +[connection signal="pressed" from="QuizAnswers/threeYears" to="DContainer/Dialog" method="_on_three_years_pressed"] +[connection signal="pressed" from="QuizAnswers/fiveYears" to="DContainer/Dialog" method="_on_five_years_pressed"] +[connection signal="pressed" from="QuizAnswers/nineYears" to="DContainer/Dialog" method="_on_nine_years_pressed"] +[connection signal="fadeToBlack" from="DContainer/Dialog" to="FadeToBlack" method="_on_dialog_fade_to_black"] +[connection signal="gabeExit" from="DContainer/Dialog" to="GabeN" method="_on_dialog_gabe_exit"] +[connection signal="gabeTrigger" from="DContainer/Dialog" to="GabeN" method="_on_dialog_gabe_trigger"] +[connection signal="shounicExit" from="DContainer/Dialog" to="Shounic" method="_on_dialog_shounic_exit"] +[connection signal="shounicTrigger" from="DContainer/Dialog" to="Shounic" method="_on_dialog_shounic_trigger"] +[connection signal="unfade" from="DContainer/Dialog" to="FadeToBlack" method="_on_dialog_unfade"]