From 73d0961cf87fcaaab8d45c45ad83032330addf07 Mon Sep 17 00:00:00 2001 From: Raphael McSinyx Date: Thu, 13 Jul 2017 22:00:11 +0700 Subject: [PATCH] Refactor directory structure and change license to GPLv3 --- LICENSE | 674 +++++++++++++++++++++++++++++++++++++ {lib => data}/Slacker.icns | Bin data/_game.png | Bin 0 -> 608 bytes data/_intro.png | Bin 0 -> 40959 bytes data/_lose.png | Bin 0 -> 3398 bytes data/_win.png | Bin 0 -> 5047 bytes lib/Slacker.py | 3 - lib/data.py | 27 -- lib/data.pyc | Bin 1019 -> 0 bytes lib/main.py | 237 ------------- lib/main.pyc | Bin 6866 -> 0 bytes lib/setup_py2app.py | 27 -- run_game.py | 13 - setup.py | 32 ++ slacker-game | 258 ++++++++++++++ 15 files changed, 964 insertions(+), 307 deletions(-) create mode 100644 LICENSE rename {lib => data}/Slacker.icns (100%) create mode 100644 data/_game.png create mode 100644 data/_intro.png create mode 100644 data/_lose.png create mode 100644 data/_win.png delete mode 100755 lib/Slacker.py delete mode 100644 lib/data.py delete mode 100644 lib/data.pyc delete mode 100644 lib/main.py delete mode 100644 lib/main.pyc delete mode 100644 lib/setup_py2app.py delete mode 100644 run_game.py create mode 100755 setup.py create mode 100755 slacker-game diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /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/lib/Slacker.icns b/data/Slacker.icns similarity index 100% rename from lib/Slacker.icns rename to data/Slacker.icns diff --git a/data/_game.png b/data/_game.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb275827a33178941335128847df27a590ca218 GIT binary patch literal 608 zcmeAS@N?(olHy`uVBq!ia0y~yV3c5BV2a>i0*aW$#Av-Uxj?m<5@Bafe{`Yio45_&F_8=oKP{E-E-~Ds>*+qcNQ7{5R;6vKx WMg~Stk7wUOp7nI~b6Mw<&;$U0;T`J$ literal 0 HcmV?d00001 diff --git a/data/_intro.png b/data/_intro.png new file mode 100644 index 0000000000000000000000000000000000000000..ae042cb0c9e7dcecfda84727742bdb6117c08271 GIT binary patch literal 40959 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

1I}2U2XuFc56p*~A)DB)!BNBw_

# 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 literal 0 HcmV?d00001 diff --git a/lib/Slacker.py b/lib/Slacker.py deleted file mode 100755 index f6372ae..0000000 --- a/lib/Slacker.py +++ /dev/null @@ -1,3 +0,0 @@ -#This is an automatically generated file that can be deleted -import main -main.main() \ No newline at end of file diff --git a/lib/data.py b/lib/data.py deleted file mode 100644 index 022c372..0000000 --- a/lib/data.py +++ /dev/null @@ -1,27 +0,0 @@ -'''Simple data loader module. - -Loads data files from the "data" directory shipped with a game. - -Enhancing this to handle caching etc. is left as an exercise for the reader. -''' - -import os -import pygame - -data_py = os.path.abspath(os.path.dirname(__file__)) -data_dir = os.path.normpath(os.path.join(data_py, '..', 'data')) - -# The following is only used when packaging for .app -#data_dir = os.path.normpath(os.path.join(data_py, '..', '..', '..', 'data')) - - -def filepath(filename): - '''Determine the path to a file in the data directory. - ''' - return os.path.join(data_dir, filename) - -def load_image(filename): - # Open a file in the data directory. - return pygame.image.load(os.path.join(data_dir, filename)) - #return open(os.path.join(data_dir, filename), mode) - diff --git a/lib/data.pyc b/lib/data.pyc deleted file mode 100644 index 67606b9f658795ad46cca192d1cf40e9b9bc00c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmbtT&5qMB5S}Fc*$v$b9JqnC;!uHZCI>x*ZwT=S^o*Sa0bMWWg#R7Q zwe9-W2rZ)&t(V#iqVxK5Yl=Moi0d$Jt!-<9SP#Avu`%MD&Yufy2cx1NwjwmP?~N9B zHa0?vTiH>8_pXsnS$B&`Hi+m2t~J6bsTvBKs0x8QtyxDQgOE;`dow5-j9B}Du?9n3 z6}kP5<0_=sbWy|!X@^ay1Ra_g&I_F337QD7LFrP68GHrU5oJ0QUZc4*(F~n+hRgR7 zJI2nWAdbR1jn#duOH(8{g$pO(v!5EyfsXR+NnscipW-^Y(*fGBNyNDs5FwO4gLwm<>ygSX^OVAUy#I+L=jPhFGHbak&G@yvrJ`YhW|l6JMfxmxF*}|90bQ-<9RL6T diff --git a/lib/main.py b/lib/main.py deleted file mode 100644 index 097c9d1..0000000 --- a/lib/main.py +++ /dev/null @@ -1,237 +0,0 @@ -'''Game main module. - -Last Day Game Entry, by Clint Herron -''' - -import data -import pygame -from pygame.locals import * -from data import * -from math import sin - -BOARD_SIZE = BOARD_WIDTH, BOARD_HEIGHT = 12, 20 -SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 240, 400 -TILE_SIZE = TILE_WIDTH, TILE_HEIGHT = SCREEN_WIDTH / BOARD_WIDTH, SCREEN_HEIGHT / BOARD_HEIGHT - -TILE_COLOR = (127, 127, 255) -TILE_COLOR_ALT = (255, 127, 127) -TILE_COLOR_LOSE = (64, 64, 128) -TILE_COLOR_ALT_LOSE = (127, 64, 64) - -BLACK = (0,0,0) - -LEVEL_SPEED = ( 80, 80, 75, 75, 70, 70, 65, 60, 55, 50, - 45, 40, 35, 30, 32 ) -MAX_WIDTH = (3, 3, 3, 3, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1) - -COLOR_CHANGE_Y = 10 # The block below which are displayed in the alternate color -WIN_LEVEL = 15 - -current_speed = 50 # Current tile speed in milliseconds -board = [] -lose_tiles = [] -current_direction = 1 -current_x, current_y, current_width = 0, BOARD_HEIGHT - 1, 3 -current_level = 0 - -INTRO = 0 -PLAYING = 1 -LOSE = 2 -WIN = 3 - -game_state = INTRO - -bg_images = ( load_image("intro.png"), load_image("game.png"), load_image("lose.png"), load_image("win.png") ) - -bg_images[WIN].set_colorkey(BLACK) -bg_images[LOSE].set_colorkey(BLACK) - -keep_running = True - -def main(): - global game_state, current_x, current_y, current_speed, keep_running, current_width, current_level - - pygame.init() - screen = pygame.display.set_mode( SCREEN_SIZE ) - - reset_game() - - while(keep_running): - update_movement() - update_board_info() - update_screen(screen) - - for event in pygame.event.get(): - if event.type == pygame.QUIT: - keep_running = False - elif event.type == KEYDOWN: if event.key == K_SPACE: key_hit() - elif event.key == K_ESCAPE: - if game_state == INTRO: - keep_running = False - else: - reset_game() - elif event.key == K_F1: # Yes, this is a cheat. - current_x -= 1 - if (current_x < 0): current_x = 0 - current_width += 1 - if (current_width >= BOARD_WIDTH): current_width = BOARD_WIDTH - 1 - - pygame.display.quit() - -def reset_game(): - global game_state, current_x, current_y, current_speed, keep_running, current_width, current_level, lose_tiles - - clear_board() - lose_tiles = [] - - keep_running = True - - game_state = INTRO - - current_x = 0 - current_y = BOARD_HEIGHT - 1 - current_level = 0 - current_speed = LEVEL_SPEED[current_level] - current_width = MAX_WIDTH[current_level] - -def key_hit(): - global keep_running, game_state, current_x, current_y, current_width, current_speed, current_level, lose_tiles - - if game_state == PLAYING: - if current_y < BOARD_HEIGHT - 1: - for x in range(current_x, current_x + current_width): - if board[x][current_y + 1] == 0: # If they're standing on a block that did not work - current_width -= 1 # Then next time, give them one less block - board[x][current_y] = 0 # Also, get rid of this block that isn't standing on solid ground. - # Then, add a lose tile for that missed block - # Lose tile format is (x, y, color, start time) - lose_tiles.append( (x, current_y, - pygame.time.get_ticks()) ) - - current_level += 1 - check_win_lose() - current_y -= 1 - elif game_state == INTRO: - game_state = PLAYING - elif (game_state == LOSE) or (game_state == WIN): - reset_game() - game_state = INTRO - else: - keep_running = False - -def check_win_lose(): - global game_state, current_width, current_level, current_speed, keep_running, TILE_COLOR - - if current_width == 0: - game_state = LOSE - elif current_level == WIN_LEVEL: - current_speed = 100 - game_state = WIN - else: - current_speed = LEVEL_SPEED[current_level] - if current_width > MAX_WIDTH[current_level]: - current_width = MAX_WIDTH[current_level] - -last_time = 0 -def update_movement(): - global game_state, last_time, current_x, current_y, current_width, current_speed, current_direction - - current_time = pygame.time.get_ticks() - if (last_time + current_speed <= current_time): - if game_state == PLAYING: - new_x = current_x + current_direction - - if (new_x < 0) or (new_x + current_width > BOARD_WIDTH): - current_direction = -current_direction - - current_x += current_direction - - last_time = current_time - -def update_screen(screen): - global game_state - - if game_state == PLAYING: - draw_background(screen) - draw_board(screen) - elif game_state == INTRO: - draw_background(screen) - pass - elif (game_state == LOSE) or (game_state == WIN): - screen.fill(BLACK) - draw_board(screen) - draw_background(screen) - - pygame.display.flip() - -def draw_background(screen): - global game_state - screen.blit(bg_images[game_state], (0,0,SCREEN_WIDTH,SCREEN_HEIGHT), (0,0,SCREEN_WIDTH,SCREEN_HEIGHT)) - - -def update_board_info(): - global game_state - - if game_state == PLAYING: - clear_row(current_y) - fill_current_row() - -def draw_board(screen): - for x in range(BOARD_WIDTH): - for y in range(BOARD_HEIGHT): - if board[x][y] == 1: - draw_tile(screen, x, y) - - draw_lose_tiles(screen) - -def draw_tile(screen, x, y): - xoffset = 0 # XOffset is used to draw some wiggle in the tower when you win - col = TILE_COLOR - if (y < COLOR_CHANGE_Y): - col = TILE_COLOR_ALT - - if (game_state == LOSE): - col = TILE_COLOR_LOSE - if (y < COLOR_CHANGE_Y): - col = TILE_COLOR_ALT_LOSE - - if game_state == WIN: - xoffset = sin(pygame.time.get_ticks() * 0.004 + y * 0.5) * (SCREEN_WIDTH / 4) - - pygame.draw.rect(screen, col, (x * TILE_WIDTH + xoffset, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT)) - pygame.draw.rect(screen, BLACK, (x * TILE_WIDTH + xoffset, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT), 2) - -# Lose tiles are ones that fall off from the edge when you miss placing them on the proper stack -def draw_lose_tiles(screen): - for lt in lose_tiles: - deltaT = (pygame.time.get_ticks() - lt[2]) * 0.008 # How long it has been falling - x = lt[0] * TILE_WIDTH - y = lt[1] * TILE_HEIGHT + deltaT * deltaT - - col = TILE_COLOR_LOSE - if (lt[1] < COLOR_CHANGE_Y): - col = TILE_COLOR_ALT_LOSE - - if (y > SCREEN_HEIGHT): - lose_tiles.remove(lt) - else: - pygame.draw.rect(screen, col, (x+2, y+2, TILE_WIDTH-3, TILE_HEIGHT-3)) - -def clear_board(): - global board - - board = [] - for x in range(BOARD_WIDTH): - board.append([]) - for y in range (BOARD_HEIGHT): - board[x].append(0) - -def clear_row(y): - for x in range(BOARD_WIDTH): - board[x][y] = 0 - -def fill_current_row(): - global current_x, current_y, current_width - for x in range(current_x, current_x + current_width): - board[x][current_y] = 1 \ No newline at end of file diff --git a/lib/main.pyc b/lib/main.pyc deleted file mode 100644 index b1cf47b53d3604debd7c24b341de447dfd077533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6866 zcmb_h&u<&Y6@E)nKS+s|Y*D6Y$2Kj;HvLPoV<&bRx3(xKrn^Ss1yjR3MDPEc{0YBoMka*06@RYcxDRJ_@0y8+C}k)D77dUJs>EEdr7==@@=U1vUsm5b49%K z%3Kxif-={1W@F-A)atl+1!b;_cS)HW;$2qeHSw+}b5p#l%G?s~nli78H>S)R;*BeF zTfFPa+@V<)3SXnO?|?jVH~jpDTdn6e8s2uzA4{cX-5|^t-JQI)mFi)0=W2d=CqG%M z*2Dai-)uJOsp^;bn=1e>5|UgtY@Fj(>(zezRx>1Dko*8$svnd4lH@+gCnP9ReM~Y# z@{nYLLb4%9xwIMC*F==i~ctqT8*;?#04XE5y2PHhJ)gMWC zOvm3EwKxPChP2_=5@sYER{pcjSZA#EB%|KPwa2Ix!fhBYQq^$x!bO1;{>_cT?(k_+eoQ3IfDWrj$KAUv_;%wdbH=X8o zyj%~I+6yJrjL$YkoX_*3C?@f4|RUw z&Ze2@JMT^}YM+O04HMv$XG$Lw=a=TR|GK|pWX{6liOG`kkU3AWJT7U*DJ@J+JT^<< z0xZ2W08SbouW~Ym*@jNaVL$vb!;asP{F%^)Q6x@Bn&e za|{v~;W~Rka0j-62cx(lSQY1HE@G~6M=!PF~pje}d)1>YqG7g&(NCCxZRESOi^ zabr@S)XAFI_bblY6{(M@aFFj0ey_ZVhJWcqL%2Ts0X;+FVv7*rgSya6Qy2!P)>iL) zJUj8h^xPx+9Hpbw5jECy>#M$^L5-y{1(Ka-7e+64bJMSTwt5>wSXf0Yqtha00A-c+ zzXNVGLw*31|YUDhb7OYcv})?nG0wsA9IkV0qXTU^}p@j~bO^;RfrLG`HH0 zL=`<%o%Bl9Bz$TUFM5X=9+1hxNvNL>sh>UsJh}#S*bCR_VFe>1ICfOVDa;utGs-Cf z?W^RtK~f0TuzLdrH+-Wg)grZG;u}+8Czp8Dre6uGjk-}fbF)bx41%3b3T?VY-GAo1 z3><01@1eAHJODWMBZItxl8#mAqAYtl{w^wnkOAL0hAgN8yDkf=Zgcf_wTpq`-F;o^ zsNmTy4Hk>acPn07d~{9qdvK^|cp4xnYn`o{1!yj)L(Ubb7XwQwRJR&l(|zVFBXh1c z8{2hHbB&R4qhYd(qM3kIzh9}=Y8q1>%uYIXB`tegW_@io}SLFX&g-8hbV)XqLs5-GaOae|^GkX_q!`cFqa{n*u=gHwGC;{gtQE=PCmj)JHD4jIlPKgQ% zZ0-TZj>{31a|NzzpXs?Uv&CpOo@xFF89HcNr{g(ji43URp{>Zx?$1yHCLLo%^^`bj z6sgrJU|M$DS+IcOlOhint+!N!07cO?d4Yrs&#@%;JSMbkd)*0|9AZdm(5<}SyR?8brkq+`w|I*hNe#YGB`E3!k=5M$U&mrm!1d|-1ZGVz~OcxH62<*Ji`7Q zC7`Or8p0=IVb@6w(Pn$t{u3%#^b4de1Z*rC>d;W!JWJa{LdV}rY%`1=2f9JhP07|w zr)Q64vUWt3j#;360Nvw~<%9+$gDQUD zY%~S~QKvUfG5@8vhl6OM?T)mLNfN97`tjd>_xAGUy;X?t_lJ8`h8jID7r1%Uc(ph^ zTXH7nXXkC*uqfwDPEE``DmfphDC*%%%q|)~U{q5J?`zaO%@7*)$?$+fxk=fy_gAu( z{SA)9c@a6vFfT<@GjW0uO@}p6!sZQzaZ83uMU!0wr#rh=V`T+LG}se<+Niw*z#d?P zU!nvfAc9RnH}_02ZV&pce*9jIjallHR6FB>I^}0zTE8IHicdbJI|6Lx?qFBF4N%OD z5Gim=m=$2jVdVq~YYEi46h%NqCJWRNdvM2g8<2;6>N=4JDPZ*+J(9YS_zvHR?1ioX zpS6Wthd1}}qJe&nF?8df#S@rA7B2;KM({TNv|)#bmel19k{C1FNc!Yn6_xf~3zb`7 z_|}c_SFJkBhPO$kNFI_*liUN*U3Amu3EloCg)<-~tk9ZpNRe8oy*wPU+{MVg_B^|y z7;@-{LG%0;CCG3L2i+E*yrm~3 zs5{PPs=IYw+x2>=_#~@_ht_d|LLcZ`O>z_Ab*QajzNfvR(-gxfx-YU`VRaNlb8Mu9 zmstN9jP^N-iJ0+jM9efwg`Rm})r{}0QB5K`@#2#V*Mn7Xv&1|ia+i5Rp|Wow#Kpcf za7kwRbWdHwOHBVh#`rTzKSbX3cnng1MrNI3mT|*hU=n zZmtRc6IXZ>T{N~kj@PI-4y*@bx}mFqNAF$CrQ%qvQNabBwr{xMQ=3C-HZd1Fyhhx& zZ()qn6l4NZ5>-tz+ARuVC3bs6GDV`1j43EOgqje?TQYO`U4vvsz=j;dZw@!k{ptkJ~9qJ5U#dr5d5Ztf5m)a)@5Zsu*S z#_l8GhS=t?Hn&Xn1CmLSGbHy(CO{%kD|guFiiCuqVE&Wv4H_s|2I)pze{3i3s!DKF(#<_d|TvxIu*_%8DKABAX8!2G3 A2LJ#7 diff --git a/lib/setup_py2app.py b/lib/setup_py2app.py deleted file mode 100644 index 2bfcc88..0000000 --- a/lib/setup_py2app.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Script for building the example. - -Usage: - python setup.py py2app -""" -from setuptools import setup - -NAME = 'Slacker' -VERSION = '1.2' - -plist = dict( - CFBundleIconFile='Slacker.icns', - CFBundleName=NAME, - CFBundleShortVersionString=VERSION, - CFBundleGetInfoString=' '.join([NAME, VERSION]), - CFBundleExecutable=NAME, - CFBundleIdentifier='pyweek.4.slacker', -) - -setup( - data_files=['../data'], - app=[ - dict(script="Slacker.py", plist=plist), - ], - setup_requires=["py2app"], -) diff --git a/run_game.py b/run_game.py deleted file mode 100644 index 7b2077a..0000000 --- a/run_game.py +++ /dev/null @@ -1,13 +0,0 @@ -#! /usr/bin/env python - -import sys -import os -try: - libdir = os.path.abspath(os.path.join(os.path.dirname(__file__), 'lib')) - sys.path.insert(0, libdir) -except: - # probably running inside py2exe which doesn't set __file__ - pass - -import main -main.main() diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..a427cbd --- /dev/null +++ b/setup.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +from setuptools import setup + +with open('README.txt') as f: + long_description = f.read() + +setup( + name='slacker-game', + version='1.3.0', + description='A clone of the arcade game Stacker', + long_description=long_description, + url='https://github.com/McSinyx/slacker-game', + author='Clint Herron', + maintainer='Nguyễn Gia Phong', + maintainer_email='vn.mcsinyx@gmail.com', + license='GPLv3+', + classifiers=[ + 'Development Status :: 4 - Beta', + 'Environment :: MacOS X', + 'Environment :: MacOS X', + 'Environment :: Win32 (MS Windows)', + 'Environment :: X11 Applications', + 'Intended Audience :: End Users/Desktop', + 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', + 'Natural Language :: English', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Topic :: Games/Entertainment :: Arcade'], + keywords='stacker arcade-game pygame-application', + install_requires=['pygame'], + data_files=[('data/*', ['slacker-game'])], + scripts=['slacker-game']) diff --git a/slacker-game b/slacker-game new file mode 100755 index 0000000..7c5fbae --- /dev/null +++ b/slacker-game @@ -0,0 +1,258 @@ +#!/usr/bin/env python +# slacker-game - A clone of the arcade game Stacker +# +# 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 . +# +# Copyright (C) 2007 Clint Herron +# Copyright (C) 2017 Nguyễn Gia Phong + +from math import sin +from os.path import join + +import pygame +from pygame.locals import * + +BOARD_SIZE = BOARD_WIDTH, BOARD_HEIGHT = 7, 15 +SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 280, 600 +TILE_SIZE = TILE_WIDTH, TILE_HEIGHT = SCREEN_WIDTH / BOARD_WIDTH, SCREEN_HEIGHT / BOARD_HEIGHT + +TILE_COLOR = (127, 127, 255) +TILE_COLOR_ALT = (255, 127, 127) +TILE_COLOR_LOSE = (64, 64, 128) +TILE_COLOR_ALT_LOSE = (127, 64, 64) + +BLACK = (0,0,0) + +LEVEL_SPEED = (80, 80, 75, 75, 70, 70, 65, 60, 55, 50, 45, 40, 35, 30, 32) +MAX_WIDTH = (3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1) + +COLOR_CHANGE_Y = 5 # blocks below which are displayed in the alternate color +WIN_LEVEL = 15 + +current_speed = 50 # Current tile speed in milliseconds +board = [] +lose_tiles = [] +current_direction = 1 +current_x, current_y, current_width = 0, BOARD_HEIGHT - 1, 3 +current_level = 0 + +INTRO, PLAYING, LOSE, WIN = range(4) + +game_state = INTRO + + +def load_image(filename): + # Open a file in the data directory. + return pygame.image.load(join('data', filename)) + #return open(os.path.join(data_dir, filename), mode) + +bg_images = [pygame.image.load('data/_{}.png'.format(i)) for i in ('intro', 'game', 'lose', 'win')] + +bg_images[WIN].set_colorkey(BLACK) +bg_images[LOSE].set_colorkey(BLACK) + +keep_running = True + +def main(): + global game_state, current_x, current_y, current_speed, keep_running, current_width, current_level + + pygame.init() + screen = pygame.display.set_mode( SCREEN_SIZE ) + + reset_game() + + while(keep_running): + update_movement() + update_board_info() + update_screen(screen) + + for event in pygame.event.get(): + if event.type == pygame.QUIT: + keep_running = False + elif event.type == KEYDOWN: + if event.key == K_SPACE: + key_hit() + elif event.key == K_ESCAPE: + if game_state == INTRO: + keep_running = False + else: + reset_game() + elif event.key == K_F1: # Yes, this is a cheat. + current_x -= 1 + if (current_x < 0): current_x = 0 + current_width += 1 + if (current_width >= BOARD_WIDTH): current_width = BOARD_WIDTH - 1 + + pygame.display.quit() + +def reset_game(): + global game_state, current_x, current_y, current_speed, keep_running, current_width, current_level, lose_tiles + + clear_board() + lose_tiles = [] + + keep_running = True + + game_state = INTRO + + current_x = 0 + current_y = BOARD_HEIGHT - 1 + current_level = 0 + current_speed = LEVEL_SPEED[current_level] + current_width = MAX_WIDTH[current_level] + +def key_hit(): + global keep_running, game_state, current_x, current_y, current_width, current_speed, current_level, lose_tiles + + if game_state == PLAYING: + if current_y < BOARD_HEIGHT - 1: + for x in range(current_x, current_x + current_width): + if board[x][current_y + 1] == 0: # If they're standing on a block that did not work + current_width -= 1 # Then next time, give them one less block + board[x][current_y] = 0 # Also, get rid of this block that isn't standing on solid ground. + # Then, add a lose tile for that missed block + # Lose tile format is (x, y, color, start time) + lose_tiles.append( (x, current_y, + pygame.time.get_ticks()) ) + + current_level += 1 + check_win_lose() + current_y -= 1 + elif game_state == INTRO: + game_state = PLAYING + elif (game_state == LOSE) or (game_state == WIN): + reset_game() + game_state = INTRO + else: + keep_running = False + +def check_win_lose(): + global game_state, current_width, current_level, current_speed, keep_running, TILE_COLOR + + if current_width == 0: + game_state = LOSE + elif current_level == WIN_LEVEL: + current_speed = 100 + game_state = WIN + else: + current_speed = LEVEL_SPEED[current_level] + if current_width > MAX_WIDTH[current_level]: + current_width = MAX_WIDTH[current_level] + +last_time = 0 +def update_movement(): + global game_state, last_time, current_x, current_y, current_width, current_speed, current_direction + + current_time = pygame.time.get_ticks() + if (last_time + current_speed <= current_time): + if game_state == PLAYING: + new_x = current_x + current_direction + + if (new_x < 1 - current_width) or (new_x + 1 > BOARD_WIDTH): + current_direction = -current_direction + + current_x += current_direction + + last_time = current_time + +def update_screen(screen): + global game_state + + if game_state == PLAYING: + draw_background(screen) + draw_board(screen) + elif game_state == INTRO: + draw_background(screen) + pass + elif (game_state == LOSE) or (game_state == WIN): + screen.fill(BLACK) + draw_board(screen) + draw_background(screen) + + pygame.display.flip() + +def draw_background(screen): + global game_state + screen.blit(bg_images[game_state], (0,0,SCREEN_WIDTH,SCREEN_HEIGHT), (0,0,SCREEN_WIDTH,SCREEN_HEIGHT)) + + +def update_board_info(): + global game_state + + if game_state == PLAYING: + clear_row(current_y) + fill_current_row() + +def draw_board(screen): + for x in range(BOARD_WIDTH): + for y in range(BOARD_HEIGHT): + if board[x][y] == 1: + draw_tile(screen, x, y) + + draw_lose_tiles(screen) + +def draw_tile(screen, x, y): + xoffset = 0 # XOffset is used to draw some wiggle in the tower when you win + col = TILE_COLOR + if (y < COLOR_CHANGE_Y): + col = TILE_COLOR_ALT + + if (game_state == LOSE): + col = TILE_COLOR_LOSE + if (y < COLOR_CHANGE_Y): + col = TILE_COLOR_ALT_LOSE + + if game_state == WIN: + xoffset = sin(pygame.time.get_ticks() * 0.004 + y * 0.5) * (SCREEN_WIDTH / 4) + + pygame.draw.rect(screen, col, (x * TILE_WIDTH + xoffset, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT)) + pygame.draw.rect(screen, BLACK, (x * TILE_WIDTH + xoffset, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT), 2) + +# Lose tiles are ones that fall off from the edge when you miss placing them on the proper stack +def draw_lose_tiles(screen): + for lt in lose_tiles: + deltaT = (pygame.time.get_ticks() - lt[2]) * 0.008 # How long it has been falling + x = lt[0] * TILE_WIDTH + y = lt[1] * TILE_HEIGHT + deltaT * deltaT + + col = TILE_COLOR_LOSE + if (lt[1] < COLOR_CHANGE_Y): + col = TILE_COLOR_ALT_LOSE + + if (y > SCREEN_HEIGHT): + lose_tiles.remove(lt) + else: + pygame.draw.rect(screen, col, (x+2, y+2, TILE_WIDTH-3, TILE_HEIGHT-3)) + +def clear_board(): + global board + + board = [] + for x in range(BOARD_WIDTH): + board.append([]) + for y in range (BOARD_HEIGHT): + board[x].append(0) + +def clear_row(y): + for x in range(BOARD_WIDTH): + board[x][y] = 0 + +def fill_current_row(): + global current_x, current_y, current_width + for x in range(current_x, current_x + current_width): + if 0 <= x < BOARD_WIDTH: board[x][current_y] = 1 + + +if __name__ == '__main__': + main()