commit 49e859eb1ae9aad17e2f65dde3a2d61645df7e78 Author: Joseph Manley Date: Thu Apr 30 19:16:46 2020 -0400 Intialize and cleanup repo diff --git a/.github/workflows/test_server.yml b/.github/workflows/test_server.yml new file mode 100644 index 0000000..0f70053 --- /dev/null +++ b/.github/workflows/test_server.yml @@ -0,0 +1,27 @@ +name: Run Server Tests + +on: + push: + paths: + - 'server/**' + - '.github/workflows/test_server.yml' + pull_request: + paths: + - 'server/**' + - '.github/workflows/test_server.yml' + +jobs: + Testing: + runs-on: ubuntu-latest + container: + steps: + - name: Checkout + uses: actions/checkout@v1 + - name: Build Container + working-directory: server + run: | + docker build -t local . + - name: Run Testing Script + working-directory: server + run: | + docker run local /bin/bash -c "cd /dt; /dt/run_tests.sh" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7db8a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +.vscode \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1ccf333 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# ludum-dare-46 + +## Client + +The client is build via Godot v3.2.1 + +## Server + +The server is a C++ app built using ENet \ No newline at end of file diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 0000000..ec2a80e --- /dev/null +++ b/client/.gitignore @@ -0,0 +1 @@ +builds \ No newline at end of file diff --git a/client/.import/Final Battle of the Dark Wizards.ogg-7e8f35dddfcfba2132374e744d2f08f7.md5 b/client/.import/Final Battle of the Dark Wizards.ogg-7e8f35dddfcfba2132374e744d2f08f7.md5 new file mode 100644 index 0000000..30c95cc --- /dev/null +++ b/client/.import/Final Battle of the Dark Wizards.ogg-7e8f35dddfcfba2132374e744d2f08f7.md5 @@ -0,0 +1,3 @@ +source_md5="a4e0d3e007a723598d9eed9e588ed896" +dest_md5="88bbb9adf5d8cd95e82a6575379f8e40" + diff --git a/client/.import/Final Battle of the Dark Wizards.ogg-7e8f35dddfcfba2132374e744d2f08f7.oggstr b/client/.import/Final Battle of the Dark Wizards.ogg-7e8f35dddfcfba2132374e744d2f08f7.oggstr new file mode 100644 index 0000000..c84d6c0 Binary files /dev/null and b/client/.import/Final Battle of the Dark Wizards.ogg-7e8f35dddfcfba2132374e744d2f08f7.oggstr differ diff --git a/client/.import/Tempting Secrets.ogg-f12299b0180d70ea97551d4f481dcacc.md5 b/client/.import/Tempting Secrets.ogg-f12299b0180d70ea97551d4f481dcacc.md5 new file mode 100644 index 0000000..3dd71db --- /dev/null +++ b/client/.import/Tempting Secrets.ogg-f12299b0180d70ea97551d4f481dcacc.md5 @@ -0,0 +1,3 @@ +source_md5="4c0163ed6b4faca64ec2e22663865646" +dest_md5="871974c0415189bb7ee4d25f66c7e6cc" + diff --git a/client/.import/Tempting Secrets.ogg-f12299b0180d70ea97551d4f481dcacc.oggstr b/client/.import/Tempting Secrets.ogg-f12299b0180d70ea97551d4f481dcacc.oggstr new file mode 100644 index 0000000..7d85457 Binary files /dev/null and b/client/.import/Tempting Secrets.ogg-f12299b0180d70ea97551d4f481dcacc.oggstr differ diff --git a/client/.import/boar.png-967bf326ec5327a3976d5df0c5a68796.md5 b/client/.import/boar.png-967bf326ec5327a3976d5df0c5a68796.md5 new file mode 100644 index 0000000..6dce211 --- /dev/null +++ b/client/.import/boar.png-967bf326ec5327a3976d5df0c5a68796.md5 @@ -0,0 +1,3 @@ +source_md5="f91f5b2c10fb1c2bbb2b9efd001ec156" +dest_md5="a8bf84e7a011aab313ecd6a6228e1c03" + diff --git a/client/.import/boar.png-967bf326ec5327a3976d5df0c5a68796.stex b/client/.import/boar.png-967bf326ec5327a3976d5df0c5a68796.stex new file mode 100644 index 0000000..da714c7 Binary files /dev/null and b/client/.import/boar.png-967bf326ec5327a3976d5df0c5a68796.stex differ diff --git a/client/.import/client.png-db3748b41e665cc4fe95f391916f4633.md5 b/client/.import/client.png-db3748b41e665cc4fe95f391916f4633.md5 new file mode 100644 index 0000000..946404d --- /dev/null +++ b/client/.import/client.png-db3748b41e665cc4fe95f391916f4633.md5 @@ -0,0 +1,3 @@ +source_md5="7e41bf3051b18e392a4bb6c0cc45cd7c" +dest_md5="92eb858faaa1840609e0a1d10f0a2ab1" + diff --git a/client/.import/client.png-db3748b41e665cc4fe95f391916f4633.stex b/client/.import/client.png-db3748b41e665cc4fe95f391916f4633.stex new file mode 100644 index 0000000..131f795 Binary files /dev/null and b/client/.import/client.png-db3748b41e665cc4fe95f391916f4633.stex differ diff --git a/client/.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.md5 b/client/.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.md5 new file mode 100644 index 0000000..63004cb --- /dev/null +++ b/client/.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.md5 @@ -0,0 +1,3 @@ +source_md5="f58728ec69e9bc4674d83fecd231606d" +dest_md5="6be2b17787f2b16451812c382e0468ed" + diff --git a/client/.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.stex b/client/.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.stex new file mode 100644 index 0000000..ad12cbb Binary files /dev/null and b/client/.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.stex differ diff --git a/client/.import/favicon.png-ad684d17faa662133229b6300264136f.md5 b/client/.import/favicon.png-ad684d17faa662133229b6300264136f.md5 new file mode 100644 index 0000000..7b61c3e --- /dev/null +++ b/client/.import/favicon.png-ad684d17faa662133229b6300264136f.md5 @@ -0,0 +1,3 @@ +source_md5="47313fa4c47a9963fddd764e1ec6e4a8" +dest_md5="2ded9e7f9060e2b530aab678b135fc5b" + diff --git a/client/.import/favicon.png-ad684d17faa662133229b6300264136f.stex b/client/.import/favicon.png-ad684d17faa662133229b6300264136f.stex new file mode 100644 index 0000000..3ca6461 Binary files /dev/null and b/client/.import/favicon.png-ad684d17faa662133229b6300264136f.stex differ diff --git a/client/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 b/client/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 new file mode 100644 index 0000000..7b61c3e --- /dev/null +++ b/client/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5 @@ -0,0 +1,3 @@ +source_md5="47313fa4c47a9963fddd764e1ec6e4a8" +dest_md5="2ded9e7f9060e2b530aab678b135fc5b" + diff --git a/client/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex b/client/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex new file mode 100644 index 0000000..3ca6461 Binary files /dev/null and b/client/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex differ diff --git a/client/.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.md5 b/client/.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.md5 new file mode 100644 index 0000000..1454d20 --- /dev/null +++ b/client/.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.md5 @@ -0,0 +1,3 @@ +source_md5="50ac0416cbd1377e0e34e05c7b94300d" +dest_md5="d6ea88e54993b8c2ac6268ed67ffc779" + diff --git a/client/.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.stex b/client/.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.stex new file mode 100644 index 0000000..d1c7964 Binary files /dev/null and b/client/.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.stex differ diff --git a/client/.import/logo.png-9164f87f81119ac7320e78ed71593bc1.md5 b/client/.import/logo.png-9164f87f81119ac7320e78ed71593bc1.md5 new file mode 100644 index 0000000..a08a029 --- /dev/null +++ b/client/.import/logo.png-9164f87f81119ac7320e78ed71593bc1.md5 @@ -0,0 +1,3 @@ +source_md5="bb2665ac1d6c81fe488f5c1d8f1efc4b" +dest_md5="0519566be172bacfd61403d302597e4e" + diff --git a/client/.import/logo.png-9164f87f81119ac7320e78ed71593bc1.stex b/client/.import/logo.png-9164f87f81119ac7320e78ed71593bc1.stex new file mode 100644 index 0000000..199972b Binary files /dev/null and b/client/.import/logo.png-9164f87f81119ac7320e78ed71593bc1.stex differ diff --git a/client/.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.md5 b/client/.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.md5 new file mode 100644 index 0000000..3dd71db --- /dev/null +++ b/client/.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.md5 @@ -0,0 +1,3 @@ +source_md5="4c0163ed6b4faca64ec2e22663865646" +dest_md5="871974c0415189bb7ee4d25f66c7e6cc" + diff --git a/client/.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.oggstr b/client/.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.oggstr new file mode 100644 index 0000000..7d85457 Binary files /dev/null and b/client/.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.oggstr differ diff --git a/client/.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.md5 b/client/.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.md5 new file mode 100644 index 0000000..de3b1ec --- /dev/null +++ b/client/.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.md5 @@ -0,0 +1,3 @@ +source_md5="b96dd394315a26f6321ee1fed85511a1" +dest_md5="0ea1da6f385d124f752a105fbe1e2838" + diff --git a/client/.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.stex b/client/.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.stex new file mode 100644 index 0000000..30d46c3 Binary files /dev/null and b/client/.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.stex differ diff --git a/client/.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.md5 b/client/.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.md5 new file mode 100644 index 0000000..3d3d8d8 --- /dev/null +++ b/client/.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.md5 @@ -0,0 +1,3 @@ +source_md5="234d4f7df7c457bb857680ca94728ab3" +dest_md5="a04bb0e22087eb7e6f923c0f3dc75e4a" + diff --git a/client/.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.stex b/client/.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.stex new file mode 100644 index 0000000..ce8e9e5 Binary files /dev/null and b/client/.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.stex differ diff --git a/client/.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.md5 b/client/.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.md5 new file mode 100644 index 0000000..30c95cc --- /dev/null +++ b/client/.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.md5 @@ -0,0 +1,3 @@ +source_md5="a4e0d3e007a723598d9eed9e588ed896" +dest_md5="88bbb9adf5d8cd95e82a6575379f8e40" + diff --git a/client/.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.oggstr b/client/.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.oggstr new file mode 100644 index 0000000..c84d6c0 Binary files /dev/null and b/client/.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.oggstr differ diff --git a/client/ReadMe.md b/client/ReadMe.md new file mode 100644 index 0000000..fecef10 --- /dev/null +++ b/client/ReadMe.md @@ -0,0 +1,9 @@ +# LD46 Client + +## Build Requirements + +Godot 3.2.1-stable + +### Godot Modules + +- [GDNet3](https://github.com/perdugames/gdnet3) \ No newline at end of file diff --git a/client/assets/audio/music/secret.ogg b/client/assets/audio/music/secret.ogg new file mode 100644 index 0000000..2f5d37c Binary files /dev/null and b/client/assets/audio/music/secret.ogg differ diff --git a/client/assets/audio/music/secret.ogg.import b/client/assets/audio/music/secret.ogg.import new file mode 100644 index 0000000..5c71cd0 --- /dev/null +++ b/client/assets/audio/music/secret.ogg.import @@ -0,0 +1,15 @@ +[remap] + +importer="ogg_vorbis" +type="AudioStreamOGGVorbis" +path="res://.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.oggstr" + +[deps] + +source_file="res://assets/audio/music/secret.ogg" +dest_files=[ "res://.import/secret.ogg-61e6c38fdabb5c087e6529738a5bce74.oggstr" ] + +[params] + +loop=true +loop_offset=0 diff --git a/client/assets/audio/music/wizards.ogg b/client/assets/audio/music/wizards.ogg new file mode 100644 index 0000000..6a71856 Binary files /dev/null and b/client/assets/audio/music/wizards.ogg differ diff --git a/client/assets/audio/music/wizards.ogg.import b/client/assets/audio/music/wizards.ogg.import new file mode 100644 index 0000000..5548f4e --- /dev/null +++ b/client/assets/audio/music/wizards.ogg.import @@ -0,0 +1,15 @@ +[remap] + +importer="ogg_vorbis" +type="AudioStreamOGGVorbis" +path="res://.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.oggstr" + +[deps] + +source_file="res://assets/audio/music/wizards.ogg" +dest_files=[ "res://.import/wizards.ogg-236c384d94b8eed7664fa0b0b9be0425.oggstr" ] + +[params] + +loop=true +loop_offset=0 diff --git a/client/assets/fonts/hf-free-complete/compass-pro-v1.1/CompassPro.ttf b/client/assets/fonts/hf-free-complete/compass-pro-v1.1/CompassPro.ttf new file mode 100644 index 0000000..5432d65 Binary files /dev/null and b/client/assets/fonts/hf-free-complete/compass-pro-v1.1/CompassPro.ttf differ diff --git a/client/assets/images/character/iron_player.ase b/client/assets/images/character/iron_player.ase new file mode 100644 index 0000000..2eebb00 Binary files /dev/null and b/client/assets/images/character/iron_player.ase differ diff --git a/client/assets/images/character/iron_player.png b/client/assets/images/character/iron_player.png new file mode 100644 index 0000000..0e9f046 Binary files /dev/null and b/client/assets/images/character/iron_player.png differ diff --git a/client/assets/images/character/iron_player.png.import b/client/assets/images/character/iron_player.png.import new file mode 100644 index 0000000..886eb35 --- /dev/null +++ b/client/assets/images/character/iron_player.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/character/iron_player.png" +dest_files=[ "res://.import/iron_player.png-39ad5fd525cfa67c8ed824c0580890d8.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/assets/images/enemies/boar.ase b/client/assets/images/enemies/boar.ase new file mode 100644 index 0000000..3cd9dc9 Binary files /dev/null and b/client/assets/images/enemies/boar.ase differ diff --git a/client/assets/images/enemies/boar.png b/client/assets/images/enemies/boar.png new file mode 100644 index 0000000..ab2e693 Binary files /dev/null and b/client/assets/images/enemies/boar.png differ diff --git a/client/assets/images/enemies/boar.png.import b/client/assets/images/enemies/boar.png.import new file mode 100644 index 0000000..9da2fda --- /dev/null +++ b/client/assets/images/enemies/boar.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/boar.png-967bf326ec5327a3976d5df0c5a68796.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/enemies/boar.png" +dest_files=[ "res://.import/boar.png-967bf326ec5327a3976d5df0c5a68796.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/assets/images/entities/crystal.ase b/client/assets/images/entities/crystal.ase new file mode 100644 index 0000000..787038d Binary files /dev/null and b/client/assets/images/entities/crystal.ase differ diff --git a/client/assets/images/entities/crystal.png b/client/assets/images/entities/crystal.png new file mode 100644 index 0000000..b80a8cd Binary files /dev/null and b/client/assets/images/entities/crystal.png differ diff --git a/client/assets/images/entities/crystal.png.import b/client/assets/images/entities/crystal.png.import new file mode 100644 index 0000000..afd230f --- /dev/null +++ b/client/assets/images/entities/crystal.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/entities/crystal.png" +dest_files=[ "res://.import/crystal.png-04011f2545568870c52ee0bd59c3fb9c.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/assets/images/logo.ase b/client/assets/images/logo.ase new file mode 100644 index 0000000..270f3f8 Binary files /dev/null and b/client/assets/images/logo.ase differ diff --git a/client/assets/images/logo.png b/client/assets/images/logo.png new file mode 100644 index 0000000..9142c9f Binary files /dev/null and b/client/assets/images/logo.png differ diff --git a/client/assets/images/logo.png.import b/client/assets/images/logo.png.import new file mode 100644 index 0000000..f3e7d31 --- /dev/null +++ b/client/assets/images/logo.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/logo.png-9164f87f81119ac7320e78ed71593bc1.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/logo.png" +dest_files=[ "res://.import/logo.png-9164f87f81119ac7320e78ed71593bc1.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/assets/images/tiles/floor/stone_floor.ase b/client/assets/images/tiles/floor/stone_floor.ase new file mode 100644 index 0000000..ae9ed4a Binary files /dev/null and b/client/assets/images/tiles/floor/stone_floor.ase differ diff --git a/client/assets/images/tiles/floor/stone_floor.png b/client/assets/images/tiles/floor/stone_floor.png new file mode 100644 index 0000000..d534a9e Binary files /dev/null and b/client/assets/images/tiles/floor/stone_floor.png differ diff --git a/client/assets/images/tiles/floor/stone_floor.png.import b/client/assets/images/tiles/floor/stone_floor.png.import new file mode 100644 index 0000000..52a103e --- /dev/null +++ b/client/assets/images/tiles/floor/stone_floor.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/tiles/floor/stone_floor.png" +dest_files=[ "res://.import/stone_floor.png-eac509d75ac0cd89365424259b561ea3.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/assets/images/tiles/wall/stone_wall.ase b/client/assets/images/tiles/wall/stone_wall.ase new file mode 100644 index 0000000..99defdf Binary files /dev/null and b/client/assets/images/tiles/wall/stone_wall.ase differ diff --git a/client/assets/images/tiles/wall/stone_wall.png b/client/assets/images/tiles/wall/stone_wall.png new file mode 100644 index 0000000..0d3b1ef Binary files /dev/null and b/client/assets/images/tiles/wall/stone_wall.png differ diff --git a/client/assets/images/tiles/wall/stone_wall.png.import b/client/assets/images/tiles/wall/stone_wall.png.import new file mode 100644 index 0000000..27e826e --- /dev/null +++ b/client/assets/images/tiles/wall/stone_wall.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/images/tiles/wall/stone_wall.png" +dest_files=[ "res://.import/stone_wall.png-5d77d917e4c5071ba4b40c12c46181d7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/default_env.tres b/client/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/client/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/client/export_presets.cfg b/client/export_presets.cfg new file mode 100644 index 0000000..06ba1a1 --- /dev/null +++ b/client/export_presets.cfg @@ -0,0 +1,48 @@ +[preset.0] + +name="Linux/X11" +platform="Linux/X11" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="builds/client.x86_64" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.0.options] + +texture_format/bptc=false +texture_format/s3tc=true +texture_format/etc=false +texture_format/etc2=false +texture_format/no_bptc_fallbacks=true +binary_format/64_bits=true +binary_format/embed_pck=false +custom_template/release="/var/home/vetra/Projects/godot-enet/bin/godot.x11.opt.64" +custom_template/debug="/var/home/vetra/Projects/godot-enet/bin/godot.x11.opt.debug.64" + +[preset.1] + +name="HTML5" +platform="HTML5" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="builds/client.html" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.1.options] + +vram_texture_compression/for_desktop=true +vram_texture_compression/for_mobile=false +html/custom_html_shell="" +html/head_include="" +custom_template/release="" +custom_template/debug="" diff --git a/client/icon.png b/client/icon.png new file mode 100644 index 0000000..c98fbb6 Binary files /dev/null and b/client/icon.png differ diff --git a/client/icon.png.import b/client/icon.png.import new file mode 100644 index 0000000..96cbf46 --- /dev/null +++ b/client/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/client/nodes/MusicManager.tscn b/client/nodes/MusicManager.tscn new file mode 100644 index 0000000..663c7a6 --- /dev/null +++ b/client/nodes/MusicManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scripts/singletons/MusicManager.gd" type="Script" id=1] + +[node name="MusicManager" type="AudioStreamPlayer"] +script = ExtResource( 1 ) diff --git a/client/nodes/NetworkManager.tscn b/client/nodes/NetworkManager.tscn new file mode 100644 index 0000000..57eecc7 --- /dev/null +++ b/client/nodes/NetworkManager.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://scripts/network/NetworkManager.gd" type="Script" id=1] + +[node name="NetworkManager" type="Node"] +script = ExtResource( 1 ) diff --git a/client/nodes/Player.tscn b/client/nodes/Player.tscn new file mode 100644 index 0000000..3ee71be --- /dev/null +++ b/client/nodes/Player.tscn @@ -0,0 +1,39 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://assets/images/character/iron_player.png" type="Texture" id=1] +[ext_resource path="res://scripts/entities/Player.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] + +[sub_resource type="DynamicFontData" id=2] +font_path = "res://assets/fonts/hf-free-complete/compass-pro-v1.1/CompassPro.ttf" + +[sub_resource type="DynamicFont" id=3] +font_data = SubResource( 2 ) + +[node name="Player" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[node name="Camera2D" type="Camera2D" parent="."] +current = true +zoom = Vector2( 0.5, 0.5 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) + +[node name="Label" type="Label" parent="."] +margin_left = -32.0 +margin_top = -30.0 +margin_right = 32.0 +margin_bottom = -10.0 +custom_fonts/font = SubResource( 3 ) +custom_colors/font_color = Color( 1, 1, 1, 0.607843 ) +text = "Username" +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/client/nodes/entities/crystal.tscn b/client/nodes/entities/crystal.tscn new file mode 100644 index 0000000..769fa66 --- /dev/null +++ b/client/nodes/entities/crystal.tscn @@ -0,0 +1,16 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://assets/images/entities/crystal.png" type="Texture" id=1] +[ext_resource path="res://scripts/entities/LifeCrystal.gd" type="Script" id=2] + +[sub_resource type="CircleShape2D" id=1] +radius = 16.0 + +[node name="LifeCrystal" type="Area2D"] +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) diff --git a/client/nodes/entities/player.tscn b/client/nodes/entities/player.tscn new file mode 100644 index 0000000..94b4467 --- /dev/null +++ b/client/nodes/entities/player.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://assets/images/character/iron_player.png" type="Texture" id=1] +[ext_resource path="res://scripts/entities/Player.gd" type="Script" id=2] + +[sub_resource type="RectangleShape2D" id=1] + +[sub_resource type="DynamicFontData" id=2] +font_path = "res://assets/fonts/hf-free-complete/compass-pro-v1.1/CompassPro.ttf" + +[sub_resource type="DynamicFont" id=3] +font_data = SubResource( 2 ) + +[node name="Player" type="KinematicBody2D"] +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +texture = ExtResource( 1 ) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource( 1 ) + +[node name="Label" type="Label" parent="."] +margin_left = -32.0 +margin_top = -30.0 +margin_right = 32.0 +margin_bottom = -10.0 +custom_fonts/font = SubResource( 3 ) +custom_colors/font_color = Color( 1, 1, 1, 0.607843 ) +text = "Username" +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} diff --git a/client/project.godot b/client/project.godot new file mode 100644 index 0000000..11734e5 --- /dev/null +++ b/client/project.godot @@ -0,0 +1,29 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ ] +_global_script_class_icons={ + +} + +[application] + +config/name="client" +run/main_scene="res://scenes/login.scn" +config/icon="res://icon.png" + +[autoload] + +MusicManager="*res://nodes/MusicManager.tscn" +NetworkManager="*res://nodes/NetworkManager.tscn" + +[rendering] + +environment/default_environment="res://default_env.tres" diff --git a/client/scenes/game.scn b/client/scenes/game.scn new file mode 100644 index 0000000..090f0cf Binary files /dev/null and b/client/scenes/game.scn differ diff --git a/client/scenes/icon.tscn b/client/scenes/icon.tscn new file mode 100644 index 0000000..065a3dd --- /dev/null +++ b/client/scenes/icon.tscn @@ -0,0 +1,37 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://nodes/Player.tscn" type="PackedScene" id=1] +[ext_resource path="res://nodes/entities/crystal.tscn" type="PackedScene" id=2] +[ext_resource path="res://tilesets/floor_tileset.tres" type="TileSet" id=3] +[ext_resource path="res://tilesets/wall_tileset.tres" type="TileSet" id=4] + +[node name="Node2D" type="Node2D"] + +[node name="TileMap" type="TileMap" parent="."] +z_index = -5 +tile_set = ExtResource( 3 ) +cell_size = Vector2( 16, 16 ) +format = 1 +tile_data = PoolIntArray( -1179655, 0, 0, -1179654, 0, 0, -1179653, 0, 0, -1114123, 0, 0, -1114122, 0, 0, -1114121, 0, 0, -1114120, 0, 0, -1114119, 0, 0, -1114118, 0, 0, -1114117, 0, 0, -1114116, 0, 0, -1114115, 0, 0, -1114114, 0, 0, -1114113, 0, 0, -1179648, 0, 0, -1179647, 0, 0, -1179646, 0, 0, -1179645, 0, 0, -1048590, 0, 0, -1048589, 0, 0, -1048588, 0, 0, -1048587, 0, 0, -1048586, 0, 0, -1048585, 0, 0, -1048584, 0, 0, -1048583, 0, 0, -1048582, 0, 0, -1048581, 0, 0, -1048580, 0, 0, -1048579, 0, 0, -1048578, 0, 0, -1048577, 0, 0, -1114112, 0, 0, -1114111, 0, 0, -1114110, 0, 0, -1114109, 0, 0, -1114108, 0, 0, -1114107, 0, 0, -1114106, 0, 0, -1114105, 0, 0, -983056, 0, 0, -983055, 0, 0, -983054, 0, 0, -983053, 0, 0, -983052, 0, 0, -983051, 0, 0, -983050, 0, 0, -983049, 0, 0, -983048, 0, 0, -983047, 0, 0, -983046, 0, 0, -983045, 0, 0, -983044, 0, 0, -983043, 0, 0, -983042, 0, 0, -983041, 0, 0, -1048576, 0, 0, -1048575, 0, 0, -1048574, 0, 0, -1048573, 0, 0, -1048572, 0, 0, -1048571, 0, 0, -1048570, 0, 0, -1048569, 0, 0, -1048568, 0, 0, -1048567, 0, 0, -1048566, 0, 0, -917524, 0, 0, -917523, 0, 0, -917522, 0, 0, -917521, 0, 0, -917520, 0, 0, -917519, 0, 0, -917518, 0, 0, -917517, 0, 0, -917516, 0, 0, -917515, 0, 0, -917514, 0, 0, -917513, 0, 0, -917512, 0, 0, -917511, 0, 0, -917510, 0, 0, -917509, 0, 0, -917508, 0, 0, -917507, 0, 0, -917506, 0, 0, -917505, 0, 0, -983040, 0, 0, -983039, 0, 0, -983038, 0, 0, -983037, 0, 0, -983036, 0, 0, -983035, 0, 0, -983034, 0, 0, -983033, 0, 0, -983032, 0, 0, -983031, 0, 0, -983030, 0, 0, -983029, 0, 0, -983028, 0, 0, -983027, 0, 0, -851998, 0, 0, -851996, 0, 0, -851995, 0, 0, -851994, 0, 0, -851989, 0, 0, -851988, 0, 0, -851987, 0, 0, -851986, 0, 0, -851985, 0, 0, -851984, 0, 0, -851983, 0, 0, -851982, 0, 0, -851981, 0, 0, -851980, 0, 0, -851979, 0, 0, -851978, 0, 0, -851977, 0, 0, -851976, 0, 0, -851975, 0, 0, -851974, 0, 0, -851973, 0, 0, -851972, 0, 0, -851971, 0, 0, -851970, 0, 0, -851969, 0, 0, -917504, 0, 0, -917503, 0, 0, -917502, 0, 0, -917501, 0, 0, -917500, 0, 0, -917499, 0, 0, -917498, 0, 0, -917497, 0, 0, -917496, 0, 0, -917495, 0, 0, -917494, 0, 0, -917493, 0, 0, -917492, 0, 0, -917491, 0, 0, -917490, 0, 0, -917489, 0, 0, -917488, 0, 0, -786462, 0, 0, -786461, 0, 0, -786460, 0, 0, -786459, 0, 0, -786458, 0, 0, -786457, 0, 0, -786456, 0, 0, -786455, 0, 0, -786454, 0, 0, -786453, 0, 0, -786452, 0, 0, -786451, 0, 0, -786450, 0, 0, -786449, 0, 0, -786448, 0, 0, -786447, 0, 0, -786446, 0, 0, -786445, 0, 0, -786444, 0, 0, -786443, 0, 0, -786442, 0, 0, -786441, 0, 0, -786440, 0, 0, -786439, 0, 0, -786438, 0, 0, -786437, 0, 0, -786436, 0, 0, -786435, 0, 0, -786434, 0, 0, -786433, 0, 0, -851968, 0, 0, -851967, 0, 0, -851966, 0, 0, -851965, 0, 0, -851964, 0, 0, -851963, 0, 0, -851962, 0, 0, -851961, 0, 0, -851960, 0, 0, -851959, 0, 0, -851958, 0, 0, -851957, 0, 0, -851956, 0, 0, -851955, 0, 0, -851954, 0, 0, -851953, 0, 0, -851952, 0, 0, -851951, 0, 0, -851950, 0, 0, -720926, 0, 0, -720925, 0, 0, -720924, 0, 0, -720923, 0, 0, -720922, 0, 0, -720921, 0, 0, -720920, 0, 0, -720919, 0, 0, -720918, 0, 0, -720917, 0, 0, -720916, 0, 0, -720915, 0, 0, -720914, 0, 0, -720913, 0, 0, -720912, 0, 0, -720911, 0, 0, -720910, 0, 0, -720909, 0, 0, -720908, 0, 0, -720907, 0, 0, -720906, 0, 0, -720905, 0, 0, -720904, 0, 0, -720903, 0, 0, -720902, 0, 0, -720901, 0, 0, -720900, 0, 0, -720899, 0, 0, -720898, 0, 0, -720897, 0, 0, -786432, 0, 0, -786431, 0, 0, -786430, 0, 0, -786429, 0, 0, -786428, 0, 0, -786427, 0, 0, -786426, 0, 0, -786425, 0, 0, -786424, 0, 0, -786423, 0, 0, -786422, 0, 0, -786421, 0, 0, -786420, 0, 0, -786419, 0, 0, -786418, 0, 0, -786417, 0, 0, -786416, 0, 0, -786415, 0, 0, -786414, 0, 0, -786413, 0, 0, -786412, 0, 0, -655390, 0, 0, -655389, 0, 0, -655388, 0, 0, -655387, 0, 0, -655386, 0, 0, -655385, 0, 0, -655384, 0, 0, -655383, 0, 0, -655382, 0, 0, -655381, 0, 0, -655380, 0, 0, -655379, 0, 0, -655378, 0, 0, -655377, 0, 0, -655376, 0, 0, -655375, 0, 0, -655374, 0, 0, -655373, 0, 0, -655372, 0, 0, -655371, 0, 0, -655370, 0, 0, -655369, 0, 0, -655368, 0, 0, -655367, 0, 0, -655366, 0, 0, -655365, 0, 0, -655364, 0, 0, -655363, 0, 0, -655362, 0, 0, -655361, 0, 0, -720896, 0, 0, -720895, 0, 0, -720894, 0, 0, -720893, 0, 0, -720892, 0, 0, -720891, 0, 0, -720890, 0, 0, -720889, 0, 0, -720888, 0, 0, -720887, 0, 0, -720886, 0, 0, -720885, 0, 0, -720884, 0, 0, -720883, 0, 0, -720882, 0, 0, -720881, 0, 0, -720880, 0, 0, -720879, 0, 0, -720878, 0, 0, -720877, 0, 0, -720876, 0, 0, -720875, 0, 0, -720874, 0, 0, -589854, 0, 0, -589853, 0, 0, -589852, 0, 0, -589851, 0, 0, -589850, 0, 0, -589849, 0, 0, -589848, 0, 0, -589847, 0, 0, -589846, 0, 0, -589845, 0, 0, -589844, 0, 0, -589843, 0, 0, -589842, 0, 0, -589841, 0, 0, -589840, 0, 0, -589839, 0, 0, -589838, 0, 0, -589837, 0, 0, -589836, 0, 0, -589835, 0, 0, -589834, 0, 0, -589833, 0, 0, -589832, 0, 0, -589831, 0, 0, -589830, 0, 0, -589829, 0, 0, -589828, 0, 0, -589827, 0, 0, -589826, 0, 0, -589825, 0, 0, -655360, 0, 0, -655359, 0, 0, -655358, 0, 0, -655357, 0, 0, -655356, 0, 0, -655355, 0, 0, -655354, 0, 0, -655353, 0, 0, -655352, 0, 0, -655351, 0, 0, -655350, 0, 0, -655349, 0, 0, -655348, 0, 0, -655347, 0, 0, -655346, 0, 0, -655345, 0, 0, -655344, 0, 0, -655343, 0, 0, -655342, 0, 0, -655341, 0, 0, -655340, 0, 0, -655339, 0, 0, -655338, 0, 0, -655337, 0, 0, -655336, 0, 0, -655335, 0, 0, -524318, 0, 0, -524317, 0, 0, -524316, 0, 0, -524315, 0, 0, -524314, 0, 0, -524313, 0, 0, -524312, 0, 0, -524311, 0, 0, -524310, 0, 0, -524309, 0, 0, -524308, 0, 0, -524307, 0, 0, -524306, 0, 0, -524305, 0, 0, -524304, 0, 0, -524303, 0, 0, -524302, 0, 0, -524301, 0, 0, -524300, 0, 0, -524299, 0, 0, -524298, 0, 0, -524297, 0, 0, -524296, 0, 0, -524295, 0, 0, -524294, 0, 0, -524293, 0, 0, -524292, 0, 0, -524291, 0, 0, -524290, 0, 0, -524289, 0, 0, -589824, 0, 0, -589823, 0, 0, -589822, 0, 0, -589821, 0, 0, -589820, 0, 0, -589819, 0, 0, -589818, 0, 0, -589817, 0, 0, -589816, 0, 0, -589815, 0, 0, -589814, 0, 0, -589813, 0, 0, -589812, 0, 0, -589811, 0, 0, -589810, 0, 0, -589809, 0, 0, -589808, 0, 0, -589807, 0, 0, -589806, 0, 0, -589805, 0, 0, -589804, 0, 0, -589803, 0, 0, -589802, 0, 0, -589801, 0, 0, -589800, 0, 0, -589799, 0, 0, -589798, 0, 0, -589797, 0, 0, -589796, 0, 0, -458782, 0, 0, -458781, 0, 0, -458780, 0, 0, -458779, 0, 0, -458778, 0, 0, -458777, 0, 0, -458776, 0, 0, -458775, 0, 0, -458774, 0, 0, -458773, 0, 0, -458772, 0, 0, -458771, 0, 0, -458770, 0, 0, -458769, 0, 0, -458768, 0, 0, -458767, 0, 0, -458766, 0, 0, -458765, 0, 0, -458764, 0, 0, -458763, 0, 0, -458762, 0, 0, -458761, 0, 0, -458760, 0, 0, -458759, 0, 0, -458758, 0, 0, -458757, 0, 0, -458756, 0, 0, -458755, 0, 0, -458754, 0, 0, -458753, 0, 0, -524288, 0, 0, -524287, 0, 0, -524286, 0, 0, -524285, 0, 0, -524284, 0, 0, -524283, 0, 0, -524282, 0, 0, -524281, 0, 0, -524280, 0, 0, -524279, 0, 0, -524278, 0, 0, -524277, 0, 0, -524276, 0, 0, -524275, 0, 0, -524274, 0, 0, -524273, 0, 0, -524272, 0, 0, -524271, 0, 0, -524270, 0, 0, -524269, 0, 0, -524268, 0, 0, -524267, 0, 0, -524266, 0, 0, -524265, 0, 0, -524264, 0, 0, -524263, 0, 0, -524262, 0, 0, -524261, 0, 0, -524260, 0, 0, -524259, 0, 0, -393247, 0, 0, -393246, 0, 0, -393245, 0, 0, -393244, 0, 0, -393243, 0, 0, -393242, 0, 0, -393241, 0, 0, -393240, 0, 0, -393239, 0, 0, -393238, 0, 0, -393237, 0, 0, -393236, 0, 0, -393235, 0, 0, -393234, 0, 0, -393233, 0, 0, -393232, 0, 0, -393231, 0, 0, -393230, 0, 0, -393229, 0, 0, -393228, 0, 0, -393227, 0, 0, -393226, 0, 0, -393225, 0, 0, -393224, 0, 0, -393223, 0, 0, -393222, 0, 0, -393221, 0, 0, -393220, 0, 0, -393219, 0, 0, -393218, 0, 0, -393217, 0, 0, -458752, 0, 0, -458751, 0, 0, -458750, 0, 0, -458749, 0, 0, -458748, 0, 0, -458747, 0, 0, -458746, 0, 0, -458745, 0, 0, -458744, 0, 0, -458743, 0, 0, -458742, 0, 0, -458741, 0, 0, -458740, 0, 0, -458739, 0, 0, -458738, 0, 0, -458737, 0, 0, -458736, 0, 0, -458735, 0, 0, -458734, 0, 0, -458733, 0, 0, -458732, 0, 0, -458731, 0, 0, -458730, 0, 0, -458729, 0, 0, -458728, 0, 0, -458727, 0, 0, -458726, 0, 0, -458725, 0, 0, -458724, 0, 0, -458723, 0, 0, -458722, 0, 0, -327711, 0, 0, -327710, 0, 0, -327709, 0, 0, -327708, 0, 0, -327707, 0, 0, -327706, 0, 0, -327705, 0, 0, -327704, 0, 0, -327703, 0, 0, -327702, 0, 0, -327701, 0, 0, -327700, 0, 0, -327699, 0, 0, -327698, 0, 0, -327697, 0, 0, -327696, 0, 0, -327695, 0, 0, -327694, 0, 0, -327693, 0, 0, -327692, 0, 0, -327691, 0, 0, -327690, 0, 0, -327689, 0, 0, -327688, 0, 0, -327687, 0, 0, -327686, 0, 0, -327685, 0, 0, -327684, 0, 0, -327683, 0, 0, -327682, 0, 0, -327681, 0, 0, -393216, 0, 0, -393215, 0, 0, -393214, 0, 0, -393213, 0, 0, -393212, 0, 0, -393211, 0, 0, -393210, 0, 0, -393209, 0, 0, -393208, 0, 0, -393207, 0, 0, -393206, 0, 0, -393205, 0, 0, -393204, 0, 0, -393203, 0, 0, -393202, 0, 0, -393201, 0, 0, -393200, 0, 0, -393199, 0, 0, -393198, 0, 0, -393197, 0, 0, -393196, 0, 0, -393195, 0, 0, -393194, 0, 0, -393193, 0, 0, -393192, 0, 0, -393191, 0, 0, -393190, 0, 0, -393189, 0, 0, -393188, 0, 0, -393187, 0, 0, -393186, 0, 0, -393185, 0, 0, -262175, 0, 0, -262174, 0, 0, -262173, 0, 0, -262172, 0, 0, -262171, 0, 0, -262170, 0, 0, -262169, 0, 0, -262168, 0, 0, -262167, 0, 0, -262166, 0, 0, -262165, 0, 0, -262164, 0, 0, -262163, 0, 0, -262162, 0, 0, -262161, 0, 0, -262160, 0, 0, -262159, 0, 0, -262158, 0, 0, -262157, 0, 0, -262156, 0, 0, -262155, 0, 0, -262154, 0, 0, -262153, 0, 0, -262152, 0, 0, -262151, 0, 0, -262150, 0, 0, -262149, 0, 0, -262148, 0, 0, -262147, 0, 0, -262146, 0, 0, -262145, 0, 0, -327680, 0, 0, -327679, 0, 0, -327678, 0, 0, -327677, 0, 0, -327676, 0, 0, -327675, 0, 0, -327674, 0, 0, -327673, 0, 0, -327672, 0, 0, -327671, 0, 0, -327670, 0, 0, -327669, 0, 0, -327668, 0, 0, -327667, 0, 0, -327666, 0, 0, -327665, 0, 0, -327664, 0, 0, -327663, 0, 0, -327662, 0, 0, -327661, 0, 0, -327660, 0, 0, -327659, 0, 0, -327658, 0, 0, -327657, 0, 0, -327656, 0, 0, -327655, 0, 0, -327654, 0, 0, -327653, 0, 0, -327652, 0, 0, -327651, 0, 0, -327650, 0, 0, -327649, 0, 0, -196639, 0, 0, -196638, 0, 0, -196637, 0, 0, -196636, 0, 0, -196635, 0, 0, -196634, 0, 0, -196633, 0, 0, -196632, 0, 0, -196631, 0, 0, -196630, 0, 0, -196629, 0, 0, -196628, 0, 0, -196627, 0, 0, -196626, 0, 0, -196625, 0, 0, -196624, 0, 0, -196623, 0, 0, -196622, 0, 0, -196621, 0, 0, -196620, 0, 0, -196619, 0, 0, -196618, 0, 0, -196617, 0, 0, -196616, 0, 0, -196615, 0, 0, -196614, 0, 0, -196613, 0, 0, -196612, 0, 0, -196611, 0, 0, -196610, 0, 0, -196609, 0, 0, -262144, 0, 0, -262143, 0, 0, -262142, 0, 0, -262141, 0, 0, -262140, 0, 0, -262139, 0, 0, -262138, 0, 0, -262137, 0, 0, -262136, 0, 0, -262135, 0, 0, -262134, 0, 0, -262133, 0, 0, -262132, 0, 0, -262131, 0, 0, -262130, 0, 0, -262129, 0, 0, -262128, 0, 0, -262127, 0, 0, -262126, 0, 0, -262125, 0, 0, -262124, 0, 0, -262123, 0, 0, -262122, 0, 0, -262121, 0, 0, -262120, 0, 0, -262119, 0, 0, -262118, 0, 0, -262117, 0, 0, -262116, 0, 0, -262115, 0, 0, -262114, 0, 0, -262113, 0, 0, -131103, 0, 0, -131102, 0, 0, -131101, 0, 0, -131100, 0, 0, -131099, 0, 0, -131098, 0, 0, -131097, 0, 0, -131096, 0, 0, -131095, 0, 0, -131094, 0, 0, -131093, 0, 0, -131092, 0, 0, -131091, 0, 0, -131090, 0, 0, -131089, 0, 0, -131088, 0, 0, -131087, 0, 0, -131086, 0, 0, -131085, 0, 0, -131084, 0, 0, -131083, 0, 0, -131082, 0, 0, -131081, 0, 0, -131080, 0, 0, -131079, 0, 0, -131078, 0, 0, -131077, 0, 0, -131076, 0, 0, -131075, 0, 0, -131074, 0, 0, -131073, 0, 0, -196608, 0, 0, -196607, 0, 0, -196606, 0, 0, -196605, 0, 0, -196604, 0, 0, -196603, 0, 0, -196602, 0, 0, -196601, 0, 0, -196600, 0, 0, -196599, 0, 0, -196598, 0, 0, -196597, 0, 0, -196596, 0, 0, -196595, 0, 0, -196594, 0, 0, -196593, 0, 0, -196592, 0, 0, -196591, 0, 0, -196590, 0, 0, -196589, 0, 0, -196588, 0, 0, -196587, 0, 0, -196586, 0, 0, -196585, 0, 0, -196584, 0, 0, -196583, 0, 0, -196582, 0, 0, -196581, 0, 0, -196580, 0, 0, -196579, 0, 0, -196578, 0, 0, -196577, 0, 0, -65567, 0, 0, -65566, 0, 0, -65565, 0, 0, -65564, 0, 0, -65563, 0, 0, -65562, 0, 0, -65561, 0, 0, -65560, 0, 0, -65559, 0, 0, -65558, 0, 0, -65557, 0, 0, -65556, 0, 0, -65555, 0, 0, -65554, 0, 0, -65553, 0, 0, -65552, 0, 0, -65551, 0, 0, -65550, 0, 0, -65549, 0, 0, -65548, 0, 0, -65547, 0, 0, -65546, 0, 0, -65545, 0, 0, -65544, 0, 0, -65543, 0, 0, -65542, 0, 0, -65541, 0, 0, -65540, 0, 0, -65539, 0, 0, -65538, 0, 0, -65537, 0, 0, -131072, 0, 0, -131071, 0, 0, -131070, 0, 0, -131069, 0, 0, -131068, 0, 0, -131067, 0, 0, -131066, 0, 0, -131065, 0, 0, -131064, 0, 0, -131063, 0, 0, -131062, 0, 0, -131061, 0, 0, -131060, 0, 0, -131059, 0, 0, -131058, 0, 0, -131057, 0, 0, -131056, 0, 0, -131055, 0, 0, -131054, 0, 0, -131053, 0, 0, -131052, 0, 0, -131051, 0, 0, -131050, 0, 0, -131049, 0, 0, -131048, 0, 0, -131047, 0, 0, -131046, 0, 0, -131045, 0, 0, -131044, 0, 0, -131043, 0, 0, -131042, 0, 0, -131041, 0, 0, -31, 0, 0, -30, 0, 0, -29, 0, 0, -28, 0, 0, -27, 0, 0, -26, 0, 0, -25, 0, 0, -24, 0, 0, -23, 0, 0, -22, 0, 0, -21, 0, 0, -20, 0, 0, -19, 0, 0, -18, 0, 0, -17, 0, 0, -16, 0, 0, -15, 0, 0, -14, 0, 0, -13, 0, 0, -12, 0, 0, -11, 0, 0, -10, 0, 0, -9, 0, 0, -8, 0, 0, -7, 0, 0, -6, 0, 0, -5, 0, 0, -4, 0, 0, -3, 0, 0, -2, 0, 0, -1, 0, 0, -65536, 0, 0, -65535, 0, 0, -65534, 0, 0, -65533, 0, 0, -65532, 0, 0, -65531, 0, 0, -65530, 0, 0, -65529, 0, 0, -65528, 0, 0, -65527, 0, 0, -65526, 0, 0, -65525, 0, 0, -65524, 0, 0, -65523, 0, 0, -65522, 0, 0, -65521, 0, 0, -65520, 0, 0, -65519, 0, 0, -65518, 0, 0, -65517, 0, 0, -65516, 0, 0, -65515, 0, 0, -65514, 0, 0, -65513, 0, 0, -65512, 0, 0, -65511, 0, 0, -65510, 0, 0, -65509, 0, 0, -65508, 0, 0, -65507, 0, 0, -65506, 0, 0, -65505, 0, 0, 65505, 0, 0, 65506, 0, 0, 65507, 0, 0, 65508, 0, 0, 65509, 0, 0, 65510, 0, 0, 65511, 0, 0, 65512, 0, 0, 65513, 0, 0, 65514, 0, 0, 65515, 0, 0, 65516, 0, 0, 65517, 0, 0, 65518, 0, 0, 65519, 0, 0, 65520, 0, 0, 65521, 0, 0, 65522, 0, 0, 65523, 0, 0, 65524, 0, 0, 65525, 0, 0, 65526, 0, 0, 65527, 0, 0, 65528, 0, 0, 65529, 0, 0, 65530, 0, 0, 65531, 0, 0, 65532, 0, 0, 65533, 0, 0, 65534, 0, 0, 65535, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 4, 0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 8, 0, 0, 9, 0, 0, 10, 0, 0, 11, 0, 0, 12, 0, 0, 13, 0, 0, 14, 0, 0, 15, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 21, 0, 0, 22, 0, 0, 23, 0, 0, 24, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 0, 28, 0, 0, 29, 0, 0, 30, 0, 0, 31, 0, 0, 131040, 0, 0, 131041, 0, 0, 131042, 0, 0, 131043, 0, 0, 131044, 0, 0, 131045, 0, 0, 131046, 0, 0, 131047, 0, 0, 131048, 0, 0, 131049, 0, 0, 131050, 0, 0, 131051, 0, 0, 131052, 0, 0, 131053, 0, 0, 131054, 0, 0, 131055, 0, 0, 131056, 0, 0, 131057, 0, 0, 131058, 0, 0, 131059, 0, 0, 131060, 0, 0, 131061, 0, 0, 131062, 0, 0, 131063, 0, 0, 131064, 0, 0, 131065, 0, 0, 131066, 0, 0, 131067, 0, 0, 131068, 0, 0, 131069, 0, 0, 131070, 0, 0, 131071, 0, 0, 65536, 0, 0, 65537, 0, 0, 65538, 0, 0, 65539, 0, 0, 65540, 0, 0, 65541, 0, 0, 65542, 0, 0, 65543, 0, 0, 65544, 0, 0, 65545, 0, 0, 65546, 0, 0, 65547, 0, 0, 65548, 0, 0, 65549, 0, 0, 65550, 0, 0, 65551, 0, 0, 65552, 0, 0, 65553, 0, 0, 65554, 0, 0, 65555, 0, 0, 65556, 0, 0, 65557, 0, 0, 65558, 0, 0, 65559, 0, 0, 65560, 0, 0, 65561, 0, 0, 65562, 0, 0, 65563, 0, 0, 65564, 0, 0, 65565, 0, 0, 65566, 0, 0, 65567, 0, 0, 196576, 0, 0, 196577, 0, 0, 196578, 0, 0, 196579, 0, 0, 196580, 0, 0, 196581, 0, 0, 196582, 0, 0, 196583, 0, 0, 196584, 0, 0, 196585, 0, 0, 196586, 0, 0, 196587, 0, 0, 196588, 0, 0, 196589, 0, 0, 196590, 0, 0, 196591, 0, 0, 196592, 0, 0, 196593, 0, 0, 196594, 0, 0, 196595, 0, 0, 196596, 0, 0, 196597, 0, 0, 196598, 0, 0, 196599, 0, 0, 196600, 0, 0, 196601, 0, 0, 196602, 0, 0, 196603, 0, 0, 196604, 0, 0, 196605, 0, 0, 196606, 0, 0, 196607, 0, 0, 131072, 0, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 0, 0, 131087, 0, 0, 131088, 0, 0, 131089, 0, 0, 131090, 0, 0, 131091, 0, 0, 131092, 0, 0, 131093, 0, 0, 131094, 0, 0, 131095, 0, 0, 131096, 0, 0, 131097, 0, 0, 131098, 0, 0, 131099, 0, 0, 131100, 0, 0, 131101, 0, 0, 131102, 0, 0, 262112, 0, 0, 262113, 0, 0, 262114, 0, 0, 262115, 0, 0, 262116, 0, 0, 262117, 0, 0, 262118, 0, 0, 262119, 0, 0, 262120, 0, 0, 262121, 0, 0, 262122, 0, 0, 262123, 0, 0, 262124, 0, 0, 262125, 0, 0, 262126, 0, 0, 262127, 0, 0, 262128, 0, 0, 262129, 0, 0, 262130, 0, 0, 262131, 0, 0, 262132, 0, 0, 262133, 0, 0, 262134, 0, 0, 262135, 0, 0, 262136, 0, 0, 262137, 0, 0, 262138, 0, 0, 262139, 0, 0, 262140, 0, 0, 262141, 0, 0, 262142, 0, 0, 262143, 0, 0, 196608, 0, 0, 196609, 0, 0, 196610, 0, 0, 196611, 0, 0, 196612, 0, 0, 196613, 0, 0, 196614, 0, 0, 196615, 0, 0, 196616, 0, 0, 196617, 0, 0, 196618, 0, 0, 196619, 0, 0, 196620, 0, 0, 196621, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 196625, 0, 0, 196626, 0, 0, 196627, 0, 0, 196628, 0, 0, 196629, 0, 0, 196630, 0, 0, 196631, 0, 0, 196632, 0, 0, 196633, 0, 0, 196634, 0, 0, 196635, 0, 0, 196636, 0, 0, 196637, 0, 0, 196638, 0, 0, 327648, 0, 0, 327649, 0, 0, 327650, 0, 0, 327651, 0, 0, 327652, 0, 0, 327653, 0, 0, 327654, 0, 0, 327655, 0, 0, 327656, 0, 0, 327657, 0, 0, 327658, 0, 0, 327659, 0, 0, 327660, 0, 0, 327661, 0, 0, 327662, 0, 0, 327663, 0, 0, 327664, 0, 0, 327665, 0, 0, 327666, 0, 0, 327667, 0, 0, 327668, 0, 0, 327669, 0, 0, 327670, 0, 0, 327671, 0, 0, 327672, 0, 0, 327673, 0, 0, 327674, 0, 0, 327675, 0, 0, 327676, 0, 0, 327677, 0, 0, 327678, 0, 0, 327679, 0, 0, 262144, 0, 0, 262145, 0, 0, 262146, 0, 0, 262147, 0, 0, 262148, 0, 0, 262149, 0, 0, 262150, 0, 0, 262151, 0, 0, 262152, 0, 0, 262153, 0, 0, 262154, 0, 0, 262155, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262159, 0, 0, 262160, 0, 0, 262161, 0, 0, 262162, 0, 0, 262163, 0, 0, 262164, 0, 0, 262165, 0, 0, 262166, 0, 0, 262167, 0, 0, 262168, 0, 0, 262169, 0, 0, 262170, 0, 0, 262171, 0, 0, 262172, 0, 0, 262173, 0, 0, 393184, 0, 0, 393185, 0, 0, 393186, 0, 0, 393187, 0, 0, 393188, 0, 0, 393189, 0, 0, 393190, 0, 0, 393191, 0, 0, 393192, 0, 0, 393193, 0, 0, 393194, 0, 0, 393195, 0, 0, 393196, 0, 0, 393197, 0, 0, 393198, 0, 0, 393199, 0, 0, 393200, 0, 0, 393201, 0, 0, 393202, 0, 0, 393203, 0, 0, 393204, 0, 0, 393205, 0, 0, 393206, 0, 0, 393207, 0, 0, 393208, 0, 0, 393209, 0, 0, 393210, 0, 0, 393211, 0, 0, 393212, 0, 0, 393213, 0, 0, 393214, 0, 0, 393215, 0, 0, 327680, 0, 0, 327681, 0, 0, 327682, 0, 0, 327683, 0, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327687, 0, 0, 327688, 0, 0, 327689, 0, 0, 327690, 0, 0, 327691, 0, 0, 327692, 0, 0, 327693, 0, 0, 327694, 0, 0, 327695, 0, 0, 327696, 0, 0, 327697, 0, 0, 327698, 0, 0, 327699, 0, 0, 327700, 0, 0, 327701, 0, 0, 327702, 0, 0, 327703, 0, 0, 327704, 0, 0, 327705, 0, 0, 327706, 0, 0, 327707, 0, 0, 327708, 0, 0, 327709, 0, 0, 458720, 0, 0, 458721, 0, 0, 458722, 0, 0, 458723, 0, 0, 458724, 0, 0, 458725, 0, 0, 458726, 0, 0, 458727, 0, 0, 458728, 0, 0, 458729, 0, 0, 458730, 0, 0, 458731, 0, 0, 458732, 0, 0, 458733, 0, 0, 458734, 0, 0, 458735, 0, 0, 458736, 0, 0, 458737, 0, 0, 458738, 0, 0, 458739, 0, 0, 458740, 0, 0, 458741, 0, 0, 458742, 0, 0, 458743, 0, 0, 458744, 0, 0, 458745, 0, 0, 458746, 0, 0, 458747, 0, 0, 458748, 0, 0, 458749, 0, 0, 458750, 0, 0, 458751, 0, 0, 393216, 0, 0, 393217, 0, 0, 393218, 0, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393230, 0, 0, 393231, 0, 0, 393232, 0, 0, 393233, 0, 0, 393234, 0, 0, 393235, 0, 0, 393236, 0, 0, 393237, 0, 0, 393238, 0, 0, 393239, 0, 0, 393240, 0, 0, 393241, 0, 0, 393242, 0, 0, 393243, 0, 0, 393244, 0, 0, 524256, 0, 0, 524257, 0, 0, 524258, 0, 0, 524259, 0, 0, 524260, 0, 0, 524261, 0, 0, 524262, 0, 0, 524263, 0, 0, 524264, 0, 0, 524265, 0, 0, 524266, 0, 0, 524267, 0, 0, 524268, 0, 0, 524269, 0, 0, 524270, 0, 0, 524271, 0, 0, 524272, 0, 0, 524273, 0, 0, 524274, 0, 0, 524275, 0, 0, 524276, 0, 0, 524277, 0, 0, 524278, 0, 0, 524279, 0, 0, 524280, 0, 0, 524281, 0, 0, 524282, 0, 0, 524283, 0, 0, 524284, 0, 0, 524285, 0, 0, 524286, 0, 0, 524287, 0, 0, 458752, 0, 0, 458753, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 0, 0, 458758, 0, 0, 458759, 0, 0, 458760, 0, 0, 458761, 0, 0, 458762, 0, 0, 458763, 0, 0, 458764, 0, 0, 458765, 0, 0, 458766, 0, 0, 458767, 0, 0, 458768, 0, 0, 458769, 0, 0, 458770, 0, 0, 458771, 0, 0, 458772, 0, 0, 458773, 0, 0, 458774, 0, 0, 458775, 0, 0, 458776, 0, 0, 458777, 0, 0, 458778, 0, 0, 458779, 0, 0, 458780, 0, 0, 589792, 0, 0, 589793, 0, 0, 589794, 0, 0, 589795, 0, 0, 589796, 0, 0, 589797, 0, 0, 589798, 0, 0, 589799, 0, 0, 589800, 0, 0, 589801, 0, 0, 589802, 0, 0, 589803, 0, 0, 589804, 0, 0, 589805, 0, 0, 589806, 0, 0, 589807, 0, 0, 589808, 0, 0, 589809, 0, 0, 589810, 0, 0, 589811, 0, 0, 589812, 0, 0, 589813, 0, 0, 589814, 0, 0, 589815, 0, 0, 589816, 0, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 0, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524290, 0, 0, 524291, 0, 0, 524292, 0, 0, 524293, 0, 0, 524294, 0, 0, 524295, 0, 0, 524296, 0, 0, 524297, 0, 0, 524298, 0, 0, 524299, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 524307, 0, 0, 524308, 0, 0, 524309, 0, 0, 524310, 0, 0, 524311, 0, 0, 524312, 0, 0, 524313, 0, 0, 524314, 0, 0, 524315, 0, 0, 655328, 0, 0, 655329, 0, 0, 655330, 0, 0, 655331, 0, 0, 655332, 0, 0, 655333, 0, 0, 655334, 0, 0, 655335, 0, 0, 655336, 0, 0, 655337, 0, 0, 655338, 0, 0, 655339, 0, 0, 655340, 0, 0, 655341, 0, 0, 655342, 0, 0, 655343, 0, 0, 655344, 0, 0, 655345, 0, 0, 655346, 0, 0, 655347, 0, 0, 655348, 0, 0, 655349, 0, 0, 655350, 0, 0, 655351, 0, 0, 655352, 0, 0, 655353, 0, 0, 655354, 0, 0, 655355, 0, 0, 655356, 0, 0, 655357, 0, 0, 655358, 0, 0, 655359, 0, 0, 589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 589842, 0, 0, 589843, 0, 0, 589844, 0, 0, 589845, 0, 0, 589846, 0, 0, 589847, 0, 0, 589848, 0, 0, 589849, 0, 0, 589850, 0, 0, 589851, 0, 0, 720865, 0, 0, 720866, 0, 0, 720867, 0, 0, 720868, 0, 0, 720869, 0, 0, 720870, 0, 0, 720871, 0, 0, 720872, 0, 0, 720873, 0, 0, 720874, 0, 0, 720875, 0, 0, 720876, 0, 0, 720877, 0, 0, 720878, 0, 0, 720879, 0, 0, 720880, 0, 0, 720881, 0, 0, 720882, 0, 0, 720883, 0, 0, 720884, 0, 0, 720885, 0, 0, 720886, 0, 0, 720887, 0, 0, 720888, 0, 0, 720889, 0, 0, 720890, 0, 0, 720891, 0, 0, 720892, 0, 0, 720893, 0, 0, 720894, 0, 0, 720895, 0, 0, 655360, 0, 0, 655361, 0, 0, 655362, 0, 0, 655363, 0, 0, 655364, 0, 0, 655365, 0, 0, 655366, 0, 0, 655367, 0, 0, 655368, 0, 0, 655369, 0, 0, 655370, 0, 0, 655371, 0, 0, 655372, 0, 0, 655373, 0, 0, 655374, 0, 0, 655375, 0, 0, 655376, 0, 0, 655377, 0, 0, 655378, 0, 0, 655379, 0, 0, 655380, 0, 0, 655381, 0, 0, 655382, 0, 0, 655383, 0, 0, 655384, 0, 0, 655385, 0, 0, 655386, 0, 0, 786401, 0, 0, 786402, 0, 0, 786403, 0, 0, 786404, 0, 0, 786405, 0, 0, 786406, 0, 0, 786407, 0, 0, 786408, 0, 0, 786409, 0, 0, 786410, 0, 0, 786411, 0, 0, 786412, 0, 0, 786413, 0, 0, 786414, 0, 0, 786415, 0, 0, 786416, 0, 0, 786417, 0, 0, 786418, 0, 0, 786419, 0, 0, 786420, 0, 0, 786421, 0, 0, 786422, 0, 0, 786423, 0, 0, 786424, 0, 0, 786425, 0, 0, 786426, 0, 0, 786427, 0, 0, 786428, 0, 0, 786429, 0, 0, 786430, 0, 0, 786431, 0, 0, 720896, 0, 0, 720897, 0, 0, 720898, 0, 0, 720899, 0, 0, 720900, 0, 0, 720901, 0, 0, 720902, 0, 0, 720903, 0, 0, 720904, 0, 0, 720905, 0, 0, 720906, 0, 0, 720907, 0, 0, 720908, 0, 0, 720909, 0, 0, 720910, 0, 0, 720911, 0, 0, 720912, 0, 0, 720913, 0, 0, 720914, 0, 0, 720915, 0, 0, 720916, 0, 0, 720917, 0, 0, 720918, 0, 0, 720919, 0, 0, 720920, 0, 0, 720921, 0, 0, 720922, 0, 0, 851937, 0, 0, 851938, 0, 0, 851939, 0, 0, 851940, 0, 0, 851941, 0, 0, 851942, 0, 0, 851943, 0, 0, 851944, 0, 0, 851945, 0, 0, 851946, 0, 0, 851947, 0, 0, 851948, 0, 0, 851949, 0, 0, 851950, 0, 0, 851951, 0, 0, 851952, 0, 0, 851953, 0, 0, 851954, 0, 0, 851955, 0, 0, 851956, 0, 0, 851957, 0, 0, 851958, 0, 0, 851959, 0, 0, 851960, 0, 0, 851961, 0, 0, 851962, 0, 0, 851963, 0, 0, 851964, 0, 0, 851965, 0, 0, 851966, 0, 0, 851967, 0, 0, 786432, 0, 0, 786433, 0, 0, 786434, 0, 0, 786435, 0, 0, 786436, 0, 0, 786437, 0, 0, 786438, 0, 0, 786439, 0, 0, 786440, 0, 0, 786441, 0, 0, 786442, 0, 0, 786443, 0, 0, 786444, 0, 0, 786445, 0, 0, 786446, 0, 0, 786447, 0, 0, 786448, 0, 0, 786449, 0, 0, 786450, 0, 0, 786451, 0, 0, 786452, 0, 0, 786453, 0, 0, 786454, 0, 0, 786455, 0, 0, 786456, 0, 0, 786457, 0, 0, 917473, 0, 0, 917474, 0, 0, 917475, 0, 0, 917476, 0, 0, 917477, 0, 0, 917478, 0, 0, 917479, 0, 0, 917480, 0, 0, 917481, 0, 0, 917482, 0, 0, 917483, 0, 0, 917484, 0, 0, 917485, 0, 0, 917486, 0, 0, 917487, 0, 0, 917488, 0, 0, 917489, 0, 0, 917490, 0, 0, 917491, 0, 0, 917492, 0, 0, 917493, 0, 0, 917494, 0, 0, 917495, 0, 0, 917496, 0, 0, 917497, 0, 0, 917498, 0, 0, 917499, 0, 0, 917500, 0, 0, 917501, 0, 0, 917502, 0, 0, 917503, 0, 0, 851968, 0, 0, 851969, 0, 0, 851970, 0, 0, 851971, 0, 0, 851972, 0, 0, 851973, 0, 0, 851974, 0, 0, 851975, 0, 0, 851976, 0, 0, 851977, 0, 0, 851978, 0, 0, 851979, 0, 0, 851980, 0, 0, 851981, 0, 0, 851982, 0, 0, 851983, 0, 0, 851984, 0, 0, 851985, 0, 0, 851986, 0, 0, 851987, 0, 0, 851988, 0, 0, 851989, 0, 0, 851990, 0, 0, 851991, 0, 0, 851992, 0, 0, 851993, 0, 0, 983010, 0, 0, 983011, 0, 0, 983012, 0, 0, 983013, 0, 0, 983014, 0, 0, 983015, 0, 0, 983016, 0, 0, 983017, 0, 0, 983018, 0, 0, 983019, 0, 0, 983020, 0, 0, 983021, 0, 0, 983022, 0, 0, 983023, 0, 0, 983024, 0, 0, 983025, 0, 0, 983026, 0, 0, 983027, 0, 0, 983028, 0, 0, 983029, 0, 0, 983030, 0, 0, 983031, 0, 0, 983032, 0, 0, 983033, 0, 0, 983034, 0, 0, 983035, 0, 0, 983036, 0, 0, 983037, 0, 0, 983038, 0, 0, 983039, 0, 0, 917504, 0, 0, 917505, 0, 0, 917506, 0, 0, 917507, 0, 0, 917508, 0, 0, 917509, 0, 0, 917510, 0, 0, 917511, 0, 0, 917512, 0, 0, 917513, 0, 0, 917514, 0, 0, 917515, 0, 0, 917516, 0, 0, 917517, 0, 0, 917518, 0, 0, 917519, 0, 0, 917520, 0, 0, 917521, 0, 0, 917522, 0, 0, 917523, 0, 0, 917524, 0, 0, 917525, 0, 0, 917526, 0, 0, 917527, 0, 0, 917528, 0, 0, 1048546, 0, 0, 1048547, 0, 0, 1048548, 0, 0, 1048549, 0, 0, 1048550, 0, 0, 1048551, 0, 0, 1048552, 0, 0, 1048553, 0, 0, 1048554, 0, 0, 1048555, 0, 0, 1048556, 0, 0, 1048557, 0, 0, 1048558, 0, 0, 1048559, 0, 0, 1048560, 0, 0, 1048561, 0, 0, 1048562, 0, 0, 1048563, 0, 0, 1048564, 0, 0, 1048565, 0, 0, 1048566, 0, 0, 1048567, 0, 0, 1048568, 0, 0, 1048569, 0, 0, 1048570, 0, 0, 1048571, 0, 0, 1048572, 0, 0, 1048573, 0, 0, 1048574, 0, 0, 1048575, 0, 0, 983040, 0, 0, 983041, 0, 0, 983042, 0, 0, 983043, 0, 0, 983044, 0, 0, 983045, 0, 0, 983046, 0, 0, 983047, 0, 0, 983048, 0, 0, 983049, 0, 0, 983050, 0, 0, 983051, 0, 0, 983052, 0, 0, 983053, 0, 0, 983054, 0, 0, 983055, 0, 0, 983056, 0, 0, 983057, 0, 0, 983058, 0, 0, 983059, 0, 0, 983060, 0, 0, 983061, 0, 0, 983062, 0, 0, 983063, 0, 0, 1114082, 0, 0, 1114083, 0, 0, 1114084, 0, 0, 1114085, 0, 0, 1114086, 0, 0, 1114087, 0, 0, 1114088, 0, 0, 1114089, 0, 0, 1114090, 0, 0, 1114091, 0, 0, 1114092, 0, 0, 1114093, 0, 0, 1114094, 0, 0, 1114095, 0, 0, 1114096, 0, 0, 1114097, 0, 0, 1114098, 0, 0, 1114099, 0, 0, 1114100, 0, 0, 1114101, 0, 0, 1114102, 0, 0, 1114103, 0, 0, 1114104, 0, 0, 1114105, 0, 0, 1114106, 0, 0, 1114107, 0, 0, 1114108, 0, 0, 1114109, 0, 0, 1114110, 0, 0, 1114111, 0, 0, 1048576, 0, 0, 1048577, 0, 0, 1048578, 0, 0, 1048579, 0, 0, 1048580, 0, 0, 1048581, 0, 0, 1048582, 0, 0, 1048583, 0, 0, 1048584, 0, 0, 1048585, 0, 0, 1048586, 0, 0, 1048587, 0, 0, 1048588, 0, 0, 1048589, 0, 0, 1048590, 0, 0, 1048591, 0, 0, 1048592, 0, 0, 1048593, 0, 0, 1048594, 0, 0, 1048595, 0, 0, 1048596, 0, 0, 1048597, 0, 0, 1048598, 0, 0, 1048599, 0, 0, 1179619, 0, 0, 1179620, 0, 0, 1179621, 0, 0, 1179622, 0, 0, 1179623, 0, 0, 1179624, 0, 0, 1179625, 0, 0, 1179626, 0, 0, 1179627, 0, 0, 1179628, 0, 0, 1179629, 0, 0, 1179630, 0, 0, 1179631, 0, 0, 1179632, 0, 0, 1179633, 0, 0, 1179634, 0, 0, 1179635, 0, 0, 1179636, 0, 0, 1179637, 0, 0, 1179638, 0, 0, 1179639, 0, 0, 1179640, 0, 0, 1179641, 0, 0, 1179642, 0, 0, 1179643, 0, 0, 1179644, 0, 0, 1179645, 0, 0, 1179646, 0, 0, 1179647, 0, 0, 1114112, 0, 0, 1114113, 0, 0, 1114114, 0, 0, 1114115, 0, 0, 1114116, 0, 0, 1114117, 0, 0, 1114118, 0, 0, 1114119, 0, 0, 1114120, 0, 0, 1114121, 0, 0, 1114122, 0, 0, 1114123, 0, 0, 1114124, 0, 0, 1114125, 0, 0, 1114126, 0, 0, 1114127, 0, 0, 1114128, 0, 0, 1114129, 0, 0, 1114130, 0, 0, 1114131, 0, 0, 1114132, 0, 0, 1114133, 0, 0, 1114134, 0, 0, 1245156, 0, 0, 1245157, 0, 0, 1245158, 0, 0, 1245159, 0, 0, 1245160, 0, 0, 1245161, 0, 0, 1245162, 0, 0, 1245163, 0, 0, 1245164, 0, 0, 1245165, 0, 0, 1245166, 0, 0, 1245167, 0, 0, 1245168, 0, 0, 1245169, 0, 0, 1245170, 0, 0, 1245171, 0, 0, 1245172, 0, 0, 1245173, 0, 0, 1245174, 0, 0, 1245175, 0, 0, 1245176, 0, 0, 1245177, 0, 0, 1245178, 0, 0, 1245179, 0, 0, 1245180, 0, 0, 1245181, 0, 0, 1245182, 0, 0, 1245183, 0, 0, 1179648, 0, 0, 1179649, 0, 0, 1179650, 0, 0, 1179651, 0, 0, 1179652, 0, 0, 1179653, 0, 0, 1179654, 0, 0, 1179655, 0, 0, 1179656, 0, 0, 1179657, 0, 0, 1179658, 0, 0, 1179659, 0, 0, 1179660, 0, 0, 1179661, 0, 0, 1179662, 0, 0, 1179663, 0, 0, 1179664, 0, 0, 1179665, 0, 0, 1179666, 0, 0, 1179667, 0, 0, 1179668, 0, 0, 1179669, 0, 0, 1179670, 0, 0, 1310693, 0, 0, 1310694, 0, 0, 1310695, 0, 0, 1310696, 0, 0, 1310697, 0, 0, 1310698, 0, 0, 1310699, 0, 0, 1310700, 0, 0, 1310701, 0, 0, 1310702, 0, 0, 1310703, 0, 0, 1310704, 0, 0, 1310705, 0, 0, 1310706, 0, 0, 1310707, 0, 0, 1310708, 0, 0, 1310709, 0, 0, 1310710, 0, 0, 1310711, 0, 0, 1310712, 0, 0, 1310713, 0, 0, 1310714, 0, 0, 1310715, 0, 0, 1310716, 0, 0, 1310717, 0, 0, 1310718, 0, 0, 1310719, 0, 0, 1245184, 0, 0, 1245185, 0, 0, 1245186, 0, 0, 1245187, 0, 0, 1245188, 0, 0, 1245189, 0, 0, 1245190, 0, 0, 1245191, 0, 0, 1245192, 0, 0, 1245193, 0, 0, 1245194, 0, 0, 1245195, 0, 0, 1245196, 0, 0, 1245197, 0, 0, 1245198, 0, 0, 1245199, 0, 0, 1245200, 0, 0, 1245201, 0, 0, 1245202, 0, 0, 1245203, 0, 0, 1245204, 0, 0, 1245205, 0, 0, 1376231, 0, 0, 1376232, 0, 0, 1376233, 0, 0, 1376234, 0, 0, 1376235, 0, 0, 1376236, 0, 0, 1376237, 0, 0, 1376238, 0, 0, 1376239, 0, 0, 1376240, 0, 0, 1376241, 0, 0, 1376242, 0, 0, 1376243, 0, 0, 1376244, 0, 0, 1376245, 0, 0, 1376246, 0, 0, 1376247, 0, 0, 1376248, 0, 0, 1376249, 0, 0, 1376250, 0, 0, 1376251, 0, 0, 1376252, 0, 0, 1376253, 0, 0, 1376254, 0, 0, 1376255, 0, 0, 1310720, 0, 0, 1310721, 0, 0, 1310722, 0, 0, 1310723, 0, 0, 1310724, 0, 0, 1310725, 0, 0, 1310726, 0, 0, 1310727, 0, 0, 1310728, 0, 0, 1310729, 0, 0, 1310730, 0, 0, 1310731, 0, 0, 1310732, 0, 0, 1310733, 0, 0, 1310734, 0, 0, 1310735, 0, 0, 1310736, 0, 0, 1310737, 0, 0, 1310738, 0, 0, 1310739, 0, 0, 1310740, 0, 0, 1441769, 0, 0, 1441770, 0, 0, 1441771, 0, 0, 1441772, 0, 0, 1441773, 0, 0, 1441774, 0, 0, 1441775, 0, 0, 1441776, 0, 0, 1441777, 0, 0, 1441778, 0, 0, 1441779, 0, 0, 1441780, 0, 0, 1441781, 0, 0, 1441782, 0, 0, 1441783, 0, 0, 1441784, 0, 0, 1441785, 0, 0, 1441786, 0, 0, 1441787, 0, 0, 1441788, 0, 0, 1441789, 0, 0, 1441790, 0, 0, 1441791, 0, 0, 1376256, 0, 0, 1376257, 0, 0, 1376258, 0, 0, 1376259, 0, 0, 1376260, 0, 0, 1376261, 0, 0, 1376262, 0, 0, 1376263, 0, 0, 1376264, 0, 0, 1376265, 0, 0, 1376266, 0, 0, 1376267, 0, 0, 1376268, 0, 0, 1376269, 0, 0, 1376270, 0, 0, 1376271, 0, 0, 1376272, 0, 0, 1376273, 0, 0, 1376274, 0, 0, 1507306, 0, 0, 1507307, 0, 0, 1507308, 0, 0, 1507309, 0, 0, 1507310, 0, 0, 1507311, 0, 0, 1507312, 0, 0, 1507313, 0, 0, 1507314, 0, 0, 1507315, 0, 0, 1507316, 0, 0, 1507317, 0, 0, 1507318, 0, 0, 1507319, 0, 0, 1507320, 0, 0, 1507321, 0, 0, 1507322, 0, 0, 1507323, 0, 0, 1507324, 0, 0, 1507325, 0, 0, 1507326, 0, 0, 1507327, 0, 0, 1441792, 0, 0, 1441793, 0, 0, 1441794, 0, 0, 1441795, 0, 0, 1441796, 0, 0, 1441797, 0, 0, 1441798, 0, 0, 1441799, 0, 0, 1441800, 0, 0, 1441801, 0, 0, 1441802, 0, 0, 1441803, 0, 0, 1441804, 0, 0, 1441805, 0, 0, 1441806, 0, 0, 1441807, 0, 0, 1441808, 0, 0, 1441809, 0, 0, 1572844, 0, 0, 1572845, 0, 0, 1572846, 0, 0, 1572847, 0, 0, 1572848, 0, 0, 1572849, 0, 0, 1572850, 0, 0, 1572851, 0, 0, 1572852, 0, 0, 1572853, 0, 0, 1572854, 0, 0, 1572855, 0, 0, 1572856, 0, 0, 1572857, 0, 0, 1572858, 0, 0, 1572859, 0, 0, 1572860, 0, 0, 1572861, 0, 0, 1572862, 0, 0, 1572863, 0, 0, 1507328, 0, 0, 1507329, 0, 0, 1507330, 0, 0, 1507331, 0, 0, 1507332, 0, 0, 1507333, 0, 0, 1507334, 0, 0, 1507335, 0, 0, 1507336, 0, 0, 1507337, 0, 0, 1507338, 0, 0, 1507339, 0, 0, 1507340, 0, 0, 1507341, 0, 0, 1507342, 0, 0, 1507343, 0, 0, 1507344, 0, 0, 1638382, 0, 0, 1638383, 0, 0, 1638384, 0, 0, 1638385, 0, 0, 1638386, 0, 0, 1638387, 0, 0, 1638388, 0, 0, 1638389, 0, 0, 1638390, 0, 0, 1638391, 0, 0, 1638392, 0, 0, 1638393, 0, 0, 1638394, 0, 0, 1638395, 0, 0, 1638396, 0, 0, 1638397, 0, 0, 1638398, 0, 0, 1638399, 0, 0, 1572864, 0, 0, 1572865, 0, 0, 1572866, 0, 0, 1572867, 0, 0, 1572868, 0, 0, 1572869, 0, 0, 1572870, 0, 0, 1572871, 0, 0, 1572872, 0, 0, 1572873, 0, 0, 1572874, 0, 0, 1572875, 0, 0, 1572876, 0, 0, 1572877, 0, 0, 1572878, 0, 0, 1703920, 0, 0, 1703921, 0, 0, 1703922, 0, 0, 1703923, 0, 0, 1703924, 0, 0, 1703925, 0, 0, 1703926, 0, 0, 1703927, 0, 0, 1703928, 0, 0, 1703929, 0, 0, 1703930, 0, 0, 1703931, 0, 0, 1703932, 0, 0, 1703933, 0, 0, 1703934, 0, 0, 1703935, 0, 0, 1638400, 0, 0, 1638401, 0, 0, 1638402, 0, 0, 1638403, 0, 0, 1638404, 0, 0, 1638405, 0, 0, 1638406, 0, 0, 1638407, 0, 0, 1638408, 0, 0, 1638409, 0, 0, 1638410, 0, 0, 1638411, 0, 0, 1638412, 0, 0, 1638413, 0, 0, 1769458, 0, 0, 1769459, 0, 0, 1769460, 0, 0, 1769461, 0, 0, 1769462, 0, 0, 1769463, 0, 0, 1769464, 0, 0, 1769465, 0, 0, 1769466, 0, 0, 1769467, 0, 0, 1769468, 0, 0, 1769469, 0, 0, 1769470, 0, 0, 1769471, 0, 0, 1703936, 0, 0, 1703937, 0, 0, 1703938, 0, 0, 1703939, 0, 0, 1703940, 0, 0, 1703941, 0, 0, 1703942, 0, 0, 1703943, 0, 0, 1703944, 0, 0, 1703945, 0, 0, 1703946, 0, 0, 1703947, 0, 0, 1834998, 0, 0, 1834999, 0, 0, 1835000, 0, 0, 1835001, 0, 0, 1835002, 0, 0, 1835003, 0, 0, 1835004, 0, 0, 1835005, 0, 0, 1835006, 0, 0, 1835007, 0, 0, 1769472, 0, 0, 1769473, 0, 0, 1769474, 0, 0, 1769475, 0, 0, 1769476, 0, 0, 1769477, 0, 0, 1769478, 0, 0, 1769479, 0, 0, 1769480, 0, 0, 1900538, 0, 0, 1900539, 0, 0, 1900540, 0, 0, 1900541, 0, 0, 1900542, 0, 0, 1900543, 0, 0, 1835008, 0, 0, 1835009, 0, 0, 1835010, 0, 0, 1835011, 0, 0, 1835012, 0, 0 ) + +[node name="TileMap2" type="TileMap" parent="."] +z_index = -2 +tile_set = ExtResource( 4 ) +cell_size = Vector2( 16, 16 ) +format = 1 +tile_data = PoolIntArray( -851975, 0, 0, -851974, 0, 0, -851973, 0, 0, -851972, 0, 0, -851971, 0, 0, -851970, 0, 0, -851969, 0, 0, -786445, 0, 0, -786444, 0, 0, -786443, 0, 0, -786442, 0, 0, -786441, 0, 0, -786440, 0, 0, -786439, 0, 0, -786438, 0, 0, -786437, 0, 0, -786436, 0, 0, -786435, 0, 0, -786434, 0, 0, -786433, 0, 0, -851968, 0, 0, -851967, 0, 0, -851966, 0, 0, -851965, 0, 0, -851964, 0, 0, -720911, 0, 0, -720910, 0, 0, -720909, 0, 0, -720908, 0, 0, -720907, 0, 0, -720906, 0, 0, -720905, 0, 0, -720904, 0, 0, -720903, 0, 0, -720902, 0, 0, -720901, 0, 0, -720900, 0, 0, -720899, 0, 0, -720898, 0, 0, -720897, 0, 0, -786432, 0, 0, -786431, 0, 0, -786430, 0, 0, -786429, 0, 0, -786428, 0, 0, -786427, 0, 0, -786426, 0, 0, -655376, 0, 0, -655375, 0, 0, -655374, 0, 0, -655373, 0, 0, -655372, 0, 0, -655371, 0, 0, -655370, 0, 0, -655369, 0, 0, -655368, 0, 0, -655367, 0, 0, -655366, 0, 0, -655365, 0, 0, -655364, 0, 0, -655363, 0, 0, -655362, 0, 0, -655361, 0, 0, -720896, 0, 0, -720895, 0, 0, -720894, 0, 0, -720893, 0, 0, -720892, 0, 0, -720891, 0, 0, -720890, 0, 0, -589840, 0, 0, -589839, 0, 0, -589838, 0, 0, -589837, 0, 0, -589836, 0, 0, -589835, 0, 0, -589834, 0, 0, -589833, 0, 0, -589832, 0, 0, -589831, 0, 0, -589830, 0, 0, -589829, 0, 0, -589828, 0, 0, -589827, 0, 0, -589826, 0, 0, -589825, 0, 0, -655360, 0, 0, -655359, 0, 0, -655358, 0, 0, -655357, 0, 0, -655356, 0, 0, -655355, 0, 0, -655354, 0, 0, -655353, 0, 0, -524304, 0, 0, -524303, 0, 0, -524302, 0, 0, -524301, 0, 0, -524300, 0, 0, -524299, 0, 0, -524298, 0, 0, -524297, 0, 0, -524296, 0, 0, -524295, 0, 0, -524294, 0, 0, -524293, 0, 0, -524292, 0, 0, -524291, 0, 0, -524290, 0, 0, -524289, 0, 0, -589824, 0, 0, -589823, 0, 0, -589822, 0, 0, -589821, 0, 0, -589820, 0, 0, -589819, 0, 0, -589818, 0, 0, -589817, 0, 0, -589816, 0, 0, -458767, 0, 0, -458766, 0, 0, -458765, 0, 0, -458764, 0, 0, -458763, 0, 0, -458762, 0, 0, -458761, 0, 0, -458760, 0, 0, -458759, 0, 0, -458758, 0, 0, -458757, 0, 0, -458756, 0, 0, -458755, 0, 0, -458754, 0, 0, -458753, 0, 0, -524288, 0, 0, -524287, 0, 0, -524286, 0, 0, -524285, 0, 0, -524284, 0, 0, -524283, 0, 0, -524282, 0, 0, -524281, 0, 0, -524280, 0, 0, -393231, 0, 0, -393230, 0, 0, -393229, 0, 0, -393228, 0, 0, -393227, 0, 0, -393226, 0, 0, -393225, 0, 0, -393224, 0, 0, -393223, 0, 0, -393222, 0, 0, -393221, 0, 0, -393220, 0, 0, -393219, 0, 0, -393218, 0, 0, -393217, 0, 0, -458752, 0, 0, -458751, 0, 0, -458750, 0, 0, -458749, 0, 0, -458748, 0, 0, -458747, 0, 0, -458746, 0, 0, -458745, 0, 0, -458744, 0, 0, -327694, 0, 0, -327693, 0, 0, -327692, 0, 0, -327691, 0, 0, -327690, 0, 0, -327689, 0, 0, -327688, 0, 0, -327687, 0, 0, -327686, 0, 0, -327685, 0, 0, -327684, 0, 0, -327683, 0, 0, -327682, 0, 0, -327681, 0, 0, -393216, 0, 0, -393215, 0, 0, -393214, 0, 0, -393213, 0, 0, -393212, 0, 0, -393211, 0, 0, -393210, 0, 0, -262158, 0, 0, -262157, 0, 0, -262156, 0, 0, -262155, 0, 0, -262154, 0, 0, -262153, 0, 0, -262152, 0, 0, -262151, 0, 0, -262150, 0, 0, -262149, 0, 0, -262148, 0, 0, -262147, 0, 0, -262146, 0, 0, -262145, 0, 0, -327680, 0, 0, -327679, 0, 0, -327678, 0, 0, -327677, 0, 0, -327676, 0, 0, -196621, 0, 0, -196620, 0, 0, -196619, 0, 0, -196618, 0, 0, -196617, 0, 0, -196616, 0, 0, -196615, 0, 0, -196614, 0, 0, -196613, 0, 0, -196612, 0, 0, -196611, 0, 0, -196610, 0, 0, -196609, 0, 0, -262144, 0, 0, -262143, 0, 0, -131084, 0, 0, -131083, 0, 0, -131082, 0, 0, -131081, 0, 0, -131080, 0, 0, -131079, 0, 0, -131078, 0, 0, -131077, 0, 0, -131076, 0, 0, -131075, 0, 0, -131074, 0, 0, -131073, 0, 0, -196608, 0, 0, -196607, 0, 0, -65548, 0, 0, -65547, 0, 0, -65546, 0, 0, -65545, 0, 0, -65544, 0, 0, -65543, 0, 0, -65542, 0, 0, -65541, 0, 0, -65540, 0, 0, -65539, 0, 0, -65538, 0, 0, -65537, 0, 0, -131072, 0, 0, -131071, 0, 0, -12, 0, 0, -11, 0, 0, -10, 0, 0, -9, 0, 0, -8, 0, 0, -7, 0, 0, -6, 0, 0, -5, 0, 0, -4, 0, 0, -65536, 0, 0, -65535, 0, 0, -65518, 0, 0, -65517, 0, 0, 65527, 0, 0, 65528, 0, 0, 65529, 0, 0, 65530, 0, 0, 65531, 0, 0, 65532, 0, 0, 0, 0, 0, 1, 0, 0, 16, 0, 0, 17, 0, 0, 18, 0, 0, 19, 0, 0, 20, 0, 0, 65551, 0, 0, 65552, 0, 0, 65553, 0, 0, 65554, 0, 0, 65555, 0, 0, 65556, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 0, 0, 131087, 0, 0, 131088, 0, 0, 131089, 0, 0, 131090, 0, 0, 131091, 0, 0, 131092, 0, 0, 131093, 0, 0, 196617, 0, 0, 196618, 0, 0, 196619, 0, 0, 196620, 0, 0, 196621, 0, 0, 196622, 0, 0, 196623, 0, 0, 196624, 0, 0, 196625, 0, 0, 196626, 0, 0, 196627, 0, 0, 196628, 0, 0, 196629, 0, 0, 327664, 0, 0, 327665, 0, 0, 327666, 0, 0, 327667, 0, 0, 327668, 0, 0, 327669, 0, 0, 327670, 0, 0, 327671, 0, 0, 327672, 0, 0, 327673, 0, 0, 327674, 0, 0, 327675, 0, 0, 327676, 0, 0, 327677, 0, 0, 327678, 0, 0, 327679, 0, 0, 262144, 0, 0, 262145, 0, 0, 262146, 0, 0, 262147, 0, 0, 262148, 0, 0, 262149, 0, 0, 262150, 0, 0, 262151, 0, 0, 262152, 0, 0, 262153, 0, 0, 262154, 0, 0, 262155, 0, 0, 262156, 0, 0, 262157, 0, 0, 262158, 0, 0, 262159, 0, 0, 262160, 0, 0, 262161, 0, 0, 262162, 0, 0, 262163, 0, 0, 262164, 0, 0, 262165, 0, 0, 393192, 0, 0, 393193, 0, 0, 393194, 0, 0, 393195, 0, 0, 393196, 0, 0, 393197, 0, 0, 393198, 0, 0, 393199, 0, 0, 393200, 0, 0, 393201, 0, 0, 393202, 0, 0, 393203, 0, 0, 393204, 0, 0, 393205, 0, 0, 393206, 0, 0, 393207, 0, 0, 393208, 0, 0, 393209, 0, 0, 393210, 0, 0, 393211, 0, 0, 393212, 0, 0, 393213, 0, 0, 393214, 0, 0, 393215, 0, 0, 327680, 0, 0, 327681, 0, 0, 327682, 0, 0, 327683, 0, 0, 327684, 0, 0, 327685, 0, 0, 327686, 0, 0, 327687, 0, 0, 327688, 0, 0, 327689, 0, 0, 327690, 0, 0, 327691, 0, 0, 327692, 0, 0, 327693, 0, 0, 327694, 0, 0, 327695, 0, 0, 327696, 0, 0, 327697, 0, 0, 327698, 0, 0, 327699, 0, 0, 327700, 0, 0, 327701, 0, 0, 327702, 0, 0, 458727, 0, 0, 458728, 0, 0, 458729, 0, 0, 458730, 0, 0, 458731, 0, 0, 458732, 0, 0, 458733, 0, 0, 458734, 0, 0, 458735, 0, 0, 458736, 0, 0, 458737, 0, 0, 458738, 0, 0, 458739, 0, 0, 458740, 0, 0, 458741, 0, 0, 458742, 0, 0, 458743, 0, 0, 458744, 0, 0, 458745, 0, 0, 458746, 0, 0, 458747, 0, 0, 458748, 0, 0, 458749, 0, 0, 458750, 0, 0, 458751, 0, 0, 393216, 0, 0, 393217, 0, 0, 393218, 0, 0, 393219, 0, 0, 393220, 0, 0, 393221, 0, 0, 393222, 0, 0, 393223, 0, 0, 393224, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 0, 0, 393228, 0, 0, 393229, 0, 0, 393230, 0, 0, 393231, 0, 0, 393232, 0, 0, 393233, 0, 0, 393234, 0, 0, 393235, 0, 0, 393236, 0, 0, 393237, 0, 0, 393238, 0, 0, 524263, 0, 0, 524264, 0, 0, 524265, 0, 0, 524266, 0, 0, 524267, 0, 0, 524268, 0, 0, 524269, 0, 0, 524270, 0, 0, 524271, 0, 0, 524272, 0, 0, 524273, 0, 0, 524274, 0, 0, 524275, 0, 0, 524276, 0, 0, 524277, 0, 0, 524278, 0, 0, 524279, 0, 0, 524280, 0, 0, 524281, 0, 0, 524282, 0, 0, 524283, 0, 0, 524284, 0, 0, 524285, 0, 0, 524286, 0, 0, 524287, 0, 0, 458752, 0, 0, 458753, 0, 0, 458754, 0, 0, 458755, 0, 0, 458756, 0, 0, 458757, 0, 0, 458758, 0, 0, 458759, 0, 0, 458760, 0, 0, 458761, 0, 0, 458762, 0, 0, 458763, 0, 0, 458764, 0, 0, 458765, 0, 0, 458766, 0, 0, 458767, 0, 0, 458768, 0, 0, 458769, 0, 0, 458770, 0, 0, 458771, 0, 0, 458772, 0, 0, 458773, 0, 0, 589800, 0, 0, 589801, 0, 0, 589802, 0, 0, 589803, 0, 0, 589804, 0, 0, 589805, 0, 0, 589806, 0, 0, 589807, 0, 0, 589808, 0, 0, 589809, 0, 0, 589810, 0, 0, 589811, 0, 0, 589812, 0, 0, 589813, 0, 0, 589814, 0, 0, 589815, 0, 0, 589816, 0, 0, 589817, 0, 0, 589818, 0, 0, 589819, 0, 0, 589820, 0, 0, 589821, 0, 0, 589822, 0, 0, 589823, 0, 0, 524288, 0, 0, 524289, 0, 0, 524290, 0, 0, 524291, 0, 0, 524292, 0, 0, 524293, 0, 0, 524294, 0, 0, 524295, 0, 0, 524296, 0, 0, 524297, 0, 0, 524298, 0, 0, 524299, 0, 0, 524300, 0, 0, 524301, 0, 0, 524302, 0, 0, 524303, 0, 0, 524304, 0, 0, 524305, 0, 0, 524306, 0, 0, 524307, 0, 0, 524308, 0, 0, 655336, 0, 0, 655337, 0, 0, 655338, 0, 0, 655339, 0, 0, 655340, 0, 0, 655341, 0, 0, 655342, 0, 0, 655343, 0, 0, 655344, 0, 0, 655345, 0, 0, 655346, 0, 0, 655347, 0, 0, 655348, 0, 0, 655349, 0, 0, 655350, 0, 0, 655351, 0, 0, 655352, 0, 0, 655353, 0, 0, 655354, 0, 0, 655355, 0, 0, 655356, 0, 0, 655357, 0, 0, 655358, 0, 0, 655359, 0, 0, 589824, 0, 0, 589825, 0, 0, 589826, 0, 0, 589827, 0, 0, 589828, 0, 0, 589829, 0, 0, 589830, 0, 0, 589831, 0, 0, 589832, 0, 0, 589833, 0, 0, 589834, 0, 0, 589835, 0, 0, 589836, 0, 0, 589837, 0, 0, 589838, 0, 0, 589839, 0, 0, 589840, 0, 0, 589841, 0, 0, 589842, 0, 0, 720874, 0, 0, 720875, 0, 0, 720876, 0, 0, 720877, 0, 0, 720878, 0, 0, 720879, 0, 0, 720880, 0, 0, 720881, 0, 0, 720882, 0, 0, 720883, 0, 0, 720884, 0, 0, 720885, 0, 0, 720886, 0, 0, 720887, 0, 0, 720888, 0, 0, 720889, 0, 0, 720890, 0, 0, 720891, 0, 0, 720892, 0, 0, 720893, 0, 0, 720894, 0, 0, 720895, 0, 0, 655360, 0, 0, 655361, 0, 0, 655362, 0, 0, 655363, 0, 0, 655364, 0, 0, 655365, 0, 0, 655366, 0, 0, 655367, 0, 0, 655368, 0, 0, 655369, 0, 0, 655370, 0, 0, 655371, 0, 0, 655372, 0, 0, 655373, 0, 0, 655374, 0, 0, 655375, 0, 0, 655376, 0, 0, 655377, 0, 0, 786412, 0, 0, 786413, 0, 0, 786414, 0, 0, 786415, 0, 0, 786416, 0, 0, 786417, 0, 0, 786418, 0, 0, 786419, 0, 0, 786420, 0, 0, 786421, 0, 0, 786422, 0, 0, 786423, 0, 0, 786424, 0, 0, 786425, 0, 0, 786426, 0, 0, 786427, 0, 0, 786428, 0, 0, 786429, 0, 0, 786430, 0, 0, 786431, 0, 0, 720896, 0, 0, 720897, 0, 0, 720898, 0, 0, 720899, 0, 0, 720900, 0, 0, 720901, 0, 0, 720902, 0, 0, 720903, 0, 0, 720904, 0, 0, 720905, 0, 0, 720906, 0, 0, 720907, 0, 0, 720908, 0, 0, 720909, 0, 0, 720910, 0, 0, 720911, 0, 0, 851956, 0, 0, 851957, 0, 0, 851958, 0, 0, 851959, 0, 0, 851960, 0, 0, 851961, 0, 0, 851965, 0, 0, 851966, 0, 0, 851967, 0, 0, 786432, 0, 0, 786433, 0, 0, 786434, 0, 0, 786435, 0, 0, 786436, 0, 0, 786437, 0, 0, 786438, 0, 0, 786439, 0, 0, 786440, 0, 0, 786441, 0, 0, 786442, 0, 0, 786443, 0, 0, 851969, 0, 0, 851970, 0, 0, 851971, 0, 0, 851972, 0, 0, 851973, 0, 0, 851974, 0, 0 ) + +[node name="LifeCrystal" parent="." instance=ExtResource( 2 )] +position = Vector2( -24.4657, 1.14606 ) + +[node name="Player" parent="." instance=ExtResource( 1 )] +position = Vector2( -80.6632, 31.4062 ) +user = "LudumKing" + +[node name="Player2" parent="." instance=ExtResource( 1 )] +position = Vector2( 59.2901, 42.7538 ) +user = "Dare72" + +[node name="Camera2D" type="Camera2D" parent="."] +current = true +zoom = Vector2( 0.25, 0.25 ) diff --git a/client/scenes/loader.tscn b/client/scenes/loader.tscn new file mode 100644 index 0000000..4f09770 --- /dev/null +++ b/client/scenes/loader.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=2 format=2] + +[sub_resource type="GDScript" id=1] +script/source = "extends Node + +var music = preload(\"res://nodes/MusicManager.tscn\") +var network = preload(\"res://nodes/NetworkManager.tscn\") + +func _ready(): + var root : Node = get_node(\"/root\") + var m = music.instance() + root.add_child(m) + var n = network.instance() + root.add_child(n) + get_tree().change_scene(\"res://scenes/login.scn\") +" + +[node name="Node" type="Node"] +script = SubResource( 1 ) diff --git a/client/scenes/login.scn b/client/scenes/login.scn new file mode 100644 index 0000000..daaec91 Binary files /dev/null and b/client/scenes/login.scn differ diff --git a/client/scripts/entities/LifeCrystal.gd b/client/scripts/entities/LifeCrystal.gd new file mode 100644 index 0000000..7654f38 --- /dev/null +++ b/client/scripts/entities/LifeCrystal.gd @@ -0,0 +1,6 @@ +extends Area2D + +const ROTATION_SPEED = 1 + +func _process(delta): + $Sprite.rotation = $Sprite.rotation + delta * ROTATION_SPEED diff --git a/client/scripts/entities/Player.gd b/client/scripts/entities/Player.gd new file mode 100644 index 0000000..3c993cf --- /dev/null +++ b/client/scripts/entities/Player.gd @@ -0,0 +1,23 @@ +extends KinematicBody2D + +export var user : String = "" + +func _ready(): + $Label.text = user + #$Label.text = $"/root/NetworkManager".username + +func _process(delta): + var movePos : Vector2 = Vector2(0,0) + + + if(Input.is_action_just_pressed("ui_up")): + movePos.y = movePos.y + 1 + if(Input.is_action_just_pressed("ui_down")): + movePos.y = movePos.y - 1 + if(Input.is_action_just_pressed("ui_right")): + movePos.x = movePos.x + 1 + if(Input.is_action_just_pressed("ui_left")): + movePos.x = movePos.x - 1 + + if movePos != Vector2.ZERO: + $"/root/NetworkManager".move_player(movePos.x, movePos.y) diff --git a/client/scripts/network/NetworkManager.gd b/client/scripts/network/NetworkManager.gd new file mode 100644 index 0000000..c7d5713 --- /dev/null +++ b/client/scripts/network/NetworkManager.gd @@ -0,0 +1,113 @@ +extends Node + +const SERVER_HOST : String = "192.168.1.34" +const SERVER_PORT : int = 7777 + +signal disconnection +signal connection_established +signal error_occured +signal logged_in + +signal world_data_recieved + +var username : String = "" + +var client : GDNetHost = null +var peer : GDNetPeer = null +var server_address : GDNetAddress = null +var connected : bool = false + +var packetQueue = [] +var error_info = "" +var world_data : String = "" + + +var connection_timer : Timer + +func _init(): + server_address = GDNetAddress.new() + + server_address.set_host(SERVER_HOST) + server_address.set_port(SERVER_PORT) + + client = GDNetHost.new() + client.set_max_peers(1) + client.set_event_wait(250) + client.bind() + +func connect_to_server(): + peer = client.host_connect(server_address) + if not connection_timer: + connection_timer = Timer.new() + add_child(connection_timer) + connection_timer.connect("timeout", self, "timeout_check") + connection_timer.start(1) + +func timeout_check(): + if username == "": + display_error("Connection failed!") + connection_timer.stop() + +func request_world_map(): + var request_packet : PoolByteArray = "2|".to_ascii() + packetQueue.append(request_packet) + +func connect_as_user(username : String): + connect_to_server() + var username_packet : PoolByteArray = ("1|" + username).to_ascii() + + packetQueue.append(username_packet) + +func display_error(error = "Unknown error occured!"): + error_info = error + print("Error: " + error) + emit_signal("error_occured") + +func disconnect_from_server(): + peer.disconnect_later() + +func process_events(): + if(client.is_event_available()): + var event : GDNetEvent = client.get_event() + + var event_type = event.get_event_type() + + if(event_type == GDNetEvent.RECEIVE): + var ascii_data : String = str(event.get_packet().get_string_from_ascii()) + if len(ascii_data) > 0: + if ascii_data[0] == '1': + if ascii_data.substr(2,2) == "OK": + username = ascii_data.substr(4) + print("Logged in as: " + username) + emit_signal("logged_in") + else: + display_error("Username not accepted! Reason: " + ascii_data.substr(2)) + elif ascii_data[0] == '2': + world_data = ascii_data.substr(2) + emit_signal("world_data_recieved") + elif(event_type == GDNetEvent.CONNECT): + print("Connected to server with hostname: " + server_address.get_host() + ":" + str(server_address.get_port())) + connected = true + emit_signal("connection_established") + elif(event_type == GDNetEvent.DISCONNECT): + print("Disconnected from server") + connected = false + emit_signal("disconnection") + +func move_player(x,y): + var pckt : PoolByteArray = ("3|" + str(x) + "," + str(y)).to_ascii() + + packetQueue.append(pckt) + +func _process(delta): + process_events() + + if len(packetQueue) > 0 and connected: + peer.send_packet(packetQueue[0], 0, GDNetMessage.RELIABLE) + packetQueue.remove(0) + + + if(Input.is_action_just_pressed("ui_cancel")): + print("PACKET") + peer.send_packet("TEST".to_ascii(), 0, GDNetMessage.RELIABLE) + diff --git a/client/scripts/singletons/MusicManager.gd b/client/scripts/singletons/MusicManager.gd new file mode 100644 index 0000000..484e038 --- /dev/null +++ b/client/scripts/singletons/MusicManager.gd @@ -0,0 +1,15 @@ +extends AudioStreamPlayer + +var main_player : AudioStreamPlayer +var looping : bool = false + +func _ready(): + main_player = self + +func play_music(song, loop=true): + var audio_file = "res://assets/audio/music/" + song + ".ogg" + if File.new().file_exists(audio_file): + var track = load(audio_file) + looping = loop + main_player.stream = track + #main_player.play() diff --git a/client/scripts/systems/LoginManager.gd b/client/scripts/systems/LoginManager.gd new file mode 100644 index 0000000..49872b3 --- /dev/null +++ b/client/scripts/systems/LoginManager.gd @@ -0,0 +1,21 @@ +extends Node + + +func _ready(): + $"/root/MusicManager".play_music("wizards") + $Button.connect("button_down", self, "_on_button_press") + $"/root/NetworkManager".connect("error_occured", self, "_on_error") + $"/root/NetworkManager".connect("logged_in", self, "_on_login") + +func _on_error(): + $ErrorDialog/ErrorLabel.text = $"/root/NetworkManager".error_info + $ErrorDialog.popup_centered() + +func _on_button_press(): + if($"/root/NetworkManager".connected): + $"/root/NetworkManager".disconnect_from_server() + else: + $"/root/NetworkManager".connect_as_user($LineEdit.text) + +func _on_login(): + get_tree().change_scene("res://scenes/game.scn") diff --git a/client/scripts/systems/WorldManager.gd b/client/scripts/systems/WorldManager.gd new file mode 100644 index 0000000..f93bd41 --- /dev/null +++ b/client/scripts/systems/WorldManager.gd @@ -0,0 +1,49 @@ +extends Node + + +func _ready(): + $Tiles.clear() + $"/root/NetworkManager".connect("world_data_recieved", self, "_on_world_update") + $"/root/NetworkManager".request_world_map() + +func _on_world_update(): + var data = $"/root/NetworkManager".world_data.split('\n') + for tileUpdate in data: + if len(tileUpdate) > 3: + if ',' in tileUpdate: + var tile_data = tileUpdate.split(',') + if ':' in tile_data[2]: + var pos : Vector2 = $Tiles.map_to_world(Vector2(int(tile_data[0]), int(tile_data[1]))) + if 'player:' in tile_data[2]: + print(tile_data) + var player_name = tile_data[2].substr(len('player:')) + print(player_name) + if $"/root/NetworkManager".username == player_name: + $Player.position = pos + else: + update_entity(player_name, pos, "player") + else: + var entity_data = tile_data[2].split(':') + update_entity(entity_data[1], pos, entity_data[0]) + + else: + $Tiles.set_cell(int(tile_data[0]), int(tile_data[1]), int(tile_data[2])) + if $Loading != null: + $Loading.queue_free() + +func display_error(error): + print("Error " + error) + +func update_entity(entity_id : String, pos : Vector2, type : String): + var entity : Node2D = get_node_or_null( str(type + "-" + entity_id)) + if not entity: + var entity_location = "res://nodes/entities/" + type + ".tscn" + if File.new().file_exists(entity_location): + var gobj = load(entity_location) + entity = gobj.instance() + add_child(entity, true) + entity.set_name(str(type + "-" + entity_id)) + else: + display_error("Trying to load entity of type: " + type + ", but failed.") + if entity: + entity.position = pos diff --git a/client/tilesets/floor_tileset.tres b/client/tilesets/floor_tileset.tres new file mode 100644 index 0000000..8545f10 --- /dev/null +++ b/client/tilesets/floor_tileset.tres @@ -0,0 +1,28 @@ +[gd_resource type="TileSet" load_steps=2 format=2] + +[ext_resource path="res://assets/images/tiles/floor/stone_floor.png" type="Texture" id=1] + +[resource] +0/name = "stone_floor.png 0" +0/texture = ExtResource( 1 ) +0/tex_offset = Vector2( 0, 0 ) +0/modulate = Color( 1, 1, 1, 1 ) +0/region = Rect2( 0, 0, 16, 16 ) +0/tile_mode = 1 +0/autotile/bitmask_mode = 0 +0/autotile/bitmask_flags = [ ] +0/autotile/icon_coordinate = Vector2( 0, 0 ) +0/autotile/tile_size = Vector2( 16, 16 ) +0/autotile/spacing = 0 +0/autotile/occluder_map = [ ] +0/autotile/navpoly_map = [ ] +0/autotile/priority_map = [ ] +0/autotile/z_index_map = [ ] +0/occluder_offset = Vector2( 0, 0 ) +0/navigation_offset = Vector2( 0, 0 ) +0/shape_offset = Vector2( 0, 0 ) +0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +0/shape_one_way = false +0/shape_one_way_margin = 0.0 +0/shapes = [ ] +0/z_index = 0 diff --git a/client/tilesets/wall_tileset.tres b/client/tilesets/wall_tileset.tres new file mode 100644 index 0000000..5a1c7de --- /dev/null +++ b/client/tilesets/wall_tileset.tres @@ -0,0 +1,62 @@ +[gd_resource type="TileSet" load_steps=4 format=2] + +[ext_resource path="res://assets/images/tiles/wall/stone_wall.png" type="Texture" id=1] +[ext_resource path="res://assets/images/tiles/floor/stone_floor.png" type="Texture" id=2] + +[sub_resource type="ConvexPolygonShape2D" id=1] +points = PoolVector2Array( 16, 16, 0, 16, 0, 0, 16, 0 ) + +[resource] +0/name = "stone_wall.png 0" +0/texture = ExtResource( 1 ) +0/tex_offset = Vector2( 0, 0 ) +0/modulate = Color( 1, 1, 1, 1 ) +0/region = Rect2( 0, 0, 16, 16 ) +0/tile_mode = 1 +0/autotile/bitmask_mode = 0 +0/autotile/bitmask_flags = [ ] +0/autotile/icon_coordinate = Vector2( 0, 0 ) +0/autotile/tile_size = Vector2( 16, 16 ) +0/autotile/spacing = 0 +0/autotile/occluder_map = [ ] +0/autotile/navpoly_map = [ ] +0/autotile/priority_map = [ ] +0/autotile/z_index_map = [ ] +0/occluder_offset = Vector2( 0, 0 ) +0/navigation_offset = Vector2( 0, 0 ) +0/shape_offset = Vector2( 0, 0 ) +0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +0/shape = SubResource( 1 ) +0/shape_one_way = false +0/shape_one_way_margin = 1.0 +0/shapes = [ { +"autotile_coord": Vector2( 0, 0 ), +"one_way": false, +"one_way_margin": 1.0, +"shape": SubResource( 1 ), +"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) +} ] +0/z_index = 0 +1/name = "stone_floor.png 1" +1/texture = ExtResource( 2 ) +1/tex_offset = Vector2( 0, 0 ) +1/modulate = Color( 1, 1, 1, 1 ) +1/region = Rect2( 0, 0, 16, 16 ) +1/tile_mode = 1 +1/autotile/bitmask_mode = 0 +1/autotile/bitmask_flags = [ ] +1/autotile/icon_coordinate = Vector2( 0, 0 ) +1/autotile/tile_size = Vector2( 16, 16 ) +1/autotile/spacing = 0 +1/autotile/occluder_map = [ ] +1/autotile/navpoly_map = [ ] +1/autotile/priority_map = [ ] +1/autotile/z_index_map = [ ] +1/occluder_offset = Vector2( 0, 0 ) +1/navigation_offset = Vector2( 0, 0 ) +1/shape_offset = Vector2( 0, 0 ) +1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +1/shape_one_way = false +1/shape_one_way_margin = 0.0 +1/shapes = [ ] +1/z_index = 0 diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..5526394 --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,2 @@ +builds +.vscode \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..6f6f05b --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,9 @@ +FROM fedora:32 + +RUN /bin/bash -c "dnf install g++ enet-devel gtest gmock gmock-devel gtest-devel -y" + +ADD / /dt + +RUN cd /dt; /dt/build.sh + +CMD ["./builds/server.out"] \ No newline at end of file diff --git a/server/ReadMe.md b/server/ReadMe.md new file mode 100644 index 0000000..2b7a0f8 --- /dev/null +++ b/server/ReadMe.md @@ -0,0 +1,16 @@ +# LD46 Server + +## Build Requirements + +Enet development files: + +`dnf install enet-devel` + + +G++ + +`dnf install g++` + +For testing: + +`dnf install gtest gmock gmock-devel gtest-devel` \ No newline at end of file diff --git a/server/build.sh b/server/build.sh new file mode 100755 index 0000000..03b3bd2 --- /dev/null +++ b/server/build.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +mkdir -p builds + +# Remove old version +if [ -f builds/server.out ]; then + rm builds/server.out +fi + +g++ main.cpp -o builds/server.out -lenet -lpthread \ No newline at end of file diff --git a/server/console.hpp b/server/console.hpp new file mode 100644 index 0000000..7cf7b6b --- /dev/null +++ b/server/console.hpp @@ -0,0 +1,67 @@ +#ifndef CONSOLE_HPP +#define CONSOLE_HPP + +#include +#include +#include +#include + + +bool console_is_running = false; + +class ServerConsole +{ + public: + ServerConsole(); + void stop(void); + bool is_running(void); + private: + pthread_t thread; +}; + + +void * console_logic(void *) +{ + printf("Started server console...\n"); + + while(console_is_running) + { + char c [256]; + fgets(c,sizeof(c), stdin); + if(c[0] == 'q') + { + console_is_running = false; + } + else + { + printf("Invalid console command!\n"); + } + } + return 0; +} + +ServerConsole::ServerConsole(void) +{ + //Intialized values + console_is_running = true; + + thread = pthread_t(); + + pthread_create(&(this->thread), NULL, console_logic, NULL); + +} + +void ServerConsole::stop(void) +{ + if(this->thread != 0) + { + pthread_join(this->thread, NULL); + } +} + +bool ServerConsole::is_running(void) +{ + return console_is_running; +} + +#endif \ No newline at end of file diff --git a/server/gameentity.hpp b/server/gameentity.hpp new file mode 100644 index 0000000..dd6fb44 --- /dev/null +++ b/server/gameentity.hpp @@ -0,0 +1,73 @@ +#ifndef GAMEENTITY_HPP +#define GAMEENTITY_HPP + +#include +#include + +class GameEntity +{ + public: + GameEntity(std::string,std::string,int,int); + std::string get_id(void); + std::string get_type(void); + int get_x(void); + int get_y(void); + std::string set_x(int); + std::string set_y(int); + std::string get_dump(void); + private: + int pos_x; + int pos_y; + std::string id; + std::string type; + +}; + +GameEntity::GameEntity(std::string entity_id, std::string entity_type, int x = 0, int y = 0) +{ + id = entity_id; + type = entity_type; + this->set_x(x); + this->set_y(y); + std::cout << "Entity created with id: '" << id << "' at " << x << "," << y << std::endl; +} + + +int GameEntity::get_x(void) +{ + return pos_x; +} + +int GameEntity::get_y(void) +{ + return pos_y; +} + +std::string GameEntity::get_dump(void) +{ + return std::to_string(pos_x) + "," + std::to_string(pos_y) + "," + type + ":" + id + '\n'; +} + +std::string GameEntity::set_x(int x) +{ + pos_x = x; + return this -> get_dump(); +} +std::string GameEntity::set_y(int y) +{ + pos_y = y; + return this -> get_dump(); +} + +std::string GameEntity::get_id(void) +{ + return id; +} + +std::string GameEntity::get_type(void) +{ + return type; +} + + +#endif \ No newline at end of file diff --git a/server/gamemap.hpp b/server/gamemap.hpp new file mode 100644 index 0000000..86a02a1 --- /dev/null +++ b/server/gamemap.hpp @@ -0,0 +1,140 @@ +#ifndef GAMEMAP_HPP +#define GAMEMAP_HPP + +#include +#include +#include + +#include "gameentity.hpp" + +class GameMap +{ + public: + GameMap(int,int); + int get_tile(int,int); + void set_tile(int,int,int); + std::string get_tile_dump(void); + std::string get_entity_dump(void); + std::string spawn_entity(std::string,std::string,int,int); + std::string move_entity(std::string,std::string,int,int); + int get_size_x(void); + int get_size_y(void); + private: + int ** map_data; + int size_x; + int size_y; + bool valid_x_y(int,int); + std::vector entities; + +}; + +GameMap::GameMap(int x, int y) +{ + size_x = x; + size_y = y; + map_data = new int * [x]; + for (int i = 0; i < x; i++) + { + map_data[i] = new int [y]; + for(int q = 0; q < y; q++) + { + if(q == 0 || i == 0 || i == x-1 || q == y-1) + { + map_data[i][q] = 0; + } + else + { + map_data[i][q] = 1; + } + } + } + + this -> spawn_entity("spawn","crystal",size_x/2, size_y/2); + +} + +std::string GameMap::spawn_entity(std::string entity_id, std::string entity_type, int x = 0, int y = 0) +{ + GameEntity entity = GameEntity(entity_id, entity_type, x, y); + entities.push_back(entity); + return entity.get_dump(); +} + +std::string GameMap::move_entity(std::string entity_id, std::string entity_type, int x = 0, int y = 0) +{ + for(int i = 0; i < entities.size(); i++) + { + if(entities[i].get_id() == entity_id && entities[i].get_type() == entity_type) + { + if(map_data[entities[i].get_x() + x][entities[i].get_y() + y] % 2 == 1) + { + entities[i].set_x(entities[i].get_x() + x); + entities[i].set_y(entities[i].get_y() + y); + } + return entities[i].get_dump(); + } + } + return ""; +} + +bool GameMap::valid_x_y(int x, int y) +{ + if(x < size_x && x >= 0) + { + if(y < size_y && y >= 0) + { + return true; + } + } + return false; +} + +int GameMap::get_tile(int x, int y) +{ + if(this->valid_x_y(x,y)) + { + return map_data[x][y]; + } + return -1; +} +void GameMap::set_tile(int x, int y, int tile_type) +{ + if(this->valid_x_y(x,y)) + { + map_data[x][y] = tile_type; + } +} +std::string GameMap::get_tile_dump(void) +{ + std::string data_string(""); + for(int x = 0; x < size_x; x++) + { + for(int y = 0; y < size_y; y++) + { + data_string += std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(map_data[x][y]) + '\n'; + } + } + return data_string; +} + +std::string GameMap::get_entity_dump(void) +{ + std::string data_string(""); + for(int i = 0; i < entities.size(); i++) + { + data_string += entities[i].get_dump(); + } + return data_string; +} + +int GameMap::get_size_x(void) +{ + return size_x; +} + +int GameMap::get_size_y(void) +{ + return size_y; +} + +#endif \ No newline at end of file diff --git a/server/gameserver.hpp b/server/gameserver.hpp new file mode 100644 index 0000000..e0e20cb --- /dev/null +++ b/server/gameserver.hpp @@ -0,0 +1,107 @@ +#ifndef GAMESERVER_HPP +#define GAMESERVER_HPP + +#include +#include +#include +#include +#include + +#include "gamemap.hpp" + +const int SERVER_PORT = 7777; +const int MAX_PLAYERS = 32; + +const int EVENT_RATE = 1000; + +//Game Data +static GameMap gamemap(256,256); +static std::string usernames[MAX_PLAYERS]; + +static ENetHost* server; + +//=================== +// Network Processes +//=================== +void PlayerMove(ENetEvent* event) +{ + int peer_id = event->peer -> incomingPeerID; + + int move_x = 0; + int move_y = 1; + + + std::string data_input((char*)event->packet->data); + data_input = data_input.substr(2); + + //Parse input string + std::stringstream ss(data_input); + std::string tempString; + std::getline(ss, tempString, ','); + move_x = std::stoi(tempString); + std::getline(ss, tempString, '\n'); + move_y = std::stoi(tempString); + + //Update player position + std::string resp = "2|" + gamemap.move_entity(usernames[peer_id], "player", move_x, move_y); + const char* data = resp.c_str(); + ENetPacket* packet = enet_packet_create(data, strlen(data) + 1, ENET_PACKET_FLAG_RELIABLE); + enet_host_broadcast(server, 0, packet); +} + +void DataRequest(ENetEvent* event) +{ + //Create world data dump + std::string map_dump_resp("2|"); + map_dump_resp += gamemap.get_tile_dump() + gamemap.get_entity_dump(); + const char* data = map_dump_resp.c_str(); + + //Build and send reliable packet to requester + ENetPacket* packet = enet_packet_create(data, strlen(data) + 1, ENET_PACKET_FLAG_RELIABLE); + enet_peer_send(event->peer, 0, packet); +} + +void Authenticate(ENetEvent* event) +{ + //Grab username from packet data + std::string username((char*)event->packet->data); + username = username.substr(2); + + //Determine if peer already has username + int peer_id = event -> peer -> incomingPeerID; + const char* data; + if(usernames[peer_id] == "") + { + //Update username array + usernames[peer_id] = username; + + //Spawn entity + std::string spawn_data = gamemap.spawn_entity(usernames[peer_id], "player", 127, 127); + + //Tell peers about new player + data = ("2|" + spawn_data).c_str(); + ENetPacket* packet = enet_packet_create(data, strlen(data) + 1, ENET_PACKET_FLAG_RELIABLE); + enet_host_broadcast(server, 0, packet); + + std::cout << usernames[peer_id] << " spawned!" << std::endl; + std::cout << peer_id << " | " << username << std::endl; + + std::string okay_response("1|OK"); + data = (okay_response + username).c_str(); + + //Return success + packet = enet_packet_create(data, strlen(data) + 1, ENET_PACKET_FLAG_RELIABLE); + enet_peer_send(event -> peer, 0, packet); + } + else + { + std::string resp("1|Already logged in!"); + data = resp.c_str(); + + //Return reliable error message + ENetPacket* packet = enet_packet_create(data, strlen(data) + 1, ENET_PACKET_FLAG_RELIABLE); + enet_peer_send(event -> peer, 0, packet); + } +} + +#endif \ No newline at end of file diff --git a/server/main.cpp b/server/main.cpp new file mode 100644 index 0000000..b80ca8f --- /dev/null +++ b/server/main.cpp @@ -0,0 +1,114 @@ +/* ./server/main.cpp */ + + +#include +#include +#include +#include +#include + +#include "console.hpp" +#include "gameserver.hpp" + +int main (int argc, char ** argv) +{ + printf("Starting LD46 game server...\n"); + + for(int i = 0; i < MAX_PLAYERS; i++) + { + usernames[i] = ""; + } + + + if (enet_initialize () != 0) + { + fprintf (stderr, "ENet server failed to initialize!\n"); + return EXIT_FAILURE; + } + atexit (enet_deinitialize); + + + ServerConsole console; + + //Create ENet objects + ENetEvent event; + ENetAddress address; + + + address.host = ENET_HOST_ANY; + address.port = SERVER_PORT; + + + const int CHANNEL_COUNT = 1; + server = enet_host_create (&address, MAX_PLAYERS, CHANNEL_COUNT, 0, 0); + + if (server == NULL) + { + std::cout << "Failed to create ENet server host!" << std::endl; + return 1; + } + + std::cout << "Awaiting connections..." << std::endl; + while(console_is_running) + { + ENetEvent event; + /* Wait up to 1000 milliseconds for an event. */ + while (enet_host_service (server, & event, EVENT_RATE) > 0) + { + printf("Parsing event!\n"); + switch (event.type) + { + case ENET_EVENT_TYPE_CONNECT: + std::cout << "A new client connected from " << event.peer -> address.host + << ":" << event.peer -> address.port << std::endl; + break; + + case ENET_EVENT_TYPE_RECEIVE: + std::cout << "A packet of length " << event.packet -> dataLength << " containing " + << event.packet -> data << " was received from " << event.peer -> data << " on channel" + << event.channelID << std::endl; + + char c [1]; + c[0] = event.packet->data[0]; + + /* Determine which function to call based on + the value of the first character of packet */ + std::cout << "Packet Type: " << c << std::endl; + switch (c[0]) + { + case '1': + Authenticate(&event); + break; + case '2': + DataRequest(&event); + break; + case '3': + PlayerMove(&event); + break; + default: + std::cout << "Invalid packet recieved!" < data << " disconnected." << std::endl; + //Remove peer data on disconnect + + // DELETE ENTITY HERE + + usernames[event.peer -> incomingPeerID] = ""; + event.peer -> data = NULL; + } + } + } + + // Exit process + console.stop(); + enet_host_destroy(server); + return 0; +} diff --git a/server/run_build.sh b/server/run_build.sh new file mode 100755 index 0000000..e28007f --- /dev/null +++ b/server/run_build.sh @@ -0,0 +1,3 @@ +#!/bin/sh +bash build.sh +./builds/server.out \ No newline at end of file diff --git a/server/run_tests.sh b/server/run_tests.sh new file mode 100755 index 0000000..e715c40 --- /dev/null +++ b/server/run_tests.sh @@ -0,0 +1,4 @@ +#!/bin/sh +mkdir -p builds +g++ tests.cpp -o builds/tests.out -lgtest +./builds/tests.out \ No newline at end of file diff --git a/server/tests.cpp b/server/tests.cpp new file mode 100644 index 0000000..16f3a42 --- /dev/null +++ b/server/tests.cpp @@ -0,0 +1,69 @@ +#include + +#include + +#include "gameentity.hpp" +#include "gamemap.hpp" + +//Test Entities +const std::string TEST_ENTITY_ID = "test_entity"; +const std::string TEST_ENTITY_TYPE= "test"; +GameEntity CreateTestEntity() +{ + return GameEntity(TEST_ENTITY_ID, TEST_ENTITY_TYPE,0,0); +} +TEST(EntityTest, SetX) +{ + GameEntity entity = CreateTestEntity(); + entity.set_x(4); + EXPECT_EQ(entity.get_x(), 4); +} +TEST(EntityTest, SetY) +{ + GameEntity entity = CreateTestEntity(); + entity.set_y(4); + EXPECT_EQ(entity.get_y(), 4); +} +TEST(EntityTest, GetId) +{ + GameEntity entity = CreateTestEntity(); + EXPECT_EQ(entity.get_id(), TEST_ENTITY_ID); +} +TEST(EntityTest, GetType) +{ + GameEntity entity = CreateTestEntity(); + EXPECT_EQ(entity.get_type(), TEST_ENTITY_TYPE); +} +TEST(EntityTest, GetBasicDump) +{ + GameEntity entity = CreateTestEntity(); + //Test intial location (0,0) + EXPECT_EQ(entity.get_dump(), std::string("0,0," + TEST_ENTITY_TYPE + ":" + TEST_ENTITY_ID + "\n")); + + //Test non-intial location (1,2) + entity.set_x(1); + entity.set_y(2); + EXPECT_EQ(entity.get_dump(), std::string("1,2," + TEST_ENTITY_TYPE + ":" + TEST_ENTITY_ID + "\n")); +} + +//Test GameMap Object +GameMap CreateMapEntity(int x = 16, int y = 16) +{ + return GameMap(x,y); +} +TEST(GameMapTest, CheckMapSize) +{ + GameMap map = CreateMapEntity(8,8); + EXPECT_EQ(map.get_size_x(), 8); + EXPECT_EQ(map.get_size_y(), 8); + + map = CreateMapEntity(16, 4); + EXPECT_EQ(map.get_size_x(), 16); + EXPECT_EQ(map.get_size_y(), 4); +} + +int main(int argc, char* argv[]) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file