diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 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 Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + 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 AGPL, see +. diff --git a/README.md b/README.md index ffa88ef..f0aa270 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,10 @@ Current heroes: - Offensive: - IRA (WallMAKING mfer) - LUSSURIA (An ATTRACTIVE mfer) + - PAZIENZA (Slow down at a distance) - Support: - CARITAS (Margarine) + - SUPERBIA (Build portals) Ideas for Heroes: @@ -31,16 +33,17 @@ Ideas for Heroes: - Blink (Tracer) - no cooldown, but loses all speed on hitting walls - Heavy guy - Slow, but very heavy for the see-saw - Climb and glide abilities + - JUMPING - More supportive - Boost - Area of effect or zarya-like cast, speeds people up - Flop - Changes side of see-saw for each team (should it be mechanic instead??) - Build - Build Zineth-like rails for anyone to use - - Teleportation - (for others! or maybe including the enemy too!) - - Portal 2-like gels (bounce, speed, slow?) + - (Combine with IRA?) Portal 2-like gels (bounce, speed, slow?) + - (Combine with LUSSURIA?) Hook and swing on terrain - More offensive - - Lay walls - Lay traps - - Destroy buildings + - (Combine with PAZIENZA?) Destroy buildings + - (Combine wit LUSSURIA?) Hold, then release to explode enemies away Key concepts: diff --git a/doc.md b/docs/doc.md similarity index 100% rename from doc.md rename to docs/doc.md diff --git a/icon.png b/icon.png index a0b64ee..ac8eeb9 100644 Binary files a/icon.png and b/icon.png differ diff --git a/plans.md b/plans.md index 012dd55..0fde1f4 100644 --- a/plans.md +++ b/plans.md @@ -4,25 +4,37 @@ All TODO / design direction that's not in the README Big TODOs: - Keep implementing more heroes +- Figure out how to make things seem more fast-paced +- ^ I think you need more abilities for heroes, that combine well + - Like, you could combine PAZIENZA with [destroys buildings] - Start making maps and figuring out what works / what you like + - I'd love to do a payload map! + - More platforming for everyone (It's industria only rn tbh) + - Give portals a tilted wall to fuck with acceleration + - Change portal mechanics to be more PortalTM-y? - Make a real user interface + - Menu 1: (Play Game, and Custom Game) Custom -> Current menu - Voice chat +- Auto-update :((((( Smaller TODOs: - Too much time "waiting" - too hard to get to objective -- Allow non-playing server to keep running and connecting people - Art? - Particles - wall destruction, wallriding - Ira is OP? -- Industria is too individual? -- player_name.gd:15 (error on Silas's=client side) + - Nerfed - 5 walls +- Make motion more reactive? +- Grab someone and draw an impulse on them + - Combine with SUPERBIA, use charge to build portals Bugs: Landmarks: -When you have a workable demo: @mention @turion@mastodon.art +- When you have a workable demo: @mention @turion@mastodon.art +- As soon as you can auto-update, have matchmaking, and it's playable, release on CG +- As soon as you think it's a fun game and can handle the load, post on reddit Design ideas too long for the README: diff --git a/project.godot b/project.godot index 8aff89d..5d343c5 100644 --- a/project.godot +++ b/project.godot @@ -10,7 +10,7 @@ config_version=3 [application] -config/name="mv-moba" +config/name="nv-moba" run/main_scene="res://scenes/lobby.tscn" config/icon="res://icon.png" @@ -21,6 +21,7 @@ util="*res://scripts/util.gd" [input] move_forwards=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":44,"unicode":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":58,"unicode":0,"echo":false,"script":null) ] move_backwards=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":79,"unicode":0,"echo":false,"script":null) ] @@ -54,6 +55,14 @@ hero_5_confirm_portal=[ Object(InputEventMouseButton,"resource_local_to_scene":f ] hero_5_remove_portal=[ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null) ] +primary_ability=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":46,"unicode":0,"echo":false,"script":null) + ] +hero_0_boost=[ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +primary_mouse=[ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +enable_cheats=[ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":true,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":45,"unicode":0,"echo":false,"script":null) + ] [rendering] diff --git a/scenes/ability_icon.tscn b/scenes/ability_icon.tscn new file mode 100644 index 0000000..f1e4a25 --- /dev/null +++ b/scenes/ability_icon.tscn @@ -0,0 +1,146 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://scripts/ability_icon.gd" type="Script" id=1] + +[sub_resource type="StyleBoxFlat" id=2] + +content_margin_left = -1.0 +content_margin_right = -1.0 +content_margin_top = -1.0 +content_margin_bottom = -1.0 +bg_color = Color( 0.0297089, 0.230469, 0.206942, 1 ) +draw_center = true +border_width_left = 0 +border_width_top = 0 +border_width_right = 0 +border_width_bottom = 0 +border_color = Color( 0.8, 0.8, 0.8, 1 ) +border_blend = false +corner_radius_top_left = 0 +corner_radius_top_right = 0 +corner_radius_bottom_right = 0 +corner_radius_bottom_left = 0 +corner_detail = 8 +expand_margin_left = 0.0 +expand_margin_right = 0.0 +expand_margin_top = 0.0 +expand_margin_bottom = 0.0 +shadow_color = Color( 0, 0, 0, 0.6 ) +shadow_size = 0 +anti_aliasing = true +anti_aliasing_size = 1 + +[sub_resource type="StyleBoxFlat" id=1] + +content_margin_left = -1.0 +content_margin_right = -1.0 +content_margin_top = -1.0 +content_margin_bottom = -1.0 +bg_color = Color( 0.73822, 0.921875, 0.814265, 0.403333 ) +draw_center = true +border_width_left = 0 +border_width_top = 0 +border_width_right = 0 +border_width_bottom = 0 +border_color = Color( 0.8, 0.8, 0.8, 1 ) +border_blend = false +corner_radius_top_left = 0 +corner_radius_top_right = 0 +corner_radius_bottom_right = 0 +corner_radius_bottom_left = 0 +corner_detail = 8 +expand_margin_left = 0.0 +expand_margin_right = 0.0 +expand_margin_top = 0.0 +expand_margin_bottom = 0.0 +shadow_color = Color( 0, 0, 0, 0.6 ) +shadow_size = 0 +anti_aliasing = true +anti_aliasing_size = 1 + +[node name="Ability" type="Control"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = -6.0 +margin_top = -4.0 +margin_right = 5.0 +margin_bottom = 5.0 +rect_pivot_offset = Vector2( 0, 0 ) +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 0 +script = ExtResource( 1 ) +cost = 1 +ability_name = "Ability" +display_progress = true + +[node name="Bar" type="ProgressBar" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = -20.0 +margin_top = -21.0 +margin_right = 30.0 +margin_bottom = 28.0 +rect_pivot_offset = Vector2( 0, 0 ) +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 0 +custom_styles/fg = SubResource( 2 ) +custom_styles/bg = SubResource( 1 ) +min_value = 0.0 +max_value = 100.0 +step = 1.0 +page = 0.0 +value = 0.0 +exp_edit = false +rounded = false +percent_visible = false + +[node name="Available" type="ColorRect" parent="." index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = -25.0 +margin_top = -26.0 +margin_right = 25.0 +margin_bottom = 23.0 +rect_pivot_offset = Vector2( 0, 0 ) +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 0 +color = Color( 0.347443, 0.898438, 0.549761, 1 ) + +[node name="Name" type="Label" parent="." index="2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = -65.0 +margin_top = 36.0 +margin_right = 77.0 +margin_bottom = 50.0 +rect_pivot_offset = Vector2( 0, 0 ) +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +custom_colors/font_color = Color( 0.00357056, 0.0703125, 0.04372, 1 ) +text = "" +align = 1 +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + + diff --git a/scenes/ai.tscn b/scenes/ai.tscn index 43c8512..7da562d 100644 --- a/scenes/ai.tscn +++ b/scenes/ai.tscn @@ -2,7 +2,7 @@ [ext_resource path="res://scripts/ai.gd" type="Script" id=1] -[node name="Node" type="Node" index="0"] +[node name="Node" type="Node"] script = ExtResource( 1 ) diff --git a/scenes/hero_select.tscn b/scenes/hero_select.tscn index c3e0e9b..4c1b1be 100644 --- a/scenes/hero_select.tscn +++ b/scenes/hero_select.tscn @@ -3,7 +3,7 @@ [ext_resource path="res://scripts/hero_select_screen.gd" type="Script" id=1] [ext_resource path="res://scripts/hero_select.gd" type="Script" id=2] -[node name="HeroSelect" type="ColorRect" index="0"] +[node name="HeroSelect" type="ColorRect"] pause_mode = 2 anchor_left = 0.0 @@ -17,7 +17,6 @@ size_flags_horizontal = 1 size_flags_vertical = 1 color = Color( 0.097229, 0.104696, 0.105469, 1 ) script = ExtResource( 1 ) -_sections_unfolded = [ "Anchor", "Margin", "Material", "Pause", "Visibility" ] [node name="Hero" type="OptionButton" parent="." index="0"] diff --git a/scenes/heroes/0.tscn b/scenes/heroes/0.tscn index c6941cf..e43947c 100644 --- a/scenes/heroes/0.tscn +++ b/scenes/heroes/0.tscn @@ -1,11 +1,12 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://scenes/player.tscn" type="PackedScene" id=1] [ext_resource path="res://scripts/heroes/0.gd" type="Script" id=2] [ext_resource path="res://assets/heroes/0_head.obj" type="ArrayMesh" id=3] [ext_resource path="res://assets/heroes/0.obj" type="ArrayMesh" id=4] +[ext_resource path="res://scenes/ability_icon.tscn" type="PackedScene" id=5] -[node name="RigidBody" index="0" instance=ExtResource( 1 )] +[node name="RigidBody" instance=ExtResource( 1 )] script = ExtResource( 2 ) @@ -13,16 +14,28 @@ script = ExtResource( 2 ) transform = Transform( 0.376731, 0, 6.23012e-08, -6.13772e-08, 1.03258e-14, 0.382402, 0, -0.389018, 1.01502e-14, 0, 0.104562, -0.0173855 ) mesh = ExtResource( 3 ) -material/0 = null [node name="MainMesh" parent="Yaw" index="1"] transform = Transform( 0.409321, 0, 0, 0, -7.39614e-08, -0.453971, 0, 0.389055, -6.33852e-08, 0.0432051, 0.588691, 0.0666541 ) mesh = ExtResource( 4 ) -material/0 = null [node name="Crosshair" parent="MasterOnly" index="0"] text = "" +[node name="ProgressBar" parent="MasterOnly" index="1" instance=ExtResource( 5 )] + +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -91.0 +margin_top = -118.0 +margin_right = -80.0 +margin_bottom = -109.0 +cost = 2 +ability_name = "Speed Boost" +display_progress = false + diff --git a/scenes/heroes/1.tscn b/scenes/heroes/1.tscn index 39d4b67..b946c09 100644 --- a/scenes/heroes/1.tscn +++ b/scenes/heroes/1.tscn @@ -10,7 +10,7 @@ radius = 0.5 height = 0.5 -[node name="RigidBody" index="0" instance=ExtResource( 1 )] +[node name="RigidBody" instance=ExtResource( 1 )] script = ExtResource( 2 ) diff --git a/scenes/heroes/1_wall.tscn b/scenes/heroes/1_wall.tscn index ef4c041..82a22f4 100644 --- a/scenes/heroes/1_wall.tscn +++ b/scenes/heroes/1_wall.tscn @@ -13,7 +13,7 @@ subdivide_depth = 0 extents = Vector3( 1.5, 1.5, 0.25 ) -[node name="StaticBody" type="StaticBody" index="0"] +[node name="StaticBody" type="StaticBody"] input_ray_pickable = true input_capture_on_drag = false @@ -40,13 +40,11 @@ lod_max_hysteresis = 0.0 mesh = SubResource( 1 ) skeleton = NodePath("..") material/0 = null -_sections_unfolded = [ "Transform" ] [node name="CollisionShape" type="CollisionShape" parent="." index="1"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0, -1.5 ) shape = SubResource( 2 ) disabled = true -_sections_unfolded = [ "Transform" ] diff --git a/scenes/heroes/2.tscn b/scenes/heroes/2.tscn index e35df0a..84fb508 100644 --- a/scenes/heroes/2.tscn +++ b/scenes/heroes/2.tscn @@ -51,7 +51,6 @@ reverb_bus_enable = false reverb_bus_name = "Master" reverb_bus_amount = 0.0 reverb_bus_uniformity = 0.0 -_sections_unfolded = [ "Audio Bus", "Collision", "Pause", "Reverb Bus", "Transform", "Visibility" ] [node name="CollisionShape" type="CollisionShape" parent="Area" index="0"] diff --git a/scenes/heroes/3.tscn b/scenes/heroes/3.tscn index 49bc1fa..8143d62 100644 --- a/scenes/heroes/3.tscn +++ b/scenes/heroes/3.tscn @@ -9,7 +9,6 @@ contacts_reported = 3 script = ExtResource( 2 ) -_sections_unfolded = [ "Angular", "Axis Lock", "Collision", "Linear", "Pause", "Transform", "Visibility", "collision" ] [node name="RotatedHead" parent="Yaw/Pitch" index="0"] diff --git a/scenes/heroes/4.tscn b/scenes/heroes/4.tscn index 4f7a650..02afe69 100644 --- a/scenes/heroes/4.tscn +++ b/scenes/heroes/4.tscn @@ -1,12 +1,13 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://scenes/player.tscn" type="PackedScene" id=1] [ext_resource path="res://scripts/heroes/4.gd" type="Script" id=2] [ext_resource path="res://assets/heroes/4_head.obj" type="ArrayMesh" id=3] [ext_resource path="res://assets/heroes/4_beam.obj" type="ArrayMesh" id=4] [ext_resource path="res://assets/heroes/4.obj" type="ArrayMesh" id=5] +[ext_resource path="res://scenes/ability_icon.tscn" type="PackedScene" id=6] -[node name="RigidBody" index="0" instance=ExtResource( 1 )] +[node name="RigidBody" instance=ExtResource( 1 )] script = ExtResource( 2 ) @@ -29,10 +30,22 @@ lod_max_hysteresis = 0.0 mesh = ExtResource( 4 ) skeleton = NodePath("..") material/0 = null -_sections_unfolded = [ "Transform" ] [node name="MainMesh" parent="Yaw" index="1"] mesh = ExtResource( 5 ) +[node name="Destroy" parent="MasterOnly" index="2" instance=ExtResource( 6 )] + +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -109.0 +margin_top = -100.0 +margin_right = -98.0 +margin_bottom = -91.0 +cost = 0 +ability_name = "Destroy" + diff --git a/scenes/heroes/5.tscn b/scenes/heroes/5.tscn index ddd94c7..6dfbdbc 100644 --- a/scenes/heroes/5.tscn +++ b/scenes/heroes/5.tscn @@ -1,11 +1,12 @@ -[gd_scene load_steps=5 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://scenes/player.tscn" type="PackedScene" id=1] [ext_resource path="res://scripts/heroes/5.gd" type="Script" id=2] [ext_resource path="res://assets/heroes/5_head.obj" type="ArrayMesh" id=3] [ext_resource path="res://assets/heroes/5.obj" type="ArrayMesh" id=4] +[ext_resource path="res://scenes/ability_icon.tscn" type="PackedScene" id=5] -[node name="RigidBody" index="0" instance=ExtResource( 1 )] +[node name="RigidBody" instance=ExtResource( 1 )] script = ExtResource( 2 ) @@ -19,4 +20,30 @@ mesh = ExtResource( 3 ) transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.556542, 0 ) mesh = ExtResource( 4 ) +[node name="Portal" parent="MasterOnly" index="2" instance=ExtResource( 5 )] + +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -160.0 +margin_top = -112.0 +margin_right = -149.0 +margin_bottom = -103.0 +cost = 20 +ability_name = "Build Portal" + +[node name="Teleport" parent="MasterOnly" index="3" instance=ExtResource( 5 )] + +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -70.0 +margin_top = -112.0 +margin_right = -59.0 +margin_bottom = -103.0 +cost = 5 +ability_name = "Teleport" + diff --git a/scenes/heroes/5_portal.tscn b/scenes/heroes/5_portal.tscn index 768919b..566c829 100644 --- a/scenes/heroes/5_portal.tscn +++ b/scenes/heroes/5_portal.tscn @@ -58,7 +58,7 @@ distance_fade_enable = false points = PoolVector3Array( -0.746582, -0.00657654, 0.750488, 0.75293, 0.41748, 0.750488, 0.75293, -0.00657654, 0.750488, -0.746582, -0.00657654, -0.749023, -0.746582, 0.41748, 0.750488, -0.746582, -0.00657654, 0.750488, 0.75293, -0.00657654, -0.749023, -0.746582, 0.41748, -0.749023, -0.746582, -0.00657654, -0.749023, 0.75293, -0.00657654, 0.750488, 0.75293, 0.41748, -0.749023, 0.75293, -0.00657654, -0.749023, 0.541016, -0.00657654, -0.537598, -0.746582, -0.00657654, -0.749023, -0.535156, -0.00657654, -0.537598, 0.75293, 0.41748, 0.750488, 0.541016, 0.41748, -0.537598, 0.75293, 0.41748, -0.749023, -0.535156, -0.00657654, -0.537598, 0.541016, 0.41748, -0.537598, 0.541016, -0.00657654, -0.537598, -0.535156, -0.00657654, 0.538574, -0.535156, 0.41748, -0.537598, -0.535156, -0.00657654, -0.537598, -0.746582, 0.41748, -0.749023, -0.535156, 0.41748, 0.538574, -0.746582, 0.41748, 0.750488, 0.541016, -0.00657654, 0.538574, -0.535156, 0.41748, 0.538574, -0.535156, -0.00657654, 0.538574, 0.541016, -0.00657654, -0.537598, 0.541016, 0.41748, 0.538574, 0.541016, -0.00657654, 0.538574, 0.75293, -0.00657654, -0.749023, 0.541016, -0.00657654, 0.538574, 0.75293, -0.00657654, 0.750488, -0.746582, 0.41748, 0.750488, -0.746582, 0.41748, -0.749023, 0.75293, 0.41748, -0.749023, 0.75293, 0.41748, 0.750488, -0.746582, -0.00657654, 0.750488, -0.535156, -0.00657654, 0.538574, -0.535156, 0.41748, -0.537598, 0.541016, 0.41748, 0.538574, -0.535156, 0.41748, -0.537598, -0.535156, 0.41748, 0.538574, 0.541016, 0.41748, 0.538574, 0.541016, 0.41748, -0.537598 ) -[node name="StaticBody" type="StaticBody" index="0"] +[node name="StaticBody" type="StaticBody"] input_ray_pickable = true input_capture_on_drag = false @@ -69,7 +69,6 @@ bounce = 0.0 constant_linear_velocity = Vector3( 0, 0, 0 ) constant_angular_velocity = Vector3( 0, 0, 0 ) script = ExtResource( 1 ) -_sections_unfolded = [ "Collision" ] [node name="MeshInstance" type="MeshInstance" parent="." index="0"] @@ -86,7 +85,6 @@ lod_max_hysteresis = 0.0 mesh = ExtResource( 2 ) skeleton = NodePath("..") material/0 = SubResource( 1 ) -_sections_unfolded = [ "Transform", "Visibility" ] [node name="CollisionShape" type="CollisionShape" parent="." index="1"] diff --git a/scenes/level.tscn b/scenes/level.tscn index 0f1025a..fc34b1a 100644 --- a/scenes/level.tscn +++ b/scenes/level.tscn @@ -24,7 +24,6 @@ size = 16 use_mipmaps = false use_filter = false font_data = SubResource( 3 ) -_sections_unfolded = [ "Font", "Resource" ] [sub_resource type="ProceduralSky" id=5] @@ -45,7 +44,6 @@ sun_angle_max = 100.0 sun_curve = 0.05 sun_energy = 16.0 texture_size = 2 -_sections_unfolded = [ "Ground", "Sky" ] [sub_resource type="Environment" id=6] @@ -125,9 +123,8 @@ adjustment_enabled = false adjustment_brightness = 1.0 adjustment_contrast = 1.0 adjustment_saturation = 1.0 -_sections_unfolded = [ "Background" ] -[node name="Level" type="Spatial" index="0"] +[node name="Level" type="Spatial"] [node name="DirectionalLight" type="DirectionalLight" parent="." index="0"] @@ -158,7 +155,6 @@ directional_shadow_max_distance = 200.0 [node name="Players" type="Spatial" parent="." index="1"] -_sections_unfolded = [ "Transform", "Visibility" ] [node name="Ball" type="RigidBody" parent="." index="2"] @@ -188,13 +184,11 @@ linear_velocity = Vector3( 0, 0, 0 ) linear_damp = -1.0 angular_velocity = Vector3( 0, 0, 0 ) angular_damp = -1.0 -_sections_unfolded = [ "Collision", "Pause", "Transform", "Visibility" ] [node name="CollisionShape" type="CollisionShape" parent="Ball" index="0"] shape = SubResource( 1 ) disabled = false -_sections_unfolded = [ "Transform", "Visibility" ] [node name="MeshInstance" type="MeshInstance" parent="Ball" index="1"] @@ -210,12 +204,10 @@ lod_max_hysteresis = 0.0 mesh = SubResource( 2 ) skeleton = NodePath("..") material/0 = null -_sections_unfolded = [ "Geometry", "Transform", "material" ] [node name="FullObjective" parent="." index="3" instance=ExtResource( 1 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -17.3706, 2.0316, 4.06596 ) -_sections_unfolded = [ "Transform" ] [node name="Debug" type="Label" parent="." index="4"] @@ -237,12 +229,10 @@ custom_fonts/font = SubResource( 4 ) percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "Anchor", "Focus", "Grow Direction", "Hint", "Margin", "Material", "Mouse", "Pause", "Rect", "Size Flags", "Theme", "Visibility", "custom_colors", "custom_constants", "custom_fonts", "custom_styles" ] [node name="LeftSpawn" type="Spatial" parent="." index="5"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.96426, 9.36109 ) -_sections_unfolded = [ "Transform" ] [node name="RightSpawn" type="Spatial" parent="." index="6"] diff --git a/scenes/levels/0.tscn b/scenes/levels/0.tscn index c88ca26..bd1aa88 100644 --- a/scenes/levels/0.tscn +++ b/scenes/levels/0.tscn @@ -7,7 +7,7 @@ data = PoolVector3Array( -1.0918, 21.3594, 42.5313, -1.0918, 20.3906, 42.5313, -1.0918, 19.5625, 33.5313, -1.0918, 19.5625, 33.5313, -1.0918, 20.3906, 42.5313, -1.0918, 18.8906, 33.5313, -1.0918, 19.5625, 33.5313, -1.0918, 18.8906, 33.5313, -0.4729, 19.5625, 33.5313, -0.4729, 19.5625, 33.5313, -1.0918, 18.8906, 33.5313, -0.4729, 18.8906, 33.5313, -0.4729, 19.5625, 33.5313, -0.4729, 18.8906, 33.5313, -0.4729, 21.3594, 42.5313, -0.4729, 21.3594, 42.5313, -0.4729, 18.8906, 33.5313, -0.4729, 20.3906, 42.5313, -0.4729, 21.3594, 42.5313, -0.4729, 20.3906, 42.5313, -1.0918, 21.3594, 42.5313, -1.0918, 21.3594, 42.5313, -0.4729, 20.3906, 42.5313, -1.0918, 20.3906, 42.5313, -0.4729, 11.6328, 33.5313, -1.0918, 11.6328, 33.5313, -0.4729, 9.8125, 42.5313, -0.4729, 9.8125, 42.5313, -1.0918, 11.6328, 33.5313, -1.0918, 9.8125, 42.5313, -1.0918, 19.5625, 33.5313, -0.4729, 19.5625, 33.5313, -1.0918, 21.3594, 42.5313, -1.0918, 21.3594, 42.5313, -0.4729, 19.5625, 33.5313, -0.4729, 21.3594, 42.5313, -0.4729, 10.3594, 42.5313, -0.4729, 9.8125, 42.5313, -1.0918, 10.3594, 42.5313, -1.0918, 10.3594, 42.5313, -0.4729, 9.8125, 42.5313, -1.0918, 9.8125, 42.5313, -0.4729, 11.8516, 33.5313, -0.4729, 11.6328, 33.5313, 5.8164, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, -0.4729, 11.6328, 33.5313, 5.8164, 11.6328, 33.5313, -1.0918, 11.8516, 33.5313, -1.0918, 11.6328, 33.5313, -0.4729, 11.8516, 33.5313, -0.4729, 11.8516, 33.5313, -1.0918, 11.6328, 33.5313, -0.4729, 11.6328, 33.5313, -1.0918, 9.8125, 42.5313, -1.0918, 11.6328, 33.5313, -9.4531, 9.8125, 42.5313, -9.4531, 9.8125, 42.5313, -1.0918, 11.6328, 33.5313, -7.6992, 11.6328, 33.5313, -0.4729, 20.3906, 42.5313, -0.4729, 10.3594, 42.5313, -1.0918, 20.3906, 42.5313, -1.0918, 20.3906, 42.5313, -0.4729, 10.3594, 42.5313, -1.0918, 10.3594, 42.5313, -0.4729, 18.8906, 33.5313, -0.4729, 11.8516, 33.5313, -0.4729, 20.3906, 42.5313, -0.4729, 20.3906, 42.5313, -0.4729, 11.8516, 33.5313, -0.4729, 10.3594, 42.5313, -1.0918, 18.8906, 33.5313, -1.0918, 11.8516, 33.5313, -0.4729, 18.8906, 33.5313, -0.4729, 18.8906, 33.5313, -1.0918, 11.8516, 33.5313, -0.4729, 11.8516, 33.5313, -1.0918, 20.3906, 42.5313, -1.0918, 10.3594, 42.5313, -1.0918, 18.8906, 33.5313, -1.0918, 18.8906, 33.5313, -1.0918, 10.3594, 42.5313, -1.0918, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, 5.8164, 11.6328, 33.5313, 7.5703, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, 5.8164, 11.6328, 33.5313, 7.5703, 9.8125, 42.5313, -0.4729, 10.3594, 42.5313, -0.4729, 11.8516, 33.5313, -0.4729, 10.3594, 42.5313, -0.4729, 10.3594, 42.5313, -0.4729, 11.8516, 33.5313, -0.4729, 11.8516, 33.5313, -0.4729, 9.8125, 42.5313, -0.4729, 10.3594, 42.5313, 7.5703, 9.8125, 42.5313, 7.5703, 9.8125, 42.5313, -0.4729, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, -0.4729, 11.6328, 33.5313, -0.4729, 9.8125, 42.5313, 5.8164, 11.6328, 33.5313, 5.8164, 11.6328, 33.5313, -0.4729, 9.8125, 42.5313, 7.5703, 9.8125, 42.5313, -9.4531, 10.3594, 42.5313, -9.4531, 9.8125, 42.5313, -7.6992, 11.8516, 33.5313, -7.6992, 11.8516, 33.5313, -9.4531, 9.8125, 42.5313, -7.6992, 11.6328, 33.5313, -1.0918, 11.6328, 33.5313, -1.0918, 11.8516, 33.5313, -7.6992, 11.6328, 33.5313, -7.6992, 11.6328, 33.5313, -1.0918, 11.8516, 33.5313, -7.6992, 11.8516, 33.5313, -1.0918, 10.3594, 42.5313, -1.0918, 9.8125, 42.5313, -9.4531, 10.3594, 42.5313, -9.4531, 10.3594, 42.5313, -1.0918, 9.8125, 42.5313, -9.4531, 9.8125, 42.5313, -1.0918, 11.8516, 33.5313, -1.0918, 10.3594, 42.5313, -7.6992, 11.8516, 33.5313, -7.6992, 11.8516, 33.5313, -1.0918, 10.3594, 42.5313, -9.4531, 10.3594, 42.5313, -0.4729, 10.3594, 42.5313, -0.4729, 11.8516, 33.5313, 7.5703, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, -0.4729, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, 7.5703, 10.3594, 42.5313, 5.8164, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, 7.5703, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, -0.4729, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, 7.5703, 10.3594, 42.5313, -0.4729, 10.3594, 42.5313, -0.4729, 10.3594, 42.5313, -0.4729, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, -0.4729, 11.8516, 33.5313, -0.4729, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, 5.8164, 11.8516, 33.5313, 11.8984, 14.0156, 39.5938, 11.5781, 13.4844, 39.875, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 11.5781, 13.4844, 39.875, 6.7344, 13.4844, 34.25, 7.0547, 14.0234, 33.9688, 6.7344, 13.4844, 34.25, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 6.7344, 13.4844, 34.25, 10.2031, 9.8516, 31.25, 10.5234, 10.3906, 30.9844, 10.2031, 9.8516, 31.25, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 10.2031, 9.8516, 31.25, 15.0547, 9.8516, 36.875, 15.375, 10.3828, 36.5938, 15.0547, 9.8516, 36.875, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 15.0547, 9.8516, 36.875, 11.5781, 13.4844, 39.875, 10.2031, 9.8516, 31.25, 6.7344, 13.4844, 34.25, 15.0547, 9.8516, 36.875, 15.0547, 9.8516, 36.875, 6.7344, 13.4844, 34.25, 11.5781, 13.4844, 39.875, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 10.5234, 10.3906, 30.9844, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 15.375, 10.3828, 36.5938, 15.375, 10.3828, 36.5938, 11.8984, 14.0156, 39.5938, 11.8984, 14.0156, 39.5938, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 7.0547, 14.0234, 33.9688, 7.0547, 14.0234, 33.9688, 10.5234, 10.3906, 30.9844, 10.5234, 10.3906, 30.9844, 1, -1, 9.0938, 1, -1, 5.7617, -3.0859, -1, 9.0938, -3.0859, -1, 9.0938, 1, -1, 5.7617, -3.0859, -1, 5.7617, -3.0859, -0.4597, 5.7617, 1, -0.4597, 5.7617, -3.0859, 1.2002, 9.0938, -3.0859, 1.2002, 9.0938, 1, -0.4597, 5.7617, 0.9995, 1.2002, 9.0938, 1, -1, -12.9297, 1, -1, 5.7617, 1.7021, -1, -12.9297, 1.7021, -1, -12.9297, 1, -1, 5.7617, 1.7021, -1, 5.7617, 0.9995, 1.2002, 9.0938, 1, -1, 9.0938, -3.0859, 1.2002, 9.0938, -3.0859, 1.2002, 9.0938, 1, -1, 9.0938, -3.0859, -1, 9.0938, -3.0859, -0.4597, 5.7617, -3.0859, -1, 5.7617, -3.0859, -0.4597, -12.9297, -3.0859, -0.4597, -12.9297, -3.0859, -1, 5.7617, -3.0859, -1, -12.9297, 1, -1, -12.9297, 1, -0.4597, -12.9297, -3.0859, -1, -12.9297, -3.0859, -1, -12.9297, 1, -0.4597, -12.9297, -3.0859, -0.4597, -12.9297, -3.0859, 1.2002, 9.0938, -3.0859, -1, 9.0938, -3.0859, -0.4597, 5.7617, -3.0859, -0.4597, 5.7617, -3.0859, -1, 9.0938, -3.0859, -1, 5.7617, 1, -0.4597, -12.9297, 1.7021, -0.4597, -12.9297, 0.9995, 4.1836, -14.0234, 0.9995, 4.1836, -14.0234, 1.7021, -0.4597, -12.9297, 1.7021, 4.1836, -14.0234, -3.0859, -0.4597, -12.9297, 1, -0.4597, -12.9297, -3.0859, -0.4597, 5.7617, -3.0859, -0.4597, 5.7617, 1, -0.4597, -12.9297, 1, -0.4597, 5.7617, 1, -1, 5.7617, 1, -1, -12.9297, -3.0859, -1, 5.7617, -3.0859, -1, 5.7617, 1, -1, -12.9297, -3.0859, -1, -12.9297, 1, -1, -12.9297, 1, -1, 5.7617, 1, -1, -12.9297, 1, -1, -12.9297, 1, -1, 5.7617, 1, -1, 5.7617, 1.7021, -0.4597, 5.7617, 1.7021, -1, 5.7617, 1.7021, 1.2002, 9.0938, 1.7021, 1.2002, 9.0938, 1.7021, -1, 5.7617, 1.7021, -1, 9.0938, 1.7021, -0.4597, -12.9297, 1.7021, -1, -12.9297, 1.7021, -0.4597, 5.7617, 1.7021, -0.4597, 5.7617, 1.7021, -1, -12.9297, 1.7021, -1, 5.7617, 1, -0.4597, 5.7617, 1, -0.4597, -12.9297, 0.9995, 4.1836, 4.668, 0.9995, 4.1836, 4.668, 1, -0.4597, -12.9297, 0.9995, 4.1836, -14.0234, 1, -1, 9.0938, 0.9995, 1.2002, 9.0938, 1.7021, -1, 9.0938, 1.7021, -1, 9.0938, 0.9995, 1.2002, 9.0938, 1.7021, 1.2002, 9.0938, 1, -0.4597, -12.9297, 1, -1, -12.9297, 1.7021, -0.4597, -12.9297, 1.7021, -0.4597, -12.9297, 1, -1, -12.9297, 1.7021, -1, -12.9297, 1, -1, 5.7617, 1, -1, 9.0938, 1.7021, -1, 5.7617, 1.7021, -1, 5.7617, 1, -1, 9.0938, 1.7021, -1, 9.0938, 0.9995, 4.1836, 4.668, 0.9995, 4.1836, -14.0234, 1.7021, 4.1836, 4.668, 1.7021, 4.1836, 4.668, 0.9995, 4.1836, -14.0234, 1.7021, 4.1836, -14.0234, 0.9995, 5.8477, 8, 0.9995, 4.1836, 4.668, 1.7021, 5.8477, 8, 1.7021, 5.8477, 8, 0.9995, 4.1836, 4.668, 1.7021, 4.1836, 4.668, 0.9995, 1.2002, 9.0938, 1, -0.4597, 5.7617, 0.9995, 5.8477, 8, 0.9995, 5.8477, 8, 1, -0.4597, 5.7617, 0.9995, 4.1836, 4.668, 1.7021, -0.4597, -12.9297, 1.7021, -0.4597, 5.7617, 1.7021, 4.1836, -14.0234, 1.7021, 4.1836, -14.0234, 1.7021, -0.4597, 5.7617, 1.7021, 4.1836, 4.668, 1.7021, -0.4597, 5.7617, 1.7021, 1.2002, 9.0938, 1.7021, 4.1836, 4.668, 1.7021, 4.1836, 4.668, 1.7021, 1.2002, 9.0938, 1.7021, 5.8477, 8, 1.7021, 1.2002, 9.0938, 0.9995, 1.2002, 9.0938, 1.7021, 5.8477, 8, 1.7021, 5.8477, 8, 0.9995, 1.2002, 9.0938, 0.9995, 5.8477, 8, -4.0039, 3.5254, 20.1563, -4.0039, 2.377, 20.1563, -3.2148, 3.5254, 17.2813, -3.2148, 3.5254, 17.2813, -4.0039, 2.377, 20.1563, -3.2148, 2.377, 17.2813, -3.2148, 3.5254, 17.2813, -3.2148, 2.377, 17.2813, 1.4775, 3.5254, 17.2813, 1.4775, 3.5254, 17.2813, -3.2148, 2.377, 17.2813, 1.4775, 2.377, 17.2813, 1.4775, 3.5254, 17.2813, 1.4775, 2.377, 17.2813, 1.4775, 3.5254, 20.1563, 1.4775, 3.5254, 20.1563, 1.4775, 2.377, 17.2813, 1.4775, 2.377, 20.1563, -4.0039, 3.5254, 20.1563, 1.4775, 3.5254, 20.1563, -4.0039, 4.7305, 20.1563, -4.0039, 4.7305, 20.1563, 1.4775, 3.5254, 20.1563, 1.4775, 4.7305, 20.1563, 1.4775, 2.377, 17.2813, -3.2148, 2.377, 17.2813, 1.4775, 2.377, 20.1563, 1.4775, 2.377, 20.1563, -3.2148, 2.377, 17.2813, -4.0039, 2.377, 20.1563, -3.2148, 3.5254, 17.2813, 1.4775, 3.5254, 17.2813, -4.0039, 3.5254, 20.1563, -4.0039, 3.5254, 20.1563, 1.4775, 3.5254, 17.2813, 1.4775, 3.5254, 20.1563, 1.4775, 3.5254, 23.1094, 1.4775, 2.377, 23.1094, -4.6602, 3.5254, 23.1094, -4.6602, 3.5254, 23.1094, 1.4775, 2.377, 23.1094, -4.0039, 2.377, 23.1094, 1.4775, 3.5254, 20.1563, 1.4775, 2.377, 20.1563, 1.4775, 3.5254, 23.1094, 1.4775, 3.5254, 23.1094, 1.4775, 2.377, 20.1563, 1.4775, 2.377, 23.1094, -4.0039, 2.377, 20.1563, -4.0039, 3.5254, 20.1563, -4.0039, 2.377, 23.1094, -4.0039, 2.377, 23.1094, -4.0039, 3.5254, 20.1563, -4.6602, 3.5254, 23.1094, 1.4775, 2.377, 20.1563, -4.0039, 2.377, 20.1563, 1.4775, 2.377, 23.1094, 1.4775, 2.377, 23.1094, -4.0039, 2.377, 20.1563, -4.0039, 2.377, 23.1094, -4.0039, 4.7305, 20.1563, 1.4775, 4.7305, 20.1563, -4.6602, 4.7305, 23.1094, -4.6602, 4.7305, 23.1094, 1.4775, 4.7305, 20.1563, 1.4775, 4.7305, 23.1094, -4.6602, 3.5254, 23.1094, -4.0039, 3.5254, 20.1563, -4.6602, 4.7305, 23.1094, -4.6602, 4.7305, 23.1094, -4.0039, 3.5254, 20.1563, -4.0039, 4.7305, 20.1563, 1.4775, 3.5254, 20.1563, 1.4775, 3.5254, 23.1094, 1.4775, 4.7305, 20.1563, 1.4775, 4.7305, 20.1563, 1.4775, 3.5254, 23.1094, 1.4775, 4.7305, 23.1094, 1.4775, 4.7305, 23.1094, 1.4775, 3.5254, 23.1094, 1.4775, 4.7305, 26.1563, 1.4775, 4.7305, 26.1563, 1.4775, 3.5254, 23.1094, 1.4775, 3.5254, 26.1563, 1.4775, 3.5254, 26.1563, -4.6602, 3.5254, 26.1563, 1.4775, 4.7305, 26.1563, 1.4775, 4.7305, 26.1563, -4.6602, 3.5254, 26.1563, -5.5508, 4.7305, 26.1563, 1.4775, 4.7305, 26.1563, -5.5508, 4.7305, 26.1563, 1.4775, 4.7305, 28.7969, 1.4775, 4.7305, 28.7969, -5.5508, 4.7305, 26.1563, -6.3047, 4.7305, 28.7969, 1.4775, 3.5254, 23.1094, -4.6602, 3.5254, 23.1094, 1.4775, 3.5254, 26.1563, 1.4775, 3.5254, 26.1563, -4.6602, 3.5254, 23.1094, -4.6602, 3.5254, 26.1563, -4.6602, 3.5254, 23.1094, -4.6602, 4.7305, 23.1094, -4.6602, 3.5254, 26.1563, -4.6602, 3.5254, 26.1563, -4.6602, 4.7305, 23.1094, -5.5508, 4.7305, 26.1563, -4.6602, 5.7578, 23.1094, 1.4775, 5.7578, 23.1094, -5.5508, 5.7578, 26.1563, -5.5508, 5.7578, 26.1563, 1.4775, 5.7578, 23.1094, 1.4775, 5.7578, 26.1563, -5.5508, 4.7305, 26.1563, -4.6602, 4.7305, 23.1094, -5.5508, 5.7578, 26.1563, -5.5508, 5.7578, 26.1563, -4.6602, 4.7305, 23.1094, -4.6602, 5.7578, 23.1094, -4.6602, 4.7305, 23.1094, 1.4775, 4.7305, 23.1094, -4.6602, 5.7578, 23.1094, -4.6602, 5.7578, 23.1094, 1.4775, 4.7305, 23.1094, 1.4775, 5.7578, 23.1094, 1.4775, 4.7305, 23.1094, 1.4775, 4.7305, 26.1563, 1.4775, 5.7578, 23.1094, 1.4775, 5.7578, 23.1094, 1.4775, 4.7305, 26.1563, 1.4775, 5.7578, 26.1563, 1.4775, 4.7305, 28.7969, -6.3047, 4.7305, 28.7969, 1.4775, 5.7578, 28.7969, 1.4775, 5.7578, 28.7969, -6.3047, 4.7305, 28.7969, -6.3047, 5.7578, 28.7969, 1.4775, 5.7578, 26.1563, 1.4775, 4.7305, 26.1563, 1.4775, 5.7578, 28.7969, 1.4775, 5.7578, 28.7969, 1.4775, 4.7305, 26.1563, 1.4775, 4.7305, 28.7969, -5.5508, 4.7305, 26.1563, -5.5508, 5.7578, 26.1563, -6.3047, 4.7305, 28.7969, -6.3047, 4.7305, 28.7969, -5.5508, 5.7578, 26.1563, -6.3047, 5.7578, 28.7969, -6.3047, 5.7578, 28.7969, -5.5508, 5.7578, 26.1563, -6.3047, 6.7734, 28.7969, -6.3047, 6.7734, 28.7969, -5.5508, 5.7578, 26.1563, -5.5508, 6.7734, 26.1563, -5.5508, 6.7734, 26.1563, 1.4775, 6.7734, 26.1563, -6.3047, 6.7734, 28.7969, -6.3047, 6.7734, 28.7969, 1.4775, 6.7734, 26.1563, 1.4775, 6.7734, 28.7969, 1.4775, 5.7578, 28.7969, -6.3047, 5.7578, 28.7969, 1.4775, 6.7734, 28.7969, 1.4775, 6.7734, 28.7969, -6.3047, 5.7578, 28.7969, -6.3047, 6.7734, 28.7969, 1.4775, 5.7578, 26.1563, 1.4775, 5.7578, 28.7969, 1.4775, 6.7734, 26.1563, 1.4775, 6.7734, 26.1563, 1.4775, 5.7578, 28.7969, 1.4775, 6.7734, 28.7969, -5.5508, 5.7578, 26.1563, 1.4775, 5.7578, 26.1563, -5.5508, 6.7734, 26.1563, -5.5508, 6.7734, 26.1563, 1.4775, 5.7578, 26.1563, 1.4775, 6.7734, 26.1563, -22.5156, -8.4297, 49.5625, -22.5156, -10.3906, 49.1563, -23.0938, -3.3984, 24.1094, -23.0938, -3.3984, 24.1094, -22.5156, -10.3906, 49.1563, -23.0938, -5.3594, 23.7188, -23.0938, -3.3984, 24.1094, -23.0938, -5.3594, 23.7188, 8.3594, -3.2285, 23.4375, 8.3594, -3.2285, 23.4375, -23.0938, -5.3594, 23.7188, 8.3594, -5.1875, 23.0469, 8.3594, -3.2285, 23.4375, 8.3594, -5.1875, 23.0469, 8.9297, -8.2656, 48.875, 8.9297, -8.2656, 48.875, 8.3594, -5.1875, 23.0469, 8.9375, -10.2266, 48.5, 8.9297, -8.2656, 48.875, 8.9375, -10.2266, 48.5, -22.5156, -8.4297, 49.5625, -22.5156, -8.4297, 49.5625, 8.9375, -10.2266, 48.5, -22.5156, -10.3906, 49.1563, 8.3594, -5.1875, 23.0469, -23.0938, -5.3594, 23.7188, 8.9375, -10.2266, 48.5, 8.9375, -10.2266, 48.5, -23.0938, -5.3594, 23.7188, -22.5156, -10.3906, 49.1563, -23.0938, -3.3984, 24.1094, 8.3594, -3.2285, 23.4375, -22.5156, -8.4297, 49.5625, -22.5156, -8.4297, 49.5625, 8.3594, -3.2285, 23.4375, 8.9297, -8.2656, 48.875, -7.2188, 12.8594, 24.5156, -7.2188, 12.2422, 24.5156, -4.6094, 12.8594, 14.2734, -4.6094, 12.8594, 14.2734, -7.2188, 12.2422, 24.5156, -4.6094, 11.5313, 14.2734, -4.6094, 11.5313, 14.2734, 2.0371, 11.5313, 14.2734, -2.0586, 14.8203, 9.0547, -2.0586, 14.8203, 9.0547, 2.0371, 11.5313, 14.2734, 3.9688, 14.8203, 9.0547, 2.0371, 12.8594, 14.2734, 2.0371, 11.5313, 14.2734, 2.0371, 12.8594, 24.5156, 2.0371, 12.8594, 24.5156, 2.0371, 11.5313, 14.2734, 2.0371, 12.2422, 24.5156, 2.0371, 12.8594, 24.5156, 2.0371, 12.2422, 24.5156, -7.2188, 12.8594, 24.5156, -7.2188, 12.8594, 24.5156, 2.0371, 12.2422, 24.5156, -7.2188, 12.2422, 24.5156, 2.0371, 11.5313, 14.2734, -4.6094, 11.5313, 14.2734, 2.0371, 12.2422, 24.5156, 2.0371, 12.2422, 24.5156, -4.6094, 11.5313, 14.2734, -7.2188, 12.2422, 24.5156, -4.6094, 12.8594, 14.2734, 2.0371, 12.8594, 14.2734, -7.2188, 12.8594, 24.5156, -7.2188, 12.8594, 24.5156, 2.0371, 12.8594, 14.2734, 2.0371, 12.8594, 24.5156, -2.0586, 15.0781, 9.0547, -2.0586, 14.8203, 9.0547, 3.9688, 15.0781, 9.0547, 3.9688, 15.0781, 9.0547, -2.0586, 14.8203, 9.0547, 3.9688, 14.8203, 9.0547, 2.0371, 12.8594, 14.2734, -4.6094, 12.8594, 14.2734, 3.9688, 15.0781, 9.0547, 3.9688, 15.0781, 9.0547, -4.6094, 12.8594, 14.2734, -2.0586, 15.0781, 9.0547, -4.6094, 12.8594, 14.2734, -4.6094, 11.5313, 14.2734, -2.0586, 15.0781, 9.0547, -2.0586, 15.0781, 9.0547, -4.6094, 11.5313, 14.2734, -2.0586, 14.8203, 9.0547, 2.0371, 11.5313, 14.2734, 2.0371, 12.8594, 14.2734, 3.9688, 14.8203, 9.0547, 3.9688, 14.8203, 9.0547, 2.0371, 12.8594, 14.2734, 3.9688, 15.0781, 9.0547 ) -[node name="Level" index="0" instance=ExtResource( 1 )] +[node name="Level" instance=ExtResource( 1 )] [node name="DirectionalLight" parent="." index="0"] diff --git a/scenes/levels/2.tscn b/scenes/levels/2.tscn index 0b4eac3..906d270 100644 --- a/scenes/levels/2.tscn +++ b/scenes/levels/2.tscn @@ -53,7 +53,6 @@ uv2_triplanar = false uv2_triplanar_sharpness = 1.0 proximity_fade_enable = false distance_fade_enable = false -_sections_unfolded = [ "Albedo", "Metallic" ] [sub_resource type="ConcavePolygonShape" id=2] @@ -70,7 +69,7 @@ subdivide_width = 0 subdivide_height = 0 subdivide_depth = 0 -[node name="Level" index="0" instance=ExtResource( 1 )] +[node name="Level" instance=ExtResource( 1 )] [node name="DirectionalLight" parent="." index="0"] @@ -95,7 +94,6 @@ mesh = ExtResource( 2 ) material/0 = SubResource( 1 ) material/1 = null material/2 = null -_sections_unfolded = [ "material" ] [node name="StaticBody" type="StaticBody" parent="MainGeometry" index="0"] diff --git a/scenes/lobby.tscn b/scenes/lobby.tscn index 92187e5..36112b9 100644 --- a/scenes/lobby.tscn +++ b/scenes/lobby.tscn @@ -6,7 +6,6 @@ [sub_resource type="DynamicFontData" id=1] font_path = "res://assets/DejaVuSansMono.ttf" -_sections_unfolded = [ "Resource" ] [sub_resource type="DynamicFont" id=2] @@ -14,12 +13,10 @@ size = 30 use_mipmaps = false use_filter = false font_data = SubResource( 1 ) -_sections_unfolded = [ "Extra Spacing", "Font", "Resource", "Settings" ] [sub_resource type="DynamicFontData" id=3] font_path = "res://assets/DejaVuSansMono.ttf" -_sections_unfolded = [ "Resource" ] [sub_resource type="DynamicFont" id=4] @@ -27,9 +24,8 @@ size = 16 use_mipmaps = false use_filter = false font_data = SubResource( 3 ) -_sections_unfolded = [ "Font", "Resource", "Settings" ] -[node name="Lobby" type="Control" index="0"] +[node name="Lobby" type="Control"] anchor_left = 0.0 anchor_top = 0.0 @@ -45,7 +41,6 @@ mouse_default_cursor_shape = 0 size_flags_horizontal = 1 size_flags_vertical = 1 script = ExtResource( 1 ) -_sections_unfolded = [ "Anchor" ] [node name="Title" type="Label" parent="." index="0"] @@ -67,7 +62,6 @@ text = "VANAGLORIA" percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "custom_fonts" ] [node name="GameBrowser" type="Control" parent="." index="1"] @@ -538,7 +532,6 @@ text = "IP:" percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "Visibility" ] [node name="IP" type="TextEdit" parent="CustomGame" index="5"] @@ -669,7 +662,6 @@ text = "Waiting for players to connect...." percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "BBCode", "custom_fonts" ] [node name="StartGame" type="Button" parent="JoinedGameLobby" index="2"] @@ -694,6 +686,5 @@ group = null text = "Start game" flat = false align = 1 -_sections_unfolded = [ "Visibility" ] diff --git a/scenes/objective.tscn b/scenes/objective.tscn index 5a91bc8..f0ae58a 100644 --- a/scenes/objective.tscn +++ b/scenes/objective.tscn @@ -58,7 +58,6 @@ uv2_triplanar = false uv2_triplanar_sharpness = 1.0 proximity_fade_enable = false distance_fade_enable = false -_sections_unfolded = [ "Albedo" ] [sub_resource type="CapsuleShape" id=3] @@ -71,9 +70,8 @@ size = 50 use_mipmaps = false use_filter = false font_data = ExtResource( 3 ) -_sections_unfolded = [ "Extra Spacing", "Font", "Resource", "Settings" ] -[node name="FullObjective" type="Spatial" index="0"] +[node name="FullObjective" type="Spatial"] [node name="Objective" type="RigidBody" parent="." index="0"] @@ -103,13 +101,11 @@ linear_damp = -1.0 angular_velocity = Vector3( 0, 0, 0 ) angular_damp = -1.0 script = ExtResource( 1 ) -_sections_unfolded = [ "Axis Lock", "Collision", "Linear", "Transform", "Visibility" ] [node name="CollisionShape" type="CollisionShape" parent="Objective" index="0"] shape = SubResource( 1 ) disabled = false -_sections_unfolded = [ "Transform" ] [node name="MeshInstance" type="MeshInstance" parent="Objective" index="1"] @@ -125,7 +121,6 @@ lod_max_hysteresis = 0.0 mesh = ExtResource( 2 ) skeleton = NodePath("..") material/0 = SubResource( 2 ) -_sections_unfolded = [ "Transform", "material" ] [node name="HingeJoint" type="HingeJoint" parent="." index="1"] @@ -144,7 +139,6 @@ angular_limit/relaxation = 1.0 motor/enable = false motor/target_velocity = 1.0 motor/max_impulse = 1.0 -_sections_unfolded = [ "Transform", "Visibility", "angular_limit", "collision", "motor", "nodes", "params", "solver" ] [node name="Rod" type="StaticBody" parent="." index="2"] @@ -157,13 +151,11 @@ friction = 1.0 bounce = 0.0 constant_linear_velocity = Vector3( 0, 0, 0 ) constant_angular_velocity = Vector3( 0, 0, 0 ) -_sections_unfolded = [ "Collision", "Transform" ] [node name="CollisionShape" type="CollisionShape" parent="Rod" index="0"] shape = SubResource( 3 ) disabled = false -_sections_unfolded = [ "Transform", "Visibility" ] [node name="HUD" type="Control" parent="." index="3"] @@ -217,7 +209,6 @@ align = 1 percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "Theme" ] [node name="RightTeam" type="Label" parent="HUD" index="2"] @@ -261,6 +252,5 @@ align = 1 percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "custom_colors", "custom_constants", "custom_fonts", "custom_styles" ] diff --git a/scenes/player.tscn b/scenes/player.tscn index 114ac60..e7cf436 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=10 format=2] +[gd_scene load_steps=14 format=2] [ext_resource path="res://scripts/player.gd" type="Script" id=1] [ext_resource path="res://scripts/tp_camera.gd" type="Script" id=2] @@ -12,7 +12,6 @@ height = 0.5 [sub_resource type="RayShape" id=2] length = 0.1 -_sections_unfolded = [ "Resource" ] [sub_resource type="PrismMesh" id=3] @@ -28,7 +27,97 @@ radius = 0.4 mid_height = 0.1 radial_segments = 64 rings = 8 -_sections_unfolded = [ "Resource" ] + +[sub_resource type="StyleBoxFlat" id=7] + +content_margin_left = -1.0 +content_margin_right = -1.0 +content_margin_top = -1.0 +content_margin_bottom = -1.0 +bg_color = Color( 0.541351, 0.855469, 0.612519, 1 ) +draw_center = true +border_width_left = 0 +border_width_top = 0 +border_width_right = 0 +border_width_bottom = 0 +border_color = Color( 0.8, 0.8, 0.8, 1 ) +border_blend = false +corner_radius_top_left = 0 +corner_radius_top_right = 0 +corner_radius_bottom_right = 0 +corner_radius_bottom_left = 0 +corner_detail = 8 +expand_margin_left = 0.0 +expand_margin_right = 0.0 +expand_margin_top = 0.0 +expand_margin_bottom = 0.0 +shadow_color = Color( 0, 0, 0, 0.6 ) +shadow_size = 0 +anti_aliasing = true +anti_aliasing_size = 1 + +[sub_resource type="StyleBoxFlat" id=8] + +content_margin_left = -1.0 +content_margin_right = -1.0 +content_margin_top = -1.0 +content_margin_bottom = -1.0 +bg_color = Color( 0.00305176, 0.0976562, 0.0111818, 1 ) +draw_center = true +border_width_left = 0 +border_width_top = 0 +border_width_right = 0 +border_width_bottom = 0 +border_color = Color( 0.8, 0.8, 0.8, 1 ) +border_blend = false +corner_radius_top_left = 0 +corner_radius_top_right = 0 +corner_radius_bottom_right = 0 +corner_radius_bottom_left = 0 +corner_detail = 8 +expand_margin_left = 0.0 +expand_margin_right = 0.0 +expand_margin_top = 0.0 +expand_margin_bottom = 0.0 +shadow_color = Color( 0, 0, 0, 0.6 ) +shadow_size = 0 +anti_aliasing = true +anti_aliasing_size = 1 + +[sub_resource type="StyleBoxFlat" id=9] + +content_margin_left = -1.0 +content_margin_right = -1.0 +content_margin_top = -1.0 +content_margin_bottom = -1.0 +bg_color = Color( 0.878769, 0.949219, 0.911242, 1 ) +draw_center = true +border_width_left = 0 +border_width_top = 0 +border_width_right = 0 +border_width_bottom = 0 +border_color = Color( 0.8, 0.8, 0.8, 1 ) +border_blend = false +corner_radius_top_left = 0 +corner_radius_top_right = 0 +corner_radius_bottom_right = 0 +corner_radius_bottom_left = 0 +corner_detail = 8 +expand_margin_left = 0.0 +expand_margin_right = 0.0 +expand_margin_top = 0.0 +expand_margin_bottom = 0.0 +shadow_color = Color( 0, 0, 0, 0.6 ) +shadow_size = 0 +anti_aliasing = true +anti_aliasing_size = 1 + +[sub_resource type="StyleBoxEmpty" id=10] + +content_margin_left = -1.0 +content_margin_right = -1.0 +content_margin_top = -1.0 +content_margin_bottom = -1.0 [sub_resource type="CubeMesh" id=5] @@ -87,9 +176,8 @@ uv2_triplanar = false uv2_triplanar_sharpness = 1.0 proximity_fade_enable = false distance_fade_enable = false -_sections_unfolded = [ "Flags", "Parameters", "Roughness" ] -[node name="RigidBody" type="RigidBody" index="0" groups=[ +[node name="RigidBody" type="RigidBody" groups=[ "player", ]] @@ -119,21 +207,18 @@ linear_damp = -1.0 angular_velocity = Vector3( 0, 0, 0 ) angular_damp = -1.0 script = ExtResource( 1 ) -_sections_unfolded = [ "Angular", "Axis Lock", "Collision", "Linear", "Transform", "Visibility", "collision" ] [node name="Body" type="CollisionShape" parent="." index="0"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0, 0.75, 0 ) shape = SubResource( 1 ) disabled = false -_sections_unfolded = [ "Pause", "Transform", "Visibility" ] [node name="Leg" type="CollisionShape" parent="." index="1"] transform = Transform( 1, 0, 0, 0, -1.62921e-07, -1, 0, 1, -1.62921e-07, 0.05, 0.1, 0 ) shape = SubResource( 2 ) disabled = false -_sections_unfolded = [ "Transform", "Visibility" ] [node name="Ray" type="RayCast" parent="." index="2"] @@ -142,16 +227,13 @@ enabled = true exclude_parent = true cast_to = Vector3( 0, -0.2, 0 ) collision_mask = 1 -_sections_unfolded = [ "Transform", "Visibility" ] [node name="Yaw" type="Spatial" parent="." index="3"] -_sections_unfolded = [ "Transform" ] [node name="Pitch" type="Spatial" parent="Yaw" index="0"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.19053, 0 ) -_sections_unfolded = [ "Transform" ] [node name="RotatedHead" type="MeshInstance" parent="Yaw/Pitch" index="0"] @@ -168,7 +250,6 @@ lod_max_hysteresis = 0.0 mesh = SubResource( 3 ) skeleton = NodePath("..") material/0 = null -_sections_unfolded = [ "Transform", "material" ] [node name="MainMesh" type="MeshInstance" parent="Yaw" index="1"] @@ -185,7 +266,6 @@ lod_max_hysteresis = 0.0 mesh = SubResource( 4 ) skeleton = NodePath("..") material/0 = null -_sections_unfolded = [ "Transform", "material" ] [node name="MasterOnly" type="Node" parent="." index="4"] @@ -210,35 +290,85 @@ align = 1 percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "Anchor", "Margin", "custom_colors" ] -[node name="SwitchCharge" type="Label" parent="MasterOnly" index="1"] +[node name="ChargeBar" type="ProgressBar" parent="MasterOnly" index="1"] + +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +margin_left = -484.0 +margin_top = -41.0 +margin_right = 483.0 +margin_bottom = -25.0 +rect_pivot_offset = Vector2( 0, 0 ) +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 0 +custom_styles/fg = SubResource( 7 ) +custom_styles/bg = SubResource( 8 ) +min_value = 0.0 +max_value = 100.0 +step = 1.0 +page = 0.0 +value = 0.0 +exp_edit = false +rounded = false +percent_visible = false + +[node name="Extra" type="ProgressBar" parent="MasterOnly/ChargeBar" index="0"] + +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -484.0 +margin_top = -8.0 +margin_right = 484.0 +margin_bottom = 8.0 +rect_pivot_offset = Vector2( 0, 0 ) +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 0 +custom_styles/fg = SubResource( 9 ) +custom_styles/bg = SubResource( 10 ) +min_value = 0.0 +max_value = 100.0 +step = 1.0 +page = 0.0 +value = 0.0 +exp_edit = false +rounded = false +percent_visible = false + +[node name="ChargeText" type="Label" parent="MasterOnly/ChargeBar" index="1"] anchor_left = 0.5 anchor_top = 1.0 anchor_right = 0.5 anchor_bottom = 1.0 -margin_left = -62.0 -margin_top = -98.0 -margin_right = 61.0 -margin_bottom = -84.0 +margin_left = -61.5 +margin_top = -14.0 +margin_right = 61.5 rect_pivot_offset = Vector2( 0, 0 ) mouse_filter = 2 mouse_default_cursor_shape = 0 size_flags_horizontal = 1 size_flags_vertical = 4 -custom_colors/font_color = Color( 0.289062, 0.289062, 0.289062, 1 ) +custom_colors/font_color = Color( 0.456299, 0.689711, 0.695312, 1 ) +custom_colors/font_color_shadow = Color( 0.0868835, 0.304688, 0.304688, 1 ) +text = "0%" align = 1 percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "custom_colors" ] [node name="TPCamera" type="Spatial" parent="." index="5"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.56913, 0 ) script = ExtResource( 2 ) -_sections_unfolded = [ "Transform" ] cam = NodePath("Camera") pivot = NodePath("Pivot") @@ -265,7 +395,6 @@ enabled = true exclude_parent = true cast_to = Vector3( 0, 0, -500 ) collision_mask = 13 -_sections_unfolded = [ "Transform" ] [node name="MaterialSettings" type="MeshInstance" parent="." index="6"] @@ -282,7 +411,6 @@ lod_max_hysteresis = 0.0 mesh = SubResource( 5 ) skeleton = NodePath("..") material/0 = SubResource( 6 ) -_sections_unfolded = [ "material" ] [node name="NamePosition" type="Spatial" parent="." index="7"] @@ -307,6 +435,5 @@ percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 script = ExtResource( 3 ) -_sections_unfolded = [ "custom_colors" ] diff --git a/scenes/test-level.tscn b/scenes/test-level.tscn index 7dcaa26..916f555 100644 --- a/scenes/test-level.tscn +++ b/scenes/test-level.tscn @@ -29,7 +29,6 @@ size = 16 use_mipmaps = false use_filter = false font_data = SubResource( 4 ) -_sections_unfolded = [ "Font", "Resource" ] [node name="world" type="Spatial"] @@ -63,7 +62,6 @@ directional_shadow_max_distance = 200.0 [node name="players" type="Spatial" parent="." index="1"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 11.4634, 0 ) -_sections_unfolded = [ "Transform", "Visibility" ] [node name="Maze" type="MeshInstance" parent="." index="2"] @@ -125,13 +123,11 @@ linear_velocity = Vector3( 0, 0, 0 ) linear_damp = -1.0 angular_velocity = Vector3( 0, 0, 0 ) angular_damp = -1.0 -_sections_unfolded = [ "Collision", "Pause", "Transform", "Visibility" ] [node name="CollisionShape" type="CollisionShape" parent="Ball" index="0"] shape = SubResource( 2 ) disabled = false -_sections_unfolded = [ "Transform", "Visibility" ] [node name="MeshInstance" type="MeshInstance" parent="Ball" index="1"] @@ -147,12 +143,10 @@ lod_max_hysteresis = 0.0 mesh = SubResource( 3 ) skeleton = NodePath("..") material/0 = null -_sections_unfolded = [ "Geometry", "Transform", "material" ] [node name="FullObjective" parent="." index="4" instance=ExtResource( 2 )] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -91.3336, 2.0316, 4.06596 ) -_sections_unfolded = [ "Transform" ] [node name="Debug" type="Label" parent="." index="5"] @@ -174,12 +168,10 @@ custom_fonts/font = SubResource( 5 ) percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -_sections_unfolded = [ "Anchor", "Focus", "Grow Direction", "Hint", "Margin", "Material", "Mouse", "Pause", "Rect", "Size Flags", "Theme", "Visibility", "custom_colors", "custom_constants", "custom_fonts", "custom_styles" ] [node name="LeftSpawn" type="Spatial" parent="." index="6"] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.96426, 9.36109 ) -_sections_unfolded = [ "Transform" ] [node name="RightSpawn" type="Spatial" parent="." index="7"] diff --git a/scripts/ability_icon.gd b/scripts/ability_icon.gd new file mode 100644 index 0000000..2ff1bc4 --- /dev/null +++ b/scripts/ability_icon.gd @@ -0,0 +1,28 @@ +extends Control + +onready var hero = get_node("../..") +onready var bar = get_node("Bar") +onready var available = get_node("Available") +export var cost = 1 +export var ability_name = "Ability" +export var display_progress = true +# This is intended to be public +var disabled = false + +func _ready(): + get_node("Name").text = ability_name + +func _process(delta): + if disabled: + available.hide() + bar.value = 0 + else: + if display_progress: + if cost == 0: + bar.value = 100 if hero.switch_charge > 0 else 0 + else: + bar.value = 100 * hero.switch_charge / cost + if hero.switch_charge > cost: + available.show() + else: + available.hide() diff --git a/scripts/hero_select.gd b/scripts/hero_select.gd index a3d6cc7..5fd34df 100644 --- a/scripts/hero_select.gd +++ b/scripts/hero_select.gd @@ -10,12 +10,12 @@ const hero_names = [ ] const hero_text = [ - "DILIGENCE.\n\nWallride by jumping on walls.\n\nYour speed builds immensely as your Switch Charge increases.", + "DILIGENCE.\n\nWallride by jumping on walls.\n\nHold left click to go faster (but spend switch charge).", "WRATH.\n\nPress E and click (or just click) to build a wall.\n\nRight click to destroy one.", "LUST.\n\nYou attract nearby heroes.\n\nPress E to switch to repelling them.", "GENEROSITY.\n\nMake contact with a friend to boost their speed.\n\nPress E to separate.", - "PATIENCE.\n\nHold left mouse button on an enemy to slow them down.", - "PRIDE.\n\nClick to build portal. Click again to build its partner.\n\nYou can build multiple portal sets.", + "PATIENCE.\n\nHold left mouse button on an enemy to slow them down.\n\nPress E to delete someone else's building (costs charge).", + "PRIDE.\n\nDrag on enemies to bully them around.\n\nClick to build a portal. Click again to build its partner (costs charge).", ] func _ready(): diff --git a/scripts/heroes/0.gd b/scripts/heroes/0.gd index 83736e6..d2c4110 100644 --- a/scripts/heroes/0.gd +++ b/scripts/heroes/0.gd @@ -12,15 +12,26 @@ var wallride_forgiveness = .3 func _ready(): ._ready() walk_speed *= 0.8 - air_accel *= 2 + air_accel *= 1.5 jump_speed *= 1 air_speed_build *= 2 # Since movement is the only ability of this hero, it builds charge more movement_charge *= 2 func control_player(state): + var original_speed = walk_speed + var original_accel = air_accel + var boost_strength = 2 + var boost_drain = 25 # Recall increased charge must be factored in + var cost = boost_drain * state.step + if Input.is_action_pressed("hero_0_boost") and switch_charge > cost: + walk_speed *= 2 + air_accel *= 3 + switch_charge -= cost .control_player(state) wallride(state) + walk_speed = original_speed + air_accel = original_accel func wallride(state): diff --git a/scripts/heroes/4.gd b/scripts/heroes/4.gd index 478f4ed..c25b00c 100644 --- a/scripts/heroes/4.gd +++ b/scripts/heroes/4.gd @@ -2,6 +2,8 @@ extends "res://scripts/player.gd" +onready var destroy_ability = get_node("MasterOnly/Destroy") + var stun_charge = 1 var velocity_charge = 10 # This one is instantaneous, so it gets quita weight @@ -28,6 +30,17 @@ func _process(delta): get_node("TPCamera").cam_view_sensitivity *= sens_factor get_node("TPCamera").cam_smooth_movement = true + var looking_at = pick() + if looking_at and looking_at.has_method("destroy"): + destroy_ability.cost = looking_at.destroy_cost + destroy_ability.disabled = false + if Input.is_action_just_pressed("primary_ability"): + if switch_charge > looking_at.destroy_cost: + switch_charge -= looking_at.destroy_cost + looking_at.rpc("destroy") + else: + destroy_ability.disabled = true + if stun: var players = get_node("/root/Level/Players").get_children() var player = pick_from(players) diff --git a/scripts/heroes/5.gd b/scripts/heroes/5.gd index ebf9d11..3f7fb15 100644 --- a/scripts/heroes/5.gd +++ b/scripts/heroes/5.gd @@ -1,11 +1,18 @@ extends "res://scripts/player.gd" onready var placement = preload("res://scripts/placement.gd").new(self, "res://scenes/heroes/5_portal.tscn") +onready var teleport_ability = get_node("MasterOnly/Teleport") var radius = 15 # The spaces make the bracket centered, rather than on of the dots var first_crosshair = " [..." var second_crosshair = "...] " +var no_portal_crosshair = "+" +var portal_cost = 20 + +var flicking = null +var flick_charge = 3 +var flick_strength = 4 # --- Godot overrides --- @@ -14,13 +21,22 @@ func _ready(): placement.confirm_action = "hero_5_confirm_portal" placement.delete_action = "hero_5_remove_portal" placement.max_placed = 100 + set_process_input(true) func _process(delta): if is_network_master(): - placement.place_input(radius) var is_second = placement.placed.size() % 2 != 0 - var crosshair = second_crosshair if is_second else first_crosshair + var portal_crosshair = second_crosshair if is_second else first_crosshair + var crosshair = no_portal_crosshair if switch_charge < portal_cost else portal_crosshair get_node("MasterOnly/Crosshair").set_text(crosshair) + var can_build = switch_charge > portal_cost + if placement.place_input(radius, can_build, true) and is_second: + switch_charge -= portal_cost + + teleport_ability.disabled = placement.placed.size() <= 1 + +func _input(event): + flick_input() func _exit_tree(): ._exit_tree() @@ -31,3 +47,28 @@ func _exit_tree(): # --- Own --- +func flick_input(): + if Input.is_action_just_pressed("primary_mouse"): + var pick = pick_by_friendly(false) + if pick: + flicking = pick + if flicking and Input.is_action_just_released("primary_mouse"): + var aim = get_node("Yaw/Pitch").get_global_transform().basis + var forwards = -aim[2] + var distance = (flicking.translation - translation).length() + forwards *= distance + var towards = translation + forwards + var gravity = PhysicsServer.area_get_param(get_world().get_space(), PhysicsServer.AREA_PARAM_GRAVITY_VECTOR) + # Automatically account for gravity, so as to make UI more intuitive + towards -= gravity + rpc("flick", flicking.get_name(), towards) + flicking = null + switch_charge += flick_charge + +sync func flick(player_id, towards): + var who = $"/root/Level/Players".get_node(player_id) + if who.is_network_master(): + var direction = towards - who.translation + var impulse = direction.normalized() * flick_strength * who.get_mass() + who.apply_impulse(Vector3(), impulse) + diff --git a/scripts/heroes/5_portal.gd b/scripts/heroes/5_portal.gd index 92fcdaa..79e9d94 100644 --- a/scripts/heroes/5_portal.gd +++ b/scripts/heroes/5_portal.gd @@ -1,8 +1,7 @@ extends "res://scripts/placeable.gd" -var portal_charge = 15 +var portal_charge = -5 var other -var index var enemy_colors = [ Color("#d14013"), @@ -26,8 +25,6 @@ func _exit_tree(): func init(maker): - var maker_portals = maker.placement.placed - index = maker_portals.size() # No -1, because we haven't actually been added to the array yet # If index is odd, we're the second (1, 3...), if even, first (0, 4...) var second = index % 2 != 0 var is_friend = util.is_friendly(maker) @@ -57,12 +54,13 @@ func player_collided(with, player): func portal(player): if player.player_info.is_right_team == maker_node.player_info.is_right_team: if other: - var spawn_distance = 1.75 - # Find a sane place to spawn - # -Z is in the direction of the portal - # X is enough away from the portal to avoid infinite loop - # With both axes, gravity could never bring us to hit the portal - var to = other.to_global(Vector3(spawn_distance,0,-spawn_distance)) - player.set_translation(to) - maker_node.switch_charge += portal_charge + if maker_node.switch_charge > -portal_charge: + var spawn_distance = 1.75 + # Find a sane place to spawn + # -Z is in the direction of the portal + # X is enough away from the portal to avoid infinite loop + # With both axes, gravity could never bring us to hit the portal + var to = other.to_global(Vector3(spawn_distance,0,-spawn_distance)) + player.set_translation(to) + maker_node.switch_charge += portal_charge diff --git a/scripts/lobby.gd b/scripts/lobby.gd index 24c8056..58637bd 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -9,6 +9,7 @@ var begun = false var server_playing = true var global_server_ip = "nv.cosinegaming.com" var players_done = [] +var is_connected = false # Technically this can be done with ENetcetera but it's easier this way func setup_options(): var opts = Options.new() @@ -107,6 +108,7 @@ func _server_init(): var peer = NetworkedMultiplayerENet.new() peer.create_server(SERVER_PORT, MAX_PLAYERS) get_tree().set_network_peer(peer) + is_connected = true get_node("CustomGame/Server").set_text("Serving!") get_node("JoinedGameLobby").show() if server_playing: @@ -125,6 +127,7 @@ func _connected_ok(): if "start_game" in my_info and my_info.start_game: rpc_id(1, "start_game") get_node("JoinedGameLobby").show() + is_connected = true func collect_info(): if not "username" in my_info: @@ -174,7 +177,8 @@ sync func unregister_player(peer): func select_hero(hero): var description = get_node("PlayerSettings/HeroSelect").hero_text[hero] get_node("PlayerSettings/HeroDescription").set_text(description) - rpc("set_hero", get_tree().get_network_unique_id(), hero) + if is_connected: + rpc("set_hero", get_tree().get_network_unique_id(), hero) sync func set_hero(peer, hero): player_info[peer].hero = hero diff --git a/scripts/placeable.gd b/scripts/placeable.gd index 97e350a..2fe4971 100644 --- a/scripts/placeable.gd +++ b/scripts/placeable.gd @@ -2,6 +2,7 @@ extends StaticBody var maker_node var material +var destroy_cost = 20 func _ready(): get_node("CollisionShape").disabled = true @@ -21,6 +22,9 @@ func place(): get_node("CollisionShape").disabled = false material.flags_transparent = false +sync func destroy(): + maker_node.placement.remove_placed(get_name()) + func make_last(): material.flags_transparent = true material.albedo_color.a = 0.9 diff --git a/scripts/placement.gd b/scripts/placement.gd index 7ca1053..e0c79fc 100644 --- a/scripts/placement.gd +++ b/scripts/placement.gd @@ -31,12 +31,12 @@ master func request_placed(): for node in placed: rpc_id(get_tree().get_rpc_sender_id(), "slave_place", node.transform) -func place_input(radius=-1): +func place_input(radius=-1, can_build=true, require_ghost=false): # We allow you to just click to place, without needing to press E var confirm = Input.is_action_just_pressed(confirm_action) - if Input.is_action_just_pressed(start_action) or (confirm and not is_placing): + if can_build and Input.is_action_just_pressed(start_action) or (confirm and not is_placing and not require_ghost): # Press button twice to cancel if is_placing: # We changed our mind, delete the placing wall @@ -50,9 +50,9 @@ func place_input(radius=-1): if Input.is_action_just_pressed(delete_action): var pick = player.pick_from(placed) if pick != -1: - rpc("remove_placed", pick) + rpc("remove_placed", placed[pick].get_name()) - if is_placing or confirm: + if is_placing: position_placement(placing_node) if radius > 0: # A radius is specified var distance = placing_node.get_translation() - player.get_translation() @@ -62,10 +62,12 @@ func place_input(radius=-1): else: placing_node.within_range() - if confirm: + if can_build and (confirm and not require_ghost) or (confirm and is_placing): # Order matters here: confirm_placement resets placing_node so we have to do anything with it first rpc("slave_place", placing_node.transform) confirm_placement(placing_node) + return true + return false func confirm_placement(node, tf=null): if tf: @@ -123,14 +125,14 @@ slave func slave_place(tf): var node = create() confirm_placement(node, tf) -sync func remove_placed(index): - placed[index].queue_free() - placed.remove(index) +sync func remove_placed(name): + var what = get_node("/root/Level").get_node(name) + placed.erase(what) + what.queue_free() func create(): var node = scene.instance() player.get_node("/root/Level").add_child(node) - # We have to call_deferred because we're `load`ing instead of `preload`ing. TODO: preload? node.init(player) return node diff --git a/scripts/player.gd b/scripts/player.gd index faba321..3208b4a 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -16,7 +16,10 @@ var air_speed_build = 0.006 # `air_accel` per `switch_charge` sync var switch_charge = 0 var switch_charge_cap = 200 # While switching is always at 100, things like speed boost might go higher! -var movement_charge = 0.1 # In percent per meter (except when heroes change that) +var movement_charge = 0.15 # In percent per meter (except when heroes change that) +onready var switch_text = get_node("MasterOnly/ChargeBar/ChargeText") +onready var switch_bar = get_node("MasterOnly/ChargeBar") +onready var switch_bar_extra = get_node("MasterOnly/ChargeBar/Extra") var fall_height = -400 # This is essentially the respawn timer var switch_height = -150 # At this point, stop adding to switch_charge. This makes falls not charge you too much @@ -69,6 +72,8 @@ func _input(event): quit() if "record" in player_info: recording.events.append([recording.time, event_to_obj(event)]) + if Input.is_action_just_pressed("enable_cheats"): + switch_charge = 199 func _process(delta): # All player code not caused by input, and not causing movement @@ -77,14 +82,15 @@ func _process(delta): if translation.y < switch_height: vel.y = 0 # Don't gain charge from falling when below switch_height switch_charge += movement_charge * vel.length() * delta - var switch_node = get_node("MasterOnly/SwitchCharge") - switch_node.set_text("%d%%" % int(switch_charge)) # We truncate, rather than round, so that switch is displayed AT 100% + switch_text.set_text("%d%%" % int(switch_charge)) # We truncate, rather than round, so that switch is displayed AT 100% if switch_charge >= 100: # Let switch_charge keep building, because we use it for walk_speed and things - switch_node.set_text("100%% (%.f)\nQ - Switch hero" % switch_charge) + switch_text.set_text("100%% (%.f)\nQ - Switch hero" % switch_charge) if switch_charge > switch_charge_cap: # There is however a cap switch_charge = switch_charge_cap + switch_bar.value = switch_charge + switch_bar_extra.value = switch_charge - 100 if get_translation().y < fall_height: rpc("spawn") @@ -297,10 +303,19 @@ func quit(): # These aren't used by vanilla player, but are used by heroes in common -func pick_from(group): +func pick(): var look_ray = get_node("TPCamera/Camera/Ray") - var looking_at = look_ray.get_collider() - var result = group.find(looking_at) - return result + return look_ray.get_collider() +func pick_from(group): + return group.find(pick()) +func pick_player(): + var players = get_node("/root/Level/Players").get_children() + return players[pick_from(players)] +func pick_by_friendly(pick_friendlies): + var pick = pick_player() + if (pick.player_info.is_right_team == player_info.is_right_team) == pick_friendlies: + return pick + else: + return null # ========= diff --git a/util/clear_editor_state.py b/util/clear_editor_state.py new file mode 100644 index 0000000..05f68a2 --- /dev/null +++ b/util/clear_editor_state.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 +from pathlib import Path + +# Current working directory +cwd = Path.cwd() + +for path in cwd.glob('**/*.tscn'): + result = [] + + with path.open() as f: + for line in f.readlines(): + if line.startswith('_sections_unfolded'): + # Skip lines that start with _sections_unfolded + continue + elif line.startswith('[node') and 'parent=' not in line: + # Root node, remove 'index="0"' + result.append(line.replace(' index="0"', '')) + else: + # Add line as is + result.append(line) + + with path.open('w') as f: + f.writelines(result) \ No newline at end of file diff --git a/vanagloria b/vanagloria new file mode 120000 index 0000000..19ef04a --- /dev/null +++ b/vanagloria @@ -0,0 +1 @@ +/opt/godot/godot \ No newline at end of file