From 9b75e6df3101d96f567ee1afcc335466104dffd9 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 8 Nov 2018 10:54:21 +0000 Subject: [PATCH] Flappy bird demo --- packages/flappy-bird-demo/.babelrc | 8 + packages/flappy-bird-demo/LICENCE | 3 + packages/flappy-bird-demo/README.md | 16 + packages/flappy-bird-demo/css/style.css | 95 +++ packages/flappy-bird-demo/gpl-3.0.txt | 674 ++++++++++++++++++ packages/flappy-bird-demo/imgs/background.png | Bin 0 -> 24421 bytes .../flappy-bird-demo/imgs/flappy-base.png | Bin 0 -> 8102 bytes .../imgs/lower-pillar-head.png | Bin 0 -> 7805 bytes packages/flappy-bird-demo/imgs/pillar-bkg.png | Bin 0 -> 6977 bytes .../imgs/scrolling-border.png | Bin 0 -> 6939 bytes .../imgs/upper-pillar-head.png | Bin 0 -> 7927 bytes packages/flappy-bird-demo/index.html | 15 + packages/flappy-bird-demo/package.json | 23 + packages/flappy-bird-demo/screenshot.png | Bin 0 -> 24283 bytes packages/flappy-bird-demo/src/index.js | 185 +++++ packages/flappy-bird-demo/webpack.config.js | 7 + 16 files changed, 1026 insertions(+) create mode 100644 packages/flappy-bird-demo/.babelrc create mode 100644 packages/flappy-bird-demo/LICENCE create mode 100644 packages/flappy-bird-demo/README.md create mode 100644 packages/flappy-bird-demo/css/style.css create mode 100644 packages/flappy-bird-demo/gpl-3.0.txt create mode 100644 packages/flappy-bird-demo/imgs/background.png create mode 100644 packages/flappy-bird-demo/imgs/flappy-base.png create mode 100644 packages/flappy-bird-demo/imgs/lower-pillar-head.png create mode 100644 packages/flappy-bird-demo/imgs/pillar-bkg.png create mode 100644 packages/flappy-bird-demo/imgs/scrolling-border.png create mode 100644 packages/flappy-bird-demo/imgs/upper-pillar-head.png create mode 100644 packages/flappy-bird-demo/index.html create mode 100644 packages/flappy-bird-demo/package.json create mode 100644 packages/flappy-bird-demo/screenshot.png create mode 100644 packages/flappy-bird-demo/src/index.js create mode 100644 packages/flappy-bird-demo/webpack.config.js diff --git a/packages/flappy-bird-demo/.babelrc b/packages/flappy-bird-demo/.babelrc new file mode 100644 index 0000000..aebf4f8 --- /dev/null +++ b/packages/flappy-bird-demo/.babelrc @@ -0,0 +1,8 @@ +{ + "presets": [ "@babel/preset-env" ], + "plugins": [ + "@syndicate-lang/syntax/plugin", + "@babel/plugin-transform-react-jsx", + "@babel/plugin-syntax-jsx" + ] +} diff --git a/packages/flappy-bird-demo/LICENCE b/packages/flappy-bird-demo/LICENCE new file mode 100644 index 0000000..bc825a0 --- /dev/null +++ b/packages/flappy-bird-demo/LICENCE @@ -0,0 +1,3 @@ +[GPL-3.0+](gpl-3.0.txt), except the resources in `css` and `imgs`, which are taken +from [Bruce Hauman's flappy bird demo](https://github.com/bhauman/flappy-bird-demo) +which is, itself, under the Eclipse Public Licence version 1.0 or later. diff --git a/packages/flappy-bird-demo/README.md b/packages/flappy-bird-demo/README.md new file mode 100644 index 0000000..b6feb4c --- /dev/null +++ b/packages/flappy-bird-demo/README.md @@ -0,0 +1,16 @@ +# Flappy Bird in Syndicate/js + +Inspired by Joshua Cole's 2016 post on +[Flappy Bird in Eve](http://incidentalcomplexity.com/2016/08/23/flappy-eve/), +and taking art resources from +[Bruce Hauman's Clojure-based flappy bird demo](https://github.com/bhauman/flappy-bird-demo), +this is an implementation of a Flappy-Bird-like game for the browser +using Syndicate/js. + +![Screenshot](screenshot.png) + +## Licence + +[GPL-3.0+](gpl-3.0.txt), except the resources in `css` and `imgs`, which are taken +from [Bruce Hauman's flappy bird demo](https://github.com/bhauman/flappy-bird-demo) +which is, itself, under the Eclipse Public Licence version 1.0 or later. diff --git a/packages/flappy-bird-demo/css/style.css b/packages/flappy-bird-demo/css/style.css new file mode 100644 index 0000000..beedac2 --- /dev/null +++ b/packages/flappy-bird-demo/css/style.css @@ -0,0 +1,95 @@ +/*rgb(84,56,71)*/ + +body { + background-color: rgb(32,35,50); +} + +#board-area { + position: relative; + width: 480px; + height: 640px; + margin:0px auto; + background: rgb(112, 197, 206) url(../imgs/background.png) no-repeat left bottom; +} + +.board { + position: relative; + width:480px; + height: 640px; + overflow: hidden; +} + +.scrolling-border { + position: absolute; + height: 10px; + width: 480px; + top: 567px; + background: transparent url(../imgs/scrolling-border.png) repeat-x top left; +} + +.flappy { + position: absolute; + background: transparent url(../imgs/flappy-base.png) no-repeat top left; + top: 312px; + left: 212px; + width: 57px; + height: 41px; +} + +.pillar { + position: absolute; + width: 86px; + height: 200px; +} + +.pillar-upper { + top: 0px; + right: 150px; + background-image: url(../imgs/upper-pillar-head.png), url(../imgs/pillar-bkg.png); + background-position: left bottom, left bottom; + background-repeat: no-repeat, repeat-y; +} + +.pillar-lower { + bottom: 80px; + right: 150px; + background-image: url(../imgs/lower-pillar-head.png), url(../imgs/pillar-bkg.png); + background-position: left top, left top; + background-repeat: no-repeat, repeat-y; +} + +.score { + position: absolute; + width: 300px; + text-align: center; + left: 90px; + font-size: 58px; + top: 13px; + color: #fff; + text-shadow: -4px 0 black, 0 4px black, 4px 0 black, 0 -4px black; + z-index: 5; + font-family: monospace; +} + +.start-button { + color: rgb(244,176,36); + background-color: #fff; + font-size: 40px; + z-index: 5; + position: absolute; + font-family: monospace; + border-bottom: 3px solid rgb(84,56,71); + border-right: 3px solid rgb(84,56,71); + padding: 1px 10px; + top: 363px; + left: 128px; + text-align: center; + width: 200px; + text-shadow: -3px 0 black, 0 3px black, 3px 0 black, 0 -3px black; +} + +@media (max-width: 480px){ + body { + margin: 0px; + } +} diff --git a/packages/flappy-bird-demo/gpl-3.0.txt b/packages/flappy-bird-demo/gpl-3.0.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/packages/flappy-bird-demo/gpl-3.0.txt @@ -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/packages/flappy-bird-demo/imgs/background.png b/packages/flappy-bird-demo/imgs/background.png new file mode 100644 index 0000000000000000000000000000000000000000..fe09b1313c2291ca91ea142b36b4ff339342eef5 GIT binary patch literal 24421 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 literal 0 HcmV?d00001 diff --git a/packages/flappy-bird-demo/imgs/flappy-base.png b/packages/flappy-bird-demo/imgs/flappy-base.png new file mode 100644 index 0000000000000000000000000000000000000000..0887b7b3e500030d5a25bfb5549b355a849d9e99 GIT binary patch literal 8102 zcmZX31yEegw)J4a-CYxc4laW`g9o?Z5C{%KaCi6M?(P;exCD21cXxRC?tA~ex9UGt zEobkw_UgU6>U5pzP$dN^R3suK004jrmKIn3JM#W*bO;~*_R(X$WB>qxx`mjS5?D-( zLdn6_%)-hP0MJCN&~oNaI-l=68?V1#b3bqAUUYA~sS)ajC(nyerVoq5K*SwpM5U&o z42(;Rp-G@ZU8f?v)FqERKX=s|zg~Cj)Vp`;Ja^1EUfEB#{M!RArZB0fM8C)Z0%CKA z#`xp{_}hOVZPG#!O+bIoMoLEL_=4FV71g-$-qsNf2vB~M%cMGfH+f!XNPd0E^MDd2 zF>Hv|Pp~EEbpjX=cu)^c0u1;lze2nruyErdeAsAo05fY@xbPC(XkZP>2ron@WFmLH8Th$>3e^bdJ;64C?&jl$kIPWBff)=dIpA|@G6whd zx~89Ska-%psc1x_!)xT~(B@d@Zk``F=PuzAYBw9p|E1z>gYo^dBffMnDBBMv1Wz5K zr$bb&7rwnPtk96ld;$bz@(%ks^9}=U7uk}SjL#IuG2iYO!*kL3{-X7uy zcMm~sxpgmM&PoSV82X`MPLI=fUpN*MMT5P>qG7Si>9%o?BHl1CPo*yrC9=r7@RFg~ zDPWB@PGP!5SSap1+paM?UQ25Lu)-gFyT}LM3tucYYrcy46(EPeX8{ne#9yty)qXuj zH==yq*FUOiyrM8@<@(Vof#3q)i4nBa2KZS|l*c1QXHgU{bHDxry18oTY zFVaj`c4P~b%2}&H9CYE8^%93Fk+Mb1ZX00r51y&{6$$E#;3MW#Rc%N*Ve91P4fCa z)olxttpdOQ^R<&hpC53W3t(A(k;TULnU*Hs#4%sw4Xn>_xEr8m)H5Hv2{bZa zS_1$-JaBU%84lS1(*yn(!EXc8EdX~@5*E{59Pf)rJqAoKNsUB0CeVZ&DQ?k{IP*+&2B}5t~(-sa8;RiES|M zKQu)QY`0w2x_Gw1Wcoz+7j0Z$&R^VLialt(pwny9i_qiJBbR2V(v+H%>Xy=%s+Urh z-m4zZ$jxlcfM(EUyk_iYz7`j4M}7vrJ1*9ZWY*!A_Ip@G7c^UB{UD?GZCE zRUlMwRbVs4-m#pzE~VA4)=$@$K^P%ykU~i7q0s@`!SLbIf!>5?UQtm}Hh1nim|Q+f zL?8U_;}!P?55wRO?T_nEE`}urB?i-j(eq96yQICOaesTnWkgFvL&R$Yc}j5#O|o1H zf?RMiQgUjtWXjJJt(3$R(&V0GMOF>gdzSH<4J{hYKUy!EQ8fv*{06Q)VP?3doTj&? z0>f^Bx0J_>#8L8bqhU*VdM^{f*g_mo4r2Ar*Ll?Z)A1@NGZm*cGkuT0SqBq9(y}RDO_=t5$Q)p61 zWvdzJ#i&gP$9ztvcG17^$7qeIQ7WEr%~8maFcdVD-6YsF+7#S$!USV-$C|_vQ&ovu zh&PDCh&zh&iR1Ud_MP-%^_BMZ_m%WD^!oQ+_qO(G(9nG3r&0cRCjAHO0M-Wg%c{#N zNKeWV%1Fp0N~6kd=Qrew<%j3Pn<%jzv5Bz3vAx!Q)-csnR3;P0@hk=%Xo55Qx_RFOj zof4sXfkuOpyt1|GtCYO@sQzj0QZlIQSB6`uTkw-2syu3~WMqF^Ve+2fsOabyCN3ta z3Ki|uB~5GWQ<_t}Q#Df54D*a-kUnJBNeog3*}tK=eYveXXrIKNq&>htRwP6qJYjFP zVln+}CC$Rfn$C*FdBsl8?q99TsunpQs+@yO`A#EQk%T~tUjmCzNW>1-I&2x zw$Zv#Y*B03bXk5Od^!H)oCg5U5Ns8!5fv8|8|9o~rx2w8r*NL0n1P+qs;l|6?Q5xS zM{8u^HUog|&E-k$G_@AptoP+CxqzE8f3zSkl_A}u21p@qH3z21II{y?~@0G@z^V5>m4 zfHj0Xq-Fd$aU;sW7*G#fH+lfN!wVaISDO8FlHd z7>ItELu&T0-V1JIEt5i%2Ev?ixD%ukc7ATj7|X7IweOsAQak=`N~oyiwm9yf{HPk} zDDkbp%+wTDe>Ua2s*~L9OT+5?hsw0Cw&k%^bREC#sb4=e6FOe^RCqQ?+AOb}70;Gd zlwemelz*#Gv=k=VBEma|T}}CZ^PR-1*5=53&bqR*%&w_TqPbv$?75x2f}>(UyXkCT zUEe0${CRw1VQaam9dhra8aG zf!cY6cj;Swhhkn;j(%OIy|8<>tCDTC)1Y1PYszAsRF8U(V&<|CIf*?nA@QmJh;xsd z>z?YSPiVVl`xuC>Xh1uq$J#!ev6IH=%JllwpU^+kZc%r*Mwpb6Wb3ic*cR#5%IbbX z`r5j3?|06yueztb$Fv78c=E*3icwSj#=47rUDQ3UoORqm;CcAV}x4DYA)~g?Cx7&9u%aZ1dxu_ede;D88q4h+Krw646 z>jr%tSkY_gyw$vT*=uMCcjLY$+iRCwlY34^U=+0K(Dm|oqk>ZQl@S4nw{9H7;&FG%cwK9Qn)qvSuc+OfECtNAm-pT(m=@kOyU>iqZIu9f7*0DhSD3q@M55=u zm(vpE*ipFmc;3-R^iELn%+{2vFi)J40);et3hEqblSTx87**9BKe$PmOa z1W!CKS~f;E#gozpx=;kLI~}+L^-wTHbWxZWw?*xdD-cJ5@1sZo?ygrN+bk@njuY8! z6VYrcrZ&B{euM3i_#x3z&9Ub!IhQ#HBZmyznq{u3j4{akr=g8ihq=A?0Otr*8RIcW zn(DG@E61~3@O4yD`f!G&Ze{bQ=Ec_V=JyMiJ*|DU=Ifiv_*TX9p>_AwR*Q8e(Llu- z+YbGo?y|2H&P-5ofS1T#o@v!<4fN9{R0wsfcgh6KBE582rLzg9pMc9sL zc%<}-r2;EnCKRrF2Uqq-IKHZp*ip1%Q_54}imQCDRK~pVyX8hdzy7dOxN321Npxk} zhrj*?EXQZV2Y=;g+p*`(eJ}x=THGhLupK!ZA{`IMl&Z|mSKaFCxBYfdIsLhOn!M!b z)Nt#MnniRe-#rR)&d~NalV~LC@Gh*#Zg1P3^WPi$(X4mtByfCoX5p!OzoTutI6dMS z`1%O*S1Sl9Qw@b%@SMz*^~uo6GySb#BjAdm4jetdQ_^y(G-H!G-WFb~JS16ScmvRz+Dj2I4Sx(qUxYB)f5m&(ch;5f1moKc)hJJ#g3f;e` zJgC+s_!+HDO`~$uD(h2s92?)ipi5UfIX?l|_kLnn^+JD^Uuh5|ByQX}x-Agz3`#$t^{ zd?@Q;E3Rfj#7i^Gtj!w4Y4-7lhxdqYZgcNL1|m`DpHO|YC~~(<4wr|+SlXdgsn#eb z(sP+Z8BfU8@1dxA_`|P7nVDom$)LKJ7LOlHmICg$XO+k;@vg7?I@iZQ6dXpJP3AB? zwzjrb9<;MGCk?l%v4je>YK>C$7IpIGAD2&gsex&XP4zbJ^My0BGtnGYTrym|+~mJ> zX4#g)TB?>L&Bss7-7hXFm#I%H1y+OIkT#>Z7M>f%f4v`3*nGZO4BtniZa0ns>d7N0 z%*hKSe;h~m@~X{m`UO6G*Kgq-&h(iEWY@z3&`kj(u7J-^AEx=k0W3j1&TatR1}GT_ z4n_1W)K>k4^Ltm1M>q$I5A6ts9Zn@xLpFY!7@*tVoB|C2GZPv}H9GjYHo!=PE-zi_ zOR;0I*$hr9QAO09*nZA4t13&K9maHoR?m?Ux^b(WT(dy4WwU%6b_YtQ$gZfGL}V^n zVP>{{zN@&U^s;!7f`)9BjQ)6b&qTlZ(8Bo65J!)kk)AQ{@8Kcs{=%WT(T?y}}zo6GN+RJV_UzE z={5^~O+%8FZMHJ=+g;Zxo;w~8o_{@MT-c&&BE?ZY!RjLrq8U?Y1r~{~MC(RQMXZrK zItxAd80*@<$mCA{)&W}uZ^utcIY!AA)MwfWwIq8z)rb?~mD-yr8@Idp0Qy`EEBXgWMBCAOt{Qm@<|6+1>FPH+8j z2Y-7+a)-byvN%qluKCCZ;7^LD$0*U@(n&1EfK9MJB8=a^6+>pMXLyLh)g|5Y#=Fx0 zU`c-1j;0&%=>BdLZ4_*W)l9Pjy9Usg?2~f}_?`laa3jhLBA-s3{4u39i8}o}{ch6S zRXo5mjMI;jT&I< zFeb@-R%vKMch*OC&#&)RalW-|-8^7xo9cYsAwf>3Pu?l|eknXgfo`OC;ZiJ|j9$X_ zk|nKnjWG1gbnRVG$MDkvzb%0L@Q9$Inw zLF2A5rhDdl&GGp6d_^7rlC?4F@vFM+l)5d7N=T{wZa5%%PK#@bT}ryWb!JNwJttc2 zsTZ^vIa-*dd$cPl%cFe;cd49u_4_)D?e+*#L+5P+uk?O(7^RRT52xF^jd1bZ3EHl0 z^ejkq7u5higuA}~@xaz}&{cTQYo5B;K0NAOdU=|UBp2f5YMMt+9!-S%$&v>_*zwiL zhBpgS$M_`vp+?vvhKA=}CzdYxFjjoAJ4HX_NYqnmq-#wm_^fB5t4)r`3@{Ro`dhG< zZi{(K>yl8lT=gRh_m$tLO!b(?VCGD{P%qz{)Yw6qE{^{6k*y*6!6)B}&{sw&grbj0 zG~Ai)QAJ7jpY+kZbA@BFgJUAAOG12$JCaM9GXje8vsCjTadJUcvAPW&;oaF=ZEWfi zax(>x3L3pWM4NrC%Oq9fdM-&ux}t2OL-HXoL> zraz9{##p34ai1jdO5 z<`&9+N^+MWkqNGH``KQ8QTC!s>P@N<@2;|?Zd@V1sw!qh?WuD3b@k__x-zlT^DKN} z277c|YoA*tKiH*ofty>23x~g4(2qF7#s0aVUwk@$?6}b4Hs#nh@EiMj#pvT7XQsif zI?1hXQ~0eCp?&D@D-TDvsJExXaZgiurcJw>=gjND>g5_|uSzdpYKNPNnm~1Ct?Er< z4PJJhZap4(FSN7c*;xWz=P`# zOUrf>%j0i!{8n;+3B0FcZ?wRatE^&{EI%@`oR_1=^LcNmF2udV0_^pqzZVUNcG6mo z001)fKMe|ynoa-!K&4rzYC<&SNkEX*5{$;R@#n} zYixQ6a#+5zfywX{1)-(a0TlGpp?N%Sq_uO>)SDIb&wQ%qWhM8s1=c(Ib9yP~hgN5C z4TkDy5WT&Rpi$DFC__6ngBZKj@DyamhG2m0QQ(J_O5E(}64<=L!8zu^b8}9A%Y>cP zyVvpTm8D2a5iyIHD46JJ7@HzKg>H>?UEdb1JFY*wianvP<1)ivhIkK&NxFZl&)Y&d zMqyeoC%4-B$x{7zvk1%)5tzCin4`vnncGzl`Fc6`@|*V}Qjs;k#>z20<4OZ>lm1s+ zL*&3K<-K)!!4(#%(d>#TLO{245zN_2bNKfb2F7ev+HvQqJp3n;*UuXEcKF3JR;f2A zQKGk-&dCe26%0Y+dV&;0zj75m1iksS9Q*Th{p{H>zlf|Cc2R#o5DCQTI?j{~O&4XS zX+>ap8bE+FLUMJDWnsuTU%zH`$!U;J7qOYH#`EtP zUf2+Wh$1&6!`t8qFVg?IKF*S9s_+NjlchdjUMj=XB4}vw3?XaS5d5gu-Z%n&Vz!)g zvEAi4K*f|iFFB2`wx1TLw|@(-!qiY!%jPB`02NI@gRpf7t(P8oaPWj896qo!_@jgh z&kX4>PZ~?*TKFg>t47}W0Tinq|FBH0@v&o|R*RT=g^<99;-b?tVhvL1;$D_ga`EcS zn~Rivs_Ps?H16%>TlD=dwdUYEM59aiIt&hE9goL|s*cSYpY+vc(0$1>Btn7c2Yatz zql9bQz(=+NTF1R^$bcxb>|X^IT5<{{>n|j8aD0w;M02C*|BfC);$*YZKQn7fF}?}@4%-pG8mXzI_=`a zDH~>ZH9A)*Kzq78TZfZKtE}+ziY9y(935y0IaW_RNuv99q(Y@$eT^c@SyddkPu}%dUdc$g|NNmN08#b(mZXOU23d&;%GhjG{xyU z-#`k47q4P(r&$&`W5NDXSG0yHhQ1a%NRAg{YCBFv##F>Ou{SVtruv9K{iuxEpRs;( zY@JrNWx^V*?>UGl9+8m-DKiW;z;c3jCg-q{uV}qL#pKH&_X*Brdfm&*HHZsn1(Y$S zZzIetfnH1jzWS0007YC<)qZ#&f0H{0qNaaZxM(t0{{?d+e%8R z$xBL7s<}B^**aJP0J_N4dR{`Qr+>Ro#u{%|{7yUh=KY$l>O}hyfrT;ZOi@W#$oNAn z=rpuc;Yle8w8_-ytJK8jhQQd`e5_17JerPxE^MU?NEM5fTJ}M;H_TBNKrl(INf=x=4iBgyw#Ns+eM?|y&@l7NZundHH9J$#=4wnDK9vTQ6YSs|+u zEZdhrH`rG=TqKboOB^I<&^gG!MDfm)%S=;>fy(J|`?UcHH5U4^&=qDXPbk$4iBRR; zYx$YrLW)undiQ>CU5JUeYx*5uAvU4)y72R5}_h7t<6&wc;z>txK z#kaYt8zL5AlL@qxh-r3vj$IyHAMM^Q43W>jNj`_!&cg|Ps(x8xd1Y`Xl#2xCg}{9x z(8lWRlF<5v*ybySb}hxzkF$JCWfk1Y#q=w@08V;T%|C%LylX@<&b4HZ<=wtJj0I{` zYyzS(Apycfvw!0!km;j=VZt{8@+~{${aV(A*|F6>WM+3C8%sq8k6T3c@;=$%Mvr_3UU} z|M3vhjOuyU_@Jiwg3_d&*Rx$3$s4g7D`NczkqLyOxt2Sm1w{t6@VPV_YZEB!y2HY9U%A-b^|W~_>W^0){?gmO3VBET?s`@K?x_ytW(%nLq{{d@ivobd&FG9tk^K!%^I6$-#Y zP#=Gfp9cehVzVR8_Q15lf@%qUg^|LAqmK%P}DUX1_b;ya4Y&rFu^zm z1(e zEf7^iqxT!3h^So3iAq^ca55B)8kAsbL2(~dl|Rk^#v_da(m~awZ1ZD2@G|I3Q)p5$ z;o!%EBZkDXWmEFL<&&r#m(iE)mN8Dl+7Y9VH`-t{vg=b+hx1Ac=6Mysjayt%K}f)a zA49&0^YwNGM&w8YN!6IS5NXF?$xy_pD#noZ6XJdr2onfz3oh^BHUV>tu}`H*|9StF zVmLCT@4%$GHfK)kD9{0gm(U=hdO#%1-J0N$JhInyjn*~8#mRR)#1*+!qm_CI-H_A? z>-Jqs%)n;bdA)Z)2V72Ye1GZM<@w*U+jGe~y(dg2eI{`xd?wV2Y)#qS#&qDc>$G)QjT)cEt;U#o%@q5T+~nR=>m>XXS-ya(hU8^}Rmcu0 zD{D1UHE%U8YvK+2vCl$g<8tFvV3ZoY>Evm>X{sDL9JlOab!&RGx_|VZbmQuh>xE2wdZVoHEqN@j zEro}C!>_3hSxDoQlSZOg(^#{Q!3MxZYC+U?l6JvIm>bv|zatGY8w_L&<~X%DF0vK@ z8U9)Rdx2PiX8~2WSr-h~Z!YI<#IE=5#jeY1zN1b3tiK#b$$tiXeZ;tBra+5Fi^m-c z%!wAl^bxtJKR>v5xF|Va*&*MRJRdw0xTHHvxwyVyy+l1bU5j5E+YRb@{SYkKBS)!A zDVwKdVw9jYE|$QMM&oUK7K+uLP^VTl?vt;QFKsGfs<=+HZniG6?tv|j&6jAANJ?EJ zWh>Pr1t;Y$B`8JM2j6$}3#YH5ufMOnujyClughQUzjSD6>4a$2=}zSS$h*nw%l9j4 zE2_v%C=x43E2PMwD{dAw6-gFF7a>}xaUO7rb0Tm)*E8s$>lHX89_5i~s~E)5>QM7B zsnR>M0GW+hMXP)AO)3+rTx8c93eq-I`Wm7>MrA4-DC8^XBpWd`Fc>h?GxISAX(fI* z*J4y7)-Kj*Qd3rU)O?mz)*dlFE?7tdSANg-t?-R}P(@cpua}AK?k%*7D zS{>Le864!;SvaydaCk1bn7DkMSsck6{73E@J|`j17p++IX%1ZF*=7Y1@RvW)4+>7N_i>uc$=>f7rB8&4YZ8(iz!Ot{RM z%@vy+ny8)L%g%tf3%;nlS#b?;=LX<_qSt&EB@C0x#!cWXFOqt&@MN&%A2U0oFhO~dpw3KU3b5!&4DT;tv?VGdZW)N*K$J zqn#)+mv4ylBKyWK;ZD2td&;7Ct7@ybkU};y{v0Uie>8GVK2WJar2d<+u>5;@s)~sU zmg-furf_oz|UbZ zWV~P|`ECQL+rfD)zEZSL{hT@w<%P$WESJ3Xbwj~iarL8X_oRo`p`9hMs-Exsn49{& zX1Kewb+MJDCBE@Yx}Bzn()Cl*^51vgGCw+3CDt%@{cxpue&0&$e%V_c&?4isxO7rB zQ&C-xTfU%CxBW!}}?(cfX+K@>T9U~k8&t9{|v#=R{4Ii{X_*hLhu|MAK&>pAjiZ1%6l zYHN22sGQY;V9fL>OCtbHpH`rb$3F1Lq;A{1jfMXoKR2Wy?$zHgF`R zIXQ5vVB8X~%4jKM%e!aY@PEVz5a?yV&xp9)oR{=(IIgcC<&zAza7x_;+(|V;hGBrxUZEd`RVc;N3*x-$Bth4q&Q0hx|2I zT*L=l4eq?1{)^Vd)tnwVI%^s5CsAlOJ2U(C>}d#LAGYQvuCy21sF4*TFAFlGaKQG# z%xwL{MNP_;7U#^@zpyo>vzja3ZkNN3qx!wygCDLUG6Vx+ftlqeC@nV24bE@xLrYeF zon}mLddf6T^Ji&h*!rC2DPD472WV8Cu1bWKXG+IgW>)!JOxaE3wu!xYMV8Kl{AkUl zO_lZ$E~A|{X+W9uY~2d!Xnx1wVnJ4+(A@hwt2M{vqkFHp1pT8 zep^R_ei}Cu@O3K$Uh0Eegz5?|X#70vg{?LhcV4Pl=U#PtFwCW#)c`wK9$T~**xR2; zBu=5{Q_@wqarn0cLGcGn9x%#mj#SHV4?Hr$CA2##+T58`ez3CWyY^1J6s^pc#TTil z5ady$0D?ezP8MI)ql!Dm&q(rqjPm8^`y%NQ^I`({ZCdxd;ds)5bmGPM+kq*ZGw?hH z9u(ItBr_S<`b_%9P0j~W`y>Z-hXFG{UK?%}ZUxR2`vOY^bFj@{fJ=i8%OU(dXE^mescFR#9RX;(cRT=iRSw_RnG z2v@Ch?lS)RS{|I-LnHqA*Yl4LRM`1NwQA}v{2U=f^0bJu;WClEVqmMFC1|MY;CVT6 zDXu#P0XdUuh450K1*Ol<-i7M{9#k_HH;!I%QhhR7by@J4+Fanvc9q%JkDe|n7j5os zDL$;bh?mx&Dnd>|`H$QkTdo2HcNX%Nwzny5oCj|ED2GD{6&f>tYp#urJASxn9DiLr zPFryIXu1wX&m}om{y75n%GUQkk#45w3M#42>+IN^4c!^_Y&E*}5I#IPu?;Z1-O_iS zpBfGbf4+x%ixq*AqlLyNa!TRD@nGr@ko8i$7IwkhARqsCtGr{sIsLw+sv+W3Vs&@S zV*~{H6tMJIetYEDsR#a_OW&Aw<*#6oErT7FNi$rb+hmwdt_ljxiARI$w z9$pJ{VZBqR@IBb&R)jcQU7&r7IaiYYQ_WH{&wj*7#+wB-L|&2?Lhd;CKY!wYH4PDw zQ2F_t+Mjw=TJRUfXXYqXg(5{ec@@QCxnVicr1Ql2gptHAUk;OQwE!sLQQ)Yt6zb&t z6lN_JO)JeWGrwkX%7HU#6KS(Tm6laaWdZU79|-r1{w@})Rwtew=-Zi*91fk)v z;H|So8F6-WwDV(}WP0fM){G`sYt`yhXt!wtTRqPo3NykpSy~#M{Qj0q&rHX2JMb#- z3h)8H8_aMnM77l{$k>b>+4!BEQ!UaQe-mDg^hH^ZZUxx4oSezP#a1NBG14+!De$ZQ(n^+wAf4!*;0WQ= ztmjB4%_bYAw9%2W(6imjyhKR^7gTK|O$KbE;X7;b@PM1V4#-JTc`)s<8%H2T9>g9& zJ$F7mYhCNgh0Oi;@2!arBj7vETsow&+m|xPwBs~CNwl_% zU*T9!)*l?1cboBy1O7kl%;L==U2s}ym*7_b#xi|M9$|Lr;22+$oCx4l#)Rjj-URy8 z6pk7SKx>#xSzL^=*S73w0TZkj1o zJC!FTrp2~J#l_WCG&RhH^wl6oO8YXKqPHE!%=Eya`LED4wW;iPOQ=?pNA!rsqI`Q0 z8GGE4irc6R+sQXmC&rULid!LL-|EwiMaR|wXXgyB%PwgkqcN~s;`Ll?loHd-=*+uJ zEDf`q^C?$O>jGLfOJrEJ`4R%>ex89$k7G=st^^Le)2i>EI5IcZFjOa1MJX;Wt;xn1 zP8(eE@TB$A88tkCUUJ{RJzr4=KolJ;MnamtTNS?Z64J6-KbrPP9y60#5*Jdhue~@k zB~D3}dmBZZh7aau81G%mD+}o#<$E-a1N)&~lH0u^G_Zx6pbMk#U1sTIX+v4AzQeqN zHzLj}YrS)_KTGRC@1lKP|M=tTx*4k68MRKHZSEiZT6lW+8w(WW<8AqinKqJw@Rhv~ zg0uxS$V0S>(#Co(^{!6LKY^D2)*z8FZ9h?J{%5-Jrvr%q+2NiQ(a4kD@tzJP5-Y%P zH2M#bUyK`U8+zx&npK)~?0gp??{l;hnj_hAj6MfK^D`2E)An%pXAN%*GW~vlR)2nG zkwq${OQq$@@rx@>y?t+t5mX?SkQbQ{TU-7KTGo|T-kKd&T9m6<1W8hga7Z+4@{j(R zx6#3=Ev+;o!Kx{&x(VGWXbz66cIq$+e<`CHm7C(9E1J717Dx@>jguJWo3&#fN~_gz zK4RV=JQYRT{4@0{94mADkaqU0=o3P{ zpQc}ok^^rH`}5`_t}@1oDyP6wX2xT1u})m8sD#-RcDn?hU7uyI$!)WHnh#Fm6tUo9cThH_CGFvUDsA8 z^>~~?EXn4IPipV;%@LCKu9)NFQ{%-GsuBqy&GvSEEbf<@DjGd3vAs?|bPl)XTCES>=)y%roR1X zKz5PSa|ZxWasO#BfQ&36003sjR#O+EtE>bzcXnhmwQx4GWb<}(d1C_rLf+uFp`#_l zl+xSL!O0!$Elm9{2Ka6K4-BHF{1*jcFHEhgtVSv6>}E;H!^X|VPA!5$Nl7W>W?=pxse_{U<=ihua8)t~~TNT`F&E=gSmTqrii0MDG z6XE=i`v1@Pf4x-QY%Sli{+If{V*hXKKYSt3KZ*aZLj1eR|3cr&EP^5g`tKzZK@os7 z+W`P@NAgnQnl=c>nFgwO9C!n-*{JO(3`2A%VTk5t{@mw3oYx4?xb8-t7~a3XW9l%G zXl2Rksdv-cIT1K+Oy0g* zhQZBIsrHVi5Ga=M+ zKP))O9V29>n$zWlYM0j9ayP{`-Xy+Yz|L?U(fN#Vk>$)|a_L=ERXX;us)d+FM5CpZ5a~~sUFHFz{qFBcLluN` z;(enre0<#udwTlP7_U)b@360>Jx;fnu6Wr={aW}DEi;Q;Eiwx?9E>Gsb0bc&o}b3- z7Y6Mse@mr5As;Lcc`08ny zUuhr+q+{F;A=_DBFF`W8SNqX)yKn~S#1VX0JM-o5yk%*gysFNFvH}g#t|v52=0*Kj zDGRDDW^|sVQYj>YH_a~(61AYkA!d$HyVcQ|NN%pcKD>$8X}&wA+8F8*SZi%0_;o2c zXz#&(_IoDytP}(Upay?8_jiIu-L=&rh9m9w5%-=yFogne!k2!tPt;q9JH}-U-oh@i wlGq6+Y3;aM*Bo+&uiK-(-!n#4Q0a!LyYLX#$e)8S> z?tA~MdR=u+pI*Jz+Gp=`s=K=So05VgIw}b&002OjmJ(BbIjg_4SIDnldOWONGys4| z-9l7UNm^8tQpv&A%)-hP0MJB%X*u&H98b3%jZ|MRxgR%k&AQiKR0wt>0dvBY8A4;R zQ1JVi&}nF?0%PN&Y2&ETm#K+Qb%7Db$F6!K=gW?*de=^^$Bt?H3)`udFFoL744ax- z%z*!wOB+F_676WH(Y3drxI^zxiB+j27YhG}jVfC`~9< z3k_1_+^K7iwj)K&_rH19*Rup?L=d7AGMc?y4|?A{hHixV9A_IxfAMz3$E7dIzzl&E z2zZ~Ih{d(Otm!8dWS#;v6$!6(c#K%=TODrQ%<+@Xx{5o6+swrAe}Fx$Fg?F_B$Nt< zWcne55U68yw1}v6A~m=Py}1pn2jJltmF|*AJ{S^8fl-u!}NOB z5zYiHG$I;Fo{#|XPpwCF2*~hWM>o2RfPCW%%I;6*xv7!mK{BJ8Pt^s2eTQ`dJDDNo zxS?dI-X3B*S2sa!*;Nms&PqGfSo+^Woo>gkK61>)iv)X#M!muu6$^f98 zi9K3>uKcu*X+-t7t-n`Zdq!!{$oaKV9N7h_6)R}xFp9H$LQ8;Tr zZIS36@c3hOwV($cEbytLdl~wg`1R$o_RT{D>eU8N@j;RPc?!!HxKVkV zk-CGsqYWkeMZV~7BfJbJvU9&90R`PrAU;pc8qM?idbe&h9sa>GM>xfdQmz?m8tcxe zYpunh49teh!(6$Ex)Q`f?*W3*qe5tK5&W|Q!&ey&Kqlg6YSFmLAC=V+d@A!*TmUy) zP0i{wWRK5d?Y0P+DoEQu9$Pu|`2d&M0Py^SEH19kxD<)cJx>ek#*F?MI1Y(m6d=LP zUhfOQLR21oho1=t^~DAwO|`+*!-IYjy740i2*a-Z#q3_?`aq*mhJDdiaNZ;0uR!Y2 zk9-J5F(`cL3;=vcpw*c~L^K0z52Sr$zZGn^0Q^;nSJ?Jq1RsT~u@E}RD#TN3LTQrmnPpidN{5AXh1-Sn6YyV%(MPMzF{;7Z6tF-}ao$YlY=lvh z3o0lHgz%GJnJ`yJi&s#(h__g|ksXnGIFj-!} zQGD>-4~l`{_^v$z*w6GCp#v`~R8B&jAXtw;fa7O^d-C88`xRRIWIG$TRX=-_dX;+W z1$13f8?5Wsb>Thh4X2eZo=phpK2hBTE9a-vC)cN<78PpiYlV# z(Pn;Iq|D4PWEdw5mpSGNeCRrtQoUF`UR?rZg0eyLp^dvnJ8V1syK_5wqn1Q9W*e4_eMt^vJe1D)QjwqZcLI+mIXNfNo_7cY3&Ecov4dFH6kKw?i z!X(;6xg=z{;6&8K9TFpVN2hGTexJo_)*N#v# zeA5r6m!|yvZh@Cn`%I*f^07mq%!$lthY%g$JT)&`BS|CgJ=_)imHUATnK=du24kdB zBs*Chj|BG=_bpEZ&m)hb!;~F{eVN^<1F`+BW1juuira8aH*=@;FnPP@k9&-3Mv6C4 zZ=!HVywbz?FkJ=CDo^*$?#}X0m$t~aMNj)qc+TIR#GhTBF`uKI9Ir&JjBI|EkR@&?U?{svv}&{}u@jm;Hf z5<^N|E@mNCBZeU6D8?&B*!8OGpcAL7xU0LXsH>*azw^Aau~UPV_AMW+^4lY+L1_nR zZRu`Vby)?eKeEI!;xh44=(6j%HMyd>VYx^qN^E;JjnShM?%!07CEQ6BhQaj1js_euyg|4d5PoXI?doo!v8gY6IRqu5e=@_{f zz13nqo~qF+5v%8E)F{a-TdO`w%Bv6QA7;-bLP~z6xfQzw-zlQYqgP5qbT{QEZV3#D z41HwgWR`@fXfMubTH_wl9ugd?k)x-Xr_Dq3p_@*k&=TnO1?}a-W!X;iAHqL$JB0g+ z#K^=4?DbY))Av?VU?$d7R-6xK>S2EGA&Yw=d6OY zlC?5;!WvR;5znR3u)~DHzJzs=@A2Y%t=2MPwq_d9j?_NYxz$$FX4baU238+cXI0r( zG#IcOGaAd*TGxusYR#L@%g=<(e?K_p1|Ts8TLo)G#zw|OI;YtwL@FRE9H+*o;ifg} zYJO_^RIJ<5m|UN3@45SKlVE*nb$F*`zIn{Et7DL6z_?%K&w1uHE{Fn@t+B4~pm3dL z%A4SvbPTDp{91Q+6t_s@PJ2x@GhUVO*>-2ieJOnD)$yF?j3>o?@s%|e8S>izQy^o8 zNQSt+$}-A3cyAUC942;*S;B z)yEa{%HO{M(?;u-bU$0UJiw1O4KQk*W+O5l)R@zg-E%VKBwqc zQG$Yj0+!-Mnks*iw*&hS=+OR`vYX9aH~q3olpfVUeX4Q0-8cz04*QoWq=R)~S|lKf@F)g-F&&2##MZCVjd1LS|KIvu8eKUDjG+SJxz7pSMDB-^>o< zfc0qC9rY~h+k~0l&rr-f<##l$Zz7B!b)+ezd16{qd=;#8xyT%--}kEXa+Zx!P#iag z^*E=S^I7bu9mBkfpQ>9FbIP;yt6J@a+%sL3Y=1iS+7&(~%~nZvsCOu)&kF*{>`949 z7x^I{wzxR2sV}+&*DKcdL70jLbYps~&HZT`DNL@+k9Xa1-4o3gRl7^X2}udI9?MKk z5pIpF?g!+LjSJU)$Bf&mTiRR9TSx*2ci={>il0xco4Dr%?IX$=`z=JCyPqy}Qy+sL zMy94!mg`&NK}F0?OuQ_LUYPeSEwNYr_mW-3Q(vZ&d*<#hA4zW_&IR+lIc?{x6s!WR zt;Ml=0}eF-=(4Ip0D%4gT;?^rj}rhu5~TmR%o>A;nkE{_2$G4Y(9XX|(cp_ClqNBr zQ^gvaXk*2pfN@Q{ETJZoCheGd#r+Axlc(c7E?1SHEHi2QQI~yKSkQb}f!{TIYp##K z!B3@9yHu&z9q9_IQ}}N8{RIrP^xgDb3_ZoP#S}{OMP-G)lP-B$ zk`~CF#%-SXn6HYT`H+jFpFRzw2jw|lWGOTAt&&h;B z&+oapH#t@L=d3*bLXBFTan=;gBukggEX7lLL=TOk%|$-n;$*>S-Q+TtogvsjYLnQ7Q()nQ z&z;t2!ccA(@jT3Sod%Rb$I>d3^v3-VlE=%;=bv$VW421!7 z@X=*UrT23fs9nF7fU8x;>s%XB$5)YkM&s^e$#1qkzx4!To_W@6!!Q=JRRU~bIc?CM zVQ+pT5jplf9TzXfjl{nu@Q&JJaDtO(v8Gx?xceZ%pHI7`pw5v(PA^@AzAKOwNtEkqSF2_otGw9XG2Vku)umWS~TFhY-Zfd%@S= zzVEaMr2y9vgMgetv6z3s%Y@Q(Yv;^<56@RM0ymOQbWC|HOmUI-k=mH&`(~-pk56Ci z6wVqP8{%D=w~@|2gGve62&F%9G;P@PWZ#%bn_67QH?ZwF?4s`XM;EJ1PM2Tm>o@&& zP&xcDf0#Ju=u~s*kDfttD&IZ?aZc0rI1;a=Xz|X6Wi~ghPx)^Rf34TMbmHGXIHomG#ch$}{yTZzbT2u}V5>dZVamw>IgvuCyxX zSY&y7#Ayfw3h`XHFWN&JT01RYSawSQmF2?BO7$OS?;D>Rd?`X+MIe*wBA~|L&pcxq zTJeWd83+CZ+A-hA6ua$hbI3xiF3#SRg`dia55kzrXTb+-WSptKx+n|Md?-z)9;Xki z@P>W@A`0!ls6D8c#d$k1zA=U>%H+y^kyen+lNyi`j6IE+jUI~m{(V38S`C027zzm; ziKmX+jb~J2QZ-ZkKG`{$UId&}`ja@tS7KUPQ|Kw(^O0~zZ+bpY5w>h1#If<=fD2+% zYTIPx(7`bwH+A6enkPPrL0_*Br**3nrqfzOU-NbbWv02Zbw|h!&+%aeI>58kwGcn) zG5 zf8!vfyt4$h#v$F6b+HvwGa=!j?Pt+u4f<4$+y98`WTTww{#Ad zo81_?zD3E#NGI}RnOzxA=-ThT$ZDkBPX+1e6n%-1s^|ufugsSG?)XP#Xbs<8AGdYR z_d##)nDACvLiO01ni{z=j#8X7+{%aJU}`@#iq#v`f%RWc?{bm@Q<&=CVpRe@rdSGP=ex!%!*!$t3eVgq+|e>Dnk1>fa85j`!#g$%c1r&^pi6!}Q= z2!{`+d^KG>b}CLUzTqt?6CKO7#8aqj7D<30x-ER`Bv~o4)G_QYV&Dd0a=a%C} zsmx0^dXs@87Ze`b5!*wCl-ikZ;S`Z>>H3o&g5zm23LTCqf1z`_F-~zKX6gsUm7# zUO{;p#z11+_%ouBL;o!i`@2*vb0tUgzAy-E;&{kc+c!8Z&Vy z9`Oe_2a3GmtCNXj7OIZ*PV9AskViBv_q9$8ed2D6*lc@}e#oAPr{qA}l3?&r$7oxV z9EllVAPoJtKqvhg%bM0Hv1+O6TQJv|-@A16=-ObGbiHq0zFEmJy|ir{-Khg>eGI*K zzOZkPOp?e2Zxd*_(%mBq60YCrV|Zr^MP~*_NBk@b@hxmgEUHfnD9FuF&4tFw1zE-D z)_8=qXRbA|sf)`^iZHA4E3W%)W!L&d!fcxK0-p-0hNZ^2XL4sQ@^}&gw8(Bti7T=Sezjgbva;MBRm#-vpzW98HklKx=%ZG zk{g0p>8|P?E@#CV4t`v}$CbxeQe@*Gd zAFJxhq)zvfNcm~(QL&9(Zs~l|F2yrkTuPjHe5C?@q-iep_j%o7|LT?9`?uHjpdluZLS`(EC;KXY8*W(J$$U} zuP3R4RGBrZ*A3Tr*?GEkc;r0LO^#${@Tah)6s1(@#>Ilw5v-M%+QVA5GeAvnX2f+Fi-@Ai1w8?FsyYc~&f zIpO6;1B#uLmLmXwhWod{0g_XR006j23sp_1ro0@)*w&iG(8Sirl*Pr`?u88i@VP)< zhSsJ~LrNEGD;r0M3qSQg49Ls)FASol{D%Uyw4aCOA{K8;%bhUvRx-i=~ z()`QhzkI|@9gQ6DX}u%}`g;e& z$^r)c$NNRf_ZNkT+FIK=m^wPX_zSS|{lonKu>X$pFTRqwE!6g<3Jw;=(l$_2hZix_ z@bByd*#52lzZw7AOVPo?^d;+m)c+Oxe`5dU^MU>*{yz%wuPXn8zLZ%2l@IivB@;m9 zf!2O`S;e2yV#2E2*v2M8@P_IX&q52&;m^cmX2{^5XKbusR(3EES`j$J;ly9<>Haxm z^`xZajo{Oh(G6xmeVbtBLi4>d(bK~%x_WkYX@A>bZ+lyBZ|}**Elm(ezhz}IYCu;z zf3vmsZO^ceo#g3{s&Vr3!*e*X`Qu}?Dq literal 0 HcmV?d00001 diff --git a/packages/flappy-bird-demo/imgs/scrolling-border.png b/packages/flappy-bird-demo/imgs/scrolling-border.png new file mode 100644 index 0000000000000000000000000000000000000000..7d5a9563f0c456ec64419816aa6b05581b49c432 GIT binary patch literal 6939 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 literal 0 HcmV?d00001 diff --git a/packages/flappy-bird-demo/imgs/upper-pillar-head.png b/packages/flappy-bird-demo/imgs/upper-pillar-head.png new file mode 100644 index 0000000000000000000000000000000000000000..2a16121b78fa8f54a56413f5c380a7b3f627ecf2 GIT binary patch literal 7927 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 + + + + + + + +
+
+
+
+ + + diff --git a/packages/flappy-bird-demo/package.json b/packages/flappy-bird-demo/package.json new file mode 100644 index 0000000..4dbe105 --- /dev/null +++ b/packages/flappy-bird-demo/package.json @@ -0,0 +1,23 @@ +{ + "name": "@syndicate-lang/flappy-bird-demo", + "private": true, + "version": "0.0.0", + "homepage": "https://github.com/syndicate-lang/syndicate-js/tree/master/packages/flappy-bird-demo", + "license": "GPL-3.0+", + "repository": "github:syndicate-lang/syndicate-js", + "author": "Tony Garnock-Jones ", + "devDependencies": { + "@babel/core": "^7.1.2", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/preset-env": "^7.1.0", + "@syndicate-lang/syntax": "^0.0.14" + }, + "dependencies": { + "@syndicate-lang/core": "^0.0.11", + "@syndicate-lang/driver-browser-ui": "^0.0.8", + "@syndicate-lang/driver-timer": "^0.0.11", + "webpack": "^4.23.1", + "webpack-cli": "^3.1.2" + } +} diff --git a/packages/flappy-bird-demo/screenshot.png b/packages/flappy-bird-demo/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef5e9403f6215e1c030d519c22cec9db07fa0f7 GIT binary patch literal 24283 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 +// +// 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 . +//--------------------------------------------------------------------------- + +let UI = activate require("@syndicate-lang/driver-browser-ui"); +// @jsx UI.html +// @jsxFrag UI.htmlFragment + +let { PeriodicTick } = activate require("@syndicate-lang/driver-timer"); + +assertion type Position(x, y); +assertion type GameOver(); +assertion type Score(count); +message type IncreaseScore(); + +message type Reset(); + +const BOARD_HEIGHT = 567; +const FLAPPY_WIDTH = 57; +const FLAPPY_HEIGHT = 41; +const FLAPPY_XPOS = 212; +const PILLAR_WIDTH = 86; +const PILLAR_GAP = 158; +const FIELD_HEIGHT = 561; +const PILLAR_HEAD_HEIGHT = 40; + +function newGame() { + spawn named 'score' { + let ui = new UI.Anchor(); + field this.score = 0; + + stop on message Reset(); + + assert Score(this.score); + + on start react { + assert ui.html('#board-area',

{this.score}

); + stop on asserted GameOver() react { + assert ui.html('#board-area',

{this.score}
GAME OVER

); + } + } + + on message IncreaseScore() { + this.score++; + } + } + + spawn named 'flappy' { + let ui = new UI.Anchor(); + field this.xpos = 0; + field this.ypos = 312; + field this.yvel = 0; + + stop on message Reset(); + + assert Position(this.xpos, this.ypos); + + assert ui.html('#board-area',
); + + on (this.ypos > BOARD_HEIGHT - FLAPPY_HEIGHT) { + this.ypos = BOARD_HEIGHT - FLAPPY_HEIGHT; + react { + assert GameOver(); + } + } + + on start react { + stop on asserted GameOver(); + + on message UI.WindowEvent('+keypress', $e) { + this.yvel = -10; + } + + const ms_per_tick = 1000.0 / 60; + on message PeriodicTick(ms_per_tick) { + this.xpos += 0.15 * ms_per_tick; + this.ypos = (this.ypos + this.yvel); + this.yvel += ms_per_tick * 0.05; + } + } + } + + spawn named 'border-scroll' { + let ui = new UI.Anchor(); + field this.pos = 0; + on asserted Position($xpos, _) this.pos = xpos % 23; + assert ui.html( + '#board-area', +
, 0); + + stop on message Reset(); + } + + spawn named 'pipe-factory' { + on start spawnPipe(0); + field this.nextPipe = 1; + + stop on message Reset(); + + on asserted Score(this.nextPipe) { + spawnPipe(this.nextPipe++); + } + } + + function spawnPipe(i) { + spawn named ['pipe', i] { + stop on message Reset(); + + let ui = new UI.Anchor(); + + const xlocation = (i + 1) * 324; + + const upperHeight = + Math.random() * (FIELD_HEIGHT - PILLAR_GAP - PILLAR_HEAD_HEIGHT * 6) + + PILLAR_HEAD_HEIGHT * 3; + const lowerHeight = FIELD_HEIGHT - upperHeight - PILLAR_GAP; + + stop on (this.xpos < -(PILLAR_WIDTH + FLAPPY_XPOS)); + + on start react stop on (this.xpos <= 0) { + ^ IncreaseScore(); + } + + field this.xpos = xlocation; + on asserted Position($xpos, _) this.xpos = xlocation - xpos; + + on asserted Position($xpos, $ypos) { + if (touchingPillar(xpos, ypos)) { + react { + assert GameOver(); + } + } + } + + assert ui.html( + '#board-area', +
+
+
+
); + + function touchingPillar(xpos, ypos) { + const inHorizontalRange = + (xpos + FLAPPY_WIDTH >= xlocation) && (xpos <= xlocation + PILLAR_WIDTH); + const aboveGapTop = (ypos <= upperHeight); + const belowGapBottom = (ypos + FLAPPY_HEIGHT >= upperHeight + PILLAR_GAP); + return inHorizontalRange && (aboveGapTop || belowGapBottom); + } + } + } +} + +spawn named 'game-factory' { + on start newGame(); + + // TODO: Use nested dataspaces to clean up restarts + + during GameOver() { + on stop newGame(); + on message UI.WindowEvent('+keypress', $e) { + if (e.key !== ' ') { + ^ Reset(); + } + } + } +} diff --git a/packages/flappy-bird-demo/webpack.config.js b/packages/flappy-bird-demo/webpack.config.js new file mode 100644 index 0000000..4371d27 --- /dev/null +++ b/packages/flappy-bird-demo/webpack.config.js @@ -0,0 +1,7 @@ +module.exports = { + entry: "./lib/index.js", + mode: "development", + externals: { + crypto: 'null' + }, +};