tecnoballz-0.93.1/AUTHORS0000664000175000017500000000220312412501752014043 0ustar brunobruno* Bruno Ethvignot Main programmer of the game, Linux Port, and maintener of the project * Alexis Sukrieh autoconf/automake, Debian packages and tests * Jean-Michel Martin de Santero Design of all sprites and backgrounds in low-res * Jerome Bolot One of main programmer of the first Tecnoball on Amiga, which inspired TecnoballZ Amiga and this release. * David Igreja Design of all sprites and backgrounds in hi-res * Rodolphe Bono Additionnal graphics * Regis Parret Authors of all musics of the game. All musics were created on its Amiga 500, in 1989 * Laurent Guyon Sounds effect, also created on its Amiga 500, in 1989 * Celelibi Bugs fixes * Company which has the origin developed the game TLK Games registered office : TLK Games - rue des Papillons Blancs - BP 24 - 81150 Florentin France our office in Paris : TLK Games - 22, passage des Réservoirs, 94800 Villejuif tecnoballz-0.93.1/bootstrap0000775000175000017500000000033412412501752014741 0ustar brunobruno#!/bin/sh set -ex rm -f aclocal.m4 configure config.log mkdir -p autotools (cd autotools && rm -f config.guess config.sub depcomp install-sh missing mkinstalldirs) aclocal automake -a -c --foreign autoconf autoheader tecnoballz-0.93.1/CHANGES0000664000175000017500000000334012412501752013771 0ustar brunobruno2014-09-30 TecnoballZ 0.93.1 add patch from Musuruan - make will fail because there is no rule to make supervisor.c - make install will fail because it cannot find tecnoballz.hi since it's in the parent directory 2014-09-28 TecnoballZ 0.93 Fix warnings with GCC 4.3 and 4.7.2 Fix Makefile Fix bugs (Debian #510492) sprites (balls and and gems) are drawn on the right panel Fix a segfault caused by a calculation of coordinates of sprites unsigned. Fix paddle movment restriction when, or after, control reverse penality (bug fixed by Celelibi Debian bug #510603) Updates the code that loads the configuration file. Migrating Berlios CVS source repository to Google Code Project hosting Subversion Added support for XDG_CONFIG_HOME Fix bug Collision check not accruate enough for fast balls. (bug fixed by Celelibi Debian bug #510770) Use tinyxml system library (Ansgar Burchardt from Debian) 2007-11-19 TecnoballZ 0.92 Autoconf and automake was improved The code was compiled with GCC 4.1.2 The code was considerably cleaned up and rewritten The source code files and C++ classes were renamed The names and variables names and comments are now in English The simple copies use now SDL_BlitSurface French language support was added Resources files were renamed The graphic files were converted from BMP to PNG New graphics was realized for the mode 640x480 The license was changed to the GPLv3 Joystick and keyboard support was added GP2X and PSP support Various bugs were fixed 2005-02-04 TecnoballZ 0.91 Berlios project was created Autoconf and automake was included Handle alignment constraint (SPARC processor) Important change to score file Add "LEVEL COMPLETED" into guards levels Add config file 2004-10-27 TecnoballZ 0.90 Initial release tecnoballz-0.93.1/config.h.in0000664000175000017500000000562212412501752015026 0ustar brunobruno/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the `atexit' function. */ #undef HAVE_ATEXIT /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if the system has the type `ptrdiff_t'. */ #undef HAVE_PTRDIFF_T /* Define to 1 if stdbool.h conforms to C99. */ #undef HAVE_STDBOOL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if the system has the type `_Bool'. */ #undef HAVE__BOOL /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to enable development version */ #undef UNDER_DEVELOPMENT /* Version number of package */ #undef VERSION /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to `unsigned int' if does not define. */ #undef size_t /* Define to `int' if does not define. */ #undef ssize_t tecnoballz-0.93.1/configure.ac0000664000175000017500000000415212412501752015266 0ustar brunobrunoAC_PREREQ([2.68]) AC_INIT([TecnoballZ], [0.93.1], [info@tlkgames.com]) dnl AC_CONFIG_SRCDIR([src/list_sprites.cc]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE([foreign]) AC_ARG_ENABLE(devel, [ --enable-devel Development version (default disabled)], enable_devel=yes, enable_devel=no) # Checks for programs. AC_PROG_CXX AC_CHECK_LIB(m, sincos) # Checks for libraries. AM_PATH_SDL LDFLAGS="${LDFLAGS} ${SDL_LIBS}" AC_CHECK_LIB(SDL_mixer, Mix_GetChunk, [ SDL_LIBS="-lSDL_mixer ${SDL_LIBS}" ],[ AC_MSG_ERROR(Could not find -lSDL_mixer) ]) AC_CHECK_LIB(SDL_image, main, [ SDL_LIBS="-lSDL_image ${SDL_LIBS}" ],[ AC_MSG_ERROR(Could not find -lSDL_image) ]) AC_CHECK_LIB(SDL_mixer, Mix_GetChunk, [ SDL_LIBS="-lSDL_mixer ${SDL_LIBS}" ],[ AC_MSG_ERROR(Could not find -lSDL_mixer) ]) AC_CHECK_LIB(mikmod, Player_Stop, [ MIKMOD_LIBS="-lmikmod" MIKMOD_FLAGS="-pthread -D_REENTRANT" ],[ AC_MSG_ERROR(Could not find the Mikmod library : -lmikmod) ]) AC_SUBST(MIKMOD_FLAGS) AC_SUBST(MIKMOD_LIBS) AC_CHECK_LIB([tinyxml], [main], [ TINYXML_LIBS="-ltinyxml" ],[ AC_MSG_ERROR([tinyxml library is not present in your system]) ]) AC_SUBST(TINYXML_LIBS) # Checks for header files. AC_CHECK_HEADERS([fcntl.h stddef.h stdlib.h string.h sys/time.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_CHECK_TYPES([ptrdiff_t]) # Checks for library functions. AC_FUNC_MALLOC AC_CHECK_FUNCS([atexit memmove strchr strdup strerror]) if test "x${enable_devel}" = "xyes"; then AC_DEFINE(UNDER_DEVELOPMENT, 1, Define to enable development version) CXXFLAGS="-Werror -O2 -Wall -pedantic -Wextra -std=gnu++98 -g" else CXXFLAGS="-O2 -Werror -Wall -pedantic -Wextra -std=gnu++98" fi AC_OUTPUT( Makefile src/Makefile src/TecnoballZ/Makefile src/TecnoballZ/hires/Makefile src/TecnoballZ/lores/Makefile src/TecnoballZ/textures/Makefile src/TecnoballZ/musics/Makefile src/TecnoballZ/sounds/Makefile src/TecnoballZ/texts/Makefile) echo " TecnoballZ ready for building! enable_devel : $enable_devel Type 'make' to build. " tecnoballz-0.93.1/COPYING0000664000175000017500000010451312412501752014035 0ustar brunobruno 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 . tecnoballz-0.93.1/include/0000775000175000017500000000000012412501751014420 5ustar brunobrunotecnoballz-0.93.1/include/controller_font_game.h0000664000175000017500000000406112412501751020774 0ustar brunobruno/** * @file controller_font_game.h * @brief Handle mobile characters used for "LEVEL n COMPLETED" * @date 2007-10-31 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_font_game.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_FONT_GAME__ #define __CONTROLLER_FONT_GAME__ class controller_font_game; #include "../include/objects_list.h" #include "../include/sprite_font_game.h" class controller_font_game:public objects_list < sprite_font_game, controller_font_game > { private: /** Number of chars in the first string ("LEVEL n") */ Uint32 size_of_line_1; /** Number of chars in the second string ("COMPLETED") */ Uint32 size_of_line_2; /** Number total of chars both in the first and second string */ Uint32 total_size; /** Screen width in pixels 256/512 pixels */ Uint32 horizontal_length; /** Horizontal offet 0 or 32/64 pixels */ Uint32 horizontal_offset; static char ze_bobText[]; static char ze_endText[]; public: controller_font_game (); ~controller_font_game (); void initialize (Uint32 level, Uint32 offset = 0); void move (); void enable (); private: Uint32 set_start_values (Uint32 n, Uint32 a, Uint32 j, Sint32 y, Uint32 i3, Sint32 y3); }; #endif tecnoballz-0.93.1/include/controller_sides_bricks.h0000664000175000017500000001303712412501751021504 0ustar brunobruno/** * @file controller_sides_bricks.h * @brief Sides bricks controller. The small bricks on the side, the walls top * left and right * @date 2012-09-06 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_sides_bricks.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_SIDES_BRICKS__ #define __CONTROLLER_SIDES_BRICKS__ class controller_sides_bricks; #include "../include/objects_list.h" #include "../include/sprite_object.h" #include "../include/tecnoballz.h" class controller_sides_bricks:public objects_list < sprite_object, controller_sides_bricks > { public: /** Maximum number of bricks per wall */ static const Uint32 MAX_OF_SIDES_BRICKS = 12; typedef enum { TOP_WALL = 1, RIGHT_WALL, LEFT_WALL } WALLS_ENUM; private: /** * Structure for redraw side bricks */ static const Uint32 MAX_OF_RESTORED_BRICKS = 64; /** X-coordinate of the left wall */ static const Uint32 XCOORD_LEFT_WALL = 12; /** Y-coordinate of the left wall */ static const Uint32 YCOORD_LEFT_WALL = 24; /** X-coordinate of the right wall */ static const Uint32 XCOORD_RIGHT_WALL = 240; /** Y-coordinate of the right wall */ static const Uint32 YCOORD_RIGHT_WALL = 24; /** X-coordinate of the top wall */ static const Uint32 XCOORD_TOP_WALL = 32; /** Y-coordinate of the top wall */ static const Uint32 YCOORD_TOP_WALL = 4; /** X-coordinate of the left wall */ Uint32 xcoord_left_wall; /** Y-coordinate of the left wall */ Uint32 ycoord_left_wall; /** X-coordinate of the right wall */ Uint32 xcoord_right_wall; /** Y-coordinate of the right wall */ Uint32 ycoord_right_wall; /** X-coordinate of the top wall */ Uint32 xcoord_top_wall; /** Y-coordinate of the top wall */ Uint32 ycoord_top_wall; /** Small horizontal side brick */ sprite_object *horizontal_brick; /** Small vertical side brick */ sprite_object *vertical_brick; /** Bitmap surface to save background under top bricks */ surface_sdl *background_top_side; /** Bitmap surface to save background under right bricks */ surface_sdl *background_right_side; /** Bitmap surface to save background under left bricks */ surface_sdl *background_left_side; /** True if the wall of the top is breakable */ bool is_top_wall_breakable; /** True if the wall of the right is breakable */ bool is_right_wall_breakable; /** True if the wall of the left is breakable */ bool is_left_wall_breakable; /** Collision x-coordinate of the left wall */ Sint32 left_collision_xcoord; /** Collision x-coordinate of the right wall */ Sint32 right_collision_xcoord; /** Collision y-coordinate of the top wall */ Sint32 top_collision_ycoord; /* wall of sprites (bob_ground = 1) */ sprite_object *sprites_top[MAX_OF_SIDES_BRICKS]; sprite_object *sprites_right[MAX_OF_SIDES_BRICKS]; sprite_object *sprites_left[MAX_OF_SIDES_BRICKS]; /** State of the top wall, used for collision */ bool map_top_wall[MAX_OF_SIDES_BRICKS]; /** State of the right wall, used for collision */ bool map_right_wall[MAX_OF_SIDES_BRICKS]; /** State of the left wall, used for collision */ bool map_left_wall[MAX_OF_SIDES_BRICKS]; /** Width of a horizontal side brick in pixels */ Uint32 horizontal_brick_width; /** Height of a horizontal side brick in pixels */ Uint32 horizontal_brick_height; /** Height of a vertical side brick in pixels */ Uint32 vertical_brick_width; /** Height of a vertical side brick in pixels */ Uint32 vertical_brick_height; /** Structure used for restore */ typedef struct { /** Wall identifier TOP_WALL, RIGHT_WALL or LEFT_WALL */ Uint32 wall_id; /** Index of the side brick from 0 to 11 */ Uint32 side_brick_index; } restore_struct; /** Structures used for restore background under sides bricks */ restore_struct *restore_background; /** Index to save the next brick */ Uint32 restore_save_index; /** Index to save the current brick */ Uint32 restore_index; public: controller_sides_bricks (); ~controller_sides_bricks (); void initialize (); void save_state_of_walls (); void save_background (); void run (); void draw_shadows_to_brackground (); void draw_to_brackground (); Sint32 get_top_ycoord (); Sint32 get_right_xcoord (); Sint32 get_left_xcoord (); bool collision_with_left_wall (Sint32 ycoord); bool collision_with_right_wall (Sint32 ycoord); bool collision_with_top_wall (Sint32 xcoord); private: void create_bricks_sprites (); void restore (); void disable_sprites (); }; #endif tecnoballz-0.93.1/include/supervisor_bricks_level.h0000664000175000017500000001061412412501751021540 0ustar brunobruno/** * @file supervisor_bricks_level.h * @brief Bricks levels supervisor * @date 2007-10-17 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_bricks_level.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SUPERVISOR_BRICKS_LEVEL__ #define __SUPERVISOR_BRICKS_LEVEL__ class supervisor_bricks_level; #include "../include/handler_display.h" #include "../include/handler_audio.h" #include "../include/sprite_object.h" #include "../include/sprite_wall.h" #include "../include/bitmap_data.h" #include "../include/list_sprites.h" #include "../include/objects_list.h" #include "../include/supervisor.h" #include "../include/controller_ships.h" #include "../include/sprite_ship.h" #include "../include/handler_keyboard.h" #include "../include/tiles_background.h" #include "../include/controller_paddles.h" #include "../include/controller_sides_bricks.h" #include "../include/right_panel_score.h" #include "../include/handler_display.h" #include "../include/controller_ejectors.h" #include "../include/controller_bricks.h" #include "../include/controller_balls.h" #include "../include/controller_moneys.h" #include "../include/controller_capsules.h" #include "../include/controller_gigablitz.h" #include "../include/handler_players.h" #include "../include/controller_font_game.h" #include "../include/head_animation.h" #include "../include/controller_indicators.h" #include "../include/controller_game_over.h" #include "../include/short_info_messages.h" #include "../include/handler_levels.h" #include "../include/controller_gems.h" #include "../include/controller_viewfinders.h" #include "../include/handler_popup_menu.h" #include "../include/controller_magnetic_eyes.h" class supervisor_bricks_level:public virtual supervisor { friend class tiles_background; friend class controller_moneys; friend class controller_balls; friend class controller_paddles; friend class controller_capsules; friend class controller_font_game; friend class controller_ships; friend class sprite_paddle; private: short_info_messages *info_messages; controller_indicators *player_indicators; controller_sides_bricks *sides_bricks; /** Head animation in the right score panel */ head_animation *head_anim; controller_bricks *bricks; tiles_background *tiles_ground; controller_ejectors *ejectors_corners; controller_balls *balls; controller_viewfinders *viewfinders_paddles; controller_paddles *paddles; right_panel_score *panel_score; controller_ships *ships; controller_magnetic_eyes *magnetic_eyes; controller_moneys *money_capsules; controller_capsules *power_up_capsules; controller_gems *gem_stones; controller_font_game *font_game; controller_gigablitz *gigablitz; controller_game_over *game_over; sprite_wall *bottom_wall; sprite_object *money_indicator; handler_popup_menu *popup_menu; /** Area number from 1 to 2 */ Sint32 area_number; /** Level number from 1 to 12 */ Sint32 level_number; const bricks_level_desc *level_desc; //Sint32 next_level; /** Time delay before next level */ Sint32 count_next; /** Counter used to handle the different phases of the game over */ Sint32 gameover_counter; #ifdef UNDER_DEVELOPMENT /** Key flag to switch to the next backgound */ bool devel_keyx; /** Key flag to switch to the previous backgound */ bool devel_keyw; Sint32 backgound_index; #endif public: supervisor_bricks_level (); ~supervisor_bricks_level (); void first_init (); Uint32 main_loop (); private: void init_level (); void switch_background (); void draw_tilesmap(); void initialize_background (Sint32 bkg_num = -1); }; #endif tecnoballz-0.93.1/include/sprite_wall.h0000664000175000017500000000270212412501751017117 0ustar brunobruno/** * @file sprite_wall.h * @brief The sprite of the wall used in bricks level * @created 2007-1O-04 * @date 2007-1O-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_wall.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_WALL__ #define __SPRITE_WALL__ class sprite_wall; #include "../include/sprite_object.h" class sprite_wall:public sprite_object { static sprite_wall* sprite_wall_singleton; public: Sint32 thecounter; private: sprite_wall (); public: ~sprite_wall (); void enable (Uint32 counter); void disable (); static sprite_wall * get_instance (); }; #endif tecnoballz-0.93.1/include/controller_projectiles.h0000664000175000017500000000437612412501751021371 0ustar brunobruno/** * @file controller_projectiles.h * @brief Projectiles controller * @date 2007-10-26 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_projectiles.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_PROJECTILES__ #define __CONTROLLER_PROJECTILES__ class controller_projectiles; #include "../include/objects_list.h" #include "../include/handler_display.h" #include "../include/right_panel_score.h" #include "../include/sprite_projectile.h" #include "../include/sprite_paddle.h" class controller_projectiles:public objects_list < sprite_projectile, controller_projectiles > { private: static const Uint32 MAX_OF_PROJECTILES = 7; static const Uint32 SIZE_OF_PROJECTILE = 10; static const Sint16 circular_sin_640[]; static const Sint16 circular_sin_320[]; private: sprite_paddle * gun_paddle; Sint32 countTempo; Uint32 paddle_length; const Sint16 *circular_sin; public: controller_projectiles (); ~controller_projectiles (); void create_projectiles_list (sprite_paddle * paddle); void disponible (); void fire (); void init_type1 (); void init_type2 (); void init_type3 (); void init_type4 (); void init_type5 (); void init_type6 (); void init_type7 (); void move (); void move_type1 (); void move_type2 (); void move_type3 (); void move_type4 (); void move_type5 (); void move_type6 (); void move_type7 (); void set_fire_1 (); void set_fire_2 (); }; #endif tecnoballz-0.93.1/include/sprite_mouse_pointer.h0000664000175000017500000000254612412501751021056 0ustar brunobruno/** * @file sprite_mouse_pointer.h * @brief The sprite of the mouse pointer * @date 2007-02-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_mouse_pointer.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_MOUSE_POINTER__ #define __SPRITE_MOUSE_POINTER__ class sprite_mouse_pointer; #include "../include/sprite_object.h" class sprite_mouse_pointer:public sprite_object { public: sprite_mouse_pointer (); ~sprite_mouse_pointer (); void create_pointer_sprite (bitmap_data * bmp); void move (); }; #endif tecnoballz-0.93.1/include/tilesmap_scrolling.h0000664000175000017500000000560312412501751020467 0ustar brunobruno/** * @file tilesmap_scrolling.h * @brief Vertical scrolling tiles map in the main menu * and the guardians levels * @date 2007-04-04 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: tilesmap_scrolling.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __TILESMAP_SCROLLING__ #define __TILESMAP_SCROLLING__ class tilesmap_scrolling; #include "../include/handler_display.h" #include "../include/bitmap_data.h" #include "../include/tecnoballz.h" #include "../include/supervisor_map_editor.h" class tilesmap_scrolling:public virtual tecnoballz { friend class supervisor_map_editor; public: typedef enum { MAP_GUARDIANS, MAP_MENU, MAP_CONGRATULATIONS } MAPS_ENUM; /** Number of tiles per row in the map */ static const Uint32 MAP_WIDTH = 20; /** Number of tiles per column in the map */ static const Uint32 MAP_HEIGHT = 273; typedef enum { TILES_COLOR_GUARDIANS, TILES_COLOR_MENU, TILES_COLOR_CONGRATULATIONS } TILES_COLOR; private: bool is_40_columns; Uint32 tileset_width; Uint32 tile_width; Uint32 tile_height; /** Number of tiles per row in the map */ Uint32 map_width; /** Number of tiles per row at screen */ Uint32 tiles_per_row; /** The map of tiles */ Uint16 *map_tiles; /** Fist line visible of the map of tiles */ Uint16 *map_top_screen; Sint32 y_coord; /** Tileset bimap */ bitmap_data *tiles_bitmap; /** Number of differents tiles in the bitmap */ Uint32 number_of_different_tiles; static const unsigned char colors_map[48]; public: tilesmap_scrolling (); ~tilesmap_scrolling (); bitmap_data *get_bitmap (); void initialize (Uint32 color_id = TILES_COLOR_GUARDIANS, Uint32 map_id = 0); Uint32 get_tiles_width (); Sint32 get_y_coord (); Uint32 get_map_width(); void enable_palette (Uint32 color_id = 0); void switch_map (Uint32 color_id, Uint32 map_id); void scroll (Sint32 index = 0); bitmap_data* alloc_brush(Uint16 *map, Uint32 num_of_cols, Uint32 num_of_lines); private: void draw (); void load_map (Uint32 edmap = 0); }; #endif tecnoballz-0.93.1/include/surface_sdl.h0000664000175000017500000000613012412501751017063 0ustar brunobruno/** * @file surface_sdl.h * @brief an surface drawing surface * @created 2007-02-15 * @date 2012-09-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: surface_sdl.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SURFACE_SDL__ #define __SURFACE_SDL__ class surface_sdl; #include "../include/tecnoballz.h" class surface_sdl:public virtual tecnoballz { protected: SDL_Surface* surface; /** The number of bytes used to represent each pixel in a surface */ Uint32 bytes_per_pixel; char* pixel_data; public: surface_sdl (); surface_sdl (Uint32 w, Uint32 h, Uint32 depth); ~surface_sdl (); SDL_Surface* get_surface (); char* get_pixel_data (); char* get_pixel_data (Sint32 xcoord, Sint32 ycoord); Uint32 get_row_size (); Uint32 get_offset (Sint32 xcoord, Sint32 ycoord); void clear (Uint32 color = 0); void clear (Uint32 color, Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 height); Uint32 get_width (); Uint32 get_height (); Uint32 get_line_modulo (Uint32 w); void lock_surface (); void unlock_surface (); void blit_to_surface (surface_sdl *dest); void blit_to_surface (surface_sdl *dest, Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 h); void blit_to_surface (surface_sdl *dest, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h); void set_palette (SDL_Color *colors); void set_palette (surface_sdl *dest); void blit_surface (surface_sdl *dest, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h); void fill_shadow_rect (Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 h); public: void create_surface (Uint32 w, Uint32 h, Sint32 depth, Uint32 flags = SDL_ANYFORMAT, Uint32 red_mask = 0xf00, Uint32 green_mask = 0x0f0, Uint32 blue_mask = 0x00f, Uint32 alpha_mask = 0x00); surface_sdl *cut_to_surface (Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h); void cut_to_surface (surface_sdl *dest, Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h); }; #endif tecnoballz-0.93.1/include/right_panel_score.h0000664000175000017500000000661712412501751020272 0ustar brunobruno/** * @file right_panel_score.h * @brief The right panel score in the bricks levels * @date 2012-10-07 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: right_panel_score.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __RIGHT_SCORE_PANEL__ #define __RIGHT_SCORE_PANEL__ class right_panel_score; #include "../include/bitmap_data.h" #include "../include/display_text_bitmap.h" #include "../include/handler_players.h" #include "../include/handler_keyboard.h" #include "../include/controller_gigablitz.h" #include "../include/controller_balls.h" class right_panel_score:public display_text_bitmap { private: static right_panel_score* panel_score_singleton; static const Uint32 DELAY_GIGABLITZ_COUNTDOWN = 10; static const Uint32 GAUGE_HEIGHT = 27; static const Uint32 GAUGE_XCOORD = 526 / 2; static const Uint32 GAUGE_YCOORD = 420 / 2; /* static const Uint32 GAUGE_WIDTH = 10 / 2; */ static const Uint32 AREA_NUM_XCOORD = 264; static const Uint32 AREA_NUM_YCOORD = 153; static const Uint32 LEVEL_NUM_XCOORD = 296; static const Uint32 LEVEL_NUM_YCOORD = 153; static const Uint32 PLAYERNAME_XCOORD = 264; static const Uint32 PLAYERNAME_YCOORD = 39; static const Uint32 BEST_PLAYER_XCOORD = 528 / 2; static const Uint32 BEST_PLAYER_YCOORD = 344 / 2; static const Uint32 BEST_SCORE_XCOORD = 264; static const Uint32 BEST_SCORE_YCOORD = 191; static const Uint32 SCORE_XCOORD = 528 / 2; static const Uint32 SCORE_YCOORD = 116 / 2; static const Uint32 LIFES_XCOORD = 528 / 2; static const Uint32 LIFES_YCOORD = 152 / 2; static const Uint32 BRICKS_XCOORD = 592 / 2; static const Uint32 BRICKS_YCOORD = 152 / 2; /** The number of bricks which remain */ Uint32 bricks_counter; Sint32 flip_white; /** Pointer to the pixel data in the game offscreen * of the gigablitz gauge */ char *gauge_pixel; /** Countdown berfore Gigablitz launch */ Uint32 gigablitz_countdown; Uint32 delay_gigablitz_countdown; /** Height of the gigablitz gauge in pixels */ Uint32 gauge_height; /** Width panel scores in pixels */ Uint32 panel_width; static unsigned char temoinCol1[GAUGE_HEIGHT]; static unsigned char temoinCol2[GAUGE_HEIGHT * 2]; private: right_panel_score (); public: ~right_panel_score (); static right_panel_score *get_instance (); void first_init (); void text_refresh (); void decrease_bricks_counter (Uint32 dec); Uint32 get_bricks_counter (); void set_bricks_counter (Uint32 counter); void draw_gigablizt_gauge (); void reset_gigablitz_countdown (); Uint32 get_width (); private: void draw_background (); }; #endif tecnoballz-0.93.1/include/display_text_bitmap.h0000664000175000017500000000511712412501751020642 0ustar brunobruno/** * @file display_text_bitmap.h * @brief Display bitmap strings * @date 2007-11-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: display_text_bitmap.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __DISPLAY_TEXT_BITMAP__ #define __DISPLAY_TEXT_BITMAP__ class display_text_bitmap; #include "../include/handler_display.h" #include "../include/bitmap_data.h" #include "../include/tecnoballz.h" #include "../include/sprite_object.h" class display_text_bitmap:public virtual tecnoballz { protected: static const Uint32 CHAR_WIDTH = 8; static char ascii2code[128]; Sint32 off_desti1; // modulo destination affichage ecran Sint32 off_source; // modulo source page graphique bitmap_data *bitmap_fonts; SDL_Surface *surface_fonts; SDL_Rect rect_fonts; SDL_Rect rect_destination; char int_string_tmp[16]; char *caract_adr; /** Height of the chars in pixels */ Uint32 char_height; /** Width of the chars in pixels */ Uint32 char_width; public: display_text_bitmap (); ~display_text_bitmap (); void initial_me (); void destroy_me (); void initialize (); Uint32 get_char_height (); void load_bitmap_fonts (Uint32 resource_id); void draw (offscreen_surface *dest, Uint32 xcoord, Uint32 ycoord, Sint32 value, Uint32 padding); void draw (surface_sdl *dest, Uint32 xcoord, Uint32 ycoord, Sint32 value, Uint32 padding); void draw (offscreen_surface *dest, Uint32 xcoord, Uint32 ycoord, const char* str, Uint32 length = 0); void draw (surface_sdl *dest, Uint32 xcoord, Uint32 ycoord, const char* str, Uint32 length = 0); void print_to_string (char *src, char *dst, Uint32 length = 0); void print_int_to_string (Sint32 value, Sint32 padding, char *dst); sprite_object *string2bob (const char *ptStr); }; #endif tecnoballz-0.93.1/include/sprite_eye.h0000664000175000017500000000316412412501751016745 0ustar brunobruno/** * @file sprite_eye.h * @brief The sprite of the eye used in bricks level * @created 2004-09-17 * @date 2007-09-12 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_eye.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_EYE__ #define __SPRITE_EYE__ class sprite_eye; #include "../include/sprite_object.h" #include "../include/sprite_ball.h" #include "../include/controller_bricks.h" #include "../include/controller_balls.h" #include "../include/controller_magnetic_eyes.h" class sprite_eye:public sprite_object { friend class controller_balls; friend class controller_magnetic_eyes; private: Sint32 finishPosx; Sint32 finishPosy; Sint32 centerPosx; Sint32 centerPosy; Sint32 radius_360; public: sprite_eye (); ~sprite_eye (); }; #endif tecnoballz-0.93.1/include/handler_players.h0000664000175000017500000001305312412501751017747 0ustar brunobruno/** * @file handler_players.h * @brief players handler * @date 2012-09-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_players.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER_PLAYERS__ #define __HANDLER_PLAYERS__ class handler_players; #include "../include/tecnoballz.h" #include "../include/controller_capsules.h" #include "../include/supervisor_shop.h" class handler_players:public virtual tecnoballz { friend class right_panel_score; friend class supervisor_guards_level; friend class supervisor_bricks_level; friend class controller_indicators; friend class handler_high_score; public: static const Uint32 PLAYER_NAME_LENGTH = 6; static const Uint32 MAX_OF_PLAYERS = 6; public: /** List of all players object */ static handler_players **players_list; private: /** Maximum number of players */ static Uint32 max_of_players; /** Pointer to the first player alive */ static handler_players *first_player; /** Pointer to the next player object */ handler_players *next_player; /** Pointer to the previsous player object */ handler_players *previous_player; /** Name of the player */ char player_name[PLAYER_NAME_LENGTH + 1]; /** Player number from 1 to 6 */ Uint32 player_num; /** Player score value */ Uint32 score_value; /** Bonus life granted every 25,000 points */ Uint32 bonus_life_counter; /** Area number from 1 to 5 */ Uint32 area_number; /** Level number in the current area, from 1 to 13 */ Uint32 level_number; /** Number of lifes remaining */ Sint32 number_of_lifes; /** List ot the items bought in the shop */ //Sint32 shopping_cart[supervisor_shop::MAX_OF_CAPSULES_BOUGHT + 1]; Sint32 shopping_cart[20]; /** The number of items in the shopping cart */ Uint32 shopping_cart_items; /** Amount of money available to be spend in the shop */ Uint32 amount_of_money; /** State of the left wall of bricks */ bool map_left_wall[12]; /** State of the right wall of bricks */ bool map_right_wall[12]; /** State of the top wall of bricks */ bool map_top_wall[12]; /** Alive counter of the right paddle, 0 = paddle disabled */ Uint32 right_paddle_alive_counter; /** Alive counter of the top paddle, 0 = paddle disabled */ Uint32 top_paddle_alive_counter; /** Alive counter of the left paddle, 0 = paddle disabled */ Uint32 left_paddle_alive_counter; /** If true, then the wall must be rebuilt on the next level * ihis option is only available in area 5 */ bool must_rebuild_walls; /** Less bricks counter */ Uint32 less_bricks_count; /** Width of the horizontal paddles * and height of the vertical paddles */ Uint32 paddle_length; /** If true all options prices will be to 1 in the next shop */ bool budget_prices; /* states of the gems, collected or not */ bool gems_state_list[6]; Sint32 guardianPt; //pt / level_list of the guards private: handler_players (); ~handler_players (); public: void initialize (Uint32 lifes, Uint32 areaN, Uint32 level, Uint32 monay, Uint32 grdPt); void set_name (const char *playername); char *get_name (); Uint32 get_area_number (); Uint32 get_level_number (); Sint32 get_num_of_lifes (); Uint32 get_paddle_length (); void set_paddle_length (Uint32 length); Uint32 get_money_amount (); bool decrease_money_amount (Uint32 value); void increase_money_amount (Uint32 value); void add_score (Uint32 value); void clear_shopping_cart (); Sint32 *get_shopping_cart (); Uint32 get_numof_items_in_shopping_cart (); void set_numof_items_in_shopping_cart (Uint32 count); void clear_collected_gems (); bool are_collected_all_gems (Uint32 gemNu); bool is_collected_gem (Uint32 gemNu); Uint32 get_paddle_alive_counter (Uint32 paddle_num); void set_paddle_alive_counter (Uint32 paddle_num, Uint32 count); void set_less_bricks (Uint32 count); Uint32 get_less_bricks (); void set_rebuild_walls (bool enable); bool is_rebuild_walls (); void set_budget_prices (bool enbale); bool is_budget_prices (); bool *get_map_left (); bool *get_map_right (); bool *get_map_top (); Sint32 zlastlevel (); Sint32 next_level (Sint32 grdNx = 0); Uint32 get_next_phase (); void add_life (Uint32 add); void remove_life (Uint32 remove); void remove_all_lifes (); Sint32 getGuardPt (); void setGuardPt (Sint32 grdPt); static void release_all_players (); static handler_players *create_all_players (Uint32 numof); static handler_players *get_next_player (handler_players *, Uint32 *, Sint32 grdNx = 0); private: handler_players *get_previous_player (); void set_next_player (handler_players *player); void set_previous_player (handler_players *player); void reset_members (); }; #endif tecnoballz-0.93.1/include/bitmap_data.h0000664000175000017500000000432712412501751017044 0ustar brunobruno/** * @file bitmap_data.h * @briefi Handle the bitmap * @created 1996-06-29 * @date 2007-04-09 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: bitmap_data.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __BITMAP_DATA__ #define __BITMAP_DATA__ class bitmap_data; #include "../include/tecnoballz.h" #include "../include/surface_sdl.h" class bitmap_data:public virtual surface_sdl { private: /** Height in linges */ Uint32 height; /** Width in pixels */ Uint32 width; /** Real row length in bytes */ Uint32 row_size; /** Bytes peer pixel 1 = 256 colors */ Uint32 depth; /** Size of the bitmap in bytes */ Uint32 bytes_size; /** Palette of 256 colors */ unsigned char palette[768]; public: bitmap_data (); ~bitmap_data (); void clear_members (); void release (); Uint32 get_width (); Uint32 get_row_size (); Uint32 get_height (); char *get_pixel_data (Sint32 xcoord, Sint32 ycoord); char *get_pixel_data (); Sint32 get_offset (Sint32 xcoord, Sint32 ycoord); Sint32 get_line_modulo (Sint32 w); void create_surface (Uint32 w, Uint32 h); char *duplicate_pixel_data (); void enable_palette (); unsigned char *get_palette (); void load (char *filename); void load (Sint32 id); bitmap_data *cut_to_bitmap (Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h); private: void sdl_load_bmp (char *filename); }; #endif tecnoballz-0.93.1/include/controller_spheres.h0000664000175000017500000000322412412501751020506 0ustar brunobruno/** * @file controller_spheres.h * @brief Metallic spheres controller used in congratulations * @created 2004-08-05 * @date 2007-04-09 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_spheres.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_SPHERES__ #define __CONTROLLER_SPHERES__ class controller_spheres; #include "../include/sprite_object.h" #include "../include/objects_list.h" #include "../include/sprite_display_scores.h" class controller_spheres:public objects_list < sprite_object, controller_spheres > { private: Uint32 radius_horizontal_variation; Uint32 radius_vertical_variation; Uint32 radius_hinc_variation; Uint32 radius_vinc_variation; Uint32 radius_sphere_speed; public: controller_spheres (); ~controller_spheres (); void initialize (); void run (); }; #endif tecnoballz-0.93.1/include/offscreen_surface.h0000664000175000017500000000424312412501751020256 0ustar brunobruno/** * @file offscreen_surface.h * @brief an offscreen drawing surface * @created 2007-01-31 * @date 2007-04-10 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: offscreen_surface.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __OFFSCREEN_SURFACE__ #define __OFFSCREEN_SURFACE__ #include "../include/tecnoballz.h" #include "../include/surface_sdl.h" #include "../include/display_text_bitmap.h" class offscreen_surface:public virtual surface_sdl { private: Uint32 vertical_offset; public: offscreen_surface (Uint32 width, Uint32 height, Uint32 depth, Uint32 voffset = 0); ~offscreen_surface (); Uint32 get_vertical_offset (); void clear (Uint32 color = 0); void clear (Uint32 color, Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 height); void blit_to_surface (offscreen_surface *offscreen); void blit_to_surface (offscreen_surface *offscreen, Uint32 xcoord, Uint32 ycoord, Uint32 width, Uint32 height); void blit_to_surface (offscreen_surface *offscreen, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h); void blit_surface (surface_sdl *dest, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h); void draw_text (display_text_bitmap* display_text, Uint32 xcoord, Uint32 ycoord, const char* str, Uint32 lentgh); surface_sdl *cut_to_surface (Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h); }; #endif tecnoballz-0.93.1/include/handler_menu_events.h0000664000175000017500000000421512412501751020620 0ustar brunobruno /** * @file handler_menu_events.cc * @brief Handler the events of the menu * @created 2007-1O-29 * @date 2007-11-17 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_menu_events.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER__MENU__EVENTS__ #define __HANDLER__MENU__EVENTS__ #include "../include/tecnoballz.h" class handler_menu_events:public virtual tecnoballz { public: handler_menu_events(); ~handler_menu_events(); void stop(); void begin(Sint32 xspace, Sint32 yspace, Sint32 xmin, Sint32 ymin, Sint32 xmax, Sint32 ymax, Sint32 xleft, Sint32 ytop); void start(Sint32 spacing, Sint32 min, Sint32 max, Sint32 xcenter, Sint32 ytop); bool check(Sint32 *pos_y, Sint32 *inc); bool check(); bool check_keys(Uint32 *kcode, Uint32 *prev_kcode); private: static const Uint32 MAX_OF_KEYS = 7; static Uint32 keys[MAX_OF_KEYS]; bool is_enabled; Sint32 y_coord_left_down; Sint32 y_coord_right_down; Sint32 x_center; Sint32 top_y_coord; Uint32 line_spacing; Uint32 line_min; Uint32 line_max; Uint32 current_line; Sint32 left_x_coord; Uint32 row_spacing; Uint32 row_min; Uint32 row_max; Uint32 current_row; Sint32 key_delay; Uint32 previous_key_code_down; }; #endif tecnoballz-0.93.1/include/head_animation.h0000664000175000017500000000452212412501751017534 0ustar brunobruno/** * @file head_animation.h * @brief Animate the head in the right score panel * @date 2007-02-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: head_animation.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HEAD_ANIMATION__ #define __HEAD_ANIMATION__ class head_animation; #include "../include/handler_display.h" #include "../include/bitmap_data.h" #include "../include/tecnoballz.h" class head_animation:public virtual tecnoballz { private: static head_animation* head_anim_singleton; /** Height of the head in pixels */ Uint32 head_height; /** Width of the head in pixels */ Uint32 head_width; /** Bitmap which contains all head images */ bitmap_data *head_bitmap; /** Time delay before next image of the animation */ Uint32 frame_delay; /** Identifier of the requested animation */ Uint32 requested_animation; /** Index of the current image */ Uint32 frame_index; /** Offset 1 or -1 */ Sint32 frame_step; typedef enum { INTERFERENCE_START = 1, INTERFERENCE_STOP = 3, YAWN_START = 4, YAWN_STOP = 8, LAUGH_START = 9, LAUGH_STOP = 13, MAX_OF_IMAGES } HEAD_FRAMES; /** Speed of animation */ static const Uint32 FRAME_PERIOD_1 = 5; static const Uint32 FRAME_PERIOD_2 = 20; private: head_animation (); public: ~head_animation (); static head_animation * get_instance (); void load_bitmap (); void play (); void start_yawn (); void start_laugh (); void start_interference (); private: void draw (); }; #endif tecnoballz-0.93.1/include/sprite_object.h0000664000175000017500000002764012412501751017436 0ustar brunobruno/** * @file sprite_object.h * @brief Draw sprites on the screen * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_object.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_OBJECT__ #define __SPRITE_OBJECT__ class sprite_object; #include "../include/handler_display.h" #include "../include/bitmap_data.h" #include "../include/tecnoballz.h" #include "../include/display_text_bitmap.h" /* * sprite's ID */ /* typedef enum { BOB_ATOMES, BOB_EJECT1, BOB_EJECT2, BOB_EJECT3, BOB_EJECT4, BOB_BRICKV, BOB_BRICKH, BOB_BRICKS, BOB_BUMPHR, BOB_BUMPVT, BOB_BALLES, BOB_FIREBP, BOB_MONEYS, BOB_GADGET, BOB_LETTRE, BOB_LEDSHP, BOB_GAMEOV, BOB_DEFILE, BOB_LOGOTB, BOB_MOUSE1, BOB_MOUSE2, BOB_GIGAB1, BOB_GIGAB2, BOB_GIGAB3, BOB_GIGAB4, BOB_GIGAB5, BOB_GIGAB6, BOB_GIGAB7, BOB_MONEY0, BOB_ROBOT0, FINAL_GUARDIAN_AREA_1, FINAL_GUARDIAN_AREA_2, FINAL_GUARDIAN_AREA_3, FINAL_GUARDIAN_AREA_4, FINAL_GUARDIAN_AREA_5, FINAL_GUARDIAN_AREA_6, MEDIUM_GUARDIAN_AREA_1A, MEDIUM_GUARDIAN_AREA_1B, MEDIUM_GUARDIAN_AREA_2A, MEDIUM_GUARDIAN_AREA_2B, MEDIUM_GUARDIAN_AREA_3A, MEDIUM_GUARDIAN_AREA_3B, MEDIUM_GUARDIAN_AREA_4A, MEDIUM_GUARDIAN_AREA_4B, MEDIUM_GUARDIAN_AREA_5A, MEDIUM_GUARDIAN_AREA_5B, PADDLE_IN_GUARDIANS_LEVEL, BOB_MISSIL, BOB_EXPLO1, BOB_EXPLO2, BOB_ARGENT, BOB_GRDNRJ, BOB_GEMSTO, BOB_WALLBO, BOB_DIRECT, BOB_ESCMEN, BOB_MAGEYE, BOB_LEDSH2, BOB_BRICK1 } BOB_ENUM; */ /** * Structure used to store x and y coordinates in the png image source */ typedef struct { /** X-coordinate: real x = xcoord * 16 */ Sint16 xcoord; /** Y-coordinate: real y = ycoord * 2 */ Sint16 ycoord; } sprite_coordinates; /** * Structure used to store caracteristics of the sprite in the png image * source width, height, coordinates in the png image source */ typedef struct { /* real width = width * resolution */ Uint16 width; /* real height = height * resolution */ Uint16 height; /* number of animation(s) */ Uint16 number_of_images; sprite_coordinates *coordinates; } sprite_description; typedef struct { Sint32 COUNTERTAB; // size of table offsets / loops Sint32 OFFSETLEFT; Sint16 *TABAFFICH1; // table of offsets and loops counters char *TABAFFICH2; // table of pixels } bb_afligne; class sprite_object:public virtual tecnoballz { friend class controller_game_over; friend class controller_explosions; friend class controller_guardians; friend class controller_gems; friend class controller_bullets; friend class controller_spheres; friend class display_text_bitmap; public: typedef enum { SHIPS, EJECTOR_1, EJECTOR_2, EJECTOR_3, EJECTOR_4, VERTICAL_SIDE_BRICK, HORIZONTAL_SIDE_BRICK, BOB_BRICKS, HORIZONTAL_PADDLE, VERTICAL_PADLLE, BALLS, PROJECTILES, MONEY, CAPSULES, FONT_GAME, SHOP_LED_INDICATOR_320, GAME_OVER_LETTERS, FONT_MENU, TECNOBALLZ_LOGO, MOUSE_POINTER_1, MOUSE_POINTER_2, GIGABLITZ_1, GIGABLITZ_2, GIGABLITZ_3, GIGABLITZ_4, GIGABLITZ_5, GIGABLITZ_6, GIGABLITZ_7, FONT_MONEY, PADDLE_ROBOT, FINAL_GUARDIAN_AREA_1, FINAL_GUARDIAN_AREA_2, FINAL_GUARDIAN_AREA_3, FINAL_GUARDIAN_AREA_4, FINAL_GUARDIAN_AREA_5, FINAL_GUARDIAN_AREA_6, MEDIUM_GUARDIAN_AREA_1A, MEDIUM_GUARDIAN_AREA_1B, MEDIUM_GUARDIAN_AREA_2A, MEDIUM_GUARDIAN_AREA_2B, MEDIUM_GUARDIAN_AREA_3A, MEDIUM_GUARDIAN_AREA_3B, MEDIUM_GUARDIAN_AREA_4A, MEDIUM_GUARDIAN_AREA_4B, MEDIUM_GUARDIAN_AREA_5A, MEDIUM_GUARDIAN_AREA_5B, PADDLE_IN_GUARDIANS_LEVEL, BULLET, EXPLOSION_1, EXPLOSION_2, METALLIC_SPHERE, LIFE_GAUGE, GEM, BOTTOM_WALL, VIEWFINDER, POPUP_MENU, MAGNETIC_EYE, SHOP_LED_INDICATOR_640, BRICKS, NUMOF_SPRITE_TYPES } SPRITES_ENUM; typedef enum { DRAW_WITH_TABLES, COPY_FROM_BITMAP, DRAW_LINE_BY_LINE, DRAW_REPEAT_SPRITE, DRAW_COLOR_CYCLING_MASK, DRAW_CAPSULE, DRAW_BRICK } DRAW_METHOD_ENUM; private: /** List of tables of the drawing pixels data. Used for drawing sprite * pixel by pixel, with color cycling. * Only used for the chance capsule sprite */ Sint16 **drawing_pixels; /** List of pointers of all images of the sprite * in the source bitmap page */ char **images_pixel_data; /** Pointer to sprite shadow in game offscreen for sprite */ char *shadow_screen_ptr; /** Pointer to the background in restore offscreen for shadow */ char *shadow_restore_ptr; Sint32 offsetSrce; // offset source Sint32 offsetDest; // offset destination /* * Drawing tables */ /** List of tables of the drawing offsets and repeats values */ Sint16 **drawing_values; /** Table of drawing offsets and repeats values for * current sprite image frame */ Sint16 *current_drawing_values; /** List of tables of the drawing pixels data */ char **drawing_data; /** Data structure of drawing sprite line by line. * Only used for the Gigablitz sprite */ bb_afligne **drawing_peer_line; static Sint32 ombredecax; static Sint32 ombredecay; static Sint32 ombrepixe4; static char ombrepixel; protected: /** Table of drawing pixels data for current sprite image frame */ char *current_drawing_data; /** Table of drawing data for current sprite image frame */ Sint16 *current_drawing_pixels; /** Pointer to sprite in game offscreen */ char *screen_ptr; /** Pointer to the background in restore offscreen */ char *restore_ptr; /** The pixel data of the sprite */ char *pixel_data; /** Width in bytes of bitmap in which is the sprite */ Uint32 row_size; /** Width in bytes of offscreen */ Uint32 offscreen_pitch; /** True if the sprite is enabled and drawn */ bool is_enabled; /** True if the sprite has a shadow */ bool sprite_has_shadow; /** X coordinate */ Sint32 x_coord; /** Y coordinate */ Sint32 y_coord; /** Width of the sprite in pixels */ Uint32 sprite_width; /** Height of the sprite in pixels */ Uint32 sprite_height; /** Time delay before next image of the animation */ Sint32 frame_period; /** Counter time delay before next image */ Sint32 frame_delay; /** Maximum number of images in the animation */ Sint32 max_of_images; /** Index of the current image */ Sint32 frame_index; Sint32 frame_index_max; Sint32 frame_index_min; /** Position of sprite in global list of all sprites */ Sint32 display_pos; /** Width of the game screen in pixels */ Sint32 screen_width; /** Height of the game screen in pixels */ Sint32 screen_height; /** X coordinate minimum */ Sint32 x_minimum; /** Y coordinate minimum */ Sint32 y_minimum; /** X coordinate maximum */ Sint32 x_maximum; /** Y coordinate maximum */ Sint32 y_maximum; /** Type identifier of the sprite, integer from 0 to n */ Uint32 sprite_type_id; Sint32 affligFrSv; // premiere ligne a afficher (si afflignesF=1) Sint32 affligLaSv; // derniere ligne a afficher (si afflignesF=1) /** If true, object has allocated memory for pixels of sprite */ bool has_allocated_memory; /** Position of sprite in its list from 0 to n */ Sint32 object_pos; /** true if the object must release * the pixel data memory at its destruction */ bool is_release_pixel_data; /** If true generate additional table to drawing pixel by pixel. * Used with for color cycling */ bool is_draw_pixel_by_pixel; public: /** Width used for the collisions */ Uint32 collision_width; /** Height used for the collisions */ Uint32 collision_height; Sint32 affligFrst; // premiere ligne a afficher (si afflignesF=1) Sint32 affligLast; // derniere ligne a afficher (si afflignesF=1) /** If true then mirror lines vertically in the initialization * of the sprite */ bool is_mirrored_vertically; Sint32 num_of_repeats; // > 1 repeat /** Current draw method used to display sprite */ Uint32 draw_method; /** Current cycling color table index */ Sint32 cycling_index; /** Current cycling color table used for projectiles */ const Sint32 *current_cycling; public: sprite_object (); virtual ~sprite_object (); void clear_sprite_members (); void release_sprite (); void enable (); void disable (); bool is_enable (); Uint32 get_sprite_type_id (); void set_display_pos (Sint32 num); void set_object_pos (Sint32 num); void duplicate_to (sprite_object * sprite_dest); void set_coordinates (Sint32 xcoord, Sint32 ycoord); void create_sprite (Sint32 type_id, surface_sdl * bitmap, bool shadow, bool by_pixel = false); void make_sprite (surface_sdl * image, bool shadow = false); void init_coords_max_min(Uint32 width_less = 0); void set_x_coord (Sint32 xcoord); void set_y_coord (Sint32 ycoord); void move_x (Sint32 x_offset); void move_y (Sint32 y_offset); bool has_shadow (); void set_shadow (bool shadow = true); Sint32 get_x_coord (); Sint32 get_y_coord (); void set_image (); void set_image (Sint32 index); Sint32 get_frame_index (); void restore_background_under_sprite (); void restore_line_by_line (); virtual void draw (); void restore_background_under_shadow (); void draw_shadow (); void draw_to_brackground (); void draw_capsule (); void draw_shadow_to_brackground (); void draw_copy_from_bitmap (); void copy_to_game_screen (); void restore_rectangle_background (); void pull (sprite_object * sprite, Sint32 xoffset = 0, Sint32 yoffset = 0); void attract (sprite_object * sprite, Sint32 xoffset = 0, Sint32 yoffset = 0); virtual bool collision (sprite_object * sprite); virtual bool collision (Sint32 x1, Sint32 y1, Sint32 x2, Sint32 y2); void set_frame_delay (Sint32 delay); void set_frame_period (Sint32 period); bool play_animation_once (); void play_animation_loop (); void new_offset (Sint32 nume); void clip_coordinates (); Uint32 get_sprite_width (); Uint32 get_sprite_height (); Uint32 get_collision_width (); void enable_vertical_repeat (Uint32 numof_repeats); void set_draw_method (Uint32 method); void set_pixel_data (char *pixel, bool is_release = false); public: static const Sint32 cycling_01[8]; static const Sint32 cycling_02[8]; static const sprite_description *zelistBOB[]; void draw_with_tables (); private: void init_common (surface_sdl * image, bool shadow); void alloc_drawing_tables (Sint32 num_images); void draw_line_by_line (); void draw_vertically_repeated (); void draw_cycling_color (); void draw_brick (); }; #endif tecnoballz-0.93.1/include/sprite_bullet.h0000664000175000017500000000420212412501751017444 0ustar brunobruno/** * @file sprite_bullet.h * @brief The bullet sprite from a guardian * @date 2007-09-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_bullet.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_BULLET__ #define __SPRITE_BULLET__ class sprite_bullet; #include "../include/sprite_object.h" #include "../include/sprite_guardian.h" #include "../include/sprite_paddle.h" class sprite_bullet:public sprite_object { friend class controller_bullets; private: /** Type of displacement from 1 to 7 */ Uint32 displacement; Sint32 flagDepla1; Sint32 flagDepla2; Sint32 flagDepla3; Sint32 flagDepla4; Sint32 flagDepla5; Sint32 flagDepla6; Sint32 flagDepla7; const short *tablesinus; const short *tablecosin; sprite_paddle *paddle_target; sprite_guardian *ptguardian; Sint32 tir_maxi_x; Sint32 tir_maxi_y; Sint32 tir_minixy; public: sprite_bullet (); ~sprite_bullet (); void move (); private: void trajectory_01 (); void trajectory_02 (); void trajectory_03 (); void trajectory_04 (); void trajectory_05 (); void trajectory_06 (); void trajectory_07 (); void trajectory_08 (); void trajectory_09 (); void trajectory_10 (); void trajectory_11 (); void trajectory_12 (); void screenOver (Sint32 xmini); void screenStop (Sint32 vmini); }; #endif tecnoballz-0.93.1/include/handler_resources.h0000664000175000017500000000776012412501751020312 0ustar brunobruno/** * @file handler_resources.h * @brief Handler of the files resources * @created 2004-04-20 * @date 2013-02-23 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_resources.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER_RESOURCES__ #define __HANDLER_RESOURCES__ #include "../include/tecnoballz.h" class handler_resources:public virtual tecnoballz { private: static handler_resources *handler_resources_singleton; static const char *folderlist[]; static const char *bitmap_files[]; static const char *texts_files[]; static const char *standfiles[]; static const char *musicfiles[]; static const char *soundfiles[]; static const char *folderdata; static const char *folder_320; static const char *folder_640; static const char *fnamescore; static char tmp_filename[512]; static char pathstring[512]; static const Uint32 TEXTS_OFFSET = 2048; static const Uint32 BITMAP_OFFSET = 4096; public: /** Different identifiers of the resources */ typedef enum { RESCOSLIST = 0, MAP_GUARDIANS_20, MAP_GUARDIANS_40, MAP_CONGRATULATIONS_20, MAP_CONGRATULATIONS_40, MAP_MENU_20, MAP_MENU_40, RESGCURVES, DATA_BRICKS_LEVELS, RES60BACKG, DATA_LEVELS, TEXTS_SHOP = TEXTS_OFFSET, TEXTS_MESSAGES, TEXTS_SCROLL_MENU, TEXTS_POPUP_MENU, TEXTS_MAIN_MENU, BITMAP_HEAD_ANIMATION = BITMAP_OFFSET, BITMAP_RIGHT_PANEL, BITMAP_PADDLES_1, BITMAP_PADDLES_2, BITMAP_GAME_FONTS, BITMAP_MENU_FONTS, BITMAP_SMALL_FONTS, BITMAP_GIGABLITZ, BITMAP_TILESMAP, BITMAP_SHOP, BITMAP_ALL_SPRITES, BITMAP_BRICKS, BITMAP_SCORES_FONTS, MUSICAREA1 = 8192 } RESOURCE_IDENTFIERS; static const Sint16 cosinus360[720]; static const Sint16 *zesinus360; static const Uint32 color_gradations[180]; private: /** Size last file loaded in memory */ Uint32 last_filesize_loaded; handler_resources (); public: static handler_resources *get_instance (); ~handler_resources (); char *load_data (Uint32 resource_id); char *get_music_filename (Uint32 resource_id); char *get_sound_filename (Uint32 resource_id); char *get_tilemaps_filename (Uint32 tile_num); char *get_full_pathname (Uint32 resource_id); void load_sprites_bitmap (Uint32 resource_id = BITMAP_ALL_SPRITES); void release_sprites_bitmap (); Uint32 get_filesize_loaded (); char *read_complete_file (const char *filename); void load_sinus (); char *load_high_score_file (); void save_high_score_file (char *buffer, Uint32 size); char *locate_data_file (const char *const name); char **load_texts (Uint32 resource_id, Uint32 maxof_lines = 0, Uint32 row_length = 0, Uint32 modulo = 0, bool upper_case = true); char *get_filename (Uint32 resource_id, Uint32 res = 0); private: char *loadfile_with_lang (const char *const filename, Uint32 * const fsize); char *load_file (const char *fname); char *load_file (const char *fname, Uint32 * fsize); void set_filesize_loaded (Uint32 size); }; #endif tecnoballz-0.93.1/include/controller_bricks.h0000664000175000017500000003164212412501751020317 0ustar brunobruno/** * @file controller_bricks.h * @brief Control the bricks in bricks levels * @created 1996-11-13 * @date 2012-09-06 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_bricks.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_BRICKS__ #define __CONTROLLER_BRICKS__ class controller_bricks; class sprite_paddle; #include "../include/tecnoballz.h" #include "../include/sprite_brick.h" /** * Structure of one simple bricks into the map of current level */ typedef struct { /** offset on the pixels brick from the bitmap source */ Sint32 source_offset; /** Brick is currently display */ bool is_displayed; /** Brick counter */ Sint32 number; /** Offscreen offset for drawing brick */ Sint32 pixel_offset; /** Sprite used to display brick if bob_ground = true */ sprite_brick *sprite; /** Brick horizontal position in the bricks bitmap * 0, 2, 4, 6, 8, 10 or 12 */ Sint32 h_pos; /** Brick vertical position in the bricks bitmap * 0, 1, 2, 3, 4, 5, 6, 7, or 8 */ Sint32 v_pos; /** Pointer to the address of the buffer containing a save of * the background which is under a brick (if has_backfground = true) * modulo = 0 */ Sint32 *save_background; /** Brick color, 17 colors possibles */ Uint32 color; } brick_info; /** * Structure for draw brick or restore the background */ typedef struct { /** If true if indestructible power 1 brick */ bool is_indestructible; /** If true brick was destroyed by the Gigablitz */ bool is_gigablitz_destroyed; /** X-coordintate of the collision */ Sint32 xcoord_collision; /** X-coordintate of the collision */ Sint32 ycoord_collision; /** The last paddle touched by the ball or the paddle was fired */ sprite_paddle *paddle; /** Brick number touched */ Sint32 number; /** If true restore backgound, redraw brick otherwise */ bool is_background; /** Offscreen offset for drawing brick */ Sint32 pixel_offset; /** Sprite used to display brick if bob_ground = true */ sprite_brick *sprite; /** Pointer to the brick in the map */ brick_info *brick_map; } brick_redraw; #include "../include/sprite_paddle.h" #include "../include/bitmap_data.h" #include "../include/right_panel_score.h" #include "../include/controller_moneys.h" #include "../include/controller_capsules.h" #include "../include/sprite_ship.h" class controller_bricks:public objects_list < sprite_object, controller_bricks > { friend class controller_balls; friend class sprite_projectile; friend class controller_gigablitz; friend class sprite_ship; public: /** Maximum number of bricks to erase */ static const Uint32 MAXBRIKCLR = 2 << 8; /** Numbers of bricks peer line */ static const Uint32 MAX_OF_BRICKS_HORIZONTALLY = 16; /** Numbers of lines of bricks */ static const Uint32 MAX_OF_BRICKS_VERTICALLY = 30; /** Maximum number of bricks */ static const Uint32 MAX_OF_BRICKS = MAX_OF_BRICKS_HORIZONTALLY * (MAX_OF_BRICKS_VERTICALLY + 9); private: /** Brick width in pixels in low-res */ static const Uint32 BRICK_WIDTH = 16; /** Brick height in pixels in low-res */ static const Uint32 BRICK_HEIGHT = 7; static const Sint32 offBri_DD = 1; static const Sint32 offBri_GG = -1; static const Sint32 offBri_HH = -MAX_OF_BRICKS_HORIZONTALLY; static const Sint32 offBri_BB = MAX_OF_BRICKS_HORIZONTALLY; static const Sint32 offBri_BG = MAX_OF_BRICKS_HORIZONTALLY - 1; static const Sint32 offBri_BD = MAX_OF_BRICKS_HORIZONTALLY + 1; static const Sint32 offBri_HG = -MAX_OF_BRICKS_HORIZONTALLY - 1; static const Sint32 offBri_HD = -MAX_OF_BRICKS_HORIZONTALLY + 1; /** Number of bricks per row in a level */ static const Uint32 BRICKS_MAP_WIDTH = 10; /** Number of bricks per column in a level */ static const Uint32 BRICKS_MAP_HEIGHT = 17; static const Uint32 LEVEL_SIZE = BRICKS_MAP_WIDTH * BRICKS_MAP_HEIGHT; /** Number of levels in a area */ static const Uint32 MAX_OF_LEVELS_IN_AREA = 10; static const Uint32 SIZEOFAREA = MAX_OF_LEVELS_IN_AREA * LEVEL_SIZE; static const Uint32 BRKYOFFSET = 8; //y-offset between 2 bricks private: /** Bitmap of the set of current bricks */ surface_sdl *bitmap_bricks; /** Number of bricks in the current level */ Uint32 num_of_bricks; /** Less bricks counter */ Sint32 less_bricks_count; /** Time delay for the "less bricks" option */ Sint32 less_bricks_delay; /** Map of the bricks currently displayed on the screen, 30 lines * of 16 breack each */ brick_info *bricks_map; /** Width in pixels of a set of bricks */ Uint32 bricks_height; /** Height in pixels of a set of bricks */ Uint32 bricks_width; /** Brick's width in pixels */ Uint32 brick_width; /** Brick's height in pixels */ Uint32 brick_height; /** Brick's size in bytes */ Uint32 brick_size; /** Pixels offset on the first indestructible brick */ Sint32 indestructible_offset; Sint32 brkyoffset; //y-offset between 2 bricks Sint32 shadow_offset; //size of shadow in pixels (3 or 6) Sint32 shadow_left; //(4 or 8) Sint32 shadow_yoff; //space between 2 bricks (1 or 2) Sint32 shadow_top1; //(2 or 4) brick_redraw * bricks_redraw; // table de reaffichage Sint32 briqueSave; // pointeur sur "bricks_redraw" /** If true sprites were added to sprites list */ bool were_sprites_added; bool is_cycling; Uint32 cycling_count; protected: Sint32 brique_clr; // pointeur sur "bricks_redraw" /** Buffer used to save the background under bricks * if has_background = true */ char *background_under_bricks; Sint32 offsSource; // adresse de la page brique Sint32 offsDestin; // Sint32 *adr_source; // adresse de la page brique Sint32 *adr_desti1; // adresse du buffer (ecran travail) Sint32 *adr_desti2; // adresse du tampon (ecran restitution) public: controller_bricks (); ~controller_bricks (); void first_init (); void initialize (); void add_to_sprites_list (); void start_cycling(); void color_cycling(); bool update (); Uint32 get_num_of_bricks (); void less_bricks (); void draw_brick (char *pixels, Sint32 offset, Sint32 color); void clr_bricks (); brick_info* get_bricks_map (); brick_info* get_bricks_map (Sint32 xcoord, Sint32 ycoord); brick_redraw* get_bricks_redraw (); brick_redraw* get_bricks_redraw_next (); void bricks_redraw_next (); Sint32 get_brick_width (); Sint32 get_indestructible_offset (); Sint32 getYOffset (); private: void load_level (Sint32 area_nu, Sint32 level_nu); void draw_bricks_shadows (); void draw_bricks (); void set_bricks_palette (); void save_background (); }; #endif /* MAX_OF_BRICKS = 480 briques a l'ecran bricks_map fonction : collision des balles/tirs avec les 480 briques de l'ecran taille : 7*480 = 3360 octets type : type structure brick_info 6 mots et 1 pointeur offset : adresse relative du bitmap de la brique, sert pour les collisions/resistance de la brique controller_balls::vitusBrick() is_displayed : adresse relative du bitmap de la brique number : numero de la brique (sert a rien ???) pixel_offset : adresse ecran relative d'affichage (dans le buffer et le tampon) h_pos : abscisse de la brique dans la page Gfx brique (0,1,2,3,4,5,6,7 ou 8) v_pos : ordonnee de la brique dans la page Gfx brique (0,2,4,6,8,10 ou 12) save_background : adresse absolue du fond 4 couleurs sous la brique (modulo 0) ------------------------------------------------------------------------------- fichier briques : "zebricks.bmp" 1220 x 254 pixels ------------------------------------------------------------------------------- Ce fichier contient 10 jeux de briques (un jeu de brique est choisis au hasard a chaque tableau) Un jeu de brique : Taille : 224x126 pixels : 63 briques Le fichier brique contient 7 colonnes de 9 lignes briques de 32x14 pixels Les 8 premieres lignes sont les briques "normales". Chaque ligne est une brique avec 7 niveaux de resistance. La colonne 7 represente la plus forte resistance, et la colonne 1 la resistance la plus faible. La colonne 0 est vide, la brique est detruite. La 9ieme ligne contient les briques indestrutibles. ------------------------------------------------------------------------------- fichier tableau : "tableau.data" : 34000 octets ------------------------------------------------------------------------------- Ce fichier contient 100 tableaux. Le jeu comporte 50 tableaux, repartis en 5 zones de 10 niveaux. Pour un niveau il existe deux tableaux possibles choisi au hasard. Les 100 tableaux se suivent sequentiellement dans le fichier : les 2 tableaux du niveau 1 - zone 1, les 2 tableaux du niveau 2 - zone 1, ... Un tableau (340 octets) : Se compose de 10 colonnes de 17 lignes. Une brique est represente par un mot de 16 bits. Les bits 0 a 7 contiennent la position x sur la page brique de 0 a 12 (de 2 en 2) Les bits 8 a 15 contiennent la position y sur la page brique de 0 a 8 (de 1 en 1) Si x et y sont a 0, c'est qu'il n'existe pas de brique. Le fichier est lu au debut de chaque niveau et les valeurs sont recopiees dans la "bricks_map" tableau de structure "brick_info" ------------------------------------------------------------------------------- tableau "bricks_map" : (tableau de structures "brick_info") ------------------------------------------------------------------------------- Ce tableau est un tableau de type "brick_info". Chaque entree du tableau represente une brique a l'ecran. Le tableau represente 16 colonnes, de 30 lignes de briques, et couvre donc la totalite de l'ecran de jeu, bien que seulement 10 colonnes de 17 lignes soient utilisees, ce qui correspond a la taille d'un tableau lu dans le fichier "tableau.data". La structure "brick_info", contient des informations sur une brique a l'ecran utilisee pour les collisions avec les balles, les tirs et le gigablitz. offset => adresse source relative de la brique (resistance) is_displayed => adresse source relative de la brique number => numero de la brique par rapport a la premiere pixel_offset => adresse ecran relative d'affichage (buffer et tampon) h_pos => abscisse de la brique dans la page graphique brique 0, 2, 4, 6, 8, 10 ou 12 v_pos => ordonnee de la brique dans la page graphique brique 0, 1, 2, 3, 4, 5, 6, 7, ou 8 *save_background => adresse du fond de la brique pour l'effacer (modulo 0) Jeu original : 3 tables de 4 octets par brique set_table => set_table2 => copie de set_table (effacement) set_table3 => tableau actuel valeur (collision) set_table + 0 = numero brique set_table + 2 = adresse relative de la brique dans le fichier graphique brique *collision* set_table3 + 0 = position x de la brique dans le fichier graphique brique (+JMM) *decremente resitance* set_table3 + 2 = position y de la brique dans le fichier graphique brique (+JMM) BRI.X (2 octets) Position X de la balle (-1 = brique indes. detruitre / 512 = detruit au gigablitz) BRI.Y (2 octets) Position Y de la balle BRI.RAK (4 octets) Adresse de la structure raquette BRI.NUM (2 octets) Numro brique BRI.FLAG (2 octets) 0=Affiche brique / 1=Affiche dcor BRI.ADR (2 octets) Adresse relative d'affichage RIZ =BK.X*4 Largeur en octets ligne map-editor ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- typedef struct { Sint32 xcoord_collision; // abcsisse ecran de la balle Sint32 ycoord_collision; // ordonnee ecran de la balle sprite_paddle *raquettePT; // pointeur sur la raquette qui a touche cette balle en dernier Sint32 number; // numero de la brique touchee Sint32 is_background; // 1=affiche le decor du fond ou 0=affiche la brique Sint32 pixel_offset; // offset d'affichage ecran de la brique brick_info *brick_map; // adresse de la brique dans "bricks_map" */ tecnoballz-0.93.1/include/sprite_display_menu.h0000664000175000017500000001007012412501751020646 0ustar brunobruno/** * @file sprite_display_menu.h * @brief Sprite wich display text of the menu in the menu principal * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_display_menu.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_DISPLAY_MENU__ #define __SPRITE_DISPLAY_MENU__ class sprite_display_menu; #include "../include/display_text_bitmap.h" #include "../include/sprite_object.h" #include "../include/bitmap_data.h" #include "../include/handler_menu_events.h" class sprite_display_menu:public virtual display_text_bitmap, public virtual sprite_object { public: typedef enum { DO_NO_EXIT, PROGRAM_EXIT, START_GAME } EXIT_ENUM; private: typedef enum { MAIN_SECTION = 0, OPTIONS_SECTION = 19, ABOUT_SECTION = 38, INFOS_SECTION = 57, GREETINGS_SECTION = 76, SCORE_SECTIONS = 95, MAX_OF_LINES = 114 } MENU_TEXTS_ENUM; /** Object handle events of the menu */ handler_menu_events* menu_events; /** Pointer to the text file loaded */ char **texts_of_menus; static const unsigned char color_cycling[]; /** Number of characters by lines */ static const Sint32 NUM_OF_COLUMNS = 32; /** Number of lines of characters */ static const Sint32 NUM_OF_ROWS = 19; static const Sint32 LINE_START = 5; static const Sint32 LINE_PARAM = 6; static const Sint32 LINE_ABOUT = 7; static const Sint32 LINE_SALUT = 8; static const Sint32 LINE_INFOS = 9; static const Sint32 LINE_SCORE = 10; static const Sint32 LINE_CODE1 = 11; static const Sint32 LINE_CODE2 = 12; static const Sint32 LINE_SORTI = 13; static const Sint32 LINE_ENTRE = 14; static const Sint32 YCOORDNULL = -10240; /** Width of font in pixels 8 or 16 */ Uint32 font_width; /** Height of font in pixels 8 or 16 */ Uint32 font_height; /** Space between lines in pixels */ Uint32 line_spacing; /** Id of the current menu from MAIN_SECTION to SCORE_SECTIONS */ Uint32 current_menu_section; /** Current index of the first color of the line * under the mouse cursor */ Uint32 menu_first_color_index; Sint32 y_coord_left_down; Sint32 y_coord_right_down; bitmap_data *text_offscreen; /** True if currently cleaning */ bool is_clean_zone; /** Height of the zone to clear */ Uint32 clear_zone_height; /** Width of the zone to clear */ Uint32 clear_zone_width; /** X-coordinate of the top-left zone to clear */ Uint32 clear_zone_xcoord; /** Y-coordinate of the top-right zone to clear */ Uint32 clear_zone_ycoord; Uint32 blink_cursor_delay; /** Offsets of the first 128 ASCII characters */ static char ascii_to_index[128]; public: static const char difficulte[]; public: sprite_display_menu (); ~sprite_display_menu (); void load_text_file(); void first_init (); Uint32 check_and_display (); private: void update_strings (); void set_current_menu_section(Uint32 current); Uint32 check_events (); void clear_text_offscreen (); void clear_input_zone (); void clear_zone_start (Uint32 xcoord, Uint32 ycoord, Uint32 width, Uint32 height); void start_input_string (Uint32 xcoord, Uint32 ycoord, Uint32 width, char *str); void clear_zone_stop (); void draw_input_cursor (); void copy_high_score_in_menu (); }; #endif tecnoballz-0.93.1/include/tiles_background.h0000664000175000017500000000601212412501751020107 0ustar brunobruno/** * @file tiles_background.h * @brief Draw tiles background in bricks levels * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: tiles_background.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __TILES_BACKGROUND__ #define __TILES_BACKGROUND__ class tiles_background; #include "../include/tecnoballz.h" class tiles_background:public virtual tecnoballz { public: typedef enum { TILES_NO_SCROLL, TILES_SCROLL_BEGIN, TILES_SCROLL_LOST, TILES_SCROLL_WIN, TILES_SCROLL_GAMEOVER } TYPES_OF_SCROLL; private: static tiles_background* tiles_background_singleton; static Sint32 table_pos1[16]; static Sint32 table_pos2[16]; static unsigned char couleurs[448]; static const Sint32 TILES_32_WIDTH = 32; static const Sint32 TILES_32_HEIGHT = 32; static const Sint32 TILES_64_WIDTH = 64; static const Sint32 TILES_64_HEIGHT = 64; typedef enum { TILES_32x32_WITH_4_COLORS, TILES_64x64_WITH_16_COLORS } TYPES_OF_TILES; /** Type of tiles TILES_64x64_WITH_16_COLORS * or TILES_32x32_WITH_4_COLORS */ Uint32 type_of_tiles; /** 4 color palette index */ Sint32 palette_index; bitmap_data *current_tiles; Uint32 *map_tiles; Uint32 map_height; Uint32 map_width; Uint32 map_row_size; Uint32 map_xcoord; Uint32 map_ycoord; Uint32 map_xmax; Uint32 map_ymax; Uint32 tiles_width; Uint32 tiles_height; /** Type of scrolling TILES_NO_SCROLL, TILES_SCROLL_BEGIN, ... */ Uint32 map_scroll_num; double map_angle_direction; double map_angle_speed; /** Velocity of the tiles background */ double map_velocity; Sint32 map_scroll_delay; private: tiles_background (); void draw_shadows (); void generate_map (); void set_palette (); void set_4_color_palette (Uint32 pal_index); public: ~tiles_background (); static tiles_background *get_instance (); void setup (Uint32 titles_num); void set_scroll_type(Uint32 type); void draw (); void draw (offscreen_surface * offscreen); void set_4_color_palette (); void next_4_color_palette (); void prev_4_color_palette (); }; #endif tecnoballz-0.93.1/include/supervisor_shop.h0000664000175000017500000001605212412501751020047 0ustar brunobruno/** * @file supervisor_shop.h * @brief Shop supervisor * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_shop.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SUPERVISOR_SHOP__ #define __SUPERVISOR_SHOP__ class supervisor_shop; #include "../include/list_sprites.h" #include "../include/sprite_mouse_pointer.h" #include "../include/sprite_object.h" #include "../include/controller_capsules.h" #include "../include/display_text_bitmap.h" #include "../include/handler_players.h" #include "../include/supervisor.h" #include "../include/handler_popup_menu.h" #include "../include/tiles_background.h" #include "../include/handler_menu_events.h" class supervisor_shop:public supervisor { public: /* number maximum of bonus capsules bought */ static const Uint32 MAX_OF_CAPSULES_BOUGHT = 19; private: typedef enum { TEXT_INFOS = 21, TEXT_WELCOME = 32, TEXT_PADDLES = 21, TEXT_LIVES_LEFT = 22, TEXT_HOPING_HELP = 24, TEXT_WAITING_CHEAT_MODE = 25, TEXT_ENABLED_CHEAT_MODE = 26, TEXT_PADDLE_RIGHT = 27, TEXT_PADDLE_TOP = 28, TEXT_PADDLE_LEFT = 29, TEXT_AREA_CODE = 30, TEXT_NO_AREA_CODE = 31, TEXT_NOT_ENOUGH_MONEY = 33, TEXT_CANNOT_BUY_MORE = 34, TEXT_ONLY_FOR_AREA_5 = 35 } TEXT_ENUM; /** Enumerate differents pages of the informations option */ typedef enum { INFO_PADDLES, INFO_LIVES, INFO_AREA_CODE, INFO_END } INFO_ENUM; /** Length of a text line in chars */ static const Uint32 BOX_LENGTH_STRING = 22; /** Object handle events of the menu */ handler_menu_events* menu_events; /** All strings loaded from a file text */ char** box_texts; /** tiles_background object only used to initialize * the colors palette */ tiles_background *tiles_ground; /** Pointer to the sprite mouse pointer */ sprite_mouse_pointer *mouse_pointer; /** Led who indicates the option over the mouse */ sprite_object *led_indicator; /** Control all capsules */ controller_capsules *power_up_capsules; /** Object which draws three lines of texts */ display_text_bitmap *display_text; /** Object who handles the "ESC" menu */ handler_popup_menu *popup_menu; /** Option currently selected by pressing the left mouse button */ Sint32 current_selected_option; /** Index of the currently displayed page: INFO_PADDLES, * INFO_LIVES or INFO_AREA_CODE */ Uint32 some_infos_index; /** If true info already seen at least once */ bool is_already_view_info; /** Current price of the selected option */ Uint32 current_price; /** The number of bought capsules */ Uint32 num_of_bought_capsules; /** Pointer to the 3 lignes currently displayed */ char *current_text_displayed[3]; /** Current x-coordinate of the led indicator */ Sint32 led_indicator_xcoord; /** Current y-coordinate of the led indicator */ Sint32 led_indicator_ycoord; /** True if the current player drag a capsule */ bool is_caspule_drag; /** Capsule which blinks in the list when it is draged with the mouse */ sprite_capsule *blink_capsule; /** Capsule which draged with the mouse */ sprite_capsule *drag_sprite; /** Pointer to the currently dragged capsule in the shopping cart of the * player */ Sint32 *dragged_capsule_pt; /** Temporary shopping cart used to change a position of a capsule * in the capsules list */ Sint32 temporary_shopping_cart[MAX_OF_CAPSULES_BOUGHT + 1]; Sint32 options_frame_xmin; Sint32 options_frame_xmax1; Sint32 options_frame_xmax2; Sint32 options_frame_ymax1; Sint32 options_frame_ymax2; /** Index on the selected capsule in the list of bonus capsules bought, * otherwise negative value if no capsule is selected */ Sint32 selected_capsule_index; /** Index on the currently dragged capsule */ Sint32 dragged_capsule_index; /** True if drawn the select cursor */ bool is_drawn_select_cursor; /** Top coordinate of the frame which contains the list of bonus capsules * bought */ Sint32 capsules_frame_ymin; /** Bottom coordinate of the frame which contains the list of bonus * capsules bought */ Sint32 capsules_frame_ymax; /*** Current X coordinate of the select cursor */ Sint32 select_cursor_xcoord; /*** Current Y coordinate of the select cursor */ Sint32 select_cursor_ycoord; /** Maximum height of the select cursor in pixels */ Sint32 select_cursor_height; /** Maximum width of the select cursor in pixels */ Uint32 select_cursor_width; /** Sinus table index from 0 to 511 used to modify the size of the cursor */ Sint32 select_cursor_sin_index; /** Indexed color of the select cursor from 0 to 32 */ Sint32 select_cursor_color; /** Code of the last key pressed, used for input cheat code */ Uint32 previous_key_code_down; /** Current cheat code which was typed by the player */ Uint32 cheat_code_input; /** Cheat code is an unsigned 32 bits integer, * a string of 4 chars containing the keycodes "ETB\n" */ Uint32 cheat_code; /** Identifiers of the available options and bonus capsules */ static Sint32 available_options_id[]; /** Prices of all the available options in the shop */ static Uint32 options_prices[]; /** Indexes of the texts used for sales confirmation messages */ static unsigned char led_index_to_text_index[]; public: supervisor_shop (); ~supervisor_shop (); void first_init (); Uint32 main_loop (); private: Sint32 get_option_over_mouse_cursor (Sint32 x, Sint32 y); void purchase_option_or_capsule (Uint32 option_id); void display_info(); void display_capsules_bought (); void purchase_bonus_capsule (Sint32 option_num); void display_sales_confirmation (Sint32 option_index); Uint32 get_price_and_update_led (Sint32 index); bool decrease_money_amount (); void put_current_text (char *str); void display_box_text (); void capsule_drag_and_drop (); Sint32 collisions (); void set_select_cursor_coordinates (); void draw_select_cursor (); void check_if_enable_cheat (); static const unsigned char color_cycling[]; }; #endif tecnoballz-0.93.1/include/supervisor_guards_level.h0000664000175000017500000000715612412501751021557 0ustar brunobruno/** * @file supervisor_guards_level.h * @brief Guardians level supervisor * @created 2003-01-11 * @date 2007-10-17 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_guards_level.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SUPERVISOR_GUARDS_LEVEL__ #define __SUPERVISOR_GUARDS_LEVEL__ class supervisor_guards_level; #include "../include/tilesmap_scrolling.h" #include "../include/sprite_bullet.h" #include "../include/handler_display.h" #include "../include/handler_keyboard.h" #include "../include/supervisor.h" #include "../include/controller_guardians.h" #include "../include/controller_bullets.h" #include "../include/controller_paddles.h" #include "../include/controller_balls.h" #include "../include/controller_moneys.h" #include "../include/controller_capsules.h" #include "../include/controller_indicators.h" #include "../include/controller_gigablitz.h" #include "../include/controller_explosions.h" #include "../include/controller_viewfinders.h" #include "../include/controller_game_over.h" #include "../include/controller_spheres.h" #include "../include/handler_popup_menu.h" #include "../include/controller_font_game.h" class supervisor_guards_level:public virtual supervisor { friend class controller_font_game; private: controller_gigablitz * gigablitz; tilesmap_scrolling *tiles_map; controller_guardians *guards; controller_bullets *bullets; controller_paddles *paddles; controller_balls *balls; controller_viewfinders *viewfinders_paddles; controller_moneys *money_capsules; controller_capsules *power_up_capsules; controller_indicators *player_indicators; controller_explosions *explosions; /** Sprite of the money capsule to the left of amount money */ sprite_object *money_indicator; sprite_object *sprite_playername; sprite_capsule *ptBobLifes; handler_popup_menu *popup_menu; /** Area number from 1 to 5 */ Uint32 area_number; /** Current level number 6, 12 or 13 */ Uint32 level_number; const guardians_level_desc *level_desc; /** Delay time before the scrolling starts */ Uint32 scroll_start_delay; /** Behavior type of scrolling */ Uint32 scroll_type; /** Speed of the scrolling */ Sint32 scroll_speed; controller_game_over *game_over; /** Mettalic spheres used in congratulisation */ controller_spheres *metallic_spheres; Uint32 gameover_counter; /** Delay counter before next phase */ Sint32 count_next; /** If true game is finished, play game over with congratulations */ bool is_victory; /** If true congratulations was already initialized */ bool is_victory_initialized; controller_font_game *font_game; private: void init_level (); void run_scroll (); void cheat_keys (); public: supervisor_guards_level (); ~supervisor_guards_level (); void first_init (); Uint32 main_loop (); }; #endif tecnoballz-0.93.1/include/handler_high_score.h0000664000175000017500000000414312412501751020402 0ustar brunobruno/** * @file handler_high_score.h * @brief high score handler * @created 2004-04-30 * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_high_score.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER_HIGH_SCORE__ #define __HANDLER_HIGH_SCORE__ class handler_high_score; #include "../include/tecnoballz.h" typedef struct { char player_name[8]; Uint32 value; Uint32 area_number; Uint32 level_number; } player_score; class handler_high_score:public virtual tecnoballz { public: static const Uint32 MAX_OF_HIGH_SCORES = 10; private: static handler_high_score *high_score_singleton; player_score ** scores_tables; private: Uint32 scores_table_size; bool is_player_ranked (char *playename, Uint32 score_value, Uint32 level_num, Uint32 area_num); void sort_scores (); bool load_high_score (); void save_high_score (); Uint32 calculate_checksum (Uint32 * addr, Uint32 data_size); void first_init (); private: handler_high_score (); public: ~handler_high_score (); static handler_high_score *get_instance (); bool is_player_ranked (); player_score *get_high_score_table (); char *get_best_playername (); Uint32 get_best_score (); }; #endif tecnoballz-0.93.1/include/sprite_font_menu.h0000664000175000017500000000253612412501751020157 0ustar brunobruno/** * @file sprite_font_menu.h * @brief The fonte sprite used in the main menu * @date 2007-02-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_font_menu.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_FONTE_MENU__ #define __SPRITE_FONTE_MENU__ #include "../include/sprite_object.h" class sprite_font_menu:public virtual sprite_object { friend class controller_font_menu; protected: Sint32 zeCosValue; Sint32 zeSinValue; public: sprite_font_menu (); ~sprite_font_menu (); }; #endif tecnoballz-0.93.1/include/sprite_projectile.h0000664000175000017500000000502212412501751020316 0ustar brunobruno/** * @file sprite_projectile.h * @brief The fire sprite of the paddle into the bricks level * @date 2007-09-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_projectile.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_PROJECTILE__ #define __SPRITE_PROJECTILE__ class sprite_projectile; #include "../include/sprite_object.h" #include "../include/sprite_paddle.h" #include "../include/controller_bricks.h" #include "../include/controller_ships.h" #include "../include/sprite_ship.h" #include "../include/right_panel_score.h" class sprite_projectile:public sprite_object { friend class controller_projectiles; friend class sprite_money; friend class sprite_capsule; friend class sprite_gem; private: static const Uint32 MAXI_TOTAL_OF_PROJECTILES = 200; static Uint32 total_fire; static sprite_projectile *projectiles_list[MAXI_TOTAL_OF_PROJECTILES]; /** Fire is on the paddle, it used only for the fire 7 */ bool on_paddle; Sint32 indexSinus; Sint32 fire_Xscie; Sint32 fire_Yscie; /* Paddle to which the projectile belongs. Used for the capsules */ sprite_paddle *paddle; /** If true projectile destroys the * indestructible-destructibles bricks */ bool can_destroy_indestructible; /** Power of the projectile 1 or 2 */ Uint32 power; public: sprite_projectile (); ~sprite_projectile (); void init_members (sprite_paddle * pad); void set_power1 (); void set_power2 (); static void start_list (); static void gestionTir (); static void check_outside (); static void disable_sprites (); private: static void play_projectiles_animations (); static void check_collisions_with_bricks (); static void check_collisions_with_ships (); }; #endif tecnoballz-0.93.1/include/supervisor.h0000664000175000017500000000255612412501751017022 0ustar brunobruno/** * @file supervisor.h * @brief Virtual class for all supervisors * @date 2007-10-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SUPERVISOR__ #define __SUPERVISOR__ #include "../include/tecnoballz.h" class supervisor:public virtual tecnoballz { protected: Uint32 next_phase; public: supervisor (); virtual ~ supervisor () = 0; void initialize (); void release (); virtual void first_init (); virtual Uint32 main_loop (); }; #endif tecnoballz-0.93.1/include/objects_list.h0000664000175000017500000001526112412501751017262 0ustar brunobruno/** * @file objects_list.h * @brief Template of management of objects list * @date 2012-09-08 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: objects_list.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __OBJECTS_LIST__ #define __OBJECTS_LIST__ template < class X, class T > class objects_list; #include "../include/list_sprites.h" #include "../include/handler_display.h" #include "../include/tecnoballz.h" template < class X, class T > class objects_list:public virtual tecnoballz { protected: static T *singleton; X ** sprites_list; Uint32 max_of_sprites; Uint32 num_of_sprites_allocated; Uint32 num_of_sprites; bool sprites_have_shades; Uint32 sprite_type_id; bool is_draw_pixel_by_pixel; public: objects_list (); virtual ~objects_list (); static T * get_instance (); void littleInit (); void release_sprites_list (); void alloc_sprites_list (); void create_sprites_list (Uint32 maxof, bool have_shades = true); void create_sprites_list (); void disable_sprites (); void enable_sprites (); X **get_sprites_list (); X *get_first_sprite (); Uint32 get_max_of_sprites (); void set_max_of_sprites (Uint32 maxof); }; template < class X, class T > T* objects_list < X, T >::singleton = NULL; /** * Create the list of objects */ template < class X, class T > objects_list < X, T >::objects_list () { } /** * Release the list objects */ template < class X, class T > objects_list < X, T >::~objects_list () { singleton = NULL; } template < class X, class T > T* objects_list < X, T >::get_instance () { if (NULL == singleton) { singleton = new T (); } return singleton; } /** * Clear some members */ template < class X, class T > void objects_list < X, T >::littleInit () { object_init (); max_of_sprites = 0; num_of_sprites_allocated = 0; num_of_sprites = 0; sprites_list = NULL; sprites_have_shades = false; sprite_type_id = 0; is_draw_pixel_by_pixel = false; } /** * Release the list of sprite object */ template < class X, class T > void objects_list < X, T >::release_sprites_list () { if (NULL == sprites_list) { return; } for (Uint32 i = 0; i < num_of_sprites_allocated; i++) { X *sprite = sprites_list[i]; if (NULL != sprite) { delete sprite; } sprites_list[i] = (X *) NULL; } delete[]sprites_list; sprites_list = NULL; max_of_sprites = 0; num_of_sprites_allocated = 0; object_free (); } /** * Return list of the sprites objects * @return pointer to the list of sprites objects */ template < class X, class T > X ** objects_list < X, T >::get_sprites_list () { return sprites_list; } /** * Return first sprite of the list * @return pointer to the first sprite object of the list */ template < class X, class T > X * objects_list < X, T >::get_first_sprite () { if (NULL == sprites_list) { return NULL; } return sprites_list[0]; } /** * Return the maxium number of sprites objects * @return the maxium number of sprites objects */ template < class X, class T > Uint32 objects_list < X, T >::get_max_of_sprites () { return max_of_sprites; } /** * Initialize the maximum number of sprites * @param maxof maximum number of sprites */ template < class X, class T > void objects_list < X, T >::set_max_of_sprites (Uint32 maxof) { max_of_sprites = maxof; } /** * Allocate memory for the list of sprites */ template < class X, class T > void objects_list < X, T >::alloc_sprites_list () { if (0 == max_of_sprites) { std::cerr << "(!)objects_list::alloc_sprites_list() " << "Our array should always have at least one element in it!" << std::endl; throw ("(!)objects_list::alloc_sprites_list() failed! " "At least one element is required"); } release_sprites_list (); try { sprites_list = new X*[max_of_sprites]; } catch (std::bad_alloc &) { std::cerr << "(!)objects_list::alloc_sprites_list() " << "not enough memory to allocate " << max_of_sprites << " elements!" << std::endl; throw; } for (Uint32 i = 0; i < max_of_sprites; i++) { sprites_list[i] = NULL; } num_of_sprites_allocated = max_of_sprites; } /** * Initialize the list of sprites objects * @param maxof maximum number of sprites * @param have_shadow true if the sprite has shadow, true by default */ template < class X, class T > void objects_list < X, T >::create_sprites_list (Uint32 maxof, bool have_shades) { max_of_sprites = maxof; sprites_have_shades = have_shades; create_sprites_list (); } /** * Initialize the list of sprites objects */ template < class X, class T > void objects_list < X, T >::create_sprites_list () { alloc_sprites_list (); X *sprite_template = new X (); sprite_template->set_object_pos (0); sprites_list[0] = sprite_template; /* reserves only once the memory required for the * graphic data of the sprite */ sprite_template->create_sprite (sprite_type_id, sprites_bitmap, sprites_have_shades, is_draw_pixel_by_pixel); sprite_template->set_draw_method (sprite_object::DRAW_WITH_TABLES); sprites->add (sprite_template); for (Uint32 i = 1; i < max_of_sprites; i++) { X *sprite = new X (); sprite->set_object_pos (i); sprite_template->duplicate_to (sprite); sprites_list[i] = sprite; sprites->add (sprite); } } /** * Enable all sprites objects */ template < class X, class T > void objects_list < X, T >::enable_sprites () { for (Uint32 i = 0; i < max_of_sprites; i++) { X *sprite = sprites_list[i]; sprite->enable (); } } /** * Disable all sprites objects */ template < class X, class T > void objects_list < X, T >::disable_sprites () { for (Uint32 i = 0; i < max_of_sprites; i++) { X *sprite = sprites_list[i]; sprite->disable (); } } #endif tecnoballz-0.93.1/include/sprite_guardian.h0000664000175000017500000000640712412501751017760 0ustar brunobruno/** * @file sprite_guardian.h * @brief The guardian sprite * @created 2003-01-09 * @date 2007-04-14 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_guardian.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_GUARDIAN__ #define __SPRITE_GUARDIAN__ class sprite_guardian; #include "../include/sprite_object.h" #include "../include/handler_display.h" #include "../include/controller_guardians.h" #include "../include/controller_balls.h" #include "../include/controller_gigablitz.h" #include "../include/controller_explosions.h" class sprite_guardian:public sprite_object { friend class controller_guardians; friend class controller_bullets; friend class sprite_bullet; friend class controller_balls; private: const static Sint32 table_gga1[8]; //table different size of gigablitz const static Sint32 table_gga2[8]; //table different size of gigablitz /** Strength of the guardian */ Sint32 energy_level; /** Duration of the explosions */ Uint32 explode_delay_counter; /** Delay value before next explision */ Uint32 explode_frequency; Sint32 canon_xcoord; //middle x from where weapons starts /** Counter of delay between two gigablitz */ Uint32 gigablitz_delay_counter; /** Delay value before next gigablitz */ Uint32 gigablitz_frequency; /** Moving speed of the guardian */ Uint32 speed_of_guardian; Sint32 gard_colx1; // fenetre de collision x-mini Sint32 gard_coly1; // fenetre de collision y-mini Sint32 gard_colx2; // fenetre de collision x-maxi Sint32 gard_coly2; // fenetre de collision y-maxi Sint32 gard_ycent; //middle y from where weapons starts /** Counter of delay between two shots */ Uint32 shot_delay_counter; /** Delay value before next shot */ Uint32 shoot_frequency; Sint32 gard_nsbob; //sprite's number Sint32 gard_lissa; //curve's number Sint32 *gard_tfire; //table des pointeurs sur la liste tirs Sint32 gardptfire; // /** Guardian recently touched by a ball if greater than zero */ Uint32 recently_touched; /** Guardian blinks if true */ bool is_blinking ; unsigned char *ptr_lissa1; unsigned char *ptr_lissa2; Sint32 hasardval2; public: sprite_guardian (); ~sprite_guardian (); void initialize (gardlevel * guard, unsigned char *ptLis); void run (Uint32 voffset); private: void fire_bullets (); void startBlitz (); }; #endif tecnoballz-0.93.1/include/sprite_display_scores.h0000664000175000017500000000400212412501751021176 0ustar brunobruno/** * @file sprite_display_scores.h * @brief Sprite wich display text of the score table * @created 2003-04-30 * @date 2007-02-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_display_scores.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_DISPLAY_SCORES__ #define __SPRITE_DISPLAY_SCORES__ class sprite_display_scores; #include "../include/display_text_bitmap.h" #include "../include/sprite_object.h" #include "../include/bitmap_data.h" class sprite_display_scores:public virtual display_text_bitmap, public virtual sprite_object { private: static const Sint32 TEXT_LARGE = 23; //number of characters by lines static const Sint32 TEXT_HAUTE = 12; //number of lines of characters static char scorestext[]; //list of names and score Sint32 width_font; //fonte's width font 8 or 16 Sint32 heightfont; //fonte's height Sint32 space2next; //number of lines to next fonte 9 or 18 bitmap_data *offscreen_text; Sint32 run_offset; Sint32 max_offset; public: sprite_display_scores (); ~sprite_display_scores (); void first_init (Uint32 x_offset = 0); void copyToText (); Sint32 displayTxt (); }; #endif tecnoballz-0.93.1/include/controller_capsules.h0000664000175000017500000000767512412501751020672 0ustar brunobruno/** * @file controller_capsules.h * @brief Capsules controller * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_capsules.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_CAPSULES__ #define __CONTROLLER_CAPSULES__ class controller_capsules; #include "../include/objects_list.h" #include "../include/sprite_capsule.h" #include "../include/controller_paddles.h" #include "../include/controller_balls.h" class controller_capsules:public objects_list < sprite_capsule, controller_capsules > { public: /** X-coordinate of the first capsule in the shop */ static const Sint32 SHOP_XCOORD_CAPSULE = 146; /** Y-coordinate of the first capsule in the shop */ static const Sint32 SHOP_YCOORD_CAPSULE = 2; /** X-coordinate of the indicator capsule in the shop */ static const Sint32 SHIP_XCOORD_INDICATOR = 280; /** Y-coordinate of the indicator capsule in the shop */ static const Sint32 SHIP_YCOORD_INDICATOR = 204; private: /** Paddle selected, used in the cheat mode */ sprite_paddle * paddle_selected; /** Counter time delay before next image */ Sint32 frame_delay; /** Time delay before next image of the animation */ Sint32 frame_period; /** Index of the current image */ Uint32 frame_index; /** Overview capsule of a option in the shop */ sprite_capsule *overview_capsule; /** Counter delay before dropping a penalty/bonus capsule */ Uint32 capsule_delay_counter; /** Appearance frequency of the penalty/bonus capsules */ Uint32 capsule_delay; /** Random list of capsules, bonuses or penalties which can * fall in the current level */ const Uint32 *random_list; /** Counter number of bricks breaked before release a new * bonus caspule bought in the shop */ Uint32 bricks_breaked_count; /** Number of bonus capsules bought in the shop */ Uint32 num_of_caspules_bought; /** Current number of bonus capsules bought in the shop released */ Uint32 capsules_released_count; /** Delay before dropping a bonus capsule bought in the shop */ Uint32 bonus_delay; /** Index of the next bonus capsule of the shopping cart */ Uint32 shopping_cart_index; /** List of the bonus capsules bought in the shop which will fall * regularly to the destruction of bricks */ Sint32 *shopping_cart; /** Cheat keys to enable options in bricks levels, * only under development */ static Sint16 cheat_keys[]; static const Uint16 randomlist[128]; public: controller_capsules (); ~controller_capsules (); void initialize (Uint32 delay, const Uint32* random); void send_capsule_from_brick (brick_redraw * brick); void send_penalty_or_bonus (sprite_ball *ball); void send_penalty_or_bonus (sprite_projectile *blast); void check_if_send_capsule (sprite_ball * ball); void create_shop_sprites_list (); void set_overview_capsule (Uint32 id); void move_in_bricks_level (); void move_in_guardians_level (); void play_animation_in_shop (Uint32 value = 0); void check_cheat_keys (); private: void run_in_bricks_level (sprite_paddle * paddle, Uint32 capsule_id); void run_in_guards_level (sprite_paddle * paddle, Uint32 capsule_id); }; #endif tecnoballz-0.93.1/include/controller_viewfinders.h0000664000175000017500000000313312412501751021361 0ustar brunobruno/** * @file controller_viewfinders.h * @brief Paddles viewfinders controller * @date 2007-02-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_viewfinders.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_VIEWFINDERS__ #define __CONTROLLER_VIEWFINDERS__ class controller_viewfinders; #include "../include/objects_list.h" #include "../include/sprite_paddle.h" #include "../include/controller_paddles.h" class controller_viewfinders:public objects_list < sprite_object, controller_viewfinders > { private: /** List of the paddles */ sprite_paddle ** paddles_list; /** Number of paddles 1 to 4 */ Uint32 num_of_paddles; public: controller_viewfinders (); ~controller_viewfinders (); void initialize (); void run (); }; #endif tecnoballz-0.93.1/include/sprite_ball.h0000664000175000017500000001636612412501751017105 0ustar brunobruno/** * @file sprite_ball.h * @brief The ball sprite * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_ball.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_BALL__ #define __SPRITE_BALL__ class sprite_ball; #include "../include/sprite_object.h" /** Coordinates of the ball on the ejectors */ typedef struct { Sint32 x_coord; Sint32 y_coord; } ball_ejector_coords; #include "../include/sprite_paddle.h" #include "../include/controller_bricks.h" #include "../include/controller_viewfinders.h" #include "../include/controller_ejectors.h" class sprite_ball:public sprite_object { friend class controller_balls; friend class controller_viewfinders; friend class controller_paddles; friend class sprite_money; friend class sprite_gem; friend class controller_guardians; friend class direction; public: /** Different types of ball */ typedef enum { NORMAL, POWER_1, POWER_2 } TYPES_OF_BALL; /** Different sizes of ball */ typedef enum { SIZE_1 = 0, SIZE_2 = 3, SIZE_3 = 6 } SIZES_OF_BALL; /** Width and height of collision of the ball size 1 in low-res */ static const Sint32 WIDTH_1 = 5; /** Width and height of collision of the ball size 2 in low-res */ static const Sint32 WIDTH_2 = 7; /** Width and height of collision of the ball size 3 in low-res */ static const Sint32 WIDTH_3 = 9; /** Left limit of ball in low-res */ static const Sint32 X_MINIMUM = 5; /** Right limit of ball in low-res */ static const Sint32 X_MAXIMUM = 256; /** Top limit of ball in low-res */ static const Sint32 Y_MINIMUM = 0; /** Bottom limit of ball low-res */ static const Sint32 Y_MAXIMUM = 232; /** Previous X coordinate */ Sint32 previous_x_coord; /** Previous Y coordinate */ Sint32 previous_y_coord; private: /** Ball direction from 0 to 64 step 4 * 64 = immobile ball */ Sint32 direction; /** Previous ball direction */ Sint32 previous_direction; /** Delay counter before change ball direction * Avoid the horizontal blockings */ Sint32 change_direction_count; /** The last paddle touched by the ball */ sprite_paddle *paddle_touched; /** Padlle on witch is stuck the ball */ sprite_paddle *stick_paddle; /** Paddle number on which the ball is stuck */ Uint32 sticky_paddle_num; /** Pointer to the current velocities table */ Sint16 *velocities; /** Pointer to the current velocities table */ Sint16 *initial_velocities; /** Pointer to the current points of collision with a brick */ Sint32 *brick_collision_points; /* Strength of ball 1, 2 or 3 to decrease brick strength */ Sint32 strength1; /* Strength of ball 32, 64 or 96 to decrease brick address */ Sint32 strength2; /** Time delay before ejection of the ball */ Sint32 ejector_delay; /** Table of directions possible that a ball can * set when it leave a ejector */ Sint32 *ejector_table; /** Counter before a tilt is possible */ Sint32 tilt_delay_counter; /** Counter delay before accelerating the ball */ Sint32 accelerate_delay_counter; /** Time delay before accelerating the ball */ Sint32 accelerate_delay; /** Delay counter before the ball leaves the paddle */ Sint32 start_delay_counter; /** Initial delay before the ball leaves the paddle */ Sint32 start_delay; /** Direction of the viewfinder when the ball is sticked * on a paddle: from 0 to 13 */ Sint32 viewfinder_direction; /** Counter delay before change direction of the viewfinder */ Sint32 viewfinder_delay; /** Size identfier SIZE_1, SIZE_2 or SIZE_3 */ Sint32 size_id; /** Type of ball NORMAL, POWER_1 or POWER_2 */ Sint32 type; /** Brick's width in pixels 16 or 32 */ Sint32 brick_width; /** Previous hited wall RIGHT_WALL, LEFT_WALL, TOP_WALL or 0 if not */ Sint32 last_hited_wall; /** True if collision point of ball with bricks were corrected */ static bool is_collisions_point_initialized; /** Collision points of the ballz size 1 with a brick */ static Sint32 brick_collision_points_1[8]; /** Collision points of the ballz size 2 with a brick */ static Sint32 brick_collision_points_2[8]; /** Collision points of the ballz size 3 with a brick */ static Sint32 brick_collision_points_3[8]; /** Displacement offsets of speed 1 */ static Sint16 velocities_speed_1[]; /** Displacement offsets of speed 2 */ static Sint16 velocities_speed_2[]; /** Displacement offsets of speed 3 */ static Sint16 velocities_speed_3[]; /** Displacement offsets of speed 1 */ static Sint16 velocities_speed_4[]; /** Coordinates of the balls on the ejectors */ static ball_ejector_coords ejector_coords[]; /** Possible directions of a ball when * a player activates the tilt */ static const Sint32 tilt_directions[16][16]; /** Directions possible that a ball can set when it leave * the top-left ejector */ static Sint32 ball_ejector_1[]; /** Directions possible that a ball can set when it leave * the bottom-left ejector */ static Sint32 ball_ejector_2[]; /** Directions possible that a ball can set when it leave * the bottom-right ejector */ static Sint32 ball_ejector_3[]; /** Directions possible that a ball can set when it leave * the top-right ejector */ static Sint32 ball_ejector_4[]; static Sint32 *ball_ejectors[]; public: sprite_ball (); ~sprite_ball (); static void init_collisions_points (); void once_init (Sint32 start, Sint32 speed, sprite_paddle * paddle, Sint16 * table, Sint32 w); void starts_again (sprite_paddle * paddle); void remove (sprite_paddle * paddle); void init_first_ball (Sint32 h); void duplicate_from (sprite_ball * ball, Uint32 angle); static Sint16 *get_velocities (Sint32 speed); sprite_paddle *get_last_paddle_touched (); void set_power_1 (); void set_power_2 (); void set_size_2 (); void set_size_3 (); void set_maximum_speed (); void enbale_on_ejector (Uint32 eject_id, Uint32 otime); void set_on_ejector (Uint32 eject_id, Uint32 otime = 1); void disable_stick (); void accelerate (); virtual bool collision (sprite_object * sprite); private: void set_initial_values (sprite_paddle * paddle); void select_image (); }; #endif tecnoballz-0.93.1/include/sprite_money.h0000664000175000017500000000426612412501751017316 0ustar brunobruno/** * @file sprite_money.h * @brief The money sprite * @date 2007-04-13 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_money.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_MONEY__ #define __SPRITE_MONEY__ class sprite_money; #include "../include/sprite_object.h" #include "../include/sprite_paddle.h" #include "../include/right_panel_score.h" #include "../include/handler_display.h" #include "../include/controller_bricks.h" #include "../include/sprite_ball.h" #include "../include/sprite_projectile.h" class sprite_money:public sprite_object { friend class controller_moneys; private: /** Toward bottom, right, top, left */ Uint32 towards; /** Amount of money contained in this capsule */ Uint32 money_amount; /** Moving speed in pixels of the money capsule */ Uint32 speed_of_moving; /** Paddle sprite which goes the money caspule */ sprite_paddle *paddle; /** Multiply the amount of money collected in the capsule * by the paddle */ Uint32 money_multiplier; public: sprite_money (); ~sprite_money (); void init_members (); bool enable_if_available (brick_redraw * briPT); bool enable_if_available (sprite_ball * pball); bool enable_if_available (sprite_projectile * pfire); Uint32 move (); Uint32 move_bottom (); private: void init_money (Uint32 xcoord, Uint32 ycoord, sprite_paddle * pad); }; #endif tecnoballz-0.93.1/include/configfile.h0000664000175000017500000000512312412501751016677 0ustar brunobruno/** * @file configfile.h * @brief Config file handler * @created 2005-01-22 * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: configfile.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONFIGFILE__ #define __CONFIGFILE__ #include #ifdef _WIN32 #include #else #include #endif #include #include #include "../include/tecnoballz.h" #include "../include/lispreader.h" #ifdef _WIN32 #define MKDIR(d, p) mkdir(d) #else #define MKDIR mkdir #endif //#ifdef _WIN32 //#define CONFIG_DIR_NAME "tlkgames" //#else //#define CONFIG_DIR_NAME ".tlkgames" //#endif //#define CONFIG_FILE_NAME "tecnoballz.conf" class configfile:public virtual tecnoballz { private: static const std::string CONF_DIR_NAME; static const std::string CONF_FILENAME; typedef enum { LANGUAGE_EN, LANGUAGE_FR, MAX_OF_LANGUAGES } LANGUAGES_ENUM; static const char *language_to_string[MAX_OF_LANGUAGES]; Uint32 language; static char stringname[7]; std::string conf_filename; std::string conf_dirname; //char config_dir[512]; //char configname[512]; char thePlayer1[7]; char thePlayer2[7]; char thePlayer3[7]; char thePlayer4[7]; char thePlayer5[7]; char thePlayer6[7]; char thePlayer7[7]; char *thePlayers[6]; public: configfile (); ~configfile (); void configinfo (); void load (); void save (); Sint32 scan_arguments (Sint32 arg_count, char **arg_values); const char *get_player_name (Uint32 playernum); void set_player_name (Uint32 playernum, const char *name); const char * get_language (); private: bool check_and_create_dir (); void resetvalue (); FILE *fopen_data (const char *rel_filename, const char *mode); void get_fullpathname (); }; #endif tecnoballz-0.93.1/include/controller_gigablitz.h0000664000175000017500000000517212412501751021015 0ustar brunobruno/** * @file controller_gigablitz.h * @brief Gigablitz controller * @date 2007-04-03 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_gigablitz.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_GIGABLITZ__ #define __CONTROLLER_GIGABLITZ__ class controller_gigablitz; #include "../include/sprite_gigablitz.h" #include "../include/list_sprites.h" #include "../include/right_panel_score.h" #include "../include/handler_keyboard.h" #include "../include/controller_viewfinders.h" #include "../include/controller_projectiles.h" #include "../include/handler_players.h" #include "../include/supervisor_bricks_level.h" #include "../include/objects_list.h" #include "../include/controller_bricks.h" #include "../include/controller_explosions.h" class controller_gigablitz:public objects_list < sprite_gigablitz, controller_gigablitz > { friend class sprite_gigablitz; private: static const Uint32 MAX_OF_GIGABLITZ = 7; static Uint32 numeroBOBs[MAX_OF_GIGABLITZ]; sprite_paddle *paddle_bottom; sprite_paddle *paddle_top; sprite_gigablitz *current_gigablitz; Sint32 blitz_colx; Sint32 gigablitz_xcoord; /* Height of the gigablitz in pixels */ Uint32 gigablitz_height; Sint32 bitz_ystop; //"gigablitz" Y max. Sint32 bitz_maxiy; // Sint32 bitz_miniy; // Sint32 blitz_seta; Uint32 num_of_bricks; //width of collison bricks in row Uint32 blitz_xsin; public: controller_gigablitz (); ~controller_gigablitz (); void create_gigablitz_sprites (); void shoot_paddle (); void run_in_bricks_levels (); void collision1 (); void run_in_guardians_level (); bool shoot_guardian (Uint32 id, Sint32 xcoord, Sint32 ycoord, Uint32 width); bool is_enable (); private: void collision_with_paddle (); }; #endif tecnoballz-0.93.1/include/sprite_gigablitz.h0000664000175000017500000000246112412501751020136 0ustar brunobruno/** * @file sprite_gigablitz.h * @brief The sprite of the Gigablitz * @date 2007-02-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_gigablitz.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_GIGABLITZ__ #define __SPRITE_GIGABLITZ__ class sprite_gigablitz; #include "../include/sprite_object.h" #include "../include/objects_list.h" class sprite_gigablitz:public sprite_object { private: public: sprite_gigablitz (); ~sprite_gigablitz (); }; #endif tecnoballz-0.93.1/include/sprite_paddle.h0000664000175000017500000001122112412501751017405 0ustar brunobruno/** * @file sprite_paddle.h * @brief A paddle sprite * @date 2007-10-23 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_paddle.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_PADDLE__ #define __SPRITE_PADDLE__ class sprite_paddle; #include "../include/sprite_object.h" #include "../include/sprite_ball.h" #include "../include/controller_projectiles.h" #include "../include/bitmap_data.h" #include "../include/sprite_bullet.h" #include "../include/controller_gigablitz.h" class sprite_paddle:public sprite_object { friend class controller_paddles; friend class controller_balls; friend class controller_projectiles; friend class sprite_bullet; friend class controller_viewfinders; friend class controller_gigablitz; public: typedef enum { NOT_OWN_GUN, OWN_GUN, FIRE = 3 } FIRE_PADDLE_STATUS; typedef enum { NOT_STICKY_PADDLE, FREE_STICKY_PADDLE, BUSY_STICKY_PADDLE } STICKY_PADDLE_STATUS; private: /** Paddle is enabled if the counter is greater than zero */ Uint32 enable_counter; /** True if the paddle is vertical, otherwise horizontal */ bool is_vertical; /** Paddle number from 0 to 5 */ Uint32 paddle_number; /** Paddle length in pixels */ Uint32 length; /** Minimum with of the paddle 32 or 64 pixels */ Uint32 width_mini; /** Maximum with of the paddle 64 or 128 pixels */ Uint32 width_maxi; /** Shift binary right value (3 or 4) used to convert the length to * convert the paddle's length in a interger from 0 to 6 */ Sint32 shift_width; /** Fire state: NOT_OWN_GUN, OWN_GUN, or FIRE */ Sint32 fire_state; /** Stick paddle state: NOT_STICKY_PADDLE, FREE_STICKY_PADDLE, or * BUSY_STICKY_PADDLE */ Uint32 sticky_state; const Sint32 **rebonds_Ga; //ball rebounds table (move on the left) const Sint32 **rebonds_Dr; //ball rebounds table (move on the right) /** Current directions used for bounce a ball */ const Sint32 *current_bounces; Sint32 *direct_tab; // table direction si la balle collee /** Current stuck ball, NULL if not */ sprite_ball *stuck_ball; /** If true the paddle touched a ball */ bool is_hit_ball; /** Paddle is invinciblei f the counter is greater than zero * available only in the guadians phase */ Sint32 invincible_counter; /** Counter used to blink the padde when it is invincible */ Sint32 blink_counter; /** Used for fire power 1 or fire power 2 */ controller_projectiles *projectiles; /** Used to increase x-coord of a projectile */ Sint32 projectile_xinc0; /** Used to increase y-coord of a projectile */ Sint32 projectile_yinc0; /** Used to increase x-coord of a projectile */ Sint32 projectile_xinc1; /** Used to increase y-coord of a projectile */ Sint32 projectile_yinc1; /** Used to increase x-coord of a projectile */ Sint32 projectile_xinc2; /** Used to increase y-coord of a projectile */ Sint32 projectile_yinc2; /** X-coordinate of center of the circle fire (fire 7) */ Sint32 projectile_xcenter; /** Y-coordinate of center of the circle fire (fire 7) */ Sint32 projectile_ycenter; /** x-offset used for the fire 6 */ Sint32 projectile_xoffset; /** x-offset used for the fire 6 */ Sint32 projectile_yoffset; public: sprite_paddle (bool has_projectiles = true); ~sprite_paddle (); void create_projectiles_list (); void fire_projectiles (); void move_projectiles (); void enable_if_ok (bool is_team, Sint32 size, Uint32 counter); void set_width (Uint32 size); void set_height (Uint32 h); void select_image (Uint32 size); void select_image (); Uint32 get_paddle_number (); void set_glue (); void set_fire_1 (); void set_fire_2 (); void release_ball (); void stick_ball (sprite_ball * ball); Uint32 get_length (); bool is_invincible (); void set_invincibility (Sint32 delay); void blink (); }; #endif tecnoballz-0.93.1/include/controller_game_over.h0000664000175000017500000000416212412501751021003 0ustar brunobruno/** * @file controller_game_over.h * @brief Game Over controller * @created 2002-12-14 * @date 2007-09-25 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_game_over.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_GAME_OVER__ #define __CONTROLLER_GAME_OVER__ class controller_game_over; #include "../include/sprite_object.h" #include "../include/objects_list.h" #include "../include/sprite_display_scores.h" class controller_game_over:public objects_list < sprite_object, controller_game_over > { private: /** Phase number: 0, 1, 2 or 3 */ Uint32 move_phase; /** Delay counter before next phase */ Uint32 next_phase_counter; sprite_display_scores *sprite_high_score; /** X offset of the chars */ Sint32 char_x_offset; static const Sint32 SIZETSINUS = 200; static const Sint32 sinus_over[SIZETSINUS]; static const Sint32 initial_coordinates[]; private: void displacement_01 (); void displacement_02 (); void displacement_03 (); void displacement_04 (); public: controller_game_over (); ~controller_game_over (); sprite_display_scores *get_sprite_high_score (); void first_init (Uint32 x_offset = 0); void enable_game_over (bool is_victory); void run (bool is_victory = false); }; #endif tecnoballz-0.93.1/include/controller_font_menu.h0000664000175000017500000000343312412501751021031 0ustar brunobruno/** * @file controller_font_menu.h * @brief Controller of the menu scroll text * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_font_menu.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER__FONTS_MENU__ #define __CONTROLLER__FONTS_MENU__ #include "../include/objects_list.h" #include "../include/sprite_font_menu.h" class controller_font_menu:public objects_list < sprite_font_menu, controller_font_menu > { private: /** Numbers maximum characters */ static const Uint32 MAX_OF_FONTS = 14; static char asciiToBob[128]; private: sprite_font_menu * characters_list[MAX_OF_FONTS + 2]; sprite_font_menu *objectLeft; sprite_font_menu *objectRigh; sprite_font_menu **object_ptr; char *scroll_ptr; Sint32 offset_xx1; Sint32 offset_yy1; char* scrollText; char** scrolltexts; public: controller_font_menu (); ~controller_font_menu (); void create_fontes_list (); void move_chars (); }; #endif tecnoballz-0.93.1/include/handler_popup_menu.h0000664000175000017500000000622112412501751020456 0ustar brunobruno/** * @file handler_popup_menu.h * @brief popup menu handler (When the [Esc] is pressed) * @created 2004-08-08 * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_popup_menu.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER_POPUP_MENU__ #define __HANDLER_POPUP_MENU__ class handler_popup_menu; #include "../include/tecnoballz.h" #include "../include/display_text_bitmap.h" #include "../include/sprite_object.h" #include "../include/handler_menu_events.h" class handler_popup_menu:public virtual display_text_bitmap, public virtual sprite_object { private: /** Object handle events of the menu */ handler_menu_events* menu_events; /** Pointer to the text file loaded */ char **texts_of_menus; /** Offscreen used to draw the box menu */ bitmap_data * screen_menu; /** Number of columns of the menu: 25 chars per line */ Uint32 num_of_columns; /** Number of lines of the current menu: 3 or 4 lines */ Uint32 num_of_lines; /** Space between lines in pixels */ Uint32 vertical_space; /** Current index of the first color of the line * under the mouse cursor */ Uint32 menu_first_color_index; /** True if restore background when leave menu */ bool is_restore_background; /** Current menu enabled 0 or 1 */ Uint32 menu_number; /** Center x-coordinate of the menu */ Uint32 menu_xcenter; public: /** List of items avaiblables in the menu */ typedef enum { CONTINUE_PLAY_CURRENT = 1, CAUSE_GAME_OVER, QUIT_TO_MAIN_MENU, QUIT_TECNOBALLZ } MENU_ITEMS_ENUM; /** String indexes */ typedef enum { MENU_00, MENU_01 = 4, MAX_OF_LINES = 7 } MENU_TEXTS_ENUM; /** Number maximum of chars by line */ static const Uint32 MAX_OF_CHARS = 25; public: handler_popup_menu (); ~handler_popup_menu (); void first_init (bitmap_data * bmp); Sint32 run (); private: void initialize_palette(); void build_menu_box(bitmap_data * bmp, Uint32 width); void load_text_file(); void draw (char *source, Sint32 xcoord, Sint32 ycoord, Sint32 raw_src, Sint32 width, Sint32 height); void display_640 (); void display_320 (); static const unsigned char cycling_table[]; static char **menu_texts_pt[2]; }; #endif tecnoballz-0.93.1/include/handler_keyboard.h0000664000175000017500000001370512412501751020074 0ustar brunobruno/** * @file handler_keyboard.h * @brief Handler of the keyboard and mouse * @date 2012-10-13 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_keyboard.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER_KEYBOARD__ #define __HANDLER_KEYBOARD__ #include "../include/tecnoballz.h" class handler_keyboard:public virtual tecnoballz { public: static const Sint32 NULL_YCOORD = -10240; private: #ifdef TECNOBALLZ_GP2X /* GP2X button codes, as received through SDL joystick events */ typedef enum { GP2X_BUTTON_UP, GP2X_BUTTON_UPLEFT, GP2X_BUTTON_LEFT, GP2X_BUTTON_DOWNLEFT, GP2X_BUTTON_DOWN, GP2X_BUTTON_DOWNRIGHT, GP2X_BUTTON_RIGHT, GP2X_BUTTON_UPRIGHT, GP2X_BUTTON_START, GP2X_BUTTON_SELECT, GP2X_BUTTON_R, GP2X_BUTTON_L, GP2X_BUTTON_A, GP2X_BUTTON_B, GP2X_BUTTON_Y, GP2X_BUTTON_X, GP2X_BUTTON_VOLUP, GP2X_BUTTON_VOLDOWN, GP2X_BUTTON_CLICK, GP2X_NUM_BUTTONS } GP2X_BUTTONS_CODE; /* The current state of all the GP2X buttons is stored in * this array - used to handle multi-key actions */ static bool gp2x_buttons[GP2X_NUM_BUTTONS]; #endif #ifdef TECNOBALLZ_PSP /* PSP button codes, as received through SDL joystick events */ typedef enum { PSP_BUTTON_Y, PSP_BUTTON_B, PSP_BUTTON_A, PSP_BUTTON_X, PSP_BUTTON_L, PSP_BUTTON_R, PSP_BUTTON_DOWN, PSP_BUTTON_LEFT, PSP_BUTTON_UP, PSP_BUTTON_RIGHT, PSP_BUTTON_SELECT, PSP_BUTTON_START, PSP_NUM_BUTTONS } PSP_BUTTONS_CODE; static bool psp_buttons[PSP_NUM_BUTTONS]; #endif typedef enum { IJOY_LEFT = 1, IJOY_RIGHT, IJOY_TOP, IJOY_DOWN, IJOY_FIRE, IJOY_RELEASE, IJOY_GIGABLITZ, IJOY_OPTION } JOYCODE_ENUM; public: typedef enum { COMMAND_KEY_PAUSE, QUIT_TECNOBALLZ, QUIT_TO_MAIN_MENU, CAUSE_GAME_OVER, TOGGLE_AUDIO, TOGGLE_SOUND, TOGGLE_MUSIC, TOGGLE_FULLSCREEN, TOGGLE_POPUP_MENU, DISABLE_TIMER, VOLUME_DOWN, VOLUME_UP, NUMOF_COMMAND_KEYS } COMAND_KEYS_ENUM; typedef enum { K_LEFT, K_RIGHT, K_UP, K_DOWN, K_RELEASE_BALL, K_FIRE, K_GIGABLITZ, K_VOLUME_UP, K_VOLUME_DOWN, K_MAXOF } KEY_CODES_ENUM; private: static bool last_command_keys[NUMOF_COMMAND_KEYS]; static bool command_keys[NUMOF_COMMAND_KEYS]; /** Predefinded keys to control the paddle */ static Uint32 key_codes[K_MAXOF]; static handler_keyboard *keyboard_singleton; private: /** True if grabs mouse and keyboard input */ bool is_grab_input; /** Number of available joysticks */ Uint32 numof_joysticks; SDL_Joystick **sdl_joysticks; bool joy_fire; bool joy_release; bool joy_gigablitz; bool joy_option; bool joy_left; bool joy_right; bool joy_top; bool joy_down; Uint32 joy_code_down; Uint32 joy_code_down_prev; Uint32 joy_up; Sint32 input_joy_tempo; Sint32 mouse_x_offset; Sint32 mouse_y_offset; /* x and y coordinates of the mouse pointer */ Sint32 mouse_x_coord; Sint32 mouse_y_coord; bool is_left_button_down; bool is_right_button_down; bool is_middle_button_down; bool is_left_button_released; bool is_right_button_released; /* keyboard input delay */ Sint32 key_delay; Uint32 key_code_down; Uint32 previous_key_code_down; Uint32 code_keyup; /* cursor position into input string */ Sint32 string_cursor_pos; /* input string size */ Sint32 string_input_size; /* pointer to the current input string */ char *current_input_string; bool is_key_waiting; Sint32 wait_key_pressed; private: handler_keyboard (); #ifdef TECNOBALLZ_HANDHELD_CONSOLE void handle_console_buttons (SDL_Event * event); #endif public: ~handler_keyboard (); static handler_keyboard *get_instance (); void set_grab_input (bool mode); void read_events (); void clear_command_keys (); bool command_is_pressed (Uint32 code, bool clear = false); bool is_left_button (); bool is_right_button (); bool is_gigablitz_or_tilt (); //bool is_right_left_buttons (); bool is_left_button_up (Sint32 * off_x, Sint32 * off_y); bool is_right_button_up (Sint32 * off_x, Sint32 * off_y); Sint32 get_mouse_x_offset (); Sint32 get_mouse_y_offset (); Sint32 get_mouse_x (); Sint32 get_mouse_y (); bool key_is_pressed (Sint32 code); bool key_is_released (Sint32 code); bool control_is_pressed (Uint32 code); void set_input_string (char *str, Uint32 size); Sint32 get_input_cursor_pos (); void stop_string_input (); Uint32 get_key_down_code (); bool wait_key (); private: void toggle_popup_menu (); void toggle_pause (); void init_joysticks (); void set_joy (Uint32 code); void clr_joy (Uint32 code); void input_string (); void input_string (Uint32 code); void set_key_code_down (Uint32 code); void set_keycode_up (Uint32 code); }; #endif tecnoballz-0.93.1/include/sprite_ship.h0000664000175000017500000000654712412501751017136 0ustar brunobruno/** * @file sprite_ship.h * @brief A flying enemy ships sprite * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_ship.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_SHIP__ #define __SPRITE_SHIP__ class sprite_ship; #include "../include/sprite_object.h" #include "../include/handler_audio.h" #include "../include/controller_moneys.h" #include "../include/controller_capsules.h" #include "../include/controller_gems.h" #include "../include/sprite_projectile.h" #include "../include/sprite_ball.h" #include "../include/controller_bricks.h" enum { CODE_GEMME, CODE_MALUS, CODE_MONEY }; class sprite_ship:public sprite_object { friend class controller_ships; friend class sprite_projectile; friend class controller_balls; private: static const Sint32 ATOM_XMINI = 32; static const Sint32 ATOM_XMAXI = 191; static const Sint32 ATOM_YMINI = 40; static const Sint32 ATOM_YMAXI = 191; static const Sint32 ATOM_ANIMA = 8; private: /** Strength delay counter */ Sint32 strength; /** Initial strength delay */ Sint32 strength_initial; Sint32 x_offset; // offset X Sint32 y_offset; // offset Y Sint32 atom_count; // trajectory change counter Sint32 atom_ghost; // pointer on "tableGhost" Sint32 *tableGhost; // table time keep same trajectory /** counter activation, if 0 ship is enabled */ Sint32 enable_counter; /** True if the ship exploding */ bool is_exploding; Sint32 atom_oexpl; // number of the first image's explosion Sint32 atom_traje; // pointeur sur la trajectoir Sint32 apparition; // time before reactivation Sint32 atom_xmini; Sint32 atom_xmaxi; Sint32 atom_ymini; Sint32 atom_ymaxi; Sint32 collisionT[8]; static Sint32 ghostWait1[16]; static Sint32 ghostWait2[16]; static Sint32 ghostWait3[16]; static Sint32 ghostWait4[16]; static Sint32 *ghost_wait[4]; static Sint32 ghost_traj[32]; static Sint32 ghost_bobs[32]; // index animations images of sprites static Sint32 bonus_or_penalty[16]; public: sprite_ship (); ~sprite_ship (); void move (); void littleInit (Sint32 time0, Sint32 appar, Sint32 index, Sint32 power, Sint32 pos_x, Sint32 pos_y, Sint32 offst); void destroy (sprite_projectile *); void destroy (sprite_ball *); void explode (); private: bool is_collisions_with_bricks (Uint32 xcoord, Uint32 ycoord); }; #endif tecnoballz-0.93.1/include/sprite_capsule.h0000664000175000017500000001322412412501751017615 0ustar brunobruno/** * @file sprite_capsule.h * @brief The capsule sprite which contains a bonus or a penalty * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_capsule.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_CAPSULE__ #define __SPRITE_CAPSULE__ class sprite_capsule; #include "../include/sprite_object.h" #include "../include/sprite_paddle.h" #include "../include/right_panel_score.h" #include "../include/handler_display.h" #include "../include/sprite_projectile.h" /* const Sint32 NUM_OF_IMAGES = 7; const Sint16 NO_IMAGE = -1; const Sint16 IMAGE_EXPAND_PADDLE = 0 * NUM_OF_IMAGES; const Sint16 IMAGE_SHRINK_PADDLE = 1 * NUM_OF_IMAGES; const Sint16 IMAGE_EXTRA_LIFE = 2 * NUM_OF_IMAGES; const Sint16 IMAGE_EXPAND_PADDLE = 3 * NUM_OF_IMAGES; const Sint16 IMAGE_POWER_BALL_1 = 4 * NUM_OF_IMAGES; const Sint16 IMAGE_POWER_BALL_2 = 5 * NUM_OF_IMAGES; const Sint16 IMAGE_EXTRA_BALLS = 6 * NUM_OF_IMAGES; const Sint16 IMAGE_MULTI_BALLS = 7 * NUM_OF_IMAGES; const Sint16 IMAGE_FIRE_POWER_1 = 8 * NUM_OF_IMAGES; const Sint16 IMAGE_GLUE = 9 * NUM_OF_IMAGES; const Sint16 IMAGE_INVERSE_CONTROL = 10 * NUM_OF_IMAGES; const Sint16 IMAGE_FIRE_POWER_2 = 11 * NUM_OF_IMAGES; const Sint16 IMAGE_BALL_SIZE_2 = 12 * NUM_OF_IMAGES; const Sint16 IMAGE_BALL_SIZE_3 = 13 * NUM_OF_IMAGES; const Sint16 IMAGE_CHANCE = 14 * NUM_OF_IMAGES; const Sint16 IMAGE_ENABLE_HUGELY_OPTIONS = 15 * NUM_OF_IMAGES; const Sint16 IMAGE_BOTTOM_WALL = 16 * NUM_OF_IMAGES; const Sint16 IMAGE_ROBOT_PADDLE = 17 * NUM_OF_IMAGES; const Sint16 IMAGE_BALLS_CONTROL = 18 * NUM_OF_IMAGES; const Sint16 IMAGE_PADDLE_INVINCIBILITY = 19 * NUM_OF_IMAGES; */ class sprite_capsule:public sprite_object { friend class controller_capsules; friend class supervisor_shop; public: static const Uint32 NUM_OF_IMAGES = 7; typedef enum { GAD_VIDE00 = 0, GLUE = 2, NEXT_LEVEL = 4, /** Paddle invincibility capsule is available only * in the guardians level */ PADDLE_INVINCIBILITY = 4, FIRE_POWER_1 = 6, FIRE_POWER_2 = 8, SHRINK_PADDLE = 10, EXPAND_PADDLE = 12, LOSE_A_LIFE = 14, EXTRA_LIFE = 16, EXTRA_BALLS = 18, MULTI_BALLS = 20, POWER_BALL_1 = 22, POWER_BALL_2 = 24, INVERSE_CONTROL = 26, /** The "rebuild wall" option is not associated with a capsule, * but it is available only in the shop */ REBUILD_THE_WALL = 28, /** The "maximum speed of balls" option is not associated with * a capsule, but is only available as a part of chance capsule */ MAXIMUM_SPEED_OF_BALLS = 30, ENABLE_BOTTOM_PADDLE = 32, ENABLE_RIGHT_PADDLE = 34, ENABLE_TOP_PADDLE = 36, ENABLE_LEFT_PADDLE = 38, BALL_SIZE_2 = 40, BALL_SIZE_3 = 42, CHANCE = 44, ENABLE_HUGELY_OPTIONS = 46, /** The "set to the prices to 1" option is not associated with a * capsule, but is only available as a part of chance capsule */ SET_THE_PRICES_TO_1 = 48, BOTTOM_WALL = 50, ROBOT_PADDLE = 52, BALLS_CONTROL = 54, MAGNETIC_EYE = 56, LESS_BRICKS = 58, SOME_INFOS = 60, LEAVE_SHOP = 62 } CASPULES_ENUM; private: typedef enum { NO_IMAGE = -1, IMAGE_EXPAND_PADDLE = 0 * NUM_OF_IMAGES, IMAGE_SHRINK_PADDLE = 1 * NUM_OF_IMAGES, IMAGE_EXTRA_LIFE = 2 * NUM_OF_IMAGES, IMAGE_LOSE_A_LIFE = 3 * NUM_OF_IMAGES, IMAGE_POWER_BALL_1 = 4 * NUM_OF_IMAGES, IMAGE_POWER_BALL_2 = 5 * NUM_OF_IMAGES, IMAGE_EXTRA_BALLS = 6 * NUM_OF_IMAGES, IMAGE_MULTI_BALLS = 7 * NUM_OF_IMAGES, IMAGE_FIRE_POWER_1 = 8 * NUM_OF_IMAGES, IMAGE_GLUE = 9 * NUM_OF_IMAGES, IMAGE_INVERSE_CONTROL = 10 * NUM_OF_IMAGES, IMAGE_FIRE_POWER_2 = 11 * NUM_OF_IMAGES, IMAGE_BALL_SIZE_2 = 12 * NUM_OF_IMAGES, IMAGE_BALL_SIZE_3 = 13 * NUM_OF_IMAGES, IMAGE_CHANCE = 14 * NUM_OF_IMAGES, IMAGE_ENABLE_HUGELY_OPTIONS = 15 * NUM_OF_IMAGES, IMAGE_BOTTOM_WALL = 16 * NUM_OF_IMAGES, IMAGE_ROBOT_PADDLE = 17 * NUM_OF_IMAGES, IMAGE_BALLS_CONTROL = 18 * NUM_OF_IMAGES, IMAGE_PADDLE_INVINCIBILITY = 19 * NUM_OF_IMAGES } images_enum; /** Capsule direction: BOTTOM_PADDLE, RIGHT_PADDLE, TOP_PADDLE, * or LEFT_PADDLE */ Uint32 towards; Uint32 capsule_identifier; sprite_paddle *paddle; static const Sint16 gagdetBrik[]; static const Sint16 gagdetGuar[]; public: sprite_capsule (); ~sprite_capsule (); void init_members (); void enable_indicator_capsule (Uint32 id); void enable_capsule (brick_redraw * brick, Uint32 id); void enable_capsule (sprite_ball * ball, Uint32 id); void enable_capsule (sprite_projectile * blast, Uint32 id); void enable_guardian_capsule (sprite_ball * ball, Uint32 id); void set_in_shop (Uint32 id); void clone_from_capsule (sprite_capsule * capsule); Uint32 get_id (); sprite_paddle *move (); private: void set_new_capsule (Uint32 id, const Sint16 *frames, Uint32 xcoord, Uint32 ycoord, sprite_paddle *pad); void enable_capsule (Uint32 index); }; #endif tecnoballz-0.93.1/include/handler_audio.h0000664000175000017500000001272412412501751017375 0ustar brunobruno/** * @file handler_audio.h * @brief Handler of the sound and music * @created 2004-03-22 * @date 2012-09-06 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_audio.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ //#define SOUNDISOFF if define, don't compile handler_audio.cc #ifndef SOUNDISOFF #ifndef __AUDIOMIXER__ #define __AUDIOMIXER__ #include #include #include class handler_audio; #include "tecnoballz.h" /** Module's positions in a area music */ typedef struct { /** First music of a bricks level */ Uint32 music_1; /** Restart first music */ Uint32 music_1_loop; /** Second music of a bricks level */ Uint32 music_2; /** Restart second music */ Uint32 music_2_loop; /** bricks level completed */ Uint32 level_completed; /** Lost ball in bricks level */ Uint32 pos_losing; /** Shop music */ Uint32 shop_music; } musics_pos; class handler_audio:public virtual tecnoballz { private: static const Uint32 VOLUME_INC = MIX_MAX_VOLUME / 16; public: /* Differents portions in a area music */ typedef enum { MUSIC_UNDIVIDED, GAME_PORTION, WIN_PORTION, LOST_PORTION, SHOP_PORTION, MUSIC_IS_OFF } MUSIC_PORTIONS; /** Enumeration of all the musics */ typedef enum { MUSICAREA1, MUSICAREA2, MUSICAREA3, MUSICAREA4, MUSICAREA5, MUSICGUARD, MUSICSCORE, MUSICGOVER, MUSICINTRO, MUSICCONGR, TERMIGATOR_MUSIC, IN_GAME_MUSIC, FRIDGE_IN_SPACE_MUSIC, MON_LAPIN_MUSIC } MUSIC_ENUM; /** Enumeration of all the sound effects */ typedef enum { LOST_LIFE, PADDLE_EXPLOSION, EXTRA_LIFE, /** Collect money or gem */ COLLECT_MONEY, TILT_ALARM, /** Collect penalty or bonus capsule */ COLLECT_CAPSULE, /** Vocal "tecnoball" */ TECNOBALL, SHIP_APPEAR, /** Paddle transformation */ PADDLE_TRANSFORMATION, GUARDIAN_FIRE, PADDLE_FIRE, /** Guardian's explosion */ BIG_EXPLOSION, DESTROY_INDESTRUCTIBLE_BRICK, SHIP_EXPLODE, HIT_GUARDIAN, HIT_SHIP, HIT_INDESTRUCTIBLE_BRICK1, HIT_INDESTRUCTIBLE_BRICK2, BALL_HIT_PADDLE, BALL_HIT_SIDE, BALL_HIT_BRICK1, BALL_HIT_BRICK2, BALL_HIT_BRICK3, BALL_HIT_BRICK4, BALL_HIT_BRICK5, EJECTOR_OUT, ECJECTOR_IN, NUM_OF_SOUNDS } SOUNDS_ENUM; public: /* true if SDL_mixer is enable */ static bool is_audio_enable; private: handler_audio (); public: ~handler_audio (); static handler_audio *get_instance (); void stop_music (); void play_music (Uint32 music_id); void run (); void play_level_music (Uint32 area_num, Uint32 level_num); void play_shop_music (Uint32 area_num); void play_win_music (); void play_lost_music (); void stop_lost_music (); bool is_win_music_finished (); Uint32 get_portion_music_played (); void play_sound (Uint32 sound_num); void disable_sound (); void enable_sound (); private: void sound_volume_ctrl (); void query_spec (); Uint32 area_music (Uint32); void initialize (); void control_music_position (); void play_requested_sounds (); private: static handler_audio *audio_singleton; static char sounds_play[NUM_OF_SOUNDS]; static Mix_Chunk *sound_list[]; static const musics_pos ptMusicpos[]; private: /** Current area number (1 to 5) */ Uint32 area_number; /** Current level number (1 to 12) */ Uint32 level_number; /** Position of the first music of a bricks level * in the Protraker module */ Sint32 music_1_position; /** Position of the restart of the current music in * the Protraker module */ Sint32 restart_position; /** Position of the second music of a bricks level * in the Protraker module */ Sint32 music_2_position; /** Part of the music module currently played: GAME_PORTION, * WIN_PORTION, LOST_PORTION or SHOP_PORTION */ Uint32 current_portion_music; /** True if only the music must be played, * and not the sound effects, during the phases of intro, * shop and game over */ bool is_only_music; /* True if the music is enabled * [Ctrl] + [D] or [Ctrl +[S] keys toggle the music on and off */ bool is_music_enable; /** True if sound effect are enabled. [Ctrl] + [F] or * [Ctrl] + [S] keys toggle the sound effects on and off */ bool is_sound_enable; /** Current music volume */ Uint32 music_volume; /** Current audio channel volume */ Uint32 channels_volume; /** Identifier of the current music loaded and played */ Sint32 current_music_id; /** Pointer to the current music loaded and played */ Mix_Music *current_music; /** Pointer to the Amiga song module (Protracker format) */ MODULE *song_module; /** Size of all waves used for sounds effect */ Uint32 waves_size; /** Current position in the Protraker module */ Sint32 song_pos; }; #endif #endif tecnoballz-0.93.1/include/controller_guardians.h0000664000175000017500000000636012412501751021016 0ustar brunobruno/** * @file controller_guardians.h * @brief Guardians controller * @created 2003-01-10 * @date 2007-04-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_guardians.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_GUARDIANS__ #define __CONTROLLER_GUARDIANS__ class controller_guardians; #include "../include/tecnoballz.h" /** * Structure of a guardan parameters */ typedef struct { Sint32 para_power; // resistance Sint32 para_xcent; // centre X depart tir Sint32 para_waitf; // frequence tir gigaBlitz Sint32 para_speed; // vitesse de deplacement Sint32 para_colx1; // fenetre de collision x-mini Sint32 para_coly1; // fenetre de collision y-mini Sint32 para_colx2; // fenetre de collision x-maxi Sint32 para_coly2; // fenetre de collision y-maxi Sint32 para_ycent; // centre Y dpart tir Sint32 para_wait2; // frequence tir Sint32 para_nsbob; // numero du BOB Sint32 para_lissa; // numero de la courbe Sint32 para_tfire[16]; // table des pointeurs sur la liste tirs } gardlevel; #include "../include/sprite_guardian.h" #include "../include/list_sprites.h" #include "../include/objects_list.h" #include "../include/controller_bullets.h" #include "../include/sprite_ball.h" class controller_guardians:public objects_list < sprite_guardian, controller_guardians > { friend class sprite_guardian; private: unsigned char *getLissaPt (Sint32 lissa); void set_gauge_height (); public: controller_guardians (); ~controller_guardians (); void create_guardians_list (Sint32 grdPt); void run (); void killguards (Sint32 numGa = 0); bool is_guardians_destroyed (); Sint32 get_scrolling_speed (Uint32, Sint32, sprite_ball *, sprite_bullet *); private: Sint32 scrollTemp; //use for scroll background Sint32 offset_ptr; unsigned char *displacement_curve; sprite_object **life_gauges_list; public: static Sint32 level2gdpt (Uint32 arean, Uint32 level); private: static gardlevel guard_list[]; static Sint32 level_list[]; static const char offzetbyte[256]; typedef enum { LISSA_NB01, LISSA_NB02, LISSA_NB03, LISSA_NB04, LISSA_NB05, LISSA_NB07, LISSA_NB08, LISSA_NB09, LISSA_NB11, LISSA_NB12, LISSA_NB13, LISSA_NB15 } CURVE_ID; }; #endif tecnoballz-0.93.1/include/list_sprites.h0000664000175000017500000000305412412501751017317 0ustar brunobruno/** * @file list_sprites.h * @brief Call the drawing methods of all sprites * @date 2007-09-15 * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: list_sprites.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __LIST_SPRITES__ #define __LIST_SPRITES__ class list_sprites; #include "../include/sprite_object.h" #include "../include/tecnoballz.h" class list_sprites:public tecnoballz { private: Sint32 num_of_shapes; Sint32 num_of_shadows; Sint32 max_of_shapes; sprite_object **shapes; sprite_object **shadows; public: list_sprites (); ~list_sprites (); void init (Uint32 numof); void reset (); Uint32 get_sprites_remaining (); void add (sprite_object * sprite); void draw (); void clear (); }; extern list_sprites *sprites; #endif tecnoballz-0.93.1/include/sprite_font_game.h0000664000175000017500000000356012412501751020122 0ustar brunobruno/** * @file sprite_font_game.h * @brief The sprite font used to display a char of the * "LEVEL COMPLETED" string * @date 2007-10-17 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_font_game.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_FONTE_GAME__ #define __SPRITE_FONTE_GAME__ class sprite_font_game; #include "../include/sprite_object.h" class sprite_font_game:public sprite_object { friend class controller_font_game; private: /** Radius value from 0 to 511, index on a sinus table */ Uint32 current_radius; /** Final y-coordinate */ Sint32 ycoord_current; /** Final x-coordinate */ Sint32 xcoord_final; /** X increase: 1, -1, or 0 */ Sint32 x_inc; /** Y increase: -12 or -16 */ Sint32 y_inc; /** Final y-coordinate */ Sint32 ycoord_final; public: sprite_font_game (); ~sprite_font_game (); void initialize (Uint32 radius, Sint32 x_stop, Sint32 y_start, Sint32 xinc, Sint32 yinc, Sint32 y_stop); void move (); }; #endif tecnoballz-0.93.1/include/controller_ships.h0000664000175000017500000000342312412501751020164 0ustar brunobruno/** * @file controller_ships.h * @brief Ship controller * @date 2007-02-13 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_ships.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_SHIPS__ #define __CONTROLLER_SHIPS__ class controller_ships; #include "../include/list_sprites.h" #include "../include/sprite_ship.h" #include "../include/objects_list.h" #include "../include/handler_display.h" #include "../include/controller_moneys.h" #include "../include/controller_gems.h" #include "../include/controller_bricks.h" class controller_ships:public objects_list < sprite_ship, controller_ships > { friend class sprite_ship; private: Sint32 apparition[4]; Sint32 reappTemps; Sint32 power_init; public: controller_ships (); ~controller_ships (); void initialise (Sint32 time0, Sint32 time1, Sint32 time2, Sint32 time3, Sint32 time4, Sint32 power); void move (); void force_explosion (); }; #endif tecnoballz-0.93.1/include/handler_display.h0000664000175000017500000001053312412501751017735 0ustar brunobruno/** * @file handler_display.h * @briefi Handle displaying and updating with SDL * @created 2002-08-17 * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_display.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __HANDLER_DISPLAY__ #define __HANDLER_DISPLAY__ #include "../include/tecnoballz.h" #include "../include/offscreen_surface.h" class handler_display:public virtual tecnoballz { public: static const Sint32 SHADOWOFFX = -4; static const Sint32 SHADOWOFFY = 4; static const unsigned char SHADOW_PIX = 0x80; static const Uint32 SHADOWLONG = 0x80808080; /** True if full screen mode */ static bool optionfull; /** True if synchronisation */ static bool optionsync; private: static const Uint32 bitspixels = 8; static const Sint32 DELAY_CHANGE_MAX = 10; Sint32 offsetplus; /** The main surface of the game */ SDL_Surface *game_surface; /** Pointer to pixels of the game offscreen */ char *game_screen_pixels; /** Size of a line in bytes of the game and background offscreens */ Sint32 game_screen_pitch; /** Pointer to pixels of the background offscreen */ char *background_pixels; /** Main window surface */ SDL_Surface *sdl_screen; /** The width of our main window in pixels */ Uint32 window_width; /** The height of our main window in pixels */ Uint32 window_height; /** The number of milliseconds since the SDL library initialization */ Uint32 previous_sdl_ticks; /** Current frames per seconde or frames frequency */ Uint32 frames_per_second; /** Amount of ticks for calculate the number of frames per second */ Uint32 sdl_ticks_amount; /** Counter of frame modulo 100 */ Uint32 frames_counter_modulo; /** Number of frame during the "delay_value" is used */ Sint32 delay_change_counter; /** Delay value for SDL_delay() */ Sint32 delay_value; /** game speed, the desired frames per second 20 <=> 50 fps */ Sint32 game_speed; /** Amount of ticks for calculate "delay_value" */ Sint32 delay_ticks_amount; /** The window tile and icon name */ static char window_title[25]; /** Current indexed color palette of the game */ SDL_Color sdl_palette[256]; /** Value of the vertical shift of the screen * when the player tilts */ Uint32 tilt_offset; public: handler_display (); ~handler_display (); void initialize (); Uint32 get_width (); Uint32 get_height (); void lock_surfaces (); void unlock_surfaces (); Uint32 get_bits_per_pixel (); void wait_frame (); Uint32 get_frames_per_second (); Sint32 ecran_next (Sint32 zbase, Sint32 offsx, Sint32 offsy); // gestion des buffers & des tampons void aff_buff32 (char *src, char *dest, Sint32 offs, Sint32 offd); void buf_affx32 (char *srcPT, char *desPT, Sint32 width, Sint32 heigh = 32); void buf_affx64 (char *srcPT, char *desPT, Sint32 width, Sint32 heigh = 64); void buf_clr64 (char *desPT); void enable_palette (unsigned char *adrPal); void enable_palette (SDL_Color * adrPal); void window_update (); SDL_Color *get_palette (); void clr_shadow (Sint32 offst, Sint32 large, Sint32 haute); void clr_shadow (Sint32 _iPosX, Sint32 _iPosY, Sint32 _iLarg, Sint32 _iHaut); void set_shadow (Sint32 offst, Sint32 large, Sint32 haute); void tilt_screen (); void set_color_gradation (); private: void get_info (); void set_video_mode (); void check_if_toggle_fullscreen (); }; #endif tecnoballz-0.93.1/include/tecnoballz.h0000664000175000017500000001376212412501751016737 0ustar brunobruno/** * @file tecnoballz.h * @brief Base of all classes, and main static methods of the game * @created 2002-08-18 * @date 2014-09-29 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 29 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: tecnoballz.h 29 2014-09-30 10:15:55Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #ifdef WIN32 #include #include "SDL/SDL.h" #else #include #include #include #include #include #include "SDL/SDL.h" #endif #include "../include/configfile.h" #include "config.h" #ifndef __TECNOBALLZ__ #define __TECNOBALLZ__ #if !defined(PACKAGE_STRING) #define PACKAGE_STRING "TECNOBALLZ 0.93.1" #endif #define TECNOBALLZ_VERSION PACKAGE_STRING " (2014-09-30)" /** Force bytes copy (SPARC unaligned memory access) */ /* #define BYTES_COPY */ #ifndef SCOREFILE #define SCOREFILE "tecnoball" #endif #ifndef PREFIX #define PREFIX "" #endif /** PlayStation Portable port, PSP is a handheld game console released * and currently manufactured by Sony Computer Entertainment */ /* #define TECNOBALLZ_PSP */ /** GP2X port, GP2X is an open-source, * Linux-based handheld video game console */ /* #define TECNOBALLZ_GP2X */ #ifdef TECNOBALLZ_GP2X #undef TECNOBALLZ_PSP #define TECNOBALLZ_HANDHELD_CONSOLE #endif #ifdef TECNOBALLZ_PSP #undef TECNOBALLZ_GP2X #define TECNOBALLZ_HANDHELD_CONSOLE #endif class tecnoballz; class configfile; class handler_high_score; class handler_resources; class handler_levels; class handler_display; class handler_keyboard; #ifndef SOUNDISOFF class handler_audio; #endif class list_sprites; class handler_players; class supervisor_bricks_level; class supervisor_shop; class supervisor_guards_level; class supervisor_main_menu; class supervisor_map_editor; class bitmap_data; class offscreen_surface; const Sint32 SINUS_MASK = 511; const Sint32 SINUS_DECA = 7; class tecnoballz { public: /** Different phases of the game */ typedef enum { BRICKS_LEVEL = 1, SHOP, GUARDS_LEVEL, MAIN_MENU, MAP_EDITOR, LEAVE_TECNOBALLZ } GAME_PHASE; /** Different levels of difficulty */ typedef enum { DIFFICULTY_EASY = 1, DIFFICULTY_NORMAL, DIFFICULTY_MEDIUM, DIFFICULTY_HARD } DIFFICULTIES_ENUM; public: /** 4 levels of difficulty */ static const Uint32 MAX_OF_DIFFICULTY_LEVELS = 4; public: /** True if verbose enable */ static bool is_verbose; /** Force 4 colors tiles set in bricks level */ static bool force_4_colors_tiles; /** 1=320x240 or 2=640x480 pixels */ static Uint32 resolution; /** True if static background tiles with bricks and ejectors * draw inside. False if bricks and ejectors are sprites */ static bool has_background; /** Control paddle with absolute mouse position */ static bool absolute_mouse_positioning; static Sint32 arg_jumper; protected: /* object number */ Uint32 object_num; /* * static members */ /** Current number of objects */ static Uint32 objects_counter; /** Counter the number of frames */ static Uint32 frame_counter; /** Random counting variable */ static Sint32 random_counter; /** Current phase of the game * BRICKS_LEVEL, SHOP, GUARDS_LEVEL, * MAIN_MENU, or MAP_EDITOR */ static Uint32 current_phase; /** Difficulty with which an average player may complete a game * 1: easy; 2:normal 3:medium; 4:hard */ static Sint32 difficulty_level; /** If true then leaves the game definitively */ static bool is_exit_game; /** If true cheat mode is enabled. Before everything in the menu, * the six names must be 040670. Also the cheat mode must be enabled * in the shop. You can moving the pointer to the top left screen * corner, and type [E], [T], [B] and [ENTER]. */ static bool is_enabled_cheat_mode; /** True if six names of menu initialized to 040670 */ static bool birth_flag; /** Number of initial lifes */ static Sint32 initial_num_of_lifes; /** Number of players from 1 to 6 */ static Sint32 number_of_players; static const char nomprefix[]; static handler_high_score *high_score; /** Handler of the files resources */ static handler_resources *resources; static handler_levels *ptLev_data; #ifndef SOUNDISOFF static handler_audio *audio; #endif static handler_display *display; static handler_keyboard *keyboard; static list_sprites *sprites; static handler_players *current_player; static Sint16 *table_cosL; static Sint16 *table_sinL; /** A bitmap containing the current images of sprites */ static bitmap_data *sprites_bitmap; /** The main offscreen surface of the game */ static offscreen_surface *game_screen; static offscreen_surface *background_screen; static configfile *config_file; public: static void first_init (configfile * pConf); static void game_begin (); static void release_all_objects (configfile * pConf); static void integer_to_ascii (Sint32 value, Uint32 padding, char *str); tecnoballz (); virtual ~tecnoballz (); void object_init (); void object_free (); void int_to_big_endian (Uint32 *, Uint32 *); void big_endian_to_int (Uint32 *, Uint32 *); }; #endif tecnoballz-0.93.1/include/short_info_messages.h0000664000175000017500000000745212412501751020642 0ustar brunobruno/** * @file short_info_messages.h * @brief Display short info messages in bricks levels * @created 2002-12-30 * @date 2007-09-28 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: short_info_messages.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SHORT_INFO_MESSAGES__ #define __SHORT_INFO_MESSAGES__ class short_info_messages; #include "../include/handler_display.h" #include "../include/tecnoballz.h" #include "../include/bitmap_data.h" class short_info_messages:public virtual tecnoballz { public: typedef enum { ARE_YOU_READY, YEAH_YOU_WHERE, SIMPLE_FIRE, COOL_FIRE, COOL_GUY, LOST_FILE, WIN_LIFE, TOO_LATE, BUDGET_PRICES, GLUE_OPTION, NEXT_LEVEL, SMALL_PADDLE, BIG_PADDLE, EXTRA_BALLS, MULTI_BALLS, POWERBALLS, MEGA_POWERBALLS, INVERSE_COMMANDS, MAXIMUM_ACCELERATION, RIGHT_PADDLE, TOP_PADDLE, LEFT_PADDLE, BIG_BALLS, HUGE_BALLS, MAXIMUM_OPTIONS, WALL_ENABLE, ROBOT_ENABLE, CONTROL_BALLS, MAX_OF_MESSAGES } MESSAGES_ENUM; private: static short_info_messages *info_messages_singleton; /** All message strings loaded from a text file */ char **messages; /** Bitmap used to restore the background under message, * if has_background == true */ bitmap_data *restore_surface; /** Pointer to the pixels from the restore surface */ char *restore_pixels; static const Uint32 XCOORD_MESSAGE = 96; static const Uint32 YCOORD_MESSAGE = 37; /** Maximum number of chars of a message */ static const Uint32 MAX_OF_CHARS = 16; /** Time delay counter, if < 5 then clear the message */ Uint32 delay_counter; /** Current char to draw from 0 to 15 */ Sint32 current_char; /** Current required message string */ const char *required_message; /** Modulo destination in the game offscreen */ Sint32 dest_offset; /** Modulo source in the font bitmap */ Sint32 src_offset; /** Font bitmap used to draw a message */ bitmap_data *bitmap_small_fonts; /** Pointer to the pixels of the font bitmap */ char *font_pixels; /** Pointer to the message in the game offscreen */ char *screen; /** Pointer to the message in the background offscreen */ char *background; /** Height of a character in pixels */ Uint32 height_font; /** Width of a character in pixels, 4 or 8 */ Uint32 width_font; /** Width of message's surface 64 or 128 pixels */ Uint32 width_surface; bool messages_request[MAX_OF_MESSAGES]; private: short_info_messages (); void init_with_background (); void draw (); void display_in_background (); void display (Uint32 height); void clear_message (); public: ~short_info_messages (); static short_info_messages *get_instance (); void clear_messages_request (); void initialize (); void send_message_request (Uint32 id); void run (); }; #endif tecnoballz-0.93.1/include/handler_levels.h0000664000175000017500000001130312412501751017556 0ustar brunobruno/** * @file handler_levels.h * @brief manage levels data * @created 2004-04-06 * @date 2012-09-08 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_levels.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __LEVEL_DATA__ #define __LEVEL_DATA__ class handler_levels; #include "../include/tecnoballz.h" #include #include typedef struct { /* 0 = bricks level */ Uint32 level_type; Uint32 id; /** Delay time before first appearance of ship 1 and 5 */ Uint32 ship_appearance_delay1; /** Delay time before first appearance of ship 2 and 6 */ Uint32 ship_appearance_delay2; /** Delay time before first appearance of ship 3 and 7 */ Uint32 ship_appearance_delay3; /** Delay time before first appearance of ship 4 and 8 */ Uint32 ship_appearance_delay4; /** Delay time of the reappearance of any ship after its destruction */ Uint32 reappearance; /** strength of the ships */ Uint32 ships_strength; /** Appearance frequency of the penalty capsules */ Uint32 penalties_frequency; /** Appearance frequency of the money capsules */ Uint32 moneys_frequency; /** List of the capsules */ const Uint32 *malusListe; /** First speed table */ Uint32 starting_speed; /** Delay time before the ball accelerates */ Uint32 acceleration_delay; /** Delay time before the ball leaves paddle, at the level beginning */ Uint32 ball_release_time; /** Delay time before the ball leaves paddle with glue option */ Uint32 glue_time; /** Delay time before tilt is available */ Uint32 tilt_delay; } bricks_level_desc; typedef struct { /* 1 = guard level */ Uint32 level_type; Uint32 id; Uint32 starting_speed; Uint32 ball_release_time; Uint32 tilt_delay; /** Delay time before the scrolling starts */ Uint32 scroll_delay; /** Determines the behavior of the scrolling */ Uint32 scroll_id; /** Appearance frequency of the capsules */ Uint32 capsules_frequency; /** List of the capsules */ const Uint32 *capsules_list; } guardians_level_desc; typedef struct { Uint32 id; Uint32 type; } level_desc; class handler_levels:public virtual tecnoballz { public: static const Uint32 MAX_OF_AREAS = 5; static const Uint32 NUM_OF_LEVELS_PER_AREA = 12; static const Uint32 TIME_MULTIPLIER = 50; static const Uint32 MAX_OF_CASPULES = 64; typedef struct { Uint32 id; Uint32 codes[handler_levels::MAX_OF_CASPULES]; } capsules_struct; public: handler_levels (); ~handler_levels (); const bricks_level_desc *get_bricks_levels_params (Uint32, Uint32); const guardians_level_desc *get_guardians_levels_params (Uint32, Uint32); private: typedef enum { BRICKS_LEVEL, GUARDIANS_LEVEL, MAX_OF_LEVEL_TYPES } LEVEL_TYPES; typedef enum { ROOT, LEVEL_NODE, BRICKS_LEVEL_NODE, CAPSULES_NODE, GUARDIANS_LEVEL_NODE } NODES_ENUM; void check_levels (); void check_xml (TiXmlNode * parent, Uint32 node); void parse (TiXmlNode * parent, Uint32 node); Uint32 *get_capsules_list (Uint32 id); guardians_level_desc *get_guardians_level (Uint32 id); bricks_level_desc *get_bricks_level (Uint32 id); private: Uint32 time_multiplier; Uint32 levels_counter; Uint32 bricks_levels_counter; Uint32 guardians_levels_counter; Uint32 capsules_lists_counter; Uint32 capsules_counter; Sint32 level_index; Sint32 bricks_level_index; Sint32 guardians_level_index; Sint32 appearance_index; Sint32 capsule_list_index; Sint32 capsule_index; std::string last_element; private: TiXmlDocument * xml_levels; guardians_level_desc *guardians_levels; bricks_level_desc *bricks_levels; capsules_struct *capsules_list; level_desc *levels_list; }; #endif tecnoballz-0.93.1/include/controller_bullets.h0000664000175000017500000000452212412501751020511 0ustar brunobruno/** * @file controller_bullets.h * @brief Bullets controller * @date 2007-02-19 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_bullets.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_BULLETS__ #define __CONTROLLER_BULLETS__ class controller_bullets; #include "../include/list_sprites.h" #include "../include/sprite_bullet.h" #include "../include/objects_list.h" #include "../include/sprite_guardian.h" class controller_bullets:public objects_list < sprite_bullet, controller_bullets > { friend class controller_guardians; private: static const Sint16 tir01_posi[62]; static const Sint16 tir02_posi[60]; static const Sint16 tir04_posi[14]; static const Sint16 tir10_posi[12]; static const Sint16 fire_sinus[60]; public: controller_bullets (); ~controller_bullets (); void move (); void play_animation_loop (); void check_paddle_collisions (); sprite_bullet *get_last_bullet (); void fire (Uint32 fire_id, sprite_guardian * guardian); private: void init_fire_01 (sprite_guardian * pgard); void init_fire_02 (sprite_guardian * pgard); void init_fire_03 (sprite_guardian * pgard); void init_fire_04 (sprite_guardian * pgard); void init_fire_05 (sprite_guardian * pgard); void init_fire_06 (sprite_guardian * pgard); void init_fire_07 (sprite_guardian * pgard); void init_fire_08 (sprite_guardian * pgard); void init_fire_09 (sprite_guardian * pgard); void init_fire_10 (sprite_guardian * pgard); void init_fire_11 (sprite_guardian * pgard); }; #endif tecnoballz-0.93.1/include/controller_balls.h0000664000175000017500000000700312412501751020131 0ustar brunobruno/** * @file controller_balls.h * @brief Control the balls. Move and collisions * @date 2007-10-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_balls.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_BALLS__ #define __CONTROLLER_BALLS__ class controller_balls; #include "../include/sprite_ball.h" #include "../include/objects_list.h" #include "../include/sprite_paddle.h" #include "../include/controller_bricks.h" #include "../include/controller_ships.h" #include "../include/right_panel_score.h" #include "../include/controller_guardians.h" #include "../include/controller_moneys.h" #include "../include/controller_capsules.h" #include "../include/controller_paddles.h" #include "../include/controller_magnetic_eyes.h" #include "../include/sprite_eye.h" class controller_balls:public objects_list < sprite_ball, controller_balls > { friend class controller_ejectors; friend class sprite_ball; private: /** Time delay of the glue */ Uint32 glue_delay; /** Time delay before a tilt be possible */ Sint32 tilt_delay; /** True if ball controlled by the left mouse button */ bool balls_are_controlled; sprite_paddle *paddle_bottom; sprite_paddle *paddle_right; sprite_paddle *paddle_top; sprite_paddle *paddle_left; sprite_paddle *paddle_robot; private: static Sint32 rb0[16]; static Sint32 rb1[16]; static Sint32 rb2[16]; static Sint32 rb3[16]; static Sint32 rb4[16]; static Sint32 rb5[16]; static Sint32 rb6[16]; static Sint32 rb7[16]; static Sint32 rb8[16]; static Sint32 *brick_jump[15]; public: ~controller_balls (); controller_balls (); void init (Uint32 start, Uint32 glueC, Uint32 speed, Uint32 tiltC, Uint32 table); void run_in_bricks_levels (); void run_in_guardians_level (); sprite_ball *get_first_ball (); private: void check_outside_balls (); void check_outside_balls_guards_level (); void activate_tilt (); void move_balls (); void accelerate (); void move_balls_in_guards_level (); void collisions_with_paddles (); void collisions_with_paddle (); void collisions_with_robot (); void handle_ejectors (); void collisions_with_walls (); void collisions_with_sides (); void prevent_horizontal_blocking (); void bricks_collision (); void collisions_with_ships (); void collisions_with_eyes (); void collisions_with_guardians (); void controll_balls (); public: void enable_balls_control (); void extra_balls (); void add_balls (Uint32 nball = 0); void multi_balls (); void set_power_1 (); void set_power_2 (); void set_size_2 (); void set_size_3 (); void set_maximum_speed (); void check_tilt_availability (); bool is_sticky_balls_remains (); }; #endif tecnoballz-0.93.1/include/sprite_brick.h0000664000175000017500000000276112412501751017257 0ustar brunobruno/** * @file sprite_brick.h * @brief The sprite of the brick * @created 2007-09-12 * @date 2007-09-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_brick.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_BRICK__ #define __SPRITE_BRICK__ class sprite_brick; #include "../include/sprite_object.h" #include "../include/objects_list.h" class sprite_brick:public sprite_object { private: /** Color of brick */ Uint32 original_color; Uint32 current_color; public: sprite_brick (); ~sprite_brick (); void update_image (Uint32 h_pos); void set_color (Uint32 color); void touch (); bool is_cycling(); virtual void draw (); }; #endif tecnoballz-0.93.1/include/controller_explosions.h0000664000175000017500000000310212412501751021233 0ustar brunobruno/** * @file controller_explosions.h * @brief Guardians explosions controller * @created 2003-03-02 * @date 2007-02-08 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_explosions.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_EXPLOSIONS__ #define __CONTROLLER_EXPLOSIONS__ class controller_explosions; #include "../include/list_sprites.h" #include "../include/sprite_object.h" #include "../include/objects_list.h" class controller_explosions:public objects_list < sprite_object, controller_explosions > { public: controller_explosions (); ~controller_explosions (); void create_explosions_list (); void add (Uint32 xcoord, Uint32 ycoord); void play_animation (); private: Uint32 sound_delay; }; #endif tecnoballz-0.93.1/include/controller_ejectors.h0000664000175000017500000000356312412501751020661 0ustar brunobruno/** * @file controller_ejectors.h * @brief Ejectors corners controller * @date 2007-09-29 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_ejectors.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_EJECTORS__ #define __CONTROLLER_EJECTORS__ class controller_ejectors; #include "../include/sprite_object.h" #include "../include/tecnoballz.h" #include "../include/sprite_ball.h" class controller_ejectors:public objects_list < sprite_object, controller_ejectors > { public: typedef enum { TOP_LEFT_EJECTOR, BOTTOM_LEFT_EJECTOR, BOTTOM_RIGHT_EJECTOR, TOP_RIGHT_EJECTOR, MAX_OF_EJECTORS } EJECTORS_ENUM; private: static const Uint32 COORD_EJECTOR_1 = 16; static const Uint32 COORD_EJECTOR_2 = 224; static bool is_pos_ball_initialized; public: controller_ejectors (); ~controller_ejectors (); void create_ejectors_sprites (); void draw_shadow (); void draw (); sprite_object *get_ejector (Uint32 eject); void initialize_ball_positions (ball_ejector_coords * table); }; #endif tecnoballz-0.93.1/include/controller_moneys.h0000664000175000017500000000434012412501751020347 0ustar brunobruno/** * @file controller_moneys.h * @brief Moneys controller * @date 2007-04-13 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_moneys.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_MONEYS__ #define __CONTROLLER_MONEYS__ class controller_moneys; #include "../include/list_sprites.h" #include "../include/objects_list.h" #include "../include/handler_display.h" #include "../include/right_panel_score.h" #include "../include/sprite_money.h" #include "../include/right_panel_score.h" #include "../include/supervisor_bricks_level.h" #include "../include/controller_indicators.h" #include "../include/sprite_ball.h" class controller_moneys:public objects_list < sprite_money, controller_moneys > { private: /** time delay before sending a new money capsule */ Uint32 send_delay; /** delay counter before sending a new money capsule */ Uint32 delay_count; right_panel_score *ptbarreScr; controller_indicators *ptPrntmney; public: controller_moneys (); ~controller_moneys (); void initialize (Uint32 delay, right_panel_score * score, controller_indicators * money); void initialize (Uint32 delay, controller_indicators * money); void send_money_from_brick (brick_redraw * briPT); void send_money (sprite_ball * ball); void send_money (sprite_projectile * blast); void send_money_from_guardian (sprite_ball * ball); void move (); void move_bottom (); }; #endif tecnoballz-0.93.1/include/supervisor_map_editor.h0000664000175000017500000000755012412501751021224 0ustar brunobruno/** * @file supervisor_map_editor.h * @brief The tile map editor for the menu and guardians levels * @created 2004-09-13 * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_map_editor.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SUPERVISOR_MAP_EDITOR__ #define __SUPERVISOR_MAP_EDITOR__ #include "../include/supervisor.h" #include "../include/tilesmap_scrolling.h" #include "../include/sprite_mouse_pointer.h" #include "../include/bitmap_data.h" class supervisor_map_editor:public virtual supervisor { private: typedef struct { /** Left column of selection rectangle */ Uint32 x1; /** Top row of selection rectangle */ Uint32 x2; /** Right column of selection rectangle */ Uint32 y1; /** Bottom row of selection rectangle */ Uint32 y2; Uint32 number_of_cols; Uint32 number_of_raws; Sint32 y_offset; } selected_region; typedef enum { SHOW_MAP, SHOW_TILES } SHOW_ENUM; tilesmap_scrolling *tiles_map; sprite_mouse_pointer *mouse_pointer; /** Number of tiles per row in the map */ Uint32 map_width; /** Height of the main window */ Uint32 screen_height; /** Weight of the main window */ Uint32 screen_width; /** SHOW_MAP or SHOW_TILES */ Uint32 view_mode; /** True if the space key is pressed down */ bool is_space_key_down; /** Y-coordinate of the tiles bitmap */ Sint32 tiles_ycoord; bitmap_data *tiles_bitmap; /** If true, the right mouse button is currently pressed */ bool is_right_button_down; /* * brush handle */ /** If true, the left mouse button is currently pressed */ bool is_left_button_down; /** X-coordinate of the current brush in pixels */ Sint32 brush_posx; /** Y-coordinate of the current brush in pixels */ Sint32 brush_posy; /** Width of the current brush in pixels */ Uint32 brush_width; /** Height of the current brush in pixels */ Uint32 brush_height; /** Brush composed of tiles copied from the main map */ Uint16 *tiles_brush; /** Brush bitmap */ bitmap_data *brush_bitmap; Uint32 cycled_colors_index; selected_region *current_selection; selected_region *map_selection; selected_region *tiles_selection; Uint32 tile_width; Uint32 tile_mask1; Uint32 tile_mask2; bool is_s_key_down; public: supervisor_map_editor (); ~supervisor_map_editor (); void first_init (); Uint32 main_loop (); private: void view_map_editor (); void view_tiles (); void tiles_to_brush (); void map_to_brush (); void check_keys (); Sint32 get_speed (); void select_rectangle (); void highlight_selection (); void alloc_tilesmap_brush (Uint32 number_of_raws, Uint32 number_of_cols); void alloc_brush (); void draw_brush (); bool save_tilesmap (); static const Uint32 MAX_OF_CYCLED_COLORS = 49; static const unsigned char cycled_colors_list[MAX_OF_CYCLED_COLORS]; }; #endif tecnoballz-0.93.1/include/controller_gems.h0000664000175000017500000000306212412501751017770 0ustar brunobruno/** * @file controller_gems.h * @brief The gems controller * @created 2004-04-12 * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_gems.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_GEMS__ #define __CONTROLLER_GEMS__ class controller_gems; #include "../include/objects_list.h" #include "../include/sprite_gem.h" #include "../include/handler_players.h" class controller_gems:public objects_list < sprite_gem, controller_gems > { public: static const Uint32 MAX_OF_GEMS = 6; private: public: controller_gems (); ~controller_gems (); void initialize (); void send (sprite_ball * ball); void send (sprite_projectile * blast); void move (); }; #endif tecnoballz-0.93.1/include/controller_indicators.h0000664000175000017500000000377512412501751021207 0ustar brunobruno/** * @file controller_indicators.h * @brief Controller of money amount, reverse penalty * @created 2002-11-28 * @date 2007-02-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_indicators.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_INDICATORS__ #define __CONTROLLER_INDICATORS__ class controller_indicators; #include "../include/objects_list.h" #include "../include/handler_players.h" #include "../include/controller_paddles.h" #include "../include/sprite_capsule.h" #include "../include/sprite_money.h" class controller_indicators:public objects_list < sprite_object, controller_indicators > { private: static const Uint32 YCOORD_INDICATORS = 232; Uint32 y_position; Uint32 money_posy; /** Sprite of the money capsule to the left of amount money */ sprite_money *money_sprite; sprite_capsule *reverse_sprite; sprite_capsule *life_sprite; public: controller_indicators (); ~controller_indicators (); void create_indicators_sprites (); void display_money_and_reverse (); void display_money_and_lifes (); void increase_money_amount (Uint32 amount); private: void init_money (); void display_money_amount (); }; #endif tecnoballz-0.93.1/include/sprite_gem.h0000664000175000017500000000417512412501751016736 0ustar brunobruno/** * @file sprite_gem.h * @brief The gem sprite * @created 2004-04-12 * @date 2007-03-09 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_gem.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SPRITE_GEM__ #define __SPRITE_GEM__ class sprite_gem; #include "../include/sprite_object.h" #include "../include/sprite_ball.h" #include "../include/sprite_projectile.h" typedef enum { GREY_SQUARE, GREEN_SPHERE, YELLOW_RING, BLUE_TRIANGLE, GOLD_RHOMBUS, BRONZE_PENTAGON } GEMS_ENUM; class sprite_gem:public sprite_object { friend class controller_moneys; private: /** Toward bottom, right, top, left */ Uint32 towards; /** Moving speed in pixels of the gem */ Uint32 speed_of_moving; /** If true the gem is positionned as indicator on the score panel */ bool is_indicator; /** Gem identifier GREY_SQUARE to BRONZE_PENTAGON */ Uint32 gem_id; sprite_paddle *paddle; Uint32 blink_counter; Uint32 rand_count; public: sprite_gem (); ~sprite_gem (); bool enable_if_available (sprite_ball *ball); bool enable_if_available (sprite_projectile *blast); void collect (Uint32 id); void enable_blink (); Sint32 move (); private: void init_gem (Sint32 pos_x, Sint32 pos_y, sprite_paddle *pad); void blink (); private: static const Uint32 gem_random[8]; }; #endif tecnoballz-0.93.1/include/controller_magnetic_eyes.h0000664000175000017500000000351712412501751021656 0ustar brunobruno/** * @file controller_magnetic_eyes.h * @brief Magectic eyes controller * @created 2004-09-17 * @date 2007-04-08 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_magnetic_eyes.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_MAGNECTIC_EYES__ #define __CONTROLLER_MAGNECTIC_EYES__ class controller_magnetic_eyes; #include "../include/list_sprites.h" #include "../include/sprite_eye.h" #include "../include/objects_list.h" class controller_magnetic_eyes:public objects_list < sprite_eye, controller_magnetic_eyes > { friend class sprite_eye; private: static const Uint16 x_coordinates[32]; static const Uint16 y_coordinates[32]; public: /** Value used for the collisions with balls */ Sint32 hypotenuse; /** X-coordinate of the eyes centers */ Sint32 center_x; /** Y-coordinate of the eyes centers */ Sint32 center_y; public: controller_magnetic_eyes (); ~controller_magnetic_eyes (); bool create_eye (); void create_eyes_list (); void move (); }; #endif tecnoballz-0.93.1/include/lispreader.h0000664000175000017500000001003012412501751016715 0ustar brunobruno/** * @file lispreader.h * @brief Parse configuration file * @created 2007-06-15 * @date 2014-07-27 * @author Mark Probst * @author Ingo Ruhnke * @author Bruno Ethvignot */ /* * copyright (c) 1998-2000 Mark Probst * copyright (c) 2002 Ingo Ruhnke * copyright (c) 2007-2014 TLK Games all rights reserved * $Id: lispreader.h 19 2014-07-27 18:03:48Z bruno.ethvignot@gmail.com $ * * Powermanga 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. * * Powermanga 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __LISPREADER__ #define __LISPREADER__ class lispreader; #include "../include/tecnoballz.h" typedef enum { LISP_TYPE_INTERNAL = -3, LISP_TYPE_PARSE_ERROR = -2, LISP_TYPE_EOF = -1, LISP_TYPE_NIL = 0, LISP_TYPE_SYMBOL, LISP_TYPE_INTEGER, LISP_TYPE_STRING, LISP_TYPE_REAL, LISP_TYPE_CONS, LISP_TYPE_PATTERN_CONS, LISP_TYPE_BOOLEAN, LISP_TYPE_PATTERN_VAR } LISP_TYPE_ENUM; typedef struct { Sint32 type; union { FILE *file; struct { char *buf; Sint32 pos; } string; struct { void *data; Sint32 (*next_char) (void *data); void (*unget_char) (char c, void *data); } any; } v; } lisp_stream_t; typedef struct _lisp_object_t lisp_object_t; struct _lisp_object_t { Sint32 type; union { struct { struct _lisp_object_t *car; struct _lisp_object_t *cdr; } cons; char *string; Sint32 integer; float real; struct { Sint32 type; Sint32 index; struct _lisp_object_t *sub; } pattern; } v; }; class lispreader:public virtual tecnoballz { public: lispreader (); ~lispreader (); bool read_int (const char *name, Sint32 * i); bool read_bool (const char *name, bool * b); bool lisp_read_string (const char *name, char **str); bool read_string (const char *name, std::string* str); lisp_object_t *lisp_read_file (std::string filename); char *lisp_symbol (lisp_object_t * obj); lisp_object_t *lisp_car (lisp_object_t * obj); lisp_object_t *lisp_cdr (lisp_object_t * obj); void lisp_free (lisp_object_t * obj); private: lisp_object_t *root_obj; lisp_object_t* lst; void _token_clear (void); void token_append (char c); void _token_append (char c); Sint32 _next_char (lisp_stream_t * stream); void _unget_char (char c, lisp_stream_t * stream); Sint32 _scan (lisp_stream_t * stream); lisp_object_t * lisp_object_alloc (Sint32 type); lisp_stream_t * lisp_stream_init_string (lisp_stream_t * stream, char *buf); lisp_object_t * lisp_make_integer (Sint32 value); lisp_object_t * lisp_make_real (float value); lisp_object_t * lisp_make_symbol (const char *value); lisp_object_t * lisp_make_string (const char *value); lisp_object_t * lisp_make_cons (lisp_object_t * car, lisp_object_t * cdr); lisp_object_t * lisp_make_boolean (Sint32 value); lisp_object_t * lisp_make_pattern_cons (lisp_object_t * car, lisp_object_t * cdr); lisp_object_t *lisp_read (lisp_stream_t * in); Sint32 lisp_type (lisp_object_t * obj); Sint32 lisp_integer (lisp_object_t * obj); char * lisp_string (lisp_object_t * obj); Sint32 lisp_boolean (lisp_object_t * obj); lisp_object_t * search_for (const char *name); void lisp_dump (lisp_object_t * obj, FILE * out); float lisp_real (lisp_object_t * obj); }; #endif tecnoballz-0.93.1/include/supervisor_main_menu.h0000664000175000017500000000543612412501751021052 0ustar brunobruno/** * @file supervisor_main_menu.h * @brief TecnoballZ's main menu supervisor * @date 2012-09-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_main_menu.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __SUPERVISOR__MAIN_MENU__ #define __SUPERVISOR__MAIN_MENU__ #include "../include/tilesmap_scrolling.h" #include "../include/supervisor.h" #include "../include/handler_keyboard.h" #include "../include/sprite_object.h" #include "../include/list_sprites.h" #include "../include/controller_font_menu.h" #include "../include/display_text_bitmap.h" #include "../include/sprite_display_menu.h" #include "../include/sprite_mouse_pointer.h" #include "../include/handler_audio.h" class supervisor_main_menu:public virtual supervisor { public: static const Uint32 AREA_CODE_LENGTH = 10; private: tilesmap_scrolling * tiles_map; /** Big TecnoballZ logo at the top of the screen */ sprite_object *tecnoballz_logo; /** Scrolltext at the bottom of the screen */ controller_font_menu *font_scrolling; /** Handle the text of the main menu */ sprite_display_menu *text_menu; /** Angle from 0 to 511 used for the horizontal displacement * of the TecnoballZ logo */ Uint32 tecnoballz_logo_angle; /** Sprite of the mouse cursor */ sprite_mouse_pointer *mouse_pointer; /** All areas code for every areas and every difficulty levels */ static const char area_codes[241]; /** Current input area code used to jump * directly to the end of a area */ static char current_area_code[AREA_CODE_LENGTH + 1]; public: supervisor_main_menu (); ~supervisor_main_menu (); void first_init (); Uint32 main_loop (); static const char *get_area_code (Uint32 area_num, Uint32 difficulty); static char *get_current_area_code (); static void copy_current_area_code (char *destination); private: void move_tecnoballz_logo (); Sint32 start_new_game (); Uint32 check_area_code (); }; #endif tecnoballz-0.93.1/include/controller_paddles.h0000664000175000017500000001206112412501751020450 0ustar brunobruno/** * @file controller_paddles.h * @brief Paddles controller * @date 2007-09-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_paddles.h 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __CONTROLLER_PADDLES__ #define __CONTROLLER_PADDLES__ class controller_paddles; #include "../include/sprite_paddle.h" #include "../include/right_panel_score.h" #include "../include/objects_list.h" #include "../include/controller_balls.h" #include "../include/controller_gigablitz.h" class controller_paddles:public objects_list < sprite_paddle, controller_paddles > { friend class sprite_paddle; private: float kb_paddle_speed; /** Minimum widh of a paddle: 32 or 64 pixels */ Sint32 width_mini; /** Maximum widh of a paddle: 32 or 64 pixels */ Sint32 width_maxi; /** Minimum x/y coordinate of a paddle */ Sint32 min_coordinate; /** Maximum x/y coordinate of a paddle */ Sint32 max_coordinate; /** Y-coordinate of the top paddle */ Sint32 top_y_coord; /** Y-coordinate of the bottom paddle */ Sint32 bottom_y_coord; /** X-coordinate of the left paddle */ Sint32 left_x_coord; /** X-coordinate of the right paddle */ Sint32 right_x_coord; /** True if the mode team is enable, no implemented * (on Amiga I had two mice simultaneously) */ bool is_team_mode; /** Length of the paddles in pixels */ Uint32 paddle_length; Sint32 raketDepla; //sens de deplacement 1 <- 0 -> 2 Sint32 rakVgauche; //vitesse gauche Sint32 rakVdroite; //vitesse droite Sint32 balle_glue; //temps de la colle /** if > 0 the movements of the paddle(s) are reversed */ Uint32 reverse_counter; sprite_paddle *paddle_bottom; sprite_paddle *paddle_right; sprite_paddle *paddle_top; sprite_paddle *paddle_left; sprite_paddle *paddle_robot; controller_gigablitz *gigablitz; controller_balls *balls; static Sint32 ballePets1[14]; static Sint32 ballePets2[14]; static Sint32 ballePets3[14]; static Sint32 ballePets4[14]; static const Sint32 rb09[16]; static const Sint32 rb10[16]; static const Sint32 rb11[16]; static const Sint32 rb12[16]; static const Sint32 rb13[16]; static const Sint32 rb14[16]; static const Sint32 rb15[16]; static const Sint32 rb16[16]; static const Sint32 rb17[16]; static const Sint32 *midi1_left[]; static const Sint32 *midi1Right[]; static const Sint32 rb18[]; static const Sint32 rb19[]; static const Sint32 rb20[]; static const Sint32 rb21[]; static const Sint32 rb22[]; static const Sint32 rb23[]; static const Sint32 rb24[]; static const Sint32 rb25[]; static const Sint32 rb26[]; static const Sint32 *midi2_left[]; static const Sint32 *midi2Right[]; static const Sint32 rb27[]; static const Sint32 rb28[]; static const Sint32 rb29[]; static const Sint32 rb30[]; static const Sint32 rb31[]; static const Sint32 rb32[]; static const Sint32 rb33[]; static const Sint32 rb34[]; static const Sint32 rb35[]; static const Sint32 *midi3_left[]; static const Sint32 *midi3Right[]; static const Sint32 rb36[]; static const Sint32 rb37[]; static const Sint32 rb38[]; static const Sint32 rb39[]; static const Sint32 rb40[]; static const Sint32 rb41[]; static const Sint32 rb42[]; static const Sint32 rb43[]; static const Sint32 rb44[]; static const Sint32 *midi4_left[]; static const Sint32 *midi4Right[]; public: typedef enum { BOTTOM_PADDLE = 1, RIGHT_PADDLE, TOP_PADDLE, LEFT_PADDLE, ROBOT_PADDLE } ENUM_PADDLES; public: controller_paddles (); ~controller_paddles (); void create_projectiles_list (); void create_paddles_sprites (); void fire_projectiles (); void check_if_release_balls (); void check_if_release_ball (); void release_all_balls (); void move_paddles (); Sint32 get_paddles_speed (); void move_paddle (); void init_paddles (controller_gigablitz * blitz, controller_balls * balls); void initialize_robot (); void enable_robot (); void disable_robot (); void move_robot (); sprite_paddle *get_paddle (Uint32 id); void set_maximum_paddles_size (); void expand_paddles (); void shrink_paddles (); void set_reverse_counter (Uint32 counter); Uint32 get_reverse_counter (); void disable_all_paddles (); }; #endif tecnoballz-0.93.1/INSTALL0000664000175000017500000003660012412501752014034 0ustar brunobrunoInstallation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. tecnoballz-0.93.1/Makefile.am0000664000175000017500000000034012412501752015027 0ustar brunobruno SUBDIRS = src src/TecnoballZ src/TecnoballZ/textures src/TecnoballZ/hires src/TecnoballZ/musics src/TecnoballZ/texts src/TecnoballZ/sounds src/TecnoballZ/lores pkgdatadir = $(mandir)/man6 dist_pkgdata_DATA = tecnoballz.6 tecnoballz-0.93.1/man/0000775000175000017500000000000012412501752013551 5ustar brunobrunotecnoballz-0.93.1/man/tecnoballz.60000664000175000017500000000314212412501752015775 0ustar brunobruno.TH TecnoballZ 6 "TecnoballZ" "2014" "TLK Games" .SH NAME tecnoballz - A Breakout like game. .SH SYNOPSIS tecnoballz [options] .SH DESCRIPTION TecnoballZ is a "breaking blocks" game that was first written for the Amiga platform. .P You'll need to break all the blocks in each level. The game is divided into Areas which are divided into Levels. Between some levels, you have to defeat a guardian to pass to the next level. When passing an Area, a new edge is open. You can buy weapons and bonus between levels with the money earned during the game. .SH KEYBINDINGS .B [Space] Release ball(s) .TP .B Left [Ctrl] Fire .TP .B Left [Alt] Fire Gigablitz or activate the tilt .TP .B [Ctrl] + [S] Toggle sound activation. .TP .B [Ctrl] + [X] Causes a game over. .TP .B [ESC] Go to the menu. .TP .B [P] Toggle pause. .TP .B [PAGE UP] Volume up .TP .B [PAGE DOWN] Volume down .SH OPTIONS .P .B \--help Display a short help message. .TP .B \--version Display version number. .TP .B \--full Start the game in fullscreen mode. .TP .B \--window windowed mode (full screen by default) .TP .B \--320|--640 Force the game resolution to 320x200 or 640x480. .TP .B \--verbose Print a lot of debuging information to stdout. .TP .B \--nosound|--sound Disable or enable the sound .TP .B \--bg4 Force using a four-color background .SH COPYRIGHT .if n TecnoballZ is Copyright (C) 1992-2014 by the TLK Games Company. .SH AUTHOR TLK Games, http://linux.tlk.fr/games/TecnoballZ/ .P Bruno Ethvignot, development and GNU/Linux port .P This man-page was written by Alexis Sukrieh for the Debian system (but may be used by others). tecnoballz-0.93.1/man/tecnoballz.fr.60000664000175000017500000000362412412501752016410 0ustar brunobruno.TH TecnoballZ 6 "TecnoballZ" "2014" "TLK Games" .SH NAME tecnoballz - Un jeu de casse-briques. .SH SYNOPSIS tecnoballz [options] .SH DESCRIPTION TecnoballZ est un casse briques qui a d'abbord t crit pour Amiga en 1991. .P Dans Tecnoballz, vous devez casser toutes les briques de chaque niveau. Le jeu est divis en zones (Area) lesquelles sont divises en niveaux (Levels). Entre certains niveaux, vous devrez battre des gardiens pour passer au niveau suivant. Lorsque vous passez une nouvelle zone, un autre ct du jeu s'ouvre. Vous pouvez acheter des armes et des bonus entre chaque niveau avec l'argent gagn surant le jeu. .SH KEYBINDINGS .B [Barre d'espace] Libre la ou les balles. .TP .B [Ctrl] Gauche Actionne le tir. .TP .B [Alt] Gauche Actionne le tir Gigablitz ou le tilt .TP .B [Ctrl] + [S] Active ou dsactive le son pendant le jeu. .TP .B [Ctrl] + [X] Provoque une abadon de partie (Game Over). .TP .B [ESC] Revient au menu. .TP .B [P] Passe le jeu en pause / ractive le jeu. .TP .B [PAGE SUIVANTE] Augmente le volume .TP .B [PAGE PRCDENTE] Baisse le volume .SH OPTIONS .P .B \--help Affiche un court message d'aide. .TP .B \--version Affiche le numro de version et quelques informations. .TP .B \--full Lance le jeu en plein-cran. .TP .B \--window Mode fentr (Plein cran par dfaut) .TP .B \--320|--640 Force la rsolution du jeu en 320x200 ou en 640x480. .TP .B \--verbose Affiche beaucoup de messages de debugging l'cran. .TP .B \--nosound|--sound Dsactive ou active le son. .TP .B \--bg4 Force l'utilisation des fonds d'cran en quatre couleurs .SH COPYRIGHT .if n TecnoballZ est sous Copyright (C) 1992-2004 de la socit TLK Games. .SH AUTHOR TLK Games, http://linux.tlk.fr/games/TecnoballZ/ .P Bruno Ethvignot, dveloppement et portage sous GNU/Linux .P Cette page de mannuel a t crite par Alexis Sukrieh pour le systme Debian (mais peut tre utilise pour d'autres). tecnoballz-0.93.1/NEWS0000664000175000017500000000012412412501752013472 0ustar brunobrunoBuilds now correctly with gcc 4.0 (Bruno Ethvignot) Automake used (Alexis Sukrieh). tecnoballz-0.93.1/README0000664000175000017500000000152512412501752013661 0ustar brunobrunoA exciting Brick Breaker with 50 levels of game and 11 special levels, distributed on the 2 modes of game to give the player a sophisticated system of attack weapons with an enormous power of fire that can be build by gaining bonuses. Numerous decors, musics and sounds complete this great game. This game was ported from the Commodore Amiga. PREREQUISITES You need: - A IA-32, x86-64, PowerPC, ARM or SPARC platform - 32 MB RAM and 80 MB swap - Linux 2.x - SDL 1.2 - SDL_mixer - SDL_image - Mikmod - TinyXML - the GCC C++ compiler - GNU make COMPILING AND INSTALLING To install in /usr/local : ./bootstrap ./configure make su -c 'make install' LEGAL TecnoballZ is copyright TLK Games 1991-2014 and available under the terms of the GNU General Public License. See COPYING for details. tecnoballz-0.93.1/src/0000775000175000017500000000000012412501752013565 5ustar brunobrunotecnoballz-0.93.1/src/offscreen_surface.cc0000664000175000017500000001453512412501752017566 0ustar brunobruno/** * @file offscreen_surface.cc * @brief an offscreen drawing surface * @created 2007-02-15 * @date 2012-11-01 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: offscreen_surface.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/tecnoballz.h" #include "../include/offscreen_surface.h" /** * Create the offscreen surface object * @param w width of the offscreen in pixels * @param h height of the offscreen in pixels * @param depth number of bits per pixel: 8, 16, or 24 * @param voffset */ offscreen_surface::offscreen_surface (Uint32 w, Uint32 h, Uint32 depth, Uint32 voffset) { vertical_offset = voffset; create_surface (w, h, depth); pixel_data = (char *) surface->pixels + surface->pitch * vertical_offset; } /** * Destroy the offscreen surface object */ offscreen_surface::~offscreen_surface () { } /** * Get the vertical offset * @return vertical offset */ Uint32 offscreen_surface::get_vertical_offset () { return vertical_offset; } /** * Perform a blit from the source surface to the destination surface * @param offscreen pointer to a offscreen surface object */ void offscreen_surface::blit_to_surface (offscreen_surface * offscreen) { SDL_Surface *surface_dest = offscreen->get_surface (); SDL_Rect rect = { 0, (Sint16) vertical_offset, (Uint16) surface->w, (Uint16) (surface->h - vertical_offset) }; if (SDL_BlitSurface (surface, &rect, surface_dest, &rect) < 0) { std::cerr << "(!)offscreen_surface::blit_to_surface(x=0, y=)" << vertical_offset << ", w=" << surface->w << " h=" << surface->h - vertical_offset << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Perform a blit from the source surface to the destination surface * @param offscreen pointer to a offscreen surface object */ void offscreen_surface::blit_to_surface (offscreen_surface * offscreen, Uint32 xcoord, Uint32 ycoord, Uint32 width, Uint32 height) { SDL_Surface *surface_dest = offscreen->get_surface (); SDL_Rect rect = { (Sint16) xcoord, (Sint16) (ycoord + vertical_offset), (Uint16) width, (Uint16) height }; if (SDL_BlitSurface (surface, &rect, surface_dest, &rect) < 0) { std::cerr << "(!)offscreen_surface::blit_to_surface() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Perform a blit from the source surface to the destination surface * @param dest pointer to a surface object * @param x1 source x coordinate in the source and destination * @param y1 source y coordinate in the source and destination * @param x2 destination x coordinate in the source and destination * @param y2 destination y coordinate in the source and destination * @param w the width in pixels to copy * @param h the height in pixels to copy */ void offscreen_surface::blit_to_surface (offscreen_surface * offscreen, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h) { dynamic_cast < surface_sdl * >(this)->blit_to_surface (offscreen, x1, y1, x2, y2 + vertical_offset, w, h); } /** * Clear surface * @param color pixel color value */ void offscreen_surface::clear (Uint32 color) { dynamic_cast < surface_sdl * >(this)->clear (color, 0, vertical_offset, surface->w, surface->h - vertical_offset); } /** * Clear surface * @param color pixel color value * @param xcoord x coordinate in the surface * @param ycoord y coordinate in the surface * @param w the width in pixels to clear * @param h the height in pixels to clear */ void offscreen_surface::clear (Uint32 color, Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 h) { dynamic_cast < surface_sdl * >(this)->clear (color, xcoord, ycoord + vertical_offset, w, h); } /** * Perform a blit from the source surface to the destination surface * @param source pointer to a source surface object * @param x1 source x coordinate in the source and destination * @param y1 source y coordinate in the source and destination * @param x2 destination x coordinate in the source and destination * @param y2 destination y coordinate in the source and destination * @param w the width in pixels to copy * @param h the height in pixels to copy */ void offscreen_surface::blit_surface (surface_sdl * dest, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h) { dynamic_cast < surface_sdl * >(this)->blit_surface (dest, x1, y1, x2, y2 + vertical_offset, w, h); } /** * Draw a string into the offscreen */ /* void offscreen_surface::draw_text (display_text_bitmap * display_text, Uint32 xcoord, Uint32 ycoord, const char *str, Uint32 length) { display_text->draw (this, xcoord, ycoord + vertical_offset, str, length); } */ /** * Copy a part of the offscreen surface in a new surface * @param xcoord x-coordinate in the offscreen * @param ycoord y-coordinate in the offscreen * @param w width of the detination surface * @param h height of the destination surface * @return a pointer to the new surface sdl object */ surface_sdl * offscreen_surface::cut_to_surface (Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h) { return dynamic_cast < surface_sdl * >(this)->cut_to_surface (xcoord, ycoord + vertical_offset, w, h); } tecnoballz-0.93.1/src/controller_ships.cc0000664000175000017500000000625412412501752017474 0ustar brunobruno/** * @file controller_ships.cc * @brief Ship controller * @date 2007-10-17 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_ships.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_ships.h" /** * Create a ships controller */ controller_ships::controller_ships () { littleInit (); max_of_sprites = 8; sprites_have_shades = true; sprite_type_id = sprite_object::SHIPS; } /** * Release a ships controller */ controller_ships::~controller_ships () { release_sprites_list (); } /** * Initialize the ships * @param time0 time delay before the first apparition * @param time1 time delay before the first apparition * @param time2 time delay before the first apparition * @param time3 time delay before the first apparition * @param time4 time delay before the first apparition * @param power strength */ void controller_ships::initialise (Sint32 time0, Sint32 time1, Sint32 time2, Sint32 time3, Sint32 time4, Sint32 power) { reappTemps = time0; apparition[0] = time1; apparition[1] = time2; apparition[2] = time3; apparition[3] = time4; power_init = power; Sint32 x = sprites_list[0]->atom_xmini; Sint32 y = sprites_list[0]->atom_ymini; Sint32 j = 0; Sint32 offs1 = 20 * sprite_ship::ATOM_ANIMA; Sint32 offs2 = 21 * sprite_ship::ATOM_ANIMA; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ship *ship = sprites_list[i]; ship->littleInit ( /* time delay before activation */ time0, /* time delay before first activation */ apparition[j] + i, /* table number of standby values, from 0 to 3 */ j, /* strength */ power, /* x coordinate */ x + (i * 16 * resolution), /* y coordinate */ y + (i * 16 * resolution), /* image number of the explosion */ offs1); j++; j &= 3; Sint32 k = offs2; offs2 = offs1; offs1 = k; } } /** * Move all ships */ void controller_ships::move () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ship *ship = sprites_list[i]; ship->move (); } } /** * Force the explosion of all ships */ void controller_ships::force_explosion () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ship *ship = sprites_list[i]; ship->explode (); } } tecnoballz-0.93.1/src/sprite_brick.cc0000664000175000017500000000630712412501752016562 0ustar brunobruno/** * @file sprite_brick.cc * @brief The sprite of the brick * @created 2007-09-12 * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 23 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_brick.cc 23 2014-08-16 20:13:07Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_brick.h" /** * Create the Gigablitz sprite */ sprite_brick::sprite_brick () { current_cycling = &sprite_object::cycling_01[0]; set_draw_method (sprite_object::DRAW_CAPSULE); clear_sprite_members (); original_color = current_color = 239; } /** * Release the Gigablitz sprite */ sprite_brick::~sprite_brick () { } /** * Set the brick color * @param color Palette index from 239 to 255 */ void sprite_brick::set_color (Uint32 color) { original_color = current_color = color; } void sprite_brick::touch () { current_color = original_color + 1; if (current_color > 255) { current_color = 239; } } bool sprite_brick::is_cycling () { if (current_color == original_color) { return false; } else { return true; } } /** * Change image of brick * @param h_pos Brick vertical position in the bricks bitmap * 0, 1, 2, 3, 4, 5, 6, 7, or 8 */ void sprite_brick::update_image (Uint32 h_pos) { if (h_pos == 0) { return; } Sint32 index = frame_index - frame_index % 7 + (h_pos >> 1); set_image (index); } void sprite_brick::draw () { if (!is_enabled || frame_index >= max_of_images) { return; } Uint32 color = current_color; if (color != original_color) { if (++current_color > 255) { current_color = 239; } } char *screen = game_screen->get_pixel_data (x_coord, y_coord); screen_ptr = screen; restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); /* pixels data of the sprite image */ char *pixels = current_drawing_data; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_pixels; Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen = screen + k; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { char p = *(pixels++); if (p == 29) { *(screen++) = color; } else { *(screen++) = p; } } } } tecnoballz-0.93.1/src/Makefile.am0000664000175000017500000000465012412501752015626 0ustar brunobruno NULL = gamesdir = $(prefix)/games scoredir = /var/games/tecnoballz score = tecnoballz.hi SUBDIRS = TecnoballZ games_PROGRAMS = tecnoballz tecnoballz_SOURCES = $(SOURCES_MAIN) tecnoballz_CXXFLAGS = -DDATADIR=\"$(datadir)/tecnoballz\" \ -DSCOREFILE=\"$(scoredir)/$(score)\" \ @SDL_CFLAGS@ @MIKMOD_FLAGS@ #tecnoballz_LDADD = @SDL_LIBS@ @MM_LIBS@ @MIKMOD_LIBS@ tecnoballz_LDADD = @SDL_LIBS@ @MIKMOD_LIBS@ @TINYXML_LIBS@ install-data-hook: -chown root:games "$(DESTDIR)/$(gamesdir)/tecnoballz" -chmod 2755 "$(DESTDIR)/$(gamesdir)/tecnoballz" $(INSTALL) -d $(DESTDIR)/$(scoredir) $(INSTALL) ../$(score) $(DESTDIR)/$(scoredir) -chown root:games "$(DESTDIR)/$(scoredir)/$(score)" -chmod 664 "$(DESTDIR)/$(scoredir)/$(score)" SOURCES_MAIN = \ bitmap_data.cc \ configfile.cc \ controller_balls.cc \ controller_bricks.cc \ controller_bullets.cc \ controller_capsules.cc \ controller_ejectors.cc \ controller_explosions.cc \ controller_font_game.cc \ controller_font_menu.cc \ controller_game_over.cc \ controller_gems.cc \ controller_gigablitz.cc \ controller_guardians.cc \ controller_indicators.cc \ controller_magnetic_eyes.cc \ controller_moneys.cc \ controller_paddles.cc \ controller_projectiles.cc \ controller_ships.cc \ controller_sides_bricks.cc \ controller_spheres.cc \ controller_viewfinders.cc \ display_text_bitmap.cc \ handler_audio.cc \ handler_display.cc \ handler_high_score.cc \ handler_keyboard.cc \ handler_menu_events.cc \ handler_players.cc \ handler_popup_menu.cc \ handler_resources.cc \ head_animation.cc \ handler_levels.cc \ lispreader.cc \ list_sprites.cc \ main.cc \ offscreen_surface.cc \ right_panel_score.cc \ short_info_messages.cc \ sprite_ball.cc \ sprite_bullet.cc \ sprite_brick.cc \ sprite_capsule.cc \ sprite_display_menu.cc \ sprite_display_scores.cc \ sprite_eye.cc \ sprite_font_game.cc \ sprite_font_menu.cc \ sprite_gem.cc \ sprite_gigablitz.cc \ sprite_guardian.cc \ sprite_money.cc \ sprite_mouse_pointer.cc \ sprite_object.cc \ sprite_paddle.cc \ sprite_projectile.cc \ sprite_ship.cc \ sprite_wall.cc \ supervisor.cc \ supervisor_bricks_level.cc \ supervisor_main_menu.cc \ supervisor_map_editor.cc \ supervisor_guards_level.cc \ supervisor_shop.cc \ surface_sdl.cc \ tecnoballz.cc \ tiles_background.cc \ tilesmap_scrolling.cc $(NULL) tecnoballz-0.93.1/src/controller_game_over.cc0000664000175000017500000002247612412501752020316 0ustar brunobruno/** * @file controller_game_over.cc * @brief Game Over controller * @created 2002-12-14 * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_game_over.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_game_over.h" #include "../include/handler_audio.h" #include "../include/handler_resources.h" #include "../include/handler_high_score.h" /** * Create the Game Over controller */ controller_game_over::controller_game_over () { littleInit (); /* there are 8 letters */ max_of_sprites = 8; sprites_have_shades = true; max_of_sprites = 8; sprite_type_id = sprite_object::GAME_OVER_LETTERS; move_phase = 0; sprite_high_score = (sprite_display_scores *) NULL; } /** * Release the Game Over controller */ controller_game_over::~controller_game_over () { if (NULL != sprite_high_score) { delete sprite_high_score; sprite_high_score = NULL; } release_sprites_list (); } /** * Return pointer to the high score object * @return A sprite_display_scores object */ sprite_display_scores * controller_game_over::get_sprite_high_score () { return sprite_high_score; } /** * Perform some initializations */ void controller_game_over::first_init (Uint32 x_offset) { char_x_offset = x_offset; /* enable_game_over score table */ sprite_high_score = new sprite_display_scores (); sprite_high_score->first_init (char_x_offset); } /** * Enable the Game Over * @param is_victory If true game is finished, play game over with * congratulations */ void controller_game_over::enable_game_over (bool is_victory) { Sint32 x = 100 * resolution; Sint32 y = 200 * resolution; const Sint32 *p = initial_coordinates; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; sprite->enable (); sprite->set_coordinates (x, y); sprite->set_image (i); Sint32 x2 = *(p++); Sint32 y2 = *(p++); sprite->x_maximum = x2; sprite->y_maximum = y2; } move_phase = 1; next_phase_counter = 50 * 10; #ifndef SOUNDISOFF bool is_ranked = high_score->is_player_ranked (); if (is_victory) { audio->play_music (handler_audio::MUSICCONGR); } else { if (is_ranked) { audio->play_music (handler_audio::MUSICSCORE); } else { audio->play_music (handler_audio::MUSICGOVER); } } #else high_score->is_player_ranked (); #endif sprite_high_score->copyToText (); } /** * Move the "GAME OVER" chars and draw high score * @param is_victory If true game is finished, play game over with * congratulations */ void controller_game_over::run (bool is_victory) { switch (move_phase) { case 0: enable_game_over (is_victory); break; case 1: displacement_01 (); break; case 2: displacement_02 (); break; case 3: displacement_03 (); break; case 4: displacement_04 (); break; } sprite_high_score->displayTxt (); sprite_high_score->draw_copy_from_bitmap (); } /** * Movement 1 */ void controller_game_over::displacement_01 () { Sint32 maxi = SIZETSINUS; Sint32 decal = 32 * resolution; const Sint32 *sinus = sinus_over; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; if (++sprite->x_maximum >= maxi) { sprite->x_maximum = 0; } if (++sprite->y_maximum >= maxi) { sprite->y_maximum = 0; } Sint32 x = char_x_offset + decal + sinus[sprite->x_maximum] * resolution; Sint32 y = decal + sinus[sprite->y_maximum] * resolution; sprite->set_coordinates (x, y); random_counter += y; } if (--next_phase_counter <= 0) { move_phase = 2; } } /** * Movement 2 */ void controller_game_over::displacement_02 () { Sint32 maxi = SIZETSINUS; Sint32 decal = 32 * resolution; const Sint32 *sinus = sinus_over; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; if (++sprite->y_maximum >= maxi) { sprite->y_maximum = 0; } Sint32 y = decal + sinus[sprite->y_maximum] * resolution; sprite->set_y_coord (y); random_counter += y; } /* move the letters "G", "A", "M", and "E" */ Sint32 f = 0; Sint32 v = 32 * resolution + char_x_offset; for (Sint32 i = 0; i < 4; i++) { sprite_object *sprite = sprites_list[i]; if (sprite->x_coord > v) { sprite->x_coord -= resolution; f = 1; } } /* move the letters "O", "V", "E", and "R" */ v = 192 * resolution + char_x_offset; for (Uint32 i = 4; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; if (sprite->x_coord < v) { sprite->x_coord += resolution; f = 1; } } if (f <= 0) { move_phase = 3; } } /** * Movement 2 */ void controller_game_over::displacement_03 () { /* move the letters "G", "A", "M" and "E" */ Sint32 f = 0; Sint32 maxi = SIZETSINUS; Sint32 decal = 32 * resolution; const Sint32 *sinus = sinus_over; for (Sint32 i = 0; i < 4; i++) { sprite_object *sprite = sprites_list[i]; if (++sprite->y_maximum >= maxi) { sprite->y_maximum = 0; } if (sprite->y_coord <= decal) { sprite->y_coord = decal; f++; } else { Sint32 y = decal + sinus[sprite->y_maximum] * resolution; sprite->set_y_coord (y); } random_counter += sprite->y_maximum; } /* move the letters "O", "V", "E" and "R" */ Sint32 v = 191 * resolution; for (Uint32 i = 4; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; if (++sprite->y_maximum >= maxi) sprite->y_maximum = 0; if (sprite->y_coord >= v) { sprite->y_coord = v; f++; } else { Sint32 y = decal + sinus[sprite->y_maximum] * resolution; sprite->set_y_coord (y); } random_counter += sprite->y_maximum; } if (f == 8) { move_phase = 4; } } /** * movement 4 : the letters are moving towards their final abscissas */ void controller_game_over::displacement_04 () { /* move the letters "G", "A", "M", and "E" */ Sint32 offst = 2 * resolution; Sint32 final = 35 * resolution + char_x_offset; for (Sint32 i = 0; i < 4; i++) { sprite_object *sprite = sprites_list[i]; Sint32 o = final - sprite->x_coord; if (o > offst) { o = offst; } else { if (o < (-offst)) { o = -offst; } } sprite->x_coord += o; final = final + 54 * resolution; random_counter += sprite->x_coord; } /* move the letters "O", "V", "E" and "R" */ final = 32 * resolution + char_x_offset; for (Uint32 i = 4; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; Sint32 o = final - sprite->x_coord; if (o > offst) { o = offst; } else { if (o < (-offst)) { o = -offst; } } sprite->x_coord += o; final = final + 54 * resolution; random_counter += sprite->x_coord; } } const Sint32 controller_game_over::sinus_over[SIZETSINUS] = { 159, 159, 159, 159, 158, 158, 158, 157, 156, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 145, 144, 142, 141, 139, 137, 135, 134, 132, 130, 128, 126, 124, 122, 120, 117, 115, 113, 111, 108, 106, 104, 101, 99, 96, 94, 91, 89, 86, 84, 81, 79, 76, 74, 71, 69, 66, 64, 61, 59, 57, 54, 52, 50, 47, 45, 43, 40, 38, 36, 34, 32, 30, 28, 26, 24, 23, 21, 19, 18, 16, 15, 13, 12, 11, 9, 8, 7, 6, 5, 4, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 21, 23, 24, 26, 28, 30, 32, 34, 36, 38, 40, 43, 45, 47, 50, 52, 54, 57, 59, 61, 64, 66, 69, 71, 74, 76, 79, 81, 84, 86, 89, 91, 94, 96, 99, 101, 104, 106, 108, 111, 113, 115, 117, 120, 122, 124, 126, 128, 130, 132, 134, 135, 137, 139, 141, 142, 144, 145, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 158, 158, 159, 159, 159, 159, }; const Sint32 controller_game_over::initial_coordinates[] = { 0, 175, 25, 150, 50, 125, 75, 100, 100, 75, 125, 50, 150, 25, 175, 0 }; tecnoballz-0.93.1/src/sprite_display_scores.cc0000664000175000017500000001576612412501752020524 0ustar brunobruno/** * @file sprite_display_scores.cc * @brief Sprite wich display text of the score table * @created 2003-04-30 * @date 2007-03-09 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_display_scores.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_display_scores.h" #include "../include/sprite_display_menu.h" #include "../include/handler_resources.h" #include "../include/handler_players.h" #include "../include/handler_high_score.h" /** * Create the sprite displaying scores */ sprite_display_scores::sprite_display_scores () { clear_sprite_members (); offscreen_text = (bitmap_data *) NULL; width_font = 8 * resolution; heightfont = 8 * resolution; if (resolution == 2) { space2next = 17; } else { space2next = 8; } run_offset = 0; max_offset = TEXT_LARGE * TEXT_HAUTE; } /** * Release the sprite displaying scores */ sprite_display_scores::~sprite_display_scores () { if (offscreen_text) delete offscreen_text; if (bitmap_fonts) delete bitmap_fonts; bitmap_fonts = (bitmap_data *) NULL; offscreen_text = (bitmap_data *) NULL; } /** * Perform some initializations */ void sprite_display_scores::first_init (Uint32 x_offset) { load_bitmap_fonts (handler_resources::BITMAP_SCORES_FONTS); /* allocate 512 * 323 pixels buffer for scores text */ offscreen_text = new bitmap_data (); offscreen_text->create_surface (TEXT_LARGE * width_font, TEXT_HAUTE * space2next); /* initialize sprite object */ make_sprite (offscreen_text); enable (); set_coordinates (32 * resolution + x_offset, 80 * resolution); copyToText (); } //------------------------------------------------------------------------------ // display the text menu into buffer memory //------------------------------------------------------------------------------ Sint32 sprite_display_scores::displayTxt () { //################################################################### // display menu text //################################################################### char *desP1 = pixel_data; Sint32 offSc = off_source; Sint32 offDs = row_size; Sint32 offD2 = row_size * (space2next - 1); //Sint32 offD2 = row_size * 8 * resolution; Sint32 *basPT = (Sint32 *) caract_adr; char *p = scorestext; char *c = ascii2code; Sint32 a, b, j; Sint32 offst = 0; Sint32 oldva = run_offset; if (resolution == 1) { for (Sint32 k = 0; k < TEXT_HAUTE; k++, desP1 += offD2) { //########################################################### // display normal line of 32 characters //########################################################### for (j = 0; j < TEXT_LARGE; j++) { a = *(p++) - 32; if (run_offset < max_offset && offst >= run_offset) run_offset++; if (offst < max_offset) offst++; if (a) { b = c[a]; Sint32 *s = (Sint32 *) basPT; Sint32 *d = (Sint32 *) desP1; b = b << 3; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 8; b++) { d[0] = s[0]; d[1] = s[1]; s = (Sint32 *) ((char *) s + offSc); d = (Sint32 *) ((char *) d + offDs); } if (run_offset > oldva) return 0; } desP1 = desP1 + 8; } } } else { for (Sint32 k = 0; k < TEXT_HAUTE; k++, desP1 += offD2) { //########################################################### // display normal line of 32 characters //########################################################### for (j = 0; j < TEXT_LARGE; j++) { a = *(p++) - 32; if (run_offset < max_offset && offst >= run_offset) run_offset++; if (offst < max_offset) offst++; if (a) { b = c[a]; Sint32 *s = (Sint32 *) basPT; Sint32 *d = (Sint32 *) desP1; b = b << 4; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 16; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; s = (Sint32 *) ((char *) s + offSc); d = (Sint32 *) ((char *) d + offDs); } if (run_offset > oldva) return 0; } desP1 = desP1 + 16; } } } return 1; } /** * Copy high score table into strings */ void sprite_display_scores::copyToText () { player_score *score = high_score->get_high_score_table (); if (NULL == score) { return; } char *ptext = scorestext + TEXT_LARGE * 2; for (Uint32 i = 0; i < handler_high_score::MAX_OF_HIGH_SCORES; i++) { char *pName = score[i].player_name; for (Uint32 j = 0; j < handler_players::PLAYER_NAME_LENGTH; j++) { ptext[j] = pName[j]; } integer_to_ascii (score[i].value, 6, &ptext[7]); integer_to_ascii (score[i].area_number, 1, &ptext[16]); integer_to_ascii (score[i].level_number, 2, &ptext[21]); ptext += TEXT_LARGE; } } //------------------------------------------------------------------------------ // scores table text //------------------------------------------------------------------------------ char sprite_display_scores::scorestext[] = " TECNOBALL TOP TEN " //0 "NAME SCORE AREA LEVEL" //1 "...... 000000 :1 01" //2 "...... 000000 :1 01" //3 "...... 000000 :1 01" //4 "...... 000000 :1 01" //5 "...... 000000 :1 01" //6 "...... 000000 :1 01" //7 "...... 000000 :1 01" //8 "...... 000000 :1 01" //9 "...... 000000 :1 01" //10 "...... 000000 :1 01"; //11 tecnoballz-0.93.1/src/handler_high_score.cc0000664000175000017500000002632412412501752017712 0ustar brunobruno/** * @file handler_high_score.cc * @brief high score handler * @created 2004-04-30 * @date 2007-10-08 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_high_score.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_high_score.h" #include "../include/sprite_display_menu.h" #include "../include/handler_resources.h" #include "../include/handler_players.h" handler_high_score * handler_high_score::high_score_singleton = NULL; /** * Create a high score handler */ handler_high_score::handler_high_score () { scores_tables = (player_score **) NULL; scores_table_size = (sizeof (Uint32) * 3 + 8) * MAX_OF_HIGH_SCORES * MAX_OF_DIFFICULTY_LEVELS + sizeof (Uint32); first_init (); } /** * Get the object instance * handler_high_score is a singleton * @return the handler_high_score object */ handler_high_score * handler_high_score::get_instance () { if (NULL == high_score_singleton) { high_score_singleton = new handler_high_score (); } return high_score_singleton; } /** * Release high score handler */ handler_high_score::~handler_high_score () { if (NULL == scores_tables) { return; } for (Uint32 i = 0; i < MAX_OF_DIFFICULTY_LEVELS; i++) { if (NULL != scores_tables[i]) { delete[](char *) scores_tables[i]; scores_tables[i] = NULL; } } delete[](char *) scores_tables; scores_tables = NULL; } /** * Perform some initializations */ void handler_high_score::first_init () { try { scores_tables = new player_score *[MAX_OF_DIFFICULTY_LEVELS]; /* allocate and fill scores tables */ for (Uint32 i = 0; i < MAX_OF_DIFFICULTY_LEVELS; i++) { scores_tables[i] = new player_score[MAX_OF_HIGH_SCORES]; player_score *score = scores_tables[i]; for (Uint32 j = 0; j < MAX_OF_HIGH_SCORES; j++) { score[j].area_number = 1; score[j].level_number = 1; score[j].value = 1000 - j * 100; score[j].player_name[0] = 'T'; score[j].player_name[1] = ' '; score[j].player_name[2] = 'L'; score[j].player_name[3] = ' '; score[j].player_name[4] = 'K'; score[j].player_name[5] = ' '; score[j].player_name[6] = 0; /* SPARC unaligned memory access */ score[j].player_name[7] = 0; } } } catch (std::bad_alloc &) { std::cerr << "(!)handler_high_score::first_init() " << "not enough memory to allocate high score table!" << std::endl; throw; } if (!load_high_score ()) { save_high_score (); } } /** * Load high score file and copy data in high score structure * @return true if the high score file is successfully loaded or false otherwise */ bool handler_high_score::load_high_score () { char * file_data = resources->load_high_score_file (); if (NULL == file_data) { return false; } Uint32 file_size = resources->get_filesize_loaded (); if (file_size != scores_table_size) { std::cerr << "(!)handler_high_score::load_high_score() " << " bad file size, " << file_size << " byte(s) instead" << scores_table_size << "bytes!" << std::endl; delete[]file_data; return false; } /* verify the checksum */ Uint32 read_sum; big_endian_to_int ((Uint32 *) file_data, &read_sum); Uint32 * ptr32 = (Uint32 *) file_data; Uint32 calculated_sum = calculate_checksum (ptr32 + 1, (scores_table_size - sizeof (Uint32)) / sizeof (Uint32)); if (calculated_sum != read_sum) { std::cerr << "(!)handler_high_score::load_high_score() " << " bad checksum, " << read_sum << " instead " << calculated_sum << "!" << std::endl; delete[]file_data; return false; } /* copy data into the structures */ char * addr = file_data + sizeof (Uint32); for (Uint32 i = 0; i < MAX_OF_DIFFICULTY_LEVELS; i++) { player_score * score = scores_tables[i]; for (Uint32 j = 0; j < MAX_OF_HIGH_SCORES; j++) { ptr32 = (Uint32 *) addr; big_endian_to_int (ptr32++, &score[j].area_number); big_endian_to_int (ptr32++, &score[j].level_number); big_endian_to_int (ptr32++, &score[j].value); addr = (char *) ptr32; for (Uint32 k = 0; k < 8; k++) { score[j].player_name[k] = *(addr++); } } } delete[]file_data; return true; } /** * Save the high score */ void handler_high_score::save_high_score () { char *file_data; try { file_data = new char[scores_table_size]; } catch (std::bad_alloc &) { std::cerr << "(!)handler_high_score::save_high_score() " << "not enough memory to allocate " << scores_table_size << "bytes!" << std::endl; throw; } Uint32 *ptr32; char *addr = file_data + sizeof (Uint32); for (Uint32 i = 0; i < MAX_OF_DIFFICULTY_LEVELS; i++) { player_score *score = scores_tables[i]; for (Uint32 j = 0; j < MAX_OF_HIGH_SCORES; j++) { ptr32 = (Uint32 *) addr; int_to_big_endian (&score[j].area_number, ptr32++); int_to_big_endian (&score[j].level_number, ptr32++); int_to_big_endian (&score[j].value, ptr32++); addr = (char *) ptr32; for (Uint32 k = 0; k < 8; k++) { *(addr++) = score[j].player_name[k]; } } } /* calculate checksum value */ ptr32 = (Uint32 *) file_data; Uint32 ckVal = calculate_checksum (ptr32 + 1, (scores_table_size - sizeof (Uint32)) / sizeof (Uint32)); int_to_big_endian (&ckVal, ptr32); resources->save_high_score_file (file_data, scores_table_size); delete[]file_data; } /** * Calculate checksum value * @param addr pointer to the data * @param data_size size of the data in long words * @return checksum value */ Uint32 handler_high_score::calculate_checksum (Uint32 * addr, Uint32 data_size) { Uint32 value = 0; for (Uint32 i = 0; i < data_size; i++) { Uint32 long_word; big_endian_to_int (addr++, &long_word); value |= long_word; } return value; } /** * Check if the current player can be inserted in the scores table * @return true if the player score is ranked, otherwise false */ bool handler_high_score::is_player_ranked () { bool is_ranked = is_player_ranked (¤t_player->player_name[0], current_player->score_value, current_player->level_number, current_player->area_number); if (is_ranked) { sort_scores (); save_high_score (); } return is_ranked; } /** * Insert a player in the score table if this player get a good score * @param playername a name of player * @param score_value a score * @param level_num level number * @param area_num area number * @return true if the player score is ranked, otherwise false */ bool handler_high_score::is_player_ranked (char *playername, Uint32 score_value, Uint32 level_num, Uint32 area_num) { /* exit if cheat mode! */ if (is_enabled_cheat_mode || birth_flag) { //return false; } /* verify if the name exists */ player_score *score = scores_tables[difficulty_level - 1]; for (Uint32 i = 0; i < MAX_OF_HIGH_SCORES; i++) { if (strcmp (playername, score[i].player_name) == 0) { if (score_value > score[i].value) { score[i].value = score_value; score[i].level_number = level_num; score[i].area_number = area_num; return true; } else { return false; } } } for (Uint32 i = 0; i < MAX_OF_HIGH_SCORES; i++) { if (score_value > score[i].value) { i = MAX_OF_HIGH_SCORES - 1; score[i].value = score_value; score[i].level_number = level_num; score[i].area_number = area_num; char *p = score[i].player_name; for (Sint32 j = 0; j < 6; j++) { p[j] = playername[j]; } if (is_verbose) { std::cout << "handler_high_score::is_player_ranked() " << "rank:" << i << " player name:" << score[i].player_name << std::endl; } return true; } } return false; } /** * Sort scores table */ void handler_high_score::sort_scores () { if (is_verbose) { std::cout << "handler_high_score::sort_scores() " << "difficulty_level:" << difficulty_level << std::endl; } bool is_sorted; player_score *score = scores_tables[difficulty_level - 1]; do { is_sorted = false; for (Uint32 i = 0; i < (MAX_OF_HIGH_SCORES - 1); i++) { if (score[i].value >= score[i + 1].value) { continue; } Uint32 tmp = score[i].value; score[i].value = score[i + 1].value; score[i + 1].value = tmp; tmp = score[i].level_number; score[i].level_number = score[i + 1].level_number; score[i + 1].level_number = tmp; tmp = score[i].area_number; score[i].area_number = score[i + 1].area_number; score[i + 1].area_number = tmp; for (Uint32 j = 0; j < 6; j++) { tmp = score[i].player_name[j]; score[i].player_name[j] = score[i + 1].player_name[j]; score[i + 1].player_name[j] = tmp; } is_sorted = true; } } while (is_sorted); } /** * Return pointer to the scores list structure * @return Pointer to a 'player_score' structure */ player_score * handler_high_score::get_high_score_table () { return scores_tables[difficulty_level - 1]; } /** * Return the player name * @return poiner to the best player name */ char * handler_high_score::get_best_playername () { player_score *score = scores_tables[difficulty_level - 1]; return &score[0].player_name[0]; } /** * Return the best player score * @return the best player score value */ Uint32 handler_high_score::get_best_score () { player_score * score = scores_tables[difficulty_level - 1]; return score[0].value; } tecnoballz-0.93.1/src/display_text_bitmap.cc0000664000175000017500000003134312412501752020145 0ustar brunobruno/** * @file display_text_bitmap.cc * @brief Display bitmap strings * @date 2007-09-13 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: display_text_bitmap.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/display_text_bitmap.h" #include "../include/handler_resources.h" /** * Create the display text object */ display_text_bitmap::display_text_bitmap () { for (Uint32 i = 0; i < 16; i++) { int_string_tmp[i] = 0; } initial_me (); } /** * Release the display text object */ display_text_bitmap::~display_text_bitmap () { destroy_me (); } //------------------------------------------------------------------------------ // small initialization //------------------------------------------------------------------------------ void display_text_bitmap::initial_me () { object_init (); bitmap_fonts = (bitmap_data *) NULL; off_source = 0; off_desti1 = 0; } /** * Release display text object */ void display_text_bitmap::destroy_me () { if (NULL != bitmap_fonts) { delete bitmap_fonts; bitmap_fonts = (bitmap_data *) NULL; } object_free (); } /** * Load fontes used in the shop and the right panel */ void display_text_bitmap::initialize () { load_bitmap_fonts (handler_resources::BITMAP_GAME_FONTS); } /** * Return height of chars in pixels * @return height of the chars in pixels */ Uint32 display_text_bitmap::get_char_height () { return char_height; } /** * Load bitmap fontes and initialize the object * @param resource_id bitmap fonts resource identifier */ void display_text_bitmap::load_bitmap_fonts (Uint32 resource_id) { bitmap_fonts = new bitmap_data (); bitmap_fonts->load (resource_id); surface_fonts = bitmap_fonts->get_surface (); caract_adr = bitmap_fonts->get_pixel_data (0, 0); //characters 'A' to 'Z' off_desti1 = game_screen->get_row_size (); //modulo destination off_source = bitmap_fonts->get_row_size (); //modulo source char_width = CHAR_WIDTH * resolution; char_height = bitmap_fonts->get_height (); rect_fonts.y = 0; rect_fonts.w = rect_destination.w = char_width; rect_destination.h = rect_fonts.h = char_height; } /** * Draw a integer into a offscreen surface * @param dest destination offscreen * @param xcoord x-coordinate on the offscreen * @param ycoord y-coordinate on the offscreen * @param value the integer value to be draw * @param padding length of the string */ void display_text_bitmap::draw (offscreen_surface *dest, Uint32 xcoord, Uint32 ycoord, Sint32 value, Uint32 padding) { integer_to_ascii (value, padding, int_string_tmp); draw (dest, xcoord, ycoord, int_string_tmp, padding); } /** * Draw a integer into a SDL_Surface * @param dest destination surface * @param xcoord x-coordinate on the surface * @param ycoord y-coordinate on the surface * @param value the integer value to be draw * @param padding length of the string */ void display_text_bitmap::draw (surface_sdl *dest, Uint32 xcoord, Uint32 ycoord, Sint32 value, Uint32 padding) { integer_to_ascii (value, padding, int_string_tmp); draw (dest, xcoord, ycoord, int_string_tmp, padding); } /** * Draw a line of text into a offscreen surface * @param dest destination offscreen * @param xcoord x-coordinate on the offscreen * @param ycoord y-coordinate on the offscreen * @param str string to draw * @param length length of the string */ void display_text_bitmap::draw (offscreen_surface *dest, Uint32 xcoord, Uint32 ycoord, const char* str, Uint32 length) { Uint32 yoffset = dest->get_vertical_offset (); draw ((surface_sdl *) dest, xcoord, ycoord + yoffset, str, length); } /** * Draw a line of text into a SDL_Surface * @param dest destination surface * @param xcoord x-coordinate on the surface * @param ycoord y-coordinate on the surface * @param str string to draw * @param length length of the string */ void display_text_bitmap::draw (surface_sdl *dest, Uint32 xcoord, Uint32 ycoord, const char* str, Uint32 length) { SDL_Surface *surface_dest = dest->get_surface (); rect_destination.x = xcoord; rect_destination.y = ycoord; if (0 == length) { length = strlen(str); } for (Uint32 i = 0; i < length; i++, rect_destination.x += char_width) { Uint32 x = str[i] - 32; if (0 == x) { continue; } rect_fonts.x = ascii2code[x] * char_width; if (SDL_BlitSurface (surface_fonts, &rect_fonts, surface_dest, &rect_destination) < 0) { std::cerr << "(!)display_text_bitmap::draw() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; break; } } } /** * Replace dots string by another string * @param src String source * @param dst String destination with dots * @param lenght Length of the string */ void display_text_bitmap::print_to_string (char *src, char *dst, Uint32 length) { char *d = strchr (dst, '.'); if (NULL == d) { d = dst; } if (length == 0) { length = strlen(src); } strncpy (d, src, length); } void display_text_bitmap::print_int_to_string (Sint32 value, Sint32 padding, char *dst) { char *d = strchr (dst, '.'); if (NULL == d) { d = dst; } integer_to_ascii (value, padding, d); } //------------------------------------------------------------------------------ // create a BOB to display string (used into guards levels) //------------------------------------------------------------------------------ sprite_object * display_text_bitmap::string2bob (const char *ptStr) { Sint32 length = strlen (ptStr); bitmap_data *bmp = new bitmap_data (); bmp->create_surface (length * char_height, char_height); Sint32 *basPT = (Sint32 *) caract_adr; char *desP1 = bmp->get_pixel_data (); Sint32 offSc = off_source; Sint32 offDs = bmp->get_row_size (); char *c = ascii2code; Sint32 a, b, h; if (resolution == 1) { for (h = 0; h < length; h++) { a = *(ptStr++) - 32; b = c[a]; Sint32 *s = (Sint32 *) basPT; Sint32 *d = (Sint32 *) desP1; b = b << 3; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 8; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; s = (Sint32 *) ((char *) s + offSc); d = (Sint32 *) ((char *) d + offDs); } desP1 = desP1 + 8; } } else { for (h = 0; h < length; h++) { a = *(ptStr++) - 32; b = c[a]; Sint32 *s = (Sint32 *) basPT; Sint32 *d = (Sint32 *) desP1; b = b << 4; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 16; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; s = (Sint32 *) ((char *) s + offSc); d = (Sint32 *) ((char *) d + offDs); } desP1 = desP1 + 16; } } sprite_object *ptBob = new sprite_object (); char *pixel = bmp->duplicate_pixel_data (); ptBob->set_pixel_data (pixel, 1); ptBob->sprite_width = bmp->get_width (); ptBob->sprite_height = bmp->get_height (); ptBob->row_size = bmp->get_row_size (); ptBob->max_of_images = 1; ptBob->offscreen_pitch = game_screen->get_row_size (); delete bmp; return ptBob; } //------------------------------------------------------------------------------ // offsets of the first 128 ASCII characters // ; = . // : = ' // ' = : // - = , // . = - //------------------------------------------------------------------------------ char display_text_bitmap::ascii2code[128] = { 26, // 32 ' ' 37, // 33 '!' 40, // 34 '"' 26, // 35 '#' space 26, // 36 '$' space 26, // 37 '%' space 26, // 38 '&' space 39, // 39 "'" //40 26, // 40 '(' space 26, // 41 ')' space 26, // 42 '*' space 26, // 43 '+' space 41, // 44 ',' //26 42, // 45 '-' //41 38, // 46 '.' //42 26, // 47 '/' space 27, // 48 '0' 28, // 49 '1' 29, // 50 '2' 30, // 51 '3' 31, // 52 '4' 32, // 53 '5' 33, // 54 '6' 34, // 55 '7' 35, // 56 '8' 36, // 57 '9' 40, // 58 ':' //39 42, // 59 ';' //38 26, // 60 '<' space 26, // 61 '=' space 26, // 62 '>' space 26, // 63 '?' space 26, // 64 '@' space 0, // 65 'A' 1, // 66 'B' 2, // 67 'C' 3, // 68 'D' 4, // 69 'E' 5, // 70 'F' 6, // 71 'G' 7, // 72 'H' 8, // 73 'I' 9, // 74 'J' 10, // 75 'K' 11, // 76 'L' 12, // 77 'M' 13, // 78 'N' 14, // 79 'O' 15, // 80 'P' 16, // 81 'Q' 17, // 82 'R' 18, // 83 'S' 19, // 84 'T' 20, // 85 'U' 21, // 86 'V' 22, // 87 'W' 23, // 88 'X' 24, // 89 'Y' 25, // 90 'Z' 26, // 91 '[' space 26, // 92 '\' space 26, // 93 ']' space 26, // 94 '^' space 26, // 95 '_' space 26, // 96 '`' space 26, // 97 'a' space 26, // 98 'b' space 26, // 99 'c' space 26, // 100 'd' space 26, // 101 'e' space 26, // 102 'f' space 26, // 103 'g' space 26, // 104 'h' space 26, // 105 'i' space 26, // 106 'j' space 26, // 107 'k' space 26, // 108 'l' space 26, // 109 'm' space 26, // 110 'n' space 26, // 111 'o' space 26, // 112 'p' space 26, // 113 'q' space 26, // 114 'r' space 26, // 115 's' space 26, // 116 't' space 26, // 117 'u' space 26, // 118 'v' space 26, // 119 'w' space 26, // 120 'x' space 26, // 121 'y' space 26, // 122 'z' space 26, // 123 '{' space 26, // 124 '|' space 26, // 125 '}' space 26, // 126 '~' space 26 // 127 ' ' space }; tecnoballz-0.93.1/src/controller_projectiles.cc0000664000175000017500000005410412412501752020666 0ustar brunobruno/** * @file controller_projectiles.cc * @brief Projectiles controller for a single paddle! * @date 2007-10-24 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_projectiles.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_projectiles.h" /** * Create the projectiles controller */ controller_projectiles::controller_projectiles () { littleInit (); countTempo = 0; max_of_sprites = MAX_OF_PROJECTILES; sprites_have_shades = false; sprite_type_id = sprite_object::PROJECTILES; if (resolution == 1) { circular_sin = &circular_sin_320[0]; } else { circular_sin = &circular_sin_640[0]; } } /** * Release the projectiles controller */ controller_projectiles::~controller_projectiles () { release_sprites_list (); } /** * Create and initialize the list of projectiles sprites * @param paddle a pointer to a paddle sprite */ void controller_projectiles::create_projectiles_list (sprite_paddle * paddle) { create_sprites_list (); gun_paddle = paddle; sprite_projectile **projectiles = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_projectile *projectile = *(projectiles++); projectile->init_members (paddle); } set_fire_1 (); } /** * Check if fire is available */ void controller_projectiles::disponible () { if (gun_paddle->fire_state == sprite_paddle::NOT_OWN_GUN) { /* not fire available */ return; } Uint32 t = max_of_sprites; sprite_projectile **projectiles = sprites_list; /* special fire 7 (circular fire) */ if (gun_paddle->length == gun_paddle->width_maxi) { for (Uint32 i = 0; i < t; i++) { sprite_projectile *projectile = *(projectiles++); if (!projectile->on_paddle) { return; } } } /* other fires */ else { for (Uint32 i = 0; i < t; i++) { sprite_projectile *projectile = *(projectiles++); if (projectile->is_enabled) { return; } } } countTempo = 0; /** fire is requested */ gun_paddle->fire_state = sprite_paddle::FIRE; #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_FIRE); #endif } /** * New fire start */ void controller_projectiles::fire () { if (gun_paddle->fire_state != sprite_paddle::NOT_OWN_GUN) { Sint32 i = gun_paddle->length; paddle_length = i; /* smallest paddle is of 16/32 pixels width */ i -= gun_paddle->width_mini; /* size of paddle step by 8/16 pixels */ i >>= gun_paddle->shift_width; switch (i) { case 0: init_type1 (); break; case 1: init_type2 (); break; case 2: init_type3 (); break; case 3: init_type4 (); break; case 4: init_type5 (); break; case 5: init_type6 (); break; case 6: init_type7 (); break; } } } /** * Fire 1: 16/32 pixels paddle's whidth */ void controller_projectiles::init_type1 () { sprite_paddle *paddle = gun_paddle; if (paddle->fire_state != sprite_paddle::FIRE) { return; } paddle->fire_state = sprite_paddle::OWN_GUN; Sint32 x = paddle->x_coord; Sint32 y = paddle->y_coord; if (paddle->is_vertical) { y += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2); } else { x += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2); } sprite_projectile *projectile = sprites_list[0]; projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } /** * Fire 2: 24/48 pixels paddle's whidth */ void controller_projectiles::init_type2 () { sprite_paddle *paddle = gun_paddle; if (paddle->fire_state != sprite_paddle::FIRE) { return; } paddle->fire_state = sprite_paddle::OWN_GUN; Sint32 x = paddle->x_coord; Sint32 y = paddle->y_coord; if (paddle->is_vertical) { y += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2); } else { x += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2); } sprite_projectile **projectiles = sprites_list; sprite_projectile *projectile; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } /** * Fire 3: 24/48 pixels paddle's whidth */ void controller_projectiles::init_type3 () { sprite_paddle *paddle = gun_paddle; if (paddle->fire_state != sprite_paddle::FIRE) { return; } paddle->fire_state = sprite_paddle::OWN_GUN; Sint32 x = paddle->x_coord; Sint32 y = paddle->y_coord; if (paddle->is_vertical) { y += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2); } else { x += (paddle_length / 2) - (SIZE_OF_PROJECTILE / 2); } sprite_projectile **projectiles = sprites_list; sprite_projectile *projectile; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *projectiles; projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } /** * Fire 4: 40/80 pixels paddle's whidth */ void controller_projectiles::init_type4 () { sprite_paddle *paddle = gun_paddle; if (paddle->fire_state != sprite_paddle::FIRE) { return; } paddle->fire_state = sprite_paddle::OWN_GUN; Sint32 x = paddle->x_coord; Sint32 y = paddle->y_coord; sprite_projectile **projectiles = sprites_list; sprite_projectile *projectile; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; if (paddle->is_vertical) { y += 18 * resolution; } else { x += 18 * resolution; } projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; if (paddle->is_vertical) { y = paddle->y_coord + paddle->length - 4; } else { x = paddle->x_coord + paddle->length - 4; } projectile = *projectiles; projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } /** * Fire 5: 48/96 pixels paddle's whidth */ void controller_projectiles::init_type5 () { sprite_paddle *paddle = gun_paddle; if (paddle->fire_state != sprite_paddle::FIRE) { return; } paddle->fire_state = sprite_paddle::OWN_GUN; Sint32 x = paddle->x_coord; Sint32 y = paddle->y_coord; sprite_projectile **projectiles = sprites_list; sprite_projectile *projectile; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; Sint32 quarter = paddle_length / 4; if (paddle->is_vertical) { Sint32 i = paddle->projectile_xinc1; x += i; y += quarter; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; x += i; y += quarter; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; x -= i; y += quarter; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; x -= i; y += quarter - 2 * resolution; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } else { Sint32 i = paddle->projectile_yinc1; y += i; x += quarter; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; y += i; x += quarter; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; y -= i; x += quarter; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; y -= i; x += quarter - 2 * resolution; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } } /** * Fire 6: 56/112 pixels paddle's whidth */ void controller_projectiles::init_type6 () { sprite_paddle *paddle = gun_paddle; if (paddle->fire_state != sprite_paddle::FIRE) { return; } paddle->fire_state = sprite_paddle::OWN_GUN; sprite_projectile **projectiles = sprites_list; Sint32 x = paddle->x_coord; Sint32 y = paddle->y_coord; Sint32 offst = 22 * resolution; sprite_projectile *projectile; if (paddle->is_vertical) { Sint32 a = x + paddle->projectile_xoffset; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = a; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; y += offst; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; y += offst; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = a; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } else { Sint32 o = y + paddle->projectile_yoffset; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = o; x += offst; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; x += offst; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = o; projectile = *(projectiles++); projectile->is_enabled = true; projectile->x_coord = x; projectile->y_coord = y; } } /** * Fire 7: 64/128 pixels paddle's width */ void controller_projectiles::init_type7 () { sprite_paddle *paddle = gun_paddle; /* paddle is firing? */ if (paddle->fire_state == sprite_paddle::FIRE) { paddle->fire_state = sprite_paddle::OWN_GUN; sprite_projectile **projectiles = sprites_list; Sint32 x = paddle->x_coord + paddle->projectile_xcenter; Sint32 y = paddle->y_coord + paddle->projectile_ycenter; Sint32 j = 0; for (Sint32 i = 0; i < 7; i++, j += 8) { sprite_projectile *projectile = *(projectiles++); projectile->on_paddle = false; projectile->fire_Xscie = x; projectile->fire_Yscie = y; projectile->indexSinus = j; } } /* fire on the paddle */ else { sprite_projectile **projectiles = sprites_list; paddle->fire_state = sprite_paddle::OWN_GUN; for (Sint32 i = 0; i < 7; i++) { sprite_projectile *projectile = *(projectiles++); if (projectile->is_enabled) { return; } } projectiles = sprites_list; Sint32 x = paddle->x_coord + paddle->projectile_xcenter; Sint32 y = paddle->y_coord + paddle->projectile_ycenter; Sint32 j = 0; for (Sint32 i = 0; i < 7; i++, j += 8) { sprite_projectile *projectile = *(projectiles++); projectile->is_enabled = true; projectile->on_paddle = true; projectile->fire_Xscie = x; projectile->fire_Yscie = y; projectile->indexSinus = j; } } } /** * Move paddle's projectiles */ void controller_projectiles::move () { Sint32 i = gun_paddle->length; paddle_length = i; /* smallest paddle width is of 16/32 pixels */ i -= gun_paddle->width_mini; /* size of paddle step by 8/16 pixels */ i >>= gun_paddle->shift_width; switch (i) { case 0: move_type1 (); break; case 1: move_type2 (); break; case 2: move_type3 (); break; case 3: move_type4 (); break; case 4: move_type5 (); break; case 5: move_type6 (); break; case 6: move_type7 (); break; } } /** * Move linear projectile (paddle's size: 16/32 pixels) */ void controller_projectiles::move_type1 () { sprite_projectile *projectile = sprites_list[0]; sprite_paddle *paddle = gun_paddle; projectile->x_coord += paddle->projectile_xinc0; projectile->y_coord += paddle->projectile_yinc0; } /** * Move "fishtail fire" (paddle's size: 24/48 pixels) */ void controller_projectiles::move_type2 () { sprite_projectile **projectiles = sprites_list; sprite_paddle *paddle = gun_paddle; Sint32 a = countTempo; Sint32 b, c, d; a++; if (a > 20) { a = 0; } countTempo = a; if (a > 10) { a = paddle->projectile_xinc1; b = paddle->projectile_yinc1; c = paddle->projectile_xinc2; d = paddle->projectile_yinc2; } else { a = paddle->projectile_xinc2; b = paddle->projectile_yinc2; c = paddle->projectile_xinc1; d = paddle->projectile_yinc1; } sprite_projectile *projectile; projectile = *(projectiles++); projectile->x_coord += a; projectile->y_coord += b; projectile = *projectiles; projectile->x_coord += c; projectile->y_coord += d; } /** * Move "triangle fire" (paddle's size: 32/64 pixels) */ void controller_projectiles::move_type3 () { sprite_projectile **projectiles = sprites_list; sprite_paddle *paddle = gun_paddle; Sint32 i, j; sprite_projectile *projectile; /* shot leaves to the left */ projectile = *(projectiles++); i = paddle->projectile_xinc1; j = paddle->projectile_yinc1; projectile->x_coord += i; projectile->y_coord += j; /* shot leaves any right */ projectile = *(projectiles++); i = paddle->projectile_xinc0; j = paddle->projectile_yinc0; projectile->x_coord += i; projectile->y_coord += j; /* shot leaves to the right */ projectile = *projectiles; i = paddle->projectile_xinc2; j = paddle->projectile_yinc2; projectile->x_coord += i; projectile->y_coord += j; } /** * Move "fishtail fire" + "linear fire" (paddle of 40/80 pixels width) */ void controller_projectiles::move_type4 () { Sint32 i, j; i = countTempo; i++; if (i > 20) { i = 0; } countTempo = i; sprite_projectile **projectiles = sprites_list; sprite_paddle *paddle = gun_paddle; sprite_projectile *projectile; /* [1] linar projectile */ projectile = *(projectiles++); j = paddle->projectile_xinc0; projectile->x_coord += j; j = paddle->projectile_yinc0; projectile->y_coord += j; if (i > 10) { /* [2] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc1; j = paddle->projectile_yinc1; projectile->x_coord += i; projectile->y_coord += j; /* [3] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc2; j = paddle->projectile_yinc2; projectile->x_coord += i; projectile->y_coord += j; } else { /* [2] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc2; j = paddle->projectile_yinc2; projectile->x_coord += i; projectile->y_coord += j; /* [3] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc1; j = paddle->projectile_yinc1; projectile->x_coord += i; projectile->y_coord += j; } /* [1] linar projectile */ projectile = *projectiles; i = paddle->projectile_xinc0; j = paddle->projectile_yinc0; projectile->x_coord += i; projectile->y_coord += j; } /** * Move 5 linears projectiles (paddle of 48/96 pixels width) */ void controller_projectiles::move_type5 () { sprite_projectile **projectiles = sprites_list; sprite_paddle *paddle = gun_paddle; Sint32 x = paddle->projectile_xinc0; Sint32 y = paddle->projectile_yinc0; for (Sint32 i = 0; i < 5; i++) { sprite_projectile *projectile = *(projectiles++); projectile->x_coord += x; projectile->y_coord += y; } } /** * Move 4 linears projectiles + 2 fishtails projectiles * (paddle of 56/112 pixels) */ void controller_projectiles::move_type6 () { Sint32 a, i, j; a = countTempo; a++; if (a > 20) { a = 0; } countTempo = a; sprite_projectile **projectiles = sprites_list; sprite_paddle *paddle = gun_paddle; i = paddle->projectile_xinc0; j = paddle->projectile_yinc0; sprite_projectile *projectile = *(projectiles++); projectile->x_coord += i; projectile->y_coord += j; projectile = *(projectiles++); projectile->x_coord += i; projectile->y_coord += j; if (a > 10) { /* [3] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc1; j = paddle->projectile_yinc1; projectile->x_coord += i; projectile->y_coord += j; /* [4] fishtail prjectile */ projectile = *(projectiles++); i = paddle->projectile_xinc2; j = paddle->projectile_yinc2; projectile->x_coord += i; projectile->y_coord += j; } else { /* [3] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc2; j = paddle->projectile_yinc2; projectile->x_coord += i; projectile->y_coord += j; /* [4] fishtail projectile */ projectile = *(projectiles++); i = paddle->projectile_xinc1; j = paddle->projectile_yinc1; projectile->x_coord += i; projectile->y_coord += j; } i = paddle->projectile_xinc0; j = paddle->projectile_yinc0; projectile = *(projectiles++); projectile->x_coord += i; projectile->y_coord += j; projectile = *projectiles; projectile->x_coord += i; projectile->y_coord += j; } /* * Move 7 circular projectiles (paddle of 56/128 pixels) */ void controller_projectiles::move_type7 () { sprite_projectile **projectiles = sprites_list; sprite_paddle *paddle = gun_paddle; for (Sint32 i = 0; i < 7; i++) { sprite_projectile *projectile = *(projectiles++); if (!projectile->is_enabled) { continue; } Sint32 j = projectile->indexSinus; j += 2; const Sint16 *table = circular_sin + j; if (*table == 99) { j = 0; table = circular_sin; } projectile->indexSinus = j; if (projectile->on_paddle) { Sint32 k = *(table++); k += paddle->x_coord + paddle->projectile_xcenter; projectile->x_coord = k; k = *table; k += paddle->y_coord + paddle->projectile_ycenter; projectile->y_coord = k; } else { projectile->fire_Xscie += paddle->projectile_xinc0; projectile->fire_Yscie += paddle->projectile_yinc0; Sint32 k = *(table++); k += projectile->fire_Xscie; projectile->x_coord = k; k = *table; k += projectile->fire_Yscie; projectile->y_coord = k; } } } /** * Enable fire power 1 */ void controller_projectiles::set_fire_1 () { sprite_projectile **projectiles = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_projectile *projectile = *(projectiles++); projectile->set_power1 (); } } /** * Enable fire power 2 */ void controller_projectiles::set_fire_2 () { sprite_projectile **projectiles = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_projectile *projectile = *(projectiles++); projectile->set_power2 (); } } /** * Sinus used for he fire 7 in 640 pixels resolution */ const Sint16 controller_projectiles::circular_sin_640[] = { 15 * 2, -3 * 2, 13 * 2, -7 * 2, 11 * 2, -10 * 2, 9 * 2, -12 * 2, 7 * 2, 13 * 2, 3 * 2, -15 * 2, 0 * 2, -15 * 2, -3 * 2, -15 * 2, -6 * 2, -14 * 2, -9 * 2, -12 * 2, -11 * 2, -10 * 2, -13 * 2, -07 * 2, -14 * 2, -04 * 2, -15 * 2, -01 * 2, -15 * 2, 3 * 2, -13 * 2, 7 * 2, -11 * 2, 10 * 2, -9 * 2, 12 * 2, -7 * 2, 13 * 2, -3 * 2, 15 * 2, 0 * 2, 15 * 2, 3 * 2, 15 * 2, 6 * 2, 14 * 2, 9 * 2, 12 * 2, 11 * 2, 10 * 2, 13 * 2, 7 * 2, 14 * 2, 4 * 2, 15 * 2, 1 * 2, 99, 99, 99, 99 }; /** * Sinus used for he fire 7 in 320 pixels resolution */ const Sint16 controller_projectiles::circular_sin_320[] = { 15, -3, 13, -7, 11, -10, 9, -12, 7, -13, 3, -15, 0, -15, -3, -15, -6, -14, -9, -12, -11, -10, -13, -7, -14, -4, -15, -1, -15, 3, -13, 7, -11, 10, -9, 12, -7, 13, -3, 15, 0, 15, 3, 15, 6, 14, 9, 12, 11, 10, 13, 7, 14, 4, 15, 1, 99, 99, 99, 99 }; tecnoballz-0.93.1/src/controller_balls.cc0000664000175000017500000014170112412501752017440 0ustar brunobruno/** * @file controller_balls.cc * @brief Control the balls. Move and collisions * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_balls.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_balls.h" #include "../include/controller_paddles.h" #include "../include/handler_players.h" #include "../include/handler_keyboard.h" #include "../include/handler_display.h" #include "../include/handler_audio.h" #include "../include/list_sprites.h" /** * Create the balls controller into guards levels */ controller_balls::controller_balls () { littleInit (); glue_delay = 60; tilt_delay = 60; max_of_sprites = 20; sprites_have_shades = true; balls_are_controlled = false; sprite_type_id = sprite_object::BALLS; } /** * Release the balls controller */ controller_balls::~controller_balls () { release_sprites_list (); } /** * Initialize the balls before one level * @param start Time delay before the ball leaves the paddle (first time) * @param glue Time delay before the ball leaves (glue option) * @param speed Time delay before the ball accelerates * @param tilt Time delay before "tilt" is available * @param table speed ball (1 to 4) */ void controller_balls::init (Uint32 start, Uint32 glue, Uint32 speed, Uint32 tilt, Uint32 table) { controller_paddles *paddles = controller_paddles::get_instance (); glue_delay = glue; tilt_delay = tilt; Sint16 *velocities = sprite_ball::get_velocities (table); paddle_bottom = paddles->get_paddle (controller_paddles::BOTTOM_PADDLE); Sint32 w; if (current_phase == GUARDS_LEVEL) { /* the width of a brick in pixels */ w = 16 * resolution; } else { paddle_right = paddles->get_paddle (controller_paddles::RIGHT_PADDLE); paddle_top = paddles->get_paddle (controller_paddles::TOP_PADDLE); paddle_left = paddles->get_paddle (controller_paddles::LEFT_PADDLE); paddle_robot = paddles->get_paddle (controller_paddles::ROBOT_PADDLE); controller_bricks *bricks = controller_bricks::get_instance (); w = bricks->get_brick_width (); } /* initialize all balls */ for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; ball->once_init (start, speed, paddle_bottom, velocities, w); } /* first ball special initialization */ sprite_ball *ball = sprites_list[0]; paddle_bottom->stuck_ball = ball; ball->init_first_ball (paddle_bottom->collision_width); /* one ball on the screen */ num_of_sprites = 1; if (current_phase == BRICKS_LEVEL) { controller_ejectors *ejectors = controller_ejectors::get_instance (); ejectors->initialize_ball_positions (&sprite_ball::ejector_coords[0]); } } /** * Move the balls and check the collisions in the bricks levels */ void controller_balls::run_in_bricks_levels () { activate_tilt (); bricks_collision (); move_balls (); collisions_with_paddles (); collisions_with_robot (); /* collisions between balls and the 3 walls */ collisions_with_walls (); /* collisions between balls and the 4 ejectors */ handle_ejectors (); collisions_with_ships (); collisions_with_eyes (); /* control balls with the left mouse button */ controll_balls (); accelerate (); check_outside_balls (); if (!balls_are_controlled) { check_tilt_availability (); } } /** * Move the balls and check the collisions in the guardians levels */ void controller_balls::run_in_guardians_level () { check_outside_balls_guards_level (); activate_tilt (); move_balls_in_guards_level (); collisions_with_sides (); /* prevent that the ball remains blocked horizontally */ prevent_horizontal_blocking (); collisions_with_paddle (); collisions_with_guardians (); check_tilt_availability (); accelerate (); } /** * Check if balls go out of the screen of game */ void controller_balls::check_outside_balls () { Sint32 min_x = sprite_ball::X_MINIMUM * resolution; Sint32 max_x = sprite_ball::X_MAXIMUM * resolution; Sint32 min_y = sprite_ball::Y_MINIMUM * resolution; Sint32 max_y = sprite_ball::Y_MAXIMUM * resolution; controller_ships *ships = controller_ships::get_instance (); right_panel_score *panel = right_panel_score::get_instance (); head_animation *head_anim = head_animation::get_instance (); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } sprite_paddle *paddle = NULL; Sint32 j = ball->x_coord; if (j < min_x) { paddle = paddle_left; } else { if (j >= (max_x - (Sint32) ball->collision_width)) { paddle = paddle_right; } else { j = ball->y_coord; if (j < min_y) { paddle = paddle_top; } else if (j > max_y) { paddle = paddle_bottom; } } } /* ball is out of screen? */ if (NULL == paddle) { /* no, continue */ continue; } /* paddle id enabled ? */ if (!paddle->is_enabled) { /* no, sey he bottom paddle by default */ paddle = paddle_bottom; } /* * there is still at least one ball */ if (--num_of_sprites > 0) { ball->remove (paddle_bottom); continue; } /* * the player loses his last ball and a life */ /* one starts again with only one ball */ num_of_sprites = 1; ball->paddle_touched->stick_ball (ball); ball->starts_again (ball->paddle_touched); head_anim->start_interference (); current_player->remove_life (1); ships->force_explosion (); #ifndef SOUNDISOFF audio->play_lost_music (); audio->play_sound (handler_audio::LOST_LIFE); #endif short_info_messages *messages = short_info_messages::get_instance (); messages->send_message_request (short_info_messages::LOST_FILE); messages->send_message_request (short_info_messages::ARE_YOU_READY); panel->reset_gigablitz_countdown (); controller_bricks *bricks = controller_bricks::get_instance (); bricks->start_cycling (); tiles_background *tiles = tiles_background::get_instance (); tiles->set_scroll_type (tiles_background::TILES_SCROLL_LOST); } } /** * Check if balls go out of the screen of game */ void controller_balls::check_outside_balls_guards_level () { Sint32 max_y = sprite_ball::Y_MAXIMUM * resolution; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } if (ball->y_coord <= max_y) { continue; } if (--num_of_sprites > 0) { ball->remove (paddle_bottom); continue; } /* * the player loses a life */ /* one starts again with only one ball */ num_of_sprites = 1; paddle_bottom->stick_ball (ball); ball->starts_again (paddle_bottom); ball->set_power_2 (); current_player->remove_life (1); #ifndef SOUNDISOFF audio->play_sound (handler_audio::LOST_LIFE); #endif } } /** * Activate the tilt if 2 buttons are pressed simultaneously */ void controller_balls::activate_tilt () { if (!keyboard->is_gigablitz_or_tilt ()) { return; } bool is_tilt = false; Sint32 delay = tilt_delay; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled || ball->tilt_delay_counter < delay) { continue; } is_tilt = true; break; } if (!is_tilt) { return; } Sint32 rand = random_counter; rand = rand & 15; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } if (ball->direction < 64) { Sint32 d = (ball->direction >> 2) & 0xf; ball->direction = sprite_ball::tilt_directions[d][rand]; } ball->tilt_delay_counter = 0; } #ifndef SOUNDISOFF audio->play_sound (handler_audio::TECNOBALL); #endif display->tilt_screen (); } /** * handle the acceleration of the balls */ void controller_balls::accelerate () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *balle = sprites_list[i]; if (balle->is_enabled) balle->accelerate (); } } /** * Displacement of the balls in bricks level */ void controller_balls::move_balls () { Sint32 j; sprite_paddle *paddle; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } /* save previous position */ ball->previous_x_coord = ball->x_coord; ball->previous_y_coord = ball->y_coord; /* the ball is not sticked */ if (ball->sticky_paddle_num == 0) { /* the balle moves */ j = ball->direction; if (j > 64) { std::cerr << "controller_balls::" << "move_balls() ball->direction = " << j << std::endl; j = 60; } Sint16 *velocities = ball->velocities; velocities = (Sint16 *) ((char *) velocities + j); Sint32 offset = *(velocities++); ball->x_coord += (offset * resolution); offset = *velocities; ball->y_coord += (offset * resolution); continue; } paddle = ball->paddle_touched; if (--ball->start_delay_counter == 0) { tiles_background *tiles = tiles_background::get_instance (); tiles->set_scroll_type (tiles_background::TILES_NO_SCROLL); ball->sticky_paddle_num = 0; if (paddle->sticky_state == sprite_paddle::BUSY_STICKY_PADDLE) { paddle->sticky_state = sprite_paddle::FREE_STICKY_PADDLE; } paddle->stuck_ball = (sprite_ball *) NULL; continue; } /* displacement of the balls sticked to the paddle */ switch (ball->sticky_paddle_num) { case controller_paddles::BOTTOM_PADDLE: j = (paddle->collision_width >> 1) - ((ball->collision_width >> 1) + 1); j += paddle->x_coord; ball->x_coord = j; j = (paddle->y_coord) - (ball->collision_height + 1); ball->y_coord = j; break; case controller_paddles::RIGHT_PADDLE: j = (paddle->x_coord) - (ball->collision_width - 1); ball->x_coord = j; j = (paddle->collision_height >> 1) - ((ball->collision_height >> 1) + 1); j += paddle->y_coord; ball->y_coord = j; break; case controller_paddles::TOP_PADDLE: j = (paddle->collision_width >> 1) - ((ball->collision_width >> 1) + 1); j += paddle->x_coord; ball->x_coord = j; j = (paddle->y_coord) + paddle->collision_height + 1; ball->y_coord = j; break; case controller_paddles::LEFT_PADDLE: j = (paddle->x_coord) + (paddle->collision_width) + 1; ball->x_coord = j; j = (paddle->collision_height >> 1) - ((ball->collision_height >> 1) + 1); j += paddle->y_coord; ball->y_coord = j; break; } if (--ball->viewfinder_delay < 0) { ball->viewfinder_delay = 8; if (++ball->viewfinder_direction > 13) { ball->viewfinder_direction = 0; } paddle = ball->paddle_touched; ball->direction = paddle->direct_tab[ball->viewfinder_direction]; } } } /** * Displacement of the balls in guardians level */ void controller_balls::move_balls_in_guards_level () { Sint32 j; sprite_paddle *paddle; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } /* the ball is not sticked */ if (ball->sticky_paddle_num == 0) { /* the balle moves */ j = ball->direction; if (j > 64) { std::cerr << "controller_balls::" << "move_balls_in_guards_level() ball->direction = " << j << std::endl; j = 60; } Sint16 *velocities = ball->velocities; velocities = (Sint16 *) ((char *) velocities + j); Sint32 offset = *(velocities++); ball->x_coord += (offset * resolution); offset = *velocities; ball->y_coord += (offset * resolution); continue; } paddle = ball->paddle_touched; if (--ball->start_delay_counter == 0) { ball->sticky_paddle_num = 0; if (paddle->sticky_state == sprite_paddle::BUSY_STICKY_PADDLE) { paddle->sticky_state = sprite_paddle::FREE_STICKY_PADDLE; } paddle->stuck_ball = (sprite_ball *) NULL; continue; } /* displacement of the balls sticked to the paddle */ switch (ball->sticky_paddle_num) { case controller_paddles::BOTTOM_PADDLE: j = (paddle->collision_width >> 1) - ((ball->collision_width >> 1) + 1); j += paddle->x_coord; ball->x_coord = j; j = (paddle->y_coord) - (ball->collision_height + 1); ball->y_coord = j; break; } if (--ball->viewfinder_delay < 0) { ball->viewfinder_delay = 8; if (++ball->viewfinder_direction > 13) { ball->viewfinder_direction = 0; } paddle = ball->paddle_touched; ball->direction = paddle->direct_tab[ball->viewfinder_direction]; } } } /** * Collisions betweeb balls and paddles in bricks level */ void controller_balls::collisions_with_paddles () { Sint32 j, x, y; sprite_paddle *paddle, *touched_paddle; paddle_bottom->is_hit_ball = false; paddle_right->is_hit_ball = false; paddle_top->is_hit_ball = false; paddle_left->is_hit_ball = false; right_panel_score *panel = right_panel_score::get_instance (); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled || ball->sticky_paddle_num > 0 || ball->direction >= 64) { continue; } /* bottom paddle */ paddle = paddle_bottom; touched_paddle = NULL; if (paddle->is_enabled) { x = paddle->x_coord; y = paddle->y_coord; if (ball->x_coord + (Sint32) ball->collision_width > x && ball->y_coord + (Sint32) ball->collision_height > y && ball->x_coord < x + (Sint32) paddle->collision_width && ball->y_coord < y + (Sint32) paddle->collision_height) { ball->y_coord = y - ball->collision_height; touched_paddle = paddle; panel->reset_gigablitz_countdown (); } } /* right paddle */ if (NULL == touched_paddle) { paddle = paddle_right; if (paddle->is_enabled) { x = paddle->x_coord; y = paddle->y_coord; if (ball->x_coord + (Sint32) ball->collision_width > x && ball->y_coord + (Sint32) ball->collision_height > y && ball->x_coord < x + (Sint32) paddle->collision_width && ball->y_coord < y + (Sint32) paddle->collision_height) { ball->x_coord = x - ball->collision_width; touched_paddle = paddle; } } } /* top paddle */ if (NULL == touched_paddle) { paddle = paddle_top; if (paddle->is_enabled) { x = paddle->x_coord; y = paddle->y_coord; if (ball->x_coord + (Sint32) ball->collision_width > x && ball->y_coord + (Sint32) ball->collision_height > y && ball->x_coord < x + (Sint32) paddle->collision_width && ball->y_coord < y + (Sint32) paddle->collision_height) { ball->y_coord = y + paddle->collision_height; touched_paddle = paddle; } } } /* left paddle */ if (NULL == touched_paddle) { paddle = paddle_left; if (paddle->is_enabled) { x = paddle->x_coord; y = paddle->y_coord; if (ball->x_coord + (Sint32) ball->collision_width > x && ball->y_coord + (Sint32) ball->collision_height > y && ball->x_coord < x + (Sint32) paddle->collision_width && ball->y_coord < y + (Sint32) paddle->collision_height) { ball->x_coord = x + paddle->collision_width; touched_paddle = paddle; } } } /* does the ball touch a paddle? */ if (NULL != touched_paddle) { touched_paddle->is_hit_ball = true; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_PADDLE); #endif ball->paddle_touched = touched_paddle; ball->tilt_delay_counter = 0; j = ball->direction; if (j > 64) { std::cerr << "controller_balls::collisions_with_paddles() " << "(1) ball->direction " << j; j = 64; } const Sint32 *bounces = touched_paddle->current_bounces; bounces = (Sint32 *) ((char *) bounces + j); j = *bounces; ball->direction = j; if (touched_paddle->sticky_state == sprite_paddle::FREE_STICKY_PADDLE && !touched_paddle->stuck_ball) { /* ball is sticked on the paddle */ touched_paddle->sticky_state = sprite_paddle::BUSY_STICKY_PADDLE; touched_paddle->stuck_ball = (sprite_ball *) ball; ball->stick_paddle = touched_paddle; /* time of the stick */ ball->start_delay_counter = glue_delay; ball->sticky_paddle_num = paddle->paddle_number; } } } } /** * Collisions balls and the paddle in guardians level */ void controller_balls::collisions_with_paddle () { Sint32 j, x, y; const Sint32 *monPT; sprite_paddle *paddle, *touched_paddle; paddle_bottom->is_hit_ball = false; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } paddle = paddle_bottom; if (!paddle->is_enabled) { continue; } touched_paddle = NULL; x = paddle->x_coord; y = paddle->y_coord; if (ball->x_coord + (Sint32) ball->collision_width > x && ball->y_coord + (Sint32) ball->collision_height > y && ball->x_coord < x + (Sint32) paddle->collision_width && ball->y_coord < y + (Sint32) paddle->collision_height) { ball->y_coord = y - ball->collision_height; touched_paddle = paddle; } /* does the ball touch a paddle */ if (touched_paddle == NULL) { continue; } touched_paddle->is_hit_ball = true; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_PADDLE); #endif ball->paddle_touched = touched_paddle; ball->tilt_delay_counter = 0; j = ball->direction; monPT = touched_paddle->current_bounces; monPT = (Sint32 *) ((char *) monPT + j); ball->direction = *monPT; if (touched_paddle->sticky_state == sprite_paddle::FREE_STICKY_PADDLE) { /* ball glued to the paddle */ touched_paddle->sticky_state = sprite_paddle::BUSY_STICKY_PADDLE; touched_paddle->stuck_ball = (sprite_ball *) ball; ball->stick_paddle = touched_paddle; /* time of the glue */ ball->start_delay_counter = glue_delay; ball->sticky_paddle_num = paddle->paddle_number; } } } /** * Handle collisions balls with robot paddle */ void controller_balls::collisions_with_robot () { if (paddle_robot->enable_counter == 0) { return; } sprite_paddle *paddle = paddle_robot; paddle->is_hit_ball = false; Sint32 x1 = paddle->x_coord; Sint32 y1 = paddle->y_coord; Sint32 x2 = paddle->x_coord + paddle->collision_width; Sint32 y2 = paddle->y_coord + paddle->collision_height + 8; const Sint32 *monPT; Sint32 j; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } if (ball->x_coord + (Sint32) ball->collision_width > x1 && ball->y_coord + (Sint32) ball->collision_height > y1 && ball->x_coord < x2 && ball->y_coord < y2) { ball->y_coord = y1 - ball->collision_height; paddle->is_hit_ball = true; j = ball->direction; monPT = paddle->current_bounces; monPT = (Sint32 *) ((char *) monPT + j); ball->direction = *monPT; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_PADDLE); #endif } } } /** * Handle ejectors in bricks level */ void controller_balls::handle_ejectors () { controller_ejectors *ejectors = controller_ejectors::get_instance (); sprite_object *eject0 = ejectors->get_ejector (controller_ejectors::TOP_LEFT_EJECTOR); sprite_object *eject1 = ejectors->get_ejector (controller_ejectors::BOTTOM_LEFT_EJECTOR); sprite_object *eject2 = ejectors->get_ejector (controller_ejectors::BOTTOM_RIGHT_EJECTOR); sprite_object *eject3 = ejectors->get_ejector (controller_ejectors::TOP_RIGHT_EJECTOR); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } /* the ball is on an ejector */ if (ball->ejector_table != NULL) { ball->ejector_delay++; if (ball->ejector_delay >= 200) { ball->ejector_delay = 0; ball->ejector_table = NULL; } /* time before ejection */ else if (ball->ejector_delay == 160) { ball->direction = ball->ejector_table[random_counter & 0xF]; } continue; } /* * if not test if a ball is aspired by an ejector */ /* top-left */ if (ball->collision (eject0)) { ball->pull (eject0, 10 * resolution, 10 * resolution); ball->set_on_ejector (controller_ejectors::TOP_LEFT_EJECTOR); } else { /* top-right */ if (ball->collision (eject3)) { ball->pull (eject3, 5 * resolution, 10 * resolution); ball->set_on_ejector (controller_ejectors::TOP_RIGHT_EJECTOR); } else { /* bottom-left */ if (ball->collision (eject1)) { ball->pull (eject1, 10 * resolution, 5 * resolution); ball-> set_on_ejector (controller_ejectors::BOTTOM_LEFT_EJECTOR); } else { /* bottom-right */ if (ball->collision (eject2)) { ball->pull (eject2, 5 * resolution, 5 * resolution); ball-> set_on_ejector (controller_ejectors:: BOTTOM_RIGHT_EJECTOR); } } } } } } /** * Collisions of the balls with the 4 walls in the bricks levels */ void controller_balls::collisions_with_walls () { controller_sides_bricks *sides_bricks = controller_sides_bricks::get_instance (); Sint32 left_xcoord = sides_bricks->get_left_xcoord (); Sint32 right_xcoord = sides_bricks->get_right_xcoord (); Sint32 top_ycoord = sides_bricks->get_top_ycoord (); sprite_wall *wall = sprite_wall::get_instance (); Sint32 bottom_ycoord = wall->get_y_coord (); bool is_wall = wall->is_enable (); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } Sint32 x = ball->x_coord; Sint32 y = ball->y_coord; Sint32 *monPT = NULL; /* collision with the bottom wall, if it's enable */ if (is_wall && y > (bottom_ycoord - (Sint32) ball->collision_height)) { monPT = rb7; } else { /* collision with the left wall */ if (x < left_xcoord) { if (sides_bricks->collision_with_left_wall (y)) { monPT = rb5; } } else { /* collision with the right wall */ x += ball->collision_width; if (x > right_xcoord) { if (sides_bricks->collision_with_right_wall (y)) monPT = rb1; } else { /* collision with the up wall */ if (y < top_ycoord) { if (sides_bricks->collision_with_top_wall (x)) monPT = rb3; } } } } /* collision dectected */ if (NULL != monPT) { monPT = (Sint32 *) ((char *) monPT + ball->direction); ball->direction = *monPT; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_SIDE); #endif } } } /** * Collisions of the balls with the 3 sides in the guardians levels */ void controller_balls::collisions_with_sides () { Sint32 left_xcoord, right_xcoord; if (resolution == 1) { left_xcoord = 16; right_xcoord = 300; } else { left_xcoord = 20; right_xcoord = 612; } Sint32 top_ycoord = 8 * resolution; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } Sint32 x = ball->x_coord; Sint32 y = ball->y_coord; Sint32 *bounce = NULL; if (x < left_xcoord) { bounce = rb5; ball->x_coord = left_xcoord; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_SIDE); #endif ball->last_hited_wall = controller_sides_bricks::LEFT_WALL; } else { if (x > right_xcoord) { bounce = rb1; ball->x_coord = right_xcoord; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_SIDE); #endif ball->last_hited_wall = controller_sides_bricks::RIGHT_WALL; } else { if (y < top_ycoord) { bounce = rb3; ball->y_coord = top_ycoord; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_SIDE); #endif ball->last_hited_wall = controller_sides_bricks::TOP_WALL; } else { ball->last_hited_wall = 0; } } } if (bounce != NULL) { bounce = (Sint32 *) ((char *) bounce + ball->direction); ball->direction = *bounce; } } } /** * Prevent that the ball remains blocked horizontally in guardians level */ void controller_balls::prevent_horizontal_blocking () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = sprites_list[i]; if (!ball->is_enabled) { continue; } Sint32 direction = ball->direction; if (direction >= 32) { direction -= 32; } if (direction == ball->previous_direction) { if (ball->change_direction_count++ > 360 && direction == 0 && ball->last_hited_wall > 0) { if (ball->direction == 32) { ball->direction = 28; } else { ball->direction = 4; } } } else { ball->previous_direction = direction; ball->change_direction_count = 0; } } } /** * Check for collision balls with bricks */ void controller_balls::bricks_collision () { controller_bricks *bricks = controller_bricks::get_instance (); /* brick's width in pixels */ Uint32 brick_width = bricks->get_brick_width (); /* y-offset between 2 bricks: 8 or 16 pixels */ Sint32 byoff = bricks->getYOffset (); /* first indestructible brick */ Sint32 indestructible = bricks->get_indestructible_offset (); sprite_ball **balls = sprites_list; brick_info *bricks_map = bricks->get_bricks_map (); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (!ball->is_enabled) { continue; } /* true if collision with a indestructible brick */ bool indes_col = false; /* 4 points of collision with a brick */ Sint32 *points = ball->brick_collision_points; Sint32 bounce_inc = 1; /* index used for bounce */ Sint32 bounce_index = 0; /* for the 4 collision pointof the ball */ for (Sint32 j = 0; j < 4; j++, bounce_inc += bounce_inc) { Sint32 x = ball->x_coord; x += *(points++); Sint32 y = ball->y_coord; y += *(points++); /* list of bricks to clear or redraw */ brick_redraw *redraw = bricks->get_bricks_redraw (); redraw->xcoord_collision = x; redraw->ycoord_collision = y; x /= brick_width; y /= byoff; /* 16 bricks per lines */ y *= controller_bricks::MAX_OF_BRICKS_HORIZONTALLY; x += y; brick_info *brick = (bricks_map + x); //printf("x: %i; x_coord: %i; y_coord: %i\n", x, ball->x_coord, ball->y_coord); //x = brick->source_offset; /* collision between a ball and a brick? */ //if (0 == x) if (brick->source_offset == 0) { /* no collision */ continue; } redraw->is_gigablitz_destroyed = false; redraw->paddle = ball->paddle_touched; if (!has_background) { //printf("x: %i; x_coord: %i; y_coord: %i; brick->sprite: %p\n", x, ball->x_coord, ball->y_coord, (void*)brick->sprite); brick->sprite->touch (); } //x = x - indestructible; x = x - 25088 //if (x >= 0) if (brick->source_offset >= indestructible) { /* * indestructible brick touched! */ /* collision with indestructible brick */ indes_col = true; /* indestructible/destructible bricks? */ //if ((x -= brick_width) > 0) if (brick->source_offset > (Sint32) (indestructible + brick_width)) { if (ball->type == sprite_ball::POWER_2) { redraw->pixel_offset = brick->pixel_offset; redraw->brick_map = brick; redraw->is_indestructible = true; redraw->number = brick->number; redraw->sprite = brick->sprite; redraw->is_background = true; /* clear brick code */ brick->source_offset = 0; /* restore background under brick */ bricks->bricks_redraw_next (); } else { //x = 2; #ifndef SOUNDISOFF audio-> play_sound (handler_audio::HIT_INDESTRUCTIBLE_BRICK2); #endif } } else { /* brick's really indestructible */ //x = 1; #ifndef SOUNDISOFF audio-> play_sound (handler_audio::HIT_INDESTRUCTIBLE_BRICK1); #endif } } /* * normal brick touched */ else { redraw->is_indestructible = false; redraw->pixel_offset = brick->pixel_offset; redraw->brick_map = brick; redraw->sprite = brick->sprite; brick->h_pos = brick->h_pos - (ball->strength1 * 2); if (brick->h_pos <= 0) { brick->h_pos = 0; /* clear brick code */ brick->source_offset = 0; redraw->number = brick->number; /* restore background */ redraw->is_background = true; } else { brick->source_offset = brick->source_offset - ball->strength2; redraw->number = brick->pixel_offset; /* redraw a new brick */ redraw->is_background = false; } bricks->bricks_redraw_next (); } /* inc. bounce index */ bounce_index += bounce_inc; } if (--bounce_index >= 0) { if (indes_col || ball->type == sprite_ball::NORMAL) { Sint32 *rebPT = *(brick_jump + bounce_index); rebPT = (Sint32 *) ((char *) rebPT + ball->direction); ball->direction = *rebPT; } } } } /** * Collisions between balls and eyes */ void controller_balls::collisions_with_eyes () { controller_magnetic_eyes *eyes = controller_magnetic_eyes::get_instance (); Sint32 hypo = eyes->hypotenuse; sprite_ball **liste = sprites_list; Sint32 numof_eyes = eyes->get_max_of_sprites (); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(liste++); if (!ball->is_enabled) { continue; } sprite_eye **eyes_list = eyes->get_sprites_list (); for (Sint32 j = 0; j < numof_eyes; j++) { sprite_eye *eye = *(eyes_list++); if (!eye->is_enabled) { continue; } Sint32 center_x = eye->x_coord + eyes->center_x; Sint32 center_y = eye->y_coord + eyes->center_y; Sint32 delta_x = ball->x_coord + (ball->collision_width / 2) - center_x; delta_x = delta_x * delta_x; Sint32 delta_y = ball->y_coord + (ball->collision_width / 2) - center_y; delta_y = delta_y * delta_y; if (delta_x + delta_y >= hypo) { continue; } delta_x = ball->x_coord + (ball->collision_width / 2) - center_x; delta_y = ball->y_coord + (ball->collision_width / 2) - center_y; if (delta_y == 0) { if (delta_x < 0) { ball->direction = 32; } else { ball->direction = 0; } } if (delta_y > 0) { if (delta_x == 0) { ball->direction = 48; } if (delta_x < 0) { delta_x = -delta_x; if (delta_x == delta_y) { ball->direction = 40; } if (delta_x < delta_y) { ball->direction = 44; } else { ball->direction = 36; } } else { if (delta_x == delta_y) { ball->direction = 56; } if (delta_x < delta_y) { ball->direction = 52; } else { ball->direction = 56; } } } if (delta_y < 0) { delta_y = -delta_y; if (delta_x == 0) { ball->direction = 16; } if (delta_x < 0) { delta_x = -delta_x; if (delta_x == delta_y) { ball->direction = 24; } if (delta_x < delta_y) { ball->direction = 20; } else { ball->direction = 28; } } else { if (delta_x == delta_y) { ball->direction = 8; } if (delta_x < delta_y) { ball->direction = 12; } else { ball->direction = 4; } } } } } } /** * Collisions between balls and ships */ void controller_balls::collisions_with_ships () { controller_ships *ships = controller_ships::get_instance (); sprite_ball **balls = sprites_list; Uint32 t = ships->get_max_of_sprites (); sprite_ship **ships_list = ships->get_sprites_list (); Sint32 nouve = (random_counter & 0xF) << 2; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (!ball->is_enabled) { continue; } Sint32 h = ball->collision_width; h = h - 2; Sint32 x1 = ball->x_coord; Sint32 x2 = x1 + h; x1 -= 20; Sint32 y1 = ball->y_coord; Sint32 y2 = y1 + h; y1 -= 26; sprite_ship **ships = ships_list; for (Uint32 j = 0; j < t; j++) { sprite_ship *ship = *(ships++); if (ship->enable_counter > 0) { continue; } Sint32 k = ship->y_coord; if (k < y2 && k > y1) { k = ship->x_coord; if (k < x2 && k > x1) { current_player->add_score (100); #ifndef SOUNDISOFF audio->play_sound (handler_audio::HIT_SHIP); #endif k = (ball->type + 1) * 4; ship->strength -= k; if (ship->strength < 1) { ship->destroy (ball); } ball->direction = nouve; } } } } } /** * Collision of balls with the guardians in the guardians levels */ void controller_balls::collisions_with_guardians () { controller_guardians *guards = controller_guardians::get_instance (); controller_capsules *capsules = controller_capsules::get_instance (); controller_moneys *moneys = controller_moneys::get_instance (); /* number of balls from 1 to n */ Uint32 numof_balls = max_of_sprites; sprite_ball **balls = sprites_list; /* number of guardians from 1 to 2 */ Uint32 numof_guards = guards->get_max_of_sprites (); sprite_guardian **guards_list = guards->get_sprites_list (); for (Uint32 j = 0; j < numof_guards; j++) { sprite_guardian *guardian = guards_list[j]; if (!guardian->is_enabled || guardian->energy_level <= 0) { continue; } sprite_ball *ball_hit = NULL; Sint32 grdx1 = guardian->x_coord; Sint32 grdx2 = grdx1 + guardian->gard_colx2; grdx1 += guardian->gard_colx1; Sint32 grdy1 = guardian->y_coord; Sint32 grdy2 = grdy1 + guardian->gard_coly2; grdy1 += guardian->gard_coly1; for (Uint32 i = 0; i < numof_balls; i++) { sprite_ball *ball = balls[i]; if (!ball->is_enabled) { continue; } Sint32 x = ball->x_coord; if (x <= grdx2) { Sint32 y = ball->y_coord; if (y <= grdy2) { x += ball->collision_width; if (x > grdx1) { y += ball->collision_width; if (y > grdy1) { x = ((random_counter + i) & 0xF) << 2; #ifndef SOUNDISOFF audio->play_sound (handler_audio::HIT_GUARDIAN); #endif ball->direction = x; guardian->recently_touched = 5; guardian->energy_level -= ball->strength1; if (guardian->energy_level <= 0) { /* guardian is dead */ guardian->energy_level = 0; /* make exploding guardian! */ guardian->explode_delay_counter = 500; } ball_hit = ball; } } } } } if (NULL != ball_hit) { moneys->send_money_from_guardian (ball_hit); capsules->check_if_send_capsule (ball_hit); } } } /** * Return the first enable ball * @return a pointer to ball sprite */ sprite_ball * controller_balls::get_first_ball () { sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { return ball; } } return sprites_list[0]; } /** * Enable control of the balls with left mouse button into bricks levels */ void controller_balls::enable_balls_control () { balls_are_controlled = true; } /** * Add 2 ball into the ejectors in the bricks levels */ void controller_balls::extra_balls () { add_balls (2); } /** * Add n ball(s) into the ejector(s) in the bricks levels * @param nball from 1 to n */ void controller_balls::add_balls (Uint32 nball) { if (nball < 1) { nball = max_of_sprites; } sprite_ball **balls = sprites_list; Uint32 count = 0; Uint32 ejector_id = random_counter & 3; Uint32 delay = 1; for (Uint32 i = 0; i < max_of_sprites && count < nball; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { continue; } ball->enbale_on_ejector (ejector_id++, delay); count++; num_of_sprites++; delay += 2; } } /** * Add 3 balls starting from the first enable ball */ void controller_balls::multi_balls () { sprite_ball *model = get_first_ball (); /* direction of the current ball */ Uint32 j = model->direction; Uint32 i = 0; Uint32 count = 0; sprite_ball **balls = sprites_list; while (i < max_of_sprites && count < 3) { sprite_ball *ball = *(balls++); if (!ball->is_enabled) { j += 8; j &= 60; ball->duplicate_from (model, j); num_of_sprites++; count++; } i++; } } /** * Transform all the enable balls into balls power 1 */ void controller_balls::set_power_1 () { sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { ball->set_power_1 (); } } } /** * Transform all the enable balls into balls power 2 */ void controller_balls::set_power_2 () { sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { ball->set_power_2 (); } } } /** * Transform all the enable balls into balls size 2 (7*7 or 14*14) */ void controller_balls::set_size_2 () { sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { ball->set_size_2 (); } } } /** * Transform all the enable balls into balls size 3 (10*10 or 20*20) */ void controller_balls::set_size_3 () { sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { ball->set_size_3 (); } } } /** * Increase the speed of the balls to the maximum */ void controller_balls::set_maximum_speed () { sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (ball->is_enabled) { ball->set_maximum_speed (); } } } /** * Check if the player can use the tilt */ void controller_balls::check_tilt_availability () { bool is_tilted = false; sprite_ball **balls = sprites_list; Sint32 delay = tilt_delay; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (!ball->is_enabled || ball->sticky_paddle_num > 0) { continue; } if (ball->tilt_delay_counter == delay) { is_tilted = true; } ball->tilt_delay_counter++; } if (is_tilted) { if (current_phase == BRICKS_LEVEL) { head_animation *head_anim = head_animation::get_instance (); head_anim->start_yawn (); } #ifndef SOUNDISOFF audio->play_sound (handler_audio::TILT_ALARM); #endif } } /** * Handle the control of the balls with the left mouse button */ void controller_balls::controll_balls () { if (!balls_are_controlled or ! keyboard->is_right_button ()) { return; } sprite_ball **balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball *ball = *(balls++); if (!ball->is_enabled) { continue; } Sint32 dball = ball->direction; if (dball < 64) { dball = dball + 4; dball = dball & 60; ball->direction = dball; } } } /** * Check if there remains at least a ball glue * @return True if remains at least a ball glue */ bool controller_balls::is_sticky_balls_remains () { sprite_ball ** balls = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_ball * ball = *(balls++); if (ball->sticky_paddle_num > 0) { return 1; } } return 0; } /* * directions of the ball after a rebound on a brick */ Sint32 controller_balls::rb0[16] = { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 }; /* right rebound */ Sint32 controller_balls::rb1[16] = { 32, 28, 24, 20, 20, 24, 24, 28, 32, 36, 40, 40, 44, 44, 40, 36 }; Sint32 controller_balls::rb2[16] = { 48, 36, 40, 44, 32, 44, 24, 28, 32, 36, 40, 44, 48, 48, 44, 40 }; /* top rebond */ Sint32 controller_balls::rb3[16] = { 60, 60, 56, 52, 48, 44, 40, 36, 36, 40, 40, 44, 48, 52, 56, 56 }; Sint32 controller_balls::rb4[16] = { 0, 4, 8, 0, 0, 52, 56, 60, 48, 52, 56, 44, 48, 52, 56, 60 }; /* left rebond */ Sint32 controller_balls::rb5[16] = { 0, 4, 8, 8, 12, 12, 8, 4, 0, 60, 56, 52, 52, 36, 56, 60 }; Sint32 controller_balls::rb6[16] = { 0, 4, 8, 12, 16, 20, 24, 12, 16, 12, 8, 4, 0, 4, 8, 60 }; /* bottom rebond */ Sint32 controller_balls::rb7[16] = { 4, 8, 12, 12, 16, 20, 20, 24, 28, 28, 24, 20, 16, 12, 8, 4 }; Sint32 controller_balls::rb8[16] = { 16, 20, 24, 12, 16, 20, 24, 28, 32, 36, 40, 28, 32, 20, 24, 28 }; Sint32 * controller_balls::brick_jump[15] = { rb1, rb3, rb2, rb5, rb1, rb4, rb3, rb7, rb8, rb2, rb1, rb6, rb7, rb5, rb1 }; tecnoballz-0.93.1/src/main.cc0000664000175000017500000001453612412501752015031 0ustar brunobruno/** * @file main.cc * @brief The main function is where the program starts execution * @created 2002-08-21 * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: main.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/tecnoballz.h" #include "../include/handler_display.h" #include "../include/handler_audio.h" #include "../include/configfile.h" configfile configuration; /** * Returns to the standard GP2X menu. */ #ifdef TECNOBALLZ_GP2X void returnToMenu (void) { /* This is how to quit back to the menu - calling exit() will just cause * the GP2X to "hang". execl() will replace the current process image * with that of the menu program, and then execute it */ chdir ("/usr/gp2x"); execl ("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL); } #else #ifdef TECNOBALLZ_PSP void returnToMenu (void) { //sceKernelExitGame (); } #endif #endif /** * The main function is where the program starts execution */ Sint32 main (Sint32 arg_count, char **arg_values) { /* GP2X or PSP port */ #ifdef TECNOBALLZ_HANDHELD_CONSOLE /* Use atexit() to call the return-to-menu function, * in case of crashes, etc. */ atexit (returnToMenu); #endif configuration.load (); if (!configuration.scan_arguments (arg_count, arg_values)) { return 0; } if (tecnoballz::is_verbose) { std::cout << "================================" << std::endl << "TecnoballZ starts! " << std::endl << "================================" << std::endl; } Sint32 error = 0; try { tecnoballz::first_init (&configuration); tecnoballz::game_begin (); } catch (std::ios_base::failure& fail) { std::cerr << "(!)std::ios_base::failure" << std::endl; std::cerr << fail.what() << std::endl; } catch (...) { std::cerr << "fatal error" << std::endl; tecnoballz::release_all_objects (&configuration); throw; } if (tecnoballz::is_verbose) { std::cout << "================================" << std::endl; } tecnoballz::release_all_objects (&configuration); if (tecnoballz::is_verbose) { std::cout << "TecnoballZ is finished! ========" << std::endl; } configuration.save (); return error; } /* a faire importer le fichier lispreader.c de powermanga et l'encapsuler en c++ afficher le niveau de difficulte dans le magasin retoucher les briques ameliorer la gestion du clavier (genre sdlmame) supprimer l'inverseur apres la perte d'une balle [OK] desactiver le tilt pour les balles controles [OK] utiliser les tilemaps de 16x16 originales dans le definlement menu/gardiens pour eviter d'utiliser les tilemaps 32x32 (qui ont ete doubles avec GIMP) refaire donc un mapeditor special pour le 640x480 [OK] gigablitz doit tuer les bouisbouis - si une raquette enclenche un multiballes pendant la musique lost, couper cette musique - si le joueur perd une balle et qu'il a le bouton droit presse ne pas ejecter la balle de suite attendre qu'il relache le bouton [OK] si game over supprimer les gems - faire les textes du jeu (intro, magasin, jeu) en francais et anglais (fichiers externes) - accelerer l'affichage des mini messages si beaucoup de bonus [OK] faire des fonds defilents des tableaux briques - ? mettre les donnees (tableaux, sprites?, ...) au format XML avec tiny xml - ? utiliser kyro comme moteur de sprites - ? mode balle Arkanoid ? main *mentatCode => tecnoballz *liste_BOBs => list_sprites *supervisor => supervisor configfile => lispreader => *GFX_bitmap *GIF_bitMap => bitmap_data *BOB_killer => sprite_object *giga_blitz => sprite_gigablitz *mousePoint => sprite_mouse_pointer *technoBall => sprite_ball *techno_eye => sprite_eye *techno_gem => sprite_gem *tecno_boui => sprite_ship *tecno_bump => sprite_paddle *tecno_caps => sprite_money *tecnoDefil => sprite_font_menu *tecno_fire => sprite_projectile *tecno_gads => sprite_capsule *tecno_gard => sprite_guardian *tecno_miss => sprite_bullet *tecno_text => sprite_font_game *ballDirect => controller_viewfinders *lesBriques => controller_bricks *printmoney => controller_indicators *zeBouiBoui => controller_ships *zeCapsules => controller_moneys *zeCongBall => controller_spheres *zeDefilTxt => controller_font_menu *zeFireBump => controller_fires *ze_gadgets => controller_capsules *zeGameOver => controller_game_over *zeGemstone => controller_gems *zeGigaBlit => controller_gigablitz *zeguardian => controller_guardians *ze_magneye => controller_magnetic_eyes *zeMissiles => controller_bullets *zeMoveText => controller_font_game *zeNewBalls => controller_balls *zeRaquette => controller_paddles *zexplosion => controller_explosions *tableaux_Z => supervisor_bricks_level *gard_tecno => supervisor_guards_level *shop_tecno => supervisor_shop *menu_tecno => supervisor_supervisor_map_editoror *scrolledit => supervisor_main_menu *escapeMenu => item_popup_menu *audiomixer => handler_audio *clavierMac => handler_keyboard *ecran_hard => handler_display => offscreen_surface *RAM_killer => handler_memory *ressources => handler_resources *scoretable => handler_score_table *joueurData => handler_players *level_data => handler_levels *print_text => display_text_bitmap *zeMiniMess => short_info_messages *barreScore => right_panel_score *briqueCote => controller_sides_bricks *ejectBalls => controller_ejectors *fond_ecran => tiles_background *head_anima => head_animation *lastScroll => tilesmap_scrolling *print_menu => sprite_display_menu *score_over => sprite_display_scores */ tecnoballz-0.93.1/src/short_info_messages.cc0000664000175000017500000002074212412501752020142 0ustar brunobruno/** * @file short_info_messages.cc * @brief Display short info messages in bricks levels * @created 2002-12-30 * @date 2007-03-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: short_info_messages.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/short_info_messages.h" #include "../include/handler_resources.h" short_info_messages * short_info_messages::info_messages_singleton = NULL; /** * Create the info messages object */ short_info_messages::short_info_messages () { messages = NULL; bitmap_small_fonts = (bitmap_data *) NULL; restore_surface = (bitmap_data *) NULL; delay_counter = 0; object_init (); } /** * Relesae the info messages object */ short_info_messages::~short_info_messages () { if (NULL != bitmap_small_fonts) { delete bitmap_small_fonts; bitmap_small_fonts = (bitmap_data *) NULL; } if (NULL != restore_surface) { delete restore_surface; restore_surface = (bitmap_data *) NULL; } if (NULL != messages) { delete[](char *) messages; messages = NULL; } object_free (); info_messages_singleton = NULL; } /** * Get the object instance * short_info_messages is a singleton * @return the short_info_messages object */ short_info_messages * short_info_messages::get_instance () { if (NULL == info_messages_singleton) { info_messages_singleton = new short_info_messages (); } return info_messages_singleton; } /** * Initialize, load fonts bitmap, create offscreen */ void short_info_messages::initialize () { if (NULL == bitmap_small_fonts) { bitmap_small_fonts = new bitmap_data (); bitmap_small_fonts->load (handler_resources::BITMAP_SMALL_FONTS); dest_offset = game_screen->get_row_size (); src_offset = bitmap_small_fonts->get_row_size (); screen = game_screen->get_pixel_data (XCOORD_MESSAGE * resolution, YCOORD_MESSAGE * resolution); font_pixels = bitmap_small_fonts->get_pixel_data (); /* height of a char 6 or 12 pixels */ height_font = 6 * resolution; /* width of a char 4 or 8 pixels */ width_font = 4 * resolution; } /* more initialization if exists a static background with bricks * and ejectors draw inside*/ init_with_background(); /* load message strings from a simple text file */ if (NULL == messages) { messages = resources->load_texts (handler_resources::TEXTS_MESSAGES, MAX_OF_MESSAGES, MAX_OF_CHARS, 0); for (Uint32 i = 0; i < MAX_OF_MESSAGES; i++) { char *str = messages[i]; for (Uint32 j = 0; j < MAX_OF_CHARS; j++) { char c = str[j]; if (' ' == c) { str[j] = '['; continue; } if ('!' == c) { str[j] = '\\'; continue; } if ('?' == c) { str[j] = ']'; continue; } if ('.' == c) { str[j] = '^'; continue; } if (c < 'A' or c > 'Z') { str[j] = '['; } } } } clear_messages_request (); } /** * Save background for restore */ void short_info_messages::init_with_background () { if (!has_background) { return; } background = background_screen->get_pixel_data (XCOORD_MESSAGE * resolution, YCOORD_MESSAGE * resolution); /* width of message surface 16*4=64 or 16*8=128 */ width_surface = width_font * MAX_OF_CHARS; if (NULL == restore_surface) { restore_surface = new bitmap_data (); restore_surface->create_surface (width_surface, height_font); restore_pixels = restore_surface->get_pixel_data (); } /* save the background under message */ char *dest = restore_pixels; char *source = background; Sint32 mod = background_screen->get_row_size (); for (Uint32 y = 0; y < height_font; y++) { for (Uint32 x = 0; x < width_surface; x++) { dest[x] = source[x]; } dest = dest + width_surface; source = source + mod; } } /** * Clear all message request */ void short_info_messages::clear_messages_request () { for (Uint32 i = 0; i < MAX_OF_MESSAGES; i++) { messages_request[i] = false; } } /** * Request for display a message * @param id message identifier from 0 to 34 */ void short_info_messages::send_message_request (Uint32 id) { messages_request[id] = true; } /** * Display short info messages */ void short_info_messages::run () { if (delay_counter > 0) { draw (); return; } Sint32 i = MAX_OF_MESSAGES; while (--i >= 0) { if (!messages_request[i]) { continue; } messages_request[i] = false; current_char = 0; delay_counter = 66; required_message = messages[i]; draw (); return; } } /** * Draw or clear a info message */ void short_info_messages::draw () { if (current_char < 16) { /* draw a message */ if (has_background) { display_in_background (); } else { display (height_font); } current_char++; } else { delay_counter--; if (has_background) { if (delay_counter < height_font) { clear_message (); } } else { Uint32 h = height_font; if (delay_counter <= h ) { h = delay_counter; } display (h); } } } /** * Draw the message * @param height of a char */ void short_info_messages::display (Uint32 height) { Sint32 font_mod = src_offset; Sint32 dest_mod = dest_offset; char *dest = screen; for (Sint32 i = 0; i < current_char; i++, dest += width_font) { Sint32 c = required_message[i] - 'A'; char *font = font_pixels + c * 16 * resolution; char *d = dest; for (Uint32 y = 0; y < height; y++, font += font_mod, d += dest_mod) { for (Uint32 x = 0; x < width_font; x++) { char pixel = font[x]; if (pixel != 0) { d[x] = pixel; } } } } } /** * Display the message character by character in the background */ void short_info_messages::display_in_background () { const char *str = required_message; str = str + current_char; Sint32 c = *str - 'A'; char *font = font_pixels + c * 16 * resolution; Sint32 font_mod = src_offset; Sint32 dest_mod = dest_offset; char *dest1 = screen + (current_char * width_font); char *dest2 = background + (current_char * width_font); for (Uint32 y = 0; y < height_font; y++) { for (Uint32 x = 0; x < width_font; x++) { char pixel = font[x]; if (pixel > 0) { dest1[x] = pixel; dest2[x] = pixel; } } font = font + font_mod; dest1 = dest1 + dest_mod; dest2 = dest2 + dest_mod; } } /** * Clear the message line by line */ void short_info_messages::clear_message () { Sint32 xcoord = XCOORD_MESSAGE * resolution; Sint32 ycoord = (YCOORD_MESSAGE * resolution) + delay_counter; char *dest1 = game_screen->get_pixel_data (xcoord, ycoord); char *dest2 = background_screen->get_pixel_data (xcoord, ycoord); char *source = restore_pixels + (delay_counter * width_surface); for (Uint32 i = 0; i < width_surface; i++) { char pixel = source[i]; dest1[i] = pixel; dest2[i] = pixel; } } tecnoballz-0.93.1/src/supervisor_shop.cc0000664000175000017500000007245412412501752017362 0ustar brunobruno/** * @file supervisor_shop.cc * @brief Shop supervisor * @date 2012-08-19 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_shop.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/supervisor_shop.h" #include "../include/handler_resources.h" #include "../include/supervisor_main_menu.h" #include "../include/sprite_display_menu.h" /** * Create the shop supervisor */ supervisor_shop::supervisor_shop () { initialize (); menu_events = new handler_menu_events(); tiles_ground = tiles_background::get_instance (); mouse_pointer = new sprite_mouse_pointer (); led_indicator = new sprite_object (); power_up_capsules = controller_capsules::get_instance (); display_text = new display_text_bitmap (); popup_menu = new handler_popup_menu (); current_selected_option = 0; some_infos_index = INFO_PADDLES; is_already_view_info = false; current_price = 0; num_of_bought_capsules = 0; led_indicator_xcoord = 0; led_indicator_ycoord = 0; is_caspule_drag = false; blink_capsule = (sprite_capsule *) NULL; options_frame_xmin = 6 * resolution; options_frame_xmax1 = 283 * resolution; options_frame_xmax2 = 51 * resolution; options_frame_ymax1 = 173 * resolution; options_frame_ymax2 = 218 * resolution; selected_capsule_index = -1; is_drawn_select_cursor = false; capsules_frame_ymin = 3 * resolution; capsules_frame_ymax = 171 * resolution + capsules_frame_ymin; select_cursor_xcoord = 292 * resolution; select_cursor_ycoord = 0; select_cursor_width = 21 * resolution; select_cursor_height = 9 * resolution; select_cursor_color = 0; select_cursor_sin_index = 0; /* last key pressed */ previous_key_code_down = 0; /* if cheat_code_input == cheat_code then is_enabled_cheat_mode = 1 */ cheat_code_input = 0; cheat_code = SDLK_e << 24 | SDLK_t << 16 | SDLK_b << 8 | SDLK_RETURN; box_texts = NULL; } /** * Release the shop supervisor */ supervisor_shop::~supervisor_shop () { delete popup_menu; delete display_text; delete power_up_capsules; if (NULL != led_indicator) { delete led_indicator; led_indicator = (sprite_object *) NULL; } if (NULL != box_texts) { delete[](char *) box_texts; box_texts = NULL; } delete mouse_pointer; delete tiles_ground; delete menu_events; release (); } /** * Initialize the shop supervisor */ void supervisor_shop::first_init () { box_texts = resources->load_texts (handler_resources::TEXTS_SHOP, 0, BOX_LENGTH_STRING, 3); //for (Uint32 i = 0; i < 36; i++) // { // printf ("%02d): %s \n", i, box_texts[i]); // } Uint32 area_num = current_player->get_area_number (); Uint32 level_num = current_player->get_level_number (); #ifndef SOUNDISOFF audio->play_level_music (area_num, level_num); audio->play_shop_music (area_num); #endif sprites->reset (); /* copy name player into menu text */ display_text->print_to_string (current_player->get_name (), box_texts[TEXT_WELCOME]); //char * dest; //dest = current_player->get_name (); display_text->print_int_to_string (current_player->get_num_of_lifes (), 2, box_texts[TEXT_LIVES_LEFT]); display_text->print_int_to_string (MAX_OF_CAPSULES_BOUGHT, 2, box_texts[TEXT_CANNOT_BUY_MORE]); /* copy area code */ if (area_num > 1) { char * code = (char *) supervisor_main_menu::get_area_code (area_num, difficulty_level); display_text->print_to_string (code, box_texts[TEXT_AREA_CODE], supervisor_main_menu::AREA_CODE_LENGTH); } /* dest = &info_text1[6 * BOX_LENGTH_STRING]; for (Uint32 i = 0; i < (BOX_LENGTH_STRING * 2); i++) { dest[i] = source[i]; } source = &sprite_display_menu::difficulte[(difficulty_level - 1) * 4]; dest = &info_text1[8 * BOX_LENGTH_STRING + 16]; for (Sint32 i = 0; i < 4; i++) { dest[i] = source[i]; } */ resources->load_sprites_bitmap (); /* initialize the led indicator */ if (resolution == 1) { led_indicator->create_sprite (sprite_object::SHOP_LED_INDICATOR_320, sprites_bitmap, false); } else { led_indicator->create_sprite (sprite_object::SHOP_LED_INDICATOR_640, sprites_bitmap, false); } sprites->add (led_indicator); led_indicator->enable (); /* initialize the power-up capsules */ power_up_capsules->create_shop_sprites_list (); current_player->clear_shopping_cart (); Sint32 * tp = temporary_shopping_cart; for (Uint32 i = 0; i < MAX_OF_CAPSULES_BOUGHT; i++) { *(tp++) = 0; } sprite_capsule **capsules = power_up_capsules->get_sprites_list (); drag_sprite = capsules[(MAX_OF_CAPSULES_BOUGHT + 2) - 1 - 1]; /* initialize the mouse pointer */ mouse_pointer->create_pointer_sprite (sprites_bitmap); /* intialize the "escape menu" */ popup_menu->first_init (sprites_bitmap); resources->release_sprites_bitmap (); display_text->initialize (); /* load bitmap background of the shop */ bitmap_data * bmp = new bitmap_data (); bmp->load (handler_resources::BITMAP_SHOP); background_screen->blit_surface (bmp, 0, 0, 0, 0, bmp->get_width (), bmp->get_height ()); delete bmp; background_screen->blit_to_surface (game_screen); put_current_text (box_texts[TEXT_WELCOME]); if (!current_player->is_budget_prices ()) { char *str = box_texts[TEXT_WELCOME] + BOX_LENGTH_STRING * 2; for (Uint32 i = 0; i < BOX_LENGTH_STRING; i++) { str[i] = ' '; } } keyboard->set_grab_input (false); tiles_ground->set_4_color_palette (); menu_events->begin( 48 * resolution, 44 * resolution, 0, 0, 5, 3, options_frame_xmin, 0 ); } /** * The main loop of the shop */ Uint32 supervisor_shop::main_loop () { display->wait_frame (); /* copy the background offscreen to the game offscreen */ background_screen->blit_to_surface (game_screen, 290 * resolution, 3 * resolution, 26 * resolution, 180 * resolution); /* display the 3 lines of text */ display_box_text (); /* display current price and credit */ display_text->draw (game_screen, 263 * resolution, 227 * resolution, current_price, 6); display_text->draw (game_screen, 263 * resolution, 183 * resolution, current_player->get_money_amount (), 6); display->lock_surfaces (); next_phase = 0; sprites->clear (); if (!popup_menu->is_enable ()) { set_select_cursor_coordinates (); Sint32 x = mouse_pointer->get_x_coord (); Sint32 y = mouse_pointer->get_y_coord (); if (!is_caspule_drag) { Sint32 x2, y2; bool is_left_up = keyboard->is_left_button_up (&x2, &y2); is_left_up |= menu_events->check(); if (is_left_up) { Sint32 option = get_option_over_mouse_cursor (x, y); if (option == current_selected_option) { Sint32 option_id = available_options_id[option]; purchase_option_or_capsule (option_id); } } else { if (!keyboard->is_left_button ()) { current_selected_option = get_option_over_mouse_cursor (x, y); current_price = get_price_and_update_led (current_selected_option); } } } else { current_price = get_price_and_update_led (-1); } capsule_drag_and_drop (); } mouse_pointer->move (); if (is_enabled_cheat_mode) { power_up_capsules->play_animation_in_shop (2); } else { power_up_capsules->play_animation_in_shop (1); } /* display the cursor of the bonus selected in the list on the right */ draw_select_cursor (); sprites->draw (); display_capsules_bought (); Sint32 popup_event = popup_menu->run (); /* copy whole game surface into screen surface */ display->unlock_surfaces (); display->window_update (); /* escape key to quit the game! */ if (keyboard->command_is_pressed (handler_keyboard::QUIT_TECNOBALLZ) || popup_event == handler_popup_menu::QUIT_TECNOBALLZ) { next_phase = LEAVE_TECNOBALLZ; } if (keyboard->command_is_pressed (handler_keyboard::QUIT_TO_MAIN_MENU) || popup_event == handler_popup_menu::QUIT_TO_MAIN_MENU) { next_phase = MAIN_MENU; } check_if_enable_cheat (); return next_phase; } /** * Display list bonus capsule(s) bought in the shop, * on the right of the screen */ void supervisor_shop::display_capsules_bought () { Sint32 *cart = current_player->get_shopping_cart (); sprite_capsule **capsules = power_up_capsules->get_sprites_list (); Sint32 pos_y = 4 * resolution; for (Uint32 i = 0; i < MAX_OF_CAPSULES_BOUGHT; i++) { sprite_capsule *capsule = *(capsules++); capsule->set_coordinates (294 * resolution, pos_y); pos_y = pos_y + 9 * resolution; Sint32 id = *(cart++); capsule->set_in_shop (id); } } /** * Return selected bonus, and calculate position of LED indicator * @input x X-coordinate of the mouse pointer * @input y Y-coordinate of the mouse pointer * @return index of the selected bonus from 0 to 24 * or otherwise -1 if no bonus is selected * */ Sint32 supervisor_shop::get_option_over_mouse_cursor (Sint32 x, Sint32 y) { if (x < options_frame_xmin || x > options_frame_xmax1 || y > options_frame_ymax2 || (x > options_frame_xmax2 && y > options_frame_ymax1)) { return -1; } else { x = (x - (6 * resolution)) / (48 * resolution); y = (y / (44 * resolution)); if (y > 4) { x = 0; } Sint32 i = x + 6 * y; led_indicator_xcoord = (x * (48 * resolution)) + (17 * resolution); if (resolution == 1) { led_indicator_ycoord = (y * (44 * resolution)) + (36 * resolution); } else { led_indicator_ycoord = (y * (44 * resolution)) + (35 * resolution); } return i; } } /** * Update LED indicator state, and return the price of * the current option * @param index Index on the selected option from 0 to 24, * otherwise -1 if not option selected * @return The price of the selected option */ Uint32 supervisor_shop::get_price_and_update_led (Sint32 index) { if (index < 0) { led_indicator->disable (); power_up_capsules->set_overview_capsule (0); return 0; } /* set capsule overview */ power_up_capsules->set_overview_capsule (available_options_id[index]); /* set LED indicator */ led_indicator->enable (); led_indicator->set_coordinates (led_indicator_xcoord, led_indicator_ycoord); Sint32 price; /* info already seen at least once? */ if (index == 10 && is_already_view_info) { price = 0; } else if (current_player->is_budget_prices ()) { price = 1; } else { price = options_prices[index]; } return price; } /** * Bought a bonus capsule or an option * @param option_id Option identifier */ void supervisor_shop::purchase_option_or_capsule (Uint32 option_id) { if (option_id != sprite_capsule::SOME_INFOS) { some_infos_index = INFO_PADDLES; } switch (option_id) { case sprite_capsule::EXPAND_PADDLE: purchase_bonus_capsule (option_id); break; case sprite_capsule::FIRE_POWER_1: purchase_bonus_capsule (option_id); break; case sprite_capsule::FIRE_POWER_2: purchase_bonus_capsule (option_id); break; case sprite_capsule::EXTRA_BALLS: purchase_bonus_capsule (option_id); break; case sprite_capsule::MULTI_BALLS: purchase_bonus_capsule (option_id); break; case sprite_capsule::POWER_BALL_1: purchase_bonus_capsule (option_id); break; case sprite_capsule::POWER_BALL_2: purchase_bonus_capsule (option_id); break; case sprite_capsule::EXTRA_LIFE: purchase_bonus_capsule (option_id); break; case sprite_capsule::BOTTOM_WALL: purchase_bonus_capsule (option_id); break; case sprite_capsule::BALL_SIZE_2: purchase_bonus_capsule (option_id); break; case sprite_capsule::BALL_SIZE_3: purchase_bonus_capsule (option_id); break; case sprite_capsule::ROBOT_PADDLE: purchase_bonus_capsule (option_id); break; case sprite_capsule::BALLS_CONTROL: purchase_bonus_capsule (option_id); break; case sprite_capsule::GLUE: purchase_bonus_capsule (option_id); break; case sprite_capsule::SOME_INFOS: display_info (); break; /* rebuild the wall */ case sprite_capsule::REBUILD_THE_WALL: if (current_player->get_area_number () < 5) { put_current_text (box_texts[TEXT_ONLY_FOR_AREA_5]); } else { if (!current_player->is_rebuild_walls () && decrease_money_amount ()) { current_player->set_rebuild_walls (true); display_sales_confirmation (current_selected_option); } } break; /* less bricks option */ case sprite_capsule::LESS_BRICKS: if (current_player->get_less_bricks () <= 0 && decrease_money_amount ()) { current_player->set_less_bricks (10); display_sales_confirmation (current_selected_option); } break; /* exit from the shop */ case sprite_capsule::LEAVE_SHOP: current_player->set_budget_prices (false); current_player = handler_players::get_next_player (current_player, &next_phase); break; /* buy a right, up or left paddle */ default: { if (option_id >= sprite_capsule::ENABLE_RIGHT_PADDLE && option_id <= sprite_capsule::ENABLE_LEFT_PADDLE) { Sint32 i = (option_id - sprite_capsule::ENABLE_RIGHT_PADDLE) / 2 + 2; if (current_player->get_paddle_alive_counter (i) <= 0 && decrease_money_amount ()) { current_player->set_paddle_alive_counter (i, 3); display_sales_confirmation (current_selected_option); } } } break; } } /** * Display info message */ void supervisor_shop::display_info () { if (!is_already_view_info) { if (!decrease_money_amount ()) { return; } } is_already_view_info = true; switch (some_infos_index) { case INFO_PADDLES: { Uint32 area_num = current_player->get_area_number (); Uint32 index = TEXT_PADDLE_RIGHT; Uint32 line = 0; char *dest = box_texts[TEXT_PADDLES]; char *src; for (Uint32 i = controller_paddles::RIGHT_PADDLE; i <= controller_paddles::LEFT_PADDLE; i++) { src = box_texts[index]; if (current_player->get_paddle_alive_counter (i) == 0) { src += BOX_LENGTH_STRING; if ((area_num >= 2 && i == controller_paddles::TOP_PADDLE) || (area_num >= 3 && i == controller_paddles::RIGHT_PADDLE) || (area_num >= 4 && i == controller_paddles::LEFT_PADDLE)) { src += BOX_LENGTH_STRING; } } index++; line++; strncpy (dest, src, BOX_LENGTH_STRING); dest += BOX_LENGTH_STRING; } } put_current_text (box_texts[TEXT_PADDLES]); break; case INFO_LIVES: put_current_text (box_texts[TEXT_LIVES_LEFT]); break; case INFO_AREA_CODE: if (current_player->get_area_number () > 1) { put_current_text (box_texts[TEXT_AREA_CODE]); } else { put_current_text (box_texts[TEXT_NO_AREA_CODE]); } break; case INFO_END: default: if (is_enabled_cheat_mode) { put_current_text (box_texts[TEXT_ENABLED_CHEAT_MODE]); } else if (birth_flag) { put_current_text (box_texts[TEXT_WAITING_CHEAT_MODE]); } else { put_current_text (box_texts[TEXT_HOPING_HELP]); } put_current_text (box_texts[TEXT_HOPING_HELP]); break; } if (++some_infos_index > INFO_END) { some_infos_index = INFO_PADDLES; } } /** * Check if a purchase is possible, so decrement the money amount * @return true if the money amount could be descreased */ bool supervisor_shop::decrease_money_amount () { if (current_player->decrease_money_amount (current_price)) { return true; } else { put_current_text (box_texts[TEXT_NOT_ENOUGH_MONEY]); return false; } } /** * Purchase a bonus capsule if possible * @param capsule_id Capsule identifier */ void supervisor_shop::purchase_bonus_capsule (Sint32 capsule_id) { /* maximum number of capsules reached */ if (num_of_bought_capsules >= MAX_OF_CAPSULES_BOUGHT) { put_current_text (box_texts[TEXT_CANNOT_BUY_MORE]); return; } /* purchase is possible? */ if (!decrease_money_amount ()) { return; } Sint32 *cart = current_player->get_shopping_cart (); cart[num_of_bought_capsules] = capsule_id; sprite_capsule **caspules = power_up_capsules->get_sprites_list (); sprite_capsule *capsule = caspules[num_of_bought_capsules++]; capsule->set_in_shop (capsule_id); display_sales_confirmation (current_selected_option); current_player->set_numof_items_in_shopping_cart (num_of_bought_capsules); } /** * Display the sales confirmation message * @param option_index Option index */ void supervisor_shop::display_sales_confirmation (Sint32 option_index) { char *text = box_texts[(int)led_index_to_text_index[option_index]]; put_current_text (text); } /** * Update the pointers of three lines currently displayed * @param str Pointer to a string containing three lines */ void supervisor_shop::put_current_text (char *str) { current_text_displayed[0] = str; str += BOX_LENGTH_STRING; current_text_displayed[1] = str; str += BOX_LENGTH_STRING; current_text_displayed[2] = str; } /** * Display the three lines of text in the box in bottom */ void supervisor_shop::display_box_text () { Uint32 height = display_text->get_char_height (); Uint32 x_pos = 60 * resolution; Uint32 y_pos = 180 * resolution; Uint32 yspac = height + resolution; game_screen->clear (0, x_pos, y_pos, 22 * 8 * resolution, 3 * yspac); display_text->draw (game_screen, x_pos, y_pos, current_text_displayed[0], BOX_LENGTH_STRING); display_text->draw (game_screen, x_pos, y_pos + yspac, current_text_displayed[1], BOX_LENGTH_STRING); display_text->draw (game_screen, x_pos, y_pos + yspac * 2, current_text_displayed[2], BOX_LENGTH_STRING); } /** * Drag and drop the bonus capsule */ void supervisor_shop::capsule_drag_and_drop () { /* index on 'options_prices' list, if -1 no drag objet */ if (!is_caspule_drag) /* grab an object with the mouse */ { drag_sprite->disable (); if (keyboard->is_left_button () && selected_capsule_index >= 0) { dragged_capsule_pt = current_player->get_shopping_cart () + selected_capsule_index; sprite_capsule **capsules = power_up_capsules->get_sprites_list (); blink_capsule = *(capsules + selected_capsule_index); is_caspule_drag = true; drag_sprite->clone_from_capsule (blink_capsule); blink_capsule->is_enabled = true; } return; } /* drag the bonus capsule */ if (keyboard->is_left_button ()) { drag_sprite->enable (); drag_sprite->set_coordinates (mouse_pointer->get_x_coord (), mouse_pointer->get_y_coord ()); if (blink_capsule->is_enabled) { blink_capsule->is_enabled = false; } else { blink_capsule->is_enabled = true; } return; } /* * drop a bonus capsule */ drag_sprite->disable (); blink_capsule->is_enabled = true; Sint32 i = selected_capsule_index; /* change position of a bonus capsule in the capsules list */ if (i >= 0) { if (i >= (Sint32)num_of_bought_capsules) { i = num_of_bought_capsules - 1; } Sint32 *player_cart = current_player->get_shopping_cart (); Sint32 *source = dragged_capsule_pt; Sint32 *dest = player_cart + i; Sint32 *cart = temporary_shopping_cart; Sint32 drop_id = *source; if (source != dest) { Uint32 i = 0; do { if (player_cart == source) { player_cart++; i++; } else { if (player_cart == dest) { if (source <= dest) { if (i++ < MAX_OF_CAPSULES_BOUGHT) { *(cart++) = *(player_cart++); } } if (i++ < MAX_OF_CAPSULES_BOUGHT) { *(cart++) = drop_id; } } if (i++ < MAX_OF_CAPSULES_BOUGHT) { *(cart++) = *(player_cart++); } } } while (i < MAX_OF_CAPSULES_BOUGHT); cart = temporary_shopping_cart; player_cart = current_player->get_shopping_cart (); for (Uint32 i = 0; i < MAX_OF_CAPSULES_BOUGHT; i++) { *(player_cart++) = *(cart++); } } } /* resell a bonus capsule to the shop */ else { Sint32 *source = dragged_capsule_pt; Sint32 *dest = source; Sint32 drop_id = *source; *(source++) = 0; while (*source >= 0) { *(dest++) = *source; *(source++) = 0; } num_of_bought_capsules--; current_player->set_numof_items_in_shopping_cart (num_of_bought_capsules); Sint32 price = 0; if (current_player->is_budget_prices ()) { /* the player collected a chance capsule containing * a budget prices bonus in the previous bricks level. * All the options are thus for the price of 1 in * the current shop */ price = 1; } else { i = 0; while (available_options_id[i] != sprite_capsule::LEAVE_SHOP) { if (available_options_id[i] == drop_id) { price = options_prices[i]; break; } i++; } } current_player->increase_money_amount (price); } is_caspule_drag = false; } /** * Calculate coordinates the * Calculate the coordinates of the cursor which selects a capsule in the list * of the bought capsules * */ void supervisor_shop::set_select_cursor_coordinates () { Sint32 y = mouse_pointer->get_y_coord () - capsules_frame_ymin; Sint32 offset = (y / select_cursor_height); y = offset * select_cursor_height + capsules_frame_ymin; if (y < capsules_frame_ymin) { y = capsules_frame_ymin; } if (y > capsules_frame_ymax) { y = capsules_frame_ymax; } /* cursor y coordinate */ select_cursor_ycoord = y; /* don't display cursor by default */ is_drawn_select_cursor = false; selected_capsule_index = -1; /* at least one bonus capsule? */ if (num_of_bought_capsules < 1) { return; } /* * calculate maximum y coordinate */ Sint32 ymax = num_of_bought_capsules * select_cursor_height + capsules_frame_ymin; /* if an object is drag, then adds a supplementary place */ if (is_caspule_drag) { ymax = ymax + select_cursor_height; } Sint32 x = mouse_pointer->get_x_coord (); y = mouse_pointer->get_y_coord (); if (x >= select_cursor_xcoord && y < ymax) { is_drawn_select_cursor = true; selected_capsule_index = offset; } } /** * Draw the cursor of the bonus selected in the list on the right */ void supervisor_shop::draw_select_cursor () { if (select_cursor_color++ > 32) { select_cursor_color = 0; } /* calculation the height and the width of the cursor */ Sint32 a = select_cursor_sin_index + 5; a &= 511; select_cursor_sin_index = a; if (!is_drawn_select_cursor > 0) { return; } Sint16 *s = table_cosL + a; a = *s; a *= (select_cursor_width / 5); a >>= 7; a = a + select_cursor_width / 5; Sint32 b = select_cursor_sin_index; s = table_cosL + b; b = *s; b *= (select_cursor_height / 5); b >>= 7; b = b + select_cursor_height / 5; Sint32 w = select_cursor_width - a; Sint32 h = select_cursor_height - b; /* calculation of the coordinates of the cursor */ Sint32 x = select_cursor_xcoord + (select_cursor_width - w) / 2; Sint32 y = select_cursor_ycoord + (select_cursor_height - h) / 2; /* draw the cursor */ Uint32 delay = 0; Uint32 color = select_cursor_color; char *dest = game_screen->get_pixel_data (x, y); Uint32 next_line = game_screen->get_row_size (); for (Sint32 i = 0; i < h; i++) { for (Sint32 j = 0; j < w; j++) { unsigned char pixel = color_cycling[color]; dest[j] = pixel; } if (++delay == 5) { delay = 0; if (color++ > 32) { color = 0; } } dest += next_line; } } /** * Check if the player enables the cheating mode */ void supervisor_shop::check_if_enable_cheat () { mouse_pointer->set_frame_period (3); if (is_enabled_cheat_mode) { /* the cheating mode is already enabled */ return; } if (!birth_flag) { return; } if (!mouse_pointer->get_x_coord () && !mouse_pointer->get_y_coord ()) { mouse_pointer->set_frame_period (20); Uint32 code = keyboard->get_key_down_code (); if (previous_key_code_down != code && code > 0) { previous_key_code_down = code; cheat_code_input = cheat_code_input << 8 | code; } } if (cheat_code_input == cheat_code) { is_enabled_cheat_mode = true; } else { is_enabled_cheat_mode = false; } } /** * Identifiers of the available options and bonus capsules */ Sint32 supervisor_shop::available_options_id[] = { sprite_capsule::EXPAND_PADDLE, sprite_capsule::FIRE_POWER_1, sprite_capsule::FIRE_POWER_2, sprite_capsule::REBUILD_THE_WALL, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::POWER_BALL_2, sprite_capsule::LESS_BRICKS, sprite_capsule::EXTRA_LIFE, sprite_capsule::SOME_INFOS, sprite_capsule::BOTTOM_WALL, sprite_capsule::ENABLE_LEFT_PADDLE, sprite_capsule::ENABLE_TOP_PADDLE, sprite_capsule::ENABLE_RIGHT_PADDLE, sprite_capsule::BALL_SIZE_2, sprite_capsule::BALL_SIZE_3, sprite_capsule::ROBOT_PADDLE, sprite_capsule::BALLS_CONTROL, sprite_capsule::GLUE, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP, sprite_capsule::LEAVE_SHOP }; /** * Prices of all the available options in the shop */ Uint32 supervisor_shop::options_prices[] = { 60, 75, 150, 350, 25, 50, 250, 500, 400, 450, 10, 75, 100, 100, 100, 60, 75, 100, 60, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /** * Indexes of the texts used for sales confirmation messages */ unsigned char supervisor_shop::led_index_to_text_index[] = { /* S+/F1/F2/RW/B2/B3 */ 0, 1, 2, 3, 4, 5, /* P1/P2/LB/L+/??/WA */ 6, 7, 8, 9, 10, 11, /* BL/BU/BR/S2/S3/RB */ 12, 13, 14, 15, 16, 17, /* CT/GL/XX/XX/XX/XX */ 18, 19, 20, 20, 20, 20, /* XX/XX/XX/XX/XX/XX */ 20, 20, 20, 20, 20, 20, }; const unsigned char supervisor_shop::color_cycling[] = { 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; tecnoballz-0.93.1/src/controller_gigablitz.cc0000664000175000017500000002522112412501752020315 0ustar brunobruno/** * @file controller_gigablitz.cc * @brief Gigablitz controller * @date 2007-11-03 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_gigablitz.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_gigablitz.h" #include "../include/handler_resources.h" Uint32 controller_gigablitz::numeroBOBs[MAX_OF_GIGABLITZ] = { sprite_object::GIGABLITZ_7, sprite_object::GIGABLITZ_6, sprite_object::GIGABLITZ_5, sprite_object::GIGABLITZ_4, sprite_object::GIGABLITZ_3, sprite_object::GIGABLITZ_2, sprite_object::GIGABLITZ_1 }; /** * Create the Gigablitz controller */ controller_gigablitz::controller_gigablitz () { littleInit (); /* there are 7 different Gigablitz */ max_of_sprites = MAX_OF_GIGABLITZ; sprites_have_shades = false; paddle_bottom = (sprite_paddle *) NULL; paddle_top = (sprite_paddle *) NULL; gigablitz_height = 0; bitz_ystop = 0; bitz_maxiy = 0; bitz_miniy = 0; blitz_seta = 0; num_of_bricks = 0; blitz_xsin = 0; blitz_colx = 0; } /** * Release the Gigablitz controller */ controller_gigablitz::~controller_gigablitz () { release_sprites_list (); } /** * Create and initialize the sprites of the gigablitz in the bricks levels */ void controller_gigablitz::create_gigablitz_sprites () { controller_paddles* paddles = controller_paddles::get_instance (); paddle_bottom = paddles->get_paddle (controller_paddles::BOTTOM_PADDLE); if (BRICKS_LEVEL == current_phase) { paddle_top = paddles->get_paddle (controller_paddles::TOP_PADDLE); } alloc_sprites_list (); /* load the bitmap of the different Gigablitz, * in the 'sprites_bitmap' static member */ resources->load_sprites_bitmap (handler_resources::BITMAP_GIGABLITZ); /* create and initialize the gigablitz sprites */ for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_gigablitz *gigablitz_sprite = new sprite_gigablitz (); gigablitz_sprite->set_object_pos (i); gigablitz_sprite->set_draw_method (sprite_object::DRAW_LINE_BY_LINE); if (GUARDS_LEVEL == current_phase) { gigablitz_sprite->is_mirrored_vertically = true; } Uint32 id = numeroBOBs[i]; gigablitz_sprite->create_sprite (id, sprites_bitmap, false); sprites->add (gigablitz_sprite); sprites_list[i] = gigablitz_sprite; } /* release the bitmap of gigablitz */ resources->release_sprites_bitmap (); } /** * Start a new Gigablitz in bricks levels */ void controller_gigablitz::shoot_paddle () { if (gigablitz_height > 0) { return; } Uint32 length = paddle_bottom->get_length (); Uint32 l = length; /* smallest paddle is of 16 or 32 pixels width */ l -= paddle_bottom->width_mini; /* size of paddle step by 8 or 16 pixels */ l >>= paddle_bottom->shift_width; l = MAX_OF_GIGABLITZ - l - 1; current_gigablitz = sprites_list[l]; gigablitz_height = current_gigablitz->get_sprite_height (); Sint32 x = paddle_bottom->get_x_coord (); Sint32 y = paddle_bottom->get_y_coord (); gigablitz_xcoord = x; /* special collision */ blitz_colx = x; current_gigablitz->set_coordinates (x, y); Sint32 res = resolution; bitz_ystop = 8 * res - gigablitz_height; bitz_maxiy = paddle_bottom->get_y_coord (); bitz_miniy = 8 * res; y = length; if (1 == resolution) { /* in 320 pixels: width bricks = 16 pixels */ y = y >> 4; x = x & 0x000f; } else { /* in 640 pixels: width bricks = 32 pixels */ y = y >> 5; x = x & 0x001f; } if (x != 0) { y++; } num_of_bricks = y; #ifndef SOUNDISOFF audio->play_sound (handler_audio::GUARDIAN_FIRE); #endif head_animation *head_anim = head_animation::get_instance (); head_anim->start_laugh (); controller_ships *ships = controller_ships::get_instance (); ships->force_explosion (); } /** * Move the Gigablitz in bricks level */ void controller_gigablitz::run_in_bricks_levels () { if (0 == gigablitz_height) { return; } /* vertical moving */ Sint32 y = current_gigablitz->get_y_coord (); Sint32 res = resolution; y = y - 8 * res; if (y <= bitz_ystop) { current_gigablitz->disable (); gigablitz_height = 0; } else { if (y >= bitz_maxiy) { current_gigablitz->disable (); } else { current_gigablitz->enable (); } } /* determine last line of the gigablitz sprite */ Sint32 h = current_gigablitz->get_sprite_height (); Sint32 l = bitz_maxiy - y; if (l > h) { l = h; } if (l < 1) { l = 1; } current_gigablitz->affligLast = l; l = bitz_miniy - y; if (l >= h) { l = h - 1; } if (l < 0) { l = 0; } current_gigablitz->affligFrst = l; /* horizontal move */ blitz_xsin = (blitz_xsin + 50) & SINUS_MASK; Sint32 x = (table_cosL[blitz_xsin] * 5 * res) >> SINUS_DECA; x = gigablitz_xcoord + x; current_gigablitz->set_coordinates (x, y); if (y >= 0) { collision1 (); } } /** * Collision with the gigablitz and bricks */ void controller_gigablitz::collision1 () { controller_bricks *bricks = controller_bricks::get_instance (); /* brick's width in pixels */ Sint32 bwght = bricks->get_brick_width (); /* y-offset between 2 bricks */ Sint32 byoff = bricks->getYOffset (); /* first indestructible brick */ Sint32 indus = bricks->get_indestructible_offset (); if (0 == num_of_bricks) { return; } Sint32 x = blitz_colx; Sint32 y = current_gigablitz->get_y_coord (); /* x = x / 32 (width of a brick) */ x /= bwght; /* y = y / 16 (space between two bricks in height) */ y /= byoff; /* y = y * 16 (number of bricks on the same line) */ y *= controller_bricks::MAX_OF_BRICKS_HORIZONTALLY; x += y; brick_info *bricks_map = bricks->get_bricks_map (); for (Uint32 i = 0; i < num_of_bricks; i++, x++) { brick_info *map = (bricks_map + x); Sint32 v = map->source_offset; if (0 == v) { /* no collision */ continue; } if (!has_background) { map->sprite->touch(); } /* list of bricks to clear or redraw */ brick_redraw *redraw = bricks->get_bricks_redraw_next (); if (v < indus) { redraw->is_indestructible = false; redraw->is_gigablitz_destroyed = true; } else { redraw->is_indestructible = true; } redraw->pixel_offset = map->pixel_offset; redraw->brick_map = map; map->h_pos = -1; map->source_offset = 0; redraw->number = map->number; /* restore background under brick */ redraw->is_background = true; } } /** * Move the Gigablitz in the guardians level */ void controller_gigablitz::run_in_guardians_level () { if (0 == gigablitz_height) { return; } Sint32 y = current_gigablitz->get_y_coord (); Sint32 res = resolution; y = y + (6 * res); blitz_xsin = (blitz_xsin + 50) & SINUS_MASK; Sint32 x = (table_cosL[blitz_xsin] * 5 * res) >> SINUS_DECA; x = gigablitz_xcoord + x; current_gigablitz->set_coordinates (x, y); /* * determine last line of the gigablitz sprite */ Sint32 h = current_gigablitz->get_sprite_height (); Sint32 l = display->get_height () - y; if (l > h) { l = h; } if (l < 1) { l = 1; } current_gigablitz->affligLast = l; l = bitz_miniy - y; if (l >= h) { l = h - 1; } if (l < 0) { l = 0; } current_gigablitz->affligFrst = l; if (y >= 240 * res) { current_gigablitz->disable (); gigablitz_height = 0; } collision_with_paddle (); } /** * Collision between paddle and gigablitz in a guardians level */ void controller_gigablitz::collision_with_paddle () { if (0 == gigablitz_height || paddle_bottom->is_invincible ()) { return; } Sint32 gx = current_gigablitz->get_x_coord (); Sint32 gy = current_gigablitz->get_y_coord (); Sint32 gw = current_gigablitz->get_collision_width (); Sint32 x = paddle_bottom->get_x_coord (); Sint32 y = paddle_bottom->get_y_coord (); Sint32 w = paddle_bottom->get_length (); Sint32 h = paddle_bottom->get_sprite_height (); if (gy + (Sint32) gigablitz_height < y || gx + gw < x || gx > x + w || gy > y + h) { return; } #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_EXPLOSION); audio->play_sound (handler_audio::LOST_LIFE); #endif controller_explosions *explosions = controller_explosions::get_instance (); explosions->add (x + paddle_bottom->get_length () / 2, y + paddle_bottom->get_sprite_height () / 2); current_player->remove_life (1); paddle_bottom->set_invincibility (100); } /** * Guardian shoot a gigablitz in a guardians level * @param id gigablitz identifier from 0 to 7 * @param xcoord x coordinate of the guardian * @param ycoord y coordinate of the guardian * @param width width of the guardian in pixels * @return true if the gigablitz was well fired, otherwise false */ bool controller_gigablitz::shoot_guardian (Uint32 id, Sint32 xcoord, Sint32 ycoord, Uint32 width) { if (gigablitz_height > 0) { /* a gigablitz is already current */ return false; } current_gigablitz = sprites_list[id]; gigablitz_height = current_gigablitz->get_sprite_height (); Uint32 w = current_gigablitz->get_sprite_width (); current_gigablitz->set_coordinates (xcoord, ycoord); xcoord = xcoord + (width - w) / 2; if (xcoord < 0) { xcoord = 0; } current_gigablitz->set_coordinates (xcoord, ycoord); #ifndef SOUNDISOFF audio->play_sound (handler_audio::GUARDIAN_FIRE); #endif current_gigablitz->enable (); gigablitz_xcoord = xcoord; return true; } /** * Check if the gigablitz is enabled * @return true if gigablitz is enabled, otherwise false */ bool controller_gigablitz::is_enable () { return gigablitz_height > 0 ? true : false; } tecnoballz-0.93.1/src/head_animation.cc0000664000175000017500000001017212412501752017035 0ustar brunobruno/** * @file head_animation.cc * @brief Animate the head in the right score panel * @date 2007-02-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: head_animation.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/head_animation.h" #include "../include/handler_resources.h" head_animation * head_animation::head_anim_singleton = NULL; /** * Create the head animation object */ head_animation::head_animation () { object_init (); head_bitmap = (bitmap_data *) NULL; frame_delay = 0; requested_animation = 0; frame_index = 0; frame_step = 0; } /** * Release the head animation object */ head_animation::~head_animation () { object_free (); if (head_bitmap) { delete head_bitmap; head_bitmap = (bitmap_data *) NULL; } head_anim_singleton = NULL; } /** * Get the object instance * head_animation is a singleton * @return the head_animation object */ head_animation * head_animation::get_instance () { if (NULL == head_anim_singleton) { head_anim_singleton = new head_animation (); } return head_anim_singleton; } /** * Load the bitmap of the head animation */ void head_animation::load_bitmap () { head_bitmap = new bitmap_data (); head_bitmap->load (handler_resources::BITMAP_HEAD_ANIMATION); head_height = head_bitmap->get_height (); head_width = head_bitmap->get_width () / MAX_OF_IMAGES; } /** * Draw the current image of the hean animation */ void head_animation::draw () { Uint32 xcoord = frame_index * head_width; game_screen->blit_surface (head_bitmap, xcoord, 0, 272 * resolution, 106 * resolution, head_width, head_height); } /** * Play and draw the animation of the head */ void head_animation::play () { draw (); /* Counter time delay before next image */ if (frame_delay > 0) { frame_delay--; return; } Uint32 frame_num = requested_animation; requested_animation = 0; /* animation in progress? */ if (frame_index == 0) { frame_index = frame_num; frame_step = 1; frame_delay = FRAME_PERIOD_1; return; } /* forward animation */ if (frame_step >= 0) { switch (frame_index) { case INTERFERENCE_STOP: frame_step = -1; frame_index = frame_index + frame_step; break; case YAWN_STOP: frame_step = -1; frame_delay = FRAME_PERIOD_2; break; case LAUGH_STOP: frame_step = -1; frame_delay = FRAME_PERIOD_2; break; default: frame_delay = FRAME_PERIOD_1; frame_index = frame_index + frame_step; } return; } /* reverse animation */ switch (frame_index) { case INTERFERENCE_START: frame_index = 0; break; case YAWN_START: frame_index = 0; break; case LAUGH_START: frame_index = 0; break; default: frame_delay = FRAME_PERIOD_1; frame_index = frame_index + frame_step; } } /** * Start laugh head animation */ void head_animation::start_laugh () { requested_animation = LAUGH_START; } /** * Start yawn head animation */ void head_animation::start_yawn () { requested_animation = YAWN_START; } /** * Start interference animation */ void head_animation::start_interference () { requested_animation = INTERFERENCE_START; } tecnoballz-0.93.1/src/handler_popup_menu.cc0000664000175000017500000003546712412501752017777 0ustar brunobruno/** * @file handler_popup_menu.cc * @brief popup menu handler (When the [Esc] key is pressed) * @created 2004-08-08 * @date 2012-08-19 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_popup_menu.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_resources.h" #include "../include/handler_popup_menu.h" #include "../include/sprite_object.h" #include "../include/handler_keyboard.h" #include "../include/handler_menu_events.h" /** * Create the popup menu handler */ handler_popup_menu::handler_popup_menu () { menu_first_color_index = 0; menu_number = 0; texts_of_menus = NULL; menu_events = new handler_menu_events(); } /** * Release the popup menu handler */ handler_popup_menu::~handler_popup_menu () { if (screen_menu != NULL) { delete screen_menu; screen_menu = (bitmap_data *) NULL; } if (bitmap_fonts != NULL) { delete bitmap_fonts; bitmap_fonts = (bitmap_data *) NULL; } if (texts_of_menus != NULL) { delete[](char *) texts_of_menus; texts_of_menus = NULL; } if (menu_events != NULL) { delete menu_events; menu_events = NULL; } } /** * Read the texts file */ void handler_popup_menu::load_text_file () { if (texts_of_menus != NULL) { return; } texts_of_menus = resources->load_texts (handler_resources::TEXTS_POPUP_MENU, MAX_OF_LINES, MAX_OF_CHARS, 0); menu_texts_pt[0] = &texts_of_menus[MENU_00]; menu_texts_pt[1] = &texts_of_menus[MENU_01]; } /** * Initialize palette color chars, if necessary (shop only) */ void handler_popup_menu::initialize_palette () { SDL_Color *palette = display->get_palette (); SDL_Color *font_pal = palette + 239; Uint32 i = random_counter & 0x0F; if (i >= 10) { i = i - 10; } const Uint32 *color_scale = (handler_resources::color_gradations + i * 18); for (i = 0; i < 17; i++) { Uint32 color = color_scale[i]; Uint32 blue = color & 0x000000ff; Uint32 green = color & 0x0000ff00; green = green >> 8; Uint32 red = color & 0x00ff0000; red = red >> 16; font_pal->r = red; font_pal->g = green; font_pal->b = blue; font_pal++; } display->enable_palette (palette); } /** * Initialize the popup menu * @param bmp Bitmap where are graphic elements of the menu */ void handler_popup_menu::first_init (bitmap_data * bmp) { load_text_file (); Uint32 w; switch (current_phase) { case BRICKS_LEVEL: /* determine if restore background (bricks levels and shop only) */ if (has_background) { is_restore_background = true; } else { is_restore_background = false; } menu_number = 0; w = 256 * resolution; break; case SHOP: is_restore_background = true; menu_number = 1; w = 320 * resolution; initialize_palette (); break; case GUARDS_LEVEL: default: is_restore_background = false; menu_number = 0; w = 320 * resolution; initialize_palette (); break; } menu_xcenter = w / 2; /* determine line height into menu box */ if (resolution == 2) { vertical_space = 17; } else { vertical_space = 8; } /* load font bitmap file and perform some initializations */ load_bitmap_fonts (handler_resources::BITMAP_MENU_FONTS); build_menu_box (bmp, w); } /** * Build menu box where will be drawed the strings of menu */ void handler_popup_menu::build_menu_box (bitmap_data * bmp, Uint32 w) { /* determine height of the menu box */ if (menu_number == 1) { num_of_lines = 3; } else { num_of_lines = 4; } num_of_columns = MAX_OF_CHARS; Uint32 numof_lines = num_of_lines + 2; /* allocate graphic buffer of menu box */ screen_menu = new bitmap_data (); screen_menu->create_surface ((num_of_columns + 2) * char_height, numof_lines * vertical_space); screen_menu->clear (); /* save coordinates of the sprites */ char *sprite_pixels[8]; const sprite_description *sprite_desc = sprite_object::zelistBOB[sprite_object::POPUP_MENU]; /* height in pixels */ Uint32 height = sprite_desc->height; height *= resolution; /* number of animation */ Uint32 nanim = sprite_desc->number_of_images; /* width in pixels */ Uint32 width = sprite_desc->width; width *= resolution; sprite_coordinates *coord = sprite_desc->coordinates; for (Uint32 i = 0; i < nanim; i++) { Sint32 pos_x = (Sint32) coord[i].xcoord; pos_x *= resolution; pos_x *= 16; Sint32 pos_y = (Sint32) coord[i].ycoord; pos_y *= resolution; sprite_pixels[i] = bmp->get_pixel_data (pos_x, pos_y); } Uint32 raw_src = bmp->get_row_size (); /* initialize sprite object */ make_sprite (screen_menu); Sint32 ycoord = (240 * resolution - numof_lines * vertical_space) / 2; ycoord = (ycoord / vertical_space) * vertical_space; set_coordinates ((w - sprite_width) / 2, ycoord); /* * build the frame of menu box (with sprites) */ Uint32 count = screen_menu->get_width () / width - 2; Sint32 xcoord = width; ycoord = screen_menu->get_height () - height; draw (sprite_pixels[0], 0, 0, raw_src, width, height); draw (sprite_pixels[3], 0, ycoord, raw_src, width, height); for (Uint32 i = 0; i < count; i++, xcoord += width) { draw (sprite_pixels[4], xcoord, 0, raw_src, width, height); draw (sprite_pixels[6], xcoord, ycoord, raw_src, width, height); } draw (sprite_pixels[1], xcoord, 0, raw_src, width, height); draw (sprite_pixels[2], xcoord, ycoord, raw_src, width, height); count = screen_menu->get_height () / height - 2; if (screen_menu->get_height () % height) { count++; } xcoord = screen_menu->get_width () - width; ycoord = height; for (Uint32 i = 0; i < count; i++, ycoord += height) { draw (sprite_pixels[5], 0, ycoord, raw_src, width, height); draw (sprite_pixels[7], xcoord, ycoord, raw_src, width, height); } } /** * Display a sprite into the "buffer" (copy byte to byte) * @param source Pointer to the pixels of the sprite * @param xcoord X-coordinate where draw the sprite * @param ycoord Y_coordinate where draw the sprite * @param raw_src Row size of the source bitmap * @param width Width of sprite * @param height Hieght of sprite */ void handler_popup_menu::draw (char *source, Sint32 xcoord, Sint32 ycoord, Sint32 raw_src, Sint32 width, Sint32 height) { char *src = source; char *dest = screen_menu->get_pixel_data (xcoord, ycoord); Sint32 s_offset = raw_src; Sint32 d_offset = screen_menu->get_row_size (); Sint32 w = width; Sint32 h = height; for (Sint32 i = 0; i < h; i++) { for (Sint32 j = 0; j < w; j++) { /* read the pixel */ char pixel = src[j]; /* color 0? */ if (pixel != 0) { /* no, put the pixel */ dest[j] = pixel; } } src += s_offset; dest += d_offset; } } /** * Display and handle menu * @return Return code CAUSE_GAME_OVER, QUIT_TO_MAIN_MENU, * or QUIT_TECNOBALLZ */ Sint32 handler_popup_menu::run () { Sint32 event = -1; /* [ESC] key: enable / disable menu box */ if (keyboard->command_is_pressed (handler_keyboard::TOGGLE_POPUP_MENU)) { if (!is_enabled) { menu_events->start (vertical_space, 1, num_of_lines, menu_xcenter, get_y_coord () + char_height); } is_enabled = true; } else { if (is_enabled && is_restore_background) { restore_rectangle_background (); } is_enabled = false; menu_events->stop (); return event; } Sint32 pos_y = 0; Sint32 incre = 0; if (menu_events->check (&pos_y, &incre)) { event = (pos_y - y_coord) / vertical_space; } /* read color table offset (color line hover by mouse ) */ if (menu_first_color_index++ > 32) { menu_first_color_index = 0; } if (resolution == 1) { display_320 (); } else { display_640 (); } /* copy menu box into screen */ copy_to_game_screen (); if (event >= CONTINUE_PLAY_CURRENT && event <= QUIT_TECNOBALLZ) { if (is_enabled && is_restore_background) { restore_rectangle_background (); } is_enabled = false; keyboard->clear_command_keys (); } if (menu_number == 1 && event >= CAUSE_GAME_OVER) { event++; } if (event > 0) { SDL_ShowCursor (SDL_DISABLE); } return event; } /** * Display text in 640x480 mode */ void handler_popup_menu::display_640 () { Sint32 color = menu_first_color_index; char *desP1 = pixel_data + char_height + row_size * vertical_space; Sint32 offSc = off_source; Sint32 offDs = row_size; Sint32 offD2 = row_size * (vertical_space - 1) + (char_height * 2); Sint32 *basPT = (Sint32 *) caract_adr; char **lines = menu_texts_pt[menu_number]; char *c = ascii2code; Uint32 a, b, j; Uint32 y = (keyboard->get_mouse_y () - y_coord) / vertical_space; y--; for (Uint32 k = 0; k < num_of_lines; k++, desP1 += offD2) { char *p = lines[k]; if (y != k) { /* display normal line of n characters */ for (j = 0; j < num_of_columns; j++) { a = *(p++) - 32; if (a != 0) { b = c[a]; Sint32 *s = (Sint32 *) basPT; Sint32 *d = (Sint32 *) desP1; b = b << 4; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 16; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; s = (Sint32 *) ((char *) s + offSc); d = (Sint32 *) ((char *) d + offDs); } } desP1 = desP1 + 16; } } else { /* display selected line of 32 characters */ for (j = 0; j < num_of_columns; j++) { unsigned char pixel = cycling_table[color]; a = *(p++) - 32; if (a != 0) { b = c[a]; unsigned char *s = (unsigned char *) basPT; unsigned char *d = (unsigned char *) desP1; b = b << 4; s = s + b; for (b = 0; b < 16; b++) { for (Sint32 z = 0; z < 16; z++) { a = s[z]; if (a) { a = pixel; d[z] = pixel; } } s = s + offSc; d = d + offDs; } } desP1 = desP1 + 16; if (color++ > 32) { color = 0; } } } } } /** * Display text in 320x240 mode */ void handler_popup_menu::display_320 () { Sint32 color = menu_first_color_index; char *desP1 = pixel_data + char_height + row_size * vertical_space; Sint32 offSc = off_source; Sint32 offDs = row_size; Sint32 offD2 = row_size * (vertical_space - 1) + (char_height * 2); Sint32 *basPT = (Sint32 *) caract_adr; char **lines = menu_texts_pt[menu_number]; char *c = ascii2code; Uint32 a, b, j; Uint32 y = (keyboard->get_mouse_y () - y_coord) / vertical_space; y--; for (Uint32 k = 0; k < num_of_lines; k++, desP1 += offD2) { char *p = lines[k]; if (y != k) { /* display normal line of n characters */ for (j = 0; j < num_of_columns; j++) { a = *(p++) - 32; if (a != 0) { b = c[a]; Sint32 *s = (Sint32 *) basPT; Sint32 *d = (Sint32 *) desP1; b = b << 3; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 8; b++) { d[0] = s[0]; d[1] = s[1]; s = (Sint32 *) ((char *) s + offSc); d = (Sint32 *) ((char *) d + offDs); } } desP1 = desP1 + 8; } } else { /* display selected line of 32 characters */ for (j = 0; j < num_of_columns; j++) { unsigned char pixel = cycling_table[color]; a = *(p++) - 32; if (a != 0) { b = c[a]; unsigned char *s = (unsigned char *) basPT; unsigned char *d = (unsigned char *) desP1; b = b << 3; s = s + b; for (b = 0; b < 8; b++) { for (Sint32 z = 0; z < 8; z++) { a = s[z]; if (a != 0) { a = pixel; d[z] = pixel; } } s = s + offSc; d = d + offDs; } } desP1 = desP1 + 8; if (color++ > 32) { color = 0; } } } } } const unsigned char handler_popup_menu::cycling_table[] = { 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; char ** handler_popup_menu::menu_texts_pt[2] = { NULL, NULL }; tecnoballz-0.93.1/src/configfile.cc0000664000175000017500000003455612412501752016216 0ustar brunobruno/** * @file configfile.cc * @brief Config file handler * @created 2005-01-22 * @date 2014-09-28 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: configfile.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "config.h" #include "../include/configfile.h" #include "../include/handler_display.h" #include "../include/handler_audio.h" #include "../include/handler_players.h" #include #include #include const char * configfile::language_to_string[MAX_OF_LANGUAGES] = { "en", "fr" }; const std::string configfile::CONF_DIR_NAME ("tlk-games"); const std::string configfile::CONF_FILENAME ("tecnoballz.conf"); /** * Create object */ configfile::configfile () { thePlayers[0] = thePlayer1; thePlayers[1] = thePlayer2; thePlayers[2] = thePlayer3; thePlayers[3] = thePlayer4; thePlayers[4] = thePlayer5; thePlayers[5] = thePlayer6; for (Uint32 i = 0; i < handler_players::MAX_OF_PLAYERS; i++) { char *p = thePlayers[i]; for (Uint32 j = 0; j < 8; j++) { p[j] = 0; } } resetvalue (); } /** * Destroy object */ configfile::~configfile () { } /** * Reset all values */ void configfile::resetvalue () { #ifndef SOUNDISOFF handler_audio::is_audio_enable = 1; #endif resolution = 2; has_background = false; is_verbose = false; handler_display::optionfull = false; difficulty_level = DIFFICULTY_NORMAL; initial_num_of_lifes = 5; number_of_players = 1; char *user = getenv ("USER"); if (user != NULL) { user = stringname; } for (Uint32 i = 0; i < 6; i++) { strncpy (thePlayers[i], user, 6); } language = LANGUAGE_EN; absolute_mouse_positioning = false; } /** * Display values */ void configfile::configinfo () { bool audio; #ifndef SOUNDISOFF audio = handler_audio::is_audio_enable; #else audio = false; #endif fprintf (stdout, " \n" "- optionfull : %i\n- is_audio_enable: %i\n- resolution:%i\n" "- is_verbose: %i\n difficulty_level : %i\n", handler_display::optionfull, audio, resolution, is_verbose, difficulty_level); } /** * Check if config directory exists; if not create it and set config_dir */ bool configfile::check_and_create_dir () { #ifdef _WIN32 /* opendir don't exist on windows * create directory if not exist */ MKDIR (conf_dirname.c_str (), S_IRWXU); #else /* test and create .tlkgames */ DIR* dp = opendir (conf_dirname.c_str ()); if (!dp) { fprintf (stderr, "couldn't find/open config directory '%s'\n", conf_dirname.c_str ()); fprintf (stderr, "attempting to create it... "); MKDIR (conf_dirname.c_str (), S_IRWXU); dp = opendir (conf_dirname.c_str ()); if (!dp) { fprintf (stderr, "opendir() was failed\n"); return false; } } closedir (dp); #endif return true; } /** * Built the full path of the configuration file. */ void configfile::get_fullpathname () { if (!conf_filename.empty ()) { return; } if (getenv ("XDG_CONFIG_HOME") != NULL) { conf_dirname = getenv ("XDG_CONFIG_HOME"); conf_dirname += "/" + CONF_DIR_NAME; } else { conf_dirname = (getenv ("HOME") ? getenv ("HOME") : "."); conf_dirname += "/.config/" + CONF_DIR_NAME; } conf_filename += conf_dirname + "/" + CONF_FILENAME; } /** * Load configuration file in "~/.tlkgames/tecnoballz.conf" */ void configfile::load () { resetvalue (); get_fullpathname (); std::cout << conf_filename << std::endl; lispreader *parser = new lispreader (); lisp_object_t *root_obj = parser->lisp_read_file (conf_filename); if (root_obj == NULL) { std:: cerr << "lispreader::lisp_read_file (" << conf_filename << ") was failed" << std::endl; return; } if (root_obj->type == LISP_TYPE_EOF || root_obj->type == LISP_TYPE_PARSE_ERROR) { fprintf (stderr, "configfile::loadconfig() / conf parsing failed\n"); return; } if (strcmp (parser->lisp_symbol (parser->lisp_car (root_obj)), "tecnoballz-config") != 0) { fprintf (stderr, "configfile::loadconfig() / conf parsing failed\n"); return; } std::string ptStr; if (!parser->read_string ("lang", &ptStr)) { language = LANGUAGE_EN; } else { if (ptStr == "fr") { language = LANGUAGE_FR; } else { language = LANGUAGE_EN; } } //exit(0); if (!parser->read_bool ("fullscreen", &handler_display::optionfull)) { handler_display::optionfull = -1; } #ifndef SOUNDISOFF if (!parser->read_bool ("sound", &handler_audio::is_audio_enable)) { handler_audio::is_audio_enable = true; } #endif if (!parser->read_bool ("verbose", &is_verbose)) { is_verbose = false; } if (!parser->read_bool ("absolute_mouse", &absolute_mouse_positioning)) { absolute_mouse_positioning = false; } // read window resolution: 1 = 320*240; 2 = 640*480 Sint32 res = 0; if (!parser->read_int ("resolution", &res)) { res = 2; } resolution = res; if (resolution < 1 || resolution > 2) { resolution = 2; } if (resolution == 2) { has_background = false; } else { has_background = true; } has_background = false; // read number of lifes from 1 to 9 if (!parser->read_int ("lifes", &initial_num_of_lifes)) { initial_num_of_lifes = 5; } if (initial_num_of_lifes < 1 || initial_num_of_lifes > 9) { initial_num_of_lifes = 5; } // read difficulty DIFFICULTY_EASY, DIFFICULTY_NORMAL, // DIFFICULTY_MEDIUM or DIFFICULTY_HARD if (!parser->read_int ("difficulty", &difficulty_level)) { difficulty_level = DIFFICULTY_NORMAL; } if (difficulty_level < DIFFICULTY_EASY || difficulty_level > DIFFICULTY_HARD) { difficulty_level = DIFFICULTY_NORMAL; } // read number of players from 1 to 6 if (!parser->read_int ("players", &number_of_players)) { number_of_players = handler_players::MAX_OF_PLAYERS; } if (number_of_players < 1 || number_of_players > (Sint32) handler_players::MAX_OF_PLAYERS) { number_of_players = 1; } // read players names std::string sName (6, ' '); char cName[8] = { "......." }; for (Uint32 i = 0; i < 6; i++) { sprintf (cName, "player%01d", i + 1); if (parser->read_string (cName, &sName)) { strncpy (thePlayers[i], sName.c_str (), 6); } } delete parser; #ifdef TECNOBALLZ_GP2X resolution = 1; #endif } /** * Return current player name, which read from config file * @param playernum Player number from 0 to 5 * @return Pointer to a player name */ const char * configfile::get_player_name (Uint32 playernum) { if (playernum >= handler_players::MAX_OF_PLAYERS) { playernum = handler_players::MAX_OF_PLAYERS - 1; } return thePlayers[playernum]; } /** * Set player name * @param playernum Player number from 0 to 5 * @param name Pointer to a string */ void configfile::set_player_name (Uint32 playernum, const char *name) { if (playernum >= handler_players::MAX_OF_PLAYERS) { playernum = handler_players::MAX_OF_PLAYERS - 1; } strncpy (thePlayers[playernum], name, 6); } /* * Return current language * @return "en" or fr */ const char * configfile::get_language () { return language_to_string[language]; } /** * Save config file "~/.tlkgames/tecnoballz.conf" */ void configfile::save () { bool audio; #ifndef SOUNDISOFF audio = handler_audio::is_audio_enable; #else audio = false; #endif if (!check_and_create_dir ()) { return; } FILE *config = fopen_data (conf_filename.c_str (), "w"); if (config) { fprintf (config, "(tecnoballz-config\n"); fprintf (config, "\t;; the following options can be set to #t or #f:\n"); fprintf (config, "\t(fullscreen %s)\n", handler_display::optionfull ? "#t" : "#f"); fprintf (config, "\t(sound %s)\n", audio ? "#t" : "#f"); fprintf (config, "\t(verbose %s)\n", is_verbose ? "#t" : "#f"); fprintf (config, "\t(absolute_mouse %s)\n", absolute_mouse_positioning ? "#t" : "#f"); fprintf (config, "\n\t;; window size 1 (low-res) or 2 (high-res):\n"); fprintf (config, "\t(resolution %d)\n", resolution); fprintf (config, "\n\t;; difficulty 1 (easy), 2 (hard), 3 (madness) or 4 (suicidal)\n"); fprintf (config, "\t(difficulty %d)\n", difficulty_level); fprintf (config, "\n\t;; number of lifes (1 to 9)\n"); fprintf (config, "\t(lifes %d)\n", initial_num_of_lifes); fprintf (config, "\n\t;; number of players (1 to 6)\n"); fprintf (config, "\t(players %d)\n", number_of_players); fprintf (config, "\n\t;; players names\n"); for (Uint32 i = 0; i < handler_players::MAX_OF_PLAYERS; i++) { fprintf (config, "\t(player%i \"%s\")\n", i + 1, thePlayers[i]); } fprintf (config, "\n\t;; language en or fr\n"); fprintf (config, "\t(lang "); switch (language) { case LANGUAGE_FR: fprintf (config, "\"fr\")\n"); break; default: fprintf (config, "\"en\")\n"); break; } fprintf (config, ")\n"); } } /** * Open a file * @param fname * @param fmode * @return */ FILE * configfile::fopen_data (const char *fname, const char *fmode) { FILE *fi; fi = fopen (fname, fmode); if (fi == NULL) { fprintf (stderr, "configfile::fopen_data(): Warning: Unable " "to open the file \"%s\" ", fname); if (strcmp (fmode, "r") == 0) { fprintf (stderr, "for read!!!\n"); } else if (strcmp (fmode, "w") == 0) { fprintf (stderr, "for write!!!\n"); } } return (fi); } /** * Scan command line arguments * @param arg_count the number of arguments * @param arg_values he command line arguments * @return FALSE if exit, TRUE otherwise */ Sint32 configfile::scan_arguments (Sint32 arg_count, char **arg_values) { Sint32 i; for (i = 1; i < arg_count; i++) { if (*arg_values[i] != '-') { continue; } if (!strcmp (arg_values[i], "-h") || !strcmp (arg_values[i], "--help")) { printf ("\noptions:\n"); printf ("-h, --help print Help (this message) and exit\n"); printf ("--version print version information and exit\n"); printf ("--full full screen\n"); printf ("--window windowed mode\n"); printf ("--320 game run in a 320*200 window\n"); printf ("--640 game run in a 640*400 window\n"); printf ("--verbose verbose mode\n"); #ifndef SOUNDISOFF printf ("--nosound force no sound\n"); printf ("--sound enable sound\n"); #endif printf ("--nosync disable timer\n"); printf ("--bg4 Force using a four-color background\n"); printf ("--------------------------------------------------------------\n"); printf ("keys recognized during the game:\n"); printf ("CTRL+S enable/disable sound\n"); printf ("CTRL+D enable/disable music\n"); printf ("CTRL+F enable/disable sound effects\n"); printf ("CTRL+X finish the play current\n"); printf ("CTRL+Q return to the main menu\n"); printf ("CTRL+ESC quit TecnoballZ\n"); printf ("P enable/disable pause\n"); printf ("F full screen/window mode\n"); printf ("\n"); return 0; } if (!strcmp (arg_values[i], "--version")) { printf (TECNOBALLZ_VERSION); printf ("\n"); printf ("copyright (c) 1991-2014 TLK Games\n"); printf ("website: http://linux.tlk.fr/games/TecnoballZ/\n"); return 0; } if (!strcmp (arg_values[i], "--full")) { handler_display::optionfull = true; continue; } if (!strcmp (arg_values[i], "--window")) { handler_display::optionfull = false; continue; } if (!strcmp (arg_values[i], "--verbose") || !strcmp (arg_values[i], "-v")) { is_verbose = true; continue; } if (!strcmp (arg_values[i], "--320")) { resolution = 1; continue; } if (!strcmp (arg_values[i], "--640")) { resolution = 2; continue; } if (!strcmp (arg_values[i], "--nosync")) { handler_display::optionsync = false; continue; } #ifndef SOUNDISOFF if (!strcmp (arg_values[i], "--sound")) { handler_audio::is_audio_enable = true; continue; } if (!strcmp (arg_values[i], "--nosound")) { handler_audio::is_audio_enable = false; continue; } #endif /* use 4 colors background in 640x480 */ if (!strcmp (arg_values[i], "--bg4")) { force_4_colors_tiles = true; continue; } #ifdef UNDER_DEVELOPMENT /* start at brick or guard level */ if (!strcmp (arg_values[i], "--guard")) { arg_jumper = 3; continue; } if (!strcmp (arg_values[i], "--brick")) { arg_jumper = 1; continue; } #endif } return 1; } char configfile::stringname[7] = "YANIS "; tecnoballz-0.93.1/src/handler_resources.cc0000664000175000017500000006715212412501752017616 0ustar brunobruno/** * @file handler_resources.cc * @brief Handler of the files resources * @created 2004-04-20 * @date 2014-07-20 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_resources.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_resources.h" #include "../include/bitmap_data.h" #include "../config.h" #include #include #ifndef DATADIR #define DATADIR "/usr/share/games/tecnoballz" #endif #ifndef SCOREFILE #define SCOREFILE "/var/lib/games/tecnoballz.hi" #endif #ifdef _WIN32 #ifndef _S_ISDIR #define _S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) #endif #endif handler_resources * handler_resources::handler_resources_singleton = NULL; const char * handler_resources::fnamescore = SCOREFILE; const char * handler_resources::folder_640 = "hires/"; const char * handler_resources::folder_320 = "lores/"; char handler_resources::tmp_filename[512]; char handler_resources::pathstring[512]; const char * handler_resources::standfiles[] = { "cosinus128.list", //RESCOSLIST /* MAP_GUARDIANS_20 */ "tilemap-guardians_20.data", "tilemap-guardians_40.data", /* MAP_CONGRATULATIONS_20 */ "tilemap-congratulation_20.data", "tilemap-congratulation_40.data", /* MAP_MENU_20 */ "tilemap-menu_20.data", "tilemap-menu_40.data", "gard_lissa.list", //RESGCURVES /* DATA_BRICKS_LEVELS */ "tableau.data", "min60map.png", //RES60BACKG /* DATA_LEVELS */ "levels-data.xml" }; const char * handler_resources::musicfiles[] = { "area1-game2.mod", "area2-game.mod", "area3-game.mod", "area4-game.mod", "area5-game.mod", "gardien-go.mod", "high-score.mod", "over-theme.mod", "tecnoballz.mod", "tecno-winn.mod", "termigator_reg-zbb.mod", "in-game-music-1_reg.mod", "fridge-in-space_from_reg-zbb.mod", "mon-lapin_reg-zbb.mod" }; const char * handler_resources::soundfiles[] = { "rlife_moins.wav", // 01 "rexplo_rak.wav", "rlife_plus.wav", "rmoney.wav", "ralarm.wav", //05 "rgadget_sound.wav", "rtecno.wav", "rappar.wav", "rtransfo.wav", "rtir_monstre.wav", //10 "rtir_rak.wav", "rexplo_big.wav", "rdetruit_indes.wav", "rexeplo_atom.wav", "rmontre_touche.wav", //15 "ratom.wav", "rindes_1.wav", "rindes_2.wav", "rraquette.wav", "rbricote.wav", //20 "rbrique1.wav", "rbrique2.wav", "rbrique3.wav", "rbrique4.wav", "rbrique5.wav", //25 "raspire.wav", "reject.wav", //27 }; const char * handler_resources::bitmap_files[] = { /* BITMAP_HEAD_ANIMATION */ "head_animation.png", /* BITMAP_RIGHT_PANEL */ "right_panel.png", /* BITMAP_PADDLES_1 */ "paddles_1.png", /* BITMAP_PADDLES_2 */ "paddles_2.png", /* BITMAP_GAME_FONTS */ "game_fonts.png", /* BITMAP_MENU_FONTS */ "menu_fonts.png", /* BITMAP_SMALL_FONTS */ "small_fonts.png", /* BITMAP_GIGABLITZ */ "gigablitz.png", /* BITMAP_TILESMAP */ "tilesmap.png", /* BITMAP_SHOP */ "shop.png", /* BITMAP_ALL_SPRITES */ "all_sprites.png", /* BITMAP_BRICKS */ "bricks.png", /* BITMAP_SCORES_FONTS */ "font_score.png" }; const char * handler_resources::texts_files[] = { /* TEXTS_SHOP */ "shop_%s.txt", /* TEXTS_MESSAGES */ "short_info_messages_%s.txt", /* TEXTS_SCROLL_MENU */ "scrolltext_%s.txt", /* TEXTS_POPUP_MENU */ "popup_menu_%s.txt", /* TEXTS_MAIN_MENU */ "main_menu_%s.txt" }; //char handler_resources::ze_mapfile[] = "map??.png"; /** * Create the resources manager object */ handler_resources::handler_resources () { last_filesize_loaded = 0; set_filesize_loaded(0); } /** * Get the object instance * handler_resources is a singleton * @return the handler_resources object */ handler_resources * handler_resources::get_instance () { if (NULL == handler_resources_singleton) { handler_resources_singleton = new handler_resources (); } return handler_resources_singleton; } /** * Release the resources manager object */ handler_resources::~handler_resources () { if (table_cosL != NULL) { delete[](char *)table_cosL; table_cosL = (Sint16 *) NULL; } release_sprites_bitmap (); } /** * Load a resources file in memory * @param resource_id resource identifier of the data * @return file data buffer pointer */ char * handler_resources::load_data (Uint32 resource_id) { char *filename = get_filename (resource_id); return load_file (filename); } /** * Return valid name from a resource identifier * @param resource_id resource identifier * @param resolution 0 default, 1 = 320 or 2 640, * @return filename with a relative pathname */ char * handler_resources::get_filename (Uint32 resource_id, Uint32 res) { const char *pfile; if (resource_id >= BITMAP_OFFSET) { if (0 == res) { res = resolution; } resource_id -= BITMAP_OFFSET; pfile = bitmap_files[resource_id]; if (1 == res) { strcpy (tmp_filename, folder_320); } else { strcpy (tmp_filename, folder_640); } strcat (tmp_filename, pfile); } else { pfile = standfiles[resource_id]; strcpy (tmp_filename, pfile); } return tmp_filename; } /** * Return valid music filename from a resource identifier * @param resource_id resource identifier of the music * @return music filename with a relative pathname */ char * handler_resources::get_music_filename (Uint32 resource_id) { const char *pfile; strcpy (tmp_filename, "musics/"); pfile = musicfiles[resource_id]; strcat (tmp_filename, pfile); return locate_data_file (tmp_filename); } /** * Return valid sound filename from a resource identifier * @param resource_id resource identifier of the sound * @return sound filename with a relative pathname */ char * handler_resources::get_sound_filename (Uint32 resource_id) { strcpy (tmp_filename, "sounds/"); strcat (tmp_filename, soundfiles[resource_id]); return locate_data_file (tmp_filename); } /** * Return valid tilemaps filename from a tilemap number * @param title_num filename number from 1 to 78 * @return tilemap filename with a relative pathname */ char * handler_resources::get_tilemaps_filename (Uint32 title_num) { sprintf(tmp_filename, "textures/map%02d.png", title_num); return tmp_filename; } /** * Return the full pathname from a resource identifier * @param resource_id a resource identifier * @return a pointer to the file data buffer */ char * handler_resources::get_full_pathname (Uint32 resource_id) { return locate_data_file (get_filename (resource_id)); } /** * Directory list to locate a file */ const char * handler_resources::folderlist[] = { /* special value meaning "$(PREFIX)/share/games/tecnoballz/" */ DATADIR, "/", /* normally unused, except when running from the source directory */ "./TecnoballZ/", /* also marks end of list */ 0 }; /** * Locate a file under one of the data directories * @param name name of file relative to data directory */ char * handler_resources::locate_data_file (const char *const name) { /* if (is_verbose) { std:: cout << "(*) handler_resources::locate_data_file(" << name << ")" << std:: endl; } */ /* clear path name string */ for (Sint32 i = 0; i < 256; i++) pathstring[i] = 0; if (NULL == name) { std::cerr << "(!)handler_resources::locate_data_file() " << "NULL pointer was passed as an argument!" << std::endl; throw std::ios_base:: failure ("[!] handler_resources::locate_data_file " "NULL pointer was passed as an argument!"); } /* if absolute path, return a pointer to a duplicate string */ char *pathname; if (*name == '/') { pathname = &pathstring[0]; strcpy (pathname, name); return pathname; } /* process each folder of the list */ for (const char **p = folderlist;; p++) { if (*p != 0) { /* check if the file is located in current directory */ pathname = &pathstring[0]; strcpy (pathname, *p); if (pathname[strlen (pathname) - 1] != '/') { strcat (pathname, "/"); } strcat (pathname, name); } else { /* file not found, try default folder as last chance */ const char *subdir = "/share/games/tecnoballz/"; pathname = &pathstring[0]; strcpy (pathname, nomprefix); strcat (pathname, subdir); strcat (pathname, name); } /* if (is_verbose) { std::cout << "handler_resources::locate_data_file() try " << pathname << std::endl; } */ #ifdef WIN32 struct _stat s; if (_stat (pathname, &s) == 0 && !_S_ISDIR (s.st_mode)) { return pathname; } #else struct stat s; if (stat (pathname, &s) == 0 && !S_ISDIR (s.st_mode)) { /* if (is_verbose) { std:: cout << "handler_resources::locate_data_file(" << pathname << ") find!" << std::endl; } */ return pathname; } #endif /* end of the list, error file not found! */ if (*p == 0) { break; } } std::cerr << "(!)handler_resources::locate_data_file() file '" << name << "' not found!" << std::endl; throw std::ios_base::failure (std::string ("[!]handler_resources::locate_data_file() File '") + name + std::string ("' not found!")); } /** * Load a bitmap of sprites * @param resource_id resource identifier of the bitmap * BITMAP_ALL_SPRITES by default */ void handler_resources::load_sprites_bitmap (Uint32 resource_id) { release_sprites_bitmap (); sprites_bitmap = new bitmap_data (); sprites_bitmap->load (resource_id); sprites_bitmap->enable_palette (); } /** * Release the bitmap of sprites */ void handler_resources::release_sprites_bitmap () { if (sprites_bitmap != NULL) { delete sprites_bitmap; } sprites_bitmap = (bitmap_data *) NULL; } /** * Load texts data into strings list * @param resource_id resource identifier of the texts data * @param numof_lines number of lines * @param row_length maximum number of chars by string, 0 if preserve the size of * the original string * @param modulo 0 if non concatenation, 2 concatene strings 3 by 3 * @param upper_case Change from 'a' to 'z' chars by 'A' to 'Z' chars */ char ** handler_resources::load_texts(Uint32 resource_id, Uint32 numof_lines, Uint32 row_length, Uint32 modulo, bool upper_case) { resource_id -=TEXTS_OFFSET; const char *file = texts_files[resource_id]; strcpy (tmp_filename, "texts/"); strcat (tmp_filename, file); Uint32 filesize; char *filedata = loadfile_with_lang (tmp_filename, &filesize); /* * caclulate the number of lines */ Uint32 offset = 0; bool is_first_row = true; bool is_comment = false; Uint32 row_count = 0; Uint32 alloc_size = 0; Uint32 list_count = 0; Uint32 str_count = 0; while (offset < filesize) { char c = filedata[offset++]; row_count++; if (is_first_row && c == '#') { is_comment = true; } is_first_row = false; if (c == '\n') { if (!is_comment) { if (row_length > 0) { alloc_size += row_length; } else { alloc_size += row_count - 1; } str_count++; if (modulo == 0 || (str_count % modulo == 0)) { /* null-terminated string */ alloc_size++; list_count++; } } is_first_row = true; is_comment = false; row_count = 0; } } if (numof_lines > 0 && numof_lines != list_count) { std::cerr << "(!)handler_resources::load_texts() " << numof_lines << " exceptes lines, read " << list_count << " lines!" << std::endl; throw std::runtime_error ("(!))handler_resources::load_texts() " "bad number of lines!"); } /* * allocate memory require to create strings list */ alloc_size += sizeof(char *) * list_count; char *buffer = NULL; try { buffer = new char[alloc_size]; } catch (std::bad_alloc &) { std::cerr << "(!)handler_resources::load_texts() " << "not enough memory to allocate " << alloc_size << " bytes!" << std::endl; throw; } char **list = (char**) buffer; char *strs = buffer + sizeof(char *) * list_count; offset = 0; is_first_row = true; is_comment = false; row_count = 0; char* source = filedata; list_count = 0; str_count = 0; char *str_current = strs; while (offset < filesize) { char c = filedata[offset++]; row_count++; if (is_first_row && c == '#') { is_comment = true; } is_first_row = false; if (c == '\n') { if (!is_comment) { /* do not copy the carriage return */ row_count--; if (row_length > 0 && row_count >= row_length) { row_count = row_length; } for (Uint32 i = 0; i < row_count; i++) { char c = source[i]; if (upper_case && c >= 'a' && c <= 'z') { c = c - ('a' - 'A'); } if (c < ' ') { c = ' '; } *(strs++) = c; } for (Uint32 i = row_count; i < row_length; i++) { *(strs++) = ' '; } str_count++; if (modulo == 0 || (str_count % modulo == 0)) { *(strs++) = '\0'; list[list_count++] = str_current; str_current = strs; } } is_first_row = true; is_comment = false; row_count = 0; source = &filedata[offset]; } } delete[]filedata; return list; } /** * Allocate memory and load a file (filename with a language code) * @param filename specified by path * @param fsize pointer on the size of file which will be loaded * @return a pointer to the file data */ char * handler_resources::loadfile_with_lang (const char *const filename, Uint32 * const fsize) { if(filename == NULL || strlen (filename) == 0) { std::cerr << "(!)handler_resources::loadfile_with_lang() " << "NULL string!" << std::endl; throw std::ios_base::failure ("(!)handler_resources::loadfile_with_lang() " "can't open a file!"); } char* fname = new char[strlen (filename) + 1]; strcpy (fname, filename); const char* lang = config_file->get_language (); sprintf (fname, filename, lang); if (is_verbose) { std::cout << "handler_resources::loadfile_with_lang() " << "file " << fname << " was loaded in memory" << std::endl; } char* data = load_file (fname, fsize); delete[]fname; return data; } /** * Load a file in memory * @param fname filename specified by path */ char * handler_resources::load_file (const char *fname) { return load_file (fname, &last_filesize_loaded); } /** * Load a file in memory * @param fname filename specified by path * @param fsize pointer on the size of file which will be loaded * return a pointer to the file data */ char * handler_resources::load_file (const char *fname, Uint32 * fsize) { /* locate a file under one of the data directories */ char *pname = locate_data_file (fname); /* open the file */ #ifdef WIN32 Sint32 fhand = open (pname, O_RDONLY | O_BINARY, 0); #else Sint32 fhand = open (pname, O_RDONLY, 0); #endif if (fhand == -1) { std::cerr << "(!)handler_resources::load_file() " << "can't open file " << fname << "; error: " << strerror (errno) << std::endl; throw std::ios_base::failure ("(!)handler_resources::load_file() " "can't open a file!"); } /* read the size of the file */ struct stat sb; if (fstat (fhand, &sb)) { std::cerr << "(!)handler_resources::load_file() " << "can't stat file " << fname << "strerror:" << strerror (errno) << std::endl; throw std::ios_base::failure ("(!)handler_resources::load_file() " "can't stat a file!"); } /* save filesize */ (*fsize) = sb.st_size; /* allocate memory require to load the filedata */ char *buffer = NULL; try { buffer = new char[sb.st_size]; } catch (std::bad_alloc &) { std::cerr << "(!)handler_resources::load_file() " << "not enough memory to allocate " << sb.st_size << " bytes!" << std::endl; throw; } /* read the file */ if (read (fhand, buffer, sb.st_size) != sb.st_size) { std::cerr << "(!)handler_resources::load_file() " << "can't read file " << fname << "strerror:" << strerror (errno) << std::endl; throw std::ios_base::failure ("(!)handler_resources::load_file() " "can't read a file!"); return NULL; } /* close the file */ close (fhand); return buffer; } /** * Return size last file loaded in memory * @return the size of the last filesize previously */ Uint32 handler_resources::get_filesize_loaded () { return last_filesize_loaded; } void handler_resources::set_filesize_loaded (Uint32 size) { Uint32 i = size; i++; last_filesize_loaded = size; } char* handler_resources::read_complete_file (const char* filename ) { std::ifstream file (filename, std::ios::ate); if (! file.is_open () ) { std::cerr << "(!)handler_ressources::read_complete_file()" "can't open file '" << filename << "'" << std::endl; //throw std::ios_base::failure ("(!)handler_ressources::read_complete_file() can't read a file!"); return NULL; } //Uint32 size = (Uint32) file.tellg(); std::ifstream::pos_type size = file.tellg(); //int filesize = (int)size; //last_filesize_loaded = 1; //last_filesize_loaded = 2; //last_filesize_loaded = size; char *buffer = NULL; try { buffer = new char[size]; } catch (std::bad_alloc &) { file.close(); std::cerr << "(!)handler_resources::read_complete_file() " << "not enough memory to allocate " << size << " bytes!" << std::endl; throw; } file.seekg (0, std::ios::beg); file.read (buffer, size); file.close(); return buffer; } /** * Load a precalculated sinus & cosinus table (1790 bytes <=> 895 values) * 0 to 511 cosinus / 383 to 894 sinus */ void handler_resources::load_sinus () { table_cosL = (Sint16 *) load_data (handler_resources::RESCOSLIST); table_sinL = table_cosL + 383; #if SDL_BYTEORDER == SDL_LIL_ENDIAN /* convert big endian values to little endian values */ Sint32 fsize = get_filesize_loaded (); /* convert bytes = 16-bits words */ fsize = fsize / 2; for (Sint32 i = 0; i < fsize; i++) { char *p = (char *) &table_cosL[i]; char a = p[0]; p[0] = p[1]; p[1] = a; } #endif } /** * load scores table */ char * handler_resources::load_high_score_file () { char* filedata = NULL; try { filedata = load_file (fnamescore, &last_filesize_loaded); } catch (...) { std::cerr << "(!)handler_resources::load_high_score_file() " << "can't open the scores files!" << std::endl; filedata = NULL; } return filedata; } /* * Save scores table * @param buffer * @pram size */ void handler_resources::save_high_score_file (char *buffer, Uint32 size) { size_t left; ssize_t bytes_written; #ifdef WIN32 /* set umask so that files are group-writable */ _umask (0002); #else umask (0002); #endif Sint32 fhand = open (fnamescore, O_WRONLY | O_CREAT, 00666); if (fhand == -1) { fprintf (stderr, "handler_resources::save_high_score_file(): file:%s / error:%s\n", fnamescore, strerror (errno)); } left = size; while (left > 0) { #ifdef WIN32 bytes_written = _write (fhand, buffer + size - left, left); #else bytes_written = write (fhand, buffer + size - left, left); if (bytes_written == -1) { std::cerr << "(!)handler_resources::save_high_score_file():" << " filename: " << fnamescore << "; error: " << strerror (errno) << std::endl; close (fhand); return; } left -= bytes_written; } #endif if (close (fhand) == -1) { fprintf (stderr, "handler_resources::save_high_score_file(): file:%s / error:%s\n", fnamescore, strerror (errno)); } else { if (is_verbose) fprintf (stdout, "handler_resources::save_high_score_file(): " "file:%s size:%i\n", fnamescore, size); } } /** * Precalculated cosinus and sinus table */ const Sint16 handler_resources::cosinus360[720] = { 0, 2, 4, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 29, 31, 33, 35, 37, 39, 41, 43, 46, 48, 50, 52, 54, 56, 58, 60, 62, 63, 65, 67, 69, 71, 73, 75, 76, 78, 80, 82, 83, 85, 87, 88, 90, 91, 93, 94, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 125, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 126, 126, 126, 125, 125, 125, 124, 124, 123, 123, 122, 121, 121, 120, 119, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 105, 104, 103, 101, 100, 99, 97, 96, 94, 93, 91, 90, 88, 87, 85, 83, 82, 80, 78, 76, 75, 73, 71, 69, 67, 65, 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 43, 41, 39, 37, 35, 33, 31, 29, 26, 24, 22, 20, 18, 16, 13, 11, 9, 7, 4, 2, 0, -2, -4, -7, -9, -11, -13, -15, -18, -20, -22, -24, -26, -29, -31, -33, -35, -37, -39, -41, -43, -45, -48, -50, -52, -54, -56, -58, -60, -62, -63, -65, -67, -69, -71, -73, -75, -76, -78, -80, -82, -83, -85, -87, -88, -90, -91, -93, -94, -96, -97, -99, -100, -101, -103, -104, -105, -106, -108, -109, -110, -111, -112, -113, -114, -115, -116, -117, -118, -119, -119, -120, -121, -121, -122, -123, -123, -124, -124, -125, -125, -125, -126, -126, -126, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125, -124, -124, -123, -123, -122, -121, -121, -120, -119, -119, -118, -117, -116, -115, -114, -113, -112, -111, -110, -109, -108, -107, -105, -104, -103, -101, -100, -99, -97, -96, -94, -93, -91, -90, -88, -87, -85, -83, -82, -80, -78, -76, -75, -73, -71, -69, -67, -65, -64, -62, -60, -58, -56, -54, -52, -50, -48, -46, -43, -41, -39, -37, -35, -33, -31, -29, -26, -24, -22, -20, -18, -16, -13, -11, -9, -7, -4, -2, 127, 127, 127, 127, 127, 127, 126, 126, 126, 125, 125, 125, 124, 124, 123, 123, 122, 121, 121, 120, 119, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 105, 104, 103, 101, 100, 99, 97, 96, 94, 93, 91, 90, 88, 87, 85, 83, 82, 80, 78, 76, 75, 73, 71, 69, 67, 65, 64, 62, 60, 58, 56, 54, 52, 50, 48, 46, 43, 41, 39, 37, 35, 33, 31, 29, 26, 24, 22, 20, 18, 15, 13, 11, 9, 7, 4, 2, 0, -2, -4, -7, -9, -11, -13, -15, -18, -20, -22, -24, -26, -29, -31, -33, -35, -37, -39, -41, -43, -45, -48, -50, -52, -54, -56, -58, -60, -62, -63, -65, -67, -69, -71, -73, -75, -76, -78, -80, -82, -83, -85, -87, -88, -90, -91, -93, -94, -96, -97, -99, -100, -101, -103, -104, -105, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -117, -118, -119, -119, -120, -121, -121, -122, -123, -123, -124, -124, -125, -125, -125, -126, -126, -126, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -127, -126, -126, -126, -125, -125, -125, -124, -124, -123, -123, -122, -121, -121, -120, -119, -119, -118, -117, -116, -115, -114, -113, -112, -111, -110, -109, -108, -107, -105, -104, -103, -101, -100, -99, -97, -96, -94, -93, -91, -90, -88, -87, -85, -83, -82, -80, -78, -76, -75, -73, -71, -69, -67, -65, -64, -62, -60, -58, -56, -54, -52, -50, -48, -46, -43, -41, -39, -37, -35, -33, -31, -29, -26, -24, -22, -20, -18, -16, -13, -11, -9, -7, -4, -2, 0, 2, 4, 7, 9, 11, 13, 15, 18, 20, 22, 24, 26, 29, 31, 33, 35, 37, 39, 41, 43, 45, 48, 50, 52, 54, 56, 58, 60, 62, 63, 65, 67, 69, 71, 73, 75, 76, 78, 80, 82, 83, 85, 87, 88, 90, 91, 93, 94, 96, 97, 99, 100, 101, 103, 104, 105, 106, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 125, 126, 126, 126, 127, 127, 127, 127, 127 }; const Sint16 * handler_resources::zesinus360 = handler_resources::cosinus360 + 360; const Uint32 handler_resources::color_gradations[180] = { 0x0400180, 0x0420290, 0x0440392, 0x0500494, 0x0600596, 0x0700698, 0x0800795, 0x0900893, 0x0A00990, 0x0A20A80, 0x0A40B70, 0x0A60C60, 0x0A80D50, 0x0AA0E40, 0x0AC0F30, 0x0AE1020, 0x0B01110, 0x0B21200, 0x0014080, 0x0024590, 0x0034A92, 0x0045094, 0x0056096, 0x0067097, 0x0078096, 0x0089093, 0x009A090, 0x00AA180, 0x00BA270, 0x00CA360, 0x00DA450, 0x00EA540, 0x00FA630, 0x010A720, 0x011A810, 0x012A900, 0x0408001, 0x0459002, 0x04A9203, 0x0509404, 0x0609605, 0x0709806, 0x0809507, 0x0909308, 0x0A19009, 0x0A2800A, 0x0A3700B, 0x0A4600C, 0x0A5500D, 0x0A6400E, 0x0A7300F, 0x0A82010, 0x0A91011, 0x0AA0012, 0x0002080, 0x0102190, 0x0202292, 0x0302394, 0x0402496, 0x0502598, 0x0602695, 0x0702793, 0x0802890, 0x0782980, 0x0702A90, 0x0602B92, 0x0502C94, 0x0402D96, 0x0302E98, 0x0202F95, 0x0102A93, 0x0002B92, 0x0104080, 0x0204590, 0x0304A92, 0x0405094, 0x0506096, 0x0607098, 0x0708095, 0x0809093, 0x090A090, 0x0A0A280, 0x0B0A470, 0x0C0A660, 0x0B0A850, 0x0A0AA40, 0x090AC30, 0x080AE20, 0x070B010, 0x060B210, 0x04080B0, 0x04590A0, 0x04A9290, 0x0509480, 0x0609670, 0x0709860, 0x0809550, 0x0909340, 0x0A09030, 0x0A18020, 0x0A27010, 0x0A36020, 0x0A45030, 0x0A54040, 0x0A63050, 0x0A72060, 0x0A81070, 0x0A90080, 0x0101080, 0x0181290, 0x0201492, 0x0281694, 0x0301896, 0x0381A98, 0x0401C95, 0x0451E93, 0x04A2080, 0x0502270, 0x0582460, 0x0602650, 0x0702840, 0x0782B30, 0x0802E20, 0x0853010, 0x08A3205, 0x0903600, 0x0404080, 0x0484890, 0x0504A91, 0x0605092, 0x0706093, 0x0807094, 0x0908093, 0x0889092, 0x080A090, 0x081A280, 0x082A670, 0x083A860, 0x084AA50, 0x085AC40, 0x086AE30, 0x087B020, 0x088B210, 0x089B405, 0x0458040, 0x04A9045, 0x040924A, 0x0509450, 0x0609655, 0x070985A, 0x0809562, 0x0909364, 0x0A09066, 0x0A1806A, 0x0A2706C, 0x0A36070, 0x0A45073, 0x0A54076, 0x0A6307A, 0x0A72080, 0x0A81085, 0x0A90590, 0x0407080, 0x0457890, 0x04A8091, 0x0508892, 0x0609093, 0x0709894, 0x080A093, 0x090A892, 0x0A0B090, 0x0A1B880, 0x0A2C070, 0x0A3B860, 0x0A4B050, 0x0A5A840, 0x0A6A030, 0x0A79820, 0x0A89010, 0x0A98805 }; tecnoballz-0.93.1/src/supervisor_main_menu.cc0000664000175000017500000002277312412501752020360 0ustar brunobruno/** * @file supervisor_main_menu.cc * @brief TecnoballZ's main menu supervisor * @date 2012-09-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_main_menu.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/supervisor_main_menu.h" #include "../include/handler_resources.h" #include "../include/handler_players.h" #include "../include/controller_guardians.h" /** * Create the main menu supervisor */ supervisor_main_menu::supervisor_main_menu () { initialize (); /* vertical background scrolling */ tiles_map = new tilesmap_scrolling (); /* big TecnoballZ logo */ tecnoballz_logo = new sprite_object (); font_scrolling = new controller_font_menu (); text_menu = new sprite_display_menu (); mouse_pointer = new sprite_mouse_pointer (); tecnoballz_logo_angle = 0; } /** * Release the main menu supervisor */ supervisor_main_menu::~supervisor_main_menu () { delete mouse_pointer; delete text_menu; delete font_scrolling; delete tecnoballz_logo; delete tiles_map; release (); } /** * Perform some initializations */ void supervisor_main_menu::first_init () { if (is_verbose) { std::cout << "supervisor_main_menu::first_init() Begin!" << std::endl; } sprites->reset (); #ifndef SOUNDISOFF audio->play_music (handler_audio::MUSICINTRO); #endif /* * create sprites data */ resources->load_sprites_bitmap (); tecnoballz_logo->create_sprite (sprite_object::TECNOBALLZ_LOGO, sprites_bitmap, 1); sprites->add (tecnoballz_logo); tecnoballz_logo->enable (); tecnoballz_logo->set_coordinates (64 * resolution, 13 * resolution); font_scrolling->create_fontes_list (); mouse_pointer->create_pointer_sprite (sprites_bitmap); resources->release_sprites_bitmap (); tiles_map->initialize (tilesmap_scrolling::TILES_COLOR_MENU, tilesmap_scrolling::MAP_MENU); text_menu->first_init (); keyboard->set_grab_input (false); if (is_verbose) { std::cout << "supervisor_main_menu::first_init() End!" << std::endl; } } /** * Main loop of the main menu */ Uint32 supervisor_main_menu::main_loop () { display->wait_frame (); /* vertical scrolling of the screen background */ tiles_map->scroll (-1); display->lock_surfaces (); move_tecnoballz_logo (); /* scroll text of the menu */ font_scrolling->move_chars (); mouse_pointer->move (); sprites->draw (); /* check and draw the menu text */ switch (text_menu->check_and_display ()) { case sprite_display_menu::PROGRAM_EXIT: next_phase = LEAVE_TECNOBALLZ; break; case sprite_display_menu::START_GAME: next_phase = start_new_game (); break; } text_menu->draw_copy_from_bitmap (); if (keyboard->command_is_pressed (handler_keyboard::QUIT_TECNOBALLZ)) { next_phase = LEAVE_TECNOBALLZ; } display->unlock_surfaces (); /* copy whole game surface into screen surface */ display->window_update (); /* [F5] key jump to map editor */ #ifdef UNDER_DEVELOPMENT if (keyboard->key_is_pressed (SDLK_F5)) { next_phase = MAP_EDITOR; } #endif return next_phase; } /** * Move the logo of TecnoballZ sprite */ void supervisor_main_menu::move_tecnoballz_logo () { tecnoballz_logo_angle = (tecnoballz_logo_angle + 6) & SINUS_MASK; /* convert unsigned to signed */ Sint32 res = (Sint32) resolution; Uint32 a = tecnoballz_logo_angle; tecnoballz_logo->set_x_coord (((table_sinL[a] * 20 * res) >> SINUS_DECA) + 32 * res); if (!birth_flag) { return; } a = (a * 4) & SINUS_MASK; tecnoballz_logo->set_y_coord (((table_sinL[a] * 5 * res) >> SINUS_DECA) + 7 * res); } /** * Start new TecnoballZ game */ Sint32 supervisor_main_menu::start_new_game () { is_enabled_cheat_mode = false; #ifdef UNDER_DEVELOPMENT is_enabled_cheat_mode = true; #endif /* * check area password validity */ Uint32 area_num; Uint32 level_num; Uint32 grdPt; Uint32 area_count = check_area_code (); if (area_count == 0) { area_num = 1; level_num = 1; grdPt = 0; } else { if (area_count == 6) { area_num = 5; level_num = 13; } else { area_num = area_count; level_num = 12; } if (is_verbose) { std::cout << "*supervisor_main_menu::start_new_game() " << "password is valid! Password: " << ¤t_area_code[0] << "; area number:" << area_num << "; level number:" << level_num << "; difficulty level_num: " << difficulty_level << std::endl; } grdPt = controller_guardians::level2gdpt (area_num, level_num); } /* initialize and enable the player(s) */ Sint32 iplay; for (iplay = 0; iplay < number_of_players; iplay++) { Uint32 nlife = initial_num_of_lifes; handler_players * player = handler_players::players_list[iplay]; if (birth_flag) { nlife = nlife + 10; } if (strcmp (player->get_name (), "ETB ") == 0) { nlife += 5; } if (strcmp (player->get_name (), "DJI ") == 0) { nlife += 4; } if (strcmp (player->get_name (), "JMM ") == 0) { nlife += 3; } if (strcmp (player->get_name (), "ZBB ") == 0) { nlife += 2; } if (strcmp (player->get_name (), "REG ") == 0) { nlife += 1; } player->initialize (nlife, area_num, level_num, 600, grdPt); } /* disable other player(s) */ for (Uint32 i = iplay; i < handler_players::MAX_OF_PLAYERS; i++) { handler_players::players_list[i]->initialize (0, 1, 1, 0, 0); } current_player = handler_players::players_list[0]; Uint32 next = current_player->get_next_phase (); if (next == SHOP) { next = BRICKS_LEVEL; } return next; } /** * Check area area code validity * @return if the code is valid return the area number from 1 to 5 * or 6 for the very last guardian of the area 5. * Return 0 if the code is not valid */ Uint32 supervisor_main_menu::check_area_code () { Uint32 area_max = 4; Uint32 index = 0; #ifdef UNDER_DEVELOPMENT /* The number of zones really goes from 1 to 5. * The value 6 makes it possible to jump directly to the * very last guardian of the area 5 */ area_max = 6; #else if (birth_flag) { area_max = 6; } #endif for (Uint32 area_count = 1; area_count <= area_max; area_count++) { for (Uint32 difficulty_count = 1; difficulty_count <= 4; difficulty_count++) { bool is_valid = true; for (Uint32 i = 0; i < 10; i++) { if (current_area_code[i] != area_codes[index + i]) { is_valid = false; break; } } index += 10; if (is_valid) { difficulty_level = difficulty_count; return area_count; } } } return 0; } /** * Static method which return a area code * @param area_num area number from 2 to 5 * @param difficulty 0 to 3 * @return the area code */ const char * supervisor_main_menu::get_area_code (Uint32 area_num, Uint32 difficulty) { if (area_num < 2) { return NULL; } return &area_codes[(area_num - 2) * 40 + (difficulty - 1) * 10]; } /** * Static method which return the current area code * @return the current area code */ char * supervisor_main_menu::get_current_area_code () { return current_area_code; } /** * Static method which copy current area code * @param destination destination string */ void supervisor_main_menu::copy_current_area_code (char *destination) { for (Uint32 i = 0; i < AREA_CODE_LENGTH; i++) { destination[i] = current_area_code[i]; } } /** All areas code for every areas and every difficulty levels */ const char supervisor_main_menu::area_codes[241] = { /* level 12 area 1 */ "LARRYHEARD" "SAUNDERSON" "JUANATKINS" "STEPHENSON" /* level 12 area 2 */ "DANCEFLOOR" "REVOLUTION" "LOOKTOSEXY" "REACHINGUP" /* level 12 area 3 */ "ZULUNATION" "HOUSEPIMPS" "ANDRONICUS" "DEFINITIVE" /* level 12 area 4 */ "DANCEMANIA" "PEPPERMINT" "SOLARTRIBE" "PROJECTXYZ" /* level 12 area 5 (with cheat code enabled) */ "RINGOFFIRE" "POINTBLANK" "TEMPTATION" "BLUEMONDAY" /* level 13 area 5 (with cheat code enabled) */ "SHELLSHOCK" "HOUSEMUSIC" "DAVECLARKE" "CYBERACTIF" }; /** Current input area code used to jump directly to the * end of a area */ char supervisor_main_menu::current_area_code[AREA_CODE_LENGTH + 1] = " "; tecnoballz-0.93.1/src/surface_sdl.cc0000664000175000017500000003062712412501752016376 0ustar brunobruno/** * @file surface_sdl.cc * @brief an drawing surface * @created 2007-02-15 * @date 2014-08-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: surface_sdl.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/tecnoballz.h" #include "../include/surface_sdl.h" #include "../include/handler_display.h" /** * Create the surface object */ surface_sdl::surface_sdl () { object_init (); } /** * Create the surface surface object * @param w width of the surface in pixels * @param h height of the surface in pixels * @param depth number of bits per pixel: 8, 16, or 24 * @param voffset */ surface_sdl::surface_sdl (Uint32 w, Uint32 h, Uint32 depth) { object_init (); create_surface (w, h, depth); } surface_sdl::~surface_sdl () { if (NULL != surface) { SDL_FreeSurface (surface); surface = NULL; } object_free (); } /** * Return the SDL surface * @return a pointer to the SDL surface structure */ SDL_Surface * surface_sdl::get_surface () { return surface; } /** * Create an empty SDL surface * @param w width of the surface in pixels * @param h height of the surface in pixels * @param depth number of bits(s) per pixel (8 to 32) * @param flags specifies the type of surface * @param red_mask * @param green_mask * @param blue_mask * @param alpha_mask */ void surface_sdl::create_surface (Uint32 w, Uint32 h, Sint32 depth, Uint32 flags, Uint32 red_mask, Uint32 green_mask, Uint32 blue_mask, Uint32 alpha_mask) { if (is_verbose) { std::cout << " surface_sdl::create_surface() width: " << w << " height: " << h << " depth: " << depth << std::endl; } surface = SDL_CreateRGBSurface (flags, w, h, depth, red_mask, green_mask, blue_mask, alpha_mask); if (NULL == surface) { std::cerr << "(!)surface_sdl::create_surface() " << "SDL_CreateRGBSurface return " << SDL_GetError (); throw std::runtime_error ("SDL_CreateRGBSurface() failed!"); } pixel_data = (char *) surface->pixels; bytes_per_pixel = surface->format->BytesPerPixel; } /** * Return surface memory address * @return a pointer to the buffer data */ char * surface_sdl::get_pixel_data () { return pixel_data; } /** * Return surface memory address from the corresponding coordinates * @param xcoord x coordinate in the surface * @param ycoord y coordinate in the surface * @return a pointer to the pixel data */ char * surface_sdl::get_pixel_data (Sint32 xcoord, Sint32 ycoord) { Sint32 offset = ycoord * surface->pitch + xcoord * bytes_per_pixel; char *data = pixel_data + offset; return data; } /** * Return size of line in bytes * @return row size in bytes */ Uint32 surface_sdl::get_row_size () { return surface->pitch; } /** * Return surface memory offset from the corresponding coordinate * @param xcoord x coordinate in the surface * @param ycoord y coordinate in the surface * @return offset to the pixel data */ Uint32 surface_sdl::get_offset (Sint32 xcoord, Sint32 ycoord) { return ycoord * surface->pitch + xcoord * bytes_per_pixel; } /** * Clear surface * @param color pixel color value */ void surface_sdl::clear (Uint32 color) { if (SDL_FillRect (surface, NULL, color) < 0) { std::cerr << "(!)surface_sdl::blit_to_surface() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Clear surface * @param color pixel color value * @param xcoord x coordinate in the surface * @param ycoord y coordinate in the surface * @param w the width in pixels to clear * @param h the height in pixels to clear */ void surface_sdl::clear (Uint32 color, Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 h) { SDL_Rect rect = { (Sint16) xcoord, (Sint16) ycoord, (Uint16) w, (Uint16) h }; SDL_FillRect (surface, &rect, color); } /** * Return the width of the surface * @return width in pixels */ Uint32 surface_sdl::get_width () { return surface->w; } /** * Return the height of the surface * @return the height of the surface in pixels */ Uint32 surface_sdl::get_height () { return surface->h; } /** * Return amount to add to get to the next line * @param w width of source element in bytes * return modulo line */ Uint32 surface_sdl::get_line_modulo (Uint32 w) { return surface->pitch - w * bytes_per_pixel; } /** * Lock surface */ void surface_sdl::lock_surface () { if (SDL_LockSurface (surface)) { std::cerr << "(!)surface_sdl::lock_surface() " << " SDL_LockSurface return " << SDL_GetError () << std::endl; } } /** * Unlock surface */ void surface_sdl::unlock_surface () { SDL_UnlockSurface (surface); } /** * Perform a blit from the source surface to the destination surface * @param surface pointer to a surface surface object */ void surface_sdl::blit_to_surface (surface_sdl * dest) { SDL_Surface *surface_dest = dest->get_surface (); SDL_Rect rect = { 0, 0, (Uint16) surface->w, (Uint16) surface->h }; if (SDL_BlitSurface (surface, &rect, surface_dest, &rect) < 0) { std::cerr << "(!)surface_sdl::blit_to_surface() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Perform a blit from the source surface to the destination surface * @param dest pointer to a surface object * @param xcoord x coordinate in the source and destination * @param ycoord y coordinate in the source and destination * @param w the width in pixels to copy * @param h the height in pixels to copy */ void surface_sdl::blit_to_surface (surface_sdl * dest, Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 h) { SDL_Surface *surface_dest = dest->get_surface (); SDL_Rect rect = { (Sint16) xcoord, (Sint16) ycoord, (Uint16) w, (Uint16) h }; if (SDL_BlitSurface (surface, &rect, surface_dest, &rect) < 0) { std::cerr << "(!)surface_sdl::blit_to_surface() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Perform a blit from the source surface to the destination surface * @param dest pointer to a surface object * @param x1 source x coordinate in the source and destination * @param y1 source y coordinate in the source and destination * @param x2 destination x coordinate in the source and destination * @param y2 destination y coordinate in the source and destination * @param w the width in pixels to copy * @param h the height in pixels to copy */ void surface_sdl::blit_to_surface (surface_sdl * dest, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h) { /* std::cout << "surface_sdl::blit_to_surface() source(" << x1 << ", " << y1 << ") dest(" << x2 << "," << y2 << ") size(" << w << ", " << h << ")" << std::endl; */ SDL_Surface *dest_surface = dest->get_surface (); SDL_Rect src_rect = { (Sint16) x1, (Sint16) y1, (Uint16) w, (Uint16) h }; SDL_Rect dest_rect = { (Sint16) x2, (Sint16) y2, (Uint16) w, (Uint16) h }; if (SDL_BlitSurface (surface, &src_rect, dest_surface, &dest_rect) < 0) { std::cerr << "(!)surface_sdl::blit_to_surface() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Set the colors in the palette of an 8-bit surface * @param colors pointer to aSDL_Color structure */ void surface_sdl::set_palette (SDL_Color * colors) { if (bytes_per_pixel > 1) { return; } if (!SDL_SetPalette (surface, SDL_LOGPAL | SDL_PHYSPAL, colors, 0, 256)) { std::cerr << "(!)surface_sdl::set_palette() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Set the colors in the palette of an 8-bit surface * @param dest pointer to a surface object */ void surface_sdl::set_palette (surface_sdl * dest) { if (bytes_per_pixel > 1) { return; } if (is_verbose) { std::cout << " surface_sdl::set_palette surface_sdl" << std::endl; } if (!SDL_SetPalette (dest->get_surface (), SDL_LOGPAL | SDL_PHYSPAL, surface->format->palette->colors, 0, 256)) { std::cerr << "(!)surface_sdl::set_palette() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Perform a blit from the source surface to the destination surface * @param source pointer to a source surface object * @param x1 source x coordinate in the source and destination * @param y1 source y coordinate in the source and destination * @param x2 destination x coordinate in the source and destination * @param y2 destination y coordinate in the source and destination * @param w the width in pixels to copy * @param h the height in pixels to copy */ void surface_sdl::blit_surface (surface_sdl * dest, Uint32 x1, Uint32 y1, Uint32 x2, Uint32 y2, Uint32 w, Uint32 h) { /* std::cout << "surface_sdl::blit_to_surface() source(" << x1 << ", " << y1 << ") dest(" << x2 << "," << y2 << ") size(" << w << ", " << h << ")" << std::endl; */ SDL_Surface *source_surface = dest->get_surface (); SDL_Rect src_rect = { (Sint16) x1, (Sint16) y1, (Uint16) w, (Uint16) h }; SDL_Rect dest_rect = { (Sint16) x2, (Sint16) y2, (Uint16) w, (Uint16) h }; if (SDL_BlitSurface (source_surface, &src_rect, surface, &dest_rect) < 0) { std::cerr << "(!)surface_sdl::blit_to_surface(x1=" << x1 << ",y1=" << y1 << ",x2= " << x2 << ", y2=" << y2 << ", w=" << w << " , h=" << h << ") " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } /** * Fill a shadow rectangle * @param xcoord x coordinate the upper-left corner of the rectangle * @param ycoord y coordinate the upper-left corner of the rectangle * @param w width of the rectangle * @param h height of the rectangle */ void surface_sdl::fill_shadow_rect (Uint32 xcoord, Uint32 ycoord, Uint32 w, Uint32 h) { char k = (char) handler_display::SHADOW_PIX; Uint32 length = w; Uint32 ymax = ycoord + h; for (Uint32 y = ycoord; y < ymax; y++) { char *data = get_pixel_data (xcoord, y); for (Uint32 i = 0; i < length; i++) { *(data)++ |= k; } } } /** * Copy a part of the surface in a new surface * @param xcoord x-coordinate in source surface * @param ycoord y-coordinate in source surface * @param w width of the detination surface * @param h height of the destination surface */ surface_sdl * surface_sdl::cut_to_surface (Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h) { surface_sdl *dest = new surface_sdl (); dest->create_surface (w, h, surface->format->BitsPerPixel); cut_to_surface (dest, xcoord, ycoord, w, h); return dest; } /** * Copy a part of the surface in a new surface * @param xcoord x-coordinate in source surface * @param ycoord y-coordinate in source surface * @param w width of the detination surface * @param h height of the destination surface */ void surface_sdl::cut_to_surface (surface_sdl * dest, Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h) { SDL_Surface *surface_dest = dest->get_surface (); SDL_Rect rect = { (Sint16) xcoord, (Sint16) ycoord, (Uint16) w, (Uint16) h }; if (1 == bytes_per_pixel) { SDL_SetPalette (surface_dest, SDL_LOGPAL | SDL_PHYSPAL, surface->format->palette->colors, 0, 256); } if (SDL_BlitSurface (surface, &rect, surface_dest, NULL) < 0) { std::cerr << "(!)surface_sdl::cut_to_surface(xcoord=" << xcoord << ", ycoord=" << ycoord << ", w= " << w << ", h=" << h << ") " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } } tecnoballz-0.93.1/src/list_sprites.cc0000664000175000017500000000750212412501752016624 0ustar brunobruno/** * @file list_sprites.cc * @brief Call the drawing methods of all sprites * @date 2007-10-20 * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: list_sprites.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/list_sprites.h" /** * Create the object */ list_sprites::list_sprites () { shapes = NULL; shadows = NULL; num_of_shapes = 0; num_of_shadows = 0; max_of_shapes = 0; object_init (); } /** * Release the object */ list_sprites::~list_sprites () { if (shapes != NULL) { delete[]shapes; shapes = NULL; } if (shadows != NULL) { delete[]shadows; shadows = NULL; } object_free (); } /** * Allocate memory for the list of shapes and shadow * @params numof max numbers of shapes */ void list_sprites::init (Uint32 numof) { try { if (NULL == shapes) { max_of_shapes = numof; shapes = new sprite_object *[max_of_shapes]; } if (NULL == shadows) { shadows = new sprite_object *[max_of_shapes]; } } catch (std::bad_alloc &) { std:: cerr << "(!)list_sprites::init() " "not enough memory to allocate " << max_of_shapes << " list elements!" << std::endl; throw; } reset (); } /** * Clear the list */ void list_sprites::reset () { num_of_shapes = 0; num_of_shadows = 0; for (Sint32 i = 0; i < max_of_shapes; i++) { shapes[i] = NULL; shadows[i] = NULL; } } /** * Return the number of sprites remaining * @return number of free sprites */ Uint32 list_sprites::get_sprites_remaining () { return max_of_shapes - num_of_shapes; } /** * Add a sprite to the display list to draw the sprites * @param sprite pointer to a sprite object */ void list_sprites::add (sprite_object * sprite) { if (num_of_shapes >= max_of_shapes - 1) { std::cerr << "(!)list_sprites::add maximum number of sprites " << num_of_shapes << "has been reached!"; throw std::runtime_error ("(!)list_sprites::add maximum " "number of sprites has been reached!"); } shapes[num_of_shapes] = sprite; num_of_shapes++; sprite->set_display_pos (num_of_shapes); if (sprite->has_shadow ()) { shadows[num_of_shadows] = sprite; num_of_shadows++; } } /** * Draw all sprites into the main offscreen */ void list_sprites::draw () { /* draw the shahows of the objects */ for (Sint32 i = 0; i < num_of_shadows; i++) { sprite_object *sprite = shadows[i]; sprite->draw_shadow (); } /* draw the objects */ for (Sint32 i = 0; i < num_of_shapes; i++) { sprite_object *sprite = shapes[i]; sprite->draw (); } } /** * Restore background under the sprites */ void list_sprites::clear () { for (Sint32 i = 0; i < num_of_shapes; i++) { sprite_object *sprite = shapes[i]; sprite->restore_background_under_sprite (); } for (Sint32 i = 0; i < num_of_shadows; i++) { sprite_object *sprite = shadows[i]; sprite->restore_background_under_shadow (); } } tecnoballz-0.93.1/src/sprite_gigablitz.cc0000664000175000017500000000240612412501752017440 0ustar brunobruno/** * @file sprite_gigablitz.cc * @brief The sprite of the Gigablitz * @date 2007-02-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_gigablitz.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_gigablitz.h" /** * Create the Gigablitz sprite */ sprite_gigablitz::sprite_gigablitz () { clear_sprite_members (); } /** * Release the Gigablitz sprite */ sprite_gigablitz::~sprite_gigablitz () { } tecnoballz-0.93.1/src/controller_spheres.cc0000664000175000017500000001050012412501752020004 0ustar brunobruno/** * @file controller_spheres.cc * @brief Metallic spheres controller used in congratulations * @created 2004-08-05 * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_spheres.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_spheres.h" #include "../include/handler_audio.h" #include "../include/handler_resources.h" #include "../include/handler_high_score.h" #include "../include/handler_resources.h" /** * Create the metallic spheres controller */ controller_spheres::controller_spheres () { littleInit (); /* 8 metallics spheres */ max_of_sprites = 12; sprites_have_shades = true; sprite_type_id = sprite_object::METALLIC_SPHERE; radius_horizontal_variation = 0; radius_vertical_variation = 0; radius_hinc_variation = 0; radius_vinc_variation = 0; radius_sphere_speed = 0; } /** * Release the metallic spheres controller */ controller_spheres::~controller_spheres () { release_sprites_list (); } /** * Perform some initializations */ void controller_spheres::initialize () { Sint32 offst = 360 / max_of_sprites; Sint32 value = 0; for (Uint32 i = 0; i < max_of_sprites; i++) { sprites_list[i]->enable (); sprites_list[i]->x_maximum = value; value += offst; } } /** * Animate the metal spheres */ void controller_spheres::run () { const Sint16 *sin = handler_resources::zesinus360; const Sint16 *cos = handler_resources::cosinus360; Sint32 res = resolution; Uint32 angle_max = 360; Uint32 horizontal_radius = 80 * res; Uint32 vertical_radius = 80 * res; /* rotation speed variation */ radius_sphere_speed = (radius_sphere_speed + (random_counter & 3)) % angle_max; Sint32 h = (sin[radius_sphere_speed] * 2) >> 7; Sint32 v = (cos[radius_sphere_speed] * 2) >> 7; Sint32 sphere_speed = 4 + h + v; if (0 == sphere_speed) { sphere_speed = 1; } /* radius increment variation */ radius_hinc_variation = (radius_hinc_variation + (random_counter & 7)) % angle_max; h = (sin[radius_hinc_variation] * 3) >> 7; v = (cos[radius_hinc_variation] * 3) >> 7; Sint32 radius_hinc = h + v + 6; /* horizontal radius variation */ radius_horizontal_variation = (radius_horizontal_variation + radius_hinc) % angle_max; h = (sin[radius_horizontal_variation] * 30 * res) >> 7; v = (cos[radius_horizontal_variation] * 30 * res) >> 7; horizontal_radius = horizontal_radius + h + v; /* radius increment variation */ radius_vinc_variation = (radius_vinc_variation + (random_counter & 3)) % angle_max; h = (sin[radius_vinc_variation] * 6) >> 7; v = (cos[radius_vinc_variation] * 5) >> 7; Sint32 radius_vinc = h + v + 7; /* vertical radius variation */ radius_vertical_variation = (radius_vertical_variation + radius_vinc) % angle_max; h = (sin[radius_vertical_variation] * 15 * res) >> 7; v = (cos[radius_vertical_variation] * 15 * res) >> 7; vertical_radius = vertical_radius + h + v; Sint32 x_center = (160 * res) - (sprites_list[0]->sprite_width / 2); Sint32 y_center = (120 * res) - (sprites_list[0]->sprite_height / 2); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sphere = sprites_list[i]; sphere->x_maximum = (sphere->x_maximum + sphere_speed) % angle_max; Sint32 xcoord = (sin[sphere->x_maximum] * (Sint32)horizontal_radius) >> 7; Sint32 ycoord = (cos[sphere->x_maximum] * (Sint32)vertical_radius) >> 7; xcoord += x_center; ycoord += y_center; sphere->x_coord = xcoord; sphere->y_coord = ycoord; } } tecnoballz-0.93.1/src/sprite_font_game.cc0000664000175000017500000000510312412501752017420 0ustar brunobruno/** * @file sprite_font_game.cc * @brief The sprite font used to display a char of the * "LEVEL COMPLETED" string * @date 2007-10-17 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_font_game.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_font_game.h" /** * Create a fonte game sprite */ sprite_font_game::sprite_font_game () { clear_sprite_members (); initialize (0, 0, 0, 0, 0, 0); } /** * Release a fonte game sprite */ sprite_font_game::~sprite_font_game () {} /** * Initialize radius, stop coordinate and start y coordinate * @param radius Pointer to sinus table from 0 to 511 * @param x_stop Final x-coordinate * @param y_start First y-coordinate * @param xinc Horizontal speed in pixels * @param yinc Vertical speed in pixel * @param y_stop Final y-coordinate */ void sprite_font_game::initialize (Uint32 radius, Sint32 x_stop, Sint32 y_start, Sint32 xinc, Sint32 yinc, Sint32 y_stop) { current_radius = radius; xcoord_final = x_stop; ycoord_current = y_start; x_inc = xinc; y_inc = yinc; ycoord_final = y_stop; } /** * Character moving */ void sprite_font_game::move () { if (is_enabled) { /* ordinate linear moving */ Sint32 d = ycoord_current; if (d > ycoord_final) { d += y_inc; ycoord_current = d; } /* ordinate sinus moving */ Sint32 a = current_radius + 5; a &= SINUS_MASK; current_radius = a; Sint16 *s = table_sinL + a; a = *s; a *= 10 * resolution; a >>= SINUS_DECA; a = a + d; y_coord = a; /* absciss moving */ if (x_coord != xcoord_final) { x_coord += x_inc; } } clip_coordinates (); } tecnoballz-0.93.1/src/controller_magnetic_eyes.cc0000664000175000017500000001307412412501752021160 0ustar brunobruno/** * @file controller_magnetic_eyes.cc * @brief Magectic eyes controller * @created 2004-09-17 * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_magnetic_eyes.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_magnetic_eyes.h" #include "../include/handler_keyboard.h" #include "../include/handler_resources.h" /** * Create the magectic eyes controller */ controller_magnetic_eyes::controller_magnetic_eyes () { littleInit (); max_of_sprites = 3; sprites_have_shades = true; sprite_type_id = sprite_object::MAGNETIC_EYE; } /** * Release the magectic eyes controller */ controller_magnetic_eyes::~controller_magnetic_eyes () { release_sprites_list (); } /** * Enable a new eye * @return true if an eye was activated */ bool controller_magnetic_eyes::create_eye () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_eye * eye = sprites_list[i]; if (eye->is_enabled) { continue; } eye->is_enabled = true; return true; } return false; } /** * Create a initialize eyes sprites */ void controller_magnetic_eyes::create_eyes_list () { Sint32 res = resolution; create_sprites_list (); Sint32 random = random_counter; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_eye *eye = sprites_list[i]; eye->centerPosx = x_coordinates[random & 31] * res; #if __WORDSIZE == 64 random += (long) eye; #else random += (Sint32) eye; #endif eye->centerPosy = y_coordinates[random & 31] * res; random += keyboard->get_mouse_y (); eye->finishPosx = x_coordinates[random & 31] * res; random += keyboard->get_mouse_x (); eye->finishPosy = y_coordinates[random & 31] * res; random++; eye->radius_360 = 0; } /* value used for the collisions with balls */ hypotenuse = sprites_list[0]->collision_width - res * 2; center_x = hypotenuse / 2; center_y = center_x; hypotenuse = hypotenuse * hypotenuse; } /** * Move all eyes */ void controller_magnetic_eyes::move () { Sint32 random = random_counter; Sint32 res = resolution; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_eye *eye = sprites_list[i]; eye->play_animation_loop (); /* verify if center coordinates arrived at destination */ Sint32 j = 3 * res; if (eye->centerPosx > eye->finishPosx - j && eye->centerPosx < eye->finishPosx + j && eye->centerPosy > eye->finishPosy - j && eye->centerPosy < eye->finishPosy + j) { random += keyboard->get_mouse_y (); eye->finishPosx = x_coordinates[random & 31] * res; random += keyboard->get_mouse_x (); eye->finishPosy = y_coordinates[random & 31] * res; } /* move center */ Sint32 inc_x = res; Sint32 inc_y = res; Sint32 delta_x = eye->finishPosx - eye->centerPosx; if (delta_x < 0) { delta_x = -delta_x; inc_x = -res; } Sint32 delta_y = eye->finishPosy - eye->centerPosy; if (delta_y < 0) { delta_y = -delta_y; inc_y = -res; } Sint32 hflag = 0; if (delta_y > delta_x) { j = delta_y; delta_y = delta_x; delta_x = j; hflag = 1; } Sint32 value = delta_y * 2 - delta_x; delta_x *= 2; j = delta_x - 1; do { if (hflag) { eye->centerPosy += inc_y; } else { eye->centerPosx += inc_x; } value -= delta_x; if (value < 0) { if (!hflag) { eye->centerPosy += inc_y; } else { eye->centerPosx += inc_x; } break; } j--; } while (j >= 0); /* move circle */ eye->radius_360 = (eye->radius_360 + 4) % 360; Sint32 x = (handler_resources::zesinus360[eye->radius_360] * 10 * res) >> 7; Sint32 y = (handler_resources::cosinus360[eye->radius_360] * 10 * res) >> 7; eye->x_coord = eye->centerPosx + x + (15 * res); eye->y_coord = eye->centerPosy + y + (15 * res); random += 4; } } const Uint16 controller_magnetic_eyes::x_coordinates[32] = { 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 92, 96, 100, 105, 111, 115, 118, 120, 122, 128, 130, 132, 135, 140, 144, 146, 150, 152, 160, 164, 166, 170 }; const Uint16 controller_magnetic_eyes::y_coordinates[32] = { 40, 44, 56, 58, 60, 62, 70, 78, 80, 82, 85, 90, 92, 94, 96, 100, 101, 120, 122, 124, 130, 138, 144, 146, 148, 150, 152, 153, 154, 155, 160, 170 }; tecnoballz-0.93.1/src/tiles_background.cc0000664000175000017500000004760412412501752017426 0ustar brunobruno/** * @file tiles_background.cc * @brief Draw tiles background in bricks levels * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 22 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: tiles_background.cc 22 2014-08-16 11:28:58Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/bitmap_data.h" #include "../include/handler_display.h" #include "../include/tiles_background.h" #include "../include/handler_keyboard.h" #include "../include/handler_resources.h" tiles_background * tiles_background::tiles_background_singleton = NULL; /** * Create the tiles background object */ tiles_background::tiles_background () { object_init (); type_of_tiles = TILES_64x64_WITH_16_COLORS; palette_index = 0; if (resolution == 1 || force_4_colors_tiles) { type_of_tiles = TILES_32x32_WITH_4_COLORS; } current_tiles = NULL; map_tiles = NULL; map_height = 0; map_width = 0; map_xcoord = 0; map_ycoord = 0; map_xmax = 0; map_ymax = 0; tiles_width = 0; tiles_height = 0; map_scroll_num = 1; map_angle_direction = 0; map_velocity = 0.0; map_angle_speed = 0.0; map_scroll_delay = 0; } /** * Release the titles background object */ tiles_background::~tiles_background () { if (NULL != current_tiles) { delete current_tiles; current_tiles = NULL; } if (NULL != map_tiles) { delete[]map_tiles; map_tiles = NULL; } object_free (); tiles_background_singleton = NULL; } /** * Get the object instance * tiles_background is a singleton * @return the tiles_background object */ tiles_background * tiles_background::get_instance () { if (NULL == tiles_background_singleton) { tiles_background_singleton = new tiles_background (); } return tiles_background_singleton; } /** * Load and draw a tiles background * @param tiles_num */ void tiles_background::setup (Uint32 tiles_num) { if (is_verbose) { std::cout << "tiles_background::setup() tiles_num:" << tiles_num << std::endl; } if (type_of_tiles > TILES_64x64_WITH_16_COLORS) { type_of_tiles = TILES_64x64_WITH_16_COLORS; } switch (type_of_tiles) { case TILES_32x32_WITH_4_COLORS: { bitmap_data *bmp = new bitmap_data (); if (is_verbose) { std::cout << "tiles_background::setup() " "load 32x32 tiles with 4 colors" << std::endl; } bmp->load (handler_resources::RES60BACKG); tiles_width = TILES_32_WIDTH; tiles_height = TILES_32_HEIGHT; /* select one of the 60 backgrounds */ /* value from 0 to 63 */ Uint32 x; Uint32 y = random_counter & 0x3F; if (y >= 60) { y -= 60; } if (y & 0x1) { /* right side */ x = bmp->get_width () / 2; } else { x = 0; } y >>= 1; y = y * tiles_height; current_tiles = (bitmap_data *) bmp->cut_to_bitmap (x, y, 5 * tiles_width, tiles_height); delete bmp; } break; case TILES_64x64_WITH_16_COLORS: default: { if (tiles_num < 1) { tiles_num = (random_counter & 127) + 1; } if (tiles_num > 77) { tiles_num = tiles_num - 77; } char *pathname = resources->get_tilemaps_filename (tiles_num); if (is_verbose) { std::cout << "tiles_background::setup() " << "try to initialize" << pathname << std::endl; } current_tiles = new bitmap_data (); current_tiles->load (pathname); tiles_width = TILES_64_WIDTH; tiles_height = TILES_64_HEIGHT; } break; } map_width = (game_screen->get_width () - 64 * resolution) / tiles_width; Sint32 h = (240 * resolution) % tiles_height - 1; map_height = (240 * resolution) / tiles_height; map_xmax = tiles_width * map_width; if (h > 0) { map_height++; } map_ymax = tiles_height * map_height; map_row_size = tiles_height * map_width; set_palette (); /* generating random map */ generate_map (); /* draw the tiles in background offscreen */ map_xcoord = random_counter % map_xmax; map_ycoord = random_counter * frame_counter % map_ymax; draw (background_screen); draw_shadows (); } /** * Draw shadows on the top and the right of screen */ void tiles_background::draw_shadows () { offscreen_surface *screen; if (has_background) { screen = background_screen; } else { screen = game_screen; } Uint32 size = screen->get_row_size (); unsigned char mask = handler_display::SHADOW_PIX; /* draw top shadow */ char *dest = screen->get_pixel_data (); Uint32 hscreen = display->get_width () - (64 * resolution); Uint32 k = handler_display::SHADOWOFFY * resolution; for (Uint32 i = 0; i < k; i++, dest += size) { for (Uint32 j = 0; j < hscreen; j++) { dest[j] |= mask; } } /* draw right shadow */ dest = screen->get_pixel_data (252 * resolution, k); Uint32 vscreen = display->get_height () - k; k = 4 * resolution; for (Uint32 i = 0; i < vscreen; i++, dest += size) { for (Uint32 j = 0; j < k; j++) { dest[j] |= mask; } } } /** * Generate tiles map */ void tiles_background::generate_map () { /* allocate memory of the map */ if (NULL == map_tiles) { try { map_tiles = new Uint32[map_width * map_height * 4]; } catch (std::bad_alloc &) { std::cerr << "(!)tiles_background::generate_map() " "not enough memory to allocate " << map_width * map_height << " bytes!" << std::endl; throw; } } Sint32 *positions; switch (type_of_tiles) { case TILES_32x32_WITH_4_COLORS: positions = table_pos1; break; case TILES_64x64_WITH_16_COLORS: default: positions = table_pos1; if (current_tiles->get_width () / TILES_64_WIDTH > 5) { positions = table_pos2; } break; } #if __WORDSIZE == 64 Sint32 rand1 = (long) display; Sint32 rand2 = (long) current_tiles; #else /* use pointer address as random value */ Sint32 rand1 = (Sint32) display; /* use pointer address as random value */ Sint32 rand2 = (Sint32) current_tiles; #endif for (Uint32 v = 0; v < map_height; v++) { for (Uint32 h = 0; h < map_width; h++) { random_counter = random_counter + rand1 + rand2 + 1 + keyboard->get_mouse_x (); rand1 = rand1 + frame_counter + v; rand2 = rand2 + display->get_frames_per_second (); Uint32 x = random_counter; /* table index, from 0 to 15 */ x &= 0x0f; /* position source, from 0 to 4 */ x = positions[x]; x *= tiles_width; Uint32 map_index = v * map_width * 2 + h; map_tiles[map_index] = x; map_tiles[map_index + map_width] = x; map_tiles[map_index + map_width * 2 * map_height] = x; map_tiles[map_index + map_width * 2 * map_height + map_width] = x; } } } /** * Set a type of displacement for the tilesmap scrolling */ void tiles_background::set_scroll_type (Uint32 type) { map_scroll_num = type; map_scroll_delay = 0; if (type != TILES_NO_SCROLL) { map_velocity = 0.0; } } /** * Draw the tiles background */ void tiles_background::draw () { switch (map_scroll_num) { case TILES_NO_SCROLL: if (map_velocity >= -0.001 && map_velocity <= 0.001) { map_velocity = 0; } else if (map_velocity > -0.01) { map_velocity -= 0.1; } else { map_velocity += 0.1; } break; case TILES_SCROLL_WIN: map_angle_direction = 3.14; map_velocity = 5.0; break; case TILES_SCROLL_GAMEOVER: if (map_velocity > -0.01 && map_velocity < 0.01) { double pi = 4 * atan (1.0); Uint32 i = random_counter & 64; map_angle_direction = (pi * 2 / 64) * i; } map_velocity = cos (map_angle_speed) * 5; if (map_scroll_delay < 1) { map_angle_speed -= 0.01; if ((map_velocity > 1 - 0.1 && map_velocity < 1 + 0.1) || (map_velocity > -3 - 0.1 && map_velocity < -3 + 0.1)) { map_scroll_delay = 100; } } else { map_scroll_delay--; } break; case TILES_SCROLL_LOST: if (map_velocity > -0.01 && map_velocity < 0.01) { double pi = 4 * atan (1.0); Uint32 i = random_counter & 31; map_angle_direction = (pi * 2 / 32) * i; } map_velocity = cos (map_angle_speed) * 5; if (map_scroll_delay < 1) { map_angle_speed -= 0.01; if ((map_velocity > 2 - 0.1 && map_velocity < 2 + 0.1) || (map_velocity > -2 - 0.1 && map_velocity < -2 + 0.1)) { map_scroll_delay = 10; } } else { map_scroll_delay--; } break; case TILES_SCROLL_BEGIN: if (map_velocity > -0.01 && map_velocity < 0.01) { double pi = 4 * atan (1.0); Uint32 i = random_counter & 31; map_angle_direction = (pi * 2 / 32) * i; } map_velocity = cos (map_angle_speed) * 6; if (map_scroll_delay < 1) { map_angle_speed += 0.01; if ((map_velocity > 3 - 0.1 && map_velocity < 3 + 0.1) || (map_velocity > -3 - 0.1 && map_velocity < -3 + 0.1)) { map_scroll_delay = 50; } } else { map_scroll_delay--; } } map_ycoord = map_ycoord + (Uint32) (map_velocity * cos (map_angle_direction)); map_xcoord = map_xcoord + (Uint32) (map_velocity * sin (map_angle_direction)); draw (game_screen); draw_shadows (); } /** * Draw the tiles background * @param offscreen pointer to a offscreen_surface object */ void tiles_background::draw (offscreen_surface * offscreen) { map_xcoord = map_xcoord % map_xmax; map_ycoord = map_ycoord % map_ymax; SDL_Surface *screen_surface = offscreen->get_surface (); SDL_Surface *tiles_surface = current_tiles->get_surface (); Uint32 voffset = offscreen->get_vertical_offset (); /* width and height of the visible window */ Uint32 width_box = offscreen->get_width () - 64 * resolution; Uint32 height_box = offscreen->get_height () - voffset * 2; /* index on the first tile map */ Uint32 map_index = (map_ycoord / tiles_height % map_height) * map_height * 2 + (map_xcoord / tiles_width % map_width); /* calculate the width of the tiles of the first column */ Uint32 modulo_x = map_xcoord % tiles_width; Uint32 first_width = tiles_width - modulo_x; /* calculate the height of the tiles of the first line */ Uint32 modulo_y = map_ycoord % tiles_height; Uint32 first_height = tiles_height - modulo_y; /* calculate the width of the tiles of the last column, * zero value is * possible */ Uint32 last_width = (width_box - first_width) % tiles_width; /* calculate the height of the tiles of the last line, * zero value is * possible */ Uint32 last_height = (height_box - first_height) % tiles_height; SDL_Rect rect_src = { 0, 0, 0, 0 }; SDL_Rect rect_dst = { 0, 0, 0, 0 }; rect_dst.y = voffset; Uint32 vcount = (height_box - first_height) / tiles_height + 1; Uint32 hcount = (width_box - first_width) / tiles_width + 1; for (Uint32 v = 0; v <= vcount; v++) { if (v == 0) { rect_src.h = rect_dst.h = first_height; rect_src.y = modulo_y; } else { rect_src.y = 0; if (v < vcount) { rect_src.h = rect_dst.h = tiles_height; } else { if (last_height > 0) { rect_src.h = rect_dst.h = last_height; } else { continue; } } } rect_dst.x = 0; Uint32 *map_line = &map_tiles[map_index]; for (Uint32 h = 0; h <= hcount; h++) { if (h == 0) { rect_src.w = rect_dst.w = first_width; rect_src.x = *(map_line++) + modulo_x; } else { rect_src.x = *(map_line++); if (h < hcount) { rect_src.w = rect_dst.w = tiles_width; } else { if (last_width > 0) { rect_src.w = rect_dst.w = last_width; } else { continue; } } } if (SDL_BlitSurface (tiles_surface, &rect_src, screen_surface, &rect_dst) < 0) { std::cerr << "(!)tiles_background::draw() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } rect_dst.x += rect_dst.w; } map_index += map_width * 2; rect_dst.y += rect_dst.h; } } /** * x-coordinates of sources in the tiles bitmap */ Sint32 tiles_background::table_pos1[16] = { 3, 0, 0, 3, 4, 2, 1, 4, 3, 2, 1, 1, 0, 0, 2, 4 }; Sint32 tiles_background::table_pos2[16] = { 3, 0, 0, 3, 4, 2, 1, 4, 3, 2, 1, 1, 5, 0, 5, 4 }; void tiles_background::set_palette () { /* initialize color palette */ switch (type_of_tiles) { case TILES_32x32_WITH_4_COLORS: set_4_color_palette (); break; case TILES_64x64_WITH_16_COLORS: default: unsigned char *colPT = current_tiles->get_palette (); SDL_Color *palPT = display->get_palette (); SDL_Color *palP1 = palPT; SDL_Color *palP2 = palP1 + 128; unsigned char pixel; for (Sint32 i = 0; i < 16; i++) { /* red */ pixel = *(colPT++); palP1->r = pixel; pixel >>= 1; palP2->r = pixel; /* green */ pixel = *(colPT++); palP1->g = pixel; pixel >>= 1; palP2->g = pixel; /* blue */ pixel = *(colPT++); palP1->b = pixel; pixel >>= 1; palP2->b = pixel; palP1++; palP2++; } display->enable_palette (palPT); break; } } /** * Randomly select one of 112 4-color palettes */ void tiles_background::set_4_color_palette () { Sint32 j = random_counter & 0x1ff; if (j >= 448) { /* 112 preset 4 color palettes */ j -= 448; } j = j & 0xfff0; set_4_color_palette (j); } /** * Set next background palette of 4 colors */ void tiles_background::next_4_color_palette () { palette_index += 16; if (palette_index >= 432) { palette_index = 0; } set_4_color_palette (palette_index); } /** * Set previous background palette of 4 colors */ void tiles_background::prev_4_color_palette () { palette_index -= 16; if (palette_index < 0) { palette_index = 432; } set_4_color_palette (palette_index); } /** * Initialize a background palette color of 4 colors * @param pal_index 4 color palette number */ void tiles_background::set_4_color_palette (Uint32 pal_index) { if (is_verbose) { std::cout << "tiles_background::set_4_color_palette() " << "pal_index:" << pal_index << std::endl; } palette_index = pal_index; unsigned char *color = &couleurs[0]; unsigned char *colPT = (color) + pal_index; SDL_Color *pal = display->get_palette (); SDL_Color *lighted = pal + 1; SDL_Color *dark = lighted + 128; for (Uint32 i = 0; i < 4; i++) { unsigned char pixel = *(colPT++); /* red */ pixel = *(colPT++); lighted->r = pixel; pixel >>= 1; dark->r = pixel; /* green */ pixel = *(colPT++); lighted->g = pixel; pixel >>= 1; dark->g = pixel; /* blue */ pixel = *(colPT++); lighted->b = pixel; pixel >>= 1; dark->b = pixel; lighted++; dark++; } display->enable_palette (pal); if (NULL != current_tiles) { current_tiles->set_palette (pal); } } /** * Preset palettes: 4 colors original background (mode 320x200) * 448 / 16 : 28 preset palettes * 4 * 4 : 16 composantes by palette * 112 * 4 : 448 composantes */ unsigned char tiles_background::couleurs[448] = { 0x00, 0x40, 0x20, 0x40, 0x00, 0x60, 0x40, 0x60, 0x00, 0x80, 0x60, 0x80, 0x00, 0xA0, 0x80, 0xA0, 0x00, 0x00, 0x20, 0x40, 0x00, 0x20, 0x40, 0x60, 0x00, 0x40, 0x60, 0x80, 0x00, 0x60, 0x80, 0xA0, 0x00, 0x00, 0x20, 0x20, 0x00, 0x20, 0x40, 0x40, 0x00, 0x40, 0x60, 0x60, 0x00, 0x60, 0x80, 0x80, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x60, 0x00, 0x20, 0x60, 0x80, 0x00, 0x40, 0x80, 0xA0, 0x00, 0x30, 0x40, 0x30, 0x00, 0x50, 0x60, 0x50, 0x00, 0x70, 0x80, 0x70, 0x00, 0x90, 0xA0, 0x90, 0x00, 0x20, 0x20, 0x40, 0x00, 0x40, 0x40, 0x60, 0x00, 0x60, 0x60, 0x80, 0x00, 0x80, 0x80, 0xA0, 0x00, 0x00, 0x40, 0x40, 0x00, 0x20, 0x60, 0x60, 0x00, 0x40, 0x80, 0x80, 0x00, 0x60, 0xA0, 0xA0, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x20, 0x40, 0x00, 0x60, 0x40, 0x60, 0x00, 0x80, 0x60, 0x80, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x60, 0x40, 0x00, 0x20, 0x80, 0x60, 0x00, 0x40, 0xA0, 0x80, 0x00, 0x40, 0x20, 0x00, 0x00, 0x60, 0x40, 0x20, 0x00, 0x80, 0x60, 0x40, 0x00, 0xA0, 0x80, 0x60, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x20, 0x20, 0x00, 0x80, 0x40, 0x40, 0x00, 0xA0, 0x60, 0x60, 0x00, 0x40, 0x00, 0x40, 0x00, 0x60, 0x20, 0x60, 0x00, 0x80, 0x40, 0x80, 0x00, 0xA0, 0x60, 0xA0, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x40, 0x20, 0x00, 0x40, 0x60, 0x40, 0x00, 0x60, 0x80, 0x60, 0x00, 0x20, 0x40, 0x20, 0x00, 0x40, 0x60, 0x40, 0x00, 0x60, 0x80, 0x60, 0x00, 0x80, 0xA0, 0x80, 0x00, 0x40, 0x40, 0x00, 0x00, 0x60, 0x60, 0x20, 0x00, 0x80, 0x80, 0x40, 0x00, 0xA0, 0xA0, 0x60, 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x60, 0x20, 0x00, 0x40, 0x80, 0x40, 0x00, 0x60, 0xA0, 0x60, 0x00, 0x20, 0x20, 0x20, 0x00, 0x40, 0x40, 0x40, 0x00, 0x60, 0x60, 0x60, 0x00, 0x80, 0x80, 0x80, 0x00, 0x40, 0x20, 0x60, 0x00, 0x60, 0x40, 0x80, 0x00, 0x80, 0x60, 0xA0, 0x00, 0xA0, 0x80, 0xC0, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, 0x20, 0x00, 0x60, 0x60, 0x40, 0x00, 0x80, 0x80, 0x60, 0x00, 0x20, 0x40, 0x60, 0x00, 0x40, 0x60, 0x80, 0x00, 0x60, 0x80, 0xA0, 0x00, 0x80, 0xA0, 0xC0, 0x00, 0x60, 0x40, 0x20, 0x00, 0x80, 0x60, 0x40, 0x00, 0xA0, 0x80, 0x60, 0x00, 0xC0, 0xA0, 0x80, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x20, 0x80, 0x00, 0x80, 0x40, 0xA0, 0x00, 0xA0, 0x60, 0xC0, 0x00, 0x40, 0x00, 0x20, 0x00, 0x60, 0x20, 0x40, 0x00, 0x80, 0x40, 0x60, 0x00, 0xA0, 0x60, 0x80, 0x00, 0x20, 0x20, 0x60, 0x00, 0x40, 0x40, 0x80, 0x00, 0x60, 0x60, 0xA0, 0x00, 0x80, 0x80, 0xC0, 0x00, 0x60, 0x40, 0x00, 0x00, 0x80, 0x60, 0x20, 0x00, 0xA0, 0x80, 0x40, 0x00, 0xC0, 0x80, 0x60, 0x00, 0x20, 0x40, 0x00, 0x00, 0x40, 0x60, 0x20, 0x00, 0x60, 0x80, 0x40, 0x00, 0x80, 0xA0, 0x60, 0x00, 0x40, 0x20, 0x20, 0x00, 0x60, 0x40, 0x40, 0x00, 0x80, 0x60, 0x60, 0x00, 0xA0, 0x80, 0x80, 0x00, 0x20, 0x40, 0x40, 0x00, 0x40, 0x60, 0x60, 0x00, 0x60, 0x80, 0x80, 0x00, 0x80, 0xA0, 0xA0 }; tecnoballz-0.93.1/src/controller_paddles.cc0000664000175000017500000007431512412501752017765 0ustar brunobruno/** * @file controller_paddles.cc * @brief Paddles controller * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_paddles.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_paddles.h" #include "../include/handler_resources.h" #include "../include/handler_players.h" #include "../include/controller_projectiles.h" #include "../include/handler_keyboard.h" /** * Create the paddles controller in bricks levels */ controller_paddles::controller_paddles () { littleInit (); sprites_have_shades = true; is_draw_pixel_by_pixel = false; is_team_mode = false; if (current_phase == GUARDS_LEVEL) { max_of_sprites = 1; sprite_type_id = sprite_object::PADDLE_IN_GUARDIANS_LEVEL; paddle_length = 32 * resolution; reverse_counter = 0; paddle_bottom = new sprite_paddle (false); paddle_right = NULL; paddle_top = NULL; paddle_left = NULL; paddle_robot = NULL; width_maxi = 32 * resolution; width_mini = 32 * resolution; bottom_y_coord = (232 - 8) * resolution; min_coordinate = 16 * resolution; max_coordinate = 300 * resolution; } else { max_of_sprites = 5; sprite_type_id = sprite_object::HORIZONTAL_PADDLE; paddle_length = 64 * resolution; paddle_bottom = new sprite_paddle (); paddle_right = new sprite_paddle (); paddle_top = new sprite_paddle (); paddle_left = new sprite_paddle (); paddle_robot = new sprite_paddle (false); min_coordinate = 32 * resolution; max_coordinate = 224 * resolution; top_y_coord = (20 - 8) * resolution; bottom_y_coord = (232 - 8) * resolution; left_x_coord = 20 * resolution; right_x_coord = 228 * resolution; width_maxi = 64 * resolution; width_mini = 16 * resolution; reverse_counter = 0; } } /** * Release the paddles controller in guards levels */ controller_paddles::~controller_paddles () { release_sprites_list (); } /** * Create and initializes the list of the projectiles for the 4 paddles */ void controller_paddles::create_projectiles_list () { paddle_bottom->create_projectiles_list (); paddle_right->create_projectiles_list (); paddle_top->create_projectiles_list (); paddle_left->create_projectiles_list (); } /** * Intialize the paddles */ void controller_paddles::create_paddles_sprites () { alloc_sprites_list (); /* * Create one simple paddle in guards levels */ if (max_of_sprites == 1) { paddle_bottom->set_object_pos (0); paddle_bottom->create_sprite (sprite_type_id, sprites_bitmap, 1, 0); sprites->add (paddle_bottom); sprites_list[0] = paddle_bottom; paddle_bottom->set_coordinates (keyboard->get_mouse_x (), bottom_y_coord); /* width of the paddle in pixels */ paddle_bottom->collision_width = paddle_length; paddle_bottom->paddle_number = 1; paddle_bottom->is_vertical = 0; /* ball rebounds table */ paddle_bottom->rebonds_Ga = midi1_left; paddle_bottom->rebonds_Dr = midi1Right; paddle_bottom->enable_counter = 1; paddle_bottom->enable (); paddle_bottom->direct_tab = ballePets1; // table direction balle collee } else { /** * create 4 paddles sprites */ Uint32 id; if (current_player->get_area_number () > 2) { id = handler_resources::BITMAP_PADDLES_1; } else { id = handler_resources::BITMAP_PADDLES_2; } resources->load_sprites_bitmap (id); /* create bottom paddle sprite */ paddle_bottom->set_object_pos (0); paddle_bottom->create_sprite (sprite_object::HORIZONTAL_PADDLE, sprites_bitmap, true, 0); sprites->add (paddle_bottom); sprites_list[0] = paddle_bottom; /* create left paddle sprite */ paddle_right->set_object_pos (1); paddle_right->create_sprite (sprite_object::VERTICAL_PADLLE, sprites_bitmap, true, 0); sprites->add (paddle_right); sprites_list[1] = paddle_right; /* create top paddle sprite */ paddle_top->set_object_pos (2); paddle_bottom->duplicate_to (paddle_top); sprites->add (paddle_top); sprites_list[2] = paddle_top; /* create right paddle sprite */ paddle_left->set_object_pos (3); paddle_right->duplicate_to (paddle_left); sprites->add (paddle_left); sprites_list[3] = paddle_left; /* release paddles graphic page */ resources->release_sprites_bitmap (); } } /** * Create and initialize the robot paddle sprite */ void controller_paddles::initialize_robot () { paddle_robot->set_object_pos (4); paddle_robot->create_sprite (sprite_object::PADDLE_ROBOT, sprites_bitmap, true, 0); sprites->add (paddle_robot); sprites_list[4] = paddle_robot; } /** * Activate robot paddle in bricks level */ void controller_paddles::enable_robot () { Sint32 center; paddle_robot->enable (); center = min_coordinate + (max_coordinate - min_coordinate) / 2 - (paddle_robot->collision_width / 2); paddle_robot->set_coordinates (center, 232 * resolution); paddle_robot->enable_counter = 1; } /** * Deactivate robot paddle in bricks level */ void controller_paddles::disable_robot () { paddle_robot->disable (); paddle_robot->enable_counter = 0; } /** * Initialize the four paddles in the bricks levels * @param blitz a pointer to the gigablitz controller * @param ball a pointer to the balls controller */ void controller_paddles::init_paddles (controller_gigablitz * blitz, controller_balls * ball) { gigablitz = blitz; balls = ball; paddle_length = current_player->get_paddle_length (); Sint32 center = (max_coordinate - min_coordinate) / 2 - (paddle_length / 2); /* initialize bottom paddle */ paddle_bottom->set_coordinates (center, bottom_y_coord); /* paddles width: 8, 16, 24, 32, 40, 48, 56 or 64 pixels */ paddle_bottom->collision_width = paddle_length; paddle_bottom->paddle_number = BOTTOM_PADDLE; paddle_bottom->is_vertical = false; paddle_bottom->enable_if_ok (is_team_mode, paddle_length, 3); paddle_bottom->projectile_xinc0 = 0; paddle_bottom->projectile_yinc0 = -5 * resolution; paddle_bottom->projectile_xinc1 = -1 * resolution; paddle_bottom->projectile_yinc1 = -4 * resolution; paddle_bottom->projectile_xinc2 = 1 * resolution; paddle_bottom->projectile_yinc2 = -4 * resolution; paddle_bottom->projectile_xcenter = 32 * resolution; paddle_bottom->projectile_ycenter = -20 * resolution; paddle_bottom->projectile_xoffset = 0; paddle_bottom->projectile_yoffset = -10 * resolution; paddle_bottom->rebonds_Ga = midi1_left; // rebonds raquette va a gauche paddle_bottom->rebonds_Dr = midi1Right; // rebonds raquette va a droite paddle_bottom->direct_tab = ballePets1; // table direction balle collee paddle_bottom->width_mini = width_mini; paddle_bottom->width_maxi = width_maxi; /* initialize right paddle */ paddle_right->set_coordinates (right_x_coord, center); paddle_right->collision_height = paddle_length; paddle_right->paddle_number = RIGHT_PADDLE; paddle_right->is_vertical = true; paddle_right->enable_if_ok (is_team_mode, paddle_length, current_player->get_paddle_alive_counter (RIGHT_PADDLE)); paddle_right->projectile_xinc0 = -5 * resolution; paddle_right->projectile_yinc0 = 0; paddle_right->projectile_xinc1 = -4 * resolution; paddle_right->projectile_yinc1 = 1 * resolution; paddle_right->projectile_xinc2 = -4 * resolution; paddle_right->projectile_yinc2 = -1 * resolution; paddle_right->projectile_xcenter = -20 * resolution; paddle_right->projectile_ycenter = 32 * resolution; paddle_right->projectile_xoffset = -10 * resolution; paddle_right->projectile_yoffset = 0; paddle_right->rebonds_Ga = midi2_left; paddle_right->rebonds_Dr = midi2Right; paddle_right->direct_tab = ballePets2; paddle_right->width_mini = width_mini; paddle_right->width_maxi = width_maxi; current_player->set_paddle_alive_counter (RIGHT_PADDLE, paddle_right->enable_counter); /* initialize top paddle */ paddle_top->set_coordinates (center, top_y_coord); paddle_top->collision_width = paddle_length; paddle_top->paddle_number = TOP_PADDLE; paddle_top->is_vertical = false; paddle_top->enable_if_ok (is_team_mode, paddle_length, current_player->get_paddle_alive_counter (TOP_PADDLE)); paddle_top->projectile_xinc0 = 0; paddle_top->projectile_yinc0 = 5 * resolution; paddle_top->projectile_xinc1 = 1 * resolution; paddle_top->projectile_yinc1 = 4 * resolution; paddle_top->projectile_xinc2 = -1 * resolution; paddle_top->projectile_yinc2 = 4 * resolution; paddle_top->projectile_xcenter = 32 * resolution - 5; paddle_top->projectile_ycenter = 24 * resolution; paddle_top->projectile_xoffset = 0; paddle_top->projectile_yoffset = 10 * resolution; paddle_top->rebonds_Ga = midi3_left; paddle_top->rebonds_Dr = midi3Right; paddle_top->direct_tab = ballePets3; paddle_top->width_mini = width_mini; paddle_top->width_maxi = width_maxi; current_player->set_paddle_alive_counter (TOP_PADDLE, paddle_top->enable_counter); /* initialize left paddle */ paddle_left->set_coordinates (left_x_coord, center); paddle_left->collision_height = paddle_length; paddle_left->paddle_number = LEFT_PADDLE; paddle_left->is_vertical = true; paddle_left->enable_if_ok (is_team_mode, paddle_length, current_player->get_paddle_alive_counter (LEFT_PADDLE)); paddle_left->projectile_xinc0 = 5 * resolution; paddle_left->projectile_yinc0 = 0 * resolution; paddle_left->projectile_xinc1 = 4 * resolution; paddle_left->projectile_yinc1 = 1 * resolution; paddle_left->projectile_xinc2 = 4 * resolution; paddle_left->projectile_yinc2 = -1 * resolution; paddle_left->projectile_xcenter = 24 * resolution; paddle_left->projectile_ycenter = 32 * resolution - 5; paddle_left->projectile_xoffset = 10 * resolution; paddle_left->projectile_yoffset = 0; paddle_left->rebonds_Ga = midi4_left; paddle_left->rebonds_Dr = midi4Right; paddle_left->direct_tab = ballePets4; paddle_left->width_mini = width_mini; paddle_left->width_maxi = width_maxi; current_player->set_paddle_alive_counter (LEFT_PADDLE , paddle_left->enable_counter); /* initialize robot paddle */ paddle_robot->set_coordinates (center, bottom_y_coord); /* paddle width always 128 pixels */ paddle_robot->collision_width = width_maxi; paddle_robot->paddle_number = ROBOT_PADDLE; paddle_robot->is_vertical = false; paddle_robot->projectile_xinc0 = 0; paddle_robot->projectile_yinc0 = -5 * resolution; paddle_robot->projectile_xinc1 = -1 * resolution; paddle_robot->projectile_yinc1 = -4 * resolution; paddle_robot->projectile_xinc2 = 1 * resolution; paddle_robot->projectile_yinc2 = -4 * resolution; paddle_robot->projectile_xcenter = 32 * resolution; paddle_robot->projectile_ycenter = -20 * resolution; paddle_robot->projectile_xoffset = 0; paddle_robot->projectile_yoffset = -10 * resolution; paddle_robot->rebonds_Ga = midi1_left; // rebonds raquette va a gauche paddle_robot->rebonds_Dr = midi1Right; // rebonds raquette va a droite paddle_robot->direct_tab = ballePets1; // table direction balle collee } /** * Fire the projectiles */ void controller_paddles::fire_projectiles () { /* mode solo */ if (!is_team_mode) { if (keyboard->is_left_button () || keyboard->control_is_pressed(handler_keyboard::K_FIRE)) { paddle_bottom->fire_projectiles (); paddle_right->fire_projectiles (); paddle_top->fire_projectiles (); paddle_left->fire_projectiles (); } } else /* mode team no implemented */ { } paddle_bottom->move_projectiles (); paddle_right->move_projectiles (); paddle_top->move_projectiles (); paddle_left->move_projectiles (); } /** * Check if the player release all glued balls in the bricks levels */ void controller_paddles::check_if_release_balls () { /* * mode solo */ if (!is_team_mode) { if (keyboard->is_right_button () || keyboard->control_is_pressed (handler_keyboard::K_RELEASE_BALL)) { tiles_background *tiles = tiles_background::get_instance (); tiles->set_scroll_type(tiles_background::TILES_NO_SCROLL); paddle_bottom->release_ball (); paddle_right->release_ball (); paddle_top->release_ball (); paddle_left->release_ball (); #ifndef SOUNDISOFF audio->stop_lost_music (); #endif } } /* * mode team not implemented */ /* else { } */ } /** * Check if the player release all glued balls in the guards levels */ void controller_paddles::check_if_release_ball () { if (keyboard->is_right_button () || keyboard->control_is_pressed(handler_keyboard::K_RELEASE_BALL)) { paddle_bottom->release_ball (); } } /** * Release all balls in bricks levels */ void controller_paddles::release_all_balls () { paddle_bottom->release_ball (); paddle_right->release_ball (); paddle_top->release_ball (); paddle_left->release_ball (); } /** * Calculate the speed of */ Sint32 controller_paddles::get_paddles_speed () { Sint32 off_x = 0; bool is_key_down = false; if (keyboard->control_is_pressed(handler_keyboard::K_LEFT)) { if ((Sint32)kb_paddle_speed > 0) { kb_paddle_speed = 0; } kb_paddle_speed -= 2; if ((Sint32)kb_paddle_speed < 1) { kb_paddle_speed *= 0.9; } off_x = (Sint32)kb_paddle_speed; is_key_down = true; } else if (keyboard->control_is_pressed(handler_keyboard::K_RIGHT)) { if ((Sint32)kb_paddle_speed < 0) { kb_paddle_speed = 0; } kb_paddle_speed += 2; if ((Sint32)kb_paddle_speed > 1) { kb_paddle_speed *= 0.9; } off_x = (Sint32)kb_paddle_speed; is_key_down = true; } if (absolute_mouse_positioning) { if (!is_key_down) { kb_paddle_speed = 0; off_x = keyboard->get_mouse_x () - paddle_bottom->x_coord; } else { SDL_WarpMouse (paddle_bottom->x_coord + off_x, display->get_height() >> 1); } } else { if (!is_key_down) { kb_paddle_speed = 0; off_x = keyboard->get_mouse_x_offset (); } } return off_x; } /** * Control the movements of paddle(s) in the bricks levels */ void controller_paddles::move_paddles () { Sint32 speed = 0; const Sint32 **tabB1, **tabB2, **tabB3, **tabB4; Sint32 x = paddle_bottom->x_coord; Sint32 off_x = get_paddles_speed(); /* one player mode */ if (!is_team_mode) { rakVgauche = 0; rakVdroite = 0; /* if 2 mouse buttons are pressed or GigaBlitz run also no test */ if (!keyboard->is_gigablitz_or_tilt () && !gigablitz->is_enable ()) { if (reverse_counter > 0) { off_x = -off_x; } x += off_x; if (off_x < 0) { if (x <= min_coordinate) { x = min_coordinate; } rakVgauche = -off_x; speed = rakVgauche; tabB1 = paddle_bottom->rebonds_Ga; tabB2 = paddle_right->rebonds_Ga; tabB3 = paddle_top->rebonds_Ga; tabB4 = paddle_left->rebonds_Ga; } else { Sint32 i = max_coordinate - paddle_length; if (x >= i) { x = i; } rakVdroite = off_x; speed = rakVdroite; tabB1 = paddle_bottom->rebonds_Dr; tabB2 = paddle_right->rebonds_Dr; tabB3 = paddle_top->rebonds_Dr; tabB4 = paddle_left->rebonds_Dr; } /* select a table of bounces's ball according to paddle's moving */ if (speed > 10) { speed = 10; } paddle_bottom->current_bounces = *(tabB1 + speed); paddle_right->current_bounces = *(tabB2 + speed); paddle_top->current_bounces = *(tabB3 + speed); paddle_left->current_bounces = *(tabB4 + speed); /** Update x or y coordinates of the paddles */ paddle_bottom->set_x_coord (x); paddle_right->set_y_coord (x - 16); paddle_top->set_x_coord (x); paddle_left->set_y_coord (x - 16); } } /* team mode (on Amiga I had two mice simultaneously) */ else { } } /** * Control the movements of paddle in the guardians levels */ void controller_paddles::move_paddle () { Sint32 speed = 0; const Sint32 **tabB1; Sint32 x = paddle_bottom->x_coord; Sint32 off_x = get_paddles_speed(); /* mode solo */ if (!is_team_mode) { if (reverse_counter > 0) { off_x = -off_x; } x += off_x; if (off_x < 0) { if (x <= min_coordinate) { x = min_coordinate; } speed = -off_x; tabB1 = paddle_bottom->rebonds_Ga; } else { Sint32 i = max_coordinate - paddle_length; if (x >= i) x = i; speed = off_x; tabB1 = paddle_bottom->rebonds_Dr; } /* select a table of bounces's ball according to paddle's moving */ if (speed > 10) { speed = 10; } paddle_bottom->current_bounces = *(tabB1 + speed); paddle_bottom->set_x_coord (x); paddle_bottom->blink (); } /* team mode (on Amiga I had two mice simultaneously) */ else { } } /** * Move the bottom robot paddle */ void controller_paddles::move_robot () { if (paddle_robot->enable_counter == 0) { return; } Sint32 t = balls->get_max_of_sprites (); sprite_ball **balls_list = balls->get_sprites_list (); Sint32 pos_y = 0; sprite_ball *target_ball = NULL; for (Sint32 i = 0; i < t; i++) { sprite_ball *ball = *(balls_list++); if (!ball->is_enabled) { continue; } if (ball->direction >= 36 && ball->direction <= 60) { if (ball->y_coord > pos_y) { pos_y = ball->y_coord; target_ball = ball; } } } if (pos_y <= 0) { return; } Sint32 x_paddle = paddle_robot->x_coord; Sint32 x_ball = target_ball->x_coord + target_ball->collision_width / 2 - paddle_robot->collision_width / 2; Sint32 offset = x_paddle - x_ball; Sint32 max = 5 * resolution; if (offset > max) { offset = max; } if (offset < -max) { offset = -max; } x_paddle = x_paddle - offset; if (x_paddle < min_coordinate) { x_paddle = min_coordinate; } if (x_paddle > (Sint32)(max_coordinate - paddle_robot->collision_width)) { x_paddle = max_coordinate - paddle_robot->collision_width; } offset = paddle_robot->x_coord; paddle_robot->x_coord = x_paddle; offset = x_paddle - offset; const Sint32 **tabB1; if (offset < 0) { offset = -offset; tabB1 = paddle_robot->rebonds_Ga; } else { tabB1 = paddle_robot->rebonds_Dr; } paddle_robot->current_bounces = *(tabB1 + offset); } /** * Return a pointer to a paddle sprite from a paddle identifier number * @param id identifier number of the paddle * @return pointer to a paddle sprite */ sprite_paddle * controller_paddles::get_paddle (Uint32 id) { switch (id) { case BOTTOM_PADDLE: return paddle_bottom; case RIGHT_PADDLE: return paddle_right; case TOP_PADDLE: return paddle_top; case LEFT_PADDLE: return paddle_left; case ROBOT_PADDLE: return paddle_robot; } return NULL; } /** * Set the maximum paddles size in the bricks levels */ void controller_paddles::set_maximum_paddles_size () { if (paddle_length >= 64 * resolution) { return; } paddle_length = 64 * resolution; Sint32 x = paddle_bottom->get_x_coord (); Sint32 i = max_coordinate - paddle_length; if (x >= i) { x = i; paddle_bottom->set_x_coord (x); paddle_right->set_y_coord (x); paddle_top->set_x_coord (x); paddle_left->set_y_coord (x); } paddle_bottom->set_width (paddle_length); paddle_right->set_height (paddle_length); paddle_top->set_width (paddle_length); paddle_left->set_height (paddle_length); current_player->set_paddle_length (paddle_length); } /** * Expand the size of the paddle(s) in the bricks levels */ void controller_paddles::expand_paddles () { if (paddle_length >= (64 * resolution)) { return; } paddle_length += (8 * resolution); Sint32 x = paddle_bottom->get_x_coord (); Sint32 i = max_coordinate - paddle_length; if (x >= i) { x = i; paddle_bottom->set_x_coord (x); paddle_right->set_y_coord (x); paddle_top->set_x_coord (x); paddle_left->set_y_coord (x); } paddle_bottom->set_width (paddle_length); paddle_right->set_height (paddle_length); paddle_top->set_width (paddle_length); paddle_left->set_height (paddle_length); current_player->set_paddle_length (paddle_length); } /** * Shrink the size of the paddle(s) in the bricks levels */ void controller_paddles::shrink_paddles () { if (paddle_length <= (16 * resolution)) { return; } paddle_length -= (8 * resolution); paddle_bottom->set_width (paddle_length); paddle_right->set_height (paddle_length); paddle_top->set_width (paddle_length); paddle_left->set_height (paddle_length); current_player->set_paddle_length (paddle_length); } /** * Enable reverse movements of the paddle * @param counter value of the reverse */ void controller_paddles::set_reverse_counter (Uint32 counter) { reverse_counter = counter; } /** * Return counter value of the reverse paddle * @return counter value of the reverse */ Uint32 controller_paddles::get_reverse_counter () { return reverse_counter; } /** * Disable all paddles during the game over */ void controller_paddles::disable_all_paddles () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_paddle * paddle= sprites_list[i]; paddle->disable (); } } Sint32 controller_paddles::ballePets1[14] = { 4, 8, 12, 16, 20, 24, 28, 28, 24, 20, 16, 12, 8, 4 }; Sint32 controller_paddles::ballePets2[14] = { 20, 24, 28, 32, 36, 40, 44, 44, 40, 36, 32, 28, 24, 20 }; Sint32 controller_paddles::ballePets3[14] = { 60, 56, 52, 48, 44, 40, 36, 36, 40, 44, 48, 52, 56, 60 }; Sint32 controller_paddles::ballePets4[14] = { 12, 8, 4, 0, 60, 56, 52, 52, 56, 60, 0, 4, 8, 12 }; // table de rebonds de la balle raquette du bas const Sint32 controller_paddles::rb09[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 32, 32, 32, 32, 20, 24, 28 }; const Sint32 controller_paddles::rb10[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 32, 32, 32, 28, 20, 20, 16 }; const Sint32 controller_paddles::rb11[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 28, 28, 28, 24, 16, 16, 12 }; const Sint32 controller_paddles::rb12[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 28, 28, 24, 20, 16, 12, 8 }; const Sint32 controller_paddles::rb13[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 28, 24, 20, 16, 12, 8, 4 }; const Sint32 controller_paddles::rb14[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 20, 20, 20, 12, 8, 4, 4 }; const Sint32 controller_paddles::rb15[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 16, 16, 16, 8, 8, 4, 0 }; const Sint32 controller_paddles::rb16[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 8, 12, 12, 4, 4, 0, 0 }; const Sint32 controller_paddles::rb17[16] = { 4, 4, 8, 12, 16, 20, 24, 28, 28, 4, 8, 12, 0, 0, 0, 0 }; const Sint32 * controller_paddles::midi1_left[] = { rb13, rb14, rb14, rb15, rb15, rb16, rb16, rb16, rb16, rb16, rb17 }; const Sint32 * controller_paddles::midi1Right[] = { rb13, rb12, rb12, rb11, rb11, rb10, rb10, rb10, rb10, rb10, rb09 }; // table de rebonds de la balle raquette de droite const Sint32 controller_paddles::rb18[] = { 32 + 16, 20 + 16, 24 + 16, 28 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 32 + 16, 32 + 16, 32 + 16 }; const Sint32 controller_paddles::rb19[] = { 28 + 16, 20 + 16, 20 + 16, 16 + 16, 4 + 16, 04 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 32 + 16, 32 + 16, 32 + 16 }; const Sint32 controller_paddles::rb20[] = { 24 + 16, 16 + 16, 16 + 16, 12 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 28 + 16, 28 + 16, 28 + 16 }; const Sint32 controller_paddles::rb21[] = { 20 + 16, 16 + 16, 12 + 16, 8 + 16, 4 + 16, 04 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 28 + 16, 28 + 16, 24 + 16 }; const Sint32 controller_paddles::rb22[] = { 16 + 16, 12 + 16, 8 + 16, 4 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 28 + 16, 24 + 16, 20 + 16 }; const Sint32 controller_paddles::rb23[] = { 12 + 16, 8 + 16, 4 + 16, 4 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 20 + 16, 20 + 16, 20 + 16 }; const Sint32 controller_paddles::rb24[] = { 8 + 16, 8 + 16, 4 + 16, 0 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 16 + 16, 16 + 16, 16 + 16 }; const Sint32 controller_paddles::rb25[] = { 4 + 16, 4 + 16, 0 + 16, 0 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 8 + 16, 12 + 16, 12 + 16 }; const Sint32 controller_paddles::rb26[] = { 0 + 16, 0 + 16, 0 + 16, 0 + 16, 4 + 16, 4 + 16, 8 + 16, 12 + 16, 16 + 16, 20 + 16, 24 + 16, 28 + 16, 28 + 16, 4 + 16, 8 + 16, 12 + 16 }; const Sint32 * controller_paddles::midi2_left[] = { rb22, rb21, rb21, rb20, rb20, rb19, rb19, rb19, rb19, rb19, rb18 }; const Sint32 * controller_paddles::midi2Right[] = { rb22, rb23, rb23, rb24, rb24, rb25, rb25, rb25, rb25, rb25, rb26 }; // table de rebonds de la balle raquette du haut const Sint32 controller_paddles::rb27[] = { 60, 0, 0, 0, 0, 52, 56, 60, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb28[] = { 60, 0, 0, 0, 60, 52, 52, 48, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb29[] = { 60, 60, 60, 60, 56, 48, 48, 44, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb30[] = { 60, 60, 60, 56, 52, 48, 48, 40, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb31[] = { 60, 60, 56, 52, 48, 44, 40, 36, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb32[] = { 60, 52, 52, 48, 44, 40, 36, 36, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb33[] = { 60, 48, 48, 16 + 32, 40, 40, 32, 32, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb34[] = { 60, 40, 44, 12 + 32, 36, 36, 32, 32, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 controller_paddles::rb35[] = { 60, 36, 40, 12 + 32, 32, 32, 32, 32, 4 + 32, 4 + 32, 8 + 32, 12 + 32, 16 + 32, 20 + 32, 24 + 32, 28 + 32 }; const Sint32 * controller_paddles::midi3_left[] = { rb31, rb30, rb30, rb29, rb29, rb28, rb28, rb28, rb28, rb28, rb27 }; const Sint32 * controller_paddles::midi3Right[] = { rb31, rb32, rb32, rb33, rb33, rb34, rb34, rb34, rb34, rb34, rb35 }; // table de rebonds de la balle raquette de gauche const Sint32 controller_paddles::rb36[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 32 - 16, 32 - 16, 32 - 16, 32 - 16, 20 - 16, 24 - 16, 28 - 16, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb37[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 32 - 16, 32 - 16, 32 - 16, 28 - 16, 20 - 16, 20 - 16, 16 - 16, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb38[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 28 - 16, 28 - 16, 28 - 16, 24 - 16, 16 - 16, 16 - 16, 12 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb39[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 28 - 16, 28 - 16, 24 - 16, 20 - 16, 16 - 16, 12 + 48, 8 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb40[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 28 - 16, 24 - 16, 20 - 16, 16 - 16, 12 + 48, 8 + 48, 4 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb41[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 20 - 16, 20 - 16, 20 - 16, 12 + 48, 8 + 48, 4 + 48, 4 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb42[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 16 - 16, 16 - 16, 16 - 16, 8 + 48, 8 + 48, 4 + 48, 0 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb43[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 8 + 48, 12 + 48, 12 + 48, 4 + 48, 4 + 48, 0 + 48, 0 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 controller_paddles::rb44[] = { 16 - 16, 20 - 16, 24 - 16, 28 - 16, 28 - 16, 4 + 48, 8 + 48, 12 + 48, 0 + 48, 0 + 48, 0 + 48, 0 + 48, 4 + 48, 4 + 48, 8 + 48, 12 + 48 }; const Sint32 * controller_paddles::midi4_left[] = { rb40, rb41, rb41, rb42, rb42, rb43, rb43, rb43, rb43, rb43, rb44 }; const Sint32 * controller_paddles::midi4Right[] = { rb40, rb39, rb39, rb38, rb38, rb37, rb37, rb37, rb37, rb37, rb36 }; tecnoballz-0.93.1/src/tecnoballz.cc0000664000175000017500000002305212412501752016233 0ustar brunobruno/** * @file tecnoballz.cc * @brief Base of all classes, and main static methods of the game * @created 2002-08-18 * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 23 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: tecnoballz.cc 23 2014-08-16 20:13:07Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/tecnoballz.h" #include "../include/handler_display.h" #include "../include/handler_keyboard.h" #include "../include/list_sprites.h" #include "../include/handler_players.h" #include "../include/supervisor_bricks_level.h" #include "../include/supervisor_shop.h" #include "../include/supervisor_guards_level.h" #include "../include/supervisor_main_menu.h" #include "../include/bitmap_data.h" #include "../include/handler_audio.h" #include "../include/handler_levels.h" #include "../include/handler_resources.h" #include "../include/handler_high_score.h" #include "../include/supervisor_map_editor.h" /** * Once initialization, create persistent objects */ void tecnoballz::first_init (configfile * pConf) { config_file = pConf; if (is_verbose) { std::cout << ">tecnoballz::first_init() start!" << std::endl; std::cout << " has_background:" << has_background << std::endl; } #if __WORDSIZE == 64 random_counter = (long) first_init; #else random_counter = (Sint32) first_init; #endif resources = handler_resources::get_instance (); high_score = handler_high_score::get_instance (); resources->load_sinus (); display = new handler_display (); display->initialize (); #ifndef SOUNDISOFF audio = handler_audio::get_instance (); #endif keyboard = handler_keyboard::get_instance (); sprites = new list_sprites (); sprites->init (400); ptLev_data = new handler_levels (); current_player = handler_players::create_all_players (handler_players::MAX_OF_PLAYERS); sprite_ball::init_collisions_points (); /* retrieve player names */ for (Uint32 i = 0; i < handler_players::MAX_OF_PLAYERS; i++) { handler_players::players_list[i]->set_name (pConf->get_player_name (i)); } current_phase = MAIN_MENU; if (arg_jumper > 0) { #ifdef UNDER_DEVELOPMENT is_enabled_cheat_mode = true; #endif current_phase = arg_jumper; } if (is_verbose) { std::cout << ">tecnoballz::first_init() end!" << std::endl; } } /** * main loop of the game */ void tecnoballz::game_begin () { supervisor *stage = NULL; do { if (is_verbose) { std::cout << ">tecnoballz::game_begin() phase:" << current_phase << std::endl; } switch (current_phase) { case LEAVE_TECNOBALLZ: is_exit_game = true; break; case BRICKS_LEVEL: stage = new supervisor_bricks_level (); break; case SHOP: stage = new supervisor_shop (); break; case GUARDS_LEVEL: stage = new supervisor_guards_level (); break; case MAIN_MENU: stage = new supervisor_main_menu (); break; case MAP_EDITOR: stage = new supervisor_map_editor (); break; default: std::cerr << "(!)tecnoballz::game_begin() phase number " << current_phase << "is invalid!" << std::endl; throw std::runtime_error ("(!)tecnoballz::game_begin() " "invalid phase number!"); } if (NULL != stage) { stage->first_init (); Uint32 next = 0; do { next = stage->main_loop (); } while (!next); current_phase = next; delete stage; stage = NULL; } } while (!is_exit_game); } /** * Game exit, relase all objects */ void tecnoballz::release_all_objects (configfile * pConf) { /* save player names into config file */ for (Uint32 i = 0; i < handler_players::MAX_OF_PLAYERS; i++) { pConf->set_player_name (i, handler_players::players_list[i]->get_name ()); } if (is_verbose) { std::cout << "(X) 1. release all player objects " << std::endl; } handler_players::release_all_players (); if (is_verbose) { std::cout << "(x) 2. delete 'handler_levels' singleton" << std::endl; } delete ptLev_data; if (is_verbose) { std::cout << "(x) 3. delete 'list_sprites' singleton" << std::endl; } delete sprites; if (is_verbose) { std::cout << "(x) 4. delete 'hanbdler_keyboard' singleton" << std::endl; } delete keyboard; if (is_verbose) { std:: cout << "(x) 5. delete 'handler_high_score' singleton" << std::endl; } delete high_score; #ifndef SOUNDISOFF if (is_verbose) { std::cout << "(x) 7. delete 'handler_audio' singleton" << std::endl; } delete audio; #endif if (is_verbose) { std::cout << "(x) 6. delete 'handler_display' singleton" << std::endl; } delete display; if (is_verbose) { std::cout << "(x) 8. delete 'handler_resources'" << std::endl; } delete resources; } /** * Create the object */ tecnoballz::tecnoballz () { } /** * Release object */ tecnoballz::~tecnoballz () { } /** * Initialize some members */ void tecnoballz::object_init () { object_num = objects_counter; objects_counter++; } /** * Object destroyed */ void tecnoballz::object_free () { objects_counter--; } /** * Creates a string representing an integer number * @param value the integer value to be converted * @param padding length of the string * @param str the string representation of the number */ void tecnoballz::integer_to_ascii (Sint32 value, Uint32 padding, char *str) { char *ptr = str + padding - 1; bool neg = (value < 0); if (neg) { value = -value; --padding; } do { *ptr-- = (value % 10) + '0'; value /= 10; --padding; } while (value && padding > 0); for (; padding > 0; --padding) { *ptr-- = '0'; } if (neg) { *ptr-- = '-'; } } //------------------------------------------------------------------------------ // convert integer into ASCII string // input => value: number to convert // => strng: pointer to ASCII string (finished by zero) // => reste: maximum length (1 = 2 chars, 2 = 3 chars, ...) //------------------------------------------------------------------------------ /* void tecnoballz::intToASCII (Sint32 value, char *strng, Uint32 reste) { Uint32 index = 0; Uint32 zsize = 1; if (value < 0) { value = -value; *(strng++) = '-'; if (reste > 0) reste--; } for (index = 0; index < reste; index++) zsize = zsize * 10; index = 0; while (zsize > 0) { Uint32 reste = value / zsize; char zchar = (char) ('0' + reste); if (zchar > '9' || zchar < '0') zchar = '?'; strng[index++] = zchar; value = value - (zsize * reste); zsize = zsize / 10; } } */ void tecnoballz::int_to_big_endian (Uint32 * ptsrc, Uint32 * ptdes) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN *ptdes = *ptsrc; #else char *s = (char *) ptsrc; char *d = (char *) ptdes; d[0] = s[3]; d[1] = s[2]; d[2] = s[1]; d[3] = s[0]; #endif } void tecnoballz::big_endian_to_int (Uint32 * ptsrc, Uint32 * ptdes) { #if SDL_BYTEORDER == SDL_BIG_ENDIAN *ptdes = *ptsrc; #else char *s = (char *) ptsrc; char *d = (char *) ptdes; d[3] = s[0]; d[2] = s[1]; d[1] = s[2]; d[0] = s[3]; #endif } Sint32 tecnoballz::arg_jumper = -1; bool tecnoballz::force_4_colors_tiles = false; bool tecnoballz::is_verbose = false; Uint32 tecnoballz::objects_counter = 0; Sint32 tecnoballz::random_counter = 0; Uint32 tecnoballz::frame_counter = 0; handler_high_score * tecnoballz::high_score = NULL; handler_resources * tecnoballz::resources = NULL; handler_levels * tecnoballz::ptLev_data = NULL; #ifndef SOUNDISOFF handler_audio * tecnoballz::audio = NULL; #endif handler_display * tecnoballz::display = NULL; handler_keyboard * tecnoballz::keyboard = NULL; list_sprites * tecnoballz::sprites = NULL; handler_players * tecnoballz::current_player = NULL; Sint16 * tecnoballz::table_cosL = NULL; Sint16 * tecnoballz::table_sinL = NULL; Uint32 tecnoballz::current_phase = BRICKS_LEVEL; bool tecnoballz::is_exit_game = false; bitmap_data * tecnoballz::sprites_bitmap = NULL; bool tecnoballz::is_enabled_cheat_mode = false; bool tecnoballz::birth_flag = 0; Sint32 tecnoballz::difficulty_level = DIFFICULTY_EASY; Sint32 tecnoballz::initial_num_of_lifes = 8; Sint32 tecnoballz::number_of_players = 1; const char tecnoballz::nomprefix[] = PREFIX; Uint32 tecnoballz::resolution = 2; bool tecnoballz::has_background = false; bool tecnoballz::absolute_mouse_positioning = false; offscreen_surface * tecnoballz::game_screen = NULL; offscreen_surface * tecnoballz::background_screen = NULL; configfile * tecnoballz::config_file; tecnoballz-0.93.1/src/supervisor_bricks_level.cc0000664000175000017500000004222212412501752021043 0ustar brunobruno/** * @file supervisor_bricks_level.cc * @brief Bricks levels supervisor * @date 2012-09-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_bricks_level.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/supervisor_bricks_level.h" #include "../include/handler_resources.h" /** * Create the bricks level supervisor */ supervisor_bricks_level::supervisor_bricks_level () { initialize (); sides_bricks = controller_sides_bricks::get_instance (); tiles_ground = tiles_background::get_instance (); panel_score = right_panel_score::get_instance (); ejectors_corners = controller_ejectors::get_instance (); money_capsules = controller_moneys::get_instance (); power_up_capsules = controller_capsules::get_instance (); gem_stones = controller_gems::get_instance (); bricks = controller_bricks::get_instance (); head_anim = head_animation::get_instance (); ships = controller_ships::get_instance (); magnetic_eyes = controller_magnetic_eyes::get_instance (); bottom_wall = sprite_wall::get_instance (); info_messages = short_info_messages::get_instance (); balls = controller_balls::get_instance (); viewfinders_paddles = controller_viewfinders::get_instance (); paddles = controller_paddles::get_instance (); font_game = controller_font_game::get_instance (); gigablitz = controller_gigablitz::get_instance (); player_indicators = controller_indicators::get_instance (); game_over = controller_game_over::get_instance (); popup_menu = new handler_popup_menu (); sprite_projectile::start_list (); level_number = 1; area_number = 1; gameover_counter = 0; #ifdef UNDER_DEVELOPMENT backgound_index = 0; devel_keyw = false; devel_keyx = false; #endif } /** * Release the bricks level supervisor */ supervisor_bricks_level::~supervisor_bricks_level () { delete popup_menu; delete game_over; delete player_indicators; delete gigablitz; delete font_game; delete paddles; delete viewfinders_paddles; delete balls; delete info_messages; delete bottom_wall; delete magnetic_eyes; delete ships; delete head_anim; delete bricks; delete gem_stones; delete power_up_capsules; delete money_capsules; delete ejectors_corners; delete panel_score; delete tiles_ground; delete sides_bricks; release (); } /** * Initialization of a bricks level */ void supervisor_bricks_level::first_init () { game_screen->clear (); sprites->reset (); area_number = current_player->get_area_number (); level_number = current_player->get_level_number (); #ifndef SOUNDISOFF audio->play_level_music (area_number, level_number); audio->enable_sound (); #endif count_next = 0; next_phase = 0; gameover_counter = 0; if (is_verbose) { std::cout << "supervisor_bricks_level::first_init() area_number:" << area_number << "level_number:" << level_number << " difficulty_level:" << difficulty_level << std::endl; } /* generation of paddles graphics shapes tables */ paddles->create_paddles_sprites (); /* generation of gigablitz graphics shapes tables */ gigablitz->create_gigablitz_sprites (); /* load bitmap of sprites in memory (all other sprites) */ resources->load_sprites_bitmap (); /* * generate the data of the spites */ bottom_wall->create_sprite (sprite_object::BOTTOM_WALL, sprites_bitmap, 0); sprites->add (bottom_wall); bottom_wall->set_coordinates (32 * resolution, 232 * resolution); paddles->initialize_robot (); sides_bricks->initialize (); ejectors_corners->create_ejectors_sprites (); initialize_background (); bricks->add_to_sprites_list (); game_over->create_sprites_list (); balls->create_sprites_list (); ships->create_sprites_list (); magnetic_eyes->create_eyes_list (); money_capsules->create_sprites_list (); power_up_capsules->create_sprites_list (6); gem_stones->create_sprites_list (); font_game->create_sprites_list (); paddles->create_projectiles_list (); player_indicators->create_indicators_sprites (); viewfinders_paddles->create_sprites_list (); popup_menu->first_init (sprites_bitmap); resources->release_sprites_bitmap (); panel_score->first_init (); display->lock_surfaces (); /* initialize controller of the big letters animated composing the word * "game over" */ game_over->first_init (); head_anim->load_bitmap (); init_level (); /* draw ejectors and side walls */ paddles->init_paddles (gigablitz, balls); /* balls initialization */ balls->init ( /* time before the ball leaves paddle, at the level beginning */ level_desc->ball_release_time, /* time before the ball leaves (glue option) */ level_desc->glue_time / difficulty_level, /* time before the ball accelerates */ level_desc->acceleration_delay / difficulty_level, /* time before "tilt" is available */ level_desc->tilt_delay, level_desc->starting_speed); ships->initialise (level_desc->reappearance / difficulty_level, level_desc->ship_appearance_delay1 / difficulty_level, level_desc->ship_appearance_delay2 / difficulty_level, level_desc->ship_appearance_delay3 / difficulty_level, level_desc->ship_appearance_delay4 / difficulty_level, level_desc->ships_strength * difficulty_level); money_capsules->initialize (level_desc->moneys_frequency * difficulty_level, panel_score, player_indicators); /* initialize the object which handles bonus and penalty capsules */ power_up_capsules->initialize (level_desc->penalties_frequency * difficulty_level, level_desc->malusListe); gem_stones->initialize (); /* initialize sprite fonts "LEVEL x COMPLETED" */ font_game->initialize (level_number); viewfinders_paddles->initialize (); display->unlock_surfaces (); /* copy the background offscreen to the game offscreen */ if (has_background) { background_screen->blit_to_surface (game_screen); } keyboard->clear_command_keys (); keyboard->set_grab_input (true); info_messages->send_message_request (short_info_messages::ARE_YOU_READY); } /** * Reads the parameters of the current level */ void supervisor_bricks_level::init_level () { level_desc = ptLev_data->get_bricks_levels_params (area_number, level_number); } /** * Main loop in the bricks level * @return */ Uint32 supervisor_bricks_level::main_loop () { Sint32 Ecode = -1; /* * the player has no more lives: Game Over */ if (current_player->get_num_of_lifes () <= 0) { if (gameover_counter == 0) { #ifndef SOUNDISOFF audio->disable_sound (); audio->stop_music (); #endif paddles->disable_all_paddles (); bricks->clr_bricks (); font_game->disable_sprites (); gem_stones->disable_sprites (); power_up_capsules->disable_sprites (); money_capsules->disable_sprites (); balls->disable_sprites (); sprite_projectile::disable_sprites (); info_messages->clear_messages_request (); tiles_ground-> set_scroll_type (tiles_background::TILES_SCROLL_GAMEOVER); gameover_counter++; } if (has_background) { info_messages->run (); } display->wait_frame (); head_anim->play (); display->lock_surfaces (); gigablitz->run_in_bricks_levels (); if (has_background) { sprites->clear (); } if (!(random_counter & 0x00f)) { head_anim->start_interference (); } sides_bricks->run (); viewfinders_paddles->run (); ships->move (); draw_tilesmap (); sprites->draw (); if (gameover_counter >= 2) { gameover_counter++; game_over->run (); } if (!bricks->update () && gameover_counter < 2) { gameover_counter = 2; } panel_score->draw_gigablizt_gauge (); player_indicators->display_money_and_reverse (); display->unlock_surfaces (); panel_score->text_refresh (); display->window_update (); if (keyboard->wait_key () && gameover_counter > 60) { current_player = handler_players::get_next_player (current_player, &next_phase, 1); } } /* * game is running! */ else { display->wait_frame (); if (!keyboard->command_is_pressed (handler_keyboard::COMMAND_KEY_PAUSE)) { head_anim->play (); } sides_bricks->run (); display->lock_surfaces (); if (has_background) { sprites->clear (); } bricks->color_cycling (); /* draw or clear bricks * send a money and/or a capsule */ bricks->update (); switch_background (); if (!keyboard->command_is_pressed (handler_keyboard::COMMAND_KEY_PAUSE)) { if (has_background) { info_messages->run (); } gigablitz->run_in_bricks_levels (); /* handle the "less bricks" option */ bricks->less_bricks (); paddles->move_paddles (); if (panel_score->get_bricks_counter () > 0) { paddles->check_if_release_balls (); paddles->fire_projectiles (); } paddles->move_robot (); balls->run_in_bricks_levels (); viewfinders_paddles->run (); sprite_projectile::gestionTir (); ships->move (); magnetic_eyes->move (); money_capsules->move (); power_up_capsules->move_in_bricks_level (); power_up_capsules->check_cheat_keys (); gem_stones->move (); font_game->move (); if (bottom_wall->thecounter < 1) { bottom_wall->disable (); } else { bottom_wall->thecounter--; } panel_score->draw_gigablizt_gauge (); player_indicators->display_money_and_reverse (); } draw_tilesmap (); sprites->draw (); Ecode = popup_menu->run (); display->unlock_surfaces (); panel_score->text_refresh (); display->window_update (); /* * jump to next level or next player */ if (panel_score->get_bricks_counter () == 0) { if (count_next > 0) { count_next++; bool music_finished = false; if (count_next > 350) { music_finished = true; #ifndef SOUNDISOFF music_finished = audio->is_win_music_finished (); #endif } if (count_next > 20000000 || keyboard->wait_key () || music_finished) { sides_bricks->save_state_of_walls (); current_player = handler_players::get_next_player (current_player, &next_phase); #ifndef SOUNDISOFF audio->stop_music (); #endif } balls->disable_sprites (); sprite_projectile::disable_sprites (); } else { font_game->enable (); sprite_projectile::disable_sprites (); balls->disable_sprites (); #ifndef SOUNDISOFF audio->play_win_music (); #endif info_messages-> send_message_request (short_info_messages::NEXT_LEVEL); #ifndef SOUNDISOFF audio->disable_sound (); #endif tiles_ground-> set_scroll_type (tiles_background::TILES_SCROLL_WIN); count_next = 1; } } } /* escape key to quit the game! */ if (keyboard->command_is_pressed (handler_keyboard::QUIT_TECNOBALLZ) || Ecode == handler_popup_menu::QUIT_TECNOBALLZ) { next_phase = LEAVE_TECNOBALLZ; } if (keyboard->command_is_pressed (handler_keyboard::CAUSE_GAME_OVER) || Ecode == handler_popup_menu::CAUSE_GAME_OVER) { current_player->remove_all_lifes (); } if (keyboard->command_is_pressed (handler_keyboard::QUIT_TO_MAIN_MENU) || Ecode == handler_popup_menu::QUIT_TO_MAIN_MENU) { next_phase = MAIN_MENU; } /* control position music's module */ #ifndef SOUNDISOFF Uint32 phase = audio->get_portion_music_played (); if (phase == handler_audio::LOST_PORTION && phase != audio->get_portion_music_played ()) { info_messages-> send_message_request (short_info_messages::YEAH_YOU_WHERE); paddles->release_all_balls (); } #endif return next_phase; } /** * Change the tiles background */ void supervisor_bricks_level::switch_background () { #ifdef UNDER_DEVELOPMENT if (keyboard->key_is_pressed (SDLK_RSHIFT) || keyboard->key_is_pressed (SDLK_LSHIFT) || keyboard->key_is_pressed (SDLK_RCTRL) || keyboard->key_is_pressed (SDLK_LCTRL) || keyboard->key_is_pressed (SDLK_RALT) || !keyboard->key_is_pressed (SDLK_LALT)) { return; } if (keyboard->key_is_pressed (SDLK_w)) { devel_keyw = true; } if (keyboard->key_is_pressed (SDLK_x)) { devel_keyx = true; } if ((keyboard->key_is_released (SDLK_w) && devel_keyw) || (keyboard->key_is_released (SDLK_x) && devel_keyx)) { game_screen->clear (); if (devel_keyw) { devel_keyw = false; if (--backgound_index < 0) { backgound_index = 49; } } if (devel_keyx) { devel_keyx = false; if (++backgound_index > 49) { backgound_index = 0; } } if (is_verbose) { std::cout << ">supervisor_bricks_level::switch_background: " << "backgound_index: " << backgound_index << std::endl; } initialize_background (backgound_index); background_screen->blit_to_surface (game_screen); } if (keyboard->key_is_pressed (SDLK_v)) { head_anim->start_yawn (); } if (keyboard->key_is_pressed (SDLK_b)) { head_anim->start_yawn (); } if (keyboard->key_is_pressed (SDLK_n)) { head_anim->start_interference (); } if (keyboard->key_is_pressed (SDLK_g)) { gigablitz->shoot_paddle (); } /* if(keyboard->key_is_pressed(SDLK_w)) { } if(keyboard->key_is_pressed(SDLK_w)) { keyw = 1; } if(keyboard->key_is_released(SDLK_w) && keyw == 1) { tiles_ground->prev_color(); keyw = 0; } if(keyboard->key_is_released(SDLK_x) && keyx == 1) { tiles_ground->next_color(); keyx = 0; } */ #endif } /** * Initialize the background, draw tiles side bricks and bicks * @param bkg_num tileset number, if negative then the * tilesset number depends on the current level number */ void supervisor_bricks_level::initialize_background (Sint32 bkg_num) { if (is_verbose) { std::cout << ">supervisor_bricks_level::initialize_background() start! " << std::endl; } if (bkg_num < 0) { bkg_num = ((area_number - 1) * 10) + level_number; if (level_number > 5) { bkg_num--; } if (is_verbose) { std::cout << "supervisor_bricks_level::initialize_background() " << "background number: " << bkg_num << std::endl; } } /* initialize and draw the tiles background */ tiles_ground->setup (bkg_num); /* short info messages displayed */ info_messages->initialize (); /* draw shadows of ejectors */ ejectors_corners->draw_shadow (); /* save background under small bricks */ sides_bricks->save_background (); /* draw shadows of small bricks */ sides_bricks->draw_shadows_to_brackground (); /* draw small bricks of the three walls */ sides_bricks->draw_to_brackground (); ejectors_corners->draw (); /* initialize the bricks level */ bricks->first_init (); bricks->initialize (); if (is_verbose) { std::cout << "/supervisor_bricks_level::initialize_background() start! " << std::endl; } } /** * Draw the tiles background */ void supervisor_bricks_level::draw_tilesmap () { if (has_background) { return; } display->unlock_surfaces (); tiles_ground->draw (); info_messages->run (); display->lock_surfaces (); } tecnoballz-0.93.1/src/sprite_capsule.cc0000664000175000017500000002270112412501752017120 0ustar brunobruno/** * @file sprite_capsule.cc * @brief The capsule sprite which contains a bonus or a penalty * @date 2012-10-07 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_capsule.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_capsule.h" /** * Create a caspsule sprite */ sprite_capsule::sprite_capsule () { clear_sprite_members (); towards = 0; capsule_identifier = 0; paddle = NULL; current_cycling = &sprite_object::cycling_01[0]; } /** * Release a caspsule */ sprite_capsule::~sprite_capsule () { } /** * Perform some initializations */ void sprite_capsule::init_members () { right_panel_score* panel_score = right_panel_score::get_instance (); init_coords_max_min (panel_score->get_width()); /* speed of the animation */ frame_period = 6; /* time delay before each image */ frame_delay = 1; set_draw_method (sprite_object::DRAW_CAPSULE); } /** * Initialize a new indicator capsule (life or reserver) * @param brick a pointer to the brick which touched by a ball * @param id capsule identifier */ void sprite_capsule::enable_indicator_capsule (Uint32 id) { set_new_capsule (id, &gagdetBrik[0], 0, 0, NULL); } /** * Initialize a new bonus or penalty capsule from a brick * @param brick a pointer to the brick which touched by a ball * @param id capsule identifier */ void sprite_capsule::enable_capsule (brick_redraw * brick, Uint32 id) { set_new_capsule (id, &gagdetBrik[0], brick->xcoord_collision, brick->ycoord_collision, brick->paddle); } /** * Initialize a new bonus or penalty capsule from a ball * @param ball a pointer to the ball sprite which destroyed * the enemy ship * @param id capsule identifier */ void sprite_capsule::enable_capsule (sprite_ball * ball, Uint32 id) { set_new_capsule (id, &gagdetBrik[0], ball->get_x_coord (), ball->get_y_coord (), ball->get_last_paddle_touched ()); } /** * Initialize a new bonus or penalty capsule from a projectile * @param blast a pointer to the projectile sprite which * destroyed the enemy ship * @param id capsule identifier */ void sprite_capsule::enable_capsule (sprite_projectile * blast, Uint32 id) { set_new_capsule (id, &gagdetBrik[0], blast->get_x_coord (), blast->get_y_coord (), blast->paddle); } /** * Initialize a new bonus or penalty capsule from a ball * @param ball a pointer to the ball sprite which touched the guardian * @param id capsule identifier */ void sprite_capsule::enable_guardian_capsule (sprite_ball * ball, Uint32 id) { set_new_capsule (id, &gagdetGuar[0], ball->get_x_coord (), ball->get_y_coord (), ball->get_last_paddle_touched ()); } /** * Set a new bonus or penalty capsule * @param id capsule identifier * @param frames frames index list * @param xcoord x-coordinate of the capsule * @param ycoord y-coordinate of the capsule * @param pad a pointer to a sprite capsule */ void sprite_capsule::set_new_capsule (Uint32 id, const Sint16 *frames, Uint32 xcoord, Uint32 ycoord, sprite_paddle *pad) { if (ENABLE_HUGELY_OPTIONS == id || CHANCE == id) { set_draw_method (sprite_object::DRAW_CAPSULE); } else { set_draw_method (sprite_object::DRAW_WITH_TABLES); } capsule_identifier = id; x_coord = xcoord; y_coord = ycoord; paddle = pad; if (NULL != paddle) { towards = paddle->get_paddle_number (); } else { towards = 0; } id = id >> 1; random_counter += id; Sint32 index = frames[id]; if (index < 0) { std::cerr << "sprite_capsule::set_new_capsule() " << "index " << "is not used!" << std::endl; return; } enable_capsule (index); } /** * Set a new capsule in the shop * @param id capsule indentifier */ void sprite_capsule::set_in_shop (Uint32 id) { if (capsule_identifier == id) { return; } capsule_identifier = id; id = id >> 1; random_counter += id; Sint32 i = gagdetBrik[id]; if (i == NO_IMAGE) // empty code, no gaget code ? { is_enabled = false; } else { enable_capsule (i); } } void sprite_capsule::enable_capsule (Uint32 index) { is_enabled = true; frame_index_min = index; frame_index = index; index += NUM_OF_IMAGES - 1; frame_index_max = index; set_image (frame_index); } /** * Clone this capsule from another * @param capsule capsule source */ void sprite_capsule::clone_from_capsule (sprite_capsule * capsule) { capsule_identifier = capsule->capsule_identifier; frame_index_min = capsule->frame_index_min; frame_index = capsule->frame_index; frame_index_max = capsule->frame_index_max; set_image (frame_index); } /** * Return the identifier of the capsule * @return identifier of the capsule */ Uint32 sprite_capsule::get_id () { return capsule_identifier; } /** * Displacement and collision of the capsule * @return the pointer on the paddle object which * was touched by the capsule or NULL if no collision */ sprite_paddle * sprite_capsule::move () { if (!is_enabled) { return NULL; } switch (towards) { case controller_paddles::BOTTOM_PADDLE: y_coord += resolution; if (y_coord < y_maximum) { if (collision (paddle)) { is_enabled = false; current_player->add_score (20); return paddle; } } else { is_enabled = false; } break; case controller_paddles::RIGHT_PADDLE: x_coord += resolution; if (x_coord < x_maximum) { if (collision (paddle)) { is_enabled = false; current_player->add_score (20); return paddle; } } else { is_enabled = false; } break; case controller_paddles::TOP_PADDLE: y_coord -= resolution; if (y_coord > y_minimum) { if (collision (paddle)) { is_enabled = false; current_player->add_score (20); return paddle; } } else { is_enabled = false; } break; /* left paddle */ case controller_paddles::LEFT_PADDLE: x_coord -= resolution; if (x_coord > x_minimum) { if (collision (paddle)) { is_enabled = false; current_player->add_score (20); return paddle; } } else { is_enabled = false; } break; } return NULL; } /** * Pointer on the images of the animation of capsules * used in the bricks level */ const Sint16 sprite_capsule::gagdetBrik[] = { /* unused */ NO_IMAGE, IMAGE_GLUE, /* unused */ NO_IMAGE, IMAGE_FIRE_POWER_1, IMAGE_FIRE_POWER_2, IMAGE_SHRINK_PADDLE, IMAGE_EXPAND_PADDLE, IMAGE_LOSE_A_LIFE, IMAGE_EXTRA_LIFE, IMAGE_EXTRA_BALLS, IMAGE_MULTI_BALLS, IMAGE_POWER_BALL_1, IMAGE_POWER_BALL_2, IMAGE_INVERSE_CONTROL, /* rebuild wall (used in ship only) */ NO_IMAGE, /* increase the speed of the balls to the maximum * not capsule */ NO_IMAGE, /* enable paddle 1 (not capsule) */ NO_IMAGE, /* enable paddle 2 (not capsule) */ NO_IMAGE, /* enable paddle 3 (not capsule) */ NO_IMAGE, /* enable paddle 4 (not capsule) */ NO_IMAGE, IMAGE_BALL_SIZE_2, IMAGE_BALL_SIZE_3, IMAGE_CHANCE, IMAGE_ENABLE_HUGELY_OPTIONS, /* set the price to 1 (not capsule) */ NO_IMAGE, IMAGE_BOTTOM_WALL, IMAGE_ROBOT_PADDLE, IMAGE_BALLS_CONTROL, /* enable the magnetic eye (not capsule) */ NO_IMAGE, /* less-bricks option (used in ship only) */ NO_IMAGE, /* informations (used in ship only) */ NO_IMAGE, /* shop exit (used in ship only) */ NO_IMAGE }; /** * Pointer on the images of the animation of capsules * used in the guards level */ const Sint16 sprite_capsule::gagdetGuar[] = { /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, IMAGE_PADDLE_INVINCIBILITY, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ IMAGE_EXTRA_LIFE, /* unused */ NO_IMAGE, IMAGE_MULTI_BALLS, IMAGE_BALL_SIZE_2, IMAGE_BALL_SIZE_3, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE, /* unused */ NO_IMAGE }; tecnoballz-0.93.1/src/controller_bricks.cc0000664000175000017500000005706412412501752017630 0ustar brunobruno/** * @file controller_bricks.cc * @brief Control the bricks in bricks levels * @created 1996-11-13 * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 23 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_bricks.cc 23 2014-08-16 20:13:07Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_bricks.h" #include "../include/handler_resources.h" #include "../include/handler_display.h" /** * create the bricks controller */ controller_bricks::controller_bricks () { littleInit (); if (!has_background) { max_of_sprites = MAX_OF_BRICKS_HORIZONTALLY * MAX_OF_BRICKS_VERTICALLY; } else { max_of_sprites = 0; } sprites_have_shades = true; sprite_type_id = sprite_object::BRICKS; bricks_redraw = (brick_redraw *) NULL; background_under_bricks = (char *) NULL; bricks_map = (brick_info *) NULL; bitmap_bricks = (bitmap_data *) NULL; briqueSave = 0; brique_clr = 0; less_bricks_count = 0; less_bricks_delay = 10; bricks_height = 112 * resolution; bricks_width = 63 * resolution; brick_width = BRICK_WIDTH * resolution; brick_height = BRICK_HEIGHT * resolution; brick_size = brick_width * brick_height; brkyoffset = BRKYOFFSET * resolution; indestructible_offset = 8 * brick_height * bricks_height; shadow_offset = 3 * resolution; shadow_left = (BRICK_HEIGHT * resolution) - shadow_offset; shadow_yoff = (BRKYOFFSET - BRICK_HEIGHT) * resolution; shadow_top1 = shadow_offset - shadow_yoff; cycling_count = 0; is_cycling = true; were_sprites_added = false; } /** * Release the bricks controller */ controller_bricks::~controller_bricks () { if (bricks_redraw != NULL) { delete[]bricks_redraw; bricks_redraw = NULL; } if (bricks_map != NULL) { delete[]bricks_map; bricks_map = NULL; } if (background_under_bricks != NULL) { delete[]background_under_bricks; background_under_bricks = NULL; } if (bitmap_bricks != NULL) { delete bitmap_bricks; bitmap_bricks = NULL; } release_sprites_list (); } /** * First initialization */ void controller_bricks::first_init () { /* allocate memory for the redraw bricks table */ if (NULL == bricks_redraw) { bricks_redraw = new brick_redraw[MAXBRIKCLR]; } /* allocate memory to save background under bricks */ if (NULL == background_under_bricks) { background_under_bricks = new char[brick_size * MAX_OF_BRICKS]; } /* allocate memory for current brick level */ if (NULL == bricks_map) { bricks_map = new brick_info[MAX_OF_BRICKS]; brick_info *map = bricks_map; for (Uint32 i = 0; i < MAX_OF_BRICKS; i++) { map->source_offset = 0; map++; } } } /** * Initialize new level and draw bricks */ void controller_bricks::initialize () { if (is_verbose) { std::cout << ">controller_bricks::initialize() start!" << std::endl; } if (!has_background) { alloc_sprites_list (); } if (NULL == bitmap_bricks) { less_bricks_count = current_player->get_less_bricks (); current_player->set_less_bricks (0); /* clear the restore list */ briqueSave = 0; brique_clr = 0; brick_redraw *redraw = bricks_redraw; for (Uint32 j = 0; j < MAXBRIKCLR; j++, redraw++) { redraw->is_indestructible = false; redraw->is_gigablitz_destroyed = false; redraw->xcoord_collision = 0; redraw->ycoord_collision = 0; redraw->paddle = (sprite_paddle *) NULL; redraw->number = 0; redraw->is_background = false; redraw->pixel_offset = 0; redraw->brick_map = (brick_info *) NULL; } /* initialize current brick level */ brick_info *map = bricks_map; Sint32 c = 0; Uint32 color = 239; for (Uint32 j = 0; j < MAX_OF_BRICKS_VERTICALLY * brkyoffset; j += brkyoffset) { for (Uint32 i = 0; i < MAX_OF_BRICKS_HORIZONTALLY * brick_width; i += brick_width) { map->source_offset = 0; map->is_displayed = false; map->pixel_offset = game_screen->get_offset (i, j); map->sprite = NULL; map->h_pos = 0; map->v_pos = 0; map->number = c++; map->color = color; map++; } if (++color > 255) { color = 239; } } /* * Select one of 10 sets of bricks */ /* load the 10 sets of bricks */ bitmap_data *bmp_bricks = new bitmap_data (); bmp_bricks->load (handler_resources::BITMAP_BRICKS); Sint32 i = random_counter & 0x0F; if (i >= 10) { i = i - 10; } Sint32 bposy = 0; Sint32 bposx = 0; if (i >= 5) { bposy = 63 * resolution; i = i - 5; } bposx = i * 112 * resolution; //bposx = 0 * 112 * resolution; //test only //bposy = 0 * 63 * resolution; //test only if (is_verbose) { std::cout << "**** controller_bricks::initialize() " << "bposx: " << bposx << " bposy: " << bposy << std::endl; } bitmap_bricks = bmp_bricks->cut_to_surface (bposx, bposy, bricks_height, bricks_width); delete bmp_bricks; /* replace color 0 by color 29 for color cycling */ char *pixels = bitmap_bricks->get_pixel_data (); Uint32 count = bitmap_bricks->get_height () * bitmap_bricks->get_width (); for (Uint32 i = 0; i < count; i++, pixels++) { if (*pixels == 0) { *pixels = 29; } } /* load one bricks level from the file "tableau.data" */ Uint32 area_num = current_player->get_area_number (); Uint32 level_num = current_player->get_level_number (); load_level (area_num, level_num); /* read somes values for the graphic routine */ offsSource = bitmap_bricks->get_line_modulo (brick_width); offsDestin = game_screen->get_line_modulo (brick_width); adr_source = (Sint32 *) bitmap_bricks->get_pixel_data (); adr_desti1 = (Sint32 *) game_screen->get_pixel_data (); adr_desti2 = (Sint32 *) background_screen->get_pixel_data (); set_bricks_palette (); } /* save background under bricks */ save_background (); draw_bricks_shadows (); draw_bricks (); } /** * Return the number of bricks in the current level * @return number of bricks */ Uint32 controller_bricks::get_num_of_bricks () { return num_of_bricks; } /** * Load and initialize a new level * @param area_nu area number from 1 to 5 * @param level_nu level number from 1 to 12 */ void controller_bricks::load_level (Sint32 area_nu, Sint32 level_nu) { if (is_verbose) { std::cout << "controller_bricks::load_level() area_nu: " << area_nu << "level_nu: " << level_nu << std::endl; } /* a table has 17 lines of 10 columns, 172 * 2 = 340 bytes */ /* clear he number of bricks of the level */ num_of_bricks = 0; /* load bricks levels (34000 bytes => 100 levels) */ char *all_levels = resources->load_data (handler_resources::DATA_BRICKS_LEVELS); if (level_nu >= 6) { level_nu--; } char *level = all_levels + (SIZEOFAREA * 2 * (area_nu - 1)) + (LEVEL_SIZE * 2 * (level_nu - 1)); //level = all_levels + LEVEL_SIZE * 2 * 8; /* Select a level at random. * Two different levels are possible for a level */ if ((random_counter & 0x001)) { //level = level + LEVEL_SIZE * 2 * 50; } /* * copy all bricks of the level in the structure "bricks_map" */ brick_info *map = bricks_map; /* 6 first lines are always empty */ map += (6 * MAX_OF_BRICKS_HORIZONTALLY); Sint32 ycoord = 6 * brkyoffset; Sint32 xcoord = 0; Uint32 bobindex = 6 * MAX_OF_BRICKS_HORIZONTALLY; sprite_brick *sprite_template = NULL; for (Uint32 j = 0; j < BRICKS_MAP_HEIGHT; j++, map += 3, bobindex += 3, ycoord += brkyoffset) { /* the first 3 columns are always empty */ map += 3; xcoord = brick_width * 3; bobindex += 3; for (Uint32 i = 0; i < BRICKS_MAP_WIDTH; i++, map++, bobindex++, xcoord += brick_width) { Sint32 offset = 0; /* x position in the bitmap source from 0 to 8 */ char pos_y = *(level++); /* y position in the bitmap source from 0 to 12, step 2 */ char pos_x = *(level++); //pos_x = 12; pos_y = 1; //test only if (pos_x > 0 || pos_y > 0) { //pos_x = 12; pos_y = 1; // test only /* save X-coordinate into bricks_map */ map->h_pos = pos_x; /* save Y-coordinate into bricks_map */ map->v_pos = pos_y; offset = bitmap_bricks->get_offset (pos_x * 8 * resolution, pos_y * brick_height); /* it's a indestructible brick? */ if (offset < indestructible_offset) { /* not, counter's incremented */ num_of_bricks++; } if (!has_background) { sprite_brick *sprite = new sprite_brick (); if (sprite_template == NULL) { sprite->create_sprite (sprite_object::BRICKS, bitmap_bricks, true, true); sprite_template = sprite; } else { sprite_template->duplicate_to (sprite); } sprites_list[bobindex] = sprite; sprite->set_x_coord (xcoord); sprite->set_y_coord (ycoord); sprite->enable (); sprite->set_image (pos_y * 7 + (pos_x >> 1)); sprite->set_color (map->color); map->sprite = sprite; } } map->source_offset = offset; map->is_displayed = offset > 0 ? true : false; } } if (all_levels != NULL) { delete[](char *) all_levels; } /* Initialize the number of total bricks to destroy */ right_panel_score *panel = right_panel_score::get_instance (); panel->set_bricks_counter (num_of_bricks); } /** * Add bricks sprites to the sprites global list */ void controller_bricks::add_to_sprites_list () { if (were_sprites_added || has_background) { return; } for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sprite = sprites_list[i]; if (sprite == NULL) { continue; } sprites->add (sprite); } were_sprites_added = true; } /** * Draw the shadows of bricks */ void controller_bricks::draw_bricks_shadows () { if (!has_background) { return; } brick_info *map = bricks_map; Sint32 xmax = MAX_OF_BRICKS_HORIZONTALLY * brick_width - shadow_offset; for (Uint32 j = shadow_offset; j < MAX_OF_BRICKS_VERTICALLY * brkyoffset + shadow_offset; j += brkyoffset) { for (Sint32 i = -shadow_offset; i < xmax; i += brick_width) { if (map->source_offset) { background_screen->fill_shadow_rect (i, j, brick_width, brick_height); } map++; } } } /** * Draw all bricks */ void controller_bricks::draw_bricks () { if (!has_background) { return; } brick_info *map = bricks_map; for (Uint32 j = 0; j < MAX_OF_BRICKS_VERTICALLY * brkyoffset; j += brkyoffset) { for (Uint32 i = 0; i < MAX_OF_BRICKS_HORIZONTALLY * brick_width; i += brick_width, map++) { /* range from x >=0 to x <= 14 */ Sint32 pos_x = map->h_pos; /* range from y >=0 to y <= 8 */ Sint32 pos_y = map->v_pos; if (pos_x != 0 || pos_y != 0) { /* convert planar to chunky */ pos_x *= 8 * resolution; pos_y *= brick_height; char *source = bitmap_bricks->get_pixel_data (pos_x, pos_y); draw_brick (source, map->pixel_offset, map->color); } } } } /** * Draw one brick * @param pixels pointer on the graphics of the brick * @param offset relative pointer on the graphics of the offscreen * @param color colormap number from 239 to 255 */ void controller_bricks::draw_brick (char *pixels, Sint32 offset, Sint32 color) { Sint32 offset_src = offsSource; Sint32 offset_dst = offsDestin; /* pointer to the game offscreen */ char *screen1 = (char *) adr_desti1; /* pointer to offscreen used to restore background */ char *screen2 = (char *) adr_desti2; screen1 += offset; screen2 += offset; for (Uint32 j = 0; j < brick_height; j++) { for (Uint32 i = 0; i < brick_width; i++) { char p = *(pixels++); /* check color 29 */ if (p == 29) { /* replace by the color of the bricks */ p = color; } *(screen1++) = p; *(screen2++) = p; } pixels += offset_src; screen1 += offset_dst; screen2 += offset_dst; } } /** * Enable the bricks color cycling */ void controller_bricks::start_cycling () { if (has_background) { return; } is_cycling = true; } /** * Cycle color of all bricks */ void controller_bricks::color_cycling () { if (has_background or ! is_cycling) { return; } brick_info *map = bricks_map; map += ((6 + BRICKS_MAP_HEIGHT - 9) * MAX_OF_BRICKS_HORIZONTALLY + 3) - 1; map = bricks_map + ((6 + BRICKS_MAP_HEIGHT - 1) * MAX_OF_BRICKS_HORIZONTALLY) + 3 + BRICKS_MAP_WIDTH - 1; Sint32 count = cycling_count++; for (Uint32 i = 0; i < BRICKS_MAP_HEIGHT; i++, map -= MAX_OF_BRICKS_HORIZONTALLY) { if (count >= (Sint32) BRICKS_MAP_WIDTH) { if (i == BRICKS_MAP_HEIGHT - 1) { cycling_count = 0; is_cycling = false; } } else { if (map[-count].sprite != NULL) { if (!map[-count].sprite->is_cycling ()) { map[-count].sprite->touch (); } } } if (count == 0) { break; } count--; } } /** * Initialize the 17 colors of the bricks */ void controller_bricks::set_bricks_palette () { display->set_color_gradation (); } /** * save background under bricks */ void controller_bricks::save_background () { Sint32 *save = (Sint32 *) background_under_bricks; brick_info *map = bricks_map; Uint32 offs = game_screen->get_row_size () - brick_width; for (Uint32 y = 0; y < MAX_OF_BRICKS_VERTICALLY * brkyoffset; y += brkyoffset) { for (Uint32 x = 0; x < MAX_OF_BRICKS_HORIZONTALLY * brick_width; x += brick_width, map++) { Sint32 *screen = (Sint32 *) background_screen->get_pixel_data (x, y); map->save_background = save; for (Uint32 i = 0; i < brick_height; i++, screen = (Sint32 *) ((char *) screen + offs)) { for (Uint32 j = 0; j < brick_width / 4; j++) { *(save++) = *(screen++); } } } } } /** * Decrease the counter of bricks to be destroyed * It is an option bought from the shop */ void controller_bricks::less_bricks () { if (less_bricks_count < 1) { return; } if (--less_bricks_delay > 0) { return; } less_bricks_delay = 10; less_bricks_count--; right_panel_score *panel = right_panel_score::get_instance (); panel->decrease_bricks_counter (1); #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_BRICK1); #endif } /** * Display a brick or restore the background under the brick * @return true if the update is not finished */ bool controller_bricks::update () { right_panel_score * panel = right_panel_score::get_instance (); controller_capsules * capsules = controller_capsules::get_instance (); controller_moneys * moneys = controller_moneys::get_instance (); brick_redraw * redraw = bricks_redraw + brique_clr; /* offscreen offset for drawing brick */ Sint32 adres = redraw->pixel_offset; if (0 == adres) { return false; } /* inc. index on the next brick to draw or to clear */ brique_clr += 1; /* index from 0 to 511 */ brique_clr &= (MAXBRIKCLR - 1); redraw->pixel_offset = 0; brick_info * map = redraw->brick_map; /* * redraw a new brick */ if (!redraw->is_background) { current_player->add_score (10); #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_BRICK1); #endif moneys->send_money_from_brick (redraw); if (!has_background) { map->sprite->update_image (redraw->brick_map->h_pos); } else { char * pixels = bitmap_bricks->get_pixel_data (); draw_brick (pixels + redraw->number, adres, map->color); } return true; } /* * a brick is destroyed */ /* destroyed indestructible brick */ if (redraw->is_indestructible) { current_player->add_score (100); #ifndef SOUNDISOFF audio->play_sound (handler_audio::DESTROY_INDESTRUCTIBLE_BRICK); #endif } else { current_player->add_score (20); panel->decrease_bricks_counter (1); #ifndef SOUNDISOFF audio->play_sound (handler_audio::BALL_HIT_BRICK1); #endif if (!redraw->is_gigablitz_destroyed) { moneys->send_money_from_brick (redraw); capsules->send_capsule_from_brick (redraw); } } if (!has_background) { map->sprite->disable (); return true; } /** * restore background */ Sint32 line2 = offsDestin; Sint32 * desP1 = adr_desti1; Sint32 * desP2 = adr_desti2; desP1 = (Sint32 *) ((char *) desP1 + adres); desP2 = (Sint32 *) ((char *) desP2 + adres); Sint32 * srcPT = map->save_background; map->is_displayed = 0; for (Uint32 j = 0; j < brick_height; j++) { for (Uint32 i = 0; i < brick_width / 4; i++) { *(desP1++) = *srcPT; *(desP2++) = *(srcPT++); } desP1 = (Sint32 *) ((char *) desP1 + line2); desP2 = (Sint32 *) ((char *) desP2 + line2); } /* * clear drop shadow (if needed) */ Sint32 j; /* bottom */ if ((map + offBri_BB)->is_displayed) { /* there is a bottom brick (2 lines to clear) */ j = shadow_yoff; } else { /* there is not bottom brick: (6 lines to clear) */ j = shadow_offset; } Sint32 decal = display->ecran_next (adres, 0, brick_height); display->clr_shadow (decal, brick_width - shadow_offset, j); /* left-bottom */ if ((map + offBri_BG)->is_displayed) { j = shadow_yoff; } else { j = shadow_offset; } decal = display->ecran_next (adres, -shadow_offset, brick_height); display->clr_shadow (decal, shadow_offset, j); /* left */ if (!(map + offBri_GG)->is_displayed) { decal = display->ecran_next (adres, -shadow_offset, shadow_offset); display->clr_shadow (decal, shadow_offset, shadow_left); } /* * redraw drop shadow (if needed) */ /* exists a top brick? */ if ((map + offBri_HH)->is_displayed) { display->set_shadow (adres, brick_width - shadow_offset, shadow_top1); } /* exists a right-top brick? */ if ((map + offBri_HD)->is_displayed) { decal = display->ecran_next (adres, brick_width - shadow_offset, 0); display->set_shadow (decal, shadow_offset, shadow_top1); } /* exists a right-top brick? */ if ((map + offBri_DD)->is_displayed) { decal = display->ecran_next (adres, brick_width - shadow_offset, shadow_offset); display->set_shadow (decal, shadow_offset, shadow_left); } return true; } /** * Clear all bricks, in "Game Over" */ void controller_bricks::clr_bricks () { brick_info *map = bricks_map; /* 6 first lines are always empty */ map += (6 * MAX_OF_BRICKS_HORIZONTALLY); for (Uint32 j = 0; j < BRICKS_MAP_HEIGHT; j++, map += 3) { /* the first 3 columns are always empty */ map += 3; for (Uint32 i = 0; i < BRICKS_MAP_WIDTH; i++, map++) { if (0 == map->source_offset) { continue; } brick_redraw *redraw = get_bricks_redraw_next (); redraw->is_gigablitz_destroyed = true; redraw->pixel_offset = map->pixel_offset; redraw->brick_map = map; map->h_pos = -1; map->source_offset = 0; redraw->number = map->number; /* restore background under brick */ redraw->is_background = true; } } } /** * Return pointer to the bricks map of the current level * @return a pointer to the bricks bricks_map */ brick_info * controller_bricks::get_bricks_map () { return bricks_map; } /** * Return pointer to the bricks map of the current level * @param xcoord X-Coordinate in the screen * @param ycoord Y-Coordinate in the screen * @return a pointer to the bricks bricks_map */ brick_info * controller_bricks::get_bricks_map (Sint32 xcoord, Sint32 ycoord) { return bricks_map + (xcoord / brick_width) + (ycoord / brkyoffset * MAX_OF_BRICKS_HORIZONTALLY); } /** * Return pointer to the bricks redraw list * @return a pointer to the bricks */ brick_redraw * controller_bricks::get_bricks_redraw () { return bricks_redraw + (briqueSave & (MAXBRIKCLR - 1)); } /** * Return pointer to the bricks redraw list * @return a pointer to the bricks */ brick_redraw * controller_bricks::get_bricks_redraw_next () { Sint32 save = briqueSave; briqueSave += 1; briqueSave &= (MAXBRIKCLR - 1); return bricks_redraw + save; } /** * Return pointer to the bricks redraw list * @return a pointer to the bricks */ void controller_bricks::bricks_redraw_next () { briqueSave += 1; briqueSave &= (MAXBRIKCLR - 1); } /** * Return the width of a brick in pixels * @return width of a brick in pixels */ Sint32 controller_bricks::get_brick_width () { return brick_width; } /** * Return pixels offset of the indestructible bricks * @return pixels offset distance from the upper left corner * of the bricks bitmap (25088 in 640x480 resolution) */ Sint32 controller_bricks::get_indestructible_offset () { return indestructible_offset; } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ Sint32 controller_bricks::getYOffset () { return brkyoffset; } tecnoballz-0.93.1/src/controller_moneys.cc0000664000175000017500000001145612412501752017660 0ustar brunobruno/** * @file controller_moneys.cc * @brief Moneys controller * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 22 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_moneys.cc 22 2014-08-16 11:28:58Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_moneys.h" /** * Create the moneys controller */ controller_moneys::controller_moneys () { littleInit (); max_of_sprites = 6; sprites_have_shades = true; sprite_type_id = sprite_object::MONEY; delay_count = 0; } /** * Release the moneys controller */ controller_moneys::~controller_moneys () { release_sprites_list (); } /** * Initialize the moneys sprites in the bricks levels * @param delay time delay before sending a new money capsule * @param score * @param money */ void controller_moneys::initialize (Uint32 delay, right_panel_score * score, controller_indicators * money) { send_delay = delay; ptbarreScr = score; ptPrntmney = money; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; money->init_members (); } } /** * Send a money capsule from a brick * @param briPT a pointer to the brick which touched by a ball */ void controller_moneys::send_money_from_brick (brick_redraw * briPT) { if (++delay_count <= send_delay) { return; } delay_count = 0; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; if (money->enable_if_available (briPT)) { return; } } } /** * Send a money capsule from a destroyed flying enemy ship * @param ball a pointer to the ball sprite which destroyed the enemy ship */ void controller_moneys::send_money (sprite_ball * ball) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; if (money->enable_if_available (ball)) { return; } } } /** * Send a money capsule from a destroyed flying enemy ship * @param blast a pointer to the projectile sprite which * destroyed the enemy ship */ void controller_moneys::send_money (sprite_projectile * blast) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; if (money->enable_if_available (blast)) { return; } } } /** * Move money capsules and check collision with the paddles * in bricks levels */ void controller_moneys::move () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; money->play_animation_loop (); Uint32 amount = money->move (); if (amount > 0) { current_player->add_score (20); ptPrntmney->increase_money_amount (amount); } } } /** * Initialize the moneys sprites in the guardians levels * @param delay time delay before sending a new money capsule */ void controller_moneys::initialize (Uint32 delay, controller_indicators * money) { send_delay = delay; ptPrntmney = money; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; money->init_members (); } } /** * Send a money capsule from a guardian * @param ball a pointer to the ball sprite which touched the guardian */ void controller_moneys::send_money_from_guardian (sprite_ball * ball) { if (++delay_count <= send_delay) { return; } delay_count = 0; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; if (money->enable_if_available (ball)) { return; } } } /** * Move money capsules and check collision with the paddle * in guardians levels */ void controller_moneys::move_bottom () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_money *money = sprites_list[i]; money->play_animation_loop (); Uint32 amount = money->move_bottom (); if (amount > 0) { ptPrntmney->increase_money_amount (amount); current_player->add_score (20); } } } tecnoballz-0.93.1/src/controller_font_game.cc0000664000175000017500000001154012412501752020277 0ustar brunobruno/** * @file controller_font_game.cc * @brief Handle mobile characters used for "LEVEL n COMPLETED" * @date 2007-10-31 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_font_game.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_font_game.h" /** * Create the object */ controller_font_game::controller_font_game () { littleInit (); size_of_line_1 = 0; size_of_line_2 = 0; horizontal_length = 0; max_of_sprites = 20; sprites_have_shades = true; sprite_type_id = sprite_object::FONT_GAME; horizontal_offset = 0; } /** * Release the object */ controller_font_game::~controller_font_game () { release_sprites_list (); } /** * Perform some initializations * @param level * @param offset */ void controller_font_game::initialize (Uint32 level, Uint32 offset) { horizontal_offset = offset; horizontal_length = 256 * resolution; char *monPT = ze_bobText; //if(level <= 12) { Sint32 d = level / 10; Sint32 u = level - d * 10; ze_bobText[6] = (char) d + '\\'; ze_bobText[7] = (char) u + '\\'; } /*else { monPT = ze_endText; } */ /* count the number of characters */ size_of_line_1 = 0; while (*(monPT++) != 0) { size_of_line_1++; } size_of_line_2 = 0; while (*(monPT++) != 0) { size_of_line_2++; } total_size = size_of_line_1 + size_of_line_2; /* initialize the images for each character */ monPT = ze_bobText; for (Uint32 i = 0; i < total_size; i++) { sprite_font_game *sprite_char = sprites_list[i]; char c = *(monPT++); if (c == '\0') { c = *(monPT++); } sprite_char->new_offset (c - 'A'); } /* initialize characters of "LEVEL n" */ Sint32 yStrt = 200 * resolution; Sint32 a = set_start_values (size_of_line_1, 0, 0, yStrt, -6 * resolution, 60 * resolution); /* initialize characters of "COMPLETED" */ yStrt += 10 * resolution; set_start_values (size_of_line_2, a, size_of_line_1, yStrt, -8 * resolution, 80 * resolution); } /** * Initialize start values for each char of a string * @param length Number of chars * @param zerad Radius * @paral index * @param yStrt Start y-coordinate * @param yOffs Y move offset * @param yStop Stop y-coordinate * @return */ Uint32 controller_font_game::set_start_values (Uint32 length, Uint32 zeRad, Uint32 index, Sint32 yStrt, Uint32 yOffs, Sint32 yStop) { Sint32 width = sprites_list[0]->get_sprite_height (); Sint32 e = (horizontal_length) / length; Sint32 x_stop = (horizontal_length - (length * width)) / 2; Sint32 xOffs = 0; //X move offset (1, -1 or 0) Sint32 xStrt = e / 2; //start X coordinate x_stop += horizontal_offset; xStrt += horizontal_offset; for (Uint32 i = index; i < (length + index); i++, xStrt += e, x_stop += width) { sprite_font_game *chara = sprites_list[i]; chara->set_coordinates (xStrt, yStrt); if (xStrt > x_stop) { xOffs = -1; } else { if (xStrt == x_stop) { xOffs = 0; } else { xOffs = 1; } } chara->initialize (zeRad, x_stop, yStrt, xOffs, yOffs, yStop); zeRad += 8; zeRad &= SINUS_MASK; } return zeRad; } /** * Animation of characters sprites */ void controller_font_game::move () { for (Uint32 i = 0; i < total_size; i++) { sprite_font_game *sprite_char = sprites_list[i]; sprite_char->move (); } } /** * Enable character sprites */ void controller_font_game::enable () { for (Uint32 i = 0; i < total_size; i++) { sprite_font_game *sprite_char = sprites_list[i]; sprite_char->enable (); } } //----------------------------------------------------------------------------- // string to display //----------------------------------------------------------------------------- char controller_font_game::ze_bobText[] = "LEVEL[//\0COMPLETED\0"; char controller_font_game::ze_endText[] = "[[GAME[[\0FINISHED[\0"; tecnoballz-0.93.1/src/handler_levels.cc0000664000175000017500000004516712412501752017100 0ustar brunobruno/** * @file handler_levels.cc * @brief Levels handler * @created 2004-04-06 * @date 2014-08-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_levels.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ using namespace std; #include "../include/handler_levels.h" #include "../include/handler_resources.h" #include #include #include /** * Create a level handler objet */ handler_levels::handler_levels () { object_init (); time_multiplier = TIME_MULTIPLIER; levels_list = NULL; bricks_levels = NULL; guardians_levels = NULL; capsules_list = NULL; levels_counter = 0; bricks_levels_counter = 0; guardians_levels_counter = 0; capsules_lists_counter = 0; level_index = -1; bricks_level_index = -1; guardians_level_index = -1; appearance_index = -1; capsule_list_index = -1; capsule_index = -1; char *fpath = resources->get_full_pathname (handler_resources::DATA_LEVELS); xml_levels = new TiXmlDocument (fpath); if (!xml_levels->LoadFile ()) { cerr << "(!)handler_levels::handler_levels() " << "failed to load file " << fpath << endl; throw runtime_error ("(!)handler_levels::handler_levels()" "Fail to load XML file!"); } /* count number of structures elements */ check_xml (xml_levels, ROOT); if (is_verbose) { cout << "handler_levels::handler_levels() " << " levels_counter: " << levels_counter << "; guardians_levels_counter: " << guardians_levels_counter << "; capsules_lists_counter: " << capsules_lists_counter << endl; } /* allocate levels structures */ try { bricks_levels = new bricks_level_desc[bricks_levels_counter]; guardians_levels = new guardians_level_desc[guardians_levels_counter]; capsules_list = new capsules_struct[capsules_lists_counter]; levels_list = new level_desc[levels_counter]; } catch (bad_alloc &) { cerr << "(!)handler_levels::handler_levels() " << "not enough memory to allocate levels structures!" << endl; throw; } /* clear levels structure */ for (Uint32 i = 0; i < levels_counter; i++) { levels_list[i].id = 0; levels_list[i].type = BRICKS_LEVEL; } /* copy XML file data in levels structures */ parse (xml_levels, ROOT); check_levels (); } /** * Check is levels structure is valid */ void handler_levels::check_levels () { for (Uint32 i = 0; i < levels_counter; i++) { if (BRICKS_LEVEL == levels_list[i].type) { get_bricks_level (levels_list[i].id); } else if (GUARDIANS_LEVEL == levels_list[i].type) { get_guardians_level (levels_list[i].id); } else { cerr << "(!)handler_levels::check_levels() '" << levels_list[i].type << "' is a invalid level type!" << endl; throw runtime_error ("(!)handler_levels::check_levels()" "bad level type!"); } } } /** * Check XML file and count nodes * @param parent current node * @param node node indentifier of the seconde level */ void handler_levels::check_xml (TiXmlNode * parent, Uint32 node) { if (NULL == parent) { return; } Sint32 type = parent->Type (); switch (type) { case TiXmlNode::TINYXML_ELEMENT: { string element = parent->Value (); if (element == "level") { node = LEVEL_NODE; levels_counter++; break; } if (element == "bricks_level") { node = BRICKS_LEVEL_NODE; bricks_levels_counter++; break; } if (element == "guardians_level") { node = GUARDIANS_LEVEL_NODE; guardians_levels_counter++; break; } if (element == "capsules") { if (capsules_lists_counter > 0) { if (capsules_counter != MAX_OF_CASPULES) { cerr << "(!)handler_levels::check_xml() " << MAX_OF_CASPULES << " childnodes " << " of chilnodes expected." << " But " << capsules_counter << " found!" << endl; throw runtime_error ("(!)handler_levels::check_xml()" "Bad number of childnodes!"); } } capsules_counter = 0; node = CAPSULES_NODE; capsules_lists_counter++; break; } if (element == "id" and node == CAPSULES_NODE) { capsules_counter++; break; } } break; } for (TiXmlNode * child = parent->FirstChild (); NULL != child; child = child->NextSibling ()) { check_xml (child, node); } } /** * Copy XML file data in levels structures * @param parent current node * @param node node indentifier of the seconde level */ void handler_levels::parse (TiXmlNode * parent, Uint32 node) { if (NULL == parent) { return; } Sint32 type = parent->Type (); string value_str; TiXmlText *text; TiXmlElement *element; TiXmlAttribute *attribute; stringstream input_stream; Sint32 value; string name; switch (type) { case TiXmlNode::TINYXML_ELEMENT: { element = parent->ToElement (); last_element = parent->Value (); if (last_element == "level") { node = LEVEL_NODE; level_index++; attribute = element->FirstAttribute (); while (NULL != attribute) { name = attribute->Name (); if (attribute->QueryIntValue (&value) != TIXML_SUCCESS) { cerr << "(!)handler_levels::parse() '" << name << "' attribute is not a integer!" << endl; throw runtime_error ("(!)handler_levels::parse()" "an attribute is not a integer!"); } if (value < 0) { cerr << "(!)handler_levels::parse() '" << name << "' attribute is a negative integer!" << endl; throw runtime_error ("(!)handler_levels::parse()" "an attribute is negative integer!"); } if ("id" == name) { levels_list[level_index].id = value; } if ("type" == name) { if (value >= MAX_OF_LEVEL_TYPES) { cerr << "(!)handler_levels::parse() '" << value << "' is a invalid level type!" << endl; throw runtime_error ("(!)handler_levels::parse()" "bad level type attribute!"); } levels_list[level_index].type = value; } attribute = attribute->Next (); } break; } if (last_element == "bricks_level") { node = BRICKS_LEVEL_NODE; appearance_index = -1; bricks_level_index++; break; } if (last_element == "guardians_level") { node = GUARDIANS_LEVEL_NODE; guardians_level_index++; break; } if (last_element == "capsules") { node = CAPSULES_NODE; capsule_list_index++; capsule_index = -1; break; } } break; case TiXmlNode::TINYXML_TEXT: text = parent->ToText (); value_str = text->Value (); if (!sscanf (value_str.c_str (), "%d", &value)) { cerr << "(!)handler_levels::parse() '" << last_element << "' element is not a integer!" << endl; throw runtime_error ("(!)handler_levels::parse()" "an element is not a integer!"); } if (value < 0) { cerr << "(!)handler_levels::parse() '" << last_element << "' element is a negative integer!" << endl; throw runtime_error ("(!)handler_levels::parse()" "an element is negative integer!"); } switch (node) { case LEVEL_NODE: break; case CAPSULES_NODE: if (last_element == "identifier") { capsules_list[capsule_list_index].id = value; } if (last_element == "id") { /* collect all the codes caspules */ capsule_index++; capsules_list[capsule_list_index].codes[capsule_index] = value; } break; case BRICKS_LEVEL_NODE: if (last_element == "id") { bricks_levels[bricks_level_index].id = value; } if (last_element == "appearance") { appearance_index++; switch (appearance_index) { case 0: bricks_levels[bricks_level_index].ship_appearance_delay1 = value * time_multiplier; break; case 1: bricks_levels[bricks_level_index].ship_appearance_delay2 = value * time_multiplier; break; case 2: bricks_levels[bricks_level_index].ship_appearance_delay3 = value * time_multiplier; break; case 3: bricks_levels[bricks_level_index].ship_appearance_delay4 = value * time_multiplier; break; default: cerr << "(!) handler_levels::parse() " << "ranking values must be between 0 and 3 inclusive!" << endl; break; } } if (last_element == "reappearance") { bricks_levels[bricks_level_index].reappearance = value * time_multiplier; } if (last_element == "strength") { bricks_levels[bricks_level_index].ships_strength = value; } if (last_element == "penalties_frequency") { bricks_levels[bricks_level_index].penalties_frequency = value; } if (last_element == "moneys_frequency") { bricks_levels[bricks_level_index].moneys_frequency = value; } if (last_element == "penalties_list_id") { bricks_levels[bricks_level_index].malusListe = get_capsules_list (value); } if (last_element == "starting_speed") { bricks_levels[bricks_level_index].starting_speed = value; } if (last_element == "acceleration_delay") { bricks_levels[bricks_level_index].acceleration_delay = value * time_multiplier; } if (last_element == "ball_release_time") { bricks_levels[bricks_level_index].ball_release_time = value * time_multiplier; } if (last_element == "glue_time") { bricks_levels[bricks_level_index].glue_time = value * time_multiplier; } if (last_element == "tilt_delay") { bricks_levels[bricks_level_index].tilt_delay = value * time_multiplier; } break; case GUARDIANS_LEVEL_NODE: if (last_element == "id") { guardians_levels[guardians_level_index].id = value; } if (last_element == "starting_speed") { guardians_levels[guardians_level_index].starting_speed = value; } if (last_element == "ball_release_time") { guardians_levels[guardians_level_index].ball_release_time = value * time_multiplier; } if (last_element == "tilt_delay") { guardians_levels[guardians_level_index].tilt_delay = value * time_multiplier; } if (last_element == "scroll_delay") { guardians_levels[guardians_level_index].scroll_delay = value * time_multiplier; } if (last_element == "scroll_id") { guardians_levels[guardians_level_index].scroll_id = value; } if (last_element == "capsules_frequency") { guardians_levels[guardians_level_index].capsules_frequency = value; } if (last_element == "capsules_list_id") { guardians_levels[guardians_level_index].capsules_list = get_capsules_list (value); } break; default: break; } break; default: break; } for (TiXmlNode * child = parent->FirstChild (); NULL != child; child = child->NextSibling ()) { parse (child, node); } } /** * Search and returns the guardians level corresponding * to a given identifier * @param guardians level identifier * @return a pointer to guardians level */ guardians_level_desc * handler_levels::get_guardians_level (Uint32 id) { for (Uint32 i = 0; i < guardians_levels_counter; i++) { guardians_level_desc *level = &guardians_levels[i]; if (level->id == id) { return level; } } cerr << "(!)handler_levels::get_guardians_level() " << "id " << id << " not found!" << endl; throw runtime_error ("(!)handler_levels::get_guardians_level()" "ID not found!"); } /** * Search and returns the bricks level corresponding * to a given identifier * @param bricks level identifier * @return a pointer to a bricks level */ bricks_level_desc * handler_levels::get_bricks_level (Uint32 id) { for (Uint32 i = 0; i < bricks_levels_counter; i++) { bricks_level_desc *level = &bricks_levels[i]; if (level->id == id) { return level; } } cerr << "(!)handler_levels::get_bricks_level() " << "id " << id << " not found!" << endl; throw runtime_error ("(!)handler_levels::get_bricks_level()" "ID not found!"); } /** * Search and returns the list of capsules corresponding * to a given identifier * @param capsules list identifier * @return a pointer to the list of capsules codes */ Uint32 * handler_levels::get_capsules_list (Uint32 id) { for (Uint32 i = 0; i < capsules_lists_counter; i++) { capsules_struct *capsule = &capsules_list[i]; if (capsule->id == id) { return &capsule->codes[0]; } } cerr << "(!)handler_levels::get_capsules_list() " << "id " << id << " not found!" << endl; throw runtime_error ("(!)handler_levels::get_capsules_list()" "ID not found!"); } /** * Release the level handler object */ handler_levels::~handler_levels () { if (NULL != levels_list) { delete[]levels_list; levels_list = NULL; } if (NULL != bricks_levels) { delete[]bricks_levels; bricks_levels = NULL; } if (NULL != capsules_list) { delete[]capsules_list; capsules_list = NULL; } if (NULL != guardians_levels) { delete[]guardians_levels; guardians_levels = NULL; } if (NULL != xml_levels) { delete xml_levels; xml_levels = NULL; } } /** * Return the params of a guardian level * @param area_num area number from 1 to 5 * @param level_num level number: 6, 12 or 13 * @return a pointer to a guardians level */ const bricks_level_desc * handler_levels::get_bricks_levels_params (Uint32 area_num, Uint32 level_num) { if (area_num < 1 || area_num > 5) { cerr << "(!)handler_levels::get_bricks_levels_params() " << "area_num:" << area_num << "out of range!" << endl; area_num = 1; } if (level_num < 1 || level_num > NUM_OF_LEVELS_PER_AREA) { cerr << "(!)handler_levels::get_bricks_levels_params() " << "level:" << level_num << "out of range!" << endl; level_num = 1; } if (level_num == 6 || level_num == NUM_OF_LEVELS_PER_AREA) { cerr << "(!)handler_levels::get_bricks_levels_params() " << "level:" << level_num << " is a guardians level!" << endl; level_num--; } Uint32 index = (area_num - 1) * NUM_OF_LEVELS_PER_AREA + (level_num - 1); index = levels_list[index].id; return get_bricks_level (index); } /** * Return the params of a guardian level * @param area_num area number from 1 to 5 * @param level_num level number: 6, 12 or 13 * @return a pointer to a guardians level */ const guardians_level_desc * handler_levels::get_guardians_levels_params (Uint32 area_num, Uint32 level_num) { if (area_num < 1 || area_num > 5) { cerr << "(!)handler_levels::get_guardians_levels_params() " << "area_num:" << area_num << "out of range!" << endl; area_num = 1; } if (level_num < 1 || (area_num < 5 && level_num > NUM_OF_LEVELS_PER_AREA) || (area_num == 5 && level_num > (NUM_OF_LEVELS_PER_AREA + 1))) { cerr << "(!)handler_levels::get_guardians_levels_params() " << "level:" << level_num << "out of range!" << endl; level_num = 6; } if (level_num != 6 && level_num != NUM_OF_LEVELS_PER_AREA && level_num != (NUM_OF_LEVELS_PER_AREA + 1)) { cerr << "(!)handler_levels::get_guardians_levels_params() " << "level:" << level_num << " is a bricks level!" << endl; level_num = 6; } Uint32 index = (area_num - 1) * NUM_OF_LEVELS_PER_AREA + (level_num - 1); index = levels_list[index].id; return get_guardians_level (index); } tecnoballz-0.93.1/src/handler_menu_events.cc0000664000175000017500000002334012412501752020123 0ustar brunobruno/** * @file handler_menu_events.cc * @brief Handler the events of the menu * @created 2007-1O-29 * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 23 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_menu_events.cc 23 2014-08-16 20:13:07Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_menu_events.h" #include "../include/handler_keyboard.h" /** * Create menu events object */ handler_menu_events::handler_menu_events () { stop (); } /** * Release menu events object */ handler_menu_events::~handler_menu_events () { stop (); } /** * Stop menu events */ void handler_menu_events::stop () { is_enabled = false; y_coord_left_down = handler_keyboard::NULL_YCOORD; y_coord_right_down = handler_keyboard::NULL_YCOORD; line_spacing = 0; x_center = 0; top_y_coord = 0; line_min = 0; line_max = 0; current_line = 0; key_delay = 0; previous_key_code_down = 0; row_spacing = 0; row_min = 0; row_max = 0; current_row = 0; left_x_coord = 0; } /** * Start a new horizontal/vertical menu handler * @param xspace Space between lines in pixels * @param yspace Space between rows in pixels * @param xmin Minimum row number * @param ymin Minimum line number * @param xmax Maximum row number * @param ymax Maximum line number * @param xleft X-coordinate left of the menu * @param ytop Y-coordinate top of the menu */ void handler_menu_events::begin (Sint32 xspace, Sint32 yspace, Sint32 xmin, Sint32 ymin, Sint32 xmax, Sint32 ymax, Sint32 xleft, Sint32 ytop) { row_spacing = xspace; row_min = xmin; row_max = xmax; current_row = 0; left_x_coord = xleft; start (yspace, ymin, ymax, 0, ytop); } /** * Start a new vertical menu handler * @param spacing Space between lines in pixels * @param min Minimum line number * @param max Maximum line number * @param xcenter X-coordinate center of the menu * @param ytop Y-coordinate top of the menu */ void handler_menu_events::start (Sint32 spacing, Sint32 min, Sint32 max, Sint32 xcenter, Sint32 ytop) { if (is_verbose) { std::cout << " handler_menu_events::start() " << " line_spacing: " << spacing << " line_min: " << min << " line_max: " << max << " x_center: " << xcenter << " top_y_coord: " << ytop << std::endl; } is_enabled = true; y_coord_left_down = handler_keyboard::NULL_YCOORD; y_coord_right_down = handler_keyboard::NULL_YCOORD; line_spacing = spacing; line_min = min; line_max = max; x_center = xcenter; current_line = 0; top_y_coord = ytop; previous_key_code_down = 0; Sint32 xmouse, ymouse; SDL_GetMouseState (&xmouse, &ymouse); if (ymouse < ytop + min * spacing) { current_line = min; } else if (ymouse > ytop + max * spacing) { current_line = max; } else { current_line = (ymouse - ytop) / spacing; } } /** * Code keys recognized in a menu */ Uint32 handler_menu_events::keys[MAX_OF_KEYS] = { handler_keyboard::K_UP, handler_keyboard::K_DOWN, handler_keyboard::K_LEFT, handler_keyboard::K_RIGHT, handler_keyboard::K_FIRE, handler_keyboard::K_RELEASE_BALL, handler_keyboard::K_GIGABLITZ }; /** * Check key handles * @param kcode Pointer the current key code down * @param prev_kcode Pointer the previous key code down */ bool handler_menu_events::check_keys (Uint32 * kcode, Uint32 * prev_kcode) { bool is_pressed = false; *prev_kcode = 0; *kcode = 0; if (keyboard->get_input_cursor_pos () >= 0) { return false; } /* check keyboards events */ if (previous_key_code_down > 0 && !keyboard->control_is_pressed (previous_key_code_down)) { *prev_kcode = previous_key_code_down; previous_key_code_down = 0; key_delay = 0; } if (key_delay < 1) { for (Uint32 i = 0; i < MAX_OF_KEYS; i++) { if (!keyboard->control_is_pressed (keys[i])) { continue; } is_pressed = true; *kcode = keys[i]; if (previous_key_code_down != keys[i]) { previous_key_code_down = keys[i]; key_delay = 30; } else { key_delay = 10; } break; } } else { *kcode = 0; key_delay--; } return is_pressed; } /** * Check keys events for the shop */ bool handler_menu_events::check () { if (!is_enabled) { return false; } Uint32 kcode = 0; Uint32 prev_kcode = 0; bool is_pressed = check_keys (&kcode, &prev_kcode); bool is_selected = false; switch (prev_kcode) { case handler_keyboard::K_FIRE: is_selected = true; break; case handler_keyboard::K_RELEASE_BALL: is_selected = true; break; } /* check if right or left button are pressed */ bool is_warp = false; if (is_pressed) { switch (kcode) { case handler_keyboard::K_LEFT: if (current_row == row_min) { current_row = row_max; } else { current_row--; } is_warp = true; break; case handler_keyboard::K_RIGHT: if (current_row == row_max) { current_row = row_min; } else { current_row++; } is_warp = true; break; case handler_keyboard::K_UP: if (current_line == line_min) { current_line = line_max; } else { current_line--; } is_warp = true; break; case handler_keyboard::K_DOWN: if (current_line == line_max) { current_line = line_min; } else { current_line++; } is_warp = true; break; } if (is_warp) { SDL_WarpMouse (left_x_coord + current_row * row_spacing, top_y_coord + current_line * line_spacing); } } return is_selected; } /** * Check mouses events for the main menu and popup menu * @param pos_y Pointer to a integer which will contain y-coordinate * where the mouse clicked * @param inc Pointer to a integer which will contain -1 if left mouse * button clicked, 1 if right button clicked, otherwise 0 * @return true if left mouse button clicked, otherwise false */ bool handler_menu_events::check (Sint32 * pos_y, Sint32 * inc) { if (!is_enabled) { return false; } Uint32 kcode = 0; Uint32 prev_kcode = 0; check_keys (&kcode, &prev_kcode); bool is_selected = false; switch (prev_kcode) { case handler_keyboard::K_FIRE: *inc = 1; is_selected = true; break; case handler_keyboard::K_RELEASE_BALL: *inc = -1; is_selected = true; break; } /* check if right or left button are pressed */ Sint32 mposx; switch (kcode) { case handler_keyboard::K_FIRE: break; case handler_keyboard::K_RELEASE_BALL: break; case handler_keyboard::K_UP: if (current_line == line_min) { current_line = line_max; } else { current_line--; } SDL_WarpMouse (x_center, top_y_coord + current_line * line_spacing); break; case handler_keyboard::K_DOWN: if (current_line == line_max) { current_line = line_min; } else { current_line++; } SDL_WarpMouse (x_center, top_y_coord + current_line * line_spacing); break; } /* * check mouse events */ bool is_left_down = keyboard->is_left_button (); bool is_right_down = keyboard->is_right_button (); /* read y where is pressed */ if (is_left_down && y_coord_left_down == handler_keyboard::NULL_YCOORD) { y_coord_left_down = keyboard->get_mouse_y (); } else { if (is_right_down && y_coord_right_down == handler_keyboard::NULL_YCOORD) { y_coord_right_down = keyboard->get_mouse_y (); } } bool is_right_up = false; bool is_left_up = keyboard->is_left_button_up (&mposx, pos_y); if (!is_left_up) { is_right_up = keyboard->is_right_button_up (&mposx, pos_y); } if ((is_left_up && *pos_y == y_coord_left_down) || (is_right_up && *pos_y == y_coord_right_down)) { if (is_left_up) { *inc = 1; y_coord_left_down = handler_keyboard::NULL_YCOORD; } if (is_right_up) { *inc = -1; y_coord_right_down = handler_keyboard::NULL_YCOORD; } is_selected = true; } if (!is_left_down) { y_coord_left_down = handler_keyboard::NULL_YCOORD; } if (!is_right_down) { y_coord_right_down = handler_keyboard::NULL_YCOORD; } return is_selected; } tecnoballz-0.93.1/src/sprite_gem.cc0000664000175000017500000001333212412501752016234 0ustar brunobruno/** * @file sprite_gem.cc * @brief The gem sprite * @created 2004-04-12 * @date 2012-10-07 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_gem.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_gem.h" /** * Create the gem sprite */ sprite_gem::sprite_gem () { clear_sprite_members (); towards = 0; speed_of_moving = 0; is_indicator = false; blink_counter = 0; rand_count = 0; gem_id = GREY_SQUARE; paddle = (sprite_paddle *) NULL; } /** * Release the gem sprite */ sprite_gem::~sprite_gem () { } /** * Initialize a new gem from a ball * @param ball a pointer to the ball sprite which destroyed * the enemy ship * @return true if the sprite was enabled, otherwise false */ bool sprite_gem::enable_if_available (sprite_ball * ball) { if (is_enabled) { return false; } init_gem (ball->x_coord, ball->y_coord, ball->paddle_touched); return true; } /** * Initialize a new gem from a projectile * @param blast a pointer to the projectile sprite which * destroyed the enemy ship * @return true if the sprite was enabled, otherwise false */ bool sprite_gem::enable_if_available (sprite_projectile * blast) { if (is_enabled) { return false; } init_gem (blast->x_coord, blast->y_coord, blast->paddle); return true; } /** * Initialize the gem * @param xcoord x coordinate of the gem * @param ycoord y coordinate of the gem * @param paddle pointer to a paddle sprite */ void sprite_gem::init_gem (Sint32 xcoord, Sint32 ycoord, sprite_paddle * pad) { is_enabled = true; x_coord = xcoord; y_coord = ycoord; paddle = pad; towards = paddle->get_paddle_number (); speed_of_moving = resolution; Uint32 h = ((random_counter >> 4) + rand_count++) & 7; random_counter += xcoord; h = gem_random[h]; gem_id = h; set_image (h); is_indicator = false; sprite_has_shadow = true; blink_counter = 0; right_panel_score* panel_score = right_panel_score::get_instance (); init_coords_max_min (panel_score->get_width()); } /** * A new gem was collected * @param id gem identifier 0 to 5 */ void sprite_gem::collect (Uint32 id) { gem_id = id; set_image (id); sprite_has_shadow = false; is_indicator = true; y_coord = screen_height - sprite_height - 2 * resolution; x_coord = 270 * resolution + sprite_width * id; is_enabled = true; blink_counter = 0; } /** * Enable the blink */ void sprite_gem::enable_blink () { if (is_enabled && is_indicator) { blink_counter = 30; } } /** * Move or blink gem * @return gem identifier collected, otherwise -1 */ Sint32 sprite_gem::move () { if (is_indicator) { blink (); return -1; } if (!is_enabled) { return -1; } switch (towards) { case controller_paddles::BOTTOM_PADDLE: y_coord += speed_of_moving; if (y_coord < y_maximum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return gem_id; } } else { is_enabled = false; } break; case controller_paddles::RIGHT_PADDLE: x_coord += speed_of_moving; if (x_coord < x_maximum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return gem_id; } } else { is_enabled = false; } break; case controller_paddles::TOP_PADDLE: y_coord -= speed_of_moving; if (y_coord > y_minimum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return gem_id; } } else { is_enabled = false; } break; case controller_paddles::LEFT_PADDLE: x_coord -= speed_of_moving; if (x_coord > x_minimum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return gem_id; } } else { is_enabled = false; } break; } return -1; } /** * Blinking the gem */ void sprite_gem::blink () { if (0 == blink_counter || !is_indicator) { return; } if (blink_counter > 20) { is_enabled = false; } else { is_enabled = true; } blink_counter--; if (0 == blink_counter) { blink_counter = 30; } } const Uint32 sprite_gem::gem_random[8] = { GREY_SQUARE, GREEN_SPHERE, YELLOW_RING, BLUE_TRIANGLE, GOLD_RHOMBUS, BRONZE_PENTAGON, GREY_SQUARE, GREEN_SPHERE }; tecnoballz-0.93.1/src/bitmap_data.cc0000664000175000017500000001411112412501752016337 0ustar brunobruno/** * @file bitmap_data.cc * @brief Handle the bitmap * @created 1996-06-29 * @date 2012-09-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: bitmap_data.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include #include "../include/bitmap_data.h" #include "../include/handler_resources.h" #include "../include/handler_display.h" /** * Create the object bitmap */ bitmap_data::bitmap_data () { clear_members (); } /** * Release the object bitmap */ bitmap_data::~bitmap_data () { release (); } /** * Clear some members of the object */ void bitmap_data::clear_members () { surface = (SDL_Surface *) NULL; pixel_data = (char *) NULL; height = 0; width = 0; row_size = 0; depth = 0; bytes_size = 0; } /** * Release bitmap surface or bitmap buffer */ void bitmap_data::release () { if (surface != NULL) { SDL_FreeSurface (surface); surface = (SDL_Surface *) NULL; pixel_data = (char *) NULL; } else if (pixel_data != NULL) { delete[]pixel_data; pixel_data = (char *) NULL; } } /** * Return width of the bitmap * @return width in pixels */ Uint32 bitmap_data::get_width () { return width; } /** * Return size of line in bytes * @return row size in bytes */ Uint32 bitmap_data::get_row_size () { return row_size; } /** * Return bitmap height * @return the height of the bitmap in pixels */ Uint32 bitmap_data::get_height () { return height; } /** * Return bitmap memory address from the corresponding coordinates * @param xcoord x coordinate in the bitmap * @param ycoord y coordinate in the bitmap * @return a pointer to the pixel data */ char * bitmap_data::get_pixel_data (Sint32 xcoord, Sint32 ycoord) { return (pixel_data + ycoord * row_size + (xcoord * depth)); } /** * Return bitmap memory address * @return a pointer to the buffer data */ char * bitmap_data::get_pixel_data () { return pixel_data; } /** * Return amount to add to get to the next line * @param w width of source element in bytes * return modulo line */ Sint32 bitmap_data::get_line_modulo (Sint32 w) { return (row_size - (w * depth)); } /** * Return bitmap memory offset from the corresponding coordinate * @param xcoord x coordinate in the bitmap * @param xcoord y coordinate in the bitmap * @return offset to the pixel data */ Sint32 bitmap_data::get_offset (Sint32 posX, Sint32 posY) { return (posY * row_size + posX * depth); } /** * Create a new SDL surface * @param w width of the surface in pixels * @param h height of the surface in pixels */ void bitmap_data::create_surface (Uint32 w, Uint32 h) { Uint32 d = display->get_bits_per_pixel (); dynamic_cast < surface_sdl * >(this)->create_surface (w, h, d); width = w; height = h; depth = d / 8; row_size = (Sint32) (width * depth); bytes_size = height * row_size; } /** * Allocate and return a copy of the current pixel data * @return pointer to the new pixel data */ char * bitmap_data::duplicate_pixel_data () { char *pixel; try { pixel = new char[bytes_size]; } catch (std::bad_alloc &) { std:: cerr << "bitmap_data::duplicate_pixel_data() " << "not enough memory to allocate " << bytes_size << " bytes " << std::endl; throw; } for (Uint32 i = 0; i < bytes_size; i++) { pixel[i] = pixel_data[i]; } return pixel; } /** * Enable palette of the bitmap */ void bitmap_data::enable_palette () { display->enable_palette (palette); } /** * Return palette of colors * @return pointer to the palette */ unsigned char * bitmap_data::get_palette () { return palette; } /** * Load a bitmap file * @param fname filename specified by path */ void bitmap_data::load (char *fname) { char *fpath = resources->locate_data_file (fname); sdl_load_bmp (fpath); } /** * Load a bitmap file * @param ident filename specified by the ID */ void bitmap_data::load (Sint32 id) { char *fpath = resources->get_full_pathname (id); sdl_load_bmp (fpath); } /** * Load a bitmap file * @param fpath filename specified by path */ void bitmap_data::sdl_load_bmp (char *fpath) { release (); //surface = SDL_LoadBMP (fpath); surface = IMG_Load (fpath); if (NULL == surface) { std::cerr << "(!)bitmap_data::sdl_load_bmp() " << "SDL_LoadBMP return " << SDL_GetError () << std::endl; throw std::runtime_error ("SDL_LoadBMP() failed!"); } pixel_data = (char *) surface->pixels; width = surface->w; row_size = width; height = surface->h; bytes_size = height * width; depth = 1; bytes_per_pixel = surface->format->BytesPerPixel; SDL_Color *couleurs = surface->format->palette->colors; Sint32 k = 0; for (Sint32 j = 0; j < surface->format->palette->ncolors; j++) { palette[k++] = couleurs->r; palette[k++] = couleurs->g; palette[k++] = couleurs->b; couleurs++; } } /** * Copy a part of the surface in a new surface * @param xcoord * @param ycoord * @param w width of the detination surface * @param h height of the destination surface */ bitmap_data * bitmap_data::cut_to_bitmap (Sint32 xcoord, Sint32 ycoord, Uint32 w, Uint32 h) { bitmap_data *dest = new bitmap_data (); dest->create_surface (w, h); dynamic_cast < surface_sdl * >(this)->cut_to_surface (dest, xcoord, ycoord, w, h); return dest; } tecnoballz-0.93.1/src/controller_explosions.cc0000664000175000017500000001012012412501752020534 0ustar brunobruno/** * @file controller_explosions.cc * @brief Explosions controller * @created 2003-03-02 * @date 2007-09-26 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_explosions.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_explosions.h" #include "../include/handler_audio.h" /** * Create the explosions controller */ controller_explosions::controller_explosions () { littleInit (); max_of_sprites = 28; sprites_have_shades = false; sound_delay = 0; sprite_type_id = sprite_object::EXPLOSION_1; } /** * Release the explosions controller */ controller_explosions::~controller_explosions () { release_sprites_list (); } /** * Create the list of explosions sprites */ void controller_explosions::create_explosions_list () { alloc_sprites_list (); sprite_object *explosion_1 = new sprite_object (); explosion_1->set_object_pos (0); explosion_1->create_sprite (sprite_object::EXPLOSION_1, sprites_bitmap, false); sprites_list[0] = explosion_1; sprites->add (explosion_1); sprite_object *explosion_2 = new sprite_object (); explosion_2->set_object_pos (1); explosion_2->create_sprite (sprite_object::EXPLOSION_2, sprites_bitmap, false); sprites_list[1] = explosion_2; sprites->add (explosion_2); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *explosion = new sprite_object (); explosion->set_object_pos (i); explosion_1->duplicate_to (explosion); sprites_list[i] = explosion; sprites->add (explosion); explosion = explosion_1; explosion_1 = explosion_2; explosion_2 = explosion; } /* Uint32 bobn1 = BOB_EXPLO1; Uint32 bobn2 = BOB_EXPLO2; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *explosion = new sprite_object (); explosion->set_object_pos (i); explosion->create_sprite (bobn1, sprites_bitmap, 0); Sint32 bobnu = bobn2; bobn2 = bobn1; bobn1 = bobnu; sprites_list[i] = explosion; sprites->add (explosion); } */ } /** * Add a new explosion * @param xcoord x coordinate of the explosion * @param ycoord y coordinate of the explosion */ void controller_explosions::add (Uint32 xcoord, Uint32 ycoord) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *explosion = sprites_list[i]; if (explosion->is_enabled) { continue; } if (++sound_delay > 4) { sound_delay = 0; #ifndef SOUNDISOFF audio->play_sound (handler_audio::BIG_EXPLOSION); #endif } explosion->is_enabled = true; explosion->x_coord = xcoord - (explosion->sprite_width / 2); explosion->y_coord = ycoord - (explosion->sprite_height / 2); explosion->frame_index = explosion->frame_index_min; explosion->frame_period = 4 + (random_counter & 7); explosion->frame_delay = explosion->frame_period; explosion->set_image (); return; } } /** * Animation of all explisions */ void controller_explosions::play_animation () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *explosion = sprites_list[i]; if (explosion->is_enabled) { explosion->play_animation_once (); } } } tecnoballz-0.93.1/src/tilesmap_scrolling.cc0000664000175000017500000002746712412501752020006 0ustar brunobruno/** * @file tilesmap_scrolling.cc * @brief Vertical scrolling tiles map in the main menu * and the guardians levels * @date 2014-08-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 22 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: tilesmap_scrolling.cc 22 2014-08-16 11:28:58Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/tilesmap_scrolling.h" #include "../include/handler_resources.h" /** * Create the scrolling tiles map object */ tilesmap_scrolling::tilesmap_scrolling () { object_init (); map_tiles = (Uint16 *) NULL; tiles_bitmap = (bitmap_data *) NULL; tile_width = 16 * resolution; tile_height = 16 * resolution; map_width = MAP_WIDTH; is_40_columns = false; } /** * Release the scrolling tiles map object */ tilesmap_scrolling::~tilesmap_scrolling () { if (NULL != tiles_bitmap) { delete tiles_bitmap; tiles_bitmap = NULL; } if (NULL != map_tiles) { delete[]map_tiles; map_tiles = NULL; } tiles_bitmap = (bitmap_data *) NULL; map_tiles = (Uint16 *) NULL; object_free (); } /** * Return bitmap object * @return a pointer to the bitmap which contains all tiles */ bitmap_data * tilesmap_scrolling::get_bitmap () { return tiles_bitmap; } /** * Perform some initializations * @param pal_id palette number identifier * @param map_id map number identifier */ void tilesmap_scrolling::initialize (Uint32 pal_id, Uint32 map_id) { if (is_verbose) { std::cout << ">tilesmap_scrolling::initialise() Start!" << std::endl; } if (1 == resolution) { is_40_columns = false; } else { is_40_columns = true; } /* load the bitmap of tiles im memory */ tiles_bitmap = new bitmap_data (); if (!is_40_columns) { tiles_bitmap->load (handler_resources::BITMAP_TILESMAP); } else { tile_width = 16; tile_height = 16; map_width = MAP_WIDTH * 2; char *pathname = resources->get_filename (handler_resources::BITMAP_TILESMAP, 1); tiles_bitmap->load (pathname); } tileset_width = tiles_bitmap->get_width () / tile_width; /* load the map file in memory */ load_map (map_id); /** 20 tiles per row */ tiles_per_row = game_screen->get_width () / tile_width; if (is_verbose) { std::cout << "tilesmap_scrolling::initialise() tile_width:" << tile_width << "; tiles_per_row:" << tiles_per_row << std::endl; } y_coord = 0; /* Draw all tiles */ scroll (0); /* initialize color palette */ enable_palette (pal_id); if (is_verbose) { std::cout << ">tilesmap_scrolling::initialise() End!" << std::endl; } } /** * Return width of a tile in pixels * @return width of a tile in pixels */ Uint32 tilesmap_scrolling::get_tiles_width () { return tile_width; } /** * Return y coordinate in the map * @return top left map coordinate */ Sint32 tilesmap_scrolling::get_y_coord () { return y_coord; } /** * Return number of tiles per row in the map * @return number of tiles per row */ Uint32 tilesmap_scrolling::get_map_width () { return map_width; } /* * Load a new map * @param pal_id palette number identifier * @param map_id map number identifier */ void tilesmap_scrolling::switch_map (Uint32 pal_id, Uint32 map_id) { if (NULL != map_tiles) { delete[]map_tiles; map_tiles = NULL; } load_map (map_id); enable_palette (pal_id); y_coord = 0; } /** * Initialize color palette * @param pal_id palette number identifier */ void tilesmap_scrolling::enable_palette (Uint32 pal_id) { SDL_Color *palPT = display->get_palette (); SDL_Color *palP1 = palPT; SDL_Color *palP2 = palP1 + 128; const unsigned char *colPT = colors_map; for (Uint32 i = 0; i < 16; i++) { unsigned char r, b, g; switch (pal_id) { default: r = *(colPT++); g = *(colPT++); b = *(colPT++); break; case 1: r = *(colPT++); b = *(colPT++); g = *(colPT++); break; case 2: b = *(colPT++); g = *(colPT++); r = *(colPT++); break; } palP1->r = r; palP1->g = g; palP1->b = b; palP1->g = g; palP1->b = b; r >>= 1; g >>= 1; b >>= 1; palP2->r = r; palP2->g = g; palP2->b = b; palP1++; palP2++; } display->enable_palette (palPT); game_screen->set_palette (tiles_bitmap); } /** * Scoll the background * @param index */ void tilesmap_scrolling::scroll (Sint32 index) { Sint32 i = y_coord + index; /* 273 * 32 = 8736 pixels */ Sint32 j = MAP_HEIGHT * tile_height; if (i < 0) { i += j; } if (i > j) { i -= j; } y_coord = i; j = i & (tile_height - 1); i /= tile_height; i *= map_width; map_top_screen = map_tiles + i; draw (); } /** * Draw all tiles map */ void tilesmap_scrolling::draw () { offscreen_surface *offscreen = game_screen; SDL_Surface *screen_surface = offscreen->get_surface (); SDL_Surface *tiles_surface = tiles_bitmap->get_surface (); Uint32 voffset = offscreen->get_vertical_offset (); Uint32 height_box = offscreen->get_height () - voffset * 2; /* calculate the height of the tiles of the first line */ Uint32 modulo_y = y_coord % tile_height; Uint32 first_height = tile_height - modulo_y; /* calculate the height of the tiles of the last line, * zero value is * possible */ Uint32 last_height = (height_box - first_height) % tile_height; SDL_Rect rect_src = { 0, 0, 0, 0 }; SDL_Rect rect_dst = { 0, 0, 0, 0 }; rect_dst.y = voffset; Uint32 vcount = (height_box - first_height) / tile_height + 1; rect_src.w = rect_dst.w = tile_width; Uint16 *map = map_top_screen; for (Uint32 v = 0; v <= vcount; v++) { Uint32 yoffset; if (v == 0) { rect_src.h = rect_dst.h = first_height; yoffset = modulo_y; } else { yoffset = 0; if (v < vcount) { rect_src.h = rect_dst.h = tile_height; } else { if (last_height > 0) { rect_src.h = rect_dst.h = last_height; } else { continue; } } } rect_dst.x = 0; for (Uint32 h = 0; h < tiles_per_row; h++) { Uint32 offset = *(map++); rect_src.y = offset / tileset_width; rect_src.x = (offset - rect_src.y * tileset_width) * tile_width; rect_src.y = rect_src.y * tile_height + yoffset; if (SDL_BlitSurface (tiles_surface, &rect_src, screen_surface, &rect_dst) < 0) { std::cerr << "(!)tilesmap_scrolling::draw_tiles() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } rect_dst.x += tile_width; } rect_dst.y += rect_dst.h; } } /** * Alloc a brush bitmap for the map editor * @param map * @param num_of_cols the number of tiles per lines * @param num_of_lines the number of lines * @return a bitmap data object */ bitmap_data * tilesmap_scrolling::alloc_brush (Uint16 * map, Uint32 num_of_cols, Uint32 num_of_lines) { bitmap_data *brush = new bitmap_data (); brush->create_surface (num_of_cols * tile_width, num_of_lines * tile_height); game_screen->set_palette (brush); SDL_Surface *brush_surface = brush->get_surface (); SDL_Surface *tiles_surface = tiles_bitmap->get_surface (); SDL_Rect rect_src; SDL_Rect rect_dst; rect_src.h = rect_dst.h = tile_height; rect_src.w = rect_dst.w = tile_width; if (is_verbose) { std::cout << "tilesmap_scrolling::alloc_brush num_of_cols:" << num_of_cols << " num_of_lines:" << num_of_lines << std::endl; } rect_dst.y = 0; for (Uint32 v = 0; v < num_of_lines; v++) { rect_dst.x = 0; for (Uint32 h = 0; h < num_of_cols; h++) { Uint32 offset = *(map++); rect_src.y = offset / tileset_width; rect_src.x = (offset - rect_src.y * tileset_width) * tile_width; rect_src.y = rect_src.y * tile_height; if (SDL_BlitSurface (tiles_surface, &rect_src, brush_surface, &rect_dst) < 0) { std::cerr << "(!)tilesmap_scrolling::draw_tiles() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } rect_dst.x += tile_width; } rect_dst.y += rect_dst.h; } return brush; } /** * load and convert the map file * @param map_id map number identifier */ void tilesmap_scrolling::load_map (Uint32 map_id) { switch (map_id) { case MAP_GUARDIANS: default: if (is_40_columns) { map_id = handler_resources::MAP_GUARDIANS_40; } else { map_id = handler_resources::MAP_GUARDIANS_20; } break; case MAP_MENU: if (is_40_columns) { map_id = handler_resources::MAP_MENU_40; } else { map_id = handler_resources::MAP_MENU_20; } break; case MAP_CONGRATULATIONS: if (is_40_columns) { map_id = handler_resources::MAP_CONGRATULATIONS_40; } else { map_id = handler_resources::MAP_CONGRATULATIONS_20; } break; } /* * load the map of tiles * size of file: 10,920 bytes <=> 5,460 map tiles * number of column: 20 * number of raw: 273 * size of map code: 2 bytes */ Uint16 *file_data = (Uint16 *) resources->load_data (map_id); /* allocate memory for the map of tiles */ Uint32 add_rows = display->get_height () / tile_height * 2; Uint32 map_size = (add_rows + MAP_HEIGHT) * map_width; try { map_tiles = new Uint16[map_size]; } catch (std::bad_alloc &) { std::cerr << "(!)tilesmap_scrolling::load_map() " "not enough memory to allocate " << map_size << " map elements!" << std::endl; throw; } /* convert "big-endian" to "little-endian" or "big-endian" */ Sint32 i = 0; unsigned char *ptmap = (unsigned char *) file_data; for (Uint32 j = 0; j < (MAP_HEIGHT * map_width); j++) { Uint16 codem = 0; codem = (Uint16) ptmap[0]; codem = codem << 8; codem = codem | ptmap[1]; /* divide by 4, because increment pointer = 4 bytes */ codem = codem >> 2; map_tiles[i++] = codem; ptmap = ptmap + 2; } delete[](char *) file_data; /* copy a height of the screen (for scrolling rotation) */ for (Uint32 j = 0; j < (add_rows * map_width); j++) { map_tiles[i++] = map_tiles[j]; } map_top_screen = map_tiles; } /** * Tileset colors palettes (16 colors) * */ const unsigned char tilesmap_scrolling::colors_map[48] = { 2, 2, 2, 17, 33, 50, 66, 98, 130, 19, 50, 81, 27, 58, 90, 85, 101, 133, 36, 66, 98, 39, 70, 102, 146, 146, 178, 82, 82, 114, 129, 129, 161, 59, 90, 122, 98, 98, 130, 42, 74, 106, 50, 82, 114, 111, 114, 146 }; tecnoballz-0.93.1/src/lispreader.cc0000664000175000017500000006063012412501752016233 0ustar brunobruno/** * @file lispreader.c * @brief Parse configuration file * @created 2007-06-15 * @date 2014-08-15 * @author Mark Probst * @author Ingo Ruhnke * @author Bruno Ethvignot */ /* * copyright (c) 1998-2000 Mark Probst * copyright (c) 2002 Ingo Ruhnke * copyright (c) 2007-2014 TLK Games all rights reserved * $Id: lispreader.cc 21 2014-08-15 20:05:56Z bruno.ethvignot@gmail.com $ * * Powermanga 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. * * Powermanga 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/lispreader.h" #include "../include/handler_resources.h" #include typedef enum { LISP_PATTERN_ANY = 1, LISP_PATTERN_SYMBOL, LISP_PATTERN_STRING, LISP_PATTERN_INTEGER, LISP_PATTERN_REAL, LISP_PATTERN_BOOLEAN, LISP_PATTERN_LIST, LISP_PATTERN_OR } LISP_PATTERN_ENUM; typedef enum { LISP_STREAM_FILE = 1, LISP_STREAM_STRING, LISP_STREAM_ANY } LISP_STREAM_ENUM; typedef enum { TOKEN_ERROR = -1, TOKEN_EOF = 0, TOKEN_OPEN_PAREN, TOKEN_CLOSE_PAREN, TOKEN_SYMBOL, TOKEN_STRING, TOKEN_INTEGER, TOKEN_REAL, TOKEN_PATTERN_OPEN_PAREN, TOKEN_DOT, TOKEN_TRUE, TOKEN_FALSE } TOKEN_ENUM; #define MAX_TOKEN_LENGTH 1024 #define lisp_nil() ((lisp_object_t*)0) #define lisp_nil_p(obj) (obj == 0) #define lisp_integer_p(obj) (lisp_type((obj)) == LISP_TYPE_INTEGER) #define lisp_symbol_p(obj) (lisp_type((obj)) == LISP_TYPE_SYMBOL) #define lisp_string_p(obj) (lisp_type((obj)) == LISP_TYPE_STRING) #define lisp_cons_p(obj) (lisp_type((obj)) == LISP_TYPE_CONS) #define lisp_boolean_p(obj) (lisp_type((obj)) == LISP_TYPE_BOOLEAN) static char token_string[MAX_TOKEN_LENGTH + 1] = ""; static Sint32 token_length = 0; static lisp_object_t end_marker = { LISP_TYPE_EOF, {{0, 0}} }; static lisp_object_t error_object = { LISP_TYPE_PARSE_ERROR, {{0, 0}} }; static lisp_object_t close_paren_marker = { LISP_TYPE_PARSE_ERROR, {{0, 0}} }; static lisp_object_t dot_marker = { LISP_TYPE_PARSE_ERROR, {{0, 0}} }; //static char *lisp_string (lisp_object_t * obj); //static Sint32 lisp_integer (lisp_object_t * obj); //static float lisp_real (lisp_object_t * obj); //static Sint32 lisp_type (lisp_object_t * obj); //static void lisp_dump (lisp_object_t * obj, FILE * out); // /** * Create the lispreader object */ lispreader::lispreader () { root_obj = NULL; lst = NULL; object_init (); } /** * Create the lispreader object */ lispreader::~lispreader () { if (root_obj != NULL) { lisp_free (root_obj); root_obj = NULL; } object_free (); } /** * Clear the current string */ void lispreader::_token_clear (void) { token_string[0] = '\0'; token_length = 0; } /** * Copy current string * @param c A character code of string read currently */ void lispreader::_token_append (char c) { //assert (token_length < MAX_TOKEN_LENGTH); if (token_length >= MAX_TOKEN_LENGTH) { throw std::out_of_range ("token_length < MAX_TOKEN_LENGTH failed"); } token_string[token_length++] = c; token_string[token_length] = '\0'; } /** * Return the next char of the configuratoin file * @param stream Pointer to a lisp_stream_t * @return Code of the char */ Sint32 lispreader::_next_char (lisp_stream_t * stream) { char c; switch (stream->type) { case LISP_STREAM_FILE: return getc (stream->v.file); case LISP_STREAM_STRING: { c = stream->v.string.buf[stream->v.string.pos]; if (c == 0) { return EOF; } ++stream->v.string.pos; return c; } case LISP_STREAM_ANY: return stream->v.any.next_char (stream->v.any.data); } //assert (0); throw std::runtime_error ("Bad value for the variable stream->type"); return EOF; } /** * * @param c * @param stream */ void lispreader::_unget_char (char c, lisp_stream_t * stream) { switch (stream->type) { case LISP_STREAM_FILE: ungetc (c, stream->v.file); break; case LISP_STREAM_STRING: --stream->v.string.pos; break; case LISP_STREAM_ANY: stream->v.any.unget_char (c, stream->v.any.data); break; default: throw std::runtime_error ("Bad value for the variable stream->type"); //assert (0); } } /** * Scan the configuration file * @input stream A pointer to a lisp_stream_t struture * @return A return code */ Sint32 lispreader::_scan (lisp_stream_t * stream) { static const char *delims = "\"();"; Sint32 c; Sint32 have_nondigits; Sint32 have_digits; Sint32 have_floating_point; bool search = true; _token_clear (); do { c = _next_char (stream); if (c == EOF) { return TOKEN_EOF; } /* comment start : all comments are ignored */ else if (c == ';') { while (search) { c = _next_char (stream); if (c == EOF) { return TOKEN_EOF; } else if (c == '\n') { break; } } } } while (isspace (c)); switch (c) { case '(': return TOKEN_OPEN_PAREN; case ')': return TOKEN_CLOSE_PAREN; case '"': while (search) { c = _next_char (stream); if (c == EOF) { return TOKEN_ERROR; } if (c == '"') { break; } if (c == '\\') { c = _next_char (stream); switch (c) { case EOF: return TOKEN_ERROR; case 'n': c = '\n'; break; case 't': c = '\t'; break; } } _token_append ((char) c); } return TOKEN_STRING; case '#': c = _next_char (stream); if (c == EOF) { return TOKEN_ERROR; } switch (c) { case 't': return TOKEN_TRUE; case 'f': return TOKEN_FALSE; case '?': c = _next_char (stream); if (c == EOF) { return TOKEN_ERROR; } if (c == '(') { return TOKEN_PATTERN_OPEN_PAREN; } else { return TOKEN_ERROR; } } return TOKEN_ERROR; default: if (isdigit (c) || c == '-') { have_nondigits = 0; have_digits = 0; have_floating_point = 0; do { if (isdigit (c)) { have_digits = 1; } else if (c == '.') { have_floating_point++; } _token_append ((char) c); c = _next_char (stream); if (c != EOF && !isdigit (c) && !isspace (c) && c != '.' && !strchr (delims, c)) { have_nondigits = 1; } } while (c != EOF && !isspace (c) && !strchr (delims, c)); if (c != EOF) { _unget_char ((char) c, stream); } if (have_nondigits || !have_digits || have_floating_point > 1) { return TOKEN_SYMBOL; } else if (have_floating_point == 1) { return TOKEN_REAL; } else { return TOKEN_INTEGER; } } else { if (c == '.') { c = _next_char (stream); if (c != EOF && !isspace (c) && !strchr (delims, c)) { _token_append ('.'); } else { _unget_char ((char) c, stream); return TOKEN_DOT; } } do { _token_append ((char) c); c = _next_char (stream); } while (c != EOF && !isspace (c) && !strchr (delims, c)); if (c != EOF) { _unget_char ((char) c, stream); } return TOKEN_SYMBOL; } } } /** * Release a object type * @param obj A pointer to a lisp_object_t structure */ void lispreader::lisp_free (lisp_object_t * obj) { if (obj == NULL) { return; } switch (obj->type) { case LISP_TYPE_INTERNAL: case LISP_TYPE_PARSE_ERROR: case LISP_TYPE_EOF: return; case LISP_TYPE_SYMBOL: case LISP_TYPE_STRING: free ((char *) obj->v.string); //delete [] obj->v.string; break; case LISP_TYPE_CONS: case LISP_TYPE_PATTERN_CONS: lisp_free (obj->v.cons.car); lisp_free (obj->v.cons.cdr); break; case LISP_TYPE_PATTERN_VAR: lisp_free (obj->v.pattern.sub); break; } //free_memory ((char *) obj); delete obj; } /** * Create a lisp_object_t structure * @param type A object type code * @return A pointer to a lisp_object_t */ lisp_object_t * lispreader::lisp_object_alloc (Sint32 type) { lisp_object_t *obj = new lisp_object_t; //lisp_object_t *obj = // (lisp_object_t *) memory_allocation (sizeof (lisp_object_t)); obj->type = type; return obj; } /** * Initialize string of steam * @param stream A pointer to a lisp_stream_t structure * @param buf Pointer to string * @return A pointer to a lisp_stream_t structure */ lisp_stream_t * lispreader::lisp_stream_init_string (lisp_stream_t * stream, char *buf) { stream->type = LISP_STREAM_STRING; stream->v.string.buf = buf; stream->v.string.pos = 0; return stream; } /** * Create a integer type * @param value A interger value * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_integer (Sint32 value) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_INTEGER); obj->v.integer = value; return obj; } /** * Create a real type * @param value A real value * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_real (float value) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_REAL); obj->v.real = value; return obj; } /** * Create a symbol type * @param value * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_symbol (const char *value) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_SYMBOL); obj->v.string = strdup (value); return obj; } /** * Create a string type * @param value * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_string (const char *value) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_STRING); obj->v.string = strdup (value); return obj; } /** * Create a "cons" element * @param car Contents of Address register (first element) * @param value cdr (Contents of Decrement register) * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_cons (lisp_object_t * car, lisp_object_t * cdr) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_CONS); obj->v.cons.car = car; obj->v.cons.cdr = cdr; return obj; } /** * Create a boolean type * @param value * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_boolean (Sint32 value) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_BOOLEAN); obj->v.integer = value ? 1 : 0; return obj; } /** * @param car * @param cdr * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_make_pattern_cons (lisp_object_t * car, lisp_object_t * cdr) { lisp_object_t *obj = lisp_object_alloc (LISP_TYPE_PATTERN_CONS); obj->v.cons.car = car; obj->v.cons.cdr = cdr; return obj; } /** * Parse the configuration file * @param in A pointer to a lisp_stream_t structure * @return A pointer to a lisp_object_t structure */ lisp_object_t * lispreader::lisp_read (lisp_stream_t * in) { Sint32 token = _scan (in); lisp_object_t *obj = lisp_nil (); if (token == TOKEN_EOF) { return &end_marker; } switch (token) { case TOKEN_ERROR: return &error_object; case TOKEN_EOF: return &end_marker; case TOKEN_OPEN_PAREN: case TOKEN_PATTERN_OPEN_PAREN: { lisp_object_t *last = lisp_nil (), *car; do { car = lisp_read (in); if (car == &error_object || car == &end_marker) { lisp_free (obj); return &error_object; } else if (car == &dot_marker) { if (lisp_nil_p (last)) { lisp_free (obj); return &error_object; } car = lisp_read (in); if (car == &error_object || car == &end_marker) { lisp_free (obj); return car; } else { last->v.cons.cdr = car; if (_scan (in) != TOKEN_CLOSE_PAREN) { lisp_free (obj); return &error_object; } car = &close_paren_marker; } } else if (car != &close_paren_marker) { if (lisp_nil_p (last)) { obj = last = (token == TOKEN_OPEN_PAREN ? lisp_make_cons (car, lisp_nil ()) : lisp_make_pattern_cons (car, lisp_nil ())); } else { last = last->v.cons.cdr = lisp_make_cons (car, lisp_nil ()); } } } while (car != &close_paren_marker); } return obj; case TOKEN_CLOSE_PAREN: return &close_paren_marker; case TOKEN_SYMBOL: return lisp_make_symbol (token_string); case TOKEN_STRING: return lisp_make_string (token_string); case TOKEN_INTEGER: return lisp_make_integer (atoi (token_string)); case TOKEN_REAL: return lisp_make_real ((float) atof (token_string)); case TOKEN_DOT: return &dot_marker; case TOKEN_TRUE: return lisp_make_boolean (1); case TOKEN_FALSE: return lisp_make_boolean (0); } //assert (0); throw std::runtime_error ("Bad value for the variable tocken"); return &error_object; } /** * Return the code of an object type * @param obj A pointer to a lisp_object_t structure * @return An object type code */ Sint32 lispreader::lisp_type (lisp_object_t * obj) { if (obj == NULL) { return LISP_TYPE_NIL; } return obj->type; } /** * Return integer value of an integer type * @param obj A pointer to a lisp_object_t structure * @return A interger value */ Sint32 lispreader::lisp_integer (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_INTEGER); if (obj->type != LISP_TYPE_INTEGER) { throw std::runtime_error ("obj->type is not a LISP_TYPE_INTEGER"); } return obj->v.integer; } /** * Return string of a symbol type * @param obj A pointer to a lisp_object_t structure * @return A pointer to a string */ char * lispreader::lisp_symbol (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_SYMBOL); if (obj->type != LISP_TYPE_SYMBOL) { throw std::runtime_error ("obj->type is not a LISP_TYPE_SYMBOL"); } return obj->v.string; } /** * Return a string of a string object * @param obj A pointer to a lisp_object_t structure * @return A pointer to a string */ char * lispreader::lisp_string (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_STRING); if (obj->type != LISP_TYPE_STRING) { throw std::runtime_error ("obj->type is not a LISP_TYPE_STRING"); } return obj->v.string; } /** * Return value of a boolean object * @param obj A pointer to a lisp_object_t structure * @return 0 or 1 */ Sint32 lispreader::lisp_boolean (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_BOOLEAN); if (obj->type != LISP_TYPE_BOOLEAN) { throw std::runtime_error ("obj->type is not a LISP_TYPE_BOOLEAN"); } return obj->v.integer; } /** * Return float value of a real type * @param obj A pointer to a lisp_object_t structure * @return A float value */ float lispreader::lisp_real (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_REAL || obj->type == LISP_TYPE_INTEGER); if (obj->type != LISP_TYPE_REAL && obj->type != LISP_TYPE_INTEGER) { throw std::runtime_error ("obj->type is not a LISP_TYPE_REAL or LISP_TYPE_INTEGER"); } if (obj->type == LISP_TYPE_INTEGER) { return (float) (obj->v.integer); } return obj->v.real; } /** * * @param obj A pointer to a lisp_object_t structure * @return */ lisp_object_t * lispreader::lisp_car (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_CONS || obj->type == LISP_TYPE_PATTERN_CONS); return obj->v.cons.car; if (obj->type != LISP_TYPE_CONS && obj->type != LISP_TYPE_PATTERN_CONS) { throw std::runtime_error ("obj->type is not a LISP_TYPE_CONS or LISP_TYPE_PATTERN_CONS"); } return obj->v.cons.car; } /** * * @param obj A pointer to a lisp_object_t structure * @return */ lisp_object_t * lispreader::lisp_cdr (lisp_object_t * obj) { //assert (obj->type == LISP_TYPE_CONS || obj->type == LISP_TYPE_PATTERN_CONS); if (obj->type != LISP_TYPE_CONS && obj->type != LISP_TYPE_PATTERN_CONS) { throw std::runtime_error ("obj->type is not a LISP_TYPE_CONS or LISP_TYPE_PATTERN_CONS"); } return obj->v.cons.cdr; } /** * Dump a lisp_object_t structure * @param obj A pointer to a lisp_object_t structure * @param FILE A output stream */ void lispreader::lisp_dump (lisp_object_t * obj, FILE * out) { char *p; if (obj == 0) { fprintf (out, "()"); return; } switch (lisp_type (obj)) { case LISP_TYPE_EOF: fputs ("#", out); break; case LISP_TYPE_PARSE_ERROR: fputs ("#", out); break; case LISP_TYPE_INTEGER: fprintf (out, "%d", lisp_integer (obj)); break; case LISP_TYPE_REAL: fprintf (out, "%f", lisp_real (obj)); break; case LISP_TYPE_SYMBOL: fputs (lisp_symbol (obj), out); break; case LISP_TYPE_STRING: { fputc ('"', out); for (p = lisp_string (obj); *p != 0; ++p) { if (*p == '"' || *p == '\\') fputc ('\\', out); fputc (*p, out); } fputc ('"', out); } break; case LISP_TYPE_CONS: case LISP_TYPE_PATTERN_CONS: fputs (lisp_type (obj) == LISP_TYPE_CONS ? "(" : "#?(", out); while (obj != 0) { lisp_dump (lisp_car (obj), out); obj = lisp_cdr (obj); if (obj != 0) { if (lisp_type (obj) != LISP_TYPE_CONS && lisp_type (obj) != LISP_TYPE_PATTERN_CONS) { fputs (" . ", out); lisp_dump (obj, out); break; } else fputc (' ', out); } } fputc (')', out); break; case LISP_TYPE_BOOLEAN: if (lisp_boolean (obj)) { fputs ("#t", out); } else { fputs ("#f", out); } break; default: //assert (0); throw std::runtime_error ("Bad value for the variable obj->type"); } } /** * Search a attribute name * @param lst Pointer to a lisp_object_t * @param name String representing the attribute name * @return Pointer to a lisp_object_t object */ lisp_object_t * lispreader::search_for (const char *name) { lisp_object_t *cur; lisp_object_t *cursor = lst; while (!lisp_nil_p (cursor)) { cur = lisp_car (cursor); if (!lisp_cons_p (cur) || !lisp_symbol_p (lisp_car (cur))) { lisp_dump (cur, stdout); std::cerr << "(!!!) LispReader: Read error in search!" << std::endl; } else { if (strcmp (lisp_symbol (lisp_car (cur)), name) == 0) { return lisp_cdr (cur); } } cursor = lisp_cdr (cursor); } return NULL; } /** * Read an integer * @param lst Pointer to a lisp_object_t * @param name String representing the attribute name * @param i Pointer to the integer which will contain the value of the * required attribute * @return true if the attribute were correctly found and read, or false * otherwise */ bool lispreader::read_int (const char *name, Sint32 * i) { lisp_object_t *obj = search_for (name); if (obj == NULL) { return false; } if (!lisp_integer_p (lisp_car (obj))) { std::cerr << "(!) LispReader expected type integer at token: " << name << std::endl; return false; } *i = lisp_integer (lisp_car (obj)); return true; } /** * Read a boolean * @param lst Pointer to a lisp_object_t * @param name String representing the attribute name * @param i Pointer to the boolean which will contain the value of the * required attribute * @return true if the attribute were correctly found and read, or false * otherwise */ bool lispreader::read_bool (const char *name, bool * b) { lisp_object_t *obj = search_for (name); if (obj == NULL) { return false; } if (!lisp_boolean_p (lisp_car (obj))) { std:: cerr << "LispReader expected type bool at token: " << name << std::endl; return false; } *b = lisp_boolean (lisp_car (obj)); return true; } /** * Read a string * @param lst Pointer to a lisp_object_t * @param name String representing the attribute name * @param i Pointer to the string which will contain the value of the * required attribute * @return true if the attribute were correctly found and read, or false * otherwise */ bool lispreader::lisp_read_string (const char *name, char **str) { lisp_object_t *obj = search_for (name); if (obj == NULL) { return false; } if (!lisp_string_p (lisp_car (obj))) { std::cerr << "expected type real at token: " << name << std::endl; return false; } *str = lisp_string (lisp_car (obj)); return true; } /** * Read a string * @param lst Pointer to a lisp_object_t * @param name String representing the attribute name * @param i Pointer to the string which will contain the value of the * required attribute * @return true if the attribute were correctly found and read, or false * otherwise */ bool lispreader::read_string (const char *name, std::string * str) { lisp_object_t *obj = search_for (name); if (obj == NULL) { return false; } if (!lisp_string_p (lisp_car (obj))) { std::cerr << "expected type real at token: " << name << std::endl; return false; } *str = lisp_string (lisp_car (obj)); return true; } /** * Read a configuration file * @param filename The filename specified by path * @return A pointer to a lisp_object_t */ lisp_object_t * lispreader::lisp_read_file (std::string filename) { lisp_stream_t *stream; /* read filedata */ handler_resources *r = handler_resources::get_instance (); char *filedata = r->read_complete_file (filename.c_str()); if (filedata == NULL) { return NULL; } //stream = (lisp_stream_t *) memory_allocation (sizeof (lisp_stream_t)); try { stream = new lisp_stream_t; } catch (std::bad_alloc &) { std::cerr << "not enough memory to allocate 'lisp_stream_t' " << filename << std::endl; delete[]filedata; return NULL; } stream->type = LISP_STREAM_STRING; stream->v.string.buf = filedata; stream->v.string.pos = 0; root_obj = lisp_read (stream); lst = lisp_cdr (root_obj); delete stream; delete[]filedata; return root_obj; } tecnoballz-0.93.1/src/sprite_wall.cc0000664000175000017500000000363312412501752016426 0ustar brunobruno/** * @file sprite_wall.cc * @brief The sprite of the wall used in bricks level * @created 2007-1O-04 * @date 2007-1O-04 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_wall.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_wall.h" sprite_wall * sprite_wall::sprite_wall_singleton = NULL; /** * Create the object */ sprite_wall::sprite_wall() { clear_sprite_members(); thecounter = 0; } /** * Release the object */ sprite_wall::~sprite_wall() { sprite_wall_singleton = NULL; } /** * Get the object instance * sprite_wall is a singleton * @return the sprite_wall object */ sprite_wall * sprite_wall::get_instance () { if (NULL == sprite_wall_singleton) { sprite_wall_singleton = new sprite_wall (); } return sprite_wall_singleton; } /** * Enable the wall * @param counter Delay counter before disabling the wall */ void sprite_wall::enable (Uint32 counter) { thecounter += counter; is_enabled = true; } /** * Disable the wall */ void sprite_wall::disable () { thecounter = 0; is_enabled = false; } tecnoballz-0.93.1/src/controller_indicators.cc0000664000175000017500000001614512412501752020505 0ustar brunobruno/** * @file controller_indicators.cc * @brief Controller of money amount, reverse penalty * @created 2002-11-28 * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_indicators.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_indicators.h" /** * Create the indicators controller */ controller_indicators::controller_indicators () { littleInit (); max_of_sprites = 8; sprites_have_shades = false; y_position = YCOORD_INDICATORS * resolution; sprite_type_id = sprite_object::FONT_MONEY; money_posy = y_position; life_sprite = NULL; reverse_sprite = NULL; money_sprite = NULL; } /** * Release the indicators controller */ controller_indicators::~controller_indicators () { if (NULL != life_sprite) { delete life_sprite; life_sprite = NULL; } if (NULL != reverse_sprite) { delete reverse_sprite; reverse_sprite = NULL; } if (NULL != money_sprite) { delete money_sprite; money_sprite = NULL; } release_sprites_list (); } void controller_indicators::create_indicators_sprites () { create_sprites_list (); /* * money sprite indicator */ controller_moneys *moneys = controller_moneys::get_instance (); sprite_money *money = moneys->get_first_sprite (); money_sprite = new sprite_money (); money->duplicate_to (money_sprite); money_sprite->set_shadow (false); sprites->add (money_sprite); init_money (); /* * reverse sprite is only enable in the bricks levels */ controller_capsules *capsules = controller_capsules::get_instance (); sprite_capsule *caps = capsules->get_first_sprite (); if (current_phase == BRICKS_LEVEL) { reverse_sprite = new sprite_capsule (); caps->duplicate_to (reverse_sprite); reverse_sprite->set_shadow (false); sprites->add (reverse_sprite); Sint32 x = 215 * resolution; reverse_sprite->enable_indicator_capsule (sprite_capsule::INVERSE_CONTROL); reverse_sprite->set_coordinates (x, money_posy); reverse_sprite->set_frame_delay (5); x += reverse_sprite->get_sprite_width (); sprite_object **liste = sprites_list + 6; for (Uint32 i = 0; i < 2; i++) { sprite_object *x_bob = *(liste++); x_bob->set_coordinates (x, money_posy); x += 8 * resolution; } } /* * life sprite is only enable in the guards levels */ if (current_phase == GUARDS_LEVEL) { life_sprite = new sprite_capsule (); caps->duplicate_to (life_sprite); sprites->add (life_sprite); life_sprite->set_shadow (false); Sint32 x = 264 * resolution; life_sprite->enable_indicator_capsule (sprite_capsule::EXTRA_LIFE); life_sprite->set_coordinates (x, money_posy); life_sprite->set_frame_delay (5); x += life_sprite->get_sprite_width (); sprite_object **liste = sprites_list + 6; for (Uint32 i = 0; i < 2; i++) { sprite_object *x_bob = *(liste++); x_bob->set_coordinates (x, money_posy); x += 8 * resolution; x_bob->enable (); } } } /** * initialize credit of money sprites */ void controller_indicators::init_money () { Uint32 x = 24 * resolution; money_sprite->set_coordinates (x, money_posy); money_sprite->set_frame_delay (5); money_sprite->enable (); x += money_sprite->get_sprite_width (); /* chars sprites */ sprite_object **liste = sprites_list; for (Sint32 i = 0; i < 6; i++) { sprite_object *x_bob = *(liste++); x_bob->set_coordinates (x, money_posy); x_bob->enable (); x += 8 * resolution; } } /** * Display amount of money and reverse penalty */ void controller_indicators::display_money_and_reverse () { display_money_amount (); controller_paddles* paddles = controller_paddles::get_instance (); /* display reverse penalty if enable */ sprite_object **chars = sprites_list + 6; Uint32 counter = paddles->get_reverse_counter (); if (counter > 0) { counter--; paddles->set_reverse_counter (counter); counter = counter / 2; Uint32 digits = 10; while (digits > 0) { Uint32 i = 0; while (counter >= digits) { counter -= digits; i++; } digits /= 10; sprite_object *character = *(chars++); character->set_image (i); character->enable (); } reverse_sprite->enable (); reverse_sprite->play_animation_loop (); } else { for (Sint32 i = 0; i < 2; i++) { sprite_object *character = *(chars++); character->disable (); } reverse_sprite->disable (); } } /** * Display amount of money and number of lifes */ void controller_indicators::display_money_and_lifes () { display_money_amount (); Uint32 lifes = current_player->number_of_lifes; Uint32 digits = 10; sprite_object **chars = sprites_list + 6; while (digits > 0) { Sint32 i = 0; while (lifes >= digits) { lifes -= digits; i++; } digits /= 10; sprite_object *character = *(chars++); character->set_image (i); } life_sprite->play_animation_loop (); } /** * Display amount of money */ void controller_indicators::display_money_amount () { Uint32 amount = current_player->amount_of_money; Uint32 digits = 100000; sprite_object **chars = sprites_list; while (digits > 0) { Uint32 i = 0; while (amount >= digits) { amount -= digits; i++; } digits /= 10; sprite_object *character = *(chars++); character->set_y_coord (money_posy); character->set_image (i); } money_sprite->set_y_coord (money_posy); money_sprite->play_animation_loop (); if (money_posy < y_position) { money_posy += resolution; } } /** * Increase the amount of money * @param value money amount, 10, 20, 30, ... */ void controller_indicators::increase_money_amount (Uint32 value) { money_posy = y_position - 5 * resolution; current_player->amount_of_money += value; if (current_player->area_number >= 3) { current_player->amount_of_money += value; } if (current_player->area_number >= 5) { current_player->amount_of_money += value; } } tecnoballz-0.93.1/src/controller_bullets.cc0000664000175000017500000004355112412501752020021 0ustar brunobruno/** * @file controller_bullets.cc * @brief Bullets controller * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_bullets.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_bullets.h" #include "../include/handler_resources.h" /** * Create the bullets controller */ controller_bullets::controller_bullets () { littleInit (); max_of_sprites = 48; sprites_have_shades = false; sprite_type_id = sprite_object::BULLET; } /** * Release the bullets controller */ controller_bullets::~controller_bullets () { release_sprites_list (); } /** * Move all bullets */ void controller_bullets::move () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_bullet *bullet_sprite = sprites_list[i]; bullet_sprite->move (); } } /** * The animations of the bullets are played in loop-mode */ void controller_bullets::play_animation_loop () { sprite_bullet *bullet_sprite = sprites_list[0]; bullet_sprite->play_animation_loop (); Uint32 index = bullet_sprite->get_frame_index (); Uint32 cycle = index & 0X1; if (cycle == 0) { cycle = sprite_object::DRAW_WITH_TABLES; } else { cycle = sprite_object::DRAW_COLOR_CYCLING_MASK; } for (Uint32 i = 1; i < max_of_sprites; i++) { bullet_sprite = sprites_list[i]; bullet_sprite->set_image (index); bullet_sprite->draw_method = cycle; } } /** * Check collisions between bullets and the paddle */ void controller_bullets::check_paddle_collisions () { controller_paddles* paddles = controller_paddles::get_instance (); sprite_paddle *paddle = paddles->get_paddle (controller_paddles::BOTTOM_PADDLE); controller_explosions* explosions = controller_explosions::get_instance (); Sint32 y1_paddle = paddle->get_y_coord (); Sint32 x1_paddle = paddle->get_x_coord (); Sint32 x2_paddle = x1_paddle + paddle->get_length (); Sint32 y2_paddle = y1_paddle + paddle->get_sprite_height (); for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_bullet *bullet = sprites_list[i]; if (!bullet->is_enabled) { continue; } Sint32 y_bullet = bullet->y_coord; if (y_bullet >= y2_paddle) { continue; } Sint32 x_bullet = bullet->x_coord; if (x_bullet >= x2_paddle) { continue; } y_bullet += bullet->sprite_height; if (y_bullet <= y1_paddle) { continue; } x_bullet += bullet->sprite_width; if (x_bullet <= x1_paddle) { continue; } bullet->is_enabled = false; if (paddle->is_invincible ()) { continue; } paddle->set_invincibility (100); current_player->remove_life (1); #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_EXPLOSION); audio->play_sound (handler_audio::LOST_LIFE); #endif explosions->add (x1_paddle + paddle->get_length () / 2, y1_paddle + paddle->get_sprite_height () / 2); } } /** * Return the last bullet object of the list */ sprite_bullet * controller_bullets::get_last_bullet () { return sprites_list[max_of_sprites - 1]; } /** * Fire some bullets */ void controller_bullets::fire (Uint32 fire_id, sprite_guardian * guardian) { switch (fire_id) { case 0: init_fire_01 (guardian); break; case 4: init_fire_02 (guardian); break; case 8: init_fire_03 (guardian); break; case 12: init_fire_04 (guardian); break; case 16: init_fire_05 (guardian); break; case 20: init_fire_06 (guardian); break; case 24: init_fire_07 (guardian); break; case 28: init_fire_08 (guardian); break; case 32: init_fire_09 (guardian); break; case 36: init_fire_10 (guardian); break; case 40: init_fire_11 (guardian); break; } } /** * Initialize the fire 1 composed of 12 bullets * @param guardian a guardian sprite */ void controller_bullets::init_fire_01 (sprite_guardian * guardian) { Sint32 index = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord - (16 * resolution); Sint32 gardy = guardian->y_coord; Uint32 count = 12; Sint32 s = 0; //pointeur sur la table sinus do { sprite_bullet *bullet = sprites_list[index]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 1; bullet->x_coord = tir01_posi[s] * resolution + gardx; bullet->tablesinus = tir01_posi; bullet->flagDepla1 = s; //pointeur table sinus x bullet->flagDepla2 = gardx; //sauve position x bullet->y_coord = gardy; // position y du tir gardy = gardy + 5 * resolution; s = s + 5; if (count-- == 7) { gardy = guardian->y_coord; } } } while (count > 0 && --index >= 0); } /** * Initialize the "buzz saw" fire composed of 10 bullets * @param guardian a guardian sprite */ void controller_bullets::init_fire_02 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; Sint32 s = 0; Sint32 n = 10; //10 objets pour ce tir do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; if (n > 3) { bullet->displacement = 2; bullet->flagDepla3 = s; s = s + 2; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; bullet->tablesinus = fire_sinus; if (--n == 3) { gardx = gardx - 10 * resolution; } } else { bullet->displacement = 3; bullet->x_coord = gardx; bullet->y_coord = gardy; gardx = gardx + 10 * resolution; n--; } } } while (n > 0 && --t >= 0); } /** * Initialize the "xevious" fire composed of 4 bullets * @param guardian A guardian sprite */ void controller_bullets::init_fire_03 (sprite_guardian * guardian) { controller_paddles* paddles = controller_paddles::get_instance (); sprite_paddle *paddle = paddles->get_paddle (controller_paddles::BOTTOM_PADDLE); Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; /* fire composed of 5 objects */ Sint32 n = 5; do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->paddle_target = paddle; bullet->is_enabled = true; if (n == 1) { bullet->displacement = 7; bullet->x_coord = gardx; bullet->y_coord = gardy; } else { bullet->displacement = 6; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; switch (n) { case 5: bullet->tablesinus = fire_sinus; bullet->flagDepla3 = 0; break; case 4: bullet->tablesinus = fire_sinus; bullet->flagDepla3 = 28; break; case 3: bullet->tablesinus = tir02_posi; bullet->flagDepla3 = 0; break; case 2: bullet->tablesinus = tir02_posi; bullet->flagDepla3 = 28; break; } } n--; } } while (n > 0 && --t >= 0); } // *-----------------*TIR 04, scie circulaire II, 7 bobs*----------------------* void controller_bullets::init_fire_04 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; Sint32 s = 0; Sint32 n = 7; //7 objets pour ce tir const Sint16 *ptir = tir04_posi; do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 4; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; bullet->flagDepla3 = s; bullet->flagDepla4 = 1; bullet->flagDepla5 = 10; bullet->flagDepla6 = *(ptir++); bullet->flagDepla7 = *(ptir++); bullet->tablesinus = fire_sinus; s = s + 8; n--; } } while (n > 0 && --t >= 0); } // **--------------------* TIR 05, automatique 9 coups *---------------------** void controller_bullets::init_fire_05 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; Sint32 tempo = 10; Sint32 incrx = -5 * resolution; Sint32 n = 9; //9 objets pour ce tir do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 5; bullet->x_coord = gardx; bullet->y_coord = gardy; bullet->flagDepla1 = tempo; tempo += 15; bullet->flagDepla2 = incrx; incrx += resolution; bullet->flagDepla3 = 5 * resolution; n--; } } while (n > 0 && --t >= 0); } // **---------------------* TIR 06, scie circulaire III *---------------------** void controller_bullets::init_fire_06 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 s = 0; Sint32 n = 30; //30 objets pour ce tir do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 8; bullet->ptguardian = guardian; bullet->flagDepla3 = s; bullet->flagDepla4 = 2 * resolution; bullet->tablesinus = handler_resources::cosinus360; bullet->tablecosin = handler_resources::zesinus360; s = s + 12; n--; } } while (n > 0 && --t >= 0); } // **---------------------* TIR 07, scie circulaire IV *---------------------** void controller_bullets::init_fire_07 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; Sint32 s = 0; Sint32 n = 10; //10 objets pour ce tir do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 9; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; bullet->flagDepla3 = s; bullet->flagDepla4 = 1; bullet->tablesinus = handler_resources::cosinus360; bullet->tablecosin = handler_resources::zesinus360; s = s + 36; n--; } } while (n > 0 && --t >= 0); } // **----------------------* TIR 08, scie circulaire V *----------------------** void controller_bullets::init_fire_08 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; Sint32 s = 0; Sint32 n = 10; //10 objets pour ce tir Sint32 tempo = 20; do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 10; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; bullet->flagDepla3 = s; s += 72; bullet->flagDepla4 = 0; bullet->flagDepla5 = tempo; bullet->tablesinus = handler_resources::cosinus360; bullet->tablecosin = handler_resources::zesinus360; n--; if (n == 5) { gardy = gardy + 25 * resolution; tempo = 1; } } } while (n > 0 && --t >= 0); } // **--------------------------* TIR 09, triangle *----------------------------* void controller_bullets::init_fire_09 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; Sint32 s = 0; Sint32 n = 9; //10 objets pour ce tir do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 11; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; bullet->tablesinus = handler_resources::cosinus360; bullet->tablecosin = handler_resources::zesinus360; bullet->flagDepla3 = s; s += 120; n--; if (n == 6) { s = 0; gardx += (16 * resolution); } else { if (n == 3) { s = 0; gardx -= (8 * resolution); } } } } while (n > 0 && --t >= 0); } // **---------------------** tir 10, epee de DAMOCLES **----------------------** void controller_bullets::init_fire_10 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord - (17 * resolution); Sint32 gardy = guardian->y_coord + guardian->gard_ycent - (10 * resolution); const Sint16 *ptir = tir10_posi; Sint32 n = 6; //6 objets pour ce tir do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 3; bullet->x_coord = gardx + (*(ptir++) * bullet->sprite_width); bullet->y_coord = gardy + (*(ptir++) * bullet->sprite_height); n--; } } while (n > 0 && --t >= 0); } // *=-----------------------=* TIR 11, triangle II *=-------------------------=* void controller_bullets::init_fire_11 (sprite_guardian * guardian) { Sint32 t = max_of_sprites - 1; Sint32 gardx = guardian->x_coord + guardian->canon_xcoord; Sint32 gardy = guardian->y_coord + guardian->gard_ycent; /* 15 bullets for this fire */ Sint32 n = 15; Sint32 inc_x = 0; Sint32 inc_y = 5 * resolution; Sint32 s = 0; do { sprite_bullet *bullet = sprites_list[t]; if (!bullet->is_enabled) { bullet->is_enabled = true; bullet->displacement = 12; bullet->flagDepla1 = gardx; bullet->flagDepla2 = gardy; bullet->flagDepla3 = s; bullet->flagDepla4 = inc_x; bullet->flagDepla5 = inc_y; bullet->tablesinus = handler_resources::cosinus360; bullet->tablecosin = handler_resources::zesinus360; s += 72; n--; if (n == 10) { s = 0; inc_x = -1 * resolution; inc_y = 4 * resolution; } else { if (n == 5) { s = 0; inc_x = 1 * resolution; inc_y = 4 * resolution; } } } } while (n > 0 && --t >= 0); } // tir gardien : table sinus --------------------------------------------------- const Sint16 controller_bullets::tir01_posi[62] = { 32, 32, 32, 31, 31, 30, 29, 28, 27, 25, 24, 22, 21, 19, 17, 16, 14, 12, 11, 9, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 9, 11, 12, 14, 16, 17, 19, 21, 22, 24, 25, 27, 28, 29, 30, 31, 31, 32, 32, 32, 99, 99 }; // tir gardien : table de points d'un cercle de 8 pixels de rayon -------------- const Sint16 controller_bullets::tir02_posi[60] = { 8, 0, 8, -1, 6, -3, 4, -4, 3, -6, 1, -8, 0, -8, 0, -8, -1, -8, -3, -6, -4, -4, -6, -3, -8, -1, -8, 0, -8, 0, -8, 1, -6, 3, -4, 4, -3, 6, -1, 8, 0, 8, 0, 8, 1, 8, 3, 6, 4, 4, 6, 3, 8, 1, 8, 0, 99, 99, 99, 99 }; // tir gardien : table des directions de la roue accelerante ------------------- const Sint16 controller_bullets::tir04_posi[14] = { -1, 5, 3, 5, 1, 6, -2, 6, 0, 6, -1, 4, 2, 6 }; // tir gardien : position des points, epee d'DAMOCLES ------------------------- const Sint16 controller_bullets::tir10_posi[12] = { 1, 0, 0, 1, 1, 1, 2, 1, 1, 2, 1, 3 }; // anciennement appelle sinus ------------------------------------------------- const Sint16 controller_bullets::fire_sinus[60] = { 15, -3, 13, -7, 11, -10, 9, -12, 7, -13, 3, -15, 0, -15, -3, -15, -6, -14, -9, -12, -11, -10, -13, -7, -14, -4, -15, -1, -15, 3, -13, 7, -11, 10, -9, 12, -7, 13, -3, 15, 0, 15, 3, 15, 6, 14, 9, 12, 11, 10, 13, 7, 14, 4, 15, 1, 99, 99, 99, 99 }; tecnoballz-0.93.1/src/sprite_eye.cc0000664000175000017500000000235112412501752016245 0ustar brunobruno/** * @file sprite_eye.cc * @brief The sprite of the eye used in bricks level * @created 2004-09-17 * @date 2007-09-12 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_eye.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_eye.h" /** * Create the object */ sprite_eye::sprite_eye() { clear_sprite_members(); } /** * Release the object */ sprite_eye::~sprite_eye() { } tecnoballz-0.93.1/src/sprite_ball.cc0000664000175000017500000003424612412501752016405 0ustar brunobruno/** * @file sprite_ball.cc * @brief The ball sprite * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 20 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_ball.cc 20 2014-08-05 19:43:55Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_ball.h" /** * Create the ball sprite */ sprite_ball::sprite_ball () { clear_sprite_members (); once_init (0, 0, (sprite_paddle *) NULL, velocities_speed_1, 0); } /** * Release the ball sprite */ sprite_ball::~sprite_ball () {} bool sprite_ball::is_collisions_point_initialized = false; /** * Correct the collisions point of ball adapted from * resolution */ void sprite_ball::init_collisions_points () { if (is_collisions_point_initialized) { return; } is_collisions_point_initialized = true; for (Uint32 i = 0; i < 8; i++) { brick_collision_points_1[i] *= resolution; brick_collision_points_2[i] *= resolution; brick_collision_points_3[i] *= resolution; } } /** * perform some initializations * @param start Time before the ball leaves the paddle (first time) * @param speed Time before the ball accelerates * @param paddle Default paddle * @param table Speed of the ball from 1 to 4 * @param w Width of a brick in pixels */ void sprite_ball::once_init (Sint32 start, Sint32 speed, sprite_paddle * paddle, Sint16 * table, Sint32 w) { start_delay = start; accelerate_delay = speed; initial_velocities = table; disable (); sticky_paddle_num = 0; start_delay_counter = 0; brick_width = w; set_initial_values (paddle); } /** * Restarts the ball * @param paddle pointer to a paddle sprite */ void sprite_ball::starts_again (sprite_paddle * paddle) { enable (); start_delay_counter = start_delay; sticky_paddle_num = paddle->get_paddle_number (); set_initial_values (paddle); select_image (); } /** * Remove the ball */ void sprite_ball::remove (sprite_paddle * paddle) { disable (); sticky_paddle_num = 0; start_delay_counter = 0; set_initial_values (paddle); select_image (); } /** * Set initial values of the ball * @param paddle pointer to a paddle sprite */ void sprite_ball::set_initial_values (sprite_paddle * paddle) { accelerate_delay_counter = accelerate_delay; collision_width = WIDTH_1 * resolution; collision_height = WIDTH_1 * resolution; direction = 0; previous_direction = direction; change_direction_count = 0; paddle_touched = paddle; stick_paddle = paddle; velocities = initial_velocities; brick_collision_points = brick_collision_points_1; strength1 = 1; strength2 = brick_width; ejector_delay = 0; ejector_table = NULL; tilt_delay_counter = 0; viewfinder_direction = 1; viewfinder_delay = 1; size_id = SIZE_1; type = NORMAL; last_hited_wall = 0; } /** * Initialize a first ball in a level sticked on the paddle * @param w Width of the paddle */ void sprite_ball::init_first_ball (Sint32 w) { enable (); sprite_paddle *paddle = stick_paddle; starts_again (paddle); x_coord = paddle->get_x_coord () + ((w >> 1) - ((collision_width >> 1) + 1)); y_coord = paddle->get_y_coord () - collision_height - 1; } /** * Disable sticked ball */ void sprite_ball::disable_stick () { sticky_paddle_num = 0; start_delay_counter = 0; } /** * Return speed ball * @param speed Speed of the ball from 1 to 4 * @return Pointer to a displacement offsets table */ Sint16 * sprite_ball::get_velocities (Sint32 speed) { switch (speed) { case 1: return velocities_speed_1; case 2: return velocities_speed_2; case 3: return velocities_speed_3; case 4: return velocities_speed_4; } return velocities_speed_1; } /** * Return the last touched paddle * @return a pointer to a paddle sprite */ sprite_paddle * sprite_ball::get_last_paddle_touched () { return paddle_touched; } /** * Duplicate this ball from another ball * @param ball ball template * @param angle angle from 0 to 63 */ void sprite_ball::duplicate_from (sprite_ball * ball, Uint32 angle) { is_enabled = true; x_coord = ball->x_coord; y_coord = ball->y_coord; direction = angle; sticky_paddle_num = 0; tilt_delay_counter = 0; size_id = ball->size_id; type = ball->type; collision_width = ball->collision_width; collision_height = ball->collision_height; paddle_touched = ball->paddle_touched; stick_paddle = ball->stick_paddle; velocities = ball->velocities; brick_collision_points = ball->brick_collision_points; strength1 = ball->strength1; strength2 = ball->strength2; select_image (); } /** * Enable the ball power 1 */ void sprite_ball::set_power_1 () { type = POWER_1; select_image (); } /** * Enable the ball power 2 */ void sprite_ball::set_power_2 () { type = POWER_2; select_image (); } /** * Enable the ball size */ void sprite_ball::set_size_2 () { strength1 = 2; strength2 = brick_width * 2; collision_width = WIDTH_2 * resolution; collision_height = WIDTH_2 * resolution; size_id = SIZE_2; brick_collision_points = brick_collision_points_2; select_image (); } /** * Enable the ball size 3 */ void sprite_ball::set_size_3 () { strength1 = 3; strength2 = brick_width * 3; collision_width = WIDTH_3 * resolution; collision_height = WIDTH_3 * resolution; size_id = SIZE_3; brick_collision_points = brick_collision_points_3; select_image (); } /** * Set the fastest speed */ void sprite_ball::set_maximum_speed () { velocities = velocities_speed_3; } /** * Enable a ball on a ejector * @param id Ejector identifier from 0 to 3 * @param delay Time delay before the ejection of the ball */ void sprite_ball::enbale_on_ejector (Uint32 id, Uint32 delay) { is_enabled = true; id &= 3; ejector_delay = delay; ejector_table = ball_ejectors[id]; x_coord = ejector_coords[id].x_coord; y_coord = ejector_coords[id].y_coord; /* the ball's motionless */ direction = 64; } /** * Set the ball on an ejector * @param id Ejector identifier from 0 to 3 * @param delay Time delay before the ejection of the ball */ void sprite_ball::set_on_ejector (Uint32 id, Uint32 delay) { id &= 3; ejector_table = ball_ejectors[id]; ejector_delay = delay; direction = 64; current_player->add_score (10); #ifndef SOUNDISOFF audio->play_sound (handler_audio::ECJECTOR_IN); #endif } /** * Select the ball image */ void sprite_ball::select_image () { frame_index = size_id + type; set_image (frame_index); } /** * Accelerate the ball */ void sprite_ball::accelerate () { if (--accelerate_delay_counter > 1) { return; } accelerate_delay_counter = accelerate_delay; if (velocities == velocities_speed_1) { velocities = velocities_speed_2; return; } if (velocities == velocities_speed_2) { velocities = velocities_speed_3; return; } if (velocities == velocities_speed_3) { velocities = velocities_speed_4; } } /** + * Check collision beetween a ball and another sprite. + * Override sprite_object::collision(sprite_object *). + * @param sprite Pointer to a sprite object + * @return true if collision occurs, otherwise false + */ bool sprite_ball::collision (sprite_object * sprite) { Sint32 x1 = previous_x_coord; Sint32 y1 = previous_y_coord; Sint32 x2 = x_coord; Sint32 y2 = y_coord; Sint32 w = collision_width; /* Check collision between the four segments made by * the "ball-box" during its motion */ return sprite->collision(x1, y1, x2, y2) || sprite->collision(x1 + w, y1, x2 + w, y2) || sprite->collision(x1, y1 + w, x2, y2 + w) || sprite->collision(x1 + w, y1 + w, x2 + w, y2 + w); } /** Collision points of the ball 1 with a brick */ Sint32 sprite_ball::brick_collision_points_1[8] = { 5, 3, 3, 0, 0, 3, 3, 5 }; /** Collision points of the ball 2 with a brick */ Sint32 sprite_ball::brick_collision_points_2[8] = { 7, 4, 4, 0, 0, 4, 4, 7 }; /** Collision points of the ball 3 with a brick */ Sint32 sprite_ball::brick_collision_points_3[8] = { 9, 5, 5, 0, 0, 5, 5, 9 }; /* directions of a ball from 0 to 60 * 16 * 20/\ 12 * 24 || 08 * 28 || 04 * 32<=====64=====> 00 * 36 || 60 * 40 || 56 * 44\/52 * 48 */ /** Displacement offsets of speed 1 */ Sint16 sprite_ball::velocities_speed_1[] = { /* 0 */ +2, 0, /* 4 */ +2, -1, /* 8 */ +2, -2, /* 12 */ +1, -2, /* 16 */ 0, -2, /* 20 */ -1, -2, /* 24 */ -2, -2, /* 28 */ -2, -1, /* 32 */ -2, 0, /* 36 */ -2, +1, /* 40 */ -2, +2, /* 44 */ -1, +2, /* 48 */ 0, +2, /* 52 */ +1, +2, /* 56 */ +2, +2, /* 60 */ +2, +1, /* 64 */ 0, 0 }; Sint16 sprite_ball::velocities_speed_2[] = { 3, 0, 3, -1, 2, -2, 1, -3, 0, -3, -1, -3, -2, -2, -3, -1, -3, 0, -3, 1, -2, 2, -1, 3, 0, 3, 1, 3, 2, 2, 3, 1, 0, 0}; Sint16 sprite_ball::velocities_speed_3[] = { 4, 0, 4, -1, 3, -3, 1, -4, 0, -4, -1, -4, -3, -3, -4, -1, -4, 0, -4, 1, -3, 3, -1, 4, 0, 4, 1, 4, 3, 3, 4, 1, 0, 0}; Sint16 sprite_ball::velocities_speed_4[] = { 5, 0, 5, -2, 4, -4, 2, -5, 0, -5, -2, -5, -4, -4, -5, -2, -5, 0, -5, 2, -4, 4, -2, 5, 0, 5, 2, 5, 4, 4, 5, 2, 0, 0}; /** Coordinates of the balls on the ejectors */ ball_ejector_coords sprite_ball::ejector_coords[] = { /* 1: top-left */ {8, 8} , /* 3: bottom-left */ {8, 3} , /* 4: bottom-right */ {3, 3} , /* 2: top-right */ {3, 8} }; /** Possible directions of a ball when * a player activates the tilt */ const Sint32 sprite_ball::tilt_directions[16][16] = { {4, 4, 8, 12, 16, 20, 24, 28, 28, 36, 40, 44, 48, 52, 56, 60}, {8, 8, 8, 12, 16, 20, 24, 28, 28, 40, 40, 44, 48, 52, 56, 60}, {4, 4, 12, 12, 16, 20, 24, 28, 28, 36, 44, 44, 48, 52, 56, 60}, {4, 4, 8, 16, 16, 20, 24, 28, 28, 36, 40, 48, 48, 52, 56, 60}, {4, 4, 8, 12, 20, 20, 24, 28, 28, 36, 40, 44, 52, 52, 56, 60}, {4, 4, 8, 12, 16, 24, 24, 28, 28, 36, 40, 44, 48, 56, 56, 60}, {4, 4, 8, 12, 16, 20, 20, 28, 28, 36, 40, 44, 48, 52, 60, 60}, {4, 4, 8, 12, 16, 20, 24, 24, 36, 36, 40, 44, 48, 52, 56, 56}, {4, 4, 8, 12, 16, 20, 24, 28, 28, 36, 40, 44, 48, 52, 56, 60}, {8, 8, 8, 12, 16, 20, 24, 28, 28, 40, 40, 44, 48, 52, 56, 60}, {4, 4, 12, 12, 16, 20, 24, 28, 28, 36, 44, 44, 48, 52, 56, 60}, {4, 4, 8, 16, 16, 20, 24, 28, 28, 36, 40, 40, 48, 52, 56, 60}, {4, 4, 8, 12, 12, 20, 24, 28, 28, 36, 40, 44, 44, 52, 56, 60}, {4, 4, 8, 12, 16, 24, 24, 28, 28, 36, 40, 44, 48, 56, 56, 60}, {4, 4, 8, 12, 16, 20, 20, 28, 28, 36, 40, 44, 48, 52, 52, 60}, {4, 4, 8, 12, 16, 20, 24, 24, 36, 36, 40, 44, 48, 52, 56, 56} }; /** Directions possible that a ball can set when it leave * the top-left ejector */ Sint32 sprite_ball::ball_ejector_1[] = { 52, 56, 60, 60, 52, 56, 60, 60, 52, 52, 56, 52, 52, 60, 56, 52, 56, 56 }; /** Directions possible that a ball can set when it leave * the bottom-left ejector */ Sint32 sprite_ball::ball_ejector_2[] = { 8, 4, 12, 12, 8, 4, 4, 12, 8, 4, 12, 4, 8, 12, 4, 8, 12, 4, 4 }; /** Directions possible that a ball can set when it leave * the bottom-right ejector */ Sint32 sprite_ball::ball_ejector_3[] = { 20, 28, 24, 20, 20, 28, 28, 24, 20, 28, 24, 24, 28, 28, 20, 20, 24, 24, 28 }; /** Directions possible that a ball can set when it leave * the top-right ejector */ Sint32 sprite_ball::ball_ejector_4[] = { 36, 44, 40, 36, 36, 44, 44, 40, 40, 36, 44, 40, 40, 36, 36, 44, 44, 40, 36 }; /** Pointers of directions possible that a ball can * set when it leave one a ejector */ Sint32 * sprite_ball::ball_ejectors[4] = { ball_ejector_1, ball_ejector_2, ball_ejector_3, ball_ejector_4 }; tecnoballz-0.93.1/src/controller_guardians.cc0000664000175000017500000006404312412501752020323 0ustar brunobruno/** * @file controller_guardians.cc * @brief Guardians controller * @created 2003-01-10 * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_guardians.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_guardians.h" #include "../include/handler_resources.h" #include "../include/handler_levels.h" /** * Create the guardians controller */ controller_guardians::controller_guardians () { littleInit (); max_of_sprites = 2; sprites_have_shades = true; sprite_type_id = sprite_object::MEDIUM_GUARDIAN_AREA_1A; offset_ptr = 0; scrollTemp = 0; } /** * Release the guardians controller */ controller_guardians::~controller_guardians () { if (NULL != displacement_curve) { delete[](char *) displacement_curve; displacement_curve = NULL; } if (NULL != life_gauges_list) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sprite = life_gauges_list[i]; if (NULL != sprite) { delete sprite; life_gauges_list[i] = NULL; } } delete[]life_gauges_list; life_gauges_list = NULL; } release_sprites_list (); } /** * Create and initialize the guardians and life gauges sprites * @param grdPt */ void controller_guardians::create_guardians_list (Sint32 grdPt) { /* count the number of guardians, 1 or 2 guardians */ max_of_sprites = -1; Sint32 i; Sint32 j = grdPt; Uint32 free_sprites = sprites->get_sprites_remaining (); do { i = level_list[j++]; max_of_sprites++; if (max_of_sprites > free_sprites ) { std::cerr << "(!)controller_guardians::" << "create_guardians_list() maximum number of sprites " << "has been reached!"; throw std::runtime_error ("(!)controller_guardians::" "create_guardians_list() maximum " "number of sprites has been " "reached!"); } } while (i >= 0); /* loading curves file of all guards (23304 bytes) */ displacement_curve = (unsigned char *) resources->load_data (handler_resources::RESGCURVES); /* allocate memory for the "sprite_guardian" object(s) */ alloc_sprites_list (); /* initialize the guardian(s) sprite(s) */ for (Uint32 i = 0; i < max_of_sprites; i++) { Sint32 p = level_list[grdPt++]; sprite_guardian *guard = new sprite_guardian (); guard->set_object_pos (i); guard->create_sprite (guard_list[p].para_nsbob, sprites_bitmap, true); sprites_list[i] = guard; sprites->add (guard); guard->enable (); guard->initialize (&guard_list[p], getLissaPt (guard_list[p].para_lissa)); } /* * Create the life gauges sprites */ try { life_gauges_list = new sprite_object *[max_of_sprites]; } catch (std::bad_alloc &) { std:: cerr << "(!)controller_guardians::create_guardians_list() " "not enough memory to allocate " << max_of_sprites << " list elements!" << std::endl; throw; } for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_object *sprite = new sprite_object (); life_gauges_list[i] = sprite; sprite->set_object_pos (i); sprite->create_sprite (sprite_object::LIFE_GAUGE, sprites_bitmap, false); sprites->add (sprite); sprite->set_coordinates (i * 16 * resolution, 0); sprite->enable (); sprite->enable_vertical_repeat (20); } set_gauge_height (); } /** * Calcul the position and number of repetition of the life gauges */ void controller_guardians::set_gauge_height () { Uint32 y_base = 238 * resolution; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_guardian *guard_sprite = sprites_list[i]; sprite_object *gauge_sprite = life_gauges_list[i]; if (!guard_sprite->energy_level) { gauge_sprite->disable (); break; } Uint32 h = guard_sprite->energy_level / 4; gauge_sprite->enable_vertical_repeat (h); if (0 == h) { h = 1; } Sint32 y = y_base - h * gauge_sprite->get_sprite_height (); gauge_sprite->set_y_coord (y); } } /** * Move the guardians, and fire bullets and gigablitz */ void controller_guardians::run () { offset_ptr++; offset_ptr = offset_ptr & 255; Uint32 voffset = offzetbyte[offset_ptr] * resolution; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_guardian *guard_sprite = sprites_list[i]; guard_sprite->run (voffset); } set_gauge_height (); } /** * check if the guardian's level is finished * @return true if all guardians was destroyed */ bool controller_guardians::is_guardians_destroyed () { bool is_finished = true; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_guardian *guard_sprite = sprites_list[i]; if (guard_sprite->energy_level > 0) { is_finished = false; } } return is_finished; } void controller_guardians::killguards (Sint32 numGa) { switch (numGa) { case 2: if (max_of_sprites > 1) { if (sprites_list[1]->energy_level) { sprites_list[1]->energy_level = 0; sprites_list[1]->explode_delay_counter = 500; } } break; case 1: if (sprites_list[0]->energy_level) { sprites_list[0]->energy_level = 0; sprites_list[0]->explode_delay_counter = 500; } break; default: if (max_of_sprites > 1) { if (sprites_list[1]->energy_level) { sprites_list[1]->energy_level = 0; sprites_list[1]->explode_delay_counter = 500; } } if (sprites_list[0]->energy_level) { sprites_list[0]->energy_level = 0; sprites_list[0]->explode_delay_counter = 500; } break; } } /** * Return speed and direction of the vertical scrolling * @param ntype * @param speed the current speed of the scrolling * @param ball the first found ball * @param weapo the first found bullet * @return the speed of the scrolling */ Sint32 controller_guardians::get_scrolling_speed (Uint32 ntype, Sint32 speed, sprite_ball * ball, sprite_bullet * weapo) { sprite_guardian *guard1, *guard2; Sint32 res = resolution; if (max_of_sprites < 1) { return speed; } guard1 = sprites_list[0]; if (max_of_sprites > 1) { guard2 = sprites_list[1]; } else { guard2 = guard1; } switch (ntype) { /* medium area 1 (SCROLL DOWN) */ case 1: if (0 == guard1->energy_level && 0 == guard2->energy_level) { speed = 2; } else { if (0 == guard1->energy_level || 0 == guard2->energy_level) { speed = 1; } else { speed = 0; } } break; /* final area 1 (SCROLL GUARD 1) */ case 2: if (guard1->energy_level != 0) { Sint32 guard_ycoord = guard1->y_coord; if (scrollTemp) { guard_ycoord = scrollTemp - guard_ycoord; guard_ycoord = guard_ycoord >> 1; if (guard_ycoord != 0) { speed = guard_ycoord; } } scrollTemp = guard1->y_coord; } break; /* medium area 2 (SCROLL COLLISION 1) */ case 3: if (guard1->recently_touched > 0 && guard1->energy_level > 0) { speed = -1; } else { if (guard2->recently_touched > 0 && guard2->energy_level > 0) { speed = 1; } } break; /* final area 2 (SCROLL BALL 1) */ case 4: if (guard1->energy_level) { if (ball->sticky_paddle_num > 0 || !ball->is_enabled) { speed = -1; scrollTemp = 0; } else { Sint32 guard_ycoord = ball->y_coord; if (scrollTemp) { guard_ycoord = scrollTemp - guard_ycoord; guard_ycoord = guard_ycoord >> 1; if (guard_ycoord) speed = guard_ycoord; } scrollTemp = ball->y_coord; } } break; /* medium area 3 (SCROLL COLLISION 2) */ case 5: if (guard1->recently_touched > 0 && guard1->energy_level) { if (--speed < (-4 * res)) { speed = (-4 * res); } } else { if (guard2->recently_touched > 0 && guard2->energy_level) { if (++speed > (4 * res)) { speed = (4 * res); } } } break; /* final area 3 (SCROLL GUARD 2) */ case 6: if (guard1->energy_level > 0) { Sint32 guard_ycoord = guard1->y_coord; if (scrollTemp != 0) { guard_ycoord = guard_ycoord - scrollTemp; if (guard_ycoord != 0) { speed = guard_ycoord * 2; } } scrollTemp = guard1->y_coord; } break; /* medium area 4 (SCROLL FIRE 1) */ case 7: if (weapo->is_enabled) { if (scrollTemp > 0) { Sint32 guard_ycoord = weapo->y_coord; guard_ycoord = guard_ycoord - scrollTemp; speed += guard_ycoord; if (speed > 15 * res) { speed = 15 * res; } if (speed < (-15 * res)) { speed = -15 * res; } } scrollTemp = weapo->y_coord; } else { scrollTemp = 0; } break; /* final area 4 (SCROLL FIRE 2) */ case 8: if (weapo->is_enabled) { if (scrollTemp != 0) { Sint32 guard_ycoord = weapo->y_coord; guard_ycoord = scrollTemp - guard_ycoord; speed += guard_ycoord; if (speed > 15 * res) { speed = 15 * res; } if (speed < (-15 * res)) { speed = -15 * res; } } scrollTemp = weapo->y_coord; } else { scrollTemp = 0; } break; /* medium area 5 (SCROLL COLLISION 3) */ case 9: if (guard1->recently_touched > 0 && guard1->energy_level > 0) { if (--speed < (-16 * res)) { speed = (-16 * res); } } else { if (guard2->recently_touched > 0 && guard2->energy_level) { if (++speed > (16 * res)) { speed = (16 * res); } } } break; /* final area 5 (SIMPLE SCROLL) */ case 10: speed = 8 * res; break; /* final-final area 5 (SIMPLE SCROLL) */ case 11: speed = -8 * res; break; } return speed; } //------------------------------------------------------------------------------- // select curve's gard //------------------------------------------------------------------------------- unsigned char * controller_guardians::getLissaPt (Sint32 lissa) { // calcul le pointeur sur la courbe Uint32 p = 0; #if SDL_BYTEORDER == SDL_LIL_ENDIAN lissa = lissa * 4; p = (unsigned char) displacement_curve[lissa + 0]; p = p << 8; p = p | (unsigned char) displacement_curve[lissa + 1]; p = p << 8; p = p | (unsigned char) displacement_curve[lissa + 2]; p = p << 8; p = p | (unsigned char) displacement_curve[lissa + 3]; #else Uint32 *ptr32 = (Uint32 *) displacement_curve; p = ptr32[lissa]; #endif return displacement_curve + p; } //------------------------------------------------------------------------------- // //------------------------------------------------------------------------------- const char controller_guardians::offzetbyte[256] = { 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3e, 0x3d, 0x3e, 0x3d, 0x3d, 0x3c, 0x3d, 0x3c, 0x3c, 0x3b, 0x3b, 0x3a, 0x3a, 0x39, 0x3a, 0x38, 0x39, 0x37, 0x38, 0x36, 0x37, 0x35, 0x36, 0x34, 0x35, 0x33, 0x33, 0x32, 0x32, 0x30, 0x31, 0x2f, 0x30, 0x2e, 0x2e, 0x2c, 0x2d, 0x2b, 0x2b, 0x29, 0x2a, 0x28, 0x28, 0x26, 0x27, 0x25, 0x25, 0x23, 0x24, 0x22, 0x22, 0x20, 0x21, 0x1f, 0x1f, 0x1d, 0x1e, 0x1b, 0x1c, 0x1a, 0x1b, 0x18, 0x19, 0x17, 0x18, 0x15, 0x16, 0x14, 0x15, 0x13, 0x13, 0x11, 0x12, 0x10, 0x10, 0x0e, 0x0f, 0x0d, 0x0e, 0x0c, 0x0d, 0x0b, 0x0b, 0x0a, 0x0a, 0x08, 0x09, 0x07, 0x08, 0x06, 0x07, 0x06, 0x06, 0x05, 0x05, 0x04, 0x04, 0x03, 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x06, 0x08, 0x07, 0x09, 0x08, 0x0a, 0x0a, 0x0b, 0x0b, 0x0d, 0x0c, 0x0e, 0x0d, 0x0f, 0x0e, 0x10, 0x10, 0x12, 0x11, 0x13, 0x13, 0x15, 0x14, 0x16, 0x15, 0x18, 0x17, 0x19, 0x18, 0x1b, 0x1a, 0x1c, 0x1b, 0x1e, 0x1d, 0x1f, 0x1f, 0x21, 0x20, 0x22, 0x22, 0x24, 0x23, 0x25, 0x25, 0x27, 0x26, 0x28, 0x28, 0x2a, 0x29, 0x2b, 0x2b, 0x2d, 0x2c, 0x2e, 0x2e, 0x30, 0x2f, 0x31, 0x30, 0x32, 0x32, 0x33, 0x33, 0x35, 0x34, 0x36, 0x35, 0x37, 0x36, 0x38, 0x37, 0x39, 0x38, 0x3a, 0x39, 0x3a, 0x3a, 0x3b, 0x3b, 0x3c, 0x3c, 0x3d, 0x3c, 0x3d, 0x3d, 0x3e, 0x3d, 0x3e, 0x3e, 0x3e, 0x3e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f }; /** * Describe guardian levels */ gardlevel controller_guardians::guard_list[] = { /* AREA 1 : intermediaires */ {25, // resistance 16, // centre X depart tir 555, // frequence tir gigaBlitz 2, // vitesse de deplacement 7, // fenetre de collision x-mini 5, // fenetre de collision y-mini 25, // fenetre de collision x-maxi 17, // fenetre de collision y-maxi 11, // centre Y depart tir 400, // frequence tir sprite_object::MEDIUM_GUARDIAN_AREA_1A, // numero du BOB LISSA_NB01, // numero de la courbe {0, -1} // table pointeur des tirs }, {30, // resistance du gardien 16, 666, // delai entre 2 tirs 2, // vit. dplacement 8, // xmin zone sensible 16, // ymin zone sensible 24, // xmax zone sensible 42, // ymax zone sensible 24, 240, //delai entre 2 tirs sprite_object::MEDIUM_GUARDIAN_AREA_1B, LISSA_NB02, {4, -1} }, /* AERA 1 : Final */ {50, // resistance du gardien 32, 333, // delai entre 2 tirs 2, // vit. dplacement 13, // xmin zone sensible 34, // ymin zone sensible 52, // xmax zone sensible 77, // ymax zone sensible 52, 200, //delai entre 2 tirs sprite_object::FINAL_GUARDIAN_AREA_1, LISSA_NB03, {0, 4, 8, -1} }, /* AERA 2 : intermediaires */ {30, // resistance 16, // centre X depart tir 444, // frequence tir gigaBlitz 2, // vitesse de deplacement 9, // fenetre de collision x-mini 5, // fenetre de collision y-mini 23, // fenetre de collision x-maxi 30, // fenetre de collision y-maxi 21, // centre Y depart tir 300, // frequence tir sprite_object::MEDIUM_GUARDIAN_AREA_2A, // numero du BOB LISSA_NB02, // numero de la courbe {12, -1} // table pointeur des tirs }, {30, // resistance du gardien 15, 333, // delai entre 2 tirs 2, // vit. dplacement 8, // xmin zone sensible 10, // ymin zone sensible 24, // xmax zone sensible 49, // ymax zone sensible 28, 280, //delai entre 2 tirs sprite_object::MEDIUM_GUARDIAN_AREA_2B, LISSA_NB04, {8, -1} }, /* AERA 2 : final */ {100, // resistance du gardien 32, 555, // delai entre 2 tirs 2, // vit. dplacement 14, // xmin zone sensible 17, // ymin zone sensible 50, // xmax zone sensible 66, // ymax zone sensible 45, 200, //delai entre 2 tirs sprite_object::FINAL_GUARDIAN_AREA_2, LISSA_NB15, {16, 0, 8, 4, 12, -1} }, /* AERA 3 : intermediaires */ {35, // resistance 16, // centre X depart tir 333, // frequence tir gigaBlitz 2, // vitesse de deplacement 6, // fenetre de collision x-mini 5, // fenetre de collision y-mini 26, // fenetre de collision x-maxi 30, // fenetre de collision y-maxi 19, // centre Y depart tir 300, // frequence tir sprite_object::MEDIUM_GUARDIAN_AREA_3A, // numero du BOB LISSA_NB11, // numero de la courbe {20, 8, -1} // table pointeur des tirs }, {30, // resistance du gardien 15, 555, // delai entre 2 tirs 2, // vit. dplacement 10, // xmin zone sensible 7, // ymin zone sensible 22, // xmax zone sensible 78, // ymax zone sensible 46, 200, //delai entre 2 tirs sprite_object::MEDIUM_GUARDIAN_AREA_3B, LISSA_NB13, {24, 4, -1} }, /* AERA 3 : final */ {70, // resistance du gardien 32, 444, // delai entre 2 tirs 2, // vit. dplacement 13, // xmin zone sensible 22, // ymin zone sensible 52, // xmax zone sensible 61, // ymax zone sensible 41, 250, //delai entre 2 tirs sprite_object::FINAL_GUARDIAN_AREA_3, LISSA_NB07, {24, 0, 8, 12, 4, 16, -1} }, /* AERA 4 : intermediaires */ {30, // resistance 16, // centre X depart tir 222, // frequence tir gigaBlitz 2, // vitesse de deplacement 10, // fenetre de collision x-mini 6, // fenetre de collision y-mini 22, // fenetre de collision x-maxi 42, // fenetre de collision y-maxi 23, // centre Y depart tir 300, // frequence tir sprite_object::MEDIUM_GUARDIAN_AREA_4A, // numero du BOB LISSA_NB08, // numero de la courbe {16, 28, 8, -1} // table pointeur des tirs }, {40, // resistance du gardien 16, 333, // delai entre 2 tirs 2, // vit. dplacement 7, // xmin zone sensible 12, // ymin zone sensible 25, // xmax zone sensible 68, // ymax zone sensible 42, 400, //delai entre 2 tirs sprite_object::MEDIUM_GUARDIAN_AREA_4B, LISSA_NB04, {12, 32, 8, -1} }, /* AERA 4 : final */ {60, // resistance du gardien 32, 222, // delai entre 2 tirs 2, // vit. dplacement 13, // xmin zone sensible 30, // ymin zone sensible 52, // xmax zone sensible 73, // ymax zone sensible 49, 160, //delai entre 2 tirs sprite_object::FINAL_GUARDIAN_AREA_4, LISSA_NB05, {0, 4, 32, 16, 20, 8, 28, 12, 24, -1} }, /* AERA 5 : intermediaires */ {40, // resistance 16, // centre X depart tir 222, // frequence tir gigaBlitz 2, // vitesse de deplacement 7, // fenetre de collision x-mini 14, // fenetre de collision y-mini 25, // fenetre de collision x-maxi 55, // fenetre de collision y-maxi 31, // centre Y depart tir 360, // frequence tir sprite_object::MEDIUM_GUARDIAN_AREA_5A, // numero du BOB LISSA_NB08, // numero de la courbe {36, 20, -1} // table pointeur des tirs }, {40, // resistance du gardien 16, 333, // delai entre 2 tirs 2, // vit. dplacement 6, // xmin zone sensible 14, // ymin zone sensible 26, // xmax zone sensible 77, // ymax zone sensible 41, 180, //delai entre 2 tirs sprite_object::MEDIUM_GUARDIAN_AREA_5B, LISSA_NB12, {40, 0, -1} }, /* AERA 5 : final */ {70, // resistance du gardien 31, 333, // delai entre 2 tirs 2, // vit. dplacement 22, // xmin zone sensible 82, // ymin zone sensible 42, // xmax zone sensible 102, // ymax zone sensible 55, 200, //delai entre 2 tirs sprite_object::FINAL_GUARDIAN_AREA_5, LISSA_NB09, {24, 8, 40, 12, 4, 0, 16, 20, 28, 36, 32, -1} }, /* Final TecnoballZ */ {150, //resistance du gardien 32, 222, //delai entre 2 tirs 2, //vit. dplacement 11, //xmin zone sensible 68, //ymin zone sensible 54, //xmax zone sensible 128, //ymax zone sensible 83, 150, //delai entre 2 tirs sprite_object::FINAL_GUARDIAN_AREA_6, LISSA_NB12, {20, 4, 36, 8, 32, 12, 24, 16, 0, 28, 40, -1} }, }; //------------------------------------------------------------------------------- // list of all levels gardians //------------------------------------------------------------------------------- Sint32 controller_guardians::level_list[] = { 0, 1, -1, //area 1 2, -1, 3, 4, -1, //area 2 5, -1, 6, 7, -1, //area 3 8, -1, 9, 10, -1, //area 4 11, -1, 12, 13, -1, //area 5 14, -1, 15, -1, -1 }; /** * Convert area and level numbers to a guardian level pointer * @param area_num area number from 1 to 5 * @param level_num level number from 1 to 13 */ Sint32 controller_guardians::level2gdpt (Uint32 area_num, Uint32 level_num) { if (area_num < 1) { area_num = 1; } if (level_num < 1) { level_num = 1; } if (area_num > handler_levels::MAX_OF_AREAS) { area_num = handler_levels::MAX_OF_AREAS; } Uint32 vloop = (level_num / 6) - 1 + (area_num - 1) * 2; if (level_num > handler_levels::NUM_OF_LEVELS_PER_AREA) { vloop++; } Uint32 index = 0; Sint32 gdptr = 0; for (;;) { if (index++ == vloop) break; //pointer is found :-) while (level_list[++gdptr] != -1); if (level_list[gdptr + 1] == -1) { fprintf (stderr, "controller_guardians::level2gdpt(%i, %i) end of table\n", area_num, level_num); gdptr = 0; break; } gdptr++; } return gdptr; } tecnoballz-0.93.1/src/sprite_mouse_pointer.cc0000664000175000017500000000424312412501752020355 0ustar brunobruno/** * @file sprite_mouse_pointer.cc * @brief The sprite of the mouse pointer * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_mouse_pointer.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_mouse_pointer.h" #include "../include/handler_keyboard.h" #include "../include/handler_display.h" #include "../include/list_sprites.h" /** * Create the mouse pointer sprite */ sprite_mouse_pointer::sprite_mouse_pointer () { clear_sprite_members (); } /** * Release the mouse pointer sprite */ sprite_mouse_pointer::~sprite_mouse_pointer () { } /** * Create the sprite data and initialize it */ void sprite_mouse_pointer::create_pointer_sprite (bitmap_data * bmp) { Uint32 id; if (random_counter & 1) { id = sprite_object::MOUSE_POINTER_1; } else { id = sprite_object::MOUSE_POINTER_2; } create_sprite (id, bmp, 0); sprites->add (this); Uint32 x = game_screen->get_width () / 2; Uint32 y = game_screen->get_height () / 2; set_coordinates (x, y); enable (); set_frame_delay (3); } /** * Moving the mouse pointer */ void sprite_mouse_pointer::move () { Sint32 offsX = keyboard->get_mouse_x (); Sint32 offsY = keyboard->get_mouse_y (); move_x (offsX); move_y (offsY); set_coordinates (offsX, offsY); clip_coordinates (); play_animation_loop (); } tecnoballz-0.93.1/src/sprite_money.cc0000664000175000017500000001441012412501752016611 0ustar brunobruno/** * @file sprite_money.cc * @brief The money sprite * @date 2012-10-07 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_money.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_money.h" /** * Create the money sprite */ sprite_money::sprite_money () { clear_sprite_members (); towards = 0; money_amount = 0; speed_of_moving = 0; paddle = (sprite_paddle *) NULL; } /** * Release the money sprite */ sprite_money::~sprite_money () { } /** * perform some initialization of members */ void sprite_money::init_members () { right_panel_score* panel_score = right_panel_score::get_instance (); init_coords_max_min (panel_score->get_width()); frame_period = 5; frame_delay = 1; /* initialize multiplier of the value of the capsules of money */ switch (current_player->get_area_number ()) { default: money_multiplier = 1; break; case 3: case 4: money_multiplier = 2; break; case 5: money_multiplier = 4; break; } } /** * Initialize a new capsule of money from a bricks * @param brick a pointer to the brick which touched by a ball * @return true if the sprite was enabled, otherwise false */ bool sprite_money::enable_if_available (brick_redraw * brick) { if (is_enabled) { return false; } init_money (brick->xcoord_collision, brick->ycoord_collision, brick->paddle); return true; } /** * Initialize a new capsule of money from a ship or a guardian * @param ball a pointer to the ball sprite which destroyed * the enemy ship or touched the guardian * @return true if the sprite was enabled, otherwise false */ bool sprite_money::enable_if_available (sprite_ball * ball) { if (is_enabled) { return false; } init_money (ball->x_coord, ball->y_coord, ball->paddle_touched); return true; } /** * Initialize a new capsule of money from a projectile * @param blast a pointer to the projectile sprite which * destroyed the enemy ship * @return true if the sprite was enabled, otherwise false */ bool sprite_money::enable_if_available (sprite_projectile * blast) { if (is_enabled) { return false; } init_money (blast->x_coord, blast->y_coord, blast->paddle); return true; } /** * Initialize a new capsule of money * @param xcoord x coordinate of the money capsule * @param ycoord y coordinate of the money caspule * @parm pad pointer to the paddle sprite which goes the money caspule */ void sprite_money::init_money (Uint32 xcoord, Uint32 ycoord, sprite_paddle * pad) { is_enabled = true; x_coord = xcoord; y_coord = ycoord; paddle = pad; Uint32 value = random_counter & 0x003; random_counter += value; towards = paddle->get_paddle_number (); switch (value) { case 0: money_amount = 10 * money_multiplier; speed_of_moving = resolution; break; case 2: money_amount = 30 * money_multiplier; speed_of_moving = resolution * 3; break; case 1: default: money_amount = 20 * money_multiplier; speed_of_moving = resolution * 2; break; } } /** * Displacement and collision of the money in the bricks levels * @return the money amount collected */ Uint32 sprite_money::move () { if (!is_enabled) { return 0; } switch (towards) { case controller_paddles::BOTTOM_PADDLE: y_coord += speed_of_moving; if (y_coord < y_maximum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return (money_amount); } } else { is_enabled = false; } break; case controller_paddles::RIGHT_PADDLE: x_coord += speed_of_moving; if (x_coord < x_maximum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return (money_amount); } } else { is_enabled = false; } break; case controller_paddles::TOP_PADDLE: y_coord -= speed_of_moving; if (y_coord > y_minimum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return (money_amount); } } else { is_enabled = false; } break; case controller_paddles::LEFT_PADDLE: x_coord -= speed_of_moving; if (x_coord > x_minimum) { if (collision (paddle)) { is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return (money_amount); } } else { is_enabled = false; } break; } return 0; } /** * Displacement and collision of the money in the guards levels * @return the money amount collected */ Uint32 sprite_money::move_bottom () { if (!is_enabled) { return 0; } y_coord += speed_of_moving; if (y_coord >= y_maximum) { is_enabled = false; return 0; } if (!collision (paddle)) { return 0; } is_enabled = false; #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_MONEY); #endif return money_amount; } tecnoballz-0.93.1/src/handler_audio.cc0000664000175000017500000004271712412501752016705 0ustar brunobruno/** * @file handler_audio.cc * @brief Handler of the sound and music * @created 2004-03-22 * @date 2014-08-19 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 23 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_audio.cc 23 2014-08-16 20:13:07Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_audio.h" #ifndef SOUNDISOFF #include "../include/handler_resources.h" #include "../include/handler_keyboard.h" handler_audio * handler_audio::audio_singleton = NULL; bool handler_audio::is_audio_enable = true; /** Positions in music modules */ const musics_pos handler_audio::ptMusicpos[] = { { /* first music of a bricks level */ 0, /* restart first music */ 2, /* second music of a bricks level */ 11, /* restart second music */ 11, /* "bricks level" completed */ 23, /* lost ball in "bricks level" */ 24, /* shop music */ 25 }, {0, 0, 15, 15, 22, 23, 24}, {0, 0, 15, 15, 28, 29, 30}, {0, 0, 11, 11, 18, 19, 20}, {0, 0, 15, 15, 30, 31, 32} }; /** Pointers of all sound effects */ Mix_Chunk * handler_audio::sound_list[NUM_OF_SOUNDS]; char handler_audio::sounds_play[NUM_OF_SOUNDS]; /** * Create the handler_audoi singleton object, and clear members */ handler_audio::handler_audio () { object_init (); initialize (); area_number = 0; level_number = 0; song_module = NULL; is_only_music = true; is_music_enable = true; is_sound_enable = true; } /** * Release the handler_keyboard singleton object */ handler_audio::~handler_audio () { if (NULL != song_module) { Mix_HaltMusic (); Mix_FreeMusic (current_music); song_module = NULL; } /* release the samples */ for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { if (sound_list[i]) { Mix_FreeChunk (sound_list[i]); sound_list[i] = NULL; } sounds_play[i] = false; } if (is_audio_enable) { Mix_CloseAudio (); Uint32 subsystem_init = SDL_WasInit (SDL_INIT_AUDIO); if (subsystem_init & SDL_INIT_AUDIO) { if (is_verbose) { std::cout << ">handler_audio::~handler_audio()" << " SDL_QuitSubSystem (SDL_INIT_AUDIO)" << std::endl; } SDL_QuitSubSystem (SDL_INIT_AUDIO); } } audio_singleton = NULL; } /** * Get the object instance * handler_audio is a singleton * @return the handler_audoi object */ handler_audio * handler_audio::get_instance () { if (NULL == audio_singleton) { audio_singleton = new handler_audio (); } return audio_singleton; } /** * Initialize SDL audio and load files waves in memory */ void handler_audio::initialize () { if (!is_audio_enable) { if (is_verbose) { std::cout << "handler_audio::initialize() " << "audio disable!" << std::endl; } return; } if (SDL_InitSubSystem (SDL_INIT_AUDIO) < 0) { std::cerr << "handler_audio::initialize() " << "SDL_Init() return " << SDL_GetError () << std::endl; is_audio_enable = false; return; } Sint32 audio_rate, audio_buffers; #ifdef TECNOBALLZ_GP2X /* we need a reduced audio rate for the GP2X to make sure sound * doesn't lag */ audio_rate = 22050; audio_buffers = 64; #else audio_rate = 44100; audio_buffers = 4096; #endif if (Mix_OpenAudio (audio_rate, AUDIO_S16, 2, audio_buffers)) { std::cerr << "(!)handler_audio::initialize() " << "Mix_OpenAudio() return " << SDL_GetError () << std::endl; is_audio_enable = false; return; } if (is_verbose) { query_spec (); } /* get the current volume music setting */ music_volume = Mix_VolumeMusic (-1); Mix_AllocateChannels (8); /* get the current volume channels setting */ channels_volume = Mix_Volume (-1, -1); /* load files waves in memory */ for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { sound_list[i] = NULL; } waves_size = 0; for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { char *pathname = resources->get_sound_filename (i); if (NULL == pathname) { std::cerr << "handler_audio::initialize() " << "(!)handler_audio::initialize() file " << i << "not found" << std::endl; is_audio_enable = false; return; } Mix_Chunk *ptWav = Mix_LoadWAV (pathname); if (NULL == ptWav) { std::cerr << "(!)handler_audio::initialize() " << "Mix_LoadWAV(" << pathname << ") return " << SDL_GetError () << std::endl; is_audio_enable = false; return; } Mix_VolumeChunk (ptWav, 32); sound_list[i] = ptWav; waves_size += ptWav->alen; } is_audio_enable = true; is_only_music = false; if (is_verbose) { std::cout << "handler_audio::initialize() initialize succeded" << std::endl; } } /** * Display some infos */ void handler_audio::query_spec () { Sint32 result, frequency, channels; Uint16 format_id; result = Mix_QuerySpec (&frequency, &format_id, &channels); if (result == 0) { std::cerr << "handler_audio::query_spec() " << "Mix_QuerySpec return " << Mix_GetError () << std::endl; return; } const char *format = "Unknown"; switch (format_id) { case AUDIO_U8: format = "U8"; break; case AUDIO_S8: format = "S8"; break; case AUDIO_U16LSB: format = "U16LSB"; break; case AUDIO_S16LSB: format = "S16LSB"; break; case AUDIO_U16MSB: format = "U16MSB"; break; case AUDIO_S16MSB: format = "S16MSB"; break; } std::cout << "handler_audio::query_spec()" << " times frequencyency: " << frequency << " format: " << format << " channels: " << channels << std::endl; } /** * Play the music of a bricks level * @param area_num area number 1 to 5 * @param level level number 1 to 12 * @return error code, 0 if no error */ void handler_audio::play_level_music (Uint32 area_num, Uint32 level) { if (!is_audio_enable) { return; } area_number = area_num; level_number = level; Uint32 music = area_music (area_num); Uint32 paire = level & 0x1; if ((level <= 5 && paire) || (level > 5 && !paire)) { restart_position = ptMusicpos[music].music_1_loop; music_1_position = ptMusicpos[music].music_1; music_2_position = ptMusicpos[music].music_2 - 1; } else { restart_position = ptMusicpos[music].music_2_loop; music_1_position = ptMusicpos[music].music_2; music_2_position = ptMusicpos[music].level_completed - 1; } play_music (music); Mix_SetMusicPosition (music_1_position); current_portion_music = GAME_PORTION; Player_Stop (); } /** * Play the music of the shop * @param area_num area number */ void handler_audio::play_shop_music (Uint32 area_num) { if (!is_audio_enable || NULL == song_module) { return; } area_number = area_num; Uint32 music = area_music (area_num); music_1_position = ptMusicpos[music].shop_music; music_2_position = song_module->numpos - 1; restart_position = music_1_position; play_music (music); Mix_SetMusicPosition (music_1_position); current_portion_music = SHOP_PORTION; } /** * Play the music of the victory, when the player finished a level */ void handler_audio::play_win_music () { if (!is_audio_enable) { return; } Uint32 music = area_music (area_number); music_1_position = ptMusicpos[music].level_completed; music_2_position = ptMusicpos[music].pos_losing - 1; restart_position = music_1_position; Mix_SetMusicPosition (music_1_position); current_portion_music = WIN_PORTION; } /** * Play the music of the defeat, when the player loses a life */ void handler_audio::play_lost_music () { if (!is_audio_enable || current_portion_music == LOST_PORTION) { return; } Uint32 music = area_music (area_number); music_1_position = ptMusicpos[music].pos_losing; music_2_position = ptMusicpos[music].shop_music - 1; restart_position = music_1_position; Mix_SetMusicPosition (music_1_position); current_portion_music = LOST_PORTION; } /** * Stop the music of the defeat, when the player loses a life */ void handler_audio::stop_lost_music () { if (!is_audio_enable || current_portion_music != LOST_PORTION) { return; } play_level_music (area_number, level_number); } /** * Check if the music of the victory is finished * @return true if the music of the victory is finished */ bool handler_audio::is_win_music_finished () { if (!is_audio_enable || NULL == song_module) { return true; } if (WIN_PORTION == current_portion_music) { return false; } else { return true; } } /** * If a music is played, it is stopped */ void handler_audio::stop_music () { if (!is_audio_enable || NULL == song_module) { return; } Mix_HaltMusic (); Mix_FreeMusic (current_music); song_module = NULL; current_music_id = -1; } /** * Play a music module * @param music_id resource identifier of the music module */ void handler_audio::play_music (Uint32 music_id) { if (!is_audio_enable) { return; } /* if a music is played, it is stopped */ if (NULL != song_module) { if (current_music_id == (Sint32) music_id) { return; } else { stop_music (); } } char *pathname = resources->get_music_filename (music_id); if (is_verbose) { std::cout << "handler_audio::play_music() " << "try load pathname '" << pathname << "'" << std::endl; } /* load the music in memory */ current_music = Mix_LoadMUS (pathname); if (NULL == current_music) { std::cerr << "handler_audio::play_music() " << "Mix_LoadMUS return " << SDL_GetError () << std::endl; return; } /* Ugly way to access sdl-mixer's internal structures */ union { int i; void *p; } dummy; memcpy (&song_module, (Uint8 *) current_music + sizeof (dummy), sizeof (void *)); /* start the music */ if (Mix_PlayMusic (current_music, -1) == -1) { std::cerr << "(!)handler_audio::play_music() " << SDL_GetError () << std::endl; return; } current_portion_music = MUSIC_UNDIVIDED; song_pos = -1; current_music_id = music_id; if (is_verbose) { std::cout << "handler_audio::play_music() module " << current_music_id << " playing!" << std::endl; } if (is_music_enable) { Mix_VolumeMusic (music_volume); } else { Mix_VolumeMusic (0); } return; } /** * Return the portion of the music currently played * @return identifier of the portion played */ Uint32 handler_audio::get_portion_music_played () { return current_portion_music; } /** * Volume control */ void handler_audio::sound_volume_ctrl (void) { Uint32 mvol = music_volume; Uint32 cvol = channels_volume; /* volume up */ if (keyboard->command_is_pressed (handler_keyboard::VOLUME_UP)) { if (is_music_enable) { music_volume = (music_volume + VOLUME_INC > MIX_MAX_VOLUME) ? MIX_MAX_VOLUME : music_volume + VOLUME_INC; } if (is_sound_enable) { channels_volume = (channels_volume + VOLUME_INC > MIX_MAX_VOLUME) ? MIX_MAX_VOLUME : channels_volume + VOLUME_INC; } } /* volume down */ if (keyboard->command_is_pressed (handler_keyboard::VOLUME_DOWN)) { if (is_music_enable) { music_volume = (music_volume <= VOLUME_INC) ? 0 : music_volume - VOLUME_INC; } if (is_sound_enable) { channels_volume = (channels_volume <= VOLUME_INC) ? 0 : channels_volume - VOLUME_INC; } } if (mvol != music_volume) { Mix_VolumeMusic (music_volume); } if (cvol != channels_volume) { /* set the volume of all channels */ Mix_Volume (-1, channels_volume); } } /** * Handler of toggle keys, played sounds, and portions * of the music played */ void handler_audio::run () { if (!is_audio_enable) { return; } /* * [Ctrl] + [S]: enable/disable audio (sound effects and musics) */ if (keyboard->command_is_pressed (handler_keyboard::TOGGLE_AUDIO, true)) { if (!is_music_enable || !is_sound_enable) { is_music_enable = true; is_sound_enable = true; Mix_VolumeMusic (music_volume); } else { is_music_enable = false; is_sound_enable = false; Mix_VolumeMusic (0); } } else { /* [Ctrl] + [F]: enable/disable sound effects */ if (keyboard->command_is_pressed (handler_keyboard::TOGGLE_SOUND, true)) { is_sound_enable = is_sound_enable ? false : true; if (!is_sound_enable) { for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { sounds_play[i] = false; } } } /* [Ctrl] + [D]: enable/disable musics */ else { if (keyboard->command_is_pressed (handler_keyboard::TOGGLE_MUSIC, true)) { is_music_enable = is_music_enable ? false : true; if (is_music_enable) { Mix_VolumeMusic (music_volume); } else { Mix_VolumeMusic (0); } } } } sound_volume_ctrl (); control_music_position (); play_requested_sounds (); } /** * Play all requested sounds */ void handler_audio::play_requested_sounds () { if (is_only_music || !is_sound_enable) { return; } for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { if (sounds_play[i]) { sounds_play[i] = false; Mix_PlayChannel (-1, sound_list[i], 0); } } } /** * Request to play sound effect * @param sound_num sound number */ void handler_audio::play_sound (Uint32 sound_num) { if (!is_only_music) { sounds_play[sound_num] = true; } } /** * Control of the portion of the played musics */ void handler_audio::control_music_position () { if (NULL == song_module) { return; } if (song_pos != song_module->sngpos) { song_pos = song_module->sngpos; } Sint32 posgo = -1; switch (current_portion_music) { case GAME_PORTION: case SHOP_PORTION: if (song_module->sngpos < music_1_position) { posgo = music_1_position; } if (song_module->sngpos > music_2_position) { posgo = restart_position; } if (song_module->patpos >= 63 && song_module->sngpos == music_2_position) { posgo = restart_position; } if (posgo >= 0) { if (is_verbose) { std::cout << "handler_audio::execution1() " << " - Player_SetPosition(" << posgo << ")" << std::endl; } Mix_SetMusicPosition (posgo); } break; case LOST_PORTION: if (song_module->sngpos < music_1_position || song_module->sngpos > music_2_position || (song_module->patpos >= 63 && song_module->sngpos == music_2_position)) { play_level_music (area_number, level_number); } break; case WIN_PORTION: if (song_module->sngpos < music_1_position || song_module->sngpos > music_2_position || (song_module->patpos >= 63 && song_module->sngpos == music_2_position)) { if (!Player_Paused ()) { Player_TogglePause (); } current_portion_music = MUSIC_IS_OFF; } break; } } /** * Return music area identifier * @param narea area number, form 1 to 5 * @return music area identifier */ Uint32 handler_audio::area_music (Uint32 narea) { switch (narea) { case 2: return MUSICAREA2; break; case 3: return MUSICAREA3; break; case 4: return MUSICAREA4; break; case 5: return MUSICAREA5; break; default: return MUSICAREA1; break; } return MUSICAREA1; } /** * Disable the sound effect */ void handler_audio::disable_sound () { is_only_music = true; for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { sounds_play[i] = false; } } /** * Enable the sound effect */ void handler_audio::enable_sound () { for (Sint32 i = 0; i < NUM_OF_SOUNDS; i++) { sounds_play[i] = false; } is_only_music = false; } #endif tecnoballz-0.93.1/src/controller_ejectors.cc0000664000175000017500000001550612412501752020164 0ustar brunobruno/** * @file controller_ejectors.cc * @brief Ejectors corners controller * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_ejectors.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_ejectors.h" /** * Create the ejectors controller */ controller_ejectors::controller_ejectors () { littleInit (); max_of_sprites = MAX_OF_EJECTORS; sprites_have_shades = true; } /** * Release the ejectors controller */ controller_ejectors::~controller_ejectors () { release_sprites_list (); } /** * Create the ejectors sprites */ void controller_ejectors::create_ejectors_sprites () { alloc_sprites_list (); sprites_list[TOP_LEFT_EJECTOR] = new sprite_object (); sprites_list[TOP_RIGHT_EJECTOR] = new sprite_object (); sprites_list[BOTTOM_LEFT_EJECTOR] = new sprite_object (); sprites_list[BOTTOM_RIGHT_EJECTOR] = new sprite_object (); sprites_list[TOP_LEFT_EJECTOR]->create_sprite (sprite_object::EJECTOR_1, sprites_bitmap, true); sprites_list[TOP_LEFT_EJECTOR]->set_coordinates (COORD_EJECTOR_1 * resolution, (COORD_EJECTOR_1 * resolution) - sprites_list [TOP_LEFT_EJECTOR]-> get_sprite_height () / 2); sprites_list[TOP_RIGHT_EJECTOR]->create_sprite (sprite_object::EJECTOR_4, sprites_bitmap, true); sprites_list[TOP_RIGHT_EJECTOR]->set_coordinates (COORD_EJECTOR_2 * resolution, (COORD_EJECTOR_1 * resolution) - sprites_list [TOP_RIGHT_EJECTOR]-> get_sprite_height () / 2); sprites_list[BOTTOM_LEFT_EJECTOR]->create_sprite (sprite_object::EJECTOR_2, sprites_bitmap, true); sprites_list[BOTTOM_LEFT_EJECTOR]->set_coordinates (COORD_EJECTOR_1 * resolution, (COORD_EJECTOR_2 * resolution) - sprites_list [BOTTOM_LEFT_EJECTOR]-> get_sprite_height () / 2); sprites_list[BOTTOM_RIGHT_EJECTOR]->create_sprite (sprite_object::EJECTOR_3, sprites_bitmap, true); sprites_list[BOTTOM_RIGHT_EJECTOR]->set_coordinates (COORD_EJECTOR_2 * resolution, (COORD_EJECTOR_2 * resolution) - sprites_list [BOTTOM_RIGHT_EJECTOR]-> get_sprite_height () / 2); /* has_background = false: ejectors are managed like sprites */ if (!has_background) { sprites->add (sprites_list[TOP_LEFT_EJECTOR]); sprites->add (sprites_list[TOP_RIGHT_EJECTOR]); sprites->add (sprites_list[BOTTOM_LEFT_EJECTOR]); sprites->add (sprites_list[BOTTOM_RIGHT_EJECTOR]); sprites_list[TOP_LEFT_EJECTOR]->enable (); sprites_list[TOP_RIGHT_EJECTOR]->enable (); sprites_list[BOTTOM_LEFT_EJECTOR]->enable (); sprites_list[BOTTOM_RIGHT_EJECTOR]->enable (); } } /** * Draw ejectors shadows */ void controller_ejectors::draw_shadow () { if (!has_background) { return; } sprites_list[TOP_LEFT_EJECTOR]->draw_shadow_to_brackground (); sprites_list[TOP_RIGHT_EJECTOR]->draw_shadow_to_brackground (); sprites_list[BOTTOM_LEFT_EJECTOR]->draw_shadow_to_brackground (); sprites_list[BOTTOM_RIGHT_EJECTOR]->draw_shadow_to_brackground (); } /** * Draw ejectors shadows */ void controller_ejectors::draw () { if (!has_background) { return; } sprites_list[TOP_LEFT_EJECTOR]->draw_to_brackground (); sprites_list[TOP_RIGHT_EJECTOR]->draw_to_brackground (); sprites_list[BOTTOM_LEFT_EJECTOR]->draw_to_brackground (); sprites_list[BOTTOM_RIGHT_EJECTOR]->draw_to_brackground (); } /** * Return a ejector sprite * @param id identifier of the ejector * @return a pointer to the ejector sprite */ sprite_object * controller_ejectors::get_ejector (Uint32 id) { switch (id) { case TOP_LEFT_EJECTOR: return sprites_list[TOP_LEFT_EJECTOR]; case TOP_RIGHT_EJECTOR: return sprites_list[TOP_RIGHT_EJECTOR]; case BOTTOM_LEFT_EJECTOR: return sprites_list[BOTTOM_LEFT_EJECTOR]; case BOTTOM_RIGHT_EJECTOR: return sprites_list[BOTTOM_RIGHT_EJECTOR]; } return NULL; } /** * Initialize the table of the positions of the balls on the ejectors. * @param table Pointer to the structure of the ball ejectors */ bool controller_ejectors::is_pos_ball_initialized = false; void controller_ejectors::initialize_ball_positions (ball_ejector_coords * table) { /* is the position of the balls already initialized? */ if (is_pos_ball_initialized) { return; } is_pos_ball_initialized = true; for (Uint32 i = 0; i < max_of_sprites; i++) { table->x_coord = (table->x_coord * resolution) + sprites_list[i]->get_x_coord (); table->y_coord = (table->y_coord * resolution) + sprites_list[i]->get_y_coord (); table++; } } tecnoballz-0.93.1/src/supervisor_map_editor.cc0000664000175000017500000005533312412501752020531 0ustar brunobruno/** * @file supervisor_map_editor.cc * @brief The tile map editor for the menu and guardians levels * @created 2004-09-13 * @date 2012-08-19 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_map_editor.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/supervisor_map_editor.h" #include "../include/handler_resources.h" #include "../include/list_sprites.h" #include "../include/handler_keyboard.h" #include #include #include /** * Create the tile map editor */ supervisor_map_editor::supervisor_map_editor () { initialize (); /* vertical background scrolling */ tiles_map = new tilesmap_scrolling (); mouse_pointer = new sprite_mouse_pointer (); view_mode = SHOW_MAP; is_space_key_down = false; tiles_ycoord = 0; map_width = 0; is_right_button_down = false; cycled_colors_index = 0; tiles_brush = NULL; brush_bitmap = (bitmap_data *) NULL; is_left_button_down = false; brush_posx = 0; brush_posy = 0; brush_width = 0; brush_height = 0; is_s_key_down = false; first_init (); } /** * Release the tile map editor */ supervisor_map_editor::~supervisor_map_editor () { if (NULL != mouse_pointer) { delete mouse_pointer; mouse_pointer = NULL; } if (NULL != tiles_map) { delete tiles_map; tiles_map = NULL; } if (NULL != map_selection) { delete map_selection; } if (NULL != tiles_selection) { delete tiles_selection; } if (NULL != tiles_brush) { delete[]tiles_brush; tiles_brush = NULL; } if (NULL != brush_bitmap) { delete brush_bitmap; brush_bitmap = NULL; } release (); } /** * Perform some initializations */ void supervisor_map_editor::first_init () { try { map_selection = new selected_region; tiles_selection = new selected_region; } catch (std::bad_alloc &) { std:: cerr << "(!)supervisor_map_editor::first_init() " "not enough memory to allocate " << " 'selected_region' structure!" << std::endl; throw; } current_selection = map_selection; map_selection->x1 = map_selection->x2 = 0; map_selection->y1 = map_selection->y2 = 0; map_selection->number_of_cols = map_selection->number_of_raws = 0; tiles_selection->x1 = tiles_selection->x2 = 0; tiles_selection->y1 = tiles_selection->y2 = 0; tiles_selection->number_of_cols = tiles_selection->number_of_raws = 0; screen_height = display->get_height (); screen_width = display->get_width (); sprites->reset (); resources->load_sprites_bitmap (); mouse_pointer->create_pointer_sprite (sprites_bitmap); resources->release_sprites_bitmap (); Sint32 edmap = tilesmap_scrolling::MAP_MENU; //Sint32 edmap = tilesmap_scrolling::MAP_GUARDIANS; //Sint32 edmap = tilesmap_scrolling::MAP_CONGRATULATIONS; tiles_map->initialize (tilesmap_scrolling::TILES_COLOR_MENU, edmap); tiles_bitmap = tiles_map->get_bitmap (); tile_width = tiles_map->get_tiles_width (); tile_mask1 = 0xffffffff ^ (tile_width - 1); tile_mask2 = ~tile_mask1; map_width = tiles_map->get_map_width (); display->set_color_gradation (); } /** * Main loop */ Uint32 supervisor_map_editor::main_loop () { display->wait_frame (); map_selection->y_offset = tiles_map->get_y_coord (); tiles_selection->y_offset = tiles_ycoord; switch (view_mode) { case SHOW_TILES: view_tiles (); break; case SHOW_MAP: default: view_map_editor (); break; } display->lock_surfaces (); mouse_pointer->move (); sprites->draw (); /* copy whole game surface into screen surface */ display->unlock_surfaces (); display->window_update (); /* [ctrl] + escape key to leave! */ if (keyboard->command_is_pressed (handler_keyboard::QUIT_TECNOBALLZ)) { next_phase = LEAVE_TECNOBALLZ; } check_keys (); /* back to menu */ if (keyboard->key_is_pressed (SDLK_F10)) { next_phase = MAIN_MENU; } if (keyboard->key_is_pressed (SDLK_F1)) { tiles_map->switch_map (tilesmap_scrolling::TILES_COLOR_MENU, tilesmap_scrolling::MAP_MENU); } else if (keyboard->key_is_pressed (SDLK_F2)) { tiles_map->switch_map (tilesmap_scrolling::TILES_COLOR_GUARDIANS, tilesmap_scrolling::MAP_GUARDIANS); } else if (keyboard->key_is_pressed (SDLK_F3)) { tiles_map->switch_map (tilesmap_scrolling::TILES_COLOR_CONGRATULATIONS, tilesmap_scrolling::MAP_CONGRATULATIONS); } /* save the map */ if (keyboard->key_is_pressed (SDLK_s) && !is_s_key_down) { is_s_key_down = true; } if (keyboard->key_is_released (SDLK_s) && is_s_key_down) { is_s_key_down = false; save_tilesmap (); } return next_phase; } /** * Display map editor view */ void supervisor_map_editor::view_map_editor () { current_selection = map_selection; Sint32 speed = get_speed (); /* draw tiles map on the screen */ tiles_map->scroll (speed); select_rectangle (); highlight_selection (); draw_brush (); } /** * Create a brush from map editor */ void supervisor_map_editor::map_to_brush () { if (is_verbose) { std::cout << "supervisor_map_editor::map_to_brush() (" << current_selection->x1 << ", " << current_selection->y1 << "," << current_selection->x2 << ", " << current_selection->y2 << std::endl; } /* allocate memory for tiles brush */ alloc_tilesmap_brush (current_selection->number_of_raws, current_selection->number_of_cols); Sint32 ycoord = current_selection->y1; ycoord = (ycoord / tiles_map->tile_height) + 0; ycoord *= map_width; ycoord += (current_selection->x1 / tiles_map->tile_width); Uint16 *map = tiles_map->map_tiles + ycoord; Uint16 *brush = tiles_brush; for (Uint32 y = 0; y < current_selection->number_of_raws; y++) { for (Uint32 x = 0; x < current_selection->number_of_cols; x++) { *(brush++) = map[x]; } map += map_width; } alloc_brush (); } /** * View tiles mode */ void supervisor_map_editor::view_tiles () { current_selection = tiles_selection; Sint32 speed = get_speed (); Sint32 y_max = tiles_bitmap->get_height () - screen_height; tiles_ycoord = tiles_ycoord + speed; if (tiles_ycoord < 0) { tiles_ycoord = 0; } else if (tiles_ycoord > y_max) { tiles_ycoord = y_max; } game_screen->clear (); game_screen->blit_surface (tiles_bitmap, 0, tiles_ycoord, 0, 0, screen_width, screen_height); select_rectangle (); highlight_selection (); } /** * Create a brush from tiles bitmap */ void supervisor_map_editor::tiles_to_brush () { if (is_verbose) { std::cout << "supervisor_map_editor::map_to_brush() (" << current_selection->x1 << ", " << current_selection->y1 << "," << current_selection->x2 << ", " << current_selection->y2 << std::endl; } /* * allocate tilesmap for the brush */ alloc_tilesmap_brush (current_selection->number_of_raws, current_selection->number_of_cols); /* * copy tiles offsets to brush map */ Uint32 width = tiles_bitmap->get_width () / tile_width; Sint32 offset = (current_selection->y1 / tile_width) * width + (current_selection->x1 / tile_width); Uint16 *brush = tiles_brush; for (Uint32 y = 0; y < current_selection->number_of_raws; y++) { Sint32 index = offset; for (Uint32 x = 0; x < current_selection->number_of_cols; x++) { *(brush++) = index; index++; } offset += width; } alloc_brush (); } /** * Check keyboard keys */ void supervisor_map_editor::check_keys () { if (keyboard->key_is_pressed (SDLK_SPACE)) { is_space_key_down = true; } if (keyboard->key_is_released (SDLK_SPACE) && is_space_key_down) { switch (view_mode) { case SHOW_MAP: view_mode = SHOW_TILES; break; case SHOW_TILES: default: view_mode = SHOW_MAP; break; } is_space_key_down = false; } } /** * Determine vertical scrolling speed * @return srolling speed */ Sint32 supervisor_map_editor::get_speed () { Sint32 speed = 0; Uint32 mousY = keyboard->get_mouse_y (); if (mousY > 0 && mousY < 8 * resolution) { speed = -16 * resolution; } if (mousY >= 8 * resolution && mousY < 16 * resolution) { speed = -8 * resolution; } if (mousY >= 16 * resolution && mousY < 24 * resolution) { speed = -4 * resolution; } if (mousY <= screen_height - 16 * resolution && mousY > screen_height - 24 * resolution) { speed = 4 * resolution; } if (mousY <= screen_height - 8 * resolution && mousY > screen_height - 16 * resolution) { speed = 8 * resolution; } if (mousY < screen_height && mousY > screen_height - 8 * resolution) { speed = 16 * resolution; } return speed; } /** * Handle rectangle selection with the right mouse button */ void supervisor_map_editor::select_rectangle () { /* reads coordinates if the right mouse button has just been pressed */ bool is_right_down = keyboard->is_right_button (); if (is_right_down && !is_right_button_down) { is_right_button_down = true; current_selection->x1 = keyboard->get_mouse_x (); current_selection->y1 = current_selection->y_offset + keyboard->get_mouse_y (); current_selection->x1 &= tile_mask1; current_selection->y1 &= tile_mask1; if (NULL != brush_bitmap) { delete brush_bitmap; brush_bitmap = (bitmap_data *) NULL; } } if (is_right_button_down) { current_selection->x2 = keyboard->get_mouse_x (); current_selection->y2 = keyboard->get_mouse_y () + current_selection->y_offset; if (current_selection->x2 & tile_mask2) { current_selection->x2 += tile_width; } if (current_selection->y2 & tile_mask2) { current_selection->y2 += tile_width; } current_selection->x2 &= tile_mask1; current_selection->y2 &= tile_mask1; if (current_selection->x2 >= current_selection->x1 && current_selection->x2 - current_selection->x1 < tile_width) { current_selection->x2 = current_selection->x1 + tile_width; } if (current_selection->x2 < current_selection->x1 && current_selection->x1 - current_selection->x2 < tile_width) { current_selection->x2 = current_selection->x1 - tile_width; } if (current_selection->y2 >= current_selection->y1 && current_selection->y2 - current_selection->y1 < tile_width) { current_selection->y2 = current_selection->y1 + tile_width; } if (current_selection->y2 < current_selection->y1 && current_selection->y1 - current_selection->y2 < tile_width) { current_selection->x2 = current_selection->x1 - tile_width; } if (current_selection->y1 < current_selection->y2 && current_selection->y2 - current_selection->y1 > (screen_height / 2)) { current_selection->y2 = current_selection->y1 + (screen_height / 2); } if (current_selection->y1 > current_selection->y2 && current_selection->y1 - current_selection->y2 > (screen_height / 2)) { current_selection->y2 = current_selection->y1 - (screen_height / 2); } } if (is_right_button_down && is_right_down) { return; } if (is_right_down || !is_right_button_down) { return; } /* right mouse button released */ is_right_button_down = false; if (current_selection->x1 > current_selection->x2) { Sint32 x = current_selection->x1; current_selection->x1 = current_selection->x2; current_selection->x2 = x; } if (current_selection->y1 > current_selection->y2) { Sint32 y = current_selection->y1; current_selection->y1 = current_selection->y2; current_selection->y2 = y; } current_selection->number_of_cols = (current_selection->x2 - current_selection->x1) / tile_width; current_selection->number_of_raws = (current_selection->y2 - current_selection->y1) / tile_width; switch (view_mode) { case SHOW_TILES: tiles_to_brush (); break; case SHOW_MAP: default: map_to_brush (); break; } } /** * Draw highlighting selection */ void supervisor_map_editor::highlight_selection () { char *screen; Uint32 cycle_delay = 0; if (current_selection->x2 == current_selection->x1 || current_selection->y2 == current_selection->y1) { return; } Uint32 x1 = current_selection->x1; Uint32 x2 = current_selection->x2; if (current_selection->y_offset > (Sint32) current_selection->y1 || current_selection->y_offset > (Sint32) current_selection->y2) { return; } Sint32 y1 = current_selection->y1 - current_selection->y_offset; Sint32 y2 = current_selection->y2 - current_selection->y_offset; if (x1 > x2) { Uint32 x = x1; x1 = x2; x2 = x; } Uint32 width = x2 - x1; if (y1 > y2) { Uint32 y = y1; y1 = y2; y2 = y; } Uint32 height = y2 - y1; if (cycled_colors_index++ > MAX_OF_CYCLED_COLORS) { cycled_colors_index = 0; } Uint32 color = cycled_colors_index; /* top border */ if (y1 >= 0 && y1 < (Sint32)screen_height) { screen = game_screen->get_pixel_data (x1, y1); cycle_delay = 0; for (Uint32 i = 0; i < width; i++) { unsigned char pixel = cycled_colors_list[color]; screen[i] = pixel; if (++cycle_delay >= 5) { cycle_delay = 0; if (color++ >= MAX_OF_CYCLED_COLORS) { color = 0; } } } } /* right border */ Uint32 rowsize = game_screen->get_row_size (); screen = game_screen->get_pixel_data (x2 - 1, y1 + 1); for (Sint32 i = 1; i < (Sint32)height; i++) { unsigned char pixel = cycled_colors_list[color]; if ((y1 + i) >= 0 && (y1 + i) < (Sint32) screen_height) { *screen = pixel; } if (++cycle_delay >= 5) { cycle_delay = 0; if (color++ >= MAX_OF_CYCLED_COLORS) { color = 0; } } screen += rowsize; } /* bottom border */ if (y2 >= 0 && y2 < (Sint32)screen_height) { screen = game_screen->get_pixel_data (x1, y2); for (Sint32 i = width - 1; i >= 0; i--) { unsigned char pixel = cycled_colors_list[color]; screen[i] = pixel; if (++cycle_delay >= 5) { cycle_delay = 0; if (color++ >= MAX_OF_CYCLED_COLORS) { color = 0; } } } } /* left border */ screen = game_screen->get_pixel_data (x1, y2 - 1); for (Sint32 i = 1; i < (Sint32)height; i++) { unsigned char pixel = cycled_colors_list[color]; if ((y2 - i) >= 0 && (y2 - i) < (Sint32)screen_height) { *screen = pixel; } if (++cycle_delay >= 5) { cycle_delay = 0; if (color++ > MAX_OF_CYCLED_COLORS) { color = 0; } } screen -= rowsize; } } /** * Allocate a tilesmap brush of the required size * @param number_of_raws number of raws of tiles * @param number_of_cols number of cols of tiles */ void supervisor_map_editor::alloc_tilesmap_brush (Uint32 number_of_raws, Uint32 number_of_cols) { if (NULL != tiles_brush) { delete[]tiles_brush; } Uint32 size = number_of_raws * number_of_cols; try { tiles_brush = new Uint16[size]; } catch (std::bad_alloc &) { std:: cerr << "(!)supervisor_map_editor::alloc_tilesmap_brush() " "not enough memory to allocate " << size << " Uint16!" << std::endl; throw; } } /** * Allocate a bitmap brush of the required size */ void supervisor_map_editor::alloc_brush () { if (NULL != brush_bitmap) { delete brush_bitmap; } brush_bitmap = tiles_map->alloc_brush (tiles_brush, current_selection->number_of_cols, current_selection->number_of_raws); brush_width = current_selection->number_of_cols; brush_height = current_selection->number_of_raws; return; } /** * Draw the current brush */ void supervisor_map_editor::draw_brush () { if (NULL == brush_bitmap) { return; } Uint32 xcoord = keyboard->get_mouse_x (); Uint32 ycoord = keyboard->get_mouse_y (); xcoord &= tile_mask1; ycoord &= tile_mask1; if (xcoord > screen_width - brush_bitmap->get_width ()) { xcoord = screen_width - brush_bitmap->get_width (); } if (ycoord > screen_height - brush_bitmap->get_height ()) { ycoord = screen_height - brush_bitmap->get_height (); } Uint32 map_ycoord = tiles_map->get_y_coord (); bool is_left_down = keyboard->is_left_button (); if (is_left_down && !is_left_button_down) { is_left_button_down = true; brush_posx = xcoord; brush_posy = ycoord; } if (is_left_down && is_left_button_down) { xcoord = brush_posx; ycoord = brush_posy; } else { /* * left mouse button released, copy tiles brush to the map */ if (!is_left_down && is_left_button_down) { is_left_button_down = false; Uint32 i = map_ycoord + brush_posy; i = (i / tiles_map->tile_height); i *= map_width; Uint16 *brush = tiles_brush; Uint16 *table = tiles_map->map_tiles + i; Uint16 *t_end = tiles_map->map_tiles + (tilesmap_scrolling::MAP_HEIGHT * map_width); table += (brush_posx / tiles_map->tile_width); for (i = 0; i < brush_height; i++) { if (table > t_end) { table -= (tilesmap_scrolling::MAP_HEIGHT * map_width); } for (Uint32 j = 0; j < brush_width; j++) { table[j] = *(brush++); } table += map_width; } /* copy a height of the screen (for scrolling rotation) */ table = tiles_map->map_tiles; i = (tilesmap_scrolling::MAP_HEIGHT * map_width); Sint32 tsupp = (display->get_height () / tiles_map->tile_height) * 2; for (Uint32 j = 0; j < (tsupp * map_width); j++) { tiles_map->map_tiles[i++] = table[j]; } } } game_screen->blit_surface (brush_bitmap, 0, 0, xcoord, ycoord - (map_ycoord & tile_mask2), brush_bitmap->get_width (), brush_bitmap->get_height ()); } /** * Save tiles map file */ bool supervisor_map_editor::save_tilesmap () { Uint32 map_size = tilesmap_scrolling::MAP_HEIGHT * map_width; //map_size = map_size * 2; Uint32 bytes_size = map_size * sizeof (Uint16); size_t left; ssize_t bytes_written; /* Uint16 *map2 = new Uint16[map_size]; for (Uint32 v = 0; v < map_size; v++) { map2[v] = 0; } Uint16 *map = (Uint16 *) tiles_map->map_tiles; Uint16 *x2 = map2; for (Uint32 v = 0; v < tilesmap_scrolling::MAP_HEIGHT; v++) { for (Uint32 w = 0; w < map_width; w++) { x2[w] = map[w]; x2[w + map_width] = map[w]; } map = map + map_width; x2 = x2 + map_width + map_width ; } */ Uint16 * filedata; try { filedata = new Uint16[map_size]; } catch (std::bad_alloc &) { std:: cerr << "(!)supervisor_map_editor::save_tilesmap() " "not enough memory to allocate " << map_size << " bytes!" << std::endl; throw; } Uint16 * map = (Uint16 *) tiles_map->map_tiles; //map = map2; unsigned char * buffer = (unsigned char *) filedata; for (Uint32 i = 0; i < map_size; i++) { Uint16 code = *map; code = code << 2; /* convert short int to big endian */ buffer[1] = code; code = code >> 8; buffer[0] = code; map++; buffer += 2; } #ifdef WIN32 /* set umask so that files are group-writable */ _umask (0002); #else umask (0002); #endif const char * filename = "edmap.data"; Sint32 handle = open (filename, O_WRONLY | O_CREAT, 00666); if (-1 == handle) { std::cerr << "supervisor_map_editor::save_tilesmap() file " << filename << "; error " << strerror (errno) << std::endl; delete[]filedata; return false; } left = bytes_size; while (left > 0) { #ifdef WIN32 bytes_written = _write (handle, filedata + bytes_size - left, left); #else bytes_written = write (handle, filedata + bytes_size - left, left); if (bytes_written == -1) { std::cerr << "(!)supervisor_map_editor::save_tilesmap():" << " filename: " << filename << "; error: " << strerror (errno); close (handle); delete[]filedata; return false; } left -= bytes_written; } #endif if (close (handle) == -1) { std::cerr << "supervisor_map_editor::save_tilesmap() file " << filename << "; error " << strerror (errno) << std::endl; delete[]filedata; return false; } delete[]filedata; if (is_verbose) { std::cout << "supervisor_map_editor::save_tilesmap() " << filename << "file was saved" << std::endl; } return true; } const unsigned char supervisor_map_editor::cycled_colors_list[MAX_OF_CYCLED_COLORS] = { 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; tecnoballz-0.93.1/src/sprite_object.cc0000664000175000017500000021610412412501752016734 0ustar brunobruno/** * @file sprite_object.cc * @brief Draw a sprite on the screen * @date 2014-07-27 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_object.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_object.h" /** * Create a sprite object */ sprite_object::sprite_object () { ombredecax = handler_display::SHADOWOFFX * resolution; ombredecay = handler_display::SHADOWOFFY * resolution; ombrepixel = handler_display::SHADOW_PIX; ombrepixe4 = handler_display::SHADOWLONG; sprite_height = 0; sprite_width = 0; screen_height = 0; screen_width = 0; x_maximum = 0; y_maximum = 0; x_minimum = 0; y_minimum = 0; clear_sprite_members (); } /** * Release a sprite object */ sprite_object::~sprite_object () { release_sprite (); } /** * Release memory allocated dynamically bu the sprite object */ void sprite_object::release_sprite () { if (has_allocated_memory) { for (Sint32 i = 0; i < max_of_images; i++) { if (drawing_values[i] != NULL) { delete[]drawing_values[i]; drawing_values[i] = NULL; } if (drawing_data[i] != NULL) { delete[]drawing_data[i]; drawing_data[i] = NULL; } if (is_draw_pixel_by_pixel && drawing_pixels[i] != NULL) { delete[]drawing_pixels[i]; drawing_pixels[i] = NULL; } } if (drawing_values != NULL) { delete[]drawing_values; drawing_values = NULL; } if (drawing_data != NULL) { delete[]drawing_data; drawing_data = NULL; } if (is_draw_pixel_by_pixel && drawing_pixels != NULL) { delete[]drawing_pixels; drawing_pixels = NULL; } if (images_pixel_data != NULL) { delete[]images_pixel_data; images_pixel_data = NULL; } if (drawing_peer_line != NULL) { for (Sint32 i = 0; i < max_of_images; i++) { if (drawing_peer_line[i] != NULL) { delete[]drawing_peer_line[i]; drawing_peer_line[i] = NULL; } } delete[]drawing_peer_line; drawing_peer_line = NULL; } } if (is_release_pixel_data && pixel_data != NULL) { delete[]pixel_data; is_release_pixel_data = false; pixel_data = NULL; } object_free (); } /** * Clear some values */ void sprite_object::clear_sprite_members () { object_init (); pixel_data = (char *) NULL; images_pixel_data = (char **) NULL; screen_ptr = (char *) NULL; shadow_screen_ptr = (char *) NULL; frame_delay = 1; max_of_images = 0; frame_index = 0; is_enabled = false; drawing_values = (Sint16 **) NULL; drawing_data = (char **) NULL; drawing_pixels = (Sint16 **) NULL; collision_height = 0; collision_width = 0; frame_period = 1; x_coord = 0; y_coord = 0; display_pos = 0; frame_index_max = 0; frame_index_min = 0; offsetDest = 0; offsetSrce = 0; current_drawing_values = (Sint16 *) NULL; current_drawing_data = (char *) NULL; current_drawing_pixels = NULL; sprite_has_shadow = false; sprite_type_id = 0; row_size = 0; affligFrst = 0; affligLast = 1; is_mirrored_vertically = false; drawing_peer_line = (bb_afligne **) NULL; has_allocated_memory = false; object_pos = -1; num_of_repeats = 0; cycling_index = 0; current_cycling = &cycling_01[0]; draw_method = COPY_FROM_BITMAP; is_release_pixel_data = false; } /** * Copy sprite members to anotger sprite * @param bobPt destination sprite object */ void sprite_object::duplicate_to (sprite_object * sprite_dest) { sprite_dest->pixel_data = pixel_data; sprite_dest->images_pixel_data = images_pixel_data; sprite_dest->screen_ptr = screen_ptr; sprite_dest->shadow_screen_ptr = shadow_screen_ptr; sprite_dest->frame_delay = frame_delay; sprite_dest->max_of_images = max_of_images; sprite_dest->frame_index = frame_index; sprite_dest->is_enabled = is_enabled; sprite_dest->sprite_height = sprite_height; sprite_dest->sprite_width = sprite_width; sprite_dest->drawing_values = drawing_values; sprite_dest->drawing_data = drawing_data; sprite_dest->drawing_pixels = drawing_pixels; sprite_dest->collision_height = collision_height; sprite_dest->collision_width = collision_width; sprite_dest->screen_height = screen_height; sprite_dest->screen_width = screen_width; sprite_dest->frame_period = frame_period; sprite_dest->x_coord = x_coord; sprite_dest->y_coord = y_coord; sprite_dest->display_pos = display_pos; sprite_dest->x_maximum = x_maximum; sprite_dest->y_maximum = y_maximum; sprite_dest->frame_index_max = frame_index_max; sprite_dest->x_minimum = x_minimum; sprite_dest->y_minimum = y_minimum; sprite_dest->frame_index_min = frame_index_min; sprite_dest->offsetSrce = offsetSrce; sprite_dest->offsetDest = offsetDest; sprite_dest->current_drawing_values = current_drawing_values; sprite_dest->current_drawing_data = current_drawing_data; sprite_dest->current_drawing_pixels = current_drawing_pixels; sprite_dest->sprite_has_shadow = sprite_has_shadow; sprite_dest->sprite_type_id = sprite_type_id; sprite_dest->row_size = row_size; sprite_dest->offscreen_pitch = offscreen_pitch; sprite_dest->draw_method = draw_method; sprite_dest->is_draw_pixel_by_pixel = is_draw_pixel_by_pixel; sprite_dest->has_allocated_memory = false; } /** * Enable the sprite */ void sprite_object::enable () { is_enabled = true; } /** * Disable the sprite */ void sprite_object::disable () { is_enabled = false; } /** * Check if the sprite is enable * @return true if the sprite is enable */ bool sprite_object::is_enable () { return is_enabled; } /** * Return the sprite identifier * @return indentifier of sprite, identify the type of the sprite */ Uint32 sprite_object::get_sprite_type_id () { return sprite_type_id; } /** * Set a number sprite (normally the number of position in list) */ void sprite_object::set_object_pos (Sint32 num) { object_pos = num; } void sprite_object::set_display_pos (Sint32 num) { display_pos = num; } /** * Make a simple sprite * @param bitmap bitmap containing the images of sprite * @param shadow true if the sprite has shadow, false by default */ void sprite_object::make_sprite (surface_sdl * bitmap, bool shadow) { init_common (bitmap, shadow); pixel_data = bitmap->get_pixel_data (); } /** * Initialize some common values * @param bitmap bitmap containing the images of sprite * @param shadow true if the sprite has shadow */ void sprite_object::init_common (surface_sdl * bitmap, bool shadow) { screen_width = display->get_width (); screen_height = display->get_height (); row_size = bitmap->get_row_size (); offscreen_pitch = game_screen->get_row_size (); sprite_has_shadow = shadow; screen_ptr = (char *) NULL; shadow_screen_ptr = (char *) NULL; sprite_width = bitmap->get_width (); sprite_height = bitmap->get_height (); max_of_images = 1; collision_height = sprite_height; collision_width = sprite_width; x_maximum = screen_width - collision_width; y_maximum = screen_height - collision_height; offsetSrce = bitmap->get_line_modulo (sprite_width); offsetDest = game_screen->get_line_modulo (sprite_width); } /** * Allocate memory for graphics data sprite for optimized drawing routines * @param numof maximum mumber of images for this sprite */ void sprite_object::alloc_drawing_tables (Sint32 numof) { has_allocated_memory = true; max_of_images = numof; try { /* draw lines by lines */ if (draw_method == DRAW_LINE_BY_LINE) { affligFrst = 0; affligLast = sprite_height; drawing_peer_line = new bb_afligne* [max_of_images]; for (Sint32 i = 0; i < max_of_images; i++) { bb_afligne *p = new bb_afligne[sprite_height]; drawing_peer_line[i] = p; } } /* table giving address of each images of the sprite * into bitmap source */ images_pixel_data = new char* [max_of_images]; /* drawing tables for offsets and counters values (words and bytes) */ drawing_values = new Sint16* [max_of_images]; /* drawing tables of drawing pixels data */ drawing_data = new char* [max_of_images]; for (Sint32 i = 0; i < max_of_images; i++) { images_pixel_data[i] = NULL; drawing_values[i] = NULL; drawing_data[i] = NULL; } /* table for draw pixel by pixel, used for color cycling */ if (is_draw_pixel_by_pixel) { drawing_pixels = new Sint16 *[max_of_images]; for (Sint32 i = 0; i < max_of_images; i++) { drawing_pixels[i] = NULL; } } } catch (std::bad_alloc &) { std::cerr << "(!)sprite_object::alloc_drawing_tables " << "not enough memory to allocate " << "list of sprite drawing tables for " << max_of_images << " images! " << std::endl; throw; } } /** * Create the structure for drawing the sprite * @param type_id sprite type id, number from 1 to n * @praam image bitmap containing the images of sprite * @param shadow true if it sprite has a shadow, false otherwise * @param by_pixel if true generate additional table to drawing * pixel by pixel. Used for color cyclyng. * False by default */ void sprite_object::create_sprite (Sint32 type_id, surface_sdl * image, bool shadow, bool by_pixel) { is_draw_pixel_by_pixel = by_pixel; if (draw_method == COPY_FROM_BITMAP) { draw_method = DRAW_WITH_TABLES; } sprite_type_id = type_id; init_common (image, shadow); /* read sprite characteristics */ const sprite_description *descr = zelistBOB[sprite_type_id]; sprite_height = descr->height; sprite_height *= resolution; max_of_images = descr->number_of_images; frame_index_max = max_of_images - 1; sprite_width = descr->width; sprite_width *= resolution; collision_height = sprite_height; collision_width = sprite_width; x_maximum = screen_width - sprite_width; y_maximum = screen_height - sprite_height; offsetSrce = image->get_line_modulo (sprite_width); offsetDest = game_screen->get_line_modulo (sprite_width); /* Allocate list for the lists of the drawing tables */ alloc_drawing_tables (max_of_images); /* * generate the drawing tables */ sprite_coordinates *coord = descr->coordinates; /* process each image frame of the sprite animation */ for (Sint32 i = 0; i < max_of_images; i++) { /* counter of the number of pixels of the image frame */ Uint32 pixels_count = 0; /* table size counter of offsets and loops counters values */ Uint32 values_count = 0; Uint32 pos_x = (Sint32) coord[i].xcoord; pos_x *= resolution; pos_x *= 16; Uint32 pos_y = (Sint32) coord[i].ycoord; pos_y *= resolution; /* verify page overflow */ if (pos_y > (image->get_height () - sprite_height) || pos_x > (image->get_width () - sprite_width)) { std::cerr << "(!)sprite_object::create_sprite() " << "sprite_type_id: " << sprite_type_id << "; x2: " << pos_x + sprite_width << "; width of the bitmap: " << image->get_width () << "; y2: " << pos_y + sprite_height << "; height of the bitmap: " << image->get_height () << std::endl; std::cerr << "(!)sprite_object::create_sprite() " << "pox_x: " << coord[i].xcoord << "; pos_y: " << coord[i].ycoord << "; image number: " << i << "; resolution: " << resolution << std::endl; throw std::runtime_error ("(!)sprite_object::create_sprite() " "failed! Coordinates out of range"); } /* * mirror y if request */ if (is_mirrored_vertically) { char *top = image->get_pixel_data (pos_x, pos_y); char *bottom = image->get_pixel_data (pos_x, pos_y + sprite_height - 1); Uint32 next = image->get_row_size (); for (Uint32 j = 0; j < sprite_height / 2; j++) { for (Uint32 k = 0; k < sprite_width; k++) { char pixel = top[k]; top[k] = bottom[k]; bottom[k] = pixel; } top += next; bottom -= next; } } /* * calculation size of the table */ /* counter of the contiguous pixels */ Uint32 contiguous = 0; /* graphic address of the sprite in png image */ char *pixel_data = image->get_pixel_data (pos_x, pos_y); for (Uint32 j = 0; j < sprite_height; j++) { for (Uint32 k = 0; k < sprite_width; k++) { /* read a pixel */ char pixel = *(pixel_data++); if (pixel != 0) { contiguous++; /* increase the size of pixel's table */ pixels_count++; } else { /* at least one pixel? */ if (contiguous > 0) { contiguous = 0; /* increase the size of the counter's table */ values_count++; } } } if (contiguous > 0) { contiguous = 0; values_count++; } pixel_data += offsetSrce; } /* * generate the sprite's table for it displaying */ char *pixels; Sint16 *counters; Sint16 *destW = NULL; try { pixels = new char[pixels_count]; counters = new Sint16[values_count * 3 + 1]; if (is_draw_pixel_by_pixel) { destW = new Sint16[values_count * 2 + 1]; } } catch (std::bad_alloc &) { std::cerr << "(!)sprite_object::create_sprite() " << "not enough memory to allocate " << "drawing tables for " << pixels_count << " pixels! " << std::endl; throw; } /* table of offsets and loops counters */ drawing_values[i] = counters; /* table of the pixels */ drawing_data[i] = pixels; if (is_draw_pixel_by_pixel) { drawing_pixels[i] = destW; } /* * generate the sprite's table for display */ Uint32 offset = 0; /* counter of the contiguous pixels */ contiguous = 0; pixel_data = image->get_pixel_data (pos_x, pos_y); // graphic address images_pixel_data[i] = pixel_data; *(counters++) = (Sint16) values_count; // Nombre d'occurences if (is_draw_pixel_by_pixel) { *(destW++) = (Sint16) values_count; // Nombre d'occurences } values_count = 0; // compteur nombre d'offest et de compteur Sint32 left_offset = 0; bool flagO = false; for (Uint32 j = 0; j < sprite_height; j++) { /* special display mode line peer line (used for gigablitz) */ if (draw_method == DRAW_LINE_BY_LINE) { bb_afligne *p = drawing_peer_line[i]; p[j].TABAFFICH1 = counters; p[j].TABAFFICH2 = pixels; } flagO = false; for (Uint32 k = 0; k < sprite_width; k++) { /* read the pixel */ char pixel = *(pixel_data++); /* transparent? */ if (pixel != 0) { /* no, save pixel value */ *(pixels++) = (Sint16) pixel; contiguous++; } else { /* at least one pixel? */ if (contiguous > 0) { if (is_draw_pixel_by_pixel) { *(destW++) = (Sint16) offset; //previous offset *(destW++) = (Sint16) contiguous; //number of pixel(s) } /* save the previous offset in bytes */ *(counters++) = (Sint16) offset; #ifndef BYTES_COPY /* save the number of 32-bit long words = x4 pixels */ Sint32 n = contiguous >> 2; *(counters++) = (Sint16) n; /* rest 0, 1, 2 or 3 bytes */ contiguous &= 0x003; #else *(counters++) = 0; #endif /* save number of contiguous bytes = x1 pixel */ *(counters++) = (Sint16) contiguous; contiguous = 0; offset = 0; values_count++; //COUNTERTAB++ flagO = true; } if (!flagO) { left_offset++; } offset++; } } //width loop //*** if (contiguous > 0) { if (is_draw_pixel_by_pixel) { *(destW++) = (Sint16) offset; //previous offset *(destW++) = (Sint16) contiguous; //number of pixel(s) } *(counters++) = (Sint16) offset; #ifndef BYTES_COPY /* save the number of 32-bit long words = x4 pixels */ Sint32 n = contiguous >> 2; *(counters++) = (Sint16) n; /* rest 0, 1, 2 or 3 bytes */ contiguous &= 0x003; #else *(counters++) = 0; #endif /* save number of contiguous bytes = x1 pixel */ *(counters++) = (Sint16) contiguous; contiguous = 0; values_count++; //COUNTERTAB++ offset = 0; } pixel_data += offsetSrce; offset += offsetDest; if (draw_method == DRAW_LINE_BY_LINE) { bb_afligne *p = drawing_peer_line[i]; p[j].COUNTERTAB = values_count; p[j].OFFSETLEFT = left_offset; values_count = 0; left_offset = 0; } } /* height loop */ } /* image frame loop */ /* current table of offsets and loops counters */ current_drawing_values = drawing_values[0]; /* current pixles table */ current_drawing_data = drawing_data[0]; if (is_draw_pixel_by_pixel) { current_drawing_pixels = drawing_pixels[0]; } pixel_data = images_pixel_data[0]; //adresse GFX pour routine "draw()" } /** * Set x and y coordinates of the sprite * @param xcoord the x coordinate in pixels * @param ycoord the y coordinate in pixels */ void sprite_object::set_coordinates (Sint32 xcoord, Sint32 ycoord) { x_coord = xcoord; y_coord = ycoord; } /** * Initializes the maximum and minimum coordinates of the sprite */ void sprite_object::init_coords_max_min(Uint32 width_less) { if (sprite_has_shadow) { x_minimum = ombredecax; } else { x_minimum = 0; y_minimum = 0; } x_maximum = screen_width - collision_width - width_less; y_maximum = screen_height - collision_height; } /** * Set x coordinate of the sprite * @param xcoord the x coordinate in pixels */ void sprite_object::set_x_coord (Sint32 xcoord) { x_coord = xcoord; } /** * Set y coordinate of the sprite * @param ycoord the y coordinate in pixels */ void sprite_object::set_y_coord (Sint32 ycoord) { y_coord = ycoord; } /** * Moving the sprite horizontally * @param xoffset the horizontal offset of displacement */ void sprite_object::move_x (Sint32 xoffset) { x_coord += xoffset; } /** * Moving the sprite vertically * @param yoffset the vertical offset of displacement */ void sprite_object::move_y (Sint32 yoffset) { y_coord += yoffset; } /** * Check if the sprite has a shadow * @return true if the sprite has a shadow */ bool sprite_object::has_shadow () { return sprite_has_shadow; } /** * Set or clear the flag sprite shadow * param shadow true if the sprite has a shadow */ void sprite_object::set_shadow (bool shadow) { sprite_has_shadow = shadow; } /** * Get x coordinate * @return x coordinate of the sprite */ Sint32 sprite_object::get_x_coord () { return x_coord; } /** * Get y coordinate * @return y coordinate of the sprite */ Sint32 sprite_object::get_y_coord () { return y_coord; } /** * Set the image to use for this sprite */ void sprite_object::set_image () { Sint32 index = frame_index; pixel_data = images_pixel_data[index]; current_drawing_values = drawing_values[index]; current_drawing_data = drawing_data[index]; if (is_draw_pixel_by_pixel && drawing_pixels) { current_drawing_pixels = drawing_pixels[index]; } } /** * Set the image to use for this sprite * @param index frame index */ void sprite_object::set_image (Sint32 index) { frame_index = index; pixel_data = images_pixel_data[index]; current_drawing_values = drawing_values[index]; current_drawing_data = drawing_data[index]; if (is_draw_pixel_by_pixel) { current_drawing_pixels = drawing_pixels[index]; } } /** * Restore background where sprite was displayed */ void sprite_object::restore_background_under_sprite () { /* if memory address is null, then sprite is not displaying */ if (NULL == screen_ptr) { return; } /* special sprite, restore line by line (gigablitz) */ if (draw_method == DRAW_LINE_BY_LINE) { restore_line_by_line (); return; } #ifndef BYTES_COPY Sint32 *restore32 = (Sint32 *) restore_ptr; Sint32 *screen32 = (Sint32 *) screen_ptr; screen_ptr = (char *) NULL; Sint16 *counters = current_drawing_values; Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); restore32 = (Sint32 *) ((char *) restore32 + k); /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen32++) = *(restore32++); } /* number of contiguous long words */ k = *(counters++); char *screen8 = (char *) screen32; char *restore8 = (char *) restore32; for (Sint32 j = 0; j < k; j++) { *(screen8++) = *(restore8++); } screen32 = (Sint32 *) screen8; restore32 = (Sint32 *) restore8; } #else char *restore = restore_ptr; char *screen = screen_ptr; screen_ptr = (char *) NULL; Sint16 *counters = current_drawing_values; Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen += k; restore += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen++) = *(restore++); } } #endif } /** * Restore background where line by line (used for gigablitz) */ void sprite_object::restore_line_by_line () { bb_afligne *p = drawing_peer_line[frame_index]; Sint32 l = affligFrSv; Sint16 o = p[l].OFFSETLEFT; Uint32 t = (Uint32) p[l].COUNTERTAB; Uint16 *gfxPT = (Uint16 *) p[l].TABAFFICH1; gfxPT++; #ifndef BYTES_COPY Sint32 *srcPT = (Sint32 *) restore_ptr; Sint32 *adres = (Sint32 *) screen_ptr; screen_ptr = (char *) NULL; for (Uint32 i = 0; i < t; i++) { adres = (Sint32 *) ((char *) adres + o); srcPT = (Sint32 *) ((char *) srcPT + o); o = *(gfxPT++); //number of pixels contigus for (Sint32 k = 0; k < o; k++) *(adres++) = *(srcPT++); o = *(gfxPT++); //number of pixels contigus char *adreb = (char *) adres; char *srcPB = (char *) srcPT; for (Sint32 k = 0; k < o; k++) *(adreb++) = *(srcPB++); adres = (Sint32 *) adreb; srcPT = (Sint32 *) srcPB; o = *(gfxPT++); //offset } l++; for (; l < affligLaSv; l++) { gfxPT = (Uint16 *) p[l].TABAFFICH1; t = (Uint32) p[l].COUNTERTAB; for (Uint32 i = 0; i < t; i++) { o = *(gfxPT++); //offset adres = (Sint32 *) ((char *) adres + o); srcPT = (Sint32 *) ((char *) srcPT + o); o = *(gfxPT++); //number of pixels contigus for (Sint32 k = 0; k < o; k++) *(adres++) = *(srcPT++); o = *(gfxPT++); //number of pixels contigus char *adreb = (char *) adres; char *srcPB = (char *) srcPT; for (Sint32 k = 0; k < o; k++) *(adreb++) = *(srcPB++); adres = (Sint32 *) adreb; srcPT = (Sint32 *) srcPB; } } #else char *srcPT = restore_ptr; char *adres = screen_ptr; screen_ptr = (char *) NULL; for (Uint32 i = 0; i < t; i++) { adres = adres + o; srcPT = srcPT + o; gfxPT++; o = *(gfxPT++); //number of pixels contigus for (Sint32 k = 0; k < o; k++) *(adres++) = *(srcPT++); o = *(gfxPT++); //offset } l++; for (; l < affligLaSv; l++) { gfxPT = (Uint16 *) p[l].TABAFFICH1; t = (Uint32) p[l].COUNTERTAB; for (Uint32 i = 0; i < t; i++) { o = *(gfxPT++); //offset adres = adres + o; srcPT = srcPT + o; gfxPT++; o = *(gfxPT++); //number of pixels contigus for (Sint32 k = 0; k < o; k++) *(adres++) = *(srcPT++); } } #endif } /** * Return current animation offset * @return the current frame index */ Sint32 sprite_object::get_frame_index () { return frame_index; } /** * Restore background where sprite's shadow was displayed */ void sprite_object::restore_background_under_shadow () { if (NULL == shadow_screen_ptr) { return; } #ifndef BYTES_COPY Sint32 *restore32 = (Sint32 *) shadow_restore_ptr; Sint32 *screen32 = (Sint32 *) shadow_screen_ptr; shadow_screen_ptr = (char *) NULL; Sint16 *counters = current_drawing_values; Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); restore32 = (Sint32 *) ((char *) restore32 + k); /* number of contiguous 32-bit words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen32++) = *(restore32++); } /* number of contiguous bytes */ k = *(counters++); char *screen8 = (char *) screen32; char *restore8 = (char *) restore32; for (Sint32 j = 0; j < k; j++) { *(screen8++) = *(restore8++); } screen32 = (Sint32 *) screen8; restore32 = (Sint32 *) restore8; } #else char *restore = shadow_restore_ptr; char *screen = shadow_screen_ptr; shadow_screen_ptr = (char *) NULL; Sint16 *counters = current_drawing_values; Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen += k; restore += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen++) = *(restore++); } } #endif } /** * Draw a sprite into the offscreen */ void sprite_object::draw () { if (!is_enabled || frame_index >= max_of_images) { return; } switch (draw_method) { case DRAW_WITH_TABLES: draw_with_tables (); break; case COPY_FROM_BITMAP: draw_copy_from_bitmap (); break; case DRAW_LINE_BY_LINE: draw_line_by_line (); break; case DRAW_REPEAT_SPRITE: draw_vertically_repeated (); break; case DRAW_COLOR_CYCLING_MASK: draw_cycling_color (); break; case DRAW_CAPSULE: draw_capsule (); break; } } /** * Draw a sprite with tables to optimize the copy * It is the method most frequently used */ void sprite_object::draw_with_tables () { restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); #ifndef BYTES_COPY Sint32 *screen32 = (Sint32 *) game_screen->get_pixel_data (x_coord, y_coord); screen_ptr = (char *) screen32; /* pixels data of the sprite image */ Sint32 *pixels32 = (Sint32 *) current_drawing_data; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_values; /* height of the sprite in pixels */ Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { Sint32 p = *(pixels32++); *(screen32++) = p; } /* number of contiguous bytes */ k = *(counters++); char *pixels8 = (char *) pixels32; char *screen8 = (char *) screen32; for (Sint32 j = 0; j < k; j++) { char p = *(pixels8++); *(screen8++) = p; } pixels32 = (Sint32 *) pixels8; screen32 = (Sint32 *) screen8; } #else char *screen = game_screen->get_pixel_data (x_coord, y_coord); screen_ptr = screen; /* pixels data of the sprite image */ char *pixels = current_drawing_data; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_values; /* height of the sprite in pixels */ Uint32 t = (Uint32) * (counters++); for (Uint32 i = 0; i < t; i++) { /* offset */ Sint16 k = *(counters++); screen += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen++) = *(pixels++); } } #endif } /** * Draw a color cycling sprite mask (paddle's fires and guardian's fires) */ void sprite_object::draw_cycling_color () { cycling_index &= 7; Sint32 pixel = current_cycling[cycling_index++]; restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); #ifndef BYTES_COPY Sint32 *screen32 = (Sint32 *) game_screen->get_pixel_data (x_coord, y_coord); screen_ptr = (char *) screen32; /* pixels data of the sprite image */ Sint32 *pixels32 = (Sint32 *) current_drawing_data; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_values; /* height of the sprite in pixels */ Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen32++) = pixel; } /* number of contiguous bytes */ k = *(counters++); char *pixels8 = (char *) pixels32; char *screen8 = (char *) screen32; for (Sint32 j = 0; j < k; j++) { *(screen8++) = pixel; } pixels32 = (Sint32 *) pixels8; screen32 = (Sint32 *) screen8; } #else char *screen = game_screen->get_pixel_data (x_coord, y_coord); screen_ptr = screen; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_values; Uint32 t = (Uint32) * (counters++); for (Uint32 i = 0; i < t; i++) { /* offset */ Sint16 k = *(counters++); screen += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen++) = pixel; } } #endif } /** * Draw somes capsules with color cyling */ void sprite_object::draw_capsule () { cycling_index &= 7; Sint32 color = current_cycling[cycling_index++]; char *screen = game_screen->get_pixel_data (x_coord, y_coord); screen_ptr = screen; restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); /* pixels data of the sprite image */ char *pixels = current_drawing_data; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_pixels; Uint32 h = (Uint32) * (counters++); for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen = screen + k; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { char p = *(pixels++); if (p == 29) { *(screen++) = color; } else { *(screen++) = p; } } } } /** * Draw sprite. Sprite image will be repeated vertically * Used only for the vertical gauge of the guardian's life level */ void sprite_object::draw_vertically_repeated () { restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); screen_ptr = game_screen->get_pixel_data (x_coord, y_coord); Sint32 yoffset = 0; for (Sint32 r = 0; r < num_of_repeats; r++, yoffset += sprite_height) { /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_values; Uint32 h = (Uint32) * (counters++); #ifndef BYTES_COPY Sint32 *screen32 = (Sint32 *) game_screen->get_pixel_data (x_coord, y_coord + yoffset); /* pixels data of the sprite image */ Sint32 *pixels32 = (Sint32 *) current_drawing_data; for (Uint32 i = 0; i < h; i++) { /* offset in bytes */ Sint16 k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { Sint32 pixels = *(pixels32++); *(screen32++) = pixels; } /* number of contiguous bytes */ k = *(counters++); char *pixels8 = (char *) pixels32; char *screen8 = (char *) screen32; for (Sint32 j = 0; j < k; j++) { char pixel = *(pixels8++); *(screen8++) = pixel; } pixels32 = (Sint32 *) pixels8; screen32 = (Sint32 *) screen8; } #else char *screen = game_screen->get_pixel_data (x_coord, y_coord + yoffset); /* pixels data of the sprite image */ char *pixels = current_drawing_data; for (Uint32 i = 0; i < h; i++) { /* offset in bytes */ Sint16 k = *(counters++); screen += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { char pixel = *(pixels++); *(screen++) = pixel; } } #endif } } /** * Draw a sprite line by line, always by using tables. * Method used for the gigablitz vertical clipping only */ void sprite_object::draw_line_by_line () { bb_afligne *p = drawing_peer_line[frame_index]; restore_ptr = background_screen->get_pixel_data (x_coord, y_coord + affligFrst); affligFrSv = affligFrst; affligLaSv = affligLast; Sint32 l = affligFrst; Uint32 h = (Uint32) p[l].COUNTERTAB; /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) p[l].TABAFFICH1; Sint16 k = p[l].OFFSETLEFT; counters++; #ifndef BYTES_COPY Sint32 *screen32 = (Sint32 *) game_screen->get_pixel_data (x_coord, y_coord + affligFrst); Sint32 *pixels32 = (Sint32 *) p[l].TABAFFICH2; screen_ptr = (char *) screen32; for (Uint32 i = 0; i < h; i++) { screen32 = (Sint32 *) ((char *) screen32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { Sint32 pixels = *(pixels32++); *(screen32++) = pixels; } /* number of contiguous bytes */ k = *(counters++); char *pixels8 = (char *) pixels32; char *screen8 = (char *) screen32; for (Sint32 j = 0; j < k; j++) { char pixel = *(pixels8++); *(screen8++) = pixel; } pixels32 = (Sint32 *) pixels8; screen32 = (Sint32 *) screen8; /* offset in bytes */ k = *(counters++); } l++; for (; l < affligLast; l++) { h = (Uint32) p[l].COUNTERTAB; counters = (Uint16 *) p[l].TABAFFICH1; pixels32 = (Sint32 *) p[l].TABAFFICH2; for (Uint32 i = 0; i < h; i++) { k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { Sint32 pixels = *(pixels32++); *(screen32++) = pixels; } /* number of contiguous bytes */ k = *(counters++); char *pixels8 = (char *) pixels32; char *screen8 = (char *) screen32; for (Sint32 j = 0; j < k; j++) { char pixel = *(pixels8++); *(screen8++) = pixel; } pixels32 = (Sint32 *) pixels8; screen32 = (Sint32 *) screen8; } } #else char *screen = game_screen->get_pixel_data (x_coord, y_coord + affligFrst); char *pixels = p[l].TABAFFICH2; screen_ptr = screen; for (Uint32 i = 0; i < h; i++) { screen += k; counters++; /* number of contiguous pixels */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { char pixel = *(pixels++); *(screen++) = pixel; } /* offset in bytes */ k = *(counters++); } l++; for (; l < affligLast; l++) { h = (Uint32) p[l].COUNTERTAB; counters = (Uint16 *) p[l].TABAFFICH1; pixels = p[l].TABAFFICH2; for (Uint32 i = 0; i < h; i++) { k = *(counters++); screen += k; counters++; /* number of contiguous pixels */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { char pixel = *(pixels++); *(screen++) = pixel; } } } #endif } /** * Draw a sprite shadow in the game offscreen */ void sprite_object::draw_shadow () { if (!is_enabled || !sprite_has_shadow) { return; } shadow_restore_ptr = background_screen->get_pixel_data (x_coord + ombredecax, y_coord + ombredecay); Uint16 *counters = (Uint16 *) current_drawing_values; /* height of the sprite in pixels */ Uint32 h = (Uint32) * (counters++); Uint32 mask = ombrepixe4; #ifndef BYTES_COPY Sint32 *screen32 = (Sint32 *) game_screen->get_pixel_data (x_coord + ombredecax, y_coord + ombredecay); shadow_screen_ptr = (char *) screen32; for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen32 = (Sint32 *) ((char *) screen32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen32++) |= mask; } /* number of contiguous bytes */ k = *(counters++); char *screen8 = (char *) screen32; for (Sint32 j = 0; j < k; j++) { *(screen8++) |= mask; } screen32 = (Sint32 *) screen8; } #else char *screen = game_screen->get_pixel_data (x_coord + ombredecax, y_coord + ombredecay); shadow_screen_ptr = screen; for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); screen += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(screen++) |= mask; } } #endif } /** * Draw a sprite in the brackground surface. * (build the background before a bricks level) */ void sprite_object::draw_to_brackground () { restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); /* offsets and counters of loops for copies */ Uint16 *counters = (Uint16 *) current_drawing_values; /* height of the sprite in pixels */ Uint32 h = (Uint32) * (counters++); #ifndef BYTES_COPY Sint32 *background32 = (Sint32 *) background_screen->get_pixel_data (x_coord, y_coord); screen_ptr = (char *) background32; Sint32 *pixels32 = (Sint32 *) current_drawing_data; for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); background32 = (Sint32 *) ((char *) background32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { Sint32 p = *(pixels32++); *(background32++) = p; } /* number of contiguous bytes */ k = *(counters++); char *pixels8 = (char *) pixels32; char *background8 = (char *) background32; for (Sint32 j = 0; j < k; j++) { char p = *(pixels8++); *(background8++) = p; } pixels32 = (Sint32 *) pixels8; background32 = (Sint32 *) background8; } #else char *background = background_screen->get_pixel_data (x_coord, y_coord); screen_ptr = background; char *pixels = current_drawing_data; for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); background += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { char p = *(pixels++); *(background++) = p; } } #endif } /** * Draw a shadow in the brackground offscreen */ void sprite_object::draw_shadow_to_brackground () { shadow_restore_ptr = background_screen->get_pixel_data (x_coord + ombredecax, y_coord + ombredecay); Uint16 *counters = (Uint16 *) current_drawing_values; /* height of the sprite in pixels */ Uint32 h = (Uint32) * (counters++); #ifndef BYTES_COPY Sint32 *background32 = (Sint32 *) background_screen->get_pixel_data (x_coord + ombredecax, y_coord + ombredecay); shadow_screen_ptr = (char *) background32; Sint32 p = ombrepixe4; for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); background32 = (Sint32 *) ((char *) background32 + k); /* number of contiguous long words */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(background32++) |= p; } /* number of contiguous bytes */ k = *(counters++); char *background8 = (char *) background32; for (Sint32 j = 0; j < k; j++) { *(background8++) |= p; } background32 = (Sint32 *) background8; } #else char p = ombrepixel; char *background = background_screen->get_pixel_data (x_coord + ombredecax, y_coord + ombredecay); shadow_screen_ptr = background; for (Uint32 i = 0; i < h; i++) { /* offset */ Sint16 k = *(counters++); background += k; counters++; /* number of contiguous bytes */ k = *(counters++); for (Sint32 j = 0; j < k; j++) { *(background++) |= p; } } #endif } /** * Draw a sprite into the game offscreen (copy byte to byte, no table) */ void sprite_object::draw_copy_from_bitmap () { if (!is_enabled) { return; } char *s = pixel_data; char *d = game_screen->get_pixel_data (x_coord, y_coord); restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); screen_ptr = d; Sint32 m = row_size; Sint32 n = offscreen_pitch; Sint32 h = sprite_height; Sint32 l = sprite_width; for (Sint32 i = 0; i < h; i++) { for (Sint32 j = 0; j < l; j++) { /* read the pixel */ char p = s[j]; /* black color? */ if (p != 0) { /* no, put the pixel */ d[j] = p; } } s += m; d += n; } } /** * Simple byte to byte copy of the sprite in the game offscreen */ void sprite_object::copy_to_game_screen () { if (!is_enabled) { return; } char *s = pixel_data; char *d = game_screen->get_pixel_data (x_coord, y_coord); restore_ptr = background_screen->get_pixel_data (x_coord, y_coord); screen_ptr = d; Uint32 row = row_size; Uint32 pitch = offscreen_pitch; Uint32 h = sprite_height; Uint32 w = sprite_width; for (Uint32 i = 0; i < h; i++) { for (Uint32 j = 0; j < w; j++) { d[j] = s[j]; } s += row; d += pitch; } } /** * Restore rectanble background where sprite was displayed */ void sprite_object::restore_rectangle_background () { if (NULL == screen_ptr) { return; } char *s = restore_ptr; char *d = screen_ptr; screen_ptr = (char *) NULL; Uint32 pitch = offscreen_pitch; Uint32 h = sprite_height; Uint32 w = sprite_width; for (Uint32 i = 0; i < h; i++) { for (Uint32 j = 0; j < w; j++) { /* restore the pixel */ d[j] = s[j]; } s += pitch; d += pitch; } } /** * Position sprite on the other one * @param sprite Pointer to a sprite object * @param xoffset * @param yoffset */ void sprite_object::pull (sprite_object * sprite, Sint32 xoffset, Sint32 yoffset) { x_coord = (sprite->x_coord) + xoffset - (collision_width >> 1); y_coord = (sprite->y_coord) + yoffset - (collision_height >> 1); } /** * Position sprite on the other one * @param sprite Pointer to a sprite object * @param xoffset * @param yoffset */ void sprite_object::attract (sprite_object * sprite, Sint32 xoffset, Sint32 yoffset) { x_coord = (sprite->x_coord) + xoffset - ((collision_width - sprite->collision_width) >> 1); y_coord = (sprite->y_coord) + yoffset - ((collision_height - sprite->collision_height) >> 1); } /** * Check collision beetween two sprites * @param sprite Pointer to a sprite object * @return true if collision occurs, otherwise false */ bool sprite_object::collision (sprite_object * sprite) { Sint32 x1 = x_coord; Sint32 y1 = y_coord; Sint32 x2 = sprite->x_coord; Sint32 y2 = sprite->y_coord; return (x2 + (Sint32)sprite->collision_width > x1 && x2 - (Sint32)collision_width < x1 && y2 + (Sint32)sprite->collision_height > y1 && y2 - (Sint32)collision_height < y1); } /** * Check collision beetween a sprite and a segment * @param sprite Pointer to a sprite object * @return true if collision occurs, otherwise false */ bool sprite_object::collision (Sint32 x1, Sint32 y1, Sint32 x2, Sint32 y2) { Sint32 xmin, xmax; Sint32 ymin, ymax; /* Swap points for x1 < x2 to be true */ if (x1 > x2) { Sint32 tmp = x2; x2 = x1; x1 = tmp; tmp = y2; y2 = y1; y1 = tmp; } xmin = x1; xmax = x2; if (y1 < y2) { ymin = y1; ymax = y2; } else { ymin = y2; ymax = y1; } /* Condition sine qua none */ if (!(xmin < x_coord + (Sint32)collision_width && ymin < y_coord + (Sint32)collision_height && xmax > x_coord && ymax > y_coord)) { return false; } /* Both points are in the "vertical band" */ if (xmin > x_coord && xmin < x_coord + (Sint32)collision_width && xmax > x_coord && xmax < x_coord + (Sint32)collision_width) { return true; } /* Check for diagonals and every remaining cases */ float alpha = (y2 - y1) / (x2 - x1); Sint32 x0 = -alpha * x1 + y1; if (x1 < x_coord) { Sint32 ytest = alpha * x_coord + x0; if (ytest > y_coord && ytest < y_coord + (Sint32)collision_height) { return true; } } if (x2 > x_coord + (Sint32)collision_width) { Sint32 ytest = alpha * (x_coord + (Sint32)collision_width) + x0; if (ytest > y_coord && ytest < y_coord + (Sint32)collision_height) { return true; } } return false; } /** * Set the frame delay and period, the speed of animation * @param delay time delay before next image */ void sprite_object::set_frame_delay (Sint32 delay) { frame_delay = delay; frame_period = delay; } /** * Set the frame period, the speed of animation * @param period time delay before next image */ void sprite_object::set_frame_period (Sint32 period) { frame_period = period; } /** * The animation is played once * @return true if animation is finished */ bool sprite_object::play_animation_once () { if (--frame_delay > 0) { return is_enabled; } frame_delay = frame_period; if (frame_index == frame_index_max) { frame_index = frame_index_min; is_enabled = false; } else { frame_index++; set_image (frame_index); } return is_enabled; } /** * The animation is played in loop-mode */ void sprite_object::play_animation_loop () { if (--frame_delay > 0) { return; } frame_delay = frame_period; if (frame_index == frame_index_max) { frame_index = frame_index_min; set_image (frame_index); } else { frame_index++; set_image (frame_index); } } /** * Change the current image of the sprite * @param index Index of the current image */ void sprite_object::new_offset (Sint32 index) { frame_index = index; set_image (index); } /** * Clip coordinates of the sprite into offscreen coordinates */ void sprite_object::clip_coordinates () { if (x_coord < 0) { x_coord = 0; } else if (x_coord > (Sint32)(screen_width - sprite_width)) { x_coord = screen_width - sprite_width; } if (y_coord < 0) { y_coord = 0; } else if (y_coord > (Sint32)(screen_height - sprite_height)) { y_coord = screen_height - sprite_height; } } /** * Get sprite's width * @return the width of the sprite in pixels */ Uint32 sprite_object::get_sprite_width () { return sprite_width; } /** * Get sprite's height * @return the height of the sprite in pixels */ Uint32 sprite_object::get_sprite_height () { return sprite_height; } /** * Get sprite's width for collision * @return the width of sprite for the collisions */ Uint32 sprite_object::get_collision_width () { return collision_width; } /** * Enable the repeat vetical of drawing of the sprite * used only for the vertical gauge of the guadian's energy level * @param numof_repeats 2 to n */ void sprite_object::enable_vertical_repeat (Uint32 numof_repeats) { if (numof_repeats < 2) { return; } num_of_repeats = numof_repeats; draw_method = DRAW_REPEAT_SPRITE; } /** * Set the method of displaying used to draw the sprite * @param method draw method */ void sprite_object::set_draw_method (Uint32 method) { draw_method = method; } /** * Set pixel data of the sprite * @param pixel pointer to the pixel data * @param is_release true if the object must release the * pixel data memory at its destruction */ void sprite_object::set_pixel_data (char *pixel, bool is_release) { pixel_data = pixel; is_release_pixel_data = is_release; } /* * Statics members */ /** Color cylcing from paddle's projectiles of fire 1 */ const Sint32 sprite_object::cycling_01[] = { 0x7e7e7e7e, 0x7e7e7e7e, 0x4b4b4b4b, 0x4b4b4b4b, 0x7a7a7a7a, 0x7a7a7a7a, 0x18181818, 0x5a5a5a5a }; /** Color cylcing from paddle's projectiles of fire 2 */ const Sint32 sprite_object::cycling_02[] = { 0x3f3f3f3f, 0x3f3f3f3f, 0x17171717, 0x17171717, 0x35353535, 0x35353535, 0x18181818, 0x22222222 }; /** Ship ennemies */ sprite_coordinates BOB_POS000[] = { /* ship 1 */ {0, 70}, {1, 70}, {2, 70}, {3, 70}, {4, 70}, {5, 70}, {6, 70}, {7, 70}, /* ship 2 */ {0, 86}, {1, 86}, {2, 86}, {3, 86}, {4, 86}, {5, 86}, {6, 86}, {7, 86}, /* ship 3 */ {0, 102}, {1, 102}, {2, 102}, {3, 102}, {4, 102}, {5, 102}, {6, 102}, {7, 102}, /* ship 4 */ {0, 118}, {1, 118}, {2, 118}, {3, 118}, {4, 118}, {5, 118}, {6, 118}, {7, 118}, /* ship 5 */ {0, 134}, {1, 134}, {2, 134}, {3, 134}, {4, 134}, {5, 134}, {6, 134}, {7, 134}, /* ship 6 */ {0, 150}, {1, 150}, {2, 150}, {3, 150}, {4, 150}, {5, 150}, {6, 150}, {7, 150}, /* ship 7 */ {0, 166}, {1, 166}, {2, 166}, {3, 166}, {4, 166}, {5, 166}, {6, 166}, {7, 166}, /* ship 8 */ {0, 182}, {1, 182}, {2, 182}, {3, 182}, {4, 182}, {5, 182}, {6, 182}, {7, 182}, /* ship 9 */ {0, 198}, {1, 198}, {2, 198}, {3, 198}, {4, 198}, {5, 198}, {6, 198}, {7, 198}, /* ship 10 */ {0, 214}, {1, 214}, {2, 214}, {3, 214}, {4, 214}, {5, 214}, {6, 214}, {7, 214}, /* ship 11 */ {8, 70}, {9, 70}, {10, 70}, {11, 70}, {12, 70}, {13, 70}, {14, 70}, {15, 70}, /* ship 12 */ {8, 86}, {9, 86}, {10, 86}, {11, 86}, {12, 86}, {13, 86}, {14, 86}, {15, 86}, /* ship 13 */ {8, 102}, {9, 102}, {10, 102}, {11, 102}, {12, 102}, {13, 102}, {14, 102}, {15, 102}, /* ship 14 */ {8, 118}, {9, 118}, {10, 118}, {11, 118}, {12, 118}, {13, 118}, {14, 118}, {14, 118}, /* ship 15 */ {8, 134}, {9, 134}, {10, 134}, {11, 134}, {12, 134}, {13, 134}, {14, 134}, {15, 134}, /* ship 16 */ {8, 150}, {9, 150}, {10, 150}, {11, 150}, {12, 150}, {13, 150}, {14, 150}, {15, 150}, /* ship 17 */ {8, 166}, {9, 166}, {10, 166}, {11, 166}, {12, 166}, {13, 166}, {14, 166}, {15, 166}, /* ship 18 */ {8, 182}, {9, 182}, {10, 182}, {11, 182}, {12, 182}, {13, 182}, {14, 182}, {15, 182}, /* ship 19 */ {8, 198}, {9, 198}, {10, 198}, {11, 198}, {12, 198}, {13, 198}, {14, 198}, {15, 198}, /* ship 20 */ {8, 214}, {9, 214}, {10, 214}, {11, 214}, {12, 214}, {13, 214}, {14, 214}, {15, 214}, /* ship's explosion 1 */ {0, 54}, {1, 54}, {2, 54}, {3, 54}, {4, 54}, {5, 54}, {6, 54}, {7, 54}, /* ship's explosion 2 */ {8, 54}, {9, 54}, {10, 54}, {11, 54}, {12, 54}, {13, 54}, {14, 54}, {15, 54} }; sprite_description BOB_NUM000 = { 16, 16, 22 * 8, BOB_POS000 }; /** Ejectors */ sprite_coordinates BOB_POS001[] = { {14, 5} }; sprite_description BOB_NUM001 = { 16, 16, 1, BOB_POS001 }; sprite_coordinates BOB_POS002[] = { {15, 5} }; sprite_description BOB_NUM002 = { 16, 16, 1, BOB_POS002 }; sprite_coordinates BOB_POS003[] = { {16, 5} }; sprite_description BOB_NUM003 = { 16, 16, 1, BOB_POS003 }; sprite_coordinates BOB_POS004[] = { {17, 5} }; sprite_description BOB_NUM004 = { 16, 16, 1, BOB_POS004 }; /* Bricks */ /** Vertical side brick */ sprite_coordinates BOB_POS005[] = { {18, 5} }; sprite_description BOB_NUM005 = { 4, 16, 1, BOB_POS005 }; /** Horizontal side brick */ sprite_coordinates BOB_POS006[] = { {11, 0} }; sprite_description BOB_NUM006 = { 16, 4, 1, BOB_POS006 }; sprite_coordinates /** Standard brick */ BOB_POS007[] = { {14, 21} }; sprite_description BOB_NUM007 = { 16, 7, 1, BOB_POS007 }; /** Paddles */ sprite_coordinates BOB_POS008[28] = { {0, 0}, {4, 0}, {8, 0}, {12, 0}, {16, 0}, {20, 0}, {24, 0}, {0, 8}, {4, 8}, {8, 8}, {12, 8}, {16, 8}, {20, 8}, {24, 8}, {0, 16}, {4, 16}, {8, 16}, {12, 16}, {16, 16}, {20, 16}, {24, 16}, {0, 24}, {4, 24}, {8, 24}, {12, 24}, {16, 24}, {20, 24}, {24, 24} }; sprite_description BOB_NUM008 = { 64, 8, 28, BOB_POS008 }; sprite_coordinates BOB_POS009[28] = { {0, 32}, {1, 32}, {2, 32}, {3, 32}, {4, 32}, {5, 32}, {6, 32}, {7, 32}, {8, 32}, {9, 32}, {10, 32}, {11, 32}, {12, 32}, {13, 32}, {14, 32}, {15, 32}, {16, 32}, {17, 32}, {18, 32}, {19, 32}, {20, 32}, {21, 32}, {22, 32}, {23, 32}, {24, 32}, {25, 32}, {26, 32}, {27, 32} }; sprite_description BOB_NUM009 = { 8, 64, 28, BOB_POS009 }; /** The seven gigablitz */ sprite_coordinates BOB_POS021[1] = { {0, 0} }; sprite_description BOB_NUM021 = { 16, 32, 1, BOB_POS021 }; sprite_coordinates BOB_POS022[1] = { {0, 32} }; sprite_description BOB_NUM022 = { 24, 48, 1, BOB_POS022 }; sprite_coordinates BOB_POS023[1] = { {0, 80} }; sprite_description BOB_NUM023 = { 32, 64, 1, BOB_POS023 }; sprite_coordinates BOB_POS024[1] = { {0, 144} }; sprite_description BOB_NUM024 = { 40, 80, 1, BOB_POS024 }; sprite_coordinates BOB_POS025[1] = { {0, 224} }; sprite_description BOB_NUM025 = { 48, 96, 1, BOB_POS025 }; sprite_coordinates BOB_POS026[1] = { {0, 320} }; sprite_description BOB_NUM026 = { 56, 112, 1, BOB_POS026 }; sprite_coordinates BOB_POS027[1] = { {0, 432} }; sprite_description BOB_NUM027 = { 64, 128, 1, BOB_POS027 }; /** Balls */ sprite_coordinates BOB_POS010[] = { /* size 1 green ball */ {14, 46}, /* size 1 grey ball */ {1, 497}, /* size 1 yellow ball */ {14, 28}, /* size 2 green ball */ {15, 37}, /* size 2 grey ball */ {2, 497}, /* size 2 yellow ball */ {15, 28}, /* size 3 green ball */ {3, 488}, /* size 3 grey ball */ {3, 497}, /* size 3 yellow ball */ {14, 37} }; sprite_description BOB_NUM010 = { 9, 9, 9, BOB_POS010 }; /** Projectiles fired by a paddle in bricks level */ sprite_coordinates BOB_POS011[] = { /* projectile used for the fire power 1 */ {3, 0}, {4, 0}, {5, 0}, {6, 0}, /* projectile used for the fire power 2 */ {7, 0}, {8, 0}, {9, 0}, {10, 0} }; sprite_description BOB_NUM011 = { 5, 5, 8, BOB_POS011 }; /** The money capsule */ sprite_coordinates BOB_POS012[] = { {7, 33}, {8, 33}, {9, 33}, {10, 33}, {11, 33}, {12, 33}, {13, 33} }; sprite_description BOB_NUM012 = { 16, 7, 7, BOB_POS012 }; /** Capsule bonuses or a penalties */ sprite_coordinates BOB_POS013[] = { /* expand paddles */ {0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}, /* shrink paddles */ {0, 12}, {1, 12}, {2, 12}, {3, 12}, {4, 12}, {5, 12}, {6, 12}, /* extra life */ {0, 19}, {1, 19}, {2, 19}, {3, 19}, {4, 19}, {5, 19}, {6, 19}, /* lose a life */ {0, 26}, {1, 26}, {2, 26}, {3, 26}, {4, 26}, {5, 26}, {6, 26}, /* power ball 1 */ {0, 33}, {1, 33}, {2, 33}, {3, 33}, {4, 33}, {5, 33}, {6, 33}, /* power ball 2 */ {0, 40}, {1, 40}, {2, 40}, {3, 40}, {4, 40}, {5, 40}, {6, 40}, /* extra balls */ {0, 47}, {1, 47}, {2, 47}, {3, 47}, {4, 47}, {5, 47}, {6, 47}, /* multi balls */ {7, 5}, {8, 5}, {9, 5}, {10, 5}, {11, 5}, {12, 5}, {13, 5}, /* fire power 1 */ {7, 12}, {8, 12}, {9, 12}, {10, 12}, {11, 12}, {12, 12}, {13, 12}, /* fire power 2 */ {7, 19}, {8, 19}, {9, 19}, {10, 19}, {11, 19}, {12, 19}, {13, 19}, /* glue */ {7, 26}, {8, 26}, {9, 26}, {10, 26}, {11, 26}, {12, 26}, {13, 26}, /* inverse control */ {7, 40}, {8, 40}, {9, 40}, {10, 40}, {11, 40}, {12, 40}, {13, 40}, /* balls size 2 */ {17, 219}, {18, 219}, {18, 246}, {19, 246}, {19, 261}, {19, 239}, {16, 268}, /* balls size 3 */ {17, 268}, {18, 268}, {19, 268}, {10, 481}, {11, 481}, {12, 481}, {13, 481}, /* chance capsule */ {14, 392}, {14, 399}, {14, 406}, {14, 413}, {14, 420}, {14, 427}, {14, 434}, /* enable hugely options */ {15, 392}, {15, 399}, {15, 406}, {15, 413}, {15, 420}, {15, 427}, {15, 434}, /* enable bottom wall */ {0, 635}, {1, 635}, {2, 635}, {3, 635}, {4, 635}, {5, 635}, {6, 635}, /* enable bottom robot paddle */ {7, 635}, {8, 635}, {9, 635}, {10, 635}, {11, 635}, {12, 635}, {13, 635}, /* enable the balls control */ {14, 635}, {15, 635}, {16, 635}, {17, 635}, {18, 635}, {19, 635}, {2, 490}, /* paddle invincibility (only used in guardians level */ {16, 205}, {17, 205}, {18, 205}, {16, 212}, {17, 212}, {18, 212}, {16, 219} }; sprite_description BOB_NUM013 = { 16, 7, 7 * 20, BOB_POS013 }; /** font of 43 chars used to display "LEVEL n COMPLETED */ sprite_coordinates BOB_POS014[] = { {0, 758}, {1, 758}, {2, 758}, {3, 758}, {4, 758}, {5, 758}, {6, 758}, {7, 758}, {8, 758}, {9, 758}, {10, 758}, {11, 758}, {12, 758}, {13, 758}, {14, 758}, {15, 758}, {16, 758}, {17, 758}, {18, 758}, {19, 758}, {0, 774}, {1, 774}, {2, 774}, {3, 774}, {4, 774}, {5, 774}, {6, 774}, {7, 774}, {8, 774}, {9, 774}, {10, 774}, {11, 774}, {12, 774}, {13, 774}, {14, 774}, {15, 774}, {16, 774}, {17, 774}, {18, 774}, {19, 774}, {0, 790}, {1, 790}, {2, 790} }; sprite_description BOB_NUM014 = { 16, 16, 42, BOB_POS014 }; // LED du magasin -------------------------------------------------------------- sprite_coordinates BOB_POS015[] = { {13, 0} }; sprite_description BOB_NUM015 = { 16, 3, 1, BOB_POS015 }; sprite_coordinates BOB_POS057[] = { {15, 0} }; sprite_description BOB_NUM057 = { 16, 5, 1, BOB_POS057 }; /** GAME OVER letters */ sprite_coordinates BOB_POS016[] = { /* G */ {0, 246}, /* A */ {2, 246}, /* M */ {4, 246}, /* E */ {6, 246}, /* O */ {8, 246}, /* V */ {10, 246}, /* E */ {12, 246}, /* R */ {14, 246} }; sprite_description BOB_NUM016 = { 32, 32, 8, BOB_POS016 }; /** Font used in the main menu scrolltext */ sprite_coordinates BOB_POS017[43] = { {0, 587}, {1, 587}, {2, 587}, {3, 587}, {4, 587}, {5, 587}, {6, 587}, {7, 587}, {8, 587}, {9, 587}, {10, 587}, {11, 587}, {12, 587}, {13, 587}, {14, 587}, {15, 587}, {16, 587}, {17, 587}, {18, 587}, {19, 587}, {0, 607}, {1, 607}, {2, 607}, {3, 607}, {4, 607}, {5, 607}, {6, 607}, {7, 607}, {8, 607}, {9, 607}, {10, 607}, {11, 607}, {12, 607}, {13, 607}, {14, 607}, {15, 607}, {16, 607}, {17, 607}, {18, 607}, {19, 607}, {17, 520}, {18, 520}, {16, 520} }; sprite_description BOB_NUM017 = { 16, 20, 43, BOB_POS017 }; /** TecnoballZ logo */ sprite_coordinates BOB_POS018[1] = { {0, 520} }; sprite_description BOB_NUM018 = { 256, 67, 1, BOB_POS018 }; /** Mouse cursor pointer 1 */ sprite_coordinates BOB_POS019[8] = { {0, 230}, {1, 230}, {2, 230}, {3, 230}, {4, 230}, {5, 230}, {6, 230}, {7, 230} }; sprite_description BOB_NUM019 = { 16, 16, 8, BOB_POS019 }; /** Mouse cursor pointer 2 */ sprite_coordinates BOB_POS020[8] = { {8, 230}, {9, 230}, {10, 230}, {11, 230}, {12, 230}, {13, 230}, {14, 230}, {15, 230} }; sprite_description BOB_NUM020 = { 16, 16, 8, BOB_POS020 }; // lettre pour afficher la somme d'argent -------------------------------------- sprite_coordinates BOB_POS028[10] = { {3, 798}, {4, 798}, {5, 798}, {6, 798}, {7, 798}, {8, 798}, {9, 798}, {10, 798}, {11, 798}, {12, 798} }; sprite_description BOB_NUM028 = { 8, 8, 10, BOB_POS028 }; /** Bottom paddle robot used in bricks level */ sprite_coordinates BOB_POS029[1] = { {16, 448} }; sprite_description BOB_NUM029 = { 64, 8, 1, BOB_POS029 }; /* * GUARDIANS */ sprite_coordinates BOB_POS030[1] = { {0, 278} }; sprite_description BOB_NUM030 = { 64, 104, 1, BOB_POS030 }; sprite_coordinates BOB_POS031[1] = { {4, 278} }; sprite_description BOB_NUM031 = { 64, 99, 1, BOB_POS031 }; sprite_coordinates BOB_POS032[1] = { {8, 278} }; sprite_description BOB_NUM032 = { 64, 90, 1, BOB_POS032 }; sprite_coordinates BOB_POS033[1] = { {8, 368} }; sprite_description BOB_NUM033 = { 64, 92, 1, BOB_POS033 }; sprite_coordinates BOB_POS034[1] = { {12, 278} }; sprite_description BOB_NUM034 = { 64, 114, 1, BOB_POS034 }; sprite_coordinates BOB_POS035[1] = { {16, 278} }; sprite_description BOB_NUM035 = { 64, 163, 1, BOB_POS035 }; sprite_coordinates BOB_POS036[1] = { {0, 382} }; sprite_description BOB_NUM036 = { 32, 16, 1, BOB_POS036 }; sprite_coordinates BOB_POS037[1] = { {0, 398} }; sprite_description BOB_NUM037 = { 32, 55, 1, BOB_POS037 }; sprite_coordinates BOB_POS038[1] = { {0, 453} }; sprite_description BOB_NUM038 = { 32, 36, 1, BOB_POS038 }; sprite_coordinates BOB_POS039[1] = { {2, 382} }; sprite_description BOB_NUM039 = { 32, 52, 1, BOB_POS039 }; sprite_coordinates BOB_POS040[1] = { {2, 434} }; sprite_description BOB_NUM040 = { 32, 36, 1, BOB_POS040 }; sprite_coordinates BOB_POS041[1] = { {4, 377} }; sprite_description BOB_NUM041 = { 32, 82, 1, BOB_POS041 }; sprite_coordinates BOB_POS042[1] = { {4, 459} }; sprite_description BOB_NUM042 = { 32, 47, 1, BOB_POS042 }; sprite_coordinates BOB_POS043[1] = { {6, 377} }; sprite_description BOB_NUM043 = { 32, 74, 1, BOB_POS043 }; sprite_coordinates BOB_POS044[1] = { {6, 451} }; sprite_description BOB_NUM044 = { 32, 65, 1, BOB_POS044 }; sprite_coordinates BOB_POS045[1] = { {12, 392} }; sprite_description BOB_NUM045 = { 32, 85, 1, BOB_POS045 }; /* paddle */ sprite_coordinates BOB_POS046[1] = { {16, 246} }; sprite_description BOB_NUM046 = { 32, 8, 1, BOB_POS046 }; /* bullet fired by a guardian */ sprite_coordinates BOB_POS047[16] = { {19, 141}, {8, 460}, {19, 152}, {9, 460}, {19, 163}, {10, 460}, {19, 174}, {11, 460}, {19, 185}, {8, 471}, {19, 196}, {9, 471}, {19, 207}, {16, 573}, {19, 218}, {17, 573} }; sprite_description BOB_NUM047 = { 11, 11, 16, BOB_POS047 }; // explosion 1 **** sprite_coordinates BOB_POS048[8] = { {0, 54}, {1, 54}, {2, 54}, {3, 54}, //EXPLOSION 1 {4, 54}, {5, 54}, {6, 54}, {7, 54} }; sprite_description BOB_NUM048 = { 16, 16, 8, BOB_POS048 }; // explosion 2 **** sprite_coordinates BOB_POS049[8] = { {8, 54}, {9, 54}, {10, 54}, {11, 54}, //EXPLOSION 2 {12, 54}, {13, 54}, {14, 54}, {15, 54} }; sprite_description BOB_NUM049 = { 16, 16, 8, BOB_POS049 }; // boule argentee (congratulation) sprite_coordinates BOB_POS050[8] = { {14, 462} }; sprite_description BOB_NUM050 = { 25, 26, 1, BOB_POS050 }; // niveau d'energie des gadiens --------------------------------------// sprite_coordinates BOB_POS051[] = { {14, 0} }; sprite_description BOB_NUM051 = { 16, 1, 1, BOB_POS051 }; // gem ---------------------------------------------------------------// sprite_coordinates BOB_POS052[] = { {10, 472}, // grey square {11, 472}, // green sphere {18, 574}, // yellow ring {19, 574}, // blue triangle {3, 480}, // rhombus {3, 472} // pentagon }; sprite_description BOB_NUM052 = { 8, 8, 6, BOB_POS052 }; // bottom wall -------------------------------------------------------// sprite_coordinates BOB_POS053[] = { {0, 627} }; sprite_description BOB_NUM053 = { 192, 8, 1, BOB_POS053 }; sprite_coordinates BOB_POS054[] = { {4, 730}, {5, 730}, {6, 730}, {7, 730}, {8, 730}, {9, 730}, {10, 730}, {11, 730}, {12, 730}, {13, 730}, {14, 730}, {15, 730}, {16, 730}, {17, 730}, {18, 730}, {19, 730}, }; sprite_description BOB_NUM054 = { 9, 9, 16, BOB_POS054 }; sprite_coordinates BOB_POS055[] = { {16, 21}, {17, 21}, {18, 21}, {19, 21}, {16, 25}, {17, 25}, {18, 25}, {19, 25} }; sprite_description BOB_NUM055 = { 4, 4, 8, BOB_POS055 }; sprite_coordinates BOB_POS056[] = { {0, 642}, {2, 642}, {4, 642}, {6, 642}, {8, 642}, {10, 642}, {12, 642}, {14, 642}, {16, 642}, {18, 642}, {0, 671}, {2, 671}, {4, 671}, {6, 671}, {8, 671}, {10, 671}, {12, 671}, {14, 671}, {16, 671}, {18, 671}, {0, 700}, {2, 700}, {4, 700}, {6, 700}, {8, 700}, {10, 700}, {12, 700}, {14, 700}, {16, 700}, {18, 700}, {0, 729}, {2, 729} }; sprite_description BOB_NUM056 = { 32, 29, 32, BOB_POS056 }; // bricks sprite_coordinates BOB_POS058[] = { {0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}, {0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}, {0, 14}, {1, 14}, {2, 14}, {3, 14}, {4, 14}, {5, 14}, {6, 14}, {0, 21}, {1, 21}, {2, 21}, {3, 21}, {4, 21}, {5, 21}, {6, 21}, {0, 28}, {1, 28}, {2, 28}, {3, 28}, {4, 28}, {5, 28}, {6, 28}, {0, 35}, {1, 35}, {2, 35}, {3, 35}, {4, 35}, {5, 35}, {6, 35}, {0, 42}, {1, 42}, {2, 42}, {3, 42}, {4, 42}, {5, 42}, {6, 42}, {0, 49}, {1, 49}, {2, 49}, {3, 49}, {4, 49}, {5, 49}, {6, 49}, {0, 56}, {1, 56}, {2, 56}, {3, 56}, {4, 56}, {5, 56}, {6, 56} }; sprite_description BOB_NUM058 = { 16, 7, 63, BOB_POS058 }; const sprite_description * sprite_object::zelistBOB[NUMOF_SPRITE_TYPES] = { &BOB_NUM000, // BouisBouis &BOB_NUM001, // Ejector &BOB_NUM002, // &BOB_NUM003, // &BOB_NUM004, // &BOB_NUM005, // Brique verticale &BOB_NUM006, // Brique horizontale &BOB_NUM007, // Brique jeu &BOB_NUM008, // Raquette horizontale &BOB_NUM009, // Raquette verticale &BOB_NUM010, // Balls &BOB_NUM011, // Bumper's fires &BOB_NUM012, // Capsule of money &BOB_NUM013, // Gadgets (bonuses or maluses) &BOB_NUM014, // Lettres (annonce) &BOB_NUM015, // shop's led (low-res) &BOB_NUM016, // Lettres GameOver &BOB_NUM017, // Lettres defilement menu &BOB_NUM018, // Logo TecnoballZ &BOB_NUM019, // Pointeur souris 1 &BOB_NUM020, // Pointeur souris 2 &BOB_NUM021, // GigaBlitz 1 &BOB_NUM022, // GigaBlitz 2 &BOB_NUM023, // GigaBlitz 3 &BOB_NUM024, // GigaBlitz 4 &BOB_NUM025, // GigaBlitz 5 &BOB_NUM026, // GigaBlitz 6 &BOB_NUM027, // GigaBlitz 7 &BOB_NUM028, // Chiffres de 0 a 10 pour afficher le credit &BOB_NUM029, // Robot bottom bumper (bricks levels) &BOB_NUM030, // Guard final 1 &BOB_NUM031, // Guard final 2 &BOB_NUM032, // Guard final 3 &BOB_NUM033, // Guard final 4 &BOB_NUM034, // Guard final 5 &BOB_NUM035, // Guard final 6 &BOB_NUM036, // Guard intermediary 1 &BOB_NUM037, // Guard intermediary 1 &BOB_NUM038, // Guard intermediary 2 &BOB_NUM039, // Guard intermediary 2 &BOB_NUM040, // Guard intermediary 3 &BOB_NUM041, // Guard intermediary 3 &BOB_NUM042, // Guard intermediary 4 &BOB_NUM043, // Guard intermediary 4 &BOB_NUM044, // Guard intermediary 5 &BOB_NUM045, // Guard intermediary 5 &BOB_NUM046, // bumper into guards level &BOB_NUM047, // Guards's weapeon &BOB_NUM048, // explosion's guard (type 1) &BOB_NUM049, // explosion's guard (type 2) &BOB_NUM050, // boule argentee &BOB_NUM051, // guards's energy bar &BOB_NUM052, // Gem &BOB_NUM053, &BOB_NUM054, //directeur &BOB_NUM055, //echape menu &BOB_NUM056, //maget eye &BOB_NUM057, //shop's led (high-res) &BOB_NUM058 //brick }; Sint32 sprite_object::ombredecax = handler_display::SHADOWOFFX; Sint32 sprite_object::ombredecay = handler_display::SHADOWOFFY; char sprite_object::ombrepixel = handler_display::SHADOW_PIX; Sint32 sprite_object::ombrepixe4 = handler_display::SHADOWLONG; tecnoballz-0.93.1/src/controller_sides_bricks.cc0000664000175000017500000004641512412501752021015 0ustar brunobruno/** * @file controller_sides_bricks.cc * @brief Sides bricks controller. The small bricks on the side, the walls top * left and right * @date 2012-09-06 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_sides_bricks.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_sides_bricks.h" #include "../include/handler_players.h" #include "../include/handler_display.h" /** * Create the sides bricks controller */ controller_sides_bricks::controller_sides_bricks () { littleInit (); xcoord_left_wall = XCOORD_LEFT_WALL * resolution; ycoord_left_wall = YCOORD_LEFT_WALL * resolution; xcoord_right_wall = XCOORD_RIGHT_WALL * resolution; ycoord_right_wall = YCOORD_RIGHT_WALL * resolution; xcoord_top_wall = XCOORD_TOP_WALL * resolution; ycoord_top_wall = YCOORD_TOP_WALL * resolution; if (!has_background) { max_of_sprites = (MAX_OF_SIDES_BRICKS + 4) * 3; } else { max_of_sprites = 2; } sprites_have_shades = true; horizontal_brick = (sprite_object *) NULL; vertical_brick = (sprite_object *) NULL; is_top_wall_breakable = false; is_right_wall_breakable = false; is_left_wall_breakable = false; background_top_side = NULL; background_right_side = NULL; background_left_side = NULL; restore_background = (restore_struct *) NULL; restore_save_index = 0; restore_index = 0; for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { map_left_wall[i] = map_right_wall[i] = map_top_wall[i] = false; sprites_left[i] = NULL; sprites_top[i] = NULL; sprites_right[i] = NULL; } } /** * Release the sides bricks controller */ controller_sides_bricks::~controller_sides_bricks () { if (NULL != restore_background) { delete[]restore_background; restore_background = NULL; } if (NULL != horizontal_brick) { delete horizontal_brick; horizontal_brick = (sprite_object *) NULL; sprites_top[0] = NULL; } if (NULL != vertical_brick) { delete vertical_brick; vertical_brick = (sprite_object *) NULL; sprites_right[0] = NULL; } if (NULL != background_top_side) { delete background_top_side; background_top_side = NULL; } if (NULL != background_right_side) { delete background_right_side; background_right_side = NULL; } if (NULL != background_left_side) { delete background_left_side; background_left_side = NULL; } for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { if (sprites_left[i] != NULL) { delete sprites_left[i]; sprites_left[i] = NULL; } if (sprites_top[i] != NULL) { delete sprites_top[i]; sprites_top[i] = NULL; } if (sprites_right[i] != NULL) { delete sprites_right[i]; sprites_right[i] = NULL; } } object_free (); release_sprites_list (); } /** * Perform some initializations * params true if rebuilt the walls, false otherwise */ void controller_sides_bricks::initialize () { if (is_verbose) { std::cout << ">controller_sides_bricks::initialize() start!" << std:: endl; } /* create a sprite object for small horizontal bricks */ horizontal_brick = new sprite_object (); horizontal_brick->create_sprite (sprite_object::HORIZONTAL_SIDE_BRICK, sprites_bitmap, true); horizontal_brick_width = horizontal_brick->get_sprite_width (); horizontal_brick_height = horizontal_brick->get_sprite_height (); /* create a sprite object for small vertical bricks */ vertical_brick = new sprite_object (); vertical_brick->create_sprite (sprite_object::VERTICAL_SIDE_BRICK, sprites_bitmap, true); vertical_brick_width = vertical_brick->get_sprite_width (); vertical_brick_height = vertical_brick->get_sprite_height (); /* set collisions coordinates of the 3 walls */ left_collision_xcoord = xcoord_left_wall + vertical_brick_width; right_collision_xcoord = xcoord_right_wall; top_collision_ycoord = ycoord_top_wall + horizontal_brick_height; /* area 2 to 4; rebuild wall the three walls automatically */ Uint32 area = current_player->get_area_number (); bool is_rebuild = current_player->is_rebuild_walls (); current_player->set_rebuild_walls (false); if (area < 5 || is_rebuild) { for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { map_left_wall[i] = true; map_top_wall[i] = true; map_right_wall[i] = true; } } /* area 5: recopy the state of the walls of the preceding level */ else { bool *left = current_player->get_map_left (); bool *right = current_player->get_map_right (); bool *top = current_player->get_map_top (); for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { map_left_wall[i] = left[i]; map_top_wall[i] = top[i]; map_right_wall[i] = right[i]; } } /* determine the behavior of the three walls, according to the area */ //area = 4; /* test only */ switch (area) { case 2: is_top_wall_breakable = true; is_right_wall_breakable = false; is_left_wall_breakable = false; break; case 3: is_top_wall_breakable = true; is_right_wall_breakable = true; is_left_wall_breakable = false; break; case 4: is_top_wall_breakable = true; is_right_wall_breakable = true; is_left_wall_breakable = true; break; case 5: is_top_wall_breakable = true; is_right_wall_breakable = true; is_left_wall_breakable = true; break; default: is_top_wall_breakable = false; is_right_wall_breakable = false; is_left_wall_breakable = false; break; } /* wall of the top is breakable (test only) */ //is_top_wall_breakable = true; /* wall of the right is breakable (test only) */ //is_right_wall_breakable = true; /* wall of the left is breakable (test only) */ //is_left_wall_breakable = true; /* create the sprites of the walls if necessary */ create_bricks_sprites (); /* allocate memory for background restoration under sides bricks */ try { restore_background = new restore_struct[MAX_OF_RESTORED_BRICKS]; } catch (std::bad_alloc &) { std::cerr << "(!) controller_sides_bricks::initialize() " "not enough memory to allocate restore_background structure " << std::endl; throw; } for (Uint32 i = 0; i < MAX_OF_RESTORED_BRICKS; i++) { restore_background[i].wall_id = 0; restore_background[i].side_brick_index = 0; } if (is_verbose) { std::cout << "/controller_sides_bricks::initialize() end!" << std::endl; } } /** * Create the sprites of the walls */ void controller_sides_bricks::create_bricks_sprites () { if (has_background) { return; } Sint32 xcoord_top = xcoord_top_wall; Sint32 ycoord_left = ycoord_left_wall; Sint32 ycoord_right = ycoord_right_wall; Uint32 width = horizontal_brick->get_sprite_width (); Uint32 height = vertical_brick->get_sprite_height (); sprites_top[0] = horizontal_brick; sprites_right[0] = vertical_brick; /* 12 bricks per wall */ for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { /* top wall */ if (i > 0) { sprites_top[i] = new sprite_object (); horizontal_brick->duplicate_to (sprites_top[i]); } sprites->add (sprites_top[i]); sprites_top[i]->set_coordinates (xcoord_top, ycoord_top_wall); if (map_left_wall[i]) { sprites_top[i]->enable (); } /* right wall */ if (i > 0) { sprites_right[i] = new sprite_object (); vertical_brick->duplicate_to (sprites_right[i]); } sprites->add (sprites_right[i]); sprites_right[i]->set_coordinates (xcoord_right_wall, ycoord_right); if (map_right_wall[i]) { sprites_right[i]->enable (); } /* left wall */ sprites_left[i] = new sprite_object (); vertical_brick->duplicate_to (sprites_left[i]); sprites->add (sprites_left[i]); sprites_left[i]->set_coordinates (xcoord_left_wall, ycoord_left); if (map_top_wall[i]) { sprites_left[i]->enable (); } xcoord_top += width; ycoord_left += height; ycoord_right += height; } } /** * Recopy the state of walls after a level */ void controller_sides_bricks::save_state_of_walls () { bool *left = current_player->get_map_left (); bool *right = current_player->get_map_right (); bool *top = current_player->get_map_top (); for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { left[i] = map_left_wall[i]; right[i] = map_right_wall[i]; top[i] = map_top_wall[i]; } } /** * Save background under small brick */ void controller_sides_bricks::save_background () { background_top_side = background_screen->cut_to_surface (xcoord_top_wall, ycoord_top_wall, horizontal_brick_width * MAX_OF_SIDES_BRICKS, horizontal_brick_height); background_right_side = background_screen->cut_to_surface (xcoord_right_wall, ycoord_right_wall, vertical_brick_width, vertical_brick_height * MAX_OF_SIDES_BRICKS); background_left_side = background_screen->cut_to_surface (xcoord_left_wall, ycoord_left_wall, vertical_brick_width, vertical_brick_height * MAX_OF_SIDES_BRICKS); } /** * Disable sides bricks if necessary */ void controller_sides_bricks::run () { if (has_background) { /* sides bricks are drawing to background */ restore (); } else { /* sides bricks are displayed as sprites */ disable_sprites (); } } /** * Restore the background under the brick */ void controller_sides_bricks::restore () { if (0 == restore_background[restore_index].wall_id) { return; } Uint32 index = restore_background[restore_index].side_brick_index; SDL_Rect source; SDL_Rect dest; SDL_Surface *source_surface = NULL; Uint32 voffset = game_screen->get_vertical_offset (); switch (restore_background[restore_index].wall_id) { case TOP_WALL: source.w = dest.w = horizontal_brick_width; source.h = dest.h = horizontal_brick_height; source.x = index * horizontal_brick_width; source.y = 0; dest.x = xcoord_top_wall + index * horizontal_brick_width; dest.y = voffset + ycoord_top_wall; source_surface = background_top_side->get_surface (); break; case LEFT_WALL: case RIGHT_WALL: source.w = dest.w = vertical_brick_width; source.h = dest.h = vertical_brick_height; source.x = 0; source.y = index * vertical_brick_height; if (LEFT_WALL == restore_background[restore_index].wall_id) { dest.x = xcoord_left_wall; dest.y = voffset + ycoord_left_wall + index * vertical_brick_height; source_surface = background_left_side->get_surface (); } else { dest.x = xcoord_right_wall; dest.y = voffset + ycoord_right_wall + index * vertical_brick_height; source_surface = background_right_side->get_surface (); } break; } if (SDL_BlitSurface (source_surface, &source, game_screen->get_surface (), &dest) < 0) { std::cerr << "(!)controller_sides_bricks::restore_background() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } if (SDL_BlitSurface (source_surface, &source, background_screen->get_surface (), &dest) < 0) { std::cerr << "(!)controller_sides_bricks::restore_background() " << "SDL_BlitSurface() return " << SDL_GetError () << std::endl; } /* clear shadow */ dest.x += handler_display::SHADOWOFFX * resolution; dest.y = dest.y - voffset + handler_display::SHADOWOFFY * resolution; switch (restore_background[restore_index].wall_id) { case TOP_WALL: if (0 == index) { dest.w -= resolution * 4; dest.x += resolution * 4; } break; case RIGHT_WALL: if (index == MAX_OF_SIDES_BRICKS - 1) { dest.h -= resolution * 4; } break; } display->clr_shadow (dest.x, dest.y, dest.w, dest.h); restore_index = (restore_index + 1) & (MAX_OF_RESTORED_BRICKS - 1); } /** * Disable sides bricks sprites if necessary */ void controller_sides_bricks::disable_sprites () { for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { if (sprites_left[i]->is_enable () && !map_left_wall[i]) { sprites_left[i]->disable (); } if (sprites_top[i]->is_enable () && !map_top_wall[i]) { sprites_top[i]->disable (); } if (sprites_right[i]->is_enable () && !map_right_wall[i]) { sprites_right[i]->disable (); } } } /** * Draw shadow of the three walls (before a bricks level) */ void controller_sides_bricks::draw_shadows_to_brackground () { if (!has_background) { return; } Sint32 xcoord_top = xcoord_top_wall; Sint32 ycoord_left = ycoord_left_wall; Sint32 ycoord_right = ycoord_right_wall; Uint32 width = horizontal_brick->get_sprite_width (); Uint32 height = vertical_brick->get_sprite_height (); /* 12 bricks per wall */ for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { if (map_top_wall[i]) { horizontal_brick->set_coordinates (xcoord_top, ycoord_top_wall); horizontal_brick->draw_shadow_to_brackground (); } if (map_left_wall[i]) { vertical_brick->set_coordinates (xcoord_left_wall, ycoord_left); vertical_brick->draw_shadow_to_brackground (); } if (map_right_wall[i]) { vertical_brick->set_coordinates (xcoord_right_wall, ycoord_right); vertical_brick->draw_shadow_to_brackground (); } xcoord_top += width; ycoord_left += height; ycoord_right += height; } } /** * Draw bricks of the three walls (before a bricks level) */ void controller_sides_bricks::draw_to_brackground () { if (!has_background) { return; } Sint32 xcoord_top = xcoord_top_wall; Sint32 ycoord_left = ycoord_left_wall; Sint32 ycoord_right = ycoord_right_wall; Uint32 width = horizontal_brick->get_sprite_width (); Uint32 height = vertical_brick->get_sprite_height (); /* 12 bricks per wall */ for (Uint32 i = 0; i < MAX_OF_SIDES_BRICKS; i++) { if (map_top_wall[i]) { horizontal_brick->set_coordinates (xcoord_top, ycoord_top_wall); horizontal_brick->draw_to_brackground (); } if (map_left_wall[i]) { vertical_brick->set_coordinates (xcoord_left_wall, ycoord_left); vertical_brick->draw_to_brackground (); } if (map_right_wall[i]) { vertical_brick->set_coordinates (xcoord_right_wall, ycoord_right); vertical_brick->draw_to_brackground (); } xcoord_top += width; ycoord_left += height; ycoord_right += height; } } /** * Return collision y-coordinate of the top wall * @return y-coordinate of the top wall */ Sint32 controller_sides_bricks::get_top_ycoord () { return top_collision_ycoord; } /** * Return collision x-coordinate of the right wall * @return x-coordinate of the left wall */ Sint32 controller_sides_bricks::get_right_xcoord () { return right_collision_xcoord; } /** * Return collision x-coordinate of the left wall * @return x-coordinate of the left wall */ Sint32 controller_sides_bricks::get_left_xcoord () { return left_collision_xcoord; } /** * Collision with the wall of the left * @param ycoord y coordinate of the ball * @return true if collision, otherwise false */ bool controller_sides_bricks::collision_with_left_wall (Sint32 ycoord) { if (!is_left_wall_breakable) { /* because the left wall is unbreakable, there is always collision */ return true; } Sint32 index = (ycoord - (Sint32) ycoord_left_wall) / vertical_brick_height; if (index < 0 || index >= (Sint32) MAX_OF_SIDES_BRICKS) { return true; } if (!map_left_wall[index]) { /* there is no more brick on side which protects */ return false; } map_left_wall[index] = false; restore_background[restore_save_index].wall_id = LEFT_WALL; restore_background[restore_save_index].side_brick_index = (Uint32) index; restore_save_index = (restore_save_index + 1) & (MAX_OF_RESTORED_BRICKS - 1); return true; } /** * Collision with the wall of the right * @param ycoord y coordinate of the ball * @return true if collision, otherwise false */ bool controller_sides_bricks::collision_with_right_wall (Sint32 ycoord) { if (!is_right_wall_breakable) { /* because the right wall is unbreakable, there is always collision */ return true; } Sint32 index = (ycoord - (Sint32) ycoord_right_wall) / (Sint32) vertical_brick_height; if (index < 0 || index >= (Sint32) MAX_OF_SIDES_BRICKS) { return true; } if (!map_right_wall[index]) { /* there is no more brick on side which protects */ return false; } map_right_wall[index] = false; restore_background[restore_save_index].wall_id = RIGHT_WALL; restore_background[restore_save_index].side_brick_index = (Uint32) index; restore_save_index = (restore_save_index + 1) & (MAX_OF_RESTORED_BRICKS - 1); return true; } /** * Collision with the wall of the top * @param ycoord y coordinate of the ball * @return true if collision, otherwise false */ bool controller_sides_bricks::collision_with_top_wall (Sint32 xcoord) { if (!is_top_wall_breakable) { /* because the top is unbreakable, there is always collision */ return true; } Sint32 index = (Sint32) ((Sint32) (xcoord - (Sint32) xcoord_top_wall)) / (Sint32) horizontal_brick_width; if (index < 0 || index >= (Sint32) MAX_OF_SIDES_BRICKS) { return true; } if (!map_top_wall[index]) { /* there is no more brick on side which protects */ return false; } map_top_wall[index] = false; restore_background[restore_save_index].wall_id = TOP_WALL; restore_background[restore_save_index].side_brick_index = (Uint32) index; restore_save_index = (restore_save_index + 1) & (MAX_OF_RESTORED_BRICKS - 1); return true; } tecnoballz-0.93.1/src/TecnoballZ/0000775000175000017500000000000012412501752015622 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/Makefile.am0000664000175000017500000000062212412501752017656 0ustar brunobrunoNULL = SUBDIRS = lores hires textures sounds musics texts pkgdatadir = $(datadir)/tecnoballz dist_pkgdata_DATA = \ cosinus128.list \ gard_lissa.list \ levels-data.xml \ min60map.png \ tableau.data \ tilemap-congratulation_20.data \ tilemap-congratulation_40.data \ tilemap-guardians_20.data \ tilemap-guardians_40.data \ tilemap-menu_20.data \ tilemap-menu_40.data \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/texts/0000775000175000017500000000000012412501752016771 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/texts/Makefile.am0000664000175000017500000000046012412501752021025 0ustar brunobrunoNULL = pkgdatadir = $(datadir)/tecnoballz/texts dist_pkgdata_DATA = \ main_menu_en.txt \ main_menu_fr.txt \ popup_menu_en.txt \ popup_menu_fr.txt \ scrolltext_en.txt \ scrolltext_fr.txt \ shop_en.txt \ shop_fr.txt \ short_info_messages_en.txt \ short_info_messages_fr.txt \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/texts/shop_fr.txt0000664000175000017500000000547312412501752021203 0ustar brunobruno# expand paddle # AH OUAIS C'EST BIEN MIEUX AVEC UNE RAQUETTE PLUS GRANDE #fire power 1 # CE TIR N'EST PAS AUSSI PUISSANT QUE LE TIR 2 MAIS IL EST MOINS CHER #fire power 2 # PLUS DE PUISSANCE # POUR DETRUIRE PLUS # PLUS DE BRIQUES # #rebuild wall # BIEN, LE MUR DE COTE VA ETRE RECONSTRUIT #extra balls # DEUX BALLES A ATTRAPER # multi balls # TROIS BALLES VONT MAINTENANT DETRUIRE LE MUR PLUS VITE # ball power 1 # A BALLE TRES RESISTANTE POUR BRISER LES BRIQUES # ball power 2 # AVEC CELA VOUS CASSEREZ TOUT CE QUE VOUS VOUDREZ # less bricks CELA FERA 10 BRIQUES DE MOINS A CASSER # extra life # VIE SUPPLEMENTAIRE AJOUTEE # Info text # # the wall # UN MUR POUR RETENIR LES BALLES PENDANT UN COURT INSTANT # left paddle # OK POUR UNE RAQUETTE GAUCHE MAIS ELLE NE DURE QUE 3 NIVEAUX # top paddle # OK POUR UNE RAQUETTE HAUTE MAIS ELLE NE DURE QUE 3 NIVEAUX # right paddle # OK POUR UNE RAQUETTE DROITE MAIS ELLE NE DURE QUE 3 NIVEAUX # ball size 2 # BIGSIZE BALLS! # ball size 3 # MAXISIZE BALLS! # robot paddle # OK FOR THE ROBOT BUMPER! # blue option # OK FOR THE CONTROL BALL OPTION # blue option # OK FOR THE GLUE OPTION # cheat mode enabled # GO AND SEE MY LOVE # infos messages # RAQUETTE DROITE RAQUETTE HAUTE RAQUETTE GAUCHE VOUS POSSEDEZ ENCORE .. VIES LA DIFFICULTE EST .... J'ESPERE QUE CETTE AIDE VOUS SERA UTILE TLK GAMES TECNOBALLZ TLK GAMES LA CORRUPTION REVET DES DEGUISEMENTS INFINIS RAQUETTE DROITE ACTIVE PAS DE RAQUETTE DROITE ACHETER RAQUETTE DROIT RAQUETTE HAUTE ACTIVE PAS DE RAQUETTE HAUTE ACHETER RAQUETTE HAUTE RAQUETTE GAUCHE ACTIVE PAS DE RAQUETTE GAUCHE ACHETER RAQUETTE GAUCH LE CODE D'ACCES DE CETTE ZONE EST .......... AUCUN CODE D'ACCES N'EXISTE POUR CETTE ZONE #welcome message BIENVENUE ...... DANS LE MAGASIN BONUS PRIX ACTIF DESOLE, MAIS VOUS N'AVEZ PAS ASSEZ D'ARGENT POUR CELA VOUS NE POUVEZ PAS ACHETER PLUS DE .. CAPSULES DESOLE, CETTE OPTION NET PEUT-ETRE UTILISE QUE DANS LA ZONE 5 tecnoballz-0.93.1/src/TecnoballZ/texts/shop_en.txt0000664000175000017500000000565712412501752021202 0ustar brunobruno# expand paddle # AH YEAH IT IS MUCH BETTER WITH A SUCH LONGER BUMPER #fire power 1 # THIS FIRE IS NOT AS SO POWERFULL AS FIRE 1 BUT IT IS CHEAPER #fire power 2 # BIGGER POWER TO DESTROY MORE BRICS #rebuild wall # OK, THE RED WALLS WILL BE REBUILT #extra balls # TWO BALLS TO CATCH # multi balls # THREE BALLS NOW YOU WILL BRAKE MORE AND FASTER THE WALL # ball power 1 # A VERY STRONG BALL TO BREAK BRIKS # ball power 2 # WITH THAT YOU WILL BREAK ALL YOU WANT # less bricks THERE WILL 10 BRICKS LESS TO BREAK # extra life # - EXTRA LIFE ADDED - # Info text # # the wall # A WALL TO KEEP THE BALLS IN PLAY FOR A BREF MOMENT # left paddle # OK FOR A LEFT BUMPER BUT DON'T FORGET IT IS OVER AFTER 3 LEVELS # top paddle # OK FOR UP BUMPER BUT DON'T FORGET IT IS OVER AFTER 3 LEVELS # right paddle # OK FOR A RIGHT BUMPER BUT DON'T FORGET IT IS OVER AFTER 3 LEVELS # ball size 2 # BIGSIZE BALLS! # ball size 3 # MAXISIZE BALLS! # robot paddle # OK FOR THE ROBOT BUMPER! # blue option # OK FOR THE CONTROL BALL OPTION # blue option # OK FOR THE GLUE OPTION # cheat mode enabled # GO AND SEE MY LOVE # infos messages # RIGHT BUMPER:NO ACTIVE UP BUMPER :NO ACTIVE LEFT BUMPER :NO ACTIVE YOU ONLY HAVE .. LIVES LEFT DIFFICULTY IS .... I HOPE THIS ASSISTANCE WILL HELP YOU TLK GAMES TECNOBALLZ TLK GAMES CORRUPTION WEARS INFINITE DISGUISES! RIGHT BUMPER: ACTIVE RIGHT BUMPER:NO ACTIVE BUY A RIGHT BUMPER UP BUMPER : ACTIVE UP BUMPER :NO ACTIVE BUY A UP BUMPER LEFT BUMPER : ACTIVE LEFT BUMPER :NO ACTIVE BUY A LEFT BUMPER THE PASSWORD FOR THIS AREA IS .......... NO AVAILABLE PASSWORD FOR THIS AREA. #welcome message WELCOME ...... TO THE TECNOBALLZ SHOP PRICE BONUS IS ENABLE SORRY, BUT YOU HAVEN'T GOT ENOUGH MONEY TO BUY THIS OPTION YOU CAN ONLY BUY .. CAPSULES SORRY THIS OPTION CAN ONLY BE USED FOR AREA 5 tecnoballz-0.93.1/src/TecnoballZ/texts/popup_menu_fr.txt0000664000175000017500000000026612412501752022414 0ustar brunobruno CONTINUE LA PARTIE FIN DE PARTIE MENU PRINCIPAL QUITTE TECNOBALLZ CONTINUE LA PARTIE MENU PRINCIPAL QUITTE TECNOBALLZ tecnoballz-0.93.1/src/TecnoballZ/texts/scrolltext_fr.txt0000664000175000017500000000036412412501752022427 0ustar brunobrunoBIENVENUE DANS TECNOBALLZ. CE JEU A ETE A L'ORIGINE UNE PRODUCTION SUR COMMODORE AMIGA. EN FAIT C'EST LA PREMIERE PRODUCTION DE TLK GAMES SORTIE DEBUT 1991. LE JEU A ETE COMPLETEMENT REECRIT EN LANGAGE C AVEC SDL SOUS LINUX. AMUSEZ-VOUS BIEN ! tecnoballz-0.93.1/src/TecnoballZ/texts/short_info_messages_fr.txt0000664000175000017500000000073412412501752024266 0ustar brunobrunoETES VOUS PRET ? OUI VOUS L ETES TIR SIMPLE TIR SYMPA ! COOL GUY! UNE VIE PERDUE ! UNE VIE GAGNEE ! TROP TARD.. . BONUS BAS PRIX OPTION COLLE NIVEAU SUIVANT.. REDUIT LA TAILLE AUGMENTE TAILLE BONUS BALLES BALLES MULTIPLES BALLES FORCE 1 BALLES FORCE 2 MALUS INVERSEUR VITESSE MAXIMUM RAQUETTE DROITE RAQUETTE HAUTE RAQUETTE GAUCHE GROSSES BALLES ENORMES BALLES MEGA OPTIONS MUR ACTIF ROBOT ACTIF CONTROLE BALLES tecnoballz-0.93.1/src/TecnoballZ/texts/main_menu_fr.txt0000664000175000017500000000733212412501752022176 0ustar brunobruno COMMENCE UNE PARTIEq ? OPTIONS ? > CREDITS < g SALUTATIONS g INFOS MEILLEURS SCORES AREA CODE u ----------? t QUITTER # -------------------------------- e NOMBRE DE JOUEURS u 1 t b JOUEUR 1.......... u ......t b JOUEUR 2.......... u ......t b JOUEUR 3.......... u ......t b JOUEUR 4.......... u ......t b JOUEUR 5.......... u ......t b JOUEUR 6.......... u ......t e DIFFICULTY........ u EASY t e NOMBRE DE VIES.... u 08 t c MENU PRINCIALqq -------------------------------- # credits ---- DEVELOPPEUR PRINCIPAL ---- b BRUNO ETHVIGNOT b - BASE SUR LA VERSION AMIGA DE - b BRUNO ETHVIGNOT;JEROME BOLOT b ---- PRINCIPAUX GRAPHISMES ---- bJEAN MICHEL MARTIN DE SANTEROb b DAVID IGREJA b ------ AUTRES GRAPHISMES ------ b RODOLPHE BONO b ----- PRINCIPALES MUSIQUES ----- b REGIS PARRET b - BRUITAGES ET AUTRES MUSIQUES - b LAURENT GUYON b COPYRIGHT (C)1992-2012 TLK-GAMES TLK-GAMES/BP 24/F81150 FLORENTIN LINUX.TLK.FR # CONTROL DE LA RAQUETTE: BOUTON GAUCHE SOURIS : TIR BOUTON DROIT SOURIS : EJECTE BOUTON MILIEU : TILT OU GIGABLITZ -------------------------------- TOUCHES RECONNUES DANS LE JEU F : PLEIN ECRAN P : PAUSE CTRL ESC: QUIT TECNOBALLZ CTRL D : COUPE LES MUSIQUES CTRL F : COUPE LES BRUITAGES CTRL S : COUPE LE SON CTRL Q : RETOURNE AU MENU CTRL X : FIN DE PARTIE -------------------------------- 25 000 POINTS : GAGNE UNE VIE # --> MEILLEURES SALUTATIONS A <-- b ALEXIS b AURELIEN b BLACKGUARD b BARTI b DAUBMAN b DELPHINUS b DARK NIGHT b FELBRAN b DJI b JRC b MA DANONE b LE CHACAL b GAEL R. b YANIS b JMM b ROY b PAT b PROPERMAN b PASCAL L. b PASCAL E. b PIXELMAN b PIERRE DENIS b STEPHANE C. b POPOLON b ZIBIBI b SHAD b REGLIS b ZE-KING # high score table bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb b LES MEILLEURS SCORES b b b b POS NOM NIVEAU ZONE SCORE b b b b 01 ?????? ?? ? ?????? b b 02 ?????? ?? ? ?????? b b 03 ?????? ?? ? ?????? b b 04 ?????? ?? ? ?????? b b 05 ?????? ?? ? ?????? b b 06 ?????? ?? ? ?????? b b 07 ?????? ?? ? ?????? b b 08 ?????? ?? ? ?????? b b 09 ?????? ?? ? ?????? b b 10 ?????? ?? ? ?????? b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb tecnoballz-0.93.1/src/TecnoballZ/texts/scrolltext_en.txt0000664000175000017500000000035612412501752022423 0ustar brunobrunoWELCOME TO TECNOBALL Z. THIS GAME WAS ORIGINALLY A COMMODORE AMIGA PRODUCTION. IN FACT IT'S THE FIRST PRODUCTION FROM TLK GAMES RELEASED AT THE BEGINNING OF 1990. I COMPLETELY REWROTE THE GAME WITH C LANGAGE AND SDL FOR LINUX. ENJOY IT! tecnoballz-0.93.1/src/TecnoballZ/texts/main_menu_en.txt0000664000175000017500000000733212412501752022171 0ustar brunobruno START THE GAMEq ? OPTIONS ? > CREDITS < g GREETINGS g INFOS VIEW-SCORES AREA CODE u ----------? t GAME EXITw # -------------------------------- e NUMBER OF PLAYERS u 1 t b PLAYER 1.......... u ......t b PLAYER 2.......... u ......t b PLAYER 3.......... u ......t b PLAYER 4.......... u ......t b PLAYER 5.......... u ......t b PLAYER 6.......... u ......t e DIFFICULTY........ u EASY t e NUMBER OF LIFES... u 08 t c MAIN MENUqq -------------------------------- # credits --- MAIN CODING - LINUX-PORT --- b BRUNO ETHVIGNOT b ---- BASED ON AMIGA MC680X0 ---- b BRUNO ETHVIGNOT;JEROME BOLOT b ----------- MAIN GFX ----------- bJEAN MICHEL MARTIN DE SANTEROb b DAVID IGREJA b --------- OTHER GFX --------- b RODOLPHE BONO b ---------- ALL MUSICS ---------- b REGIS PARRET b ---------SOUNDS EFFECTS--------- b LAURENT GUYON b COPYRIGHT (C)1992-2012 TLK-GAMES TLK-GAMES/BP 24/F81150 FLORENTIN LINUX.TLK.FR # PADDLE CONTROL: LEFT MOUSE BUTTON : FIRE RIGHT MOUSE BUTTON : DROP BALL MIDDLE MOUSE BUTTON: TILT OR GIGABLITZ -------------------------------- KEYS RECOGNIZED DURING THE GAME: F : FULL SCREEN P : PAUSE CTRL ESC: QUIT TECNOBALLZ CTRL D : DISABLE MUSICS CTRL F : DISABLE SOUND EFFECTS CTRL S : DISABLE SOUND CTRL Q : EXIT TO MENU CTRL X : GO TO GAME-OVER -------------------------------- 25,000 POINTS : BONUS LIFE # ---> BEST GREETINGS FLY TO <--- b ALEXIS b AURELIEN b BLACKGUARD b BARTI b DAUBMAN b DELPHINUS b DARK NIGHT b FELBRAN b DJI b JRC b MA DANONE b LE CHACAL b GAEL R. b YANIS b JMM b ROY b PAT b PROPERMAN b PASCAL L. b PASCAL E. b PIXELMAN b PIERRE DENIS b STEPHANE C. b POPOLON b ZIBIBI b SHAD b REGLIS b ZE-KING # high score table bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb b BEST TECNOBALLZ b b b b POS NAME LEVEL AREA SCORE b b b b 01 ?????? ?? ? ?????? b b 02 ?????? ?? ? ?????? b b 03 ?????? ?? ? ?????? b b 04 ?????? ?? ? ?????? b b 05 ?????? ?? ? ?????? b b 06 ?????? ?? ? ?????? b b 07 ?????? ?? ? ?????? b b 08 ?????? ?? ? ?????? b b 09 ?????? ?? ? ?????? b b 10 ?????? ?? ? ?????? b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb tecnoballz-0.93.1/src/TecnoballZ/texts/popup_menu_en.txt0000664000175000017500000000026612412501752022407 0ustar brunobrunoCONTINUE THE PLAY CURRENT CAUSE GAME OVER QUIT TO INTRO QUIT TECNOBALLZ CONTINUE THE PLAY CURRENT QUIT TO INTRO QUIT TECNOBALLZ tecnoballz-0.93.1/src/TecnoballZ/texts/short_info_messages_en.txt0000664000175000017500000000073412412501752024261 0ustar brunobruno ARE YOU ready ? YEAH YOU WERE! SIMPLE FIRE COOL FIRE! COOL GUY! YOU LOST A LIFE YOU WON A LIFE! TOO LATE... BONUS PRICE! GLUE OPTION NEXT LEVEL... MALUS SIZE BONUS SIZE BONUS BALLS MULTIBALLS POWERBALLS MEGAPOWERBALLS INVERSOR MALUS SPEEDBALLS MAXI BUMPER RIGHT BUMPER UP BUMPER LEFT BIGSIZE BALLS MAXISIZE BALLS MEGA OPTIONS WALL ENABLE ROBOT ENABLE CONTROL BALLS tecnoballz-0.93.1/src/TecnoballZ/tilemap-guardians_40.data0000664000175000017500000005252012412501752022372 0ustar brunobruno 8 @ (@ (\ 8  (  ( $(  (@ (\ 8  (  ( $ < , ( $    < ,     , ( $    < ,  D 8 @ 08 ( (    LX TP h 08 ( (    LX TP HL H 8 < 4, L 88 8  (  H 8 < 4, L 88<@ @H H , L ,  4, L 8 @H H , L , H 0 $  0 D   D <  L ,  0 D   D <  @ ,hl(,P  h $0    D <   h $0     $ ,  < $(  $0    ,  < $(  4pt D h ( @   $(  D h ( @  4HL  h  @   h   8 @ ( (\ 8  ( h  @ ( (\ 8  (  ( $ < , ( $    < ,   h $0   $    H , L , Dhlpt 8 @ 08 ( (    LX TP < $( ( (     D  H 8 <,0 4, L 8h ( @  <h $0 8<@H H , L ,  h  H , L $( 0HL $  0 D   D <  ( (\ 8  ( D   ( @  @ ,ptP  h $0    ( $    < , h $h   ,  < $( 8 ( (    LX T < $(  4hl D h (    8   4, Lh (   4  h h  h HL $ 8 @ ( (\ 8  (  ( 8  ( @ ( (\ 8  (  ((, < , ( $    < ,   < , , ( $    < ,  DHL $ 8 @ 08 ( (    LX T   LX T @ 08 ( (    LX T pt L , h\ (h h ( h , h\ (h h ( (  0  $ \  (\ 8  ( 0  $ \ ( $@D $0 $\ 8  L , L $    < 0 $\ 8  L , L , ( $ $h \ L  ( (    LX h \ L  (pt  h $0 $\ (h h  h $0 $0 ( $h \ $0h \ $0 ( \ $0 (@D   $pt@D048<@D8048<@048<048<@D8048<@048<(, $<<@0@Dpt@@00048<@8048<@048<04848<8048<@048<048<@048<@0048<04848<048<@0048< $D@@Dpt@@(,D0D@0D@ $04<@048<@48<@@04<@048<@48<pt@@@D@D@DD@D@D@DD@D<@4@<<@4@< $pt  <  @D (   @<@0 (    h 8<@8048<@00 h 8<@8048<pt $ \ 8  ( < \ 8  ( <x|(,0  < 48<48<0  < 48<48< $    LX  @D@    LX  pt 4, @ 4, hl , L , @ , L , x|0  D < (8<@4848<@@0  D < (8<@4848< $ ( ( \ ( (pt048<@048<@048<0 048<@048<@048<hl@ x| $PPP ,$PPPptPP8<@PPP<@D0PPP0 tPP8<@PPP<@D0PPPhlPPPPPPPPPPPPPPPPPPPx|PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(,PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP $PPHPPPPPPPPPPPPPPPPPPPHPPPPPPPPPPPPPhlptPPPHPPP(PPPPPPPPPPPPPPPHPPP(PPPPPPPPPPPPPPPPPPPPPP\PPPPPPPPPPPPPPPPPP\PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP $ $PPPPPPPPPPPPPPPPPPPPP(PPPPPPPPPPPPPptptPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPx|(,P(,PPPPPPPPPPPPPP(HPPPPPPPPPP $(,PPPPPPPPPPPPPPP(,PPPPPPPPPPPpt(HPP8<PP8<PPPPPPP(HPP8<P(<PPPhl(,8<8<8<(,8<8,H8<Px|(,(,H(,(,,(,H<P $(,PPH<H<(,(,Ppt(,(,(H8<(,H<,88,(,(H8<(,H<,PhlH8<8<8<8H8<8<8<P(,(,HPP8(,,(,HPx| $(,(,(,H<(,(Ppt(,(,(,@D(,(H<H8,(,(,@D(,,H(,PTTTTTPPT8TTTTTTT<TThlTTTTTTTTTTTTTTTTTTx|(,T,TTTTTTTTTT,TTTTTTT $TT,TTTTTTTTT,TTTTTptTTTTTTTTTTTTTTTTTThlX\X\X\X\X\X\X\X\X\X\X\X\X\X\X\X\TTTTTTTTTTTTTTTTTx| $TptT,ptTptTptptTptT,ptTptTptpttptptpttptptptptptpt,ppt,ptptpthl hltptpt,ptp,ptptpx|  x| $ptptptp,ptptptptxpt  tpttpt t  t p  t pt p  ptp  p  p  t ptp   pthl(,lhl t  thlhlhlh  hl $hlhlptx|hlhlhl  lhlx|ptlhlhlhlx|x|x|x|  lhlhlhlhlptpt  thlhlllhlhlhlhlpt  hlhl $hhlhlhpppl  pthlhlx|pt(,hlhlhlhlpplh  hlhl(,(,(,(,hlhl  lhl(,(,ptptpthlhl  hlptpthl $hlhlptptpphlh  hlptpthlhlpth  h hPptptx|hlhlhlhlpt  tptpthlhlhlhlhl   ptpthlhlhlhlhlhl   hlptpthlhl $hlhlhl  hlhphlhltx|x|hlhlhl  t hlhlthl(,x|x|x|x|  tpp x|x|x|l $ptpt  thl ptptlthlpthlhlpt  lhpthlptthpppl  ptx|hppplthlpthlpplh  hltphlpplhhl $hlhl  lhlhlhlhllhl8<pthlhl  hllhhlhl pt hlpphlh  hlx|pphlhp hlh  h hPtphpth hP $pt  tptpthlpt pptpt@Dpthl   ptpthlhhlhptpt   hlptpth pthlptpt  hlhphlx|hphphl  lhl\hlhlpptlhl\hlhl $  hpdhlPPlhl$phpdhlPPl8<(, $PXPd P $ $h, $PXPd P $ $ $ h lP`d ` dPP`d@D $ h lP`d ` dPP`d@Dpt PP04 P04 PP04 P04 ` dPP ` d ` dP ` d ` d ` d ` dPP ` d ` dP ` d@D $04 $04 $04 $04  $ ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` dpt   ` d ` d ` dhl ` d ` d ` d ` d ` d ` d ` d ` dhl ` d ` d ` d ` d  $  8< $ ` dhl ` d ` d ` d ` d ` d ` d ` ` dhl ` d ` d ` d ` dp $ $ $ $ $  ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d d ` d ` d ` d ` d ` d ` d ` d $  @D ` d ` d ` d ` d ` d ` d ` d ` d ` d d ` d ` d ` d ` d ` d ` d $ $  $  ` d ` d ` d ` d ` d ` d ` d ` d d ` d ` d ` d ` d ` d $ $  $ $ ` d ` d ` d ` d ` d ` d ` d ` d ` ` d ` d ` d ` d ` d ` d8<    (,(, ` d ` d ` d ` ` d ` d(,(, ` d ` d ` d ` dx|x| $ $ x|x| $ (, ` d ` dhl ` d ` d ` d ` d ` d ` d ` dhl ` d ` d ` d D $ 04  04  pt ` d ` d ` d ` d ` d ` d p t ` d ` d ` d ` d ` d ` d ` d     < ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d  $ $  $  <<pt ` d ` d ` d ` d ` d ` d ` d ` d p t ` d ` d ` d ` d ` d ` d ` d ` d ` d  ` d ` d ` d p t ` d ` d ` d ` d ` d ` d ` d ` d ` d p t ` d ` d ` d ` d $ @Dpt x | ` d ` d ` d ` d ` d ` d ` d ` d ` d x | ` d ` d ` d ` d ` d ` d ` d  ` d ` d ` d ` d ` d ` d ` d p t ` ` d ` d ` d ` d ` d ` d $  $  $ ` d ` d ` d ` d ` d h l ` d ` d ` ` d ` d ` d ` d ` d h l8<     $ $,, $ $ $ $ $,, $ $(,pt pt pt pt \ ,pt pt pt pt  $\X\X\X\X\X$\X\X\X\X@D $ p\ p\ p\ ppt\Xp\ p\ p\ p\pt\X\ \\X\\X\Xp\\ \\X\\X\pt ( pt pt XX\X\ ( pt pt  $\Xx|\X \X\tt t \Xx|\X \X\Xpt p\ p\ p\ p \X\Xp\ p\ p\ p\8<\X\\X\\X\\X\\X\\X\\X\\X\\X\pt(, pt pt Hpt pt(, pt pt H $\Xx|\X\X\X\X\Xx|\X\X\Xptp\p\p\p\ p\p\p\p\p\@D\\ \\X\\\ \pt \ ppt pt ptpt ptpt pt \TX\X\X\X\lXxd\X\X\X\X $ \tX \X \X Xxd\X \X \X \X\X\TPX\X\X\X\X\lXxd\X\X\X\X\X\X\X8<(,pt \pt pt pXxd\pt pt pt  $\TPXX\XlXxd\X\XX\Xpt p\ p\ \ H Hxd\\ p\ p\ \\X\XTP\X H H\X\\lXxd\\\X\\X H H\X\@Dpt \pt H Hpt  Xxd\ t pt H Hpt  $\TPX\X\\lXxd\\X\X\X\Xpt p\ p\ ppXxd\p\ p\ p\ p\\X\XTP \\X\lXxd\\TX\\X\\X\ptp\\X\lXxd H Hxd\ptTlXxd\8< $TPpt Xxd\lXxd\TPTlXxd\ptptp\\lXx Xxd\tp\PTlXxd\\TP pXxd\lXxd\\TPTlXxd\pt PTlXxpXxd\t PTlXxd\@D\XTPT H HxdlXxd\\XTPT H Hxd\ $ p\PTlX H Hxd\p\PTlXxd\\ptTPTl HXx\lXxd\\ptTPTl HXxd\pPTl HX Xxd\pPTl HXxd\(,\XTPTlXx\lXxd\\XTPTlXxd\8< $ p\PTlXpXxd\ p\PTlXxd\pt\ @ @ @ @ @P (lXxlXxd\\ @ @ @ @ @P (lXxd\ p  $ @ $  $PTlX H Hxd\p  $ @ $  $PTlXxd\ < < < (lXx Xxd\ < < < (lXxd\@D $  $  $  $ (TlX\lXxd\  $  $  $ (TlXxd\pt\ < < < @ HlXxpXxd\\ < < < @ HlXxd\p ( ( ( ( @lXlXxd\p ( ( ( ( @lX  @XT @PTlXx H Hxd\ @XT @PTlXx\X\ $ p\P @l Hxd\l$ p\P @l Hpt 8<pt\ptTPTlXxd\lXt\ptTPTlX\pPTlXxd\lpPTlXx p\XTPT HXxd\l\XTPT HXxd\ p\PTlXxd\lX p\PTlXxd\@D $\ptTPTlXxd\ H$\ptTPTlXxd\ pPTlXxd\lX pPTlXxd\ P T\XTPTlXxd\l T\XTPTlXxd\ pt\PTlXxd\lX pt\PTlXxd\\ptTPTlXxd\l\ptPTPTlXxd\8< H LptPT\ pxd\lX LptTPTlXxd\ pttXTPTX\Xxd\l pttXPTPTlXxd\ P T\PTtxd\lX T\TPTlXxd\  \X\   $ \   $  $\\  X\PT $  $  $  $  $  X \ @ D(,x|4x4@xx|4@@ D L $x||4@@ Dx|4@@ DptDxXTP|4@@x|4@@(Dx\x|4@@Dx|4@@8<(DTPx|4@(Dx|4@ $(Dx|4@(Dx|4@pt(DXTP|4x|4(Dx|4@(D\|x|4(Dx|4@DdPP PP PPdPP PP04PP\Lx @<d @<dP\Lx @<dTPTT T TTPT TTPTTPTT T TTPT8<PPP P P PDPPPPDPPPPPP P P PDPPPPP04<X,t|,t| LX,t| L\dPdP dP 8< $<TT\XTT$|TT$|T TT\XTT$|T T PP PLP8PPLP8PP PP PLP8PP P P T  $   $  $   $  <  $  $   $  <  $  $   $  <  $@D  < <  $   $  <  $ $   $  <   $   $  <  $ < P T $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $  $ (, < < < < < < < < < < < < < < < < < 4 $ $ $    $  $  $  $  $  $   $  $  $  $  $  $  $  $ pt  $  $ < < < < < <  $  $ < < < < < < < <8< < < <   < <  < < < $      $  $ T  $  $  <  $  $T  $T TT TT  < < T ptTTT TTTTTTT TTTTT  $  $TTTT @DTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT $TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTptTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT8< P T $TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT $PTTTTTTTTTTTTTTTTTTTTTTT04PTTT04 P04(,  04 $   ( $ HLpth , TT ( $ h , TT (  88   h  D L (  88  h  D L H   hh  H  $0   <  @ hl $  h h $0 <  @h h $0 ( $ h $0    pt H  $ $      $ $ (  88 $ (  88<PT@ @HL H , L , HL H , L , H L , H 0   0 D   D <   0 D   D <  @ D <  @ ,X\ $P  h $0     h $0    $0    pt ,  < $(  4 L ,  < $(  4PTh (    D < h (   4   h  $0    h X\tecnoballz-0.93.1/src/TecnoballZ/cosinus128.list0000664000175000017500000000337612412501752020446 0ustar brunobruno~~~~}}}||{{zzzyxxwwvvuttsrrqpoonmlkjiihgfedcba`_^][ZYXWVUSRQPOMLKJHGFDCB@?=<;9865421/.,+)(&%#"    "#%&()+,./1245689;<=?@BCDFGHJKLMOPQRSUVWXYZ[]^_`abcdefghiijklmnoopqrrsttuvvwwxxyzzz{{||}}}~~~~~~~~}}}||{{zzzyxxwwvvuttsrrqpoonmlkjiihgfedcba`_^][ZYXWVUSRQPOMLKJHGFDCB@?=<;9865421/.,+)(&%#"  tecnoballz-0.93.1/src/TecnoballZ/levels-data.xml0000664000175000017500000004253412412501752020555 0ustar brunobruno 0 4061812661818 618205242182040 184050404244546 2218665240186 18618126421818 644201818182018 444450184218206 22406542240186 1 4010401218104012 0610021818420212 1802441818024210 1018120218185212 4010181240104012 0646021818420212 1802184454024210 1044120218181012 2 4026421802261818 0652024218160218 4002181410022010 1018100226181010 1826101802265444 0646021044160244 4002401410022010 1018100226401010 3 4226101010421844 1014101010101010 4210261010161044 1018104210101810 4226104010101810 4614101010101010 4210261010164454 1018101042101810 4 1026105050101818 1414101040401018 1010261042164214 4418101040401814 1026104446105418 1414404010101018 1010261010164414 4218404010521814 5 1026262042442010 4414261040401010 1010261052161010 1020261040402010 1026262052502054 4414261040404610 1010261042161050 1020261040402010 6 4226261010102044 1014261010102010 4210261050142044 4618261010102014 1026261050102054 1014261052102010 1010261010142044 1018261052102014 7 1426261016102014 1014264252442010 1410264418142010 1018264252102014 1426261016102054 4614264242442010 1410264418142050 5018264242102014 8 0422202420200420 2004202420042204 2022041604242220 2022200424202220 0422202420200420 2004202420042204 2022041604242220 2022200424202220 0 1 45 35 10 80 1 8 2 0 1 99 20 50 7 1 1 45 25 12 80 1 15 5 1 1 77 15 40 7 2 1 35 25 12 70 1 17 6 2 1 67 10 30 7 3 1 40 30 10 50 5 19 7 3 1 67 10 10 10 4 1 30 20 10 40 10 20 8 4 1 50 10 10 10 5 1 21 14 17 30 20 15 8 5 1 50 10 7 11 6 1 15 10 5 20 30 15 8 6 1 40 10 7 11 7 1 4 3 2 5 50 15 15 7 2 30 10 5 15 0 3 20 10 10 1 7 8 1 3 15 10 10 2 8 8 2 4 10 10 5 3 9 8 3 4 10 10 5 4 9 8 4 4 10 10 5 5 10 8 5 4 10 10 3 6 10 8 6 4 10 10 1 7 12 8 7 4 10 10 1 8 12 8 8 4 10 10 1 9 15 8 9 4 10 10 1 10 15 8 10 4 10 10 1 11 15 8 tecnoballz-0.93.1/src/TecnoballZ/musics/0000775000175000017500000000000012412501752017125 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/musics/in-game-music-1_reg.mod0000664000175000017500000025540012412501752023262 0ustar brunobrunoingamemusic1if you need a tune`@for your game@'contact meB02reg from tlk@tlk games,@bp 24y@81150 marssac/tarn V@france@tel:63-53-26-99 @fax:63-53-20-117    M.K.PPPPPPPPPPPPPPP L@P L0P L P LP LP LP L LPPPPPPP P `PPPPpPPP`PP`PPpPPP`PPPPpPPP`PP`PPpPP_PPPPPPPPPPPPPPPPPPPPPPPPPPPP,P P P P P P (P (P 0P 0P 8P 8P @P @PPPPPPPPPPPPPPPlPPPP|PPPlPPlPP|PPPl SPPSPP| SPPSSPl @PSPl }PSP| PSPSSPl0SPPSPP|0SPPSSPl0@PSPl0}PSP|0PSP}SP `@PP@PPp@PP@@P`P@P`SP@PpP@P@@P`@PP@PPp@PP@@P`P@P`SP@PpP@PS@P `SPPSPPpSPL0PL SLSP`@PSP`}PSPpPSPSSP`SPPSPPpSP L0P L S LSP`@PSP`}PSPpPSP}SP `@PP@PPp@PP@@P`P@P`SP@PpP@P@@P `PPPPpPPP`PP`PPpPPP`SPPPSPpPPP`PP`PPpPPP `P PPPp PP < P` P  P`PPp PPP`P  PP Pp P P P` P  P`PPp PPP`@PP@PPp@PP@@P`P@P`SP@PpP@PS@P `SPPSPPpSPPSSP`@PSP`}PSPpPSPSSP `SPPSPPpSPP} SSP`@PSP`}PSPS pPSP}SP `@PP@PPp@PP@@P`P@P`SP@PpP@P@@P`@PP@PPp@PP@@P@ `P@P`SPS @PpP@P@ @@P `.PP.PPp.PP..P`P.P`SP.PpP.P..P `PPPPpPPP` PP`@PPpPPP`PPPPpPPP` PP`@PPpPP 2P l SPl@PlPl@PpPP| |Pl PlP`P`P|@P| P||Pl Pl@PlPl@PpPP| |P`PP`PPpPP :P: `::PP:P::PpP:P::P`:PP`:P:PpP:P:P`:PP:P:PpP:P:P`:PP`:P}:P:pP:PSP `}PPPPpPPP`PP`PPpPPP`.PPPPpPP}P`PP`PPpPPP `PPPPpPPSP`PP`PPp@PPP`PPPPpPPP`PP`PPpPP:P: `:PP:P:PpP:P:P`:PP`:P:PpP:P:P`<:P  P :P  :Pp P  :P   :P` :P  P` :P  (:Pp (P  (:P (  (PS`0PPSPPSpPPSSP@`PSP}`PSPpPS PS S PS`<P PS (P 0PSpP PS S P@`<PS P}` (PS 0PpPS Ph S Ph`<P  Ph (P 0Php PPhhPS`Ph P`PhPp  Ph Ph h Ph`<P  Ph (P 0Php P Ph h PS`<Ph  P` (Ph 0Pp Ph P} h :P}`<:P P} (:P 0:P}pP:P}}:Ph`:P}P`:P}:Pp P} :P} } :P}`<:P P} (:P 0:P}pP :P} } :Ph`:<:P} P` (:P} 0:PpP}:P}PS`0PPSPPSpPPSSP@`PSP}`PSPpPSPSSPS`PPSPPSpP PS S P@` PS P}` PS PpPPP `PPPPpPPSP`PP`PPp@PPP`PPPPpPPP`PP`PPpPP:P: `:PP:P:PpP:P:P`:PP`:P:PpP:PP `PPPPpPPP `PP`PPpPPP `PPPPpPPPP`PP`PPpPPP:P `PPP:PpPPP:P`PP`P:PpPPPP `PPPPpPPPP`PP`PPpPPPPS `SPPSPPpSPPSSP`PSPpP`SPPpSPPSPP@ o@@PP@@PPp@PP@PP`@PP`@@PPp@PP@P:P `PPP:PpPPP`:PPpP`P:PpPPPP `PPPPpPPPP`PP`PPpPPPP `PP PP pPP P`P PpP `PPpPPP_ `PPPPp P<L0 L L `L0L LL`LLLLpSLSL SL0SL0SL SLP`PPPPp P<L L L0 L0`L@L0L L`LLLSLpSLSL SL0SL@SL0SL SLSL\_\ `\P.P\PPp@P\<L0 L L `L0L LL`LLLLpSLSL SL0SL0SL SL\P`\P.P\PPp@P\<L L L0 L0`L@L0L L`LLLSLpSLSL SL0SL@SL0SL SLSLP oPPPPp P<  ` `p\P\ `\PL0.PL \PSLPp@P\<  ` `pP `PL0@PL PSLPp@P<  ` `pP`P@PPPp@P| |<p `  `  p # & ) 0PoP@PPPp@P| P|pP`P@P`PPp@P P  P`<P @P P Pp @P| &P| +p 0P`P@P`PPp@P P  P`<P @P P Pp @P| &P| +p 0P`P@P`PPp@PPP` P @P P Pp @P| P| p P` P @P`PPp@PPP o<P  P P Pp  P| &P| +p 0P`P P`PPp P P  P`<P  P P Pp  P| &P| +p 0P`P P`PPp P P  P`h<P  P P Pp  P| &P| +p 0P`P P`PPp PPP` P  P P Pp  P| P| p P` P  P`PPp PPP `SPPSPPpSPPSPSP`@PSP`}PSPpPSP}PSP`SPPSPPpSPPSPSP `@PSP`}P@ SPpPSPS }PSP `SPPSPPpSPPSP`SP`@PSP`}PSPpPSP}PSP`SPPSPPpSPPSPSPS `@PSP`}P} SPpPSP }PSP `P@PPPp@PP@PP`}P@P`ŀPPp@PPŀ@PP`P@PPPp@PP@PP `}P@P`ŀP Pp@PP ŀ@P:P: `}:PP}:P:Pp}P:P}P`}:P`S:P}P`:P}:PpP}:PP}:P`}:PP}:P:Pp}P:P}P}:P `S:P}P`:P@ }:PpPS:PS }PS<<l <  l@  l  l@   p      |  | $ $l $l``|@| ||l l@ll@p| |l l`  `   |@   |   |   | <<l <  l@  l  l@   p      |  | $ $l $l``|@| ||l l@ll@p| |l l`  `   |@   |   |   | P `P@PPPp@PP@PP`}P@P`ŀPPp@PPŀ@PP`P@PPPp@PP@PP `}P@P`ŀP Pp@PP ŀ@P:P: `}8:PP}8:P:Pp}8P:P}0P`}0:P`S(:P}(P`(:P}(:PpP} :P P} :P `}:P P }:P :P p}P :P }P }:P `S:P }:\0 `:\( }:\ p:\:\:\<:<l <  l@  l  l@   p      |  | $ $l $l``|@| ||l l@ll@p| |l l`  `   |@   |   |   | (<\<l <  l@  l  l@   p      |  | $ $l $l``|@| ||  l l@  l l@  p   | |  l l  ` `|@ | ||P l Pl@PlPl@PpPP| |Pl PlP`P`P|@P| P||Pl Pl@PlPl@PpPP| |Pl PlP`P`P|@P| P||Pl Pl@PlPl@PpPP| |Pl }PlP`P`P|@P| P||Pl Pl@PlPl@PpPP| |Pl PlP`P`P|@P| P||P l Pl@PlPl@PpPP| |Pl }PlP`P`SP|@P| P|@|Pl SPl@PlPl@PpPP| |Pl }PlP`P`P|@SP| P||}P} l @}Pl@PlS}Pl@}Pp}P}P| }|}Pl }PlP`}P`}P|@}P| }P||}Pl @}Pl@PlS}Pl@}Pp}P}P| }|}Pl }PlP`S}P`}P|@P| }P|@|P `PPPPpPPSP`PP`PPp@PPP`PPPPpPPP`PP`PPpPP:P: `:PP:P:PpP:P:P`:PP`:P:PpP:P:Pl :Pl@Pl:Pl@:PpP:P| |:Pl :PlP`:P`:P|@P| :P||P oSPPSPPpSPPSSP`@PSP`}PSPpPSPSSP`SPPSPPpSPPSSP`@PSP`}PSPpPSP}SP `@PP@PPp@PP@@P`P@P`SP@PpP@PS@1/ķWf(cfVԪPп;@Ļ50= =CH H@0 #29 4 $  0&- *-,&  (1$!/.%1-*25( "  "0106:2*)$ 5/H ur gRX0#ЋО'R Er6Oe /<ण <:/bT,;_B5ذոȽ"=,*P_D;SQ,* 14.B[RDLV@('%̸ÿ!34=T[QPXP8,)Լ+59O_ZT[]H63( Ĵ/7H\a^beZH=2к$1?TacfjdVI>,ƶ)9L[cgljbUI8$Ѿ/?TdhlrobUJ8ɸ#5I\fmstlaVH0ô%:O^hqvslcVB-*ATbnvxundT@,к0FWfrxyvnbP<)̸9L[kx{xun`L9$ Ű)?Sdt|~yl^N8 Լ+?Xmw|vi\J0͸0J_ny~wm[D0ȴ9Qbq~whT@,ư$>Rdu}tdP>& *AVjy~p`P: Ժ-F\n||r^L8и3JZn|lVH5Ͱ8L_vwdVD,Ĭ #;Rgt}{ndTVgr}vm`L6! *CVes}~ytjZD2 /FXhw~{xrfVD-̸2J_mu}~wmbR=(ȴ8N_mv{ytj]L8$ İ &>PbqyywshXH6 ,?QcrvutpbRB2/CTeqvtrl`N>,й4GXgrutrj\J:(̴"7I[kqrrpdTF8!ư&7J_ilrtl\RF0$?V]drxmb_T:&Ĵ'DTYerpfb^M5%°1GR\jrjecXD2&Ѽ!9ERdnifjbL<4"г (7BTehehfXH=0Ʊ+8FZedehbRD:)+:HYccbb]PA6$.N\`ab_UF<-̺"1CRY\abYLE:&Ǽ$4FRV[`]RJB3Ƽ)9FQY\\YRH<. Ź (9FPUYZUNE:*Ĺ *;JQSX[THB8$Ź-?LLT\XLFB2Ÿ!1AJLRXSHC<, &5AIPTSNHA5%ɼ *6?HPRPLF=0"ɽ ,7?IPPMJD8, Ƽ!/9AINNLHA5( º'06DLLHJH:,%)/8FJFFJB4*$!)0=FFEHF<0*  $/?D@DJD50,%6@>?IF:52$ĺ -8:=DF?96, "/58>C@:72%  '049>?<84-!%046;?;51, '/15<=840()-06<:430#  ),069520* (-02540*%  *,,150*($ $(-0.--( !'..***$ !(+***&  $%&(($    !!%)$ '$ ! "$  "                                                                                                                                                                                                                                                                      #-. '0!+ '40   3K]gdTF@0!    #/:4$ +( 30=:) ;SX_h`D0#+0$Ŀ  %%*/1;DI@  Ļ    -?B8!32&"  ;OendP<0/$#$  '$"  Ƚ  66%  '?G@0 +?WRJ4&! "  #'  -," 7RQD( :MJ@6&  (" !$   ¶!  +('(  !+74,'9CB4( !!   '0 "#/$      #&$#14680!#(" +?H<6*   '/(   +,* "%("'354,  '3650"    '5?@4  )*%'31.;B;CP@$%6=D:0$  ļ%;KUXL8//>D0#&$/2)"$+,&5D@;CI2 '?KI<  /66269,#?OH@(#5BJH8,$'9BF@,$6?4," !4990+30 +?OPLA<0(/CIHB0"'?O@% ľ%&7D@2  +?@,"  +?FIHBDBA=CRPFB0 ;>(̿ " %7>2"   '?D@5$  '6=DA6.1;C=7605?:0,(   /0$#+7975(  !,2, 5MU@*-;KMCFI4"'/:8- #$"#.71())(!ȴ  Ը  ?JMKEE@>?GWQB:0,*(   %"'.0(   "!   G]ZT@2;<9?IGDDA5    !%)-$ '$%+2   !3IBFH03FGOYRH:67,   #14$·+9CD,%/( ! "/=Oc`PDA>AID8$ %50    +25;=805:$"&%'( 3>DJB8*)35;EB1-40+-(##  +684( %*& 7MMA8,$%%'1644*/?8-%),  ;@;6 '%     /?D4")/+/CGNPNP@',!   Ľ)5?B:(#),  +" #%$%3GJCKWXD:8,%!!'&  )"5622&  ',3?DJUX[\P@99216( $ ж 277>@*  &(%!!%&   ->GSZ[cdZUVN@0)#%-$   ´!#/E8 /0$ #,-& /7ERRRRQMOPH@84,$'*½+190""& '.,& /11 ';GKLR^XLJKSLC<,+0$   %/,,30(##$  &)"-EYZNID82=MHCMRNB0$ Ƚ  !& /52- "$'+(!#.(% #'3KWQ@, -G_rsn\B0   '5<4$*-*")*'/72(+/7BDIH0 %7OspTD4$ı--! %3?@0"%%*9:0/,$"   '?WTH8  /G[o|zxtX8/,Ĵ#33(ʾ%$Ŵ +;EJ@( /=9:=9:5!&(  =OUJ07DK_w~u`@, ù 7;2  %+,!#5>B@4$+?OVB(",("" /GH8& '7Gew~uaQD0 3:0 Ľ16.%%&$%/;EJFGH8( -6  #5ENI5"""+?[s|ydH5* Ȳ!)30  #/?=07FOOD<:500(-( 5FLJB2 %1=WoyzlT@:0 ̨?M@(Ⱥ '+$-?ORPH87?B=*  !!#/GRQSP8 'Oo|`ECF8&Ĩ -GH0Ф#3?RVSJA<=GO@$# 22/=JNWP4 #?cz{t`@-,,$=@2 Ŀ'5&/COPPPD4̼ />0'1=KY]ZQI@321*!  /GE<:=COR@,/?_ur`POL< İ/* #3?@4 '3;GWb\J@>4$! ?Y^RD9;?A4+?S_PGO_bP0в32+/60'2$/EWg`L4 "!"&?NWY@*("&("/=EHBEONU_T8   %/3,$"%.?W`P<)/0($" /GehT8  #''5:=G:6MZPB2̸&, »12-*($ /IQH@4%9A8&  +CMX[Q: '3**37=@CGB8 '0$ȹ$'"%"  3>:("-?J:$6<0/G[`XP@ &)& -;FJD4 .,$¼ ! '! 3GSL87;?G[dTKH@( /CMM:  #&  »  +* /MXL,+7?GWd\PD4$5EQVP(  ! #)*( ;SUD '=GVgh\P@*3?0 %;KL@,   '9=5$ ! '5?@0 '15FTXZXLDCA>* +?:.( ȵ+77206:0  $*01* ! -?O]TJS[\TA0)"  % +>@0)2?MJ8$%%  )$%3?JQQQW[XD     ʼ 5:3;=1.=O[L -(/8".8<0#-G]jdP80/(  "! Ŀ5FF:06:?STB0$$%307QH0%5KVSLH@2()"#  +?KF5*+;OTPD,&)$%;RQ@6?FLNH5)/82  - Ƚ#7616ED86?MF82* #)% +.5?HCK_qwpP( "&  '*(/>GD0 !#$+4;B><>830)! #/49OmxhH(!+ !""'9FID6(  /?KMH:.-4;8"#+>UfbL0#-/*  Ŀ '5?D8%'( /KUNB8698.%   5GQRH850*79( ¸&7:960)"!  (7?KJBA<2,  !# ƹ /;EFISJ4/205(д!)-% %+*$# )2$ $ /?IOURF8)&*/,&$%/?KH@;=8,!#)"&#%$"+7@8( -7?O[XJ8 /<0 (&$"';STA70&  #-) $/CIB8$ ?U]`H(-4* )=OXP8$ #,,,/2,/82"   3GQUL8  ;W_P4-/.% Ƹ.72$),$ '/'! +?J@0/1+)( !/ADF@* '-$Ը +1*&-$ )20  /=80,&"/<0  #3?@2$"  ȹ #. +.%#/6320*-*'40$"'/90 ж&20"!!3<(   *3Ob]P:3) /( #-,$   "'.$ %54   ;_w~pX8   ' ',%! "   ?gx`P( *12, *$   *7GYkwtf\J0  ")''+15()-$"% и   765E_mbXXXTD" .3;8* /443/,     -?KLIDFOSSD("  -025-/GI@5,"Լ    !"-?MD867?F@5* '13$'-00$&7GLD:(      #/2()/6:5-*52(3?F<, /7,/?NL<0&      #***" #$/77=CMRB0$# )7=07OPB<4 и     %54&+:CKKGB@4 '::* 3;4.,'#$  Ш     ;C8(+?SRH6-*+("#! 7JH6 #*,(!!""Ըĸ     /=:0)%$)*1=CA6)$-.$ #/?G: '+&#& ̶    ;@80/3;<0&-5,'%%,"#' "?E8 ! ü! " '+/;C@>EHB8"#%( "!/6,) ),&$!)+&  +.&  '/586?MRPD2($ "$ #'  )/( %-*#,-/344 Ⱥ %34/,  +793;GOUSL@% '.  %/=@,=D@4( #39,$-1$Ȼ+;>0  /;:?AGSPH@,     3GLF0/GJ@4) /?8  ¹'6?< +OTH?BGM@  .6,  7GKRH8,/CSXH,%/57( /96(   /EUP@44,"20" +GRLD634.7EMUPE: #>4̶ #3<0   3KPQQ@ #,-*(' 7JF899=B80:CMPQQF8- Ĺ +20"  '/?SYP@0"#70'7FNJ@447;EKC?@CMP@,  *,                        !  !! !! "!"!!         !! &!/"/0!(60 $&&9(&$,;("36!(!50"(!6& "&о&=$"$˸+9$$Ǹ 35$"߾6, !$!߽0( !!ո,!!Ի(Ծ!" ! ! ! !""+(Ž "+$&0߻//(35 خ;5$65Ǭ&99&;00?9 +;0񾤸 5C5/?"踦6H0/=!緤;R,39⸮=I000侸EL00$LP0$˸IL( о!HI$ B5&00$!&! ! "!,$!",3! +,; (69+=0(6(00! ,+! "+($(!&"!,$"$0&!"",(("$9!!"!,6""!65""C0з!"5H($(BE!䪽&0CBФ !&;I5"3CE(親!?E;Ѥ /HB, !?H9跴 ,RC(?W;þ (RR,;_M߾(L_BǷ9W_0紴B\VѤ 3LVH=IP5/HBC!ߪ (=B5+Ц=H9&Ǧ/PC+辬H\BŴ&Zc3?jc! RqTо `nE,dj0ء5cc$6VM3!,C9񳒽+E50箜9VB  讦PjC߸!ixBŸ/{0طH}"_{ ms5wZр("?sB/0Hx;("IvgH!߾$,IcICڻ30EL,藓6 (9355ߝ++;?0"Դ!"HC$ M;3R0 ;T$CM+HB 0E(0BԾ"! &9++!(6"0(0+ؾ /3,6"50&05ھ/C+/6+ͻ?I!0=&IHڸ3=г=VB˰&;5ìHV0Ǵ"=!뷸+PM!羽&9 ߰6R=,(дCB,&/L3!ؾB=" ,I0 ߾EI&ʽ(VB ø ?g9ߩWd5+񷝤6nc0&+ߡMxc$ ,;Ж_{Z3C"w{TظEB5{B˸M0񝀒Ps0&I"蒀Wc(+6ؖix\/(ŖjnR$"œ+djB뾝6__& ʪ?VRԻ9M6 6L$3; ,0  /"  / 0  ,&"!,!"! 0"$!$$"(  !&&!!&("!"5(69$ =9 B3 &B(,9$! (,,"""6"!&B&!;Eؽ(,!˽HB˰&=0VB 5I,ؾ+\BBR(6_CPM6\B&WI3T9"ZB +E0&T6 &9+(T; !,"봩,M5!&߳6L0&" خ9L$,!îHL!"(踰"ME""߳6WEгHZBи L\9PV0MI+ +EC( /96( "930" 3B3&!?H/LR( RT!&VT+WM5VI5WI!;\E$ھ C`C!/!&TgB虙+=" 3cgBЉ/I!辽 ?im0À5L"踽?qn(?R(Lsj!IR(HncHR!CjZMR=cRHL 6\BPB$6M5"M5&3B$䝗/H$//3ؠ5E,/"˦;B(0(ǰC5,(!Ÿ$H",! 3I߾ $?Cؾ !ܳ EB  !(ԳM9 "+Ѵ$L3 "+˰/M0$,Ǵ3M(($ø;R!(!CR+LI!+߽RB&(+R5 +!6M,/ 6B!(35(0"+&,!0ý"0! &5&$&?,(쳤,E5!! +(릦/M9"!0!衩;R=(Ը5!ߝCR=(ʷ5!ߡHR9(5ԩIM6$辴0ЮLB0"ⷳ(и&P;$ ߷"6I, 侻 ?; 쾽?0 ʸ";$˷,6!$а +5+ʮ!"((3ǩ0&&!6Ý&=+! 3;I0(MM0봠ZR( ߳3cR!ش?gE Lg9Mg( $3PZ߾&6PC +Ѿ9H9+˳+;9(!$ (/30!&!96,!$䷷+=6" !ճ6C5 Ǿ=E( EB! (B3 6=!&;0 3B"0=,"+ ?B!+(ʾ/I= 30 ؾ?T53,зMZ,9(&\R""9!軻/cI$5ؽ 6cB ""CZ9CM(?=!!60!+!! &(!з"3,  ⾮3=, ت?E$˝&ML"!6VI$񮊩EZB !&硍MV9!$ ߡMV,!ԦHR!Ԯ"CE ˰!?; н9( 0!$  ! ! !!""! ""$ $"( &!&$($ +! +"++$"!,! &+(( +& ",$$0!&,$"!"$! !++!!6,!+B9/IB 3RE Ǿ9ZB ʾ9ZBи;R;"и?H=!"н;=5$!/3,(&/! &"!!!!  $+! $;"3B !(?E "&WEо+(Ż+dIǽ5$з?jC9"éPm5&0"ܸ`m(ذ 00!Ю&nc!Ǵ9,æ?wV&=(ڴVwI;B!ʪ_vB߮EB!緡/ms,ʰIB ئ=vc3I=ʝ PV9M0񾍜!g{B谽;P(讃;vs,ԬCLߙVjdzICԉmZ+L0,x}E0C"񳃜?xs(ػ =;ߦTwjи=+ǠWsVо+9賩+Wg95+ˮ3VZ!6"?PE!5ڦ(;=,&(59,,⮪,B0!+Р$?B+!跜=I0 $, Н"TM0(=cB,5䪍Tj0";5Ж&mj!վ0C0?xgʰBE,񦈗WZ!IE!♅iBߪ/RCʓq+Р?RE 3{sř EPB?}cHL9򮅙LR"IH(䪈PvB&EC!ߦ Td0/B=ءTR(0;0ѤIC! 05+ˤB6&,!Щ90$$ˮ!00!"!&(!! &( &Ը+"(г/!",6$ ,0߸"5, 63Ѱ /6/B5Ǧ?;+/C0񷩰;C!6I+방+?C?H(߮/EB BIԮ 3L; ?CѮ3V5 ?;г6R9=0շ=R96" ?V9+?R5 ?M0 6B5 /=5!50,& "!  ! ! &$ $!"$((!"&&&,"&/!/0!50!&35 (9;+B6 /L06L(CI" PEԸ /R=Ÿ ;P0 "?Iߪ 0HBì$=H, 6CBԦ&EC36IB!簰LI5˳ 3VE(뾴HR9ؾ &TM(û 6VEظ $HZ90RV$߮;RI ˤ(?M9 5=H$߮&330Ԥ!0/+ˡ50&쾩/B0߾"CI+ 6RM! CZE P_BǷ&W_3谪/WZ!Щ" 3PIŤ!+!+B9Ý+9,3!򾠴5I9!򸦽CVB 뾩"Tc9+mg3ŷ?vg( Ixd!R{c +W{R 3VsBߡ 9\g!Й"9WT˝(Ѹ (+6I;(ͷ9/39$!ý,B0&$;E, HM( ھPI!+VC/Z96Z( =RBB ?3! "5!$&$! $ !!!"" !$ !!+!( ",",0,(+ (5$,05, &5+ &$0,!""9!3,(;! =9 (L0о ;Z( 볷PV&&"ʩ3dV"!+!찝HmR(;!ߡ TnI,Hʒ"mmEؾ?B/vj9ѻL5Hwc(E(򡀤MsR!$6!⦈WiM&(Ԧ\_E!ԦRZ5 а&LM$ܾ+BB"60!9$,$!! !!$!! "!!"!!$""!" !$  ""+ !/ &+ ,!+ &"!"," (/  ,+  +"&!!!,!   6/B"! ?Bվ&6"LBǰ5E"+VBBM!6ZEMM6ZEZI 5T;\C/I5&\;/B0&\B+3(쮝/V9(/!⮡6T0/(զ;R$3$IM &0촪PE&&߰3WB!ЮEZ9! ʹ IZ0! ;PR$!LB!&B;! (30!/+(&3+! ,9& 5B"  ;C=CBB!BC CH!$LLվ/VM &$=`R3+PiTC0&\sM獃"L3ʾ+dxC߀/R96mw9ǀ9T95jn0;W06ii$HZ(6dcHT3cRMI !5TBPB $3E0"I,,06ߠ,I!,0& ѩ5B (0+а?5++!ʸB$," +C! & 6B  ߸?;  " ظE5 "ظC0$ѷ"E3(з&E0 !(л/L( !"5I! "!;I(CE(HB"" &H9 (!+C($!(;!&! +,(!&! /!!3!0" !3( ;, $B5!!&H6"! !!/I9&!$!5I;+!߻&!6I9+!г(!6E6+ǰ(;;0+! $B5("!!;(!!ð+0" +" &Ǯ(!&Ǭ&+Ǧ!$,ä(!!3"5&!5+B("0?M0 "$PM0⮠\R$Ԯ3cRа?dCžMd;"Md(("5PZ߾ +"л;PB ھ/!߾;E50ش,=;(!,Ǯ(360!&&9;0!&!=9(&ⴽ/C; Ծ6H,?C(!?6,;$30 +9,6,& 9=!&$ +C;/+6P50+ԽEV,5(Ǿ"PR&!9!(\I!"3 3\B"$=V9;L( ;=" 30!&!!" ѽ,(  ⾴/6( خ;?$ˠ"HI""3RH&뮏?TB "(⦓HR5"& ئHR,!ѩCM!Ѱ"=C ˴!;5 5$ ( ! ! $" ($ +(  +(+$+! ,! /! + "+((  (! +!$+! "+"( "!!"!  &(!!3+ ";5  (CB,LC 3TE3VB!Խ6P="Ի;IB!(Ѿ9=9&"050+(/" +$$!! !  &! 5" +;$ 6B&MB&(;ZH /&վ3cB5$ˮCd9!0$ Tg+߷+0"شcc!Ը3/˪/jT9+羦HnM/;$ճ TmB;="é`j0ԷB=Ⳡ3jcʷ&B=ئ?vT/H5ʖZsB3I,/jn0߳;I!릈Lwg!˷BCߖ`xVû"H9 ʍ"qwI+C(6sn0߾6=䮒LqgѸ;0ѤPnTо"9!򾪰"RdB00ڴ,PW$ 3&ô9LE3賳"9;,(а09+(븮&;0&ت;=$5H0 !(ةLL+$ŝ5\B+3볖Lg560؝dj(,B0Ö6qgд=C+L}\EC"衊`E讴+MBѝi}0զ6LBǒ(ss!˝?L=6wdCI6?}ZEC(賍HsB&BB!߮Pc3+=9ڦ MR(,60ةEE! ,0(Ѫ?6$(!Ԯ60!!а00 !Ǵ&(Ż&+"ؾ+$$Է,!(Ƿ5"(,侷"5,30 մ +5,=5ͪ=;,&?0;B!3E(񳪴+?B6C(䰦/CB ;E!ذ 0H; 9Bճ0T5 ;;Ը6M6 90ظ;R9 5$ =R6+ ;P3 ;M0  6B0 /;0!0+("! ! !"!" "&! !$!($!(!(,!//! ,3 "0;";9 $E3/I+;I(HE!߾&LBл3L0 ;H! +CBа9E0/?B!߮!BB5î0HB$췴 EI6Ѵ+RE+÷;R;LM+Ž /PH߻?V;Ǵ(LV(贰3LLѩ!9I=/6E(距!/00ߪ  +((!ѩ0," Ǫ+;,=E( Ž/MI! ?VE LZB˻!PZ5췮+RV"خ ! ,LIʩ((=9Ǡ &6+0!0C5!=R=  쾬L_9ó"`d9ǻ3jd0?qd$˽Ivc"PvV +MnB説 0Td(ڠ0RTՠ!"$/E=Ф$0&,6(Ǹ &9+!"5B( ?E( IE &PB+R9/R( 9L;B;0! !0!"$"!$ !!!!!!$!"(!& !, ", ,,$,(3$+!,3,"3("(,,! !5!/, "9! 69 $H06T+츻HV& "!Ю+\V$(!񷡬?gR&6!ߩMmI+CЗdjE 6BÍ&qiBսE6?sc(C(InR!!6!詊TgM$(ة W_E !تRW5Գ&IM$߾&BE"606$/& !  ! $! $!!!! !"!!! !!!  !"     "## '$ '-  '&&!80 '7< ?@/_@h@/0o`?I@ D+('4 ~@/0?gP/p ?p? D /W@@?gp /O o`8/ ?p@pHGL@?p@ 0?`0J3W@?o`?`?p?x_ ?p p0@@_@? ~Xw`𠟿? P?_x0_p~@8x@O}p[@@@vP/TЭ_}h_p𰉉p `?@^o@|@`@ Ox ?p з?`L 7wlh ```?@_@  _}p@W@_x[X@෻p05O | H Џ/~@ʨ?@> /_`_x /[o~@Љ_@o`?@x@p?P / _`| ( /P8?P#?p|hL _P@?p4 ?P0@?Pl 2 00 /ox@_P J8?oh70( _p ࠯?_` /XPА_`H /`_@ohP/0_Pk@F70UB@ /9B44 g@.W` ?` P/KH(/@$+?H <?`/_@ʰ?H?P ]@?P /T /?\@п/(̳/_` ?P ./@o~`@&0?d@ $ +7H 7g]gl`/PO0?4%7 WP7470 ȳ' ?P?]@ /0/wH,d@ п 3($/$?W\@ 'WP07,/L8-O`SH6($',*/?v` п44 +(( 7@ *%$,,  7 ?0?@?@8+ <;C@(,б"$ ?P/G0 / ȷ" /$-8(п(+70 '0 7@/OH(86 ' / /$2(/?H(< 7(/47V@+4 ' @$/F@!?0 , '  #/OZH87WXH01(+?@+/2+0 ( &"/0  /(  "!+0 $ + *1,( 0  $(" *')  ,'  #("'/()/4 "".50 (+  ) !+2$1 +  %   "$$,:@:1-5;5*& '%!##   OSTROOOLHǸ !%$""&)&(޽!+./3;==@EHIIZ]Z\]]ZZ\VS3Ǻ   $(/025;<;@STTVZYTTWTPEĴ   "&)2356<=BHTWWVZYWTWTRLʽ 䴤 %+..5;<E375' !#  dz  % *5>AJGQU^`eup~|yrjc^SGLA75.#% ѿ(*0:AIJLUaciluy|~pcZSJJ@97*!ȼ#'(00::CJGLWUUWUUaZ^cljjpywrz~yrnjec^LAA@3.,'#ʿǾž !%%%'#(,.15:>AEIJLNWLPQSSZ^ZZ\cipplrrw|zz|wryz|wyppjngccec^^WNLE>::0*'%# þ '*.,,(,1.7777:7>7759@CEN>AAIEEEE@E@GJIEEEAAEA@ACGIAECE@C>E9<@<<71.,..*#'  ſ  #',,1.07::E>7:9@EEAEAENNNLJILILIIJJPNLNQPEIEIEC@GJ@C:97755,%'  '!#'*((,..5::@<@@@CACCAGJJJEIIIJICAJAECC><<9395(,(%(#!    !%%! %%('%%(%(,(,,,,,10.*.,.000,(*,(,(('''''#'# !    !!!%#%%%'(%''#%'%%'%'''%%%##%%!! #!!!           x`k?$_?c@D?yx?x_HPxϰ?` po_Pxx|X/_o_PO ׀x0 xE_ ps~&߀C?0?75ۀԗ G/~8BOx?!@*?'80HP/؇7MXoG D  S1G+*߀ן2/;'(:"  O 2" K-طȰ 0=J(+ +г3; "/7 *2' !4?3 * !E6%2ǿ+(H_/* ۹Ũ% 3E)31Է* ; ۫?K/@$; ؛&4OW?/¿2D0OԸ.4P@D8ع gZb8+Ȼ G.83$7п? (,4 ,/ZdPR9$2 ոϰ 5G8T\;(0$(3 ,п7 =%4'+  ϭ,44C0 ޿HLG$(/ 㿿 "*38  #( 0#   #,)"(   ;'& 0   *  /"/1  &)/$0('0D 0'F/- 4 AK?dTSk\Wcf`H@$'?::/:*Ȱ/o~`5Kcfb б А/D8/_ol@Ol@ Ļ+@)*,&3?YZI?Wnp@  %7:GRIC0 W`@$Ȯ?od@Ȼ 7_pD Ȑ?0:O[dH05?@$-4"Kouj@ 3K]\`@.$'ȷ/3? ʽưGV@  +INM_wpXMTGSH;0?_@?KwhVZ0°ĘA:0Ը?PFS@Ȩ0#/Wgz~gwpfna|H@ ܴ707O@KL0!!7( 謯Ļȿ?gh@ ;CG}tTA ;D2OT0=UaT =:1%7B99B(" 0$'1?BذH0  Ĭا( )+Kr`;VT -ж7?ohvpvd03[xpbX4Ŀؠ8̠Đ?oh^d@+-л贯/I@7KTgtTO^H?oz}p@;D(跶+@"',ି5>Uu`J@к'?(Ot`TB2н0Ov`0?fLKkn`0,( Ę #?:?@43GWV[@" ?G_zo}x`@ ( Ș;FKB0+@('OH4"#!ԳĠ+?grD4*:0+W[mp`T0 ̰ҳGB0+W`[xP/U@/:(оȨк?(;khc\Y@'(#$¿ͺĨ *?|\MI8* -$  GM^P1KA@""-1 )* ภ  %(!?UN 2KslHGGIPD;8/?D,'0 $';_tdi`Qma{pX2. аبԷȰWTO{t`F: ?(?@ ;[fgx[gzP7Ojp@ò䨈 3 OP('$԰ ;4/WstX8  7KgpHO`D(/9E@+?<71 +?IKc^gw`@( 0 '6(  7;4-OkaP@2,'c`@84&?]tP2>;CJ4;@"  /C4?R8    9-&=kppu}~XF@&/;?;5;0+?Keuir`PF ع И"?0G@ -?g`(,"#GP@'1?_ai`@$/_bTRVkT@(+G( ̶´ :26OP<=B Ĭ/87SXBSz`0* #55 /85,&.Gotf`@7>0?\Q[@/4ȸਗ(!7F4(Ш /O_X0 +L0)4%/5'?HH<&'?ew`J8"%?QH,62آ Իȿĸ+;OgrpfhX0$*"+2.7?8$ 7< /=OXW\]o`DA('Ok}}d0 ,',%7ID4 (?_RJ@"-GH6=KZX@$*KR8$  ?QGopZ@#& Ȭüذ /KNGOkr\SS@ '75=C[wd_o}t`\L6=0/MH0ി8ലȽ%/,+Wolb[owlB4$*< * ?DH8?wh4 ذ ظ*7OK[vxZ_st`B<3?N8*'"%?KRHERZgbXPRP@Ĭ Ȩʶ'I=EEGopH050 ജ'( OUF_f@6;OrPBGSB713;;4/&'* /8!') ʴ _lP4 & /OD07NVaPFY_oxolw~iTL@ /G@*Ȑ̸*1GkpXRDҺ+*&7CJJ0=]{rzl\[TQ^{xzph`@('0,7:;><,/OR@ ؾ "3$+1(-/<.7_hcwtqksxpiP &" ?H0  ;I@2#:4, Gg`wpc]JO_ZT8")(#7S@,*#+&(%70 ȷȸ #/*&'.54$?TSdTVUEGFK[olXLD*#98$'?g|{lRWf\PB>I@7B4ļ ¸˜#?SLKWVXTZ]UcXML8''$#(3GH(Ofabk|opotp`QH0Ի൴ȰҲȴ 58(7[{tw~|X:0./. +DG^Y_vhox`SgzzpT(!%𸢯ȹļƶ %OZLD?GJUH$'9KSVP4+K_gX8  .,5GktdX@+MTSwpm`¬  ;[`VT@078;NL4/?LW^LB  ?_{|tbROXV_bVP0кĬ 'O^VPE_{pf\BGJD4'2'* 6547FI]hTH<>[~jP@(75-?g|D(Դ7$ʨ31 7QcfTSJKVRJOedXJ<8/?QKP4+1,?[khLD,/_hY_oqsh@д+ 3IO]ZHE2 /_pXMW^glPOo|pUW]fmqZ8&"!17C@$+7UP9@($ĴWi}|`DG8 '( 7DO_XR@&$&/>GU_eh`]\B:D875 G[eX0'( ij+  'EHGMHFkteP@?EJN@0;H@60*"-0$.583E@.6   +O_op`P0-5:(д &   )-%.=Sco~eZXXYPQUH*Ш7[hotXF=Ooxche\@$ 𴊉Ф?WL0̰'Got_o{pP@**7G@,* (!.7:0 _P Đк ʼ7STMH0 Kcsxtlkypkh@$#'(༷( 'G_~paLAg|T4ȌĠ'º9:0+?K[hXJ8,  7OYXQ[\_j`VH*?ozxtdT4Ȑ  Ĺ tecnoballz-0.93.1/src/TecnoballZ/musics/Makefile.am0000664000175000017500000000063112412501752021161 0ustar brunobrunoNULL = pkgdatadir = $(datadir)/tecnoballz/musics dist_pkgdata_DATA = \ area1-game.mod \ area1-game2.mod \ area2-game.mod \ area3-game.mod \ area4-game.mod \ area5-game.mod \ gardien-go.mod \ high-score.mod \ over-theme.mod \ tecno-winn.mod \ tecnoballz.mod \ mon-lapin_reg-zbb.mod \ termigator_reg-zbb.mod \ in-game-music-1_reg.mod \ fridge-in-space_from_reg-zbb.mod \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/musics/tecno-winn.mod0000664000175000017500000020425012412501752021712 0ustar brunobrunotecno-winnmusic from reg\@@ Y@n@ @ V@_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! ***(    M.K.OS S :@S S S :S @S :S @S 0S 0S :0S @  @ S  @  @ S0 0 0 OS ;S :80S 4S S :0S +@S (:$S 0S  S S :S @  0 S  @  0 S  OS .\  S    0S $ (S + 0S 4 8S ; @@S S 0S S S S @ P 0  @P 0 0 P 0 0 OS .P8S 0S 0S S S @(S  S 0S S S S @ P 0  @P0 00 @ P0 00 0 @ P 0 @ 0 @ 0 @ 8 0 (0   @ \   0 ( 0 8 @@ 0 @ 0 @ 0  @ .P.l .l0 .l .l @ .l( .l00 .l8 .l@@ .l@ .l80 .l0 .l(@ .l .l0 .l .l@ .l .l0 .l .l @ .l( .l00 .l8 .l@@ .l@ .l80 .l0 .l(@ .l .l0 .l .l@ SPSl Sl0 Sl Sl @ Sl( Sl00 Sl8 Sl@@ Sl@ Sl80 Sl0 Sl(@ Sl Sl0 Sl Sl@ Sl Sl0 Sl Sl @ Sl( Sl00 Sl8 Sl@@ ;Sl@ 8 4Sl8 00 +Sl0 ( $Sl( <@ Sl <0 Sl < Sl < SlS@   @ 0  @   @ 0  @   @ 0  @ } } @ S0 S @   @ 0  @ } } @ 0 }} @ S S @ 0 SS @ @ @ @ 0  @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  @  `@ S 0S S 0S  S`@  @ S 0S S `00S  @  `@ S 0S S 0S  S`@  0 S 00S S `00S  @   @ 0  @   @ 0  @   @ 0  @ } } @ S00 S 0@  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  @ 8 @ 0 8@ }0 }@ 0 }0}@ S( S @ 0 S(S@ @ @@ 0 OS .\`  S    0S $` (S + 0S 4 8S ; @@`S `S 0S `S S `S @ P` 0 ` @P` 0` 0 P` 0 `0 OS .Pl8S 0S l0S S S @l(S l S 0S lS S lS @ Pl 0 l @P0 00 @ P0 00 0 @ SPSl Sl0 Sl Sl @ Sl( Sl00 Sl8 Sl@@ Sl@ Sl80 Sl0 Sl(@ Sl Sl0 Sl Sl@ Sl Sl0 Sl Sl @ Sl( Sl00 Sl8 Sl@@ Sl@0 Sl800 Sl00 Sl(00 8Sl 00 (Sl0 0 Sl 0 Sl @ ,`@ ,0 ,0 ,`@ ,@ ,0 , `00 , @ ,(`@ ,(0 ,00 ,0`@ ,8@ ,80 ,@`00  @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  <<<<<<< < <0<00<@0<@0<@ @  `@ 0 0  `@  @ 0 `00  @  `@ 0 0  `@  @ 0 `00  <@<0< <<<<<<<<<<<< < <(<(<0<0<8<8<@<@@   <@ <0<   <@  0    @ : : <@ <0<   <@   0 : : @   <@ <0<   <@  0    @ : : <@ <0<   <@   0   @   <@ <0<   <@  00   @ : :<@ <0<  <@  0  @  <@ <0<  <@  0  @  0S S S S @S S 0S S S S OS lS 0S lS S S @l S l(S 0S l0S S l8S @ ` 0 ` @` 0` 0 ` 0 `0 @ @ 0 @ 0 @ @ 0 @ @ 0 @ 0 @ @ 0 @ @ 0 @ 0 @ @ 0 @ @ 0 @ 0 @ @ 0 @ SPSl Sl0 Sl Sl @ Sl( Sl00 Sl8 Sl@@ Sl@ Sl80 Sl0 Sl(@ Sl Sl0 Sl Sl@ Sl Sl0 Sl Sl @ Sl 8Sl 00 (Sl Sl @ Sl 0 00 0 00 0 00 0 @S @ 0S @ 0S @ @S 0 @S @ 0S @ 0S @ @S 0 @ @ 0 @ q0 @ @ q0 @ @ q0 @ qq0 00 q0 q00 q@S @ 0S @ 0S @ @S 0 @S @ 0S @ 0S @ @S 2" @S @ 0S @ 0S @ @S 0 @S @ 0S @ 0S @ @S 0 <<  < <  <<  <<< < <$<$ ( (<+<+ 0 0<4<4<8<8<; <; @<@,]7J{M,߹#>AI`^xϪӶƄ6JF/@lD ѰЅ#D`|J$0Jb6*⒁">Me^%2^N9"5  殡*74OC,%5-_ub=<)!) Ʃ 90.Ӻ G? $4-5ei( .g6%93./=HV* '"M\ *19)"''& &E8++-##$(ȿ  *-:E7. ׾Ͼ  KK6# 궭!M:! Ԥ65(%&+# *ĤRg]Y]]VN8ж˝3`b`bnlk`; ȳŒKqnflroqY- ū׼%RaWU]eja<Ϳƥ>SXVXY`]?!ɶCFLOLIO:ϳ@LS]_XYN)׽ƿ )5>A?>Ŷ$0?EJH9 (096 "0;E/ %.0   ,?F;#26 "2?9  +2 &3- $+Ⱥ ')275 ü "(*/+  ".428*   $/-*+  !)''!  #"  !(' #$ !"  !!                                 !$&((! #"      "&                   !""                   #                                                                                                                                                                                                                                                     A?=:641.,*'$" #3DYqt&1ES\cdgiigfc`][XUROKHEB>;741.,)$" "0>Obvl7#1=ELQSVVUUSRQOLKHEBA=:741.,'$   &0>KYfs}~w]8ϰ $-4;>BEGGGGEBB?>;:7630-)'$"   '1:ER_iptsiU:ĩ &,.367888:886431.-*)&#"  #,3;DLU]dgf`R># "$'*,---.--,,*)&$""    '07>ELRX\]\VN>) "#$$$$$##"##"    ',17>DHNRUUSOG=-     $*.37=AEHKLNLHA8, λ    $)-14:>ADGHHHEA:3' Ŷ   "$'*-148;=>ABBA?=83,"˽   "$&*-0368:=>???>=:60)" Ÿ   #$&),-01468:;====:740*$ɽ  #$&),-.03468:;;;=;:741,' ·  "#$$&'),-..134678:::::8741-)$ǽ  ""##$&&')*,--.01346778:::::8763.*&"º  """##$&&&&&'))*,,-..0134677888:::887641.*&   ""###$$$&&&&'')))**,-...0113446678:;=;;;::8743.,'# Ľ  ""#$$&&&'''')**,,,--..00113466778::::;;;;;::87641.,'$»  ""#$$&''),,,,---....00001133446677888::;;;:;::87631.,)$  ½  ""#$&'')*,,,-..001113344667788::::;;;=======;::87630-*&" ž  "#$&')**,--.0013344466788:::;;;==>>>>>>>==;;:87641.,)$   "#$&')*,-..01144667788::;===>>>>????????>>==;:87430-)&"   "#$&'*,-.011346678::;;;==>????AAAAAAAAA??>>=;87630-*'# ľ  "$&'*,-.01346788::;===>??AAABBBBBBBBBAAAAA>=;:741.,'#  ~~~~~~~~Ѐʀ>` ~~~~~~~~~~~~~~~~~~~~~~~Ph^pЀ6HT~|H^`РnP Jf~~~~~@>~~~```4Z~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~p"Ժ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~4*6$28 F@ЀЂʰؠʊ舀*@Fd>`^~`DNt~~`T~~~~~~~~~~~~~~~~~~~~~~~~~p8>h 0"$"8жvPv >~~~`LZ0^@&6\N~`$6.~xn~P~~h^~~~~~~~~~~~~~~~~~~~rl0>&ب򠈀Ơ VTV~~~@4>V~~pp@~~~~~~~~L.~~~~~~~~~~||`Vv~~pFbpH:8&άܐ𚲀 0.Rn~~~~~Nn~~~~~~~~~~ ^|6J8~PPND@<(>@^`6N@^vthBXPR @.>0 аȪRNnpvpx~~x~~~~P.V~~x~~~~@~~~~~~~^xjJzXfP>H&XRP0:@о֠Ƙ Ь:.@ NH6FLV@J~~~~~~~~~~~~b~`FBB~~zH8&(&0 .0تҰ &,>\X0Fdf~pL8$>؄ȾΠок঴ ">(>&*J`ntLz~~~|^H8~~n~~~`^P&R@Z4.\d>LD80$ $ά Ȝд̠؞дزИƪȴ־ .&20Ĩδ̨ʤ䴴θ0 :@28,n~h\lvlHFnh:Hnp@FN8^bzfp^T>^|v~pbR@LN22&Ġ¼ĈȬȾ .\@N@\H@66ZP>`f|rZR~p`z|~~x`TP@Vp2$.<& 2 .@ ¶ĠƸ¶,&&:  & @$ ">2>.PZXP46NZRnlz`@JZn`R^vvh42N@4( 60  ľȬƼ .$840>@>N0JFJNR\X@N\RHH>T602<4.8&$Șȼ̦̾".&20.:..RX@8(FH8&2:RXP4>J,&<,&F:.0$,20 ̸ЬļƼиľ:J8JLL<4HNH<$ , .48H@6(.00,$ к  "0(>8:& 604JnrTLd``JD>V@"22(&( оȮ¸  "$:2:86BNNP "8$.22(.>4*66  (,"6,$$$о 68&(06482>JB02>D8>26BDD@ .6((    .(&:(&,2>80<@42$&0 "(   &      "&,44( "&(.(      "&.,,  "&$"     $     Ⱥ&.626:8<@>0.,& "&"      &*,(*($$&(    "" $$                        *,$ &,***(       $"                                 v`.@^~~(.0Ъn~nP&FD^~hЂNt@N&кమ>\@̴>~~`":4N~~~b^z~tnpjnnpptxrttntvpflhf``^bppdP<4,,$´$*08>DJPTV\flnlhhnz~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|vrvzxp`VVfnl\D4&:PTH(4@>,, &00 ".>R^\LHRbn~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|rtxv|tjltp``b`XXXTPHNRPF<>B6$(.0,,&"    *,..22688:>>@@BDFHHNZbXLNXd`VX^d`^b\Xbhb^`b`ffb````dd`X\``bfb^ZXXXZXVVZZVRTVTPRRRPNNLNLJHJJHJHFB@DHHD@<:>@@<8:::<:4462*(,00,*($**&"&,(    "$$(*.0288:<@DJJJNRTX\^`dfjnpvvx|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|zxtrrrlfddd``\XVRPNJHDB@<:8:80.,*&$"    "$&(***,,.00022444688888:::<<<<>>>>>><<>>>>><<<<<<<<:::::8888886664442200000.,,,*((((&&$$""                 %# (( () $' !          !  ..$  7?5# ;JD.ž8MN:ȸ 5KQ@ ̼  /FOC$->IA& /:@<& 3:92! 6?9- !7D?. $8FF4 Ľ#9EK@"ȷ7FMF. չ.CKJ: IJ=GIB,  Լ/AEC8 ɸ#8@><)ż.897/  !.20*$+(!!         $& ' !,& (& *, !%%%*! ''!ľ $!*. ƹ)1% ʹ&-(ʾ +,)$ "36,Կ! 5=2 0;8"ʽ  *47(   %*,& "!      $*!'53& ';B8%)?LJ6 *ASVH..EW_X=1IZdbN(+N_ijZ2ĸ#Mfnm^<غIisp`@رCivq`Bܩ=_xubD⨊ 7XuvbD譄 /OktdF 곅 )EctiK$񸄀!+% #>YonR&󺈀'50 9SjpX)/@8" 3Ois`0 3F<"2Skr`2 3E=2Ujr`0 /@89Wio[,𼎀'4,>YghT$콘 #'FYa^L   /KYZS@ȶ9MVPD1¿ *?KOE4$3BDD8( 5@>8) ļ #5<6+ʼ#25.  #'! ȸ.-! '.1( Ƹ ($ "-58.̹ # #0;=3Ѿ"1=C8ı 1@G@&ʶ 0COH0 к/FTN6پ/KZS= Ĺ  -K]XA' ̿ +J]ZG0 ͽ'I[\L:!ȻCTXQF. ƾF@6(1AID<-ÿ 3CKGA0ſ #7FMKH4ƿ);IONI6ȿ+=LQSM8-ANSWP8+AOXZQ8*AP[_T;¿'?P_dX=!&:K_g\@& Լ !5G\k`G0ֺ/AWhcN8 ָ%9OcdVD*ض /G\a^O6ล#=V^`XD亢 3Q[`^M$꼢 )GX`^P) AS^[N,1Ҝ6Rb\F$*8:0ਈ'EQSD,'23)贒4@B:- &-)!-0*'!%+$̮  #+# ')(&.'ʼ'11,,,!/42-1$ '2522-,2347(&/2386! */39=0 &-05;8$ȼ),0580 Ӿ$')+15)Ŵ !#$(34!ж )5- ܼ.3#ɬ!#1)Զ$%&)ƭ$)"'(#  %.*% 150%1?:-"/CD6&  +CJ@) 'ALD,  '*Υ&K`bL輫EOD*Ц5S^S8Ь#JSD(԰7QS> &HTC)ú3FB( 澡#GRF0)71ݼ%FTP8+&ټ)I[Y@# и7Rb]B!ȴ#EZbV8 غ 6Q[ZJ& ̵DTRH5 ƶ ,EL@.*98(     ! ,-  ",62̼" +382ɽ 19:4 ʽ 4?>:%Ƶ:IG@(ٺ!$'GVQB$ʩ+):[dX<䴖%0$ /SljR(Ĝ++&Mjuf@ Ң 'GgtpV$⭍! 7_ur`:KoufH䬈3WnkR0У #;ScY=ơ  )@4  #5BD6м%4DF8̳'4(3CG9Ȯ1?5/CH> Ȭ7ID ̾+BLD(ʨ?SO.ƴ'CPL0Φ#G\X8&CUQ5Ш%Kc`@ ྦྷ?SR8Ѩ#MedDἤ=PR: Ԭ#OgfJ侣5JQ:൜IcgP +DN@EagS(ĩ"dKڭ7g\K +) ƺ#**#%겝,KW$% '!,  #3 +1&/ õC>Ī>+&7G-#ް4K/M9 3H_?ȠZY(ؼ1D(޷'Z\Y軠"tfԾ,4*Ѱ&ba^۫0}gδ̹'#0 û+`nTďm|S۶An}vWR [R牀LKӭ/lj\6ԇFvY9U񹜍ckQ2韢/epP18ҳUrS2 ĵ1T\4?wd(ƒCfnV4-BA#Rf8ۚCR^M8!)$Ѿ ha7HV@,+"(乻E}]̤)09M:/C6(՝ik媣ѿ-:3D/%'KN,콍#a笠717:7 4SY0򬂃*_붩Ţ?9===?S[,:LധAT=<86@PV#80۳ïH\890=ø5NR*쳋;2ں̲M]A=93#QF&촐U0ͻC^O>>J?ஒYi'ֿ.JUMEC3ܵYEǩ#9MDI4&Ҳc{4ǯ(7AA:#)š9zz.ɷ»-;8?1 /%귘F~m(%.=)5$.%鹗ItY+ܺ,1>'+ "0 6aR.༺!"$  @E+    /A0   (?1    (=0      !:2   1% +'( # (  *' !,+ "%                     %   )&  $&$ &," $!            !                           %&+*! )$  ,% ( +!  ( $               #   %    ( $             %  $ ! $  ( "      "                                                                                                                                                                                                                        tecnoballz-0.93.1/src/TecnoballZ/musics/area4-game.mod0000664000175000017500000014364012412501752021541 0ustar brunobrunoarea4-gamemusic from reg$@E@ @@_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! *** M.K.O@@S@@@@<<< <00<0< <?** *@** 0* ** @* *0:** :*:@*:* :0* ** @* *0P* * \8* @h\0* \(*0 \ ** h\*@\* \ * 0h\:* *\:* :@ \* h\:*:0** *@** 0P* * \8* @h\0* \(*0 \ ** h\*@\* \ * 0h\:* *\:* :@ \* :*:0** *@PhP** P0hP* ** @* .P*0** *@** 0 P* *.P* @ P* .P*P0** .P*@hP*P* 0hP* ** @S* .P*0** *@S** 0@P:* *:* :@.P* hP:*:0:** :*:@P@::0P\ \ \ \@\ \ \@\0P\ \0\ \@\ \ .P\ \0@P\ \ \ P\@\ \ \@\0P\  P\P0\ \0 \0\@ \ \\ \  \ \\ \0hP   @  @0.P 0 @  P 0PL L@LSPL@  @0hP 0 @@0L@@LL@0hP* ** @* .P*0** *@** 0 P* *.P* @ P* .P*P0** .P*@hP*P* 0hPS* *S* S@P*  PS*S0S** S*S@*hPS* S0.P}* *}* }@ P @P   hP @P  0.P* *@P* @hP* hP*0** *@.P* P* 0P* ** @P* P*0** *@.P** 0 PS* *PS* S@P* PS*PS0S** S*S@P*PS* S0 P* ** @* .P*0** *@  @  0 \ \ \ . \\@\ \ .@\0\ \\0. \\@\ \ . \0    @  @0 0 @   0P\ \ \ . \\@\ \ hP.@\0@P\ \\0. \\@hP\ \ @P. \0.P    @ P  @0P 0 @P  P }0P P@ P}0P P@ P}0P @ }0P :P@ P}0. P.@PS .}0P SP@. PS}0. P.@PS P.}0P PS@P. PS}0 @ }0P P@ P}0P @ P}0P P@ P}0}P. .P@S .}0 S@. S}0. P.@PS P.}0P SP@. PS}0P @ }0 @ }0 @ P}0P P@ P}0P. .P@S .}0 S@. S}0. P.@PS P.}0P SP@. PS}0P @ }0 @ }0 P@P P}0P P@ P}0P. .P@S .}0 S@. S}0. P.@PS P.}0P SP@. PS}0P. .P.@. \8\0.}0\(\ . \\.@\\. \.}0P. .P.@. \8\0.}0\(\ . \\.@\\. \.}0Ph hPh@.h :\8\0h}0:\(\ h :\\h@:\.\h :\h}0Ph hPh@.h :\8\0h}0:\(\ h :\\h@:\.\h :\h}0@P P@ P}0P P@ P}0@P @ }0P P@ P}0. P.@PS .}0P SP@. PS}0. P.@PS P.}0P PS@P. PS P}0\ \P @. P}0. @P}0\ \P}0@. P}0. P}0 P @  hP}0  P}0 hP}0@  P}0  P}0 P @ @P}0  P}0 @P}0@ P}0  hZ}0 h\0  h\ @ h\}0 h\L}0L L L0}0@L@@@L0 L }0@L &\ .}0_\0\ \ \. \\.}0P\\0.@\ \\}0\\.}0P\0.}0\ \\S}0P\8 \0:\(S \ \S}0\\S@\\ \:\S \\S P P}}0P\8 \0\(} \ \}}0\\}@\\ P\0} \ P}}0\0\ }0P\8( \0:\( \ \}0\(\@\\( \    ? 0@ 0:: 0:@: :0 0@ 0:: 0:@ ::P? 0@\P P\P0:: 0:@P: :PP0 0@\P P\P0:: 0:@ ::P? 0@hP SPhP0 0@ P P P0 0@.P SPhP0 0@  ( !16 %.344444555577899;<=>?ABCEFGIJKMNOQRSTUWWYY[[\]]]^______^^]]\\ZTJ=/榁".8.  '-/00011123455779:;=>?ABCEFGIJLMNOQRSTUVWXYYZ[\\\\]]]]\\\ZWRLC8-џ &/97$ "'+-///0113345779:<=>?ABDEGHIKLMOPQRSTUVWXYYZ[[[\\\\\[ZXUPIC9/%Ě !)27. "'*,--.//112355789;<=?@ACEFGIJLMNOQQSTUUWWXYYZZ[[[[[[[YWSMG?6,⺗ #,31% "')+,---//01235678:;=>?ABDEGHIKLMOPQRSTUVWWXYYYZZZZZZYXUQKE=3)ֳ &.0)"&(**+,--./01345679;<=?@ACEFGIJLMNOQQSTUUVWWXYYYYYYYYXVTOIB:0 ̭ !(+)""%')))*+,-./01345789;=>?ACDEGHIKLMOPQRSTUUVWWWXYYYYYXWURLF?6)ũ "&&#  !$&''()*+,-./1135679:<=?@BCEFGIJKMNOPQRSTUUVWWWWXXXWWVSOJD<0 ٿ !#!  !#%%&'')*+,-./1245789;=>?ACDEGHIKLMOOQQSSTUUUVWWWWWWVTRNHA6(һ   "$$%%''))+,-/0134679:<=?@BCEFGIJKMMOPQQSSTUUUVVVVVVUSPKD:- ̸ !"#$%%''))+,-/1235789;=>?ACDEGHIKLMNOPQRSSTTUUUUUUUSQNH>2$ȵ  !!##$%'')*+-.0134679:<=?@BCEFGIJKLMOOPQRSSTTTUUUTTROI@6( Ŵ  !"#$%'()+,-/0235789;=>@ACDEGHIKLMMOPQQQRSSTTTTSROIB8- ó  !"#$%'(*+-./134679;<=?ABDEFGIJKLMNOPPQQRRSSSQPNHB:0%   !!!! !"#%&')*,-/023578:;=?@ACDEGHIKLLMNOPPQQQRQQOMJD=4*̿  !  !"$%'()+-.0134689;<>?ABDEFGIJKLMMOOPPQQQQPNKGA;1'Ȼ  !#$&')*,./134579;<=?@BCEFGHIJKLMMNOPPPPPNLJE?7.# Ƹ !"$%'(*+-/023578:;=?@ACDEGGIJKLMMNOOOPPOMKHC<4*¶  !#%&')+,.0135689;=>?ABDEFGHIJKLMMNNOOOMLJF@91'̿ !"$%')*,-/134679;<=?ABCEEGHIIKKLMMMNNMLJHD=7-# ɼ  "#%'(*+-/024578:<=?@ACDEFGHIJKLLMMMMMKIGA;4*ƺ  !#$&')+-.023568:;=>?ABDEEGGIIJKLLMMMLJHE?90&÷   "$%')+,./135689;<>?ABCDEFGHIJKKLLLLKIGC=6-#    !#%'(*,-/134679;<=?@ACDEFGGIIJKKLLKIHE@:3*  ʽ  *TNx(.\&..V2: 0@ > 6^L8< B.F\H (60H(""(,8*@d,", D  $8@$& *,,   $&(0*B  & $   ($0*(    $ "*6,0&" "0"&"                                            0pXh80P`Eļĵ%%C%CJ4ZCZCaKYYKa4aCC;,4-˼%%4:>:::66161:,:::>:>66666,,1((($ ļ%%,,4i~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~u+~f-DEH~~h~~~K,~~[*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{KV?Œę醀Ty<<'US'8Qy^+u~q~~~~~~~~~~~~~~~~~~~~~~~~~q~~o%C~T~~{_%n^.%G򛀔/Ι)’ߩ{jww&~~[X~~~~w~~~{~~~~~~~~~~~~~w~~V~~~{@~~~~j~~~~~H@y~E{(O\D~~򭒧 GM>̀݀ۯ30d6)!j6_'qKW#Qq~۱w~~dF5i\M~Xm~~~`8'i{CYL~~`Iw~~~~`Kk %~~K2׸>0X 㦺 Ѷ6><:QY%]h:tDL{~-f~~bY'+Ob!ʼ:0Z㜳6 fp80- Z 70!3r:b ̛5QG ״f)!E Q1-nO%U@8+/+b-! %)) #ƕƢ >#)<'Ƅ•ΚL! dOc.S:%䚯~f>^!d~~~~~~~~~~~~~~~~~~~s~~~y~hd-ԫ׀ƥӀTUOq8@Zf!%s~~QIXSM5@ S4QV^W#'1>4< 0:2I W "Z#B K˵'Ω>!' >608OK7d^]l-D`jQt#2@# @쩜ӹտߊ6- ݞ )-:2'-4$ٴ§ /< >bZLJB*BJB@@>%866' 0'-Ӿ $ ++*"  3JLNZfG2<</+ " ʸ ȼ ݧ >-/<$ )'"'$) @@<)" 軜¯62    @UQ@ ))D%0-):/"%<2 )H "³¦ٳ $ .<6#?  +   0'"  4  Ľ,# 23!'̰ $'@$ *య ,3"' 10'0   A5D  (Чн?;J$# Һ /A 70  -ؾ2?@'@@ $-Գ53BFW'0Ĺ /@C30?@ < и@7#@X1? к@' 7 _ -  9& $) G@  ,/'(7X & ;-)#-S ȷ  3 ħ'''/?1ҭ/0Ф# )  0( 6 Ю&+@Ш ,@(4 30 ذ. Hક#0"D@# @ 谿3( N00' ?"6@/2O@3/8+08л8?P' 8'&63 "ԯ@ /YЌ,20$/0+'ܷ/" /X$' 0<&P+  0 /S@𤓾&03,O$0&/+MD쬗0 ,@#G2/ $'GH/&'G(/H+=L$ĝ#47@S@(7G,Ȳ'9(P ?N 9 /A& а/81W4 /_@ 50'@&ȳذ88 OH[@7@'9(̰ش<1&?` ?` 5C310 ̰ٸ@00;` 'p  7C@), ిعC01^@n@'@P(,츿G8+ WPO` @U4%зȱп/@# G\$?dԿFVP ̸@ ,CO8g عNG` ߵ9"#7G@)#O@" ;L[0/$#!3E99';8)/OSHľ("!/@8C072 - ONO#&1@0G@/( ."#GHL0Ȱ(/@,3L.$-*@GB9̰,#A,'W40%'0" 8C@@д+ @0 O@0''3&#5988 Ը+";8 ?X814)&34@34(1@$7`@;8* (4182@̢,'F$'\L7B(& %34189 ܰĿ##F@OX"N,' 7@,83(ȿ?@?X@G0! .C,38(лȔ?H$3OPG@ =0/8&Р9L,'G` 7D ;8)6$԰ 7L87_@ I ! 7@$-,̼+LF+OPC( H(#.ط̘KL!'G`/0 O0)ظР?F&'?`02$  G@ ղп/H0#7S@/",;I" ƣL0+3OL #(23I0 ưưF2,1GN0)7( /F2'òŸC@06>F@% 70@@  '̿ƿ/@0@7@C(, '@  98  п̾Ġ@/@8@80 'B$13(0Ȥ=0?8804## ?0',, 5ķϸ34;@3)3)&0 78)%0/ȿɲ67B2!+2,!+/@ ' $)$ '$ɾиª.8E886'&@$&"+,¿ħ7@@7B0#+8&) &$'Ĺƫا3@@& +L@+0( ) %Ļɬఱ+>@) OH +0!##侹ʹ贫7@0 OQ08  'ý5;0Cb@8.  #Ⱥȱȣ+81;e@ 3 0  Ҿи衯1-# /gR( ()#7   辿/,*_`00+)70   ȿ('Oh@3 '452 $ Ц#&&?cD-0#736%ة(+ 3WLD&383  ಹĽ /0'-OP(K4.30#ǽ/80'GL0?H00+ ༽A4'?C4 ;`8)'"@@'/80/gD# Ŀ@A0'1,+aX$Ĺ;A0')'$'_f0 #  ü/@(#!#*Wh@ ')  ̾:$+!'Od@ ,! ' '3S`D 1#Կľ ! /9UXH ,! н +=WXC$ (ظ %'CW`@&&ؼ'?YY8#   9WX8 $ʻ'3O`@'  й ,#/O`@' ػ,))?Y@ #$  01,7OC )-@0,CD& 0 Կ'C8&@$   '39$    '/6$   %+.0  '-,( )0*# '0,! #.,   #3*    0(     ., !,(  ! )(# !  #!  &   $   !                                             $ !   & $' (" ,   ##0"   '0$ &&0) ''3,  '##,30! #$+063&  $+696$  ##+<@@, #';CA0   #7GF8   ##1GO@$  "#1@OH, $#1;OT4   $&0;GYD #%1;GVH(  $0;KST@  #1=GRTC#  #0;GSSH0   #/9GSRI8"  #-;FSSI9,  +9CSSH@0&  )7CSTF83.  '5COVL803$   6@OWS@.30  3@OVT@,13    +?KWR@,-7&  &;IVQD0'3,  7NUSD1'0,#   3GSOF2)+.,  /CUOF4&)+0$ 'ASOF4&''30  )?OQF6)#'14$п +=MOH4)!'39,+9GOI8,$'3@1+8AMI9+$#/@8"ȿ.8@GH8,$#/?@(ξ -8@CH8,#!/@B)'<@@B8- /@A0';@=@80+AA4'7@9930+?C2 '8@:402 +@E8" '7<:3.1"')9  K1@@'@##JYXY8 ' 8@7+/  ,8ZXG3@1 ׷' ((3'89 (93  #4C'#'()) 3ǹ'#,8C,7;+1#+  @- " ,7(030,  #)ۿ 4+#8KC@7&& Ӵ 00+6+  Ͼ#1!0Q908 5 ߿'& @/ ܫ ## 30'@O<+'0@9;0˼7,'&1!8ϱ!# 3@#@;)$# @OI# ά 0)(C@#,3'8@A@)   +@'$  '/3,HF'@A   )ʹǿ ,,'  @ZL/GA1'   '0ϼ @7#&OING  '.ϸ #$ $6C\C,) 1 )1,10@F5' #.'   Ŵ,;#& 2+0'&. 7' # # ,9' DAYIx2 ;"lEGC:.018D0SX5'&&)A3&'?>9 ) AU0I\^O' @$,&4.;V/' ="4"8'  3I7B? /&0(  )9(/3>@OfH  "L7< (<%- 1;XB&<(77F 3 O+%+:#$'9=JD(?M3 +(4BYU$.0 &2!P>834&8  03  '3 659' .D;32"Q;#I'" 4:& ')&% V{&& ')-/+, !/6 " -39H+ '!-6 #'&     *, ! ,$ " )=8'30#!!).:   6     ) "2("     !+*#)      *"9&.   #7'      7"  $   ) "   , "  !       )         #"  !        #      . 'Y''pK@I:0̬;8AVG8,"Üv`3@x@+$S П `.V|`8G88ܴ+/@AG4!'! ȸĮ'S4O0Y&i!@C" 8(&(@0.60$+O8  琇 70 {P l0987E3# F@   *9@OTO,'33GR# )<!  Ƴ𰓷/(gp-6f4N8G.* AA,&# м溙7:OpD%S30@!&#)'&7I0$ ӥ@.slX)@K'I,7# @4'! ׿ש 98#+`ugICS4881  !#7@,#!"ĵ0'@`gXKUF;@8. '65,+-#  !%7NPEFD@:83%  #'$#$   '@VTKQQI@;8#  ,,"#'    #+AON@@A@.''  +,#!    #8LN@@DC4,," #,$!&"  տ##)CZV@@IF9.*  04)!#!   #;KF33@@7+#  '    6CC43<93,#   "    .75+'/.)#    #)+!$'#                                                                                                                                                                                                                                      Ͽ(@/@jl߅@pOX _(F ߏ_N2?<&-2.[``P;0#88& G`OS 3@58&ؿ 3`SP .@18&ؼ[S8 +@!'8( X`+ ,3(;,G[ '%090/L#86, F3#.)''D  -3'0'' @#''   C', @,!/ 3@# ' #'+D  0 ' + &L ٺ(#0 '  & G ܰ'##0 侼 '0<$ ۵(0໰#%8/, ö01$ڼ%'<$ ',ø%76($#<0 #0 &6@*'Ƭ0!9@ & ܼ$8K0#ٸè30@'2(3G0#Ǭ/8<&  # 2 ,0O8)( ϴɦ1#6<0-ӿ7&7OG+,ĬǶ@)19@   (,8&3OP,,ೲǸ9'8@@  2'@3AV,+ 謯̴@(+99@  3G6GX@)&硯α/@@66" 3A)8CYG)#褧ϲI<900  <3/@TO, 𨟨O GB3@ ' 1@,6OS0궘A89C39# '@06LU0丢+A3@08& C@8IS0輰K6@16. .=I8GO0 üG@@96,& #3Q3GF8AI;;6+3 '''O@L89 á-X3@0'@.MHN,3(ǰ\0@3&A1CXL,3,ϼO8@4'A"8(<\@.1,GF73&@0@33\@00, ̿ð/X03 98 I@+XK30,ۿ̸\16&;@C@'CR0.'$ӾO@3'9@ ?B./X00''ďAH/%7@#7L0-S80)#ǘ/R')1@, 'G0OF0)ʧS*,3@!'I)!GP.'̰G4,7@ '@0(9S-,ظ;@'38 430/Q80ඤN#3,@36'N@0༭O'1#  @38)GA,ؾG,,'C690CH,ĸ33 & 97@1@M#Ⱥ@'&38@0COȿ@%, >@0APï$3#  9;1>Vƭ #8$ @@18'9:3%)*5A# 3@+@@8'),1A0 '9,@@6)(,/@9'@0<<3'*).@@ '80883)#'(,<@+60993$!%'+:@/3/993#!'+8; /4+<91!'''89&-8'<80"'''88(+@#;80#&3$'76,ҿ-@9;1'+@#'360Ӽ0@7@3&+H)06*Ի3@ 1@5''L)-8)ּ1@$-A8,3X'+7+Ӿ3@,'C8,;\(''3, 3A0&A@0O`4''1,6C0&@A1UX@'%.07@3';A3YTK',0 ð3@8)7B;OSN '+0ð3@@'6AGISL0)), ʾ/=@'6AGFSI9+'+ ̼+;@)7<]GOL@,%( λǿ'9@+88pGNL@),) Ϲ'3A,97qLIL@8++ Ϻĵ'1F,88gNGL@@'+˻Ǵ'0D.8@`SFL@F& 'Ǽɰ'.C.9OXXCL@E3#οɬ',C.;YYXCL@AA #нƨ&0A0;cYXFL@@K#һ%0@38lYSGK@@N0н#0<47pXOFL@ƷGH/HL`?@?@ = ǠXπא耀 PHp7HCdn~?p;@/ _9`gd`mqh/Y|=lh_g~/~K@^ ? ؀π 脸Ї4 @?x/H?#`_xSx`GgPPgePG@o`@q9S`P/ `;?@@؀ЀԇÀ'ϰ0Ǡȿ00? (``0 _@0{s`ohXsx[`0g|gpC0d7@}x _@p?p WSc00_ojpO0@O@˅ؐϯЋ@耷𔿀뀟 ?0'?dl0#GPCFSG0oh_PA/@'鄿/Bg"qT` ~?(؟ į0W@mP@ao`p<ȿM?o@ſ簟ȤޣĀ/&/CHW?R@ O`;ϕװPSO`wrhSxCI/0! ȧנķ(`Kf@//H_P_P;`߀頯@P/ g{`'x;f$_0oF^8?O7耯”̿ ذ׷пЏ ?/Mdo`x_ps~C`Nt9Ӥ3H`??~W`o`~[y~vxYR7/`@G'@ `Ը8@ %$ȧϐУЏ& #?0' O`WI@>d@`/@ /x ܼă ଻/ 3#*O;H?Wu@N ;!$K,$9 '`S@'WP/Hw HT(B,  (GЧ 7 'O " ;  07N8? ?D!d  (''2@4Ȼ ٥ ' 'f@+C(_(W x7yW@'"O1?ȏЏǿ 833o7@/H?pO4O7 ؓ/'3C@ >9GZ@'YL /(@;D{0(۔Ѐǀ'`(L?r3 ?CO`l+X5г丳3-?N 7_t@+"_PL( (CC4 ߲յָܬج0 2;0OLo0?H`H @ 0  '& C ;@90 (" '3,5o/(g`T @M*(.,  Ͱ ##3#"'@ /8?%8[@G 0~9X439_H7@ /ϼ @@0?L]/(9*޸؏ʿ<008C? ',38`L'?.  ; 8 &/F(3@/@v O$OX<1+@WPG ?G2"㠻Ї"3 070'#%R/@@03'ع贸 L'T ; ?;L.$58-<"79*< F# '@, 20+#' ' @ 3 һ /<$G@ 6 ,1+Y'87@g@?@7Xo07@4 % + ,0 0 0$cB@'/AXKP)GL43@= !ȿ* ( #1 #+     F'#'V#N(/X'c )G(5 % (',(C!س & '''&308O03B$;887$07)# -,      '!    /+&'?&   ) "3',1''*#0 30 "#$& &0   -  ('#.     #         $%*&.'     #(    #      $!$       &"%/)##7 #(*#     !                       xg`F|hO@0(''+6LL!0@FK@,y|1_xX #493 '@=@<8$XH@8,O㨀 Ȁ Ȁ_n`Q@ )-+ +00 gt\NG",!& #,1ɤ !'9@IgX9@O`3A9 ..#cf@GqxxF𰇑 ܴ#Wp()р縀GoHKO9!̻ȳڲ/8ر‚)3QC<_stYLWf0ox`V4'03cI9wh@#K`,;S0'_h@蹱ج ܤ蚖䄀C,#<" 𰀀/[xx@ܳ')(7@ ̵ᴮ,8+;B<6CGcd,!+V88, ;Q0%92Og~pSOTI2  #<[bP3  $̸Һ&'   /V`XC(  ྰ# ;YknphTC:;8*51 &7ISL@1#/(ά  !Ը'COOG6$#10(ø !&#/GYll`NB@30.,$,@@.̺ +;EE@0$ &' ȼ %$!$.3)̰,;A@8,# !)074)п '5@@FLQROH@;820.)+3COSI0 й   '6980 #$ и #+0003781 ư&1870(#'3;@@<4* ι3FTXVQNIA6)%'.136DOP^cecinxzw|{{xpjp_]hWVSJKLK<838/(!  ú   !% "%(#&*, !$*)%#$$""$#+(' '-(!)((&($)&"%%# #"     ""#%%##(''%&''&%)(&$#$$""               #%%"!%'))+**),+0//0.13532321245224311220.//,*+,)('&%$""           !  #####$##&&#"$#"%$#" ""                    !  !        !!!!"""########$#$$$#$$$$#####"""#"!!""!!"!!!!"!!!!!!!!!"!!"! !     C(؀?0?I`@7kO@+G8+؀耯)Я=F0؉?, ;(`A@O` Wtwz~b6[@O`M034 οɳ氧3@@6_p_qh`"GI@ #ث䌷*'(9a4o`q`wHCCR o`?`YX((谹Њȫ'=2EY\7lPOR[dxHKtV_` '00ƨݳ  .Y Ao /$0F) @ @0 0=? / /'0_(@6 ?&(H?? /@@/H@$?`??_ ?N8<70_ @?#@/3O9$ '$oO@POp/07 '"_ :P M/e?h P @'0@?P V?4=G / (??0O 0?@137'$4+7@/@o/|@@WW PD, 0(`?<&5 O +_@_X@73L/ ? P[D(? ?p@/'8 7(@Wd0@ 7@/(/, O?)?PD3<4(+S/`@ OX]2G??@L O7@PV4HP/4O@'G0o ? /`?/@0 % +* ( , 0 /0'@/  /3/6$(O?0 ( 7 .0/(:@0<+$ 0 (????%@ #8 /@D$/07/ E ,! 8?/ 4K ?0T0(  0?mX;%??07'$@@,,8H;X,/0(XnD7_+['P/P U>7()@0#/ / SPPh?D /o x27 _0%GO ?T $$O[+I HOP?+0 7@ o 3(?XH/( /8(P)_@J/@  O+''D (_, 0B; < /08- /0$'X?07(?'@ '  ` (8, @X_8 W^@  @T/p? -R tT! W (;(D ?N @8(H7_ /0(;$D@/ o 3@  7!/ 0P 00(7P'(0747)0@00/ 0$8@? M=  / / 8(: P0@'0Dg +-(?2?7 ?.50<#'   ==  2' 6'$ (<  ((*' 0@//0 7  4( ո G ?Lؿ? '( (7?80-/   0+'0 (($?0$//(/ /4/ P?  @ L (@?40((@ ?(/(&#(  0 00? (3*7@/0  H :/8& 7 ?& ? (F  (/4< 0 ?, $0< 0 - &(0/   $3 700(/ O@,  O"/( $*$(8  1?.70 0 5? 0 ? + - / $ ($ 0$ $  ($ /    $ && 5(- # '8  / " /H7/ 6  #  $/  /$ ($!% $ 0&  *,/ / ((  '$((##$     0"('  $ & / (/'(ğUGpX0Mg\ #Wl`8'_xdZ<=)(Ĕ®  ذYumcTB$3opJ$ .MgyxfJ@$Ȱ+9CIIE>2$Ȭ+120+IJ /?NZbeihc\TJ@2&/=NYeow|unf\TKA80%  ý %),.5;=?@BDCB?;642.,(%$!ƿ !$'*/6=CJQU]cinqsuwxxwxwusqolifefjje\RLID@:40*$  !###$ ""!  !%-486442,'&)-/.,/--.-/14367=BEFFEEE@>8655763/*('&)*--*'"!"$!   $'*'$"####%$$"  !!! !#"#"!!!  !"#"""#!    !          ! ""               tecnoballz-0.93.1/src/TecnoballZ/musics/gardien-go.mod0000664000175000017500000014176212412501752021655 0ustar brunobrunogardien-gomusic from reg @ V0@@ @@_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! ***  M.K. @? @0P0@0@ p0 @ @S0P0`S0 @0 @0P0@0@p0@@S0 P0`S0 @0@0 P0 @0@p0@@@0P0`@0@0@0P0 @0@ p0 @@@0  P0 `@0  @?S @0 P0h @0 `0} PS0@0pS0p @0S  @0h  P0} @ @0  `0}  PS0h @0 pS0p @0S @0 P0h @0 `0} P@0@0p@0p @0S @0 P0h @0 `0} P@0@0p@0p @?S  @0h  P0} @ @0 @ p0} @ @S0h P0 `S0 @0} S @0@  P0 @0 @ p0@@S0 P0`S0@ @0@0P0@0@p0@@@0P0`@0 @0 @0 . P0@ S @0h @} p0 @ @@0: \ P0  `@0 X @ @pS0@pPS0@@pS0@@pS0@pP@pS0@p @@pS0@pP@pS0@@pS0@@pS0@pP@pS0@p@?@0P0@0@p0@@S0P0`S0@0@0P0@0@p0@@S0P0`S0@0@0P0@0@p0@@@0P0`@0@0@0P0@0@p0@@@0P0`@0 L?0L00L 0S0L0S0L00L00L0pS0L 0pS0L$0p0L(0p0L,0p@0L00p@0L40p0L80p0L<0Pp@0PL@0Pp@0 @ @p@0@pP@0@@p@0@@p@0@pP@p@0@p: @@p0@pP@p0@@p0@@p0@p  P  P} PS 0@ P. P PP @?@}0P0@}0`0P0@0p0p @0@}0 P0 @}0`0 P0 @0 p0p @0@S0P0@S0`0P0@0p0p @0 @S0  P0 @S0  `0 P0@0 p0p @?@S0P0@S0`0P0@0p0p @0@S0 P0 @S0`0 P0 @0 p0p @0@.0P0@.0`0P0@0p0p @0 @.0  P0 @.0  `0 P0@0 p0p @? @.0  P0 . @.0@ S `0h } P0 @0 p0 p @0 } @.0S @ P0.  @.0  `0 P0 @0p0p @}0  @ 0@ S P0}  @ 0  `}0 : P0  @0p0p: @}0  @ 0  P0 : @ 0  `}0 : P0  @0 ( p0 p @ @p@0@pP@0@@p@0@@p@0@pP@p@0@p: @@p0@pP@p0@@p0@@p0@p  P  P} PS 0@ P. P+PP DAYIx2 ;"lEGC:.018D0SX5'&&)A3&'?>9 ) AU0I\^O' @$,&4.;V/' ="4"8'  3I7B? /&0(  )9(/3>@OfH  "L7< (<%- 1;XB&<(77F 3 O+%+:#$'9=JD(?M3 +(4BYU$.0 &2!P>834&8  03  '3 659' .D;32"Q;#I'" 4:& ')&% V{&& ')-/+, !/6 " -39H+ '!-6 #'&     *, ! ,$ " )=8'30#!!).:   6     ) "2("     !+*#)      *"9&.   #7'      7"  $   ) "   , "  !       )         #"  !        #       '' &'P&&N!OB' ਜ਼“g K@8! <;' 4  + ԏ/069(A+  &G9  ڏħƮ 7~'aN$  SD C$7@̯ʀ_@ GS`Nd@9B ˵/@.HOhG`O0C8/د@,' ?(<7@Ja )F(ș碿@c(C@ ')8DP*1@1)Ħܴ7C',,37@F)GX -( ǧȷ3 /  +3*37@/@O1 ˿ӓ()!L3L@1<@"  ϸà @+!  3@O,-6V8('Ƨ'  ,#';) &' 8@9.9C#&  31''@@9- ɜ&''58')+3#6* ة #/9"/)0,9' ܸ '(')@'0'.&-0 ھ2';,03#-3  ٽ! @+91/&1&+@"ָ ;)630(+&#@ 80'07@,,'A dz /@''8@,0'@ ໿  +D)#9D01.3 渾 G(!7G0+3 -@0"9G8@   ƽ̿  ;@7F8H̹ $  3L6C@ Fڶ"/M8@@ 6 "޼ 'G$;:@( ,' G478@'#Ŀ@@69@,')п 9@1@8&* , $/@@@3! 2'0 '&=A@.+38)%9F90 '$9%&7F80  #Ͼ'''-(#,,A@)'$#0 ,,AD', 8 0,@C&'13 ,1;8  0 ' +9/!#'$7Ͽ, <,* - & @0'' &''&'@"* !ϸ@&0#.#Ѿ  (61) &ü#, ##) 3'3)ξ  0 ,'301ij$ '/@8з# 0 '@2ѷ,+ 0'@8 м. 0$8$ , C ( '$ 33)0ǺA(0.& ,6,O6/1. #33̳C80#'&1( ,޿S@8@ !/4'+ ϳG@H@  !$)9OGPJ  , '9%̻9ALC (!( 3, @OYF'#3@̿˸8[YN ')@@kgX&#0+@9_]S##58 @hf`8&89$ʿ@``Z@ +;$,  ;`k`L, #@0%) ;[`SL'C+' G^i`` 'A,, ϿLSgXX+A&'̾XOp``&' C1'+XClOS F0' OFp``8$ @3'ӿIHeVS0&94&   OX^`W@+90,  G[MaH$0;,'8WTjQ(8!33-VLcN >&-2.[``P;0#88& G`OS 3@58&ؿ 3`SP .@18&ؼ[S8 +@!'8( X`+ ,3(;,G[ '%090/L#86, F3#.)''D  -3'0'' @#''   C', @,!/ 3@# ' #'+D  0 ' + &L ٺ(#0 '  & G ܰ'##0 侼 '0<$ ۵(0໰#%8/, ö01$ڼ%'<$ ',ø%76($#<0 #0 &6@*'Ƭ0!9@ & ܼ$8K0#ٸè30@'2(3G0#Ǭ/8<&  # 2 ,0O8)( ϴɦ1#6<0-ӿ7&7OG+,ĬǶ@)19@   (,8&3OP,,ೲǸ9'8@@  2'@3AV,+ 謯̴@(+99@  3G6GX@)&硯α/@@66" 3A)8CYG)#褧ϲI<900  <3/@TO, 𨟨O GB3@ ' 1@,6OS0궘A89C39# '@06LU0丢+A3@08& C@8IS0輰K6@16. .=I8GO0 üG@@96,& #3Q3GF8AI;;6+3 '''O@L89 á-X3@0'@.MHN,3(ǰ\0@3&A1CXL,3,ϼO8@4'A"8(<\@.1,GF73&@0@33\@00, ̿ð/X03 98 I@+XK30,ۿ̸\16&;@C@'CR0.'$ӾO@3'9@ ?B./X00''ďAH/%7@#7L0-S80)#ǘ/R')1@, 'G0OF0)ʧS*,3@!'I)!GP.'̰G4,7@ '@0(9S-,ظ;@'38 430/Q80ඤN#3,@36'N@0༭O'1#  @38)GA,ؾG,,'C690CH,ĸ33 & 97@1@M#Ⱥ@'&38@0COȿ@%, >@0APï$3#  9;1>Vƭ #8$ @@18'9:3%)*5A# 3@+@@8'),1A0 '9,@@6)(,/@9'@0<<3'*).@@ '80883)#'(,<@+60993$!%'+:@/3/993#!'+8; /4+<91!'''89&-8'<80"'''88(+@#;80#&3$'76,ҿ-@9;1'+@#'360Ӽ0@7@3&+H)06*Ի3@ 1@5''L)-8)ּ1@$-A8,3X'+7+Ӿ3@,'C8,;\(''3, 3A0&A@0O`4''1,6C0&@A1UX@'%.07@3';A3YTK',0 ð3@8)7B;OSN '+0ð3@@'6AGISL0)), ʾ/=@'6AGFSI9+'+ ̼+;@)7<]GOL@,%( λǿ'9@+88pGNL@),) Ϲ'3A,97qLIL@8++ Ϻĵ'1F,88gNGL@@'+˻Ǵ'0D.8@`SFL@F& 'Ǽɰ'.C.9OXXCL@E3#οɬ',C.;YYXCL@AA #нƨ&0A0;cYXFL@@K#һ%0@38lYSGK@@N0н#0<47pXOFL@Og~pSOTI2  #<[bP3  $̸Һ&'   /V`XC(  ྰ# ;YknphTC:;8*51 &7ISL@1#/(ά  !Ը'COOG6$#10(ø !&#/GYll`NB@30.,$,@@.̺ +;EE@0$ &' ȼ %$!$.3)̰,;A@8,# !)074)п '5@@FLQROH@;820.)+3COSI0 й   '6980 #$ и #+0003781 ư&1870(#'3;@@<4* ι3FTXVQNIA6)%'.136DOP^cecinxzw|{{xpjp_]hWVSJKLK<838/(!  ú   !% "%(#&*, !$*)%#$$""$#+(' '-(!)((&($)&"%%# #"     ""#%%##(''%&''&%)(&$#$$""               #%%"!%'))+**),+0//0.13532321245224311220.//,*+,)('&%$""           !  #####$##&&#"$#"%$#" ""                    !  !        !!!!"""########$#$$$#$$$$#####"""#"!!""!!"!!!!"!!!!!!!!!"!!"! !     C(؀?0?I`@7kO@+G8+؀耯)Я=F0؉?, ;(`A@O` Wtwz~b6[@O`M034 οɳ氧3@@6_p_qh`"GI@ #ث䌷*'(9a4o`q`wHCCR o`?`YX((谹Њȫ'=2EY\7lPOR[dxHKtV_` '00ƨݳ  .Y Ao /$0F) @ @0 0=? / /'0_(@6 ?&(H?? /@@/H@$?`??_ ?N8<70_ @?#@/3O9$ '$oO@POp/07 '"_ :P M/e?h P @'0@?P V?4=G / (??0O 0?@137'$4+7@/@o/|@@WW PD, 0(`?<&5 O +_@_X@73L/ ? P[D(? ?p@/'8 7(@Wd0@ 7@/(/, O?)?PD3<4(+S/`@ OX]2G??@L O7@PV4HP/4O@'G0o ? /`?/@0 % +* ( , 0 /0'@/  /3/6$(O?0 ( 7 .0/(:@0<+$ 0 (????%@ #8 /@D$/07/ E ,! 8?/ 4K ?0T0(  0?mX;%??07'$@@,,8H;X,/0(XnD7_+['P/P U>7()@0#/ / SPPh?D /o x27 _0%GO ?T $$O[+I HOP?+0 7@ o 3(?XH/( /8(P)_@J/@  O+''D (_, 0B; < /08- /0$'X?07(?'@ '  ` (8, @X_8 W^@  @T/p? -R tT! W (;(D ?N @8(H7_ /0(;$D@/ o 3@  7!/ 0P 00(7P'(0747)0@00/ 0$8@? M=  / / 8(: P0@'0Dg +-(?2?7 ?.50<#'   ==  2' 6'$ (<  ((*' 0@//0 7  4( ո G ?Lؿ? '( (7?80-/   0+'0 (($?0$//(/ /4/ P?  @ L (@?40((@ ?(/(&#(  0 00? (3*7@/0  H :/8& 7 ?& ? (F  (/4< 0 ?, $0< 0 - &(0/   $3 700(/ O@,  O"/( $*$(8  1?.70 0 5? 0 ? + - / $ ($ 0$ $  ($ /    $ && 5(- # '8  / " /H7/ 6  #  $/  /$ ($!% $ 0&  *,/ / ((  '$((##$     0"('  $ & / (/'(ğUGpX0Mg\ #Wl`8'_xdZ<=)(Ĕ®  ذYumcTB$3opJ$ .MgyxfJ@$Ȱ+9CIIE>2$Ȭ+120+IJ /?NZbeihc\TJ@2&/=NYeow|unf\TKA80%  ý %),.5;=?@BDCB?;642.,(%$!ƿ !$'*/6=CJQU]cinqsuwxxwxwusqolifefjje\RLID@:40*$  !###$ ""!  !%-486442,'&)-/.,/--.-/14367=BEFFEEE@>8655763/*('&)*--*'"!"$!   $'*'$"####%$$"  !!! !#"#"!!!  !"#"""#!    !          ! ""               tecnoballz-0.93.1/src/TecnoballZ/musics/over-theme.mod0000664000175000017500000015535612412501752021720 0ustar brunobrunoover-thememusic from reg@G  @@ g@@j@ Q@  @_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! *** M.K.X``  \`  \   0    \ 0`   0 а : а0   0 а : а0`P @P@SP @PSP @P@P0 X@  X@0P @P@SP @PSP @P@P0 X@  X@0`P P@P  PP P@P0X\  \0а@\@ \0: X\ а@\`0`P P@P  PP P@P0X\  \0а@\@ \0: X\ а@\`0`P} @P}@SP @P}SP }@P@P}0 X@ } X@}0P} @P}@SP @P}SP }@P@P}0 X@ } X@}0`P P@P  PP P@P0X\  \0а@\@ \0:@@ X\ а@\`@0`P P@P  PP P@P0X\  \0а@\@ \0:@@ X\ а@\`@0  2 87D5 ''$ . WP?hxOW W~Xo~B`W oH?w3ѼȵЮ'2<1CMS[\Fgzekxx{uh|js|`U_wpbg~p0'OQ0  Ьﰝ  7@/L@=;p4W~vdfdQHL6//-"',/K[Sgy|kpR]TSHHIB? +)ʰ#/1%3EFFRYZWYjuzrs{|tuuzlb_ec\ZSU[RONLG;DDOP^cecinxzw|{{xpjp_]hWVSJKLK<838/(!  ú   !% "%(#&*, !$*)%#$$""$#+(' '-(!)((&($)&"%%# #"     ""#%%##(''%&''&%)(&$#$$""               #%%"!%'))+**),+0//0.13532321245224311220.//,*+,)('&%$""           !  #####$##&&#"$#"%$#" ""                    !  !        !!!!"""########$#$$$#$$$$#####"""#"!!""!!"!!!!"!!!!!!!!!"!!"! !    _/ 7: $' >  /   4/@(V0@6?7G/ // '> #(@( P(< O7((P 0/4/ 0 +@/: @H 6 @W/P;@?@D*-(/(@_E P @H>P7('.(( /( (/' '  H. $ 444 /   &  ( $(( (  $? )('/*7+/ $7 /$@/;0  $     #                               !     "     # !!"$-$    *"          _       /Nx0@0:H_P/ @5O/;/4' 8 /@* 8/`4 T?@ 0@00 @ 4'   ?=// 84X<0/ 0 ?Dп 3(, P.0 0( $4?   0  @@?7@Зిd@0@̫- /0( (?з /@$( '0//ɷ? ȧ $H (0@  &/ +0< -п 0   7  ''<(,(п dЫ & ??@70 O(0O?&/?';L 7>o /$0F) @ @0 0=? / /'0_(@6 ?&(H?? /@@/H@$?`??_ ?N8<70_ @?#@/3O9$ '$oO@POp/07 '"_ :P M/e?h P @'0@?P V?4=G / (??0O 0?@137'$4+7@/@o/|@@WW PD, 0(`?<&5 O +_@_X@73L/ ? P[D(? ?p@/'8 7(@Wd0@ 7@/(/, O?)?PD3<4(+S/`@ OX]2G??@L O7@PV4HP/4O@'G0o ? /`?/@0 % +* ( , 0 /0'@/  /3/6$(O?0 ( 7 .0/(:@0<+$ 0 (????%@ #8 /@D$/07/ E ,! 8?/ 4K ?0T0(  0?mX;%??07'$@@,,8H;X,/0(XnD7_+['P/P U>7()@0#/ / SPPh?D /o x27 _0%GO ?T $$O[+I HOP?+0 7@ o 3(?XH/( /8(P)_@J/@  O+''D (_, 0B; < /08- /0$'X?07(?'@ '  ` (8, @X_8 W^@  @T/p? -R tT! W (;(D ?N @8(H7_ /0(;$D@/ o 3@  7!/ 0P 00(7P'(0747)0@00/ 0$8@? M=  / / 8(: P0@'0Dg +-(?2?7 ?.50<#'   ==  2' 6'$ (<  ((*' 0@//0 7  4( ո G ?Lؿ? '( (7?80-/   0+'0 (($?0$//(/ /4/ P?  @ L (@?40((@ ?(/(&#(  0 00? (3*7@/0  H :/8& 7 ?& ? (F  (/4< 0 ?, $0< 0 - &(0/   $3 700(/ O@,  O"/( $*$(8  1?.70 0 5? 0 ? + - / $ ($ 0$ $  ($ /    $ && 5(- # '8  / " /H7/ 6  #  $/  /$ ($!% $ 0&  *,/ / ((  '$((##$     0"('  $ & 2   @ʹ,/j@Аγ3P 'V\ZOQ.ԯȑ+ 蠷>PHPG//P8 OP/?PWؼ_SXP'-@+[kO@ +ĠW`H /T;?O1ДK]_?0̿బ/zԭ^7+/X0?P ,0ʿ;o@h;?6Zx`'H=9 (/wX /Oؿ8GH𱭿//78ȟ ? 4 <( ?X'J( G(Ы 7W`0 '( 욃2?p $+(ла?(7T /O&?@ J@85c@ S G/?@ .OPh+җ' oO? Ƞ+/?; ($$=8үTDڿ1 @;?K4$8/(H?@;@8@4ĭ $X %%e4Ԩ!8NP>$80 <% <+H @:%7 4($ /C+$+   /R4ȗ0'(+3 %O"  $;*5 0/4 $ #/0*$% 0'$ '$+#**37 $;/%( +4 60   30   02/  )#"   $/ 7    #  +(*      (            %         #           /  3 * "  #& /      !                                                             /       # +&) =*" 8/,+3KI,73^I+<(#bZ%)& mY$0ɫJyV=/ŬYm #1ŤԼ%U.)-٭AN ɞ)T#)" GR9G/'  ˰2`[)GYJ- ո=: F#Ѭ#.1;#( 6QX%/58SO8ж.H+S!')7" ڳ '/ 0+/'5 ݶ*,9!)6'#0պ#1(7/! ˥ª"12S7۴ 2>M& ʮЩ G7, 8 4ڹ٧9 &2 ;! ¸ ,8ı-**-/E -4 ժ'B. -2 ŷ9(C@ )8Q,0'K!) )=)-(ռ= **+2%,$/ҿ F&! 1.(>! +*' ;!&  92&E6# ;F"Ӡ0D үA% 尭 ,, ($ ޼  *.  37ʹ*?-˶)>4 Ͽ9>%/@+";.0+#'-!!  "          !%!%"- 1#& )2+ *);%0" &5 !+ %( $'+ # !"* #"+!$#!$!"$" &%#($ !  )  -  (                 "- +! !5# 6) % /'7#"'9+*&!G/'&$C.*!D-*)A*/ *G! - 8D% 0 4N0;B"/ 7C2 >?*9?%?4 !C9J< "A= @1 :: =5 ;< 47 36 )2 --%1(* %-#( &&") '(  '#  # #   ''%$'& ) %($ '## $                                                          ! ! # ## ! " " " !        #  !#"  '& $**!'/, *2- 17-4;+%:;( ,>;"3B89C6!?D/&BD+.DA% 0D?!3C;7B87@38>1!7=+"78*!56%"43" 11 /- ++ )''&$#" !                                                     " " "      !" #$ "%% #'%#'% "(& "'%  '&%% #$ ""  !                                                                             > &C(&4.-/-++*)(9iZFRNFFA<73.*& :A)37/.-)($!0U<2 #0-2C7+(/-**)(()NfHKQGDB=84/+($ D-)4.++(&$ IG47#  )74:984$(+%%%5dUDQKBB=952-)%!57!.0((($#3M49C/ !(3+-8<587% (&NdCIPDA>952.)%#<$$/)&$!  H<0?=D(  .* !)&9<2874*.dUANIB?973.*(# Ŀ +- (($$  5B-7=8DF  )+/(#&9<0575]n>FRCAA72/*($  νɷ H2#!$# C/+:75?R(!0( !$ &5=20DqfS_K5/+($   dz5A)37* 57%3725><42-%谤Ѻ3#-(%&#$!&7D<:Li_S[ZR( ڻ  D`FHRKF<870-)!  ⦤ΰ4+(*&!&>B8=>AaeRXPѦ8dPFQC=?942) 鰢ڲ7- (#!#3 *)/HC4)?SKGMKHHF4  ɮ!#$$&(% (F  γ(&&&)(!!!AH/7<22/-)&    Ļϼ2%  $K=I\PNUPNKڷ  $#())*(#  0Q73>733/+(# ڸŵ 5$)(#$!DRQVUUURP( %%%(*+*$!QF3?=553.($!$(м32*-((&!5e\N[ZUV< &-%-(+- HP5=B975.)(#+( ɽ&=#(2*)(# +liL]`WP  =!2**:Z<:F=85/-*0/%#!ĿC-(4/*)&$-bpR]dU#( ?#3(!.ZF9FB8743C4%+(ſB<(44+++9Sqd[a2- 07 !!!!! $SR9DC98BM8*2)ε :C+37.3GFgs[B -*  9) !&$$%%$$##! IZNU>23̼ 0K/09?LAX}P53   0*&*$)*))))((&%$#! :_BHNVp/+A-%% &2&.(+-+--+**)((%$#! &gnHVWA4 Ļ $NZBFNtzF&=3$$ 8*#$((&((&%%$#! )7NjPLP<8)ղ#5_F?ef_7)8(  !#!!##!#!!! /.#BkPDF872ĿЧ/XHDx`o_$*4  8U - 2(#(3`U9<=2-#ɷNP]kipiF-) QA48#&- #$ &SU/5=/+(ĿӸ ?askipnga2+  GF0BG=*$! CP-29-*(Ž   5sZopijfF$# &_-4LAAD(  (.H/+3-(%!Ŀؼ  :fVqneif\($IR$>K>BDA2   A7#--##  Izd]njefdaP IAA?>7   8<&* ɻ!D_j_didda_\7&+9>9?A???=<4   .7 (лٿ5/NuZ\id``\ZR BC2?A<>=<<7-)  4#Ʋ -IsWWe_\]ZWUA   CA2=?<<<:97/(+-/ λк*BjZR`\ZZWURN& 8A39>9::87532B<* )  ̵   0`\MZZVVURPPU  )C43=978744DH247-  ٭İ  !V_HSWRRRNS_W7*!D40<75749MG>922-(  창DZ   L_FNVPPQ[_UH    C90<978DRFA944/*(  η DeMNZUVfaR (!DF7?A?UUHB?=840-%  Žĸ    !>iVN\di_-( #CM$ /*$(**-NvWN]UNNHC?<( ǿ   # #()08&84&($8.+)..3HLbdSWWPMIC=( ݫκ   $###(*3 .G!!* 02+2+/2:I=DkdQXVMIFA#Ɯп    %#(*54&% =$4./32BH?]nUWZPLI7  آ˺# *)() 59)% >-33/2/0DM`jZZ\RN/  䰮ʻ  +#*-!F-$/% &=-7//200LvdVd\M(+ ƷǺ  2)- I-&2$  D($80.320Dlk[_F#32$$! ɺĿĿ  !8(#/3(5-# :734/335S_R_7/?2-.)%$! ڳƶʽ 249(05# F#)9235=_V(&LA287//-)($! μ˿  !( !< )(+ C2!8727KP +8+=F78942/-*(%#ļ 54()  .B 0<259023/./9.22-+)&$! ν IJ 8?+DC!+-!  ?!8RZI7*+!!# 47*--((%# $F22RF*74(%#  5-:_LGP**%)4(&*&##  :?<2lK$97#! &ټѣwxN# ܳmsN(ЕWt%pxX3`:̾񲀀ĸ œ8E˹4.;`mamq\K4!߻û)@Xabhqu{|m^PC8) -OspY:!Ȼ(3;@IRVY`cfhiihfa\UNF>3' Ļ!%-4656762.)% %.5>GOV]dhlortsqqqmifb[WRLD?8/(" ɽ %BFJMOPQRQQONJHD@;72-'" Ƚ "7IXfpvyzwpg[L<+˻ (2:BJQV[_abcca_[XSNIC>70*# ½ "'+059=@BDEFGGGDCA>;841,'" Ƽ 2AP[chlmje]SG8*(4>HPY`glquxzz{yxvrnjd^XRKC;4+" "(+.2579<>@@@@@@><:8520,'#  %1??<71*  ʼ&2>HQ[cjqw{~~zupic[SKB9/$Ż !$&(+,.//000000/.--,)('%#    ׿?J1-.5%% ǸF'98.D%!' ޿98%=9*'% 1 F.F5.!8  ۿ櫽Ė ^@i*\89.-ی€pKJxe8{^'xj^5Q5΀Āi*x~?c%1KxpqKK!Kqxqc.b8'ދ4 %^\tjtjcxq^i= Χ.xUiQWbZcKK9 ɠ*!i?eD^KF8Q58- ĝ?\FJJ=U.-D=K ! xD^K4.DJR=?'* ʣ‹5xq@q!WJ@b1J8'ʽ!q@xlRi8MU8^܋ J4jJxjeUFlU\^8⽱%^-lZj@UZblpU?Rο @w9WD^bbqZ@-ܱRJ^RKKZ8bq%9׶1 qUK'DKp^K-“Ā8eU=5!R^q%ΤKl^F-5'\cbR1ܲ-Qp%!=qt1p8ē׀\{DJq\{ĀJZ8=.qw^8ǤDtK@ '@?{cQ Жʀ!%RK5-qЇ^5%!Jwb8󻐀²K@?%eDt\检-4 94~R'j%!Q%j{bKUK-5^.epQi ʀ{ p=U*ʧ%!\{^tꙌ׀q**qq.i!‹w%e{4Q㋖Uw~41ɒ»! !qW*㱸ɀK 9{-F㐒--@D9 ʧꀯ!%lW%ΪיĀx^Ĥ㓠.b׸ɀ ~qנЌ.x8ק ʠ'5½㲱ʽǶ48etĸܻʽ*DFױ ׸ܱ!8Mʽ۝ @'c{Kɱ%xq8?!ۯ!'9q\@*Χ -Q1pqK9ܧ %@RF9*ī4Rw~J.-л 98WpiU .޽ǖ%%1c^%9Ķ€1-^ZW5%ם.* {i\^* QΒހʋ?R{lw%!94ʲɀ%-1w\iq%%KΤܓ.?5ll=.ɽ*'q~{* Чǽ'5 .jZ׶ѽ!!Jbi' ܤ'4K=Qp8  βRQl.5 ʝWR5j1K?ףۀJ%^WKb=@ׯ׀.%^Jwc1ɱ¸ 5M~jq@W8 ދ=8~qc{%jċ ךFp{ew@1.ʀį*K5%!4K58J@%e!K=eK8%'?׸Kpq@jʐ*@^\%DJ@=ՋK\!c-^-KǻĚ @@.p4tbKe΀% Q!!i4q=8ׄĀФD%19xc{tK± JK^ ^U=׀׀\%@~8\!KpqU“Г-K-  {p!׀ǀǀNjįW%@t^pi^\@%%\{ 8JqWq@^ ꖖ'9^Mibq^*K.R4J=5Kj RΪK~?W8pbjZ4ۿ-jxx9RRewj8Āɀǀe\wt.p@DqՠǀwRQDiZwDQ Ϊ׋Ǔ?qiKZ^jq98΀ʓpb~9xQc.Dѱ܀ۀKiJJZĒ拒ձĀJ^R=ectjq%8ĀʓW8~q=iKx*D۱ܚ׀@9tK@^\ Dɸ㧚įɀ9Jq=Q^jlq @ 흠ۙ49cq9iU^85%ǚ܄ՀM9{U@wRx^ KJ{K\qcw4U ⠖ǐн15eqFi^jUJ.Ēז׀54eZ9jMt=c⸐ΠЀ9=iMDiJj9^׸㝖£޽=Mw@Zc\bqJKΌЌՋ18Ze8bMtb@\ѻǠ܀89cW5j?q9Qۿױ£Ė.MeK?RR^iK.ΠЯ긻5MZ4DK\MKK%יѲ!9KU'W8e^e=M ʠɠ'=MK-M5tQq=9⶧DZʻ5@\8=M@JKF* ⤿ۯܧ %?K'M4b^W9KׯNjЪп?4.?9lUwcF=«и '94FDUjb{ZF.㿿Ŀ.D@ZKijtwK8θ˽D=Q^R{qb8.л² Q8pQp{w{@*ײвգĠ59JqRqc**ЪʻDZ11RleqxK%۪DZɣ85q{xi%ܸׯɯΓɤ'=Jcwį޽ѽױēս4@elUձ޻»ױ9D~cqʫײĪɱ8MbKɽʽǸ'4^\Rʲ.8pM8ɸɽײʶб=F8@軽λ ĪУи.9\^9.ո۱ױ5Fj@@۸ק¯9Mq91 ı*D^U@ Ľ5Dqqc@1 ǻʻ DMtjU9.Ǹ=?ewj\D9%潿±и*@Uiq\J8. ĸǶ1Q\ii@?%ײѽ۲J^WiK8% 㿿ܽ1ZbWU8%ۻ%=jZR@'ζ-UjRF* ǿʽ8^bK8   DbU8%  -Mc@.  5WZ1'нD\W.*   ʶѻF^@1%ǸβJU.8 %׽-UD5% %*иۻ@UD8 !MUD9%νʿ 9WZD8 ʸʲDZQF-  ǽĻ'JWFD% 1RQD4%   ?UJ@-% ǿ*JUF9% -KF9. ׿ο.K=9* 4@48Ͽ,1';xeFNQI@;4,$ &GK4/;`kWKIC81' Tzbhuth[OD:1$°ı TfWWXRI>71)! 4:-! $8NOA:K`cRC:5/& Gwu^OR^loie}obWLC:1& ض )WlcL=554-&  $  -877>FF=1$ 5]h[I>@KUZhrf^ZRI@5*# ж5Q[R@1$!    '4=@>7,! *KXWI=57@Rlq^RID@:2)  Ҽ5GNI:*   ,8=;2'  :KOI@518I`wzhUD:2-*&! Ķ  ,:@=5)   #-551& ,=FF@87:FUcnoi]O@2)! ʿ &,1/*#  &*,)$ #/:====@FNUZ[WOD8-$ ȿ!$&&#    #$# &/58;=AFILNLIA:1' ¾  !#$$!      '-27;>ACDDC>82*#   !!!     #)-158:===;72,&       $),/2455541-'#      #&),-///-*'$       !$&')))'&$       !#$$$#!                       / (/'(ğUGpX0Mg\ #Wl`8'_xdZ<=)(Ĕ®  ذYumcTB$3opJ$ .MgyxfJ@$Ȱ+9CIIE>2$Ȭ+120+IJ /?NZbeihc\TJ@2&/=NYeow|unf\TKA80%  ý %),.5;=?@BDCB?;642.,(%$!ƿ !$'*/6=CJQU]cinqsuwxxwxwusqolifefjje\RLID@:40*$  !###$ ""!  !%-486442,'&)-/.,/--.-/14367=BEFFEEE@>8655763/*('&)*--*'"!"$!   $'*'$"####%$$"  !!! !#"#"!!!  !"#"""#!    !          ! ""               桓[eXD0T|AD̀¹إE 0Rg|zQ&7aessT=ӻB|vF俥#9FU]fhibWI8!̾ *5570& Ī"3DSbkqtqng^TG;+δJpoP'׵!1?KSYZUMB3# ´*6AINQRPLE=4)̵Catys`Bѯ%7GT^bcaYPE:-Źƿ %.7?CEGEA<5.$ʵ!׵%;M^ksz{ytkaTF6%˻!*06;@@@>;71)  ͼ-BNSQE4-CWhu~wmbSD2! ѿ #'+.1221/+("Ǹ .:?=4$ ":N`nz{rdVE3 ȵ &*./000/-*'$    ſtecnoballz-0.93.1/src/TecnoballZ/musics/termigator_reg-zbb.mod0000664000175000017500000013205012412501752023414 0ustar brunobrunotermigatorMUSIC BY REG & ZBB 01 @VMUSIC BY REG & ZBB 02 d@MUSIC BY REG & ZBB 03  @ MUSIC BY REG & ZBB 04 @MUSIC BY REG & ZBB 05 g@MUSIC BY REG & ZBB 06 @MUSIC BY REG & ZBB 07 MUSIC BY REG & ZBB 08 MUSIC BY REG & ZBB 09 MUSIC BY REG & ZBB 10 MUSIC BY REG & ZBB 11 MUSIC BY REG & ZBB 12 MUSIC BY REG & ZBB 13 MUSIC BY REG & ZBB 14 MUSIC BY REG & ZBB 15 MUSIC BY REG & ZBB 16 MUSIC BY REG & ZBB 17 MUSIC BY REG & ZBB 18 MUSIC BY REG & ZBB 19 MUSIC BY REG & ZBB 20 MUSIC BY REG & ZBB 21 MUSIC BY REG & ZBB 22 MUSIC BY REG & ZBB 23 MUSIC BY REG & ZBB 24 MUSIC BY REG & ZBB 25 MUSIC BY REG & ZBB 26 MUSIC BY REG & ZBB 27 MUSIC BY REG & ZBB 28 MUSIC BY REG & ZBB 29 MUSIC BY REG & ZBB 30 MUSIC BY REG & ZBB 31   M.K.@<       .        @    @S< @  @   L  L L  L @  @ @ @  L. L  L    L    @    @< @  @   L  L L  L @   </      .                         <       .            <                   @ @ @  L. L L  L    @    @< @  @   L  L L  L    @    @< @  @   L . L L  L   @    @< @  @   L  L L  L    @    @< @  @   L . L L  L   P  P P P  \  \ \  \ `  ` ` `  l. l l  l ````<S<                     <}<:<:                     <<< 0000                     S<<<                   @@  L L  \ \  ll  ``  PP  L L  PP  \ \ L L l0l0l l L@L@L L }3 \@\@l l 3@@L L \ \ ll``PPL L PP3\ \ L L l0l0l l 3L@L@L L \@\@l l 3@@L L \ \ ll``PPL L PP\ \  L  L  l0 l0 l  l  L@ L@ L  L 3 \@ \@ l  l h30@@L L \ \ ll``PPL L PP.3 \ \  L  L  l0 l0 l  l S3 L@ L@ L  L  \@ \@ l  l :3P:@::@:L :L :\ :\ :l:l:`:`:P:P:L :L :P:P:\ :\ L L l0l0l l L@L@L L \@\@l l :@:@:L :L :\ :\ :l:l:`:`:P:P:L :L :P:P:\ :\ L L l0l0l l L@L@L L \@\@l l O@L L \ \ ll``PPL L PP\ \ L L l0l0l l L@L@L L \@\@l l @@L L \ \ ll``PPL L PP<\ \  L L  l0l0  l l  L@L@  L L  \@\@  l l Ǻ*3.#&3>GKGFC?978>CIFB97.%!&09CMUanyyuoj`XVVXUQMIFB?<9<943.)%%)))-7BIIB3#¹ !*4?8)  Ǿ !)--%&38?CCB?<994*##)3770**079?CFMXkzzodXNKGGC?970*##09>70.3443.)%ǽ##!!#&078744-!!%#   ɾ&...*&#!!!#%%%!  .7<<<>?CGB4!%--&##&4CQVVV\fov}~~}yyqg[M>.)#0FMG<*!%*-#ĵ .?KKF>8777997%  о·¾ĵ &3>FB90)%%-8>7* !%&))-& 4N_gjjkoooou}zjU>* &4<<4)̾#.9FQUVRQNIIIC3  ȷĵǷ!)*-0347>CFCBBB?9.!!#!-7?FFC3&Faz~zy~ydN9&%343% Ǿ !&-38>FNX`aa_VK?3! ӽ įɾ #*049BIIIIKMQX[QF93.-*)&# %--.00# &9NdzsfR?-  #&%Ǻ -8CKXdgaXRRV_XK0ɹ  ͳǵɽ&4>CMUQKGGQ\gkgVI??>>>4% 0CU\dqoV>*!¹ &4BQ[``_XRU\faUC*  ľ!!ȹ 0CRVVVURR[dnnkg`[RK<&&>8. µ )*̾ .BQUVVNMQ[ad`[RG??CFF<3&%&.BNX\\XI8#Į )04740&!*4>CGIIKVdq}~vkXF3)%Ƚ %**%ɹ  #*37899?IUdujRKFB<.0CUagf[MB?CKU[\[QG>70**.7BKRRQGC>7)ĺ !.4-&!!!!!!!%-39?FNV_dgknqu~fB!Ǻ Į)4?GNU[[[[_djnoq~gK0ɺ)BR_fa\VI???CGNV[XRM?0!-C[gn[C)ľ !0.&&-..07BM\kv~~~}}}z~f? ȫ)08FRaqzusvoN0 .BU_`RG>>>BIQ[a`XQGBB??FNVXUK8)  -47779CVnvdK.Ľ Ƚľ&3>IQ[g}}sj\N?-%.44039CGIFBCK[gnaVGBBFNV\[UM9# µɾ #-03479BGN\uuaM7&µ ºǹ-9FQ[`gnzygU?*).*&!)7?FKVaknjaRICBKV`a_XK9 !-79GR[[_anzkU?- ĵ#·0CR`jkszgM4#   %*0FC4 !)07CRfqyvn`RFCN[aaUB&)3>K[ad\VXdq}~~}}y_C% ȷн)3<>9- ȯ.?N[dgko}}dI*!7GKMMB0.BINRVX[_ad_VNNUXRB-̺ľ%9N`jqssssqnkkoooooj\NC8*ȹǺ&*033.**% ־*BR_afknouy}s_G4! 0IUUM8# &.ͽǾĺ#8Vo~vogffd\QB0 ־#8IMG8& ͷ-BVfqqqnoqquvy}~q`K3 #*)-8BC9*&-37>IU`\UMGCBBB><7*!Ľ-G_s~vng`[K9! ̺#7IMI?3# Ⱦ¾ǽ!B[nz~~vsokjjqsuqoon`N9&!#!#4BB9#  &7?INRRQMGCBCCC?<0# Ǿ7M`o}uj_RF7! ־)499840-)# ½%C\q~skddfkkjf`XM9%&079>?<) &39?GKKGB<89BFF>7* ½7FVfouyyyuvz}~zqaQ<)ɽ#-0--*-0.&Һ*B[o}zssqoonj\M<.! ##!0?KQM>)  %.79<>>>><<<<<<984) ĺ.?MXdnsuvsonnoqsodG)ȹ #)..*%ко-BQ\juy}}zukjgjjdV>!!*-*% ).8?F>.  )4>FC>74489984-!  ² #8GR[_dgksy}vqg`[[RC- Ĩ ɾ#)**̾̽*9CKQQQU_foyvqf`_\RC*.8<<94-##.477.%  %0R`fgdadnoonf[NF<-̯ º*.-##%&% Ⱦ·%>MX\[VRRV`dgjjfaXNC4!*78888994*##%)-04-  &7?GNNKC><<4-#  Ĺ%9KV[`fkquuqnf[M9&Dz ĺ)3740*&# Ĺ9KV_\[[`ffdaafgaUF8)%38877>FIC93.-00* %8GR[[VRG9-))-473)#)%0BMUV[anuuog`XQG4־ ǹ#3?CC<)7I\djnnkga\XX[\VK<#!)007?KMMF?93.**%-?GMRV\\UG9.**.4773)!&%0BUakqsod[RKC<3! ҹ  ¾о %-494* ӽ־ )>Rfu~}vg[RVVRNC4&-.*#)9INNGB><7.%Ӿ!3>?BFIMNMKGC>93.-)#   %7Nfuuo_RG?8-¾ ķ !!!%&# #0G[jsoaVNMMI?0!  )4774..39?FFCC?>><. !%*0778?KU_\RC90&   #3>K[\[RK?3 ľ Ҿ-9CGIGFGKIC7) ).0-)-7998304>FIIKKF?83*͵ %-49?IU\[UI>0  #).4888<><- ķ ¹ #%&&%##)043-*! 0>BBB?BBB>9789BCFIMNMIFB>BINU[goqX8 )8BFIMKF<0   &38<9-   #*77-ķ ĺ  &..& #&7?CCGKRUVXVRRVXX\_d_RG3 !7?CCCFG>.    #0770)! #&)%# ֽɾ  #%%#&09BCCFGIMV`jqz}yogXC4*&&%ҵ *78*   ӽ !*7BKMKGB0ȽǾĽ %# º *39?FGGGFCB>94* 03! #3BQX_`VC%ɽ ĺȽ 3G\kv}~sfafks}~zq\?!µ*79>BGKKGCBCFG>3) *>BC?4)   #7K[a`[Q9ɾ  3CR_fo}}}zvsoy~fC#Ǿ#.38- *BUaaa``adaVC.#  %&)))&!ǵ-9FKR[_VM>*ͽľ· #*)#½&7MauuaK8%Ⱦ -FayoR>.).484* *8CFFF7³4*!  *9CF>) н%BaqXK?4-!  Ƿ%0>IUas}gQ7! )44880ɾ*?Vk}~n_M9#  ¨)BUdossqnf[QIB7*! &>N\d_Q8%ں)G[syn`RF4ȵǯ %3>B<0& %8Ng~vfR?) %%#̳)9IR[__fjja[QI?7-&&#!! )494-*&!d@p;]OLHGo0,*,H  @ࠑ/T8 W@8`POৠ ϻɓo ^}?5JL8$?^/2@P0(X ? $?~3/P߀ `"[ ($_8|@H04`?  0߰;J $ M0  /T06(?; xOB60h + 3(P+@8/X/_/O $('/ (/[P@G# Dغ (;  @?(/E - &   D" '  2<  '    !                                        ׶  Һ "ǻ#!!  ""  ! % ") *)̽ #)   *&ɾ ((!  7& %)#Ž  %;!ɽ))%¾  *3Ĺ0-%Ͼ 00 "(*&Ľ 4.%--ϻ  (0( #05ɽ (1( *40· %(1& &3#˻%")5& (.Ƿ(#)7! .0Խ *& 1C! ,&ɳ,% 5I  #. ,, %B %!ϯ-15C8 %Ĥ1,>F1 # 庣"#0)%BE#Բ#&1-0@F Ǩ(*43";EE ⺥#,*35(9C<ײ(0-881;I3 ˬ-73;<7GE(*˵?QGMECME#!.ڻCQKNJIR@#*4 үKQJNMNQ>&07!ģ%NUKRQTM>)37"ݳ(RTQXXXGB.;9Ϩ*VQRUY[B?,>35\UQ[c\@B0@" Ų 8YUR`dX@E44Ϲ?\VUjgREB)(徰̾C[U\omPKB!̻߯F[YfnoRM1 Ԩ˺%IU\oqqRC!ǽ -FPauvsU1Ⱦ7CTd|znB 浨Ⱦ8?Vmn4  ڵͷ#8F`u], ׷ǯ,9Km~M% ׶1>Tu~B#" Գ0@Qxc3" ׹ɾ-7Q}J)"۽¹*.Rs7# ߾ǾǷ&-`f.!Ź-j}Y(%!;xuP& Ͻ%GvxkE! Ĺ%0QqxmBֻ"3[mnj7Զ%EN]k?˳*EBK\j9;??Ia[,׹(@8BNaN#"̵5@1R[1;!Ǩ0;.4?TN#%9⾨5;*4?QB 4;߶"84*3GJ7! ;;ڶ &8),3CE,"?8֯*7),;BC.# )C9 ҫ00&.;C?-4F4 ɠ3-%09B4)8E08,&1>B.&@G)߹ "3%#5?>,&"%FE(ޮ  %0#5%?\BIJ,CF9 "@]?Ų !0KK4"K`7 Ų5QQ- )T`,˯CYP!.[X&˨(K[J8]M̨.Y]<@VEͫ7]]-@M< ͮ  %?[Y& "@F1˰*FYP*9;)ɺ0GYK",30ϻ)(3CYB .,*#ӻ*3-1GT4 #9(ϻ1@4,IN- *%;I0ɪ"JM<4@<*CF)(IMI4B<9K?"ڹ-GNN3@4!>M7Գ.CTR8@)(JM0˰1ERP4?(;MB(Ծ 3MYU;7*EN?& ȷ5QXR8*0IG8%; >UXR9&8FB8#Ƕ ?VVV7#@?B7!žF_VU4#B᳓ @z~!&3<;>8ݤTj ")185E4ϙ0_R&0513I1ⶖ @kC)47,4F)ԨKmq1.90)8@&#Tm|g! 4<%(<5!𰝒 *RhuY99*91!ߤ.QgsE &;3(11ɝ 0Gmn3 ->)&*- ,Frc#5@&%*)񷜏 %UvX%<9&,浙 *\sB**;7&! ߲ 8aj4#,"087)ֲ @jY"*,!0@8! ͮ %EcR-(!4G8Ĭ -K]G-(!?J.5Q[8",#(IG!淨-8QV-%(!0P<߮ 4@QI&&##7Q.׮&1ER>##*9Gϳ.3GJ4%(057 ˽ɠ15J@,)01-ǜ08G<38& ع34?8#>4Գ%.0;,*F-˰%-&-3#5K Ĺ.1%0%!5G ɺ530%#58 ֶ 53 "0"&7, ޯ.0%-*1#ݮ*,)(&,!ԣ "%&") Ϙ !!, ȏ!0% Ď # )- * 辒&0&#,ổ# 5"#, ờ" 3#-#߻% !,(4"#ݾ) ")%7)&ݾ ) &*?5) Ի# 5I8(ɻ!(! @P9&)% FR9̻#& -(GR8德)(5) (FR7Էɷ-,9(-FN0³ɹ3.&5# 3BK&˶˹5530#0@C"˹˾>75)")1B4蹫˾"G80(&-8<(Ԩ*R7&*%&*853V."*#"%0<, ⫝̸>X--%#(59#ĜFU,.! &"85ᣜIN&-%(7.-FJ!*!.,0!Ꝏ &5GE !)B"-(φ%8ẀIYJG&Q\9ҪQ[JC T[1 3RREB 8YU(Ϯ"@KEI@!! CVF3C?@YC#((! "JQ9س8B,K]B,1.3ME,̨34.VaF750 9F7*)7amM@3. ;@,ж"(@hkUF3&&87!ɯ.Urn_B0!)1-IJ;_qv_3!%0()ĨIgo}P0*)#(ɚ%Rmuv?& ,"%-č3[nyc8%)!%.޾ ;_qrR4 ))%*0ۯ@hn]E1)&&1-أ)Em]I?& (,-05#̚0NdP9<,**3;޾ 1KXG99#-&.89Ϲ3BJ8;1"*-5<3ŷž &5>5C,%&49B,ij -0;E(-??C"ԹȨ "#FI(#5BE7  #MP,"%@FC.¬ *VX& *5FC8̳ 0`T5@E9&Ǩ @]M@I3,%!CTB*KE!0,ݯϯ9E@,8R.(?"Ԯ ꪙ0@F>F>4I ϵҎ"@RRG)?9& ɒ;".1KF1*&3QrX99. )ے5ayJ<91%ɋ 9rnC@<-% EXE@>!)#󪏃Q}NF>;#(%%ߨ\qFF?;&%0.ɨ*axdBG?9&"9, 󹨑 5]r[>GB4,%C&⳪̾>UfP?IC.).F֪ȷ*>Q]G?EB1#!3Cɨ)3BMR?@FB3,87ǰ37C@?9BFE-3<&⺪ɯ5;E7.8FIE%"5<ڻҫ9, Թҫ>;;,#3KU.).9ֹ̰<;3(!3VT,.5)׻Ű%;4-)0\M,41µ%0-*&3YP4;!Ͼ%)"05VT;)ȷ"%%5!3`]? ɷ*&#14aa,Ž1&#0;o[ ǰ*5(%,#@vB ĝ.;)&(&Qk(Գ 39)&"&!%[Pǡ49.."("5T8ϳ 0940%%!(;F) ˻!.;>3,%)97 ۯ)#-EE40"31 ())1II<0(.ڣ-008JKG4.ɇ#*98;KNM7 (. ɰ )*F@>KYN, 5-Ǿ*1NF\[GJ[fE5>į KaXJTT`-4<*Pf\QTQ]#8-߫8UacXKPT" 9Ԡ@UhkXJNU,Ę(JUqnXCJM& #󾍠 *IdvhRBQI, Ⱂ5NsrmPKQMݨ5axoaKN`BŲ@qohUY[_, İ\qx\afgP& ɶ5hmk\dy`> ĻKgg]gv|U; IJ Ng]mknT, ǥQ\]o}aN4 ȾGPk}hcR4 Ϯ9_x|d[_, Š 5fh]r[)߹FvyfaT& ڨ Inax~N!Ϡ"VygkyG&ɝ(gjgnB1-rzamc<) ڻ!>ohauR@,ԺKf`g|FE, ׾ V]_dnQT.ԟ#M[RGYNCNQ& ɕ#UPC?QKMIC#  “*RC>>FJQ@8% 躕-I8<;@<,07ǣ*05B9;.335ص,(8B7.(554Ĭ-#9B3"71) ˯(";B(45 跣*(>?! 07ڮȻ 0,883-Ūɽ )0)511( ڹȾ#73&0,(ϰ &1;>@@><83.)&%%&)*,*%º,103;@FMMKRUI* ˲&18>B<813583%ȵ),.7GPK813F[]N@ҹɾ   .3*%!# #&*)*0@U]]N5##.58;5* ȹ!!,@8[Y& ˮ Ш *@CGKKC<3775) ɽ%,3><@KYYK;7>N[TC*°&# )71* )015578@P_`]M8.,1;<<80# &,.)#).))7MM1%jzY.ϰİ !#%;GKIKF@3011)Ĺ&05>CBFPYR@55>KMB3˹ #&#,1)# !.577783mzk[5󹠝۽#&##0@GKIF@80,,*!.58@CFKTUK<57@FB7#³#&##%#.*#&05888;@KY`cUC8338883*#187558517<@CKF*Bkm_U3󮙖ҽ&*%%,;FIIGB;1,*&!¹ )15<@BFNTPC837@@7*˽%&#&#),%  *1588;BGPPI>77><7.! ĺ )05537;87>FGB@B8%ITG)󺙎 %%&.;FIIGC<1.*)! ¾#,18<>BINMC;8;@>7* !%#%#!#*.&#).038CR[`_RG@>@B@;5*).113578111Բ !%,38;8750*&&#  !#&).0,&%#%&#            "*1455789;<<;4,! Ļ "(*0))3>CE<30-*)( %-% .?K]dgjngRIMVYB0094) ij%?KTVJ,  ׶®ɮ¹ 5axu[;;IYkonh\I4) (YoyxzxgKCB<73)()!!%%5EMQ9&%5IV\YN718@KT_hcXX`R<58GE1&%!  3BB?C8# ˶зԾ ȹ 0Vq}ydUV]aovucM,!ž5Vx~vrqaPG>.((( "%*KTdU>(5Iaca_\GEFNU]dhXCCK?)"(55,%  7;1),& ɹ Ǿ %Jjv|yqkgfcjus[8 ˾5Vz~mc`YRI8%#)&&;UfkX>1@Ujja`_YRQV\dhaJ701,%()& "  33#ɶ  *\x}|xz}vkdfokR, ǹ*Nu}fUPQRI4!.,.F[roXBB&) \]Ԭ*V!߲;JQRPK,%1CanM?7 !;19`~MIIJ@QdM!ɟɕ!8.꥚Ԙ峀dz& %*ĨŮ0>BB ɮ.V]14UN7[GǯԾߺ* 4ߪͳ5C ɘԙ*"  ׶ۨɧ"QyqyG 07"ġ.!myCT8 " *45TXG!3K}~c98on,KX, *P!5!JnT@XG\yG,5JG IB#ǹľ#ǾݪϾ䶕 )& 𝀀ɨǨ*( (5! Ө徵jXVuI ;9Ϩ.3 -gn,#GvB -#%VsX)4VvN,4dzcB-B>*T(۵.(KTI,*CT_rvhJ7.;,*F,ɾŷɥ"& ̹ŤŻ Ϲߝ̾Ľ*4010ڮǫǪ*m~hGFhxM @1⮕>1%>gY"-?fhJ" -&8&.4_f9;a|h<*8Ta`XG5! %G&"4;B99B75]d]PTPC1&<,ҾԳ᫬#Զ賬"Ϲ̘(4)1ԘϳԹ5gaK0,,.@K7(!)()3NVQGFF?4-,*3@UT4    -3()1(.70&(04-         "*.,&).)                    tecnoballz-0.93.1/src/TecnoballZ/musics/area3-game.mod0000664000175000017500000013054212412501752021535 0ustar brunobrunoarea3-gamemusic from reg@ @@@@_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! ***$ M.K.0 JJJJPJ JJ00 J0JPJJJ} J0S JJJJ@ PJJJ} 00S J0J\@\ \ \0@ }JJJJP}JS JJ} 00 }J0J\@}\0@ \ \0 @JJJJP @J JJ00 @J0JP@JJJ@ J0S JJJJPJ} JJS P0@ J0JPS JJJJ0 hJJJJPhJJJ 00 hJ0J PhJJJ J0@ }JJJJP }J JJ 0 0 } J  0  J  P } JJJ@ J0S JJJJ PJJJP0J0J  P  P  P P  P 0 @} XPS X0@ 0S X@} S XP@X0 X@} PS X0@ X0S @} XS PX@0@ @@ P @0 @0 @ @ P@@0@ @@ @P 0 @0 @@  P@@@0,@@,0P, ,P0,@,P,@0 @P00@PP0@P00@P@0:@:P00:@:P@0S @P0} 0@P@ @0S @P0 0@P} @0S @P0} 0@P@ @0S @P0} 0@P @0 @P0 0@P} @0 @P0 0@P} @0S @P0} 0@P@ @0S @P0 0@P} @0 @P0 0@P} @0 @P0 0@P} @0S @P0} 0@P@ @0S @P0} 0@P @0,@@,0P, 0,0,@,P,@ 0@P00\@\0\ \@\\0JJJJPJJJ00:J0J\@:\ \\0J@J@J@J@PJ@JJ@P@0:J0JP:JJJJ ? @@0P0@0@PPP@P0@@0P0@0@PPP@P0@@0P0@0@PPP@P0@@0P0@0@PPP@P0@@S0SPS0@S0@PSSPPS@PS0@@S0SPS0@S0@PSSPPS@PS0:@@0P:0@0:@PPP:@P0:@@0P:0@0:@PPP:@P0@@0P0@0@PPP@P0@@0P0@0@PPP@P0@@0P0@0@PPP@P0:@@0P:0@0:@PPPP:PPPPP:0 @@, S0SP S0, @S0 @, SSP S@ S0, @@ S0SP, S0 @S0 @,0SSP, S@,S0 @@, S0SP S0, @S0 @, SSP S@ S0, @@ S0SP, S0 @S0 @,0SSP, S@,S0 @@, }0}P,}0 @}0,0@, }}P,}@,}0 @@, }0}P }0 @}0, @@ }}PS }@@ }0@@}0 }P }0@ }0 @S }}P} }@S }0@@}0}P}0@}0S @@ }}PS P}P P}0} @@S }@P@ }@ }P P0 }@P@ }0}00} @@S }@P@ }@ }P P0 }@P }@ }@0@@@P@PP0@P 0 00@@@P@P P 0 @ P  @ @ }@ @@@:@@@@X@0P}@@ @@@:@@@@X@0 P@ }@S @@@:@@@@X@ 0 P  }@ @@ @:@ @@ @X@0\@S\0\ \0} @@S }@P@ }@ }P P0 }@P@ }0}00} @@S }@P@ }@ }P P0 }@P }@ }@0@@@P@PP0@P 0 00@@@P@R R  @\ S0   X\     :}@ @@@:@@@@X@0P}@@ @@@:@@@@X@0 P@ }@S @@@:@@@@X@ 0 P  }@ @@ @:@ @@ @X@0PP@PP:}@ @@@:@@@@X@0P}@@ @@@:@@@@X@0 P@ }@S @@@:@@@@X@ 0 P  }@ @@ @:@ @@ @X@0PPPPPPP ,0} 0}@, @}} @,P@,0@ 0@, 0}@,@}@ 0,0P@, } 0@,0S 0S@, @SS @,P@,0 0@, 0S@,@S 0,0P@, S 0@,0@ 0@@, @@@ @,P@,0 0@, 0@@,@@ 0,0P@, @ 0@,0 0 @ $@ $@ $P @ 0 @ \0 \@ \ @ \00P\@PP\0@\ 0P\@ :, }0@/@,0@@, :@,@@,@,}0 ,0}P, ,@,:,@ ,0}0, ,0 ,8@,0,(@, ,:0,,P,,@,,@,,:@@ S 0@ @,8@@,0@,(@@, @,0@,@,P@,@,@ ,0@, @ 0@,0@, 0S S,8@S,0S,(@S, S,:0S,S,PS,S,@S,@:@}/0:J J J: J J: JJ } 0:J :J :J J J JJ } 0:J J J: J :J 0J} 0:J  :J:0 P\0J\ 0\J \h 0J hJ J J J J Jhh 0J J J J J J Jh 0J hJ hJ J J 0Jhh 0J  J0 P<J< 00<0 J 0@/0J J J J J JJ @ 0J J J J J JJ @ 0J J J J J 0J@ 0J J0 P\0J\ 0\J \. 0\J .J J\ J J\ J .J. 0\J \J J J J J J. 0\J .J J\ J J\ 0.J. 0\J \J0 PPJP P0PJ @/0J J J J J JJ @ 0J J J J J JJ @ 0J J J J J 0J@ 0J J0 P\0J\ 0\J \. 0\J .J J\ J J\ J .J. 0\J \J J J J J J. 0\J .J J\ J J\ 0.J. 0\J \J0 PPJP P0PJ :Â$3ALUZZXVVUSQPGDBA=<8530.+)($3e` GI 3K7  ʧ̝(3?FKKIFBA=<87D`Z.(&#!77)0.  Źª(2:?B?=<87520..FD-#! !( ! &(Ƚ #+27::87520.-+)(37-!! ! ¹#)-2555320.+))(&$(.+ Žþ(..220..-+)((&$###((! #+00..-+))((&$##!!##½&+.-)(((&$$#!!! ¾ #&()($$##!!!!  !#$$$#!!!  !####!!!  !##!!!!   !!!!! !!                                          &2553-'"!%%#"4<<=:8522350ɻ+BKIIGMG>8@@/־7OV^`YWXRUNK@)Ե6Vikg^_moo\WD߸.Zuysvz{{imfGC ޱ(Iaqtml\XI!ʡBUelpphZ8ўB{xxph_P<5/͎ U}xpqqiXMZcDKlmmpx}xmehhX*Ԩ 8Tcitxihlm_8幭 9Qixxtpptp\=ѹ$Icq{xtwxxq_D$ͭ4Tht{}xiXI5¤=Ui}tc\QD/չ*G_{qha_U=!α/MmtiihZG/ž$B_wtqpcM9% α8Qam{xiXD4!¨$BT\ixq_QD-Լ-=P\pqaQ<*@ 0/0 0@@DCs0K@ϰ8 1$@+@; 0#*& ? 0PG, $ 60 8; _p%;`? @/; @߰ ;07(+/ $/$/ 3(- #@8   ##''(??63G,/< '9+6?l#  ̾#-#@?`P19')$,,Ե۽ 'O'(,C4'V70K=(3 ̻ 39@D7 O)4+5H  0(4)89+?, &$$ 0HP41/@0'(##пϰпֿ '8;5@1c3@8A8//  7 3# '#!  '''%    0 "(( ,3 #',               #                                                                                                   tecnoballz-0.93.1/src/TecnoballZ/musics/mon-lapin_reg-zbb.mod0000664000175000017500000051251412412501752023140 0ustar brunobrunomon lapinMUSIC BY REG & ZBB 01 E@MUSIC BY REG & ZBB 02 )q0f# MUSIC BY REG & ZBB 03 (MUSIC BY REG & ZBB 04 0MUSIC BY REG & ZBB 05 /@xMUSIC BY REG & ZBB 06 @ fMUSIC BY REG & ZBB 07 @2MUSIC BY REG & ZBB 08 @MUSIC BY REG & ZBB 09 9@MUSIC BY REG & ZBB 10 @MUSIC BY REG & ZBB 11 p@MUSIC BY REG & ZBB 12 0MUSIC BY REG & ZBB 13 M0MUSIC BY REG & ZBB 14 0MUSIC BY REG & ZBB 15 +0MUSIC BY REG & ZBB 16 MUSIC BY REG & ZBB 17 MUSIC BY REG & ZBB 18 MUSIC BY REG & ZBB 19 MUSIC BY REG & ZBB 20 MUSIC BY REG & ZBB 21 MUSIC BY REG & ZBB 22 MUSIC BY REG & ZBB 23 MUSIC BY REG & ZBB 24 MUSIC BY REG & ZBB 25 MUSIC BY REG & ZBB 26 MUSIC BY REG & ZBB 27 MUSIC BY REG & ZBB 28 MUSIC BY REG & ZBB 29 MUSIC BY REG & ZBB 30 MUSIC BY REG & ZBB 31  M.K.00ְ000ְ@00ְ000ְ@00ְ@000@@ְ@@00ְ000ְ00ְ000ְ@00ְ000ְ00ְ000ְ@00ְ000ְ ֌0֌ ֌֌֌ @:@ @@@:     h @ : h  0  @TsT0T0TSְQ}SSS 0Z0Z 0SS R}PְQSP@QSS0S0TTְVST0T0T0TTTqְTTT@@S T0T0T@S ְT@TT0T0Z0@@TqT@SS ְ@@PT@TSS0S0TTְT@TqT0T0T0STrTTְ}TsTRTs00S ְ}TSP000}PSPְP@S00ְS 000@S ְS00ְ  0 0 0`lx`ְxl`@l`l0`0l`ְl`l0`00`ְ@@0,     ( 0 $((* @:@ @@@: @: 0 @`l0`0l`ְl`xc0`0`0`lx`ְxl`@l`l0c0ddְddd0d0d0dbx`ְxl`l@`c00ְ@00 0@x`xl@`ְ@lh`@l`l0`0cְ000hְ@ `l0`0l`ְl`c0`0`0`l`ְl`@lh x`xl0c0ddְddd0d0d0dd`ְlx`xl c00ְ000`lx`ְxlh`@l@ `l0`0cְ000hְ@ `00ְ000@cְc@h hc00ְ000`ְ @`00ְ000`ְh@@ }`00ְ0@`00h`ְ @oְ `/l @c@chch h`@` @`}`@ } @`@`` l```: @`@` @`@ @``` l        c``: ``` ````@ `}`} ``` l``:`:}`: }:`:`}`}` S`S}`}``@  ` << << << <ְ@L @cL<< d<hdh << << << <ְ@< << d<< <@d << << << <ְ@L Ld<< <}d@ << << << <ְ@c@< << d<< <` << << << <ְ`@L L`<< <`: << << << <ְ@< @`<< << `< << << << <ְ@L L<< <@`@ << << << <ְ`@< << `<< <` << << < < < ְc@L L`<< <`: << << << <ְ@< `<< << `<` << << << <ְ`@L `L`<< <`@ << << << <ְ`@< }`< < `<< `<` << << << <ְ`@L `L:`<< <}`: << << << :`<ְ`@< << }`<< <` << << << <ְS`@L }`L`<< <`@ << << << <ְ< `ְl`<lhְ`<l P\0P0\Pְ\P\0P0\0Qְ @ h P\0P0\Pְ\P\0P0\0xQְP P\0P0\xPְx\P\0P0\0QְhP@@ P\0xP0x\Pְ\P\0P0\0Qhְ@P P\0P0\Pְ\P\0P0\0QְP@h @P@\0P0\Pְ\P\0P0\0Qְ@P hPh\0@P0@\Pְ\@P@\0P0h\0QְhhP@@ @P\0@P0\hPְ@\hP@\0P0h\0Qhְ@ p|0p0|pְ|p|0p0|0xqxtְxp@h p|0p0|xpְx|p|0p0|0qְp p|0p0|pְ|p|0p0|0qְhhp@@ @p|0@p0|hpְ@|hp@|0p0h|0qhְ@ @p|0@p0|hpְ@|hp@|0p0h|0qְ@h,@ @p :| 8@p 4| 0hp *@| (hp $@| p | p |0 | | | | o l @,hl @l l l hl @l l `l hl $@l (l *h`l 0hl 4@l 8l :`@l  l l l `@l l l l `l l l l @`l l l l `l  0 :l 0 8l 0 4l 0xl 0 *l 0 (l $l  l l  l 0 l xl 0 l  l 0 l   00000000⎓hh 00h000hh00h0 0000000 0x00 00000000 000x0000000  00 00@0  00 0 000x00000⎓ 00000000hh 00h000h00h00h0@@ 00@000@@00@0 00000000⎓x` 00000`0@`0c0c 000x0000@``0h`0c0 c 00 00@0  0`0 c0c 000x00000⎓`` 00000`0`0c0hch 00h000h00`h0`0h0@`@ 00@000@@0c0c@0` 00000000⎓x`  00000000hh 00h000h00h00h0@@ 00@000@@00@0 00000000⎓         , :,(  , ,  ` 000 0 0    `0lh`0hl@`0@lh`h 00hc000hc00h00hh`0@@`@ 0 00@ 0 `0`0@c`@`0l`0l@`0l` 0000000`l`0l⎓x`l`l` 000 0 0     0  0  0 h h 0 0h 0 00h00h00h0@@ 00@000@@00@0 00000000⎓xx/_m~ztmf`XQJC<4,%º  #%(+-0357:<:86420-+)&$!  "$')+.03579;>?BDFHJLNPRTVXZ\^`bcegikmoqrtvwy{|~~|{yxvusrpomljhgecb`^\[YWUSRPNLJHECA@=;97530.,*(%#!   "%')+-/2468:<>@BDFHJLNPRSUWY[\^`acefhikmnoqrtuvxy{|}~~}{zyxvusrponlkihfdca`^\[YXVTSQONLJHGECA@><:97531/-+)'%#!   "$&(*,/13579;=?ACEGIKMOQSTVXZ\]_abdfgijlmoprsuvwyz{}~~}|zyxvutrqpnlkihfecb`^][YXVTSQPNLKIGFDCA@><;9865310.,+)'&$"    !#$&')*,-/0234678:;<>?@ACDEFGIJKLMNOPQRSTUVWXYZ[[\]^_``abccdeffgghiijjkkkllmmmnnnoooooppppppppqqqqqqqqqqqppppppoooonnnmmlllkjjiihhggfeeddcbba``_^]]\[ZYYXWVUTSRQPONMLKJIHGEDCBA@>=<:98754310/-,+*('&$#"    !#$%&'())*+,-./0012334567789::;<==>??@@ABBCDDEEFGGHHIIJJJKKLLLMMMNNNOOOOOPPPPPPPQQQQQQQQQQQQQQQQQQQQQPPPPPOOOOONNMMMLLLKKJJJIIHHGGFFEEDDCCBBA@@??>=<<;::987765433210/..-,+*)(('&%$#"!    !!"##$%%&''())**++,,--..//00011222333445555666677777777888888888888888888888888888888888888888777777666665554444333222111000//...--,,,++**))((''&&%%$$#""!!    !!!""###$$%%%&&&''(((()))****++++++,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+++++++*****)))))(((''''&&&%%%$$$###""""!!!                                                                                                                      !!       #$ $#"#"#  "  ((&%%&& $()'%&'#    "  (-,+)')(" #*,,*(,+#     !)*'$  %+//,(')% &.../,+-)    !/41,,( &)(),/-)&$" !+32,+00&  .99763,#ͽ%*/2-)(**$!" )10,,/-'! *7;<>>6.(  Ƿ(/552/(!"%" &*+*,/,# !  !#,7>AC@83/&  -35652-$  $%'+-*"   $""%¾+9ADA@@<3)û +158850* #"''     #"%&  ĺ&7CEBBB@8.#ѽ &177754/#   #$"¼ %8@ABFFC;0$Ѽ .55696."  %%  $#!"1;AEFEA=4$¿ %/5643.#  )*)&" ! .9?CCCA<0  $).231(  (+-/,% "!"0:??>>7( %')-.)  #(,33,$! $! '/7><4.$$&))&&" $25.*)$""!  %-44*!"%(-$  ",3,&'" '-'  !#"   &+&     #&$'' %0/+%     !!   "#  !+20%        ",)##  (&%).)       /5-+)"  ).,+,%!        !  !5=72.$ '3750.(       &$  'BC:43, "4<:786,ü      (+%   .?C@;60"̿$%(2>@??8."ƿ  %  (,# %.651* 0@CA?;1#$'-6@>1$  '/6@FB90$º".009EGE=0"$(('" )5;=92(->FGGE<0 +58/"´&+19@C@;1 ¾'+($1>>@C=/#3CGMOLB6( #/59;5)̼ +0/7@<3+  $)&! 4<@IJ?6, ſ7AGRVOH>0  +21+$  !%+1210(  $19CMIC=.!ž1>KSUTMA4('&!%,)%'*&   )?FEHH@4&Ļ-?JNVVMB8* ! #&'00"  8CC@GC0 #=JJMTN@4* $  ).-,) -796)  !     %  # ! 2@FFC>5( ľ !%%    !     *CC?:/      "$# !  &07>@>7) -;DIHB:0%     #  !""#" #,;C?96,Ϻ+8HLHA;3)   *4-)551)  !"$*5>=75-  ð'8CFGD<4-"  "27560#͸ ';=:0 ־ %7FJGC<5) #&"!)23,(% ÷"+5>?<6.%  &8ACDC=3&͵5GKLNJB8,  (+&,.)#! ø+6::6/#  /:BHIF@4) )ANPOSPF9-$ #,-*! %)$ÿ #-252,!  ,6:DMOG@6,"¨3ENTVUQH;0' %+.(  "),-( +7?HMMF@8.¦4EPUVVRF93& !*,%  "!    )1>KLGC?6' һ!8AISWSMC90 Ƚ !"$      &.3;@DE=5. ɴ/=EJOLB;6(#%#!    ,58549<6.   .=BA?;5+ %('#    ! +3751/,)!ʽ *254.% $'($   !%/025- !&$# !'(     &-3-! $&"   '$       ++%"#&''&!           #  (-,("          '***$      (,&"#          $)&%        !#       #'"!       &('#     !        *,++(  !  ##     (//21' "#   "''$    -244-(  #$#   %('&%  !/451,'"''"  '%!&'$#  (73)((!%&"   &# !!   &-(#  (.,&!$     "%$".2.'#!&         $*(  '.54-%        $(*# (263.(      %,& &).31)"       !   ")01,"          $*-*#     "     ((! $"         %(+(!      !     !,0,*&  !%       #++*+-(            #,*$"#      "&        #%   &#        !&*% &%   $!   !)("#$     #  %'" "  "  !" !!$$ ##  "      #)#"(-,)%"+)'(!    #&)$ '-241,!',01.(     '&$"  &68540& )-/32(      !"&# *34760*  "-10/,#       !"( %33271&&*./+)#&# $ !! !)131.'),*(#$(%  #()&  $$"  #+/(# #&! !&)(("(-)+,# %#%%!    $#    $..(&#!*.*+,%!#&'         ,.*$ $-/+'%!"%"     "*+# %+)'(!"         &&  '*$ #%!     #'&#  "!  !&&# !# "#     &(  !  $)*($#('  !#$'& #&#    !    &/00/*#!ƻ ! #%''# '("     %% !*2:<80% $'$#!#'%" $%"    #(+& $1:?C?6,  Ķ %())& #" !    #(*++#  )8@CDD;0#Ϻ #)/,'#"  #!"'*),,# !.;BFGE=3&ȸ $(--)''#  $"#('',,! !2>CILE>4#Ǿ %),++*&  ##%&&&# $(&%'*%'5@IKFC=. $,.+($  &+..,)+,# #%! '7BFEB?1%"(*+&   '2642./3,   !  '4:?@93,"  "$#   '3688871-,$ɻ #'% !  /5421,('    *46:=;51.+$%((&"!!   ,,('+/*  !! 388::4/.)!ú "('%$!    "!%/0(')$ "!',&  "18873++*! "&%"  *0+(-1/(  '*+.-%  $.42.)'&"   #   $)'+375.& %-,,22.% $'((&"$$     %/4882+! *--0462*!    +6983,&(-0/3:5*!     #"  ".782*# ¾#+,.462-#     !#$ #"",1-(" !',030)    %"" $&"!"!#" #,,(#  ""   !(%$#!"  $%  $&%#  '(    #  &()'"  %" '&$!  '*'#          !%&(*'#%"    ! #',.)!     #,/.+%!## "#  *.,+)#%%!#"   " "*0.( #'" """ $"    # (-+&$$).*#"&('$   !   # &+*'&)262,' (132,&  !     "&+/15;:2+!&267:8/" "#%# "'(&  ")0559?@6("+38@B:0( $%&% EQ0'0$? *-Q!'BK9 09B6<- -9!$0- N6'E?03$!$ 9!6 $ *'* !!  ! ' $!'  !$! $                                      .-  13L + , 3$ *&!!;$C+ 4<" 2& !4A,.!(U9"Q)*! .%!*&K"3  (  +=eY)-G 2923@ ':Am0 $1(4 3 W #($+5 B 2=16 &3'' $ . '1 1?# :,!!$+/1!ND ;-&6"&4D  "1$0'  # +&" W9D 84.(%* .1;3=;;0%   (B>)]/@ 8 +S/(*45  .0 ;4'/.!#W  !("2 )   =/ ,CN,O(#J. .c! 5>% $ 1;!(%)$ .'1., *-!; fB j$ $  $5 /2C$ (-J ... ",0765*$(1$$&6128  /%(,) %) D < -" * )  4*.'(  4", %  $ ,5,'& 28 6   "C($,  4 %  " &8  -0'#* & )9 6,2 &%$ ! *   7  1 "5Q" '  &#" %   " #. /  ' +;+&( +2  !,      $  % %   "      &'#       $=  !#   #0 #   ,   !"0 %       "   & 9   %         (         !      1              !                                                                       !                                                                                                                                                                                     ɺ%''"%*'$%%$ (3?HQ[ZZT]sx]7ɸ!%*340..1.'! "1@N]u|]@$ҽ "%(**('! -6,(&   ,2,& (4,&   8JD>2,* 0B@4*&&   $ 2HD>62, 0DH@820$  0DJB<62* *BLD<82,(@NJB<42 8HHB>62  8LJDB>6*  &LJD@<80  BNH@<62 &LHB<40 4$ ,BB>8( 8B>8, (@>82 2@82  $><2 2>4 $<8$  08&  8*   (,  (       ؾ ܼ ྲ IJ ʴ  и  ־  ²$ ʴ&  Ծ$IJ&  $δ$$ (Լ& *&ھ&   &2²$ 2&IJ$ 0,ʲ$ ,0 ʲ$$ ,,*ʲ $$ *,( IJ&$ ,,(&&$0,(&($ 0*($Ȳ*& ,*&$ڲ&0($,*&$伲(2*&  ,*&$ʲ2,($  0*($μ(,*&$ 0,($¶**&$  22*&IJ*(&$ ,2,( &*&$  *20*ʸ*(&   $20*Ȳ&*&$ 22,$ξ*($ ,20( ʲ&(&$  (22,Ծ(&$  220ʲ&(&$  022( Ծ(&$$  *22,̲$(&$$  &220 &&&&&$ 220(д&&&&&$ 02,*Ȳ$&&&&$,0,*&&&&&  ,2,*Ը&&&&$ ,2,* δ$&&&$ 02,*$ȴ(&&$ 02,*$ļ(&$  22,*$$(&  22,*$&&$ 02,($(&  00*( $&  ,,*(&$,,*(&  ,,*(&$ *,(&$ *,*& &$ (,*$$  $0*$ &  ,,& $ *,( $ &2* 2,  ,2  *2(    $2, 22  02(   ,2,  ,2, *20& *20( *20*  ,2,* 02,* 02,(  22,( 02,(  02,* ,2,* *2,(  *2,( (2,&    $2,$ 02   ,2   &2$  2&  ,(    (,    $0   0  0&    ,,  *2 *4$ *4*  *40  *42  ,42$   242&  242(  462*  482* 482, 484,  2<4, 0<6, ,<8*   (<<(   $8>&  2>&  *<&    &8(   4*   0*  *,   (2  &2   4( 82 4< ,B& D2 ><  0>$ 8*  (,  $                      $   $   $    $$  ̾$$ ʼ&$ ȸ($ Ķ&&$  ($ *̼*&   ,ȴ(($  $, IJ &*&   ,&²$,($  ,(,(&   ,*IJ**&$ ,*ֲ*($  *,켲 $(&$ (,в&&$  &,渲(&$  ,β $&$ (串&$   β$    า$   Ȳ$ ش$ IJ и   Ȳ Ծ  ζ         $  $ $$$  ($ * , $ *$  &&   &   &  $  ɯ'"*$%(?QZTsx7޸!*4.1'1Nu]$뽟 %*(!<^{F մ -IiX佥   3Omo?ձ$.0$6Wv[!!.693:[s|i7Ӵ $*-+*%  :XllK侩 "!!(00+4EXcT*Ǭ!+9ELLU`Z: ִ!+=UgjicL轣 $.C]xg=ϩ %6NiZ$踝 !-@ZvxE̦ %6Kgi*굙 -?WuT ϥ %3Hc7𷖊 +     (#   "  ( *           !$ !                 $     -    * $           &#/     ,.  "      '        3         &8&( "%( !$$&$$), /$                     $                    %(      "                                !                                                    '.6?FLU]aglmoppsp`F'ʩ(3=KZdo~{Q Ц'eRe,e@Ϛ  $?&%&4E3 2D;%e%` 3"ښ,SEL@DĜE&)`E$Қ(eU5, =Y ,X  #8#!8  _ed 羚&e dD4U3ڝbN L"L?9 L9=F %3,  , &%=<92/ ǚeHe3' 6 &,2 , $ $&  8 D P% eV,ګ%S  %4RL%,Ӛ32;&,% ϭ"$,, ,#@38?e(L eL32 @"0L90 L& %#91! ڼ  ܹ%e 2d0@ @; RLY ͱڦ 9" ?3Fڳ!(()26%eY&ડLe<,eF2@3 0XL 0,P3%, (  J_3   %F?9 &2$ &5L&+ ̺2,ڻ <90!#2 ! %SZ<  9$3L9:&0(  Ƶ(%!0C*3 ?<)# LO ba96#6ڱ,22 ݪ%P!   )@p ?|x@p?p~?~~@x`?x@O?x?@||x_ Ax~n?p@@p Wo@?x`ox@x? |x `߰??@`_߀3?p(߿??`0x;X?x<@~p`? @ރ?p/_@Ѐ @?@?<_r???P??P@8 +3 _x@ 0`??? Pp 0?k 7?p~_ೀ?_`~P@߁8P /7p?|T`Џ'~?p` ЃЏ?+]?|`P_`h/耟@_ p?p/`ȃxx`4`_`@<p?d?/( P 0c40 <6@0 7?' ?/P ߅??? *8`(@؃07|?`Ԅߗopp/~pk`?|O @@o@瀀Wh \X|0׀ ЀOO`0odoh*Ȁ۠o/c_`@ϛ00/P/`0?'$?_@@à߳0P ?@'\?/0hȿЗ ?@??WЃ'?P?@8@H ~!j@@?`V׷@U`0 ؐд?O~7  ?(Лė !O?|ߨߠ `@2 ī?$'ggMD ে70OWx`oBĀ/@Kkk` Կ@/PW`Ⰱ?P0?PpDנȁ/`' ?0M@/`@?@𨟃@?`!ϖ(?0o`_@?p'h7(ؿ1?QOx7?Pү+0+Aj?08 װ/9@KT? ׵+$??c@𰤶 ?07 ۰Ŀ ?X=0"(ȕ!T'@;@7?考?@`8w@/3 Ȩ¿:oh/P /Ą(?`7W0@ֽV7=@($۹/ <(?@01ਇץ47P/GID/ 찿?@ggpOT?`gP88ఐ#/WhKx@?؀7^H;t0`@0T"Ϳ*+п'G6=)@'ӳ 8/0 .//0$''    7) 2 0п !'/ 702+?  $ ݵ$0#((>   <  ( " (4 /(ി+ ! %*  ''#   (#  '    $' ''$(/0  /% (#%(##(0 %$ &,+  "0%(* '@$@"( 7 /*0-  700  & N#70$ +('7' ฿&/*(3 $ *    !( Ŀͷ  70· ' # п 0 1  6  % '  , '  *7$$/(#  5$  4+- ?'% "                 (        / $4' !%# '              (                 ,        !   %  ( "   #    %            # /$ $ $ !'+   *     !    8  "$   ) *    $                                                                    ÿٲ!9M^n}ti_VME=60*$  Ź+?Rduyrjb\UNIB<71,($  ǽ%7GWftxrlf`ZSMGB<73.)%! ü!0>KWblv}xsmhb\VQKF?:61,'#  ½ !,6?IQY_flquy||zwsplhd_ZUPKFA<71,'" ¾ $,4:63/+'#  !&,16;?EILPSVY[]^^_^^^]\ZXVTQNLHEB>:62.*%!  "'-27;?DGKNQTVXZ\]]^]]\[ZXWUSPMJGDA=962.*%!  "',15:>BFIMPRUWYZ[\\]\\[ZXWUSPNKHEA>:62.*%!  !%*.37;>?BEILOQSTUVVVVUUTSRPNLJGDB>;840,($    "&*-147:=<;852.*'"    #'*.147:=?BDEFGHIIIIHGFECB?=;9642.+(%"    #&*-/1222479;;<;;;::9765431/-*(&$!    #&(*+.146766667888765421.,*)'%"    "$&(*+-./0012221112331.,*(&%#!    !"$%&'()*++,,,,,++**)(&%#!    "$'*+++++,-......-,+*)('&$"!    "#$$$%&(*+,,,,,,,,,+*)('&%#!    !#$%&&'())))))((()))'&$#!    !"#$%&''((((((((''&&%$#"!    !"#$%%&&&''''''&%$$#"    "$%&'''&%$##""""!    !"##$%%&&''&&%%&&'(('&$"!    !"##$$$$$$$%$$$#"!    !#$$%&&'()))*)))('&%$#"    !#%&&''())(('&&&&%$"    )>*'343BJ:!/FNOTK8:BCNUSZeaXQDJ\hok`SJDDF>;@@<>;/+/3547;;8BSU@   !'&8HJGMQRTO^mTFaU4la\fA?eitzH:PZlraEwhlcUqfXdipnE?=@UZ[te;5' &㭣ʴ         $% *9CFEHMORPMMNMSX\`__cfgcellmsuploqnoqnlifd`__a`^\XTPLJLNRYZWWUH4+''(         !-:FNPRSRSWYY\cccccdfefggihhhhhjjggklikkebaaa```a_][[\^]\]ZTTSNG@6-&        (/7AIMRWXZ^bcdefedfhihijfgikmoolkigfgfeeeeeddbababb`^]]][Z[XVTOG?7/' Ż    $+4=DHMQTX\^_ceeggeehhijkkjlmmmlkjjkjihgffeddbbbb`_^\\]\[[YXUOIC:2+% ¹     &*06;AFJMPSW[]^`aacddeffhihihghjiiifeeeeedcca``_^]]\\[ZYXVUTOKF@94.(" ý  !&),17;?BEHLPSUWXY[]^````aacddefeeedcdddedccbaaa``_]\]\[ZWUSQMHD@:5/*$   "%)-15:?BFIKMPSTVYZZ[\\]^^^`aaaaaaa`a````_``_^]]]]\[[YXWVUSPNKHC@<62.)%" ¿     "&),169=@CEHJMORTVWWXXYZ[[\]]^^^]]^^^^^]\\\\\[[[[ZYXWUUTTROKHD@<83/+&!    !$'*.157;=@CEHJLNPQSTUVWXXYZZ[[[[\\\\\\\\\\\[ZZZYXXWVVTSQOLJFC@<951-)%!    #&),/1479;841-)%"   #%(+.0368;=@BDFHIKLMNOPQRSSTTUUUUVVVVWWWWVVVVVUUUTSSRQPNLJHFCA>;852/,(%"   "$&),.1368:<>@BDFHIJLMNOPPQRRSSSTTTTUUUUUUUUUUTTSSRQPOMKIGEB?<9630-*&#     "$'),.03579;=?ACDFGHIKLMNNOPQQQRRRSSSSTTTTTTTSSSRRQPNMKIGEC@>;8630-*'$!  !#%')+.024689;=?@BCDEGHIIJKLLMNNOOOPPPQQQQQQQQPPOONMLKIGFDA?=:8630.+(%#   !#%')+.023579;=>@ACDEFHHIJKKLLMMMNNNOOOOOPPPOOOONNMLKJIGFDB@><:7520-+(&#!  !#%')+-/13468:;=>@ABCDEFGHIJJKKLLMMMNNNNNNOONNNNMLKJIHFDB@?<:8631.,)&$!  !#%&(*,.0135689;<>?@ABCDEFGGHHIIJJKKKLLLLMMMLLLKKJIHGFDCA?=;97530.,)'$"   !#$&(*+-/0245789;<=>@ABCCDEFFGGHIIIJJJJKKKKKKKJJIHHGEDCA@><:86420.+)'$"   !#$&()+-.0235789;<=?@ABBCDEEFGHHHIIJJJKKKKKKKJJJIIHGFDCA@><:86420.+)'%"   !"$%')+,./1245689:;=>?@AABCDDEEFFGGGHHHHIIIIHHHGGFEDCB@?=<:86420.,*(%#!   !#$&')*,-/12356789;<==>?@AABCCDDEEFFFGGGGGGGGFFFEDCBA@?=<:86531/-+)'%#!  !"$%'(*+-./12356789:;<=>?@AABBCCDDEEEFFFFFFFFFEEDCCBA@?=<:97531/-+*(&$"    !#$&')*,-/02346789:;<=>>?@AABCCDDDEEEEFFFFFFFEDDCCB@?>=;:87531/-+*(&#!   "#%&')*,-.012456789:;<==>??@@AABBCCCDDDDDDDCCCBBA@?>=<;986431/-+)(&$"   !"#%&()+,-/012456789::;<=>>??@@AAABBBCCCCCCCCBBAA@?>=;:9865310.,*(&%#!  !"#%&()*,-.012456789:;;<==>??@@@AABBBBBCCBBBBAA@@?>=<;:876421/.,*(&%#!   !"$%'()+,-/0123456789:;<<==>???@@AAAABBBBBBAAA@?>>=<;9876431/-,*(&$#!   "#%&'(*+,-/01234567899:;;<==>>???@@@@AAAA@@@@??>=<;:9865320/-,*('%#!    !"$%&()*+-./01234567889::;<<<==>>????@@@@????>==<;:98764320/-+*(&$#!   !"$%&()*+-./01234567889::;<<==>>>??????@?????>>=<;:98764310.-+)(&%#!   !#$%&()*+,./012345567889:::;<<<===>>>>>>>>>==<<;:98765421/.,+)(&$#!     3IWbo{j~wx/3 ݈(#0 g(lP6<,7402ʚ)[L*$հֽ̲4V/P7:38_ '065'$ $̺ӽB_zS|bWyHP2ȨϸŒ 4?l-~hO`*_,'4յ״ #%0P/@?rKXV@F!Ȱ 1 P+8 T0;NGP3PD9  ȴ-1). $( ',E=D+=8E ู¿ I0,*F:9($ ,%)( ",2 'J%1(? -D@ (ĸ 2*-4#5   &&$ !  !"F<,5L21A0ȴ;4    #0(  ( 42:67090%ʰ! 68      %(   #*$ -4-/<--7!Ͷ¿,)10     "  /.&0?8-0( ,0$#    ,6)5D:)+&´ &&        (62398*!̼ "!!%      !   $01.3.$ º #&%        #  %,/0-,$ ļ !#$           '.0.0)   ""       !)-.-+$  #       "*+**(   "          &)*+*$           ')**' !!       "'))($         !'+,+("          "(+*($         $()(&          "&))($       "%&&$           "$%%         !%&&$          #%&&#         !$%&$         !#$#        "$#"        "!!          "!          !                                                                                                                                                                                                                                         ")/5:AJMRVWXXXZXH2Ѻ *3>KPYfccaa`aaaaaa\5ѷ %4FQVba`V9274Ƕ,AR^a^][[]]VUJ===6'϶ +DS`edcccaaaccccaa`^;Ö*=M_b`^]][[[[][=!,1) $,56;DJIA;60*-."ͱ'4CYfdcccca`^]^Y&¿ "7JPD6267# #2?KPZ[]^`UFDF?1(̳ %1=IU]edffdddca`^][[[-۰ )7IY[Z[]```aa\N) ø .9=?@93>KFEJH3+-*''''±ɾ '8FNVfa`^]ZZ[]^^@'ƿ,6E\fcTEE?" -:FR\[XWUP@<<1 ̱ &38>JPZgfdca^]ZXX[]]L1 ֯+AR]eddddgjeUM4޸);BFFEEEHOSM8'&!.2.#̫"1CNPR\[XXX[[[[^^G*Ľ½!0@CISQORTMHKNONC0 ̪&19BB@GW\^iijeJ0ĩ$3?CISQJA7( %$!&/.-0* м&+2;AJSTWX[aejjiijZG1ͻ'6EJVclecYA2)!)2?DB<2$ ((''$%,.05>?===<) (010.-'  %%++*'*277>CGHMROJ>*ҹ#-:ADFIIFC;'˿ '/?LPLI>4'#""%+$ż"0COYgosuuusnmomR2ʺ!)2;AOW\[[TE6$  #,+*(#  #,-03;DEFFEFFC8 ƾ *,*1HMLE>8,'!  ½  1HT\bhnwvqljiggS=$̹)6?GMSRQRRG:+%$"!!!   ',..5:><9779>?5#$/976793,&ƿ"(,2GJLIDBB;#  ""  %-+(!  #,--+(((+138=A?8,& !).870*&! #(,1386/)+$  "! $5>HQRROHDFILNNUYUMGB8  $-233346;<9/&!   & )/.-+*'!!',8EIHFHID8&п  )(*++#   %"#%%%   #  *7ADC<6972:KPRTTROOOD7 ̶ "&+++(*'!!"  #)%+('%'(*$ #$'*11,&   #)2?DFEFPOJA8&® &%  &%%%'***(     !&+-0..1899@@GPNHLVTI@;* ӻ "$" )/5:931.++(  ",*# &+-08>@FPQOJ@7*  %/972330*&   #,28966>C??BCISQOG7&Ͽ  +/57=A@;5/%  --"#$',.179@GMNK>."    $(.28=<:3)     ',133467::@B?=HMI>1Ÿ  %3;9<:=?=1!  !.131& #%%'.56;@?@;2(   -6677772&       %/--+-034138>@@=2)  %7???@9.%  &+11) !!$/870*&#)+*'$!-:>6/*##"    %31.+$"!"%''%,56/#     .17><5'   ""((  ü #(% !"$+5:60.#")'*/1)$'(%    ü #!"%,(  "!#  +/)(+-.) !$10&((!   &).4314679.%$!  !&/01760* !!  (++(' ),&%+'""-64105, #!0D?2--#  '043:AC>4+*'$ %-2<@<993-#  $--&  ..01,# %+*+1-*'  &)5>DC>5+   '$'9BB@92$  !*.5AD<==5$  $5@DJKA83(   %)/1* &%$+541*# "----*$"&'$,=DGIKA8( '09>@;2(  ! #-8=<:3," *7>2-' Ƽ (7;EJLIB;/ $(**$  $(',2,#  )*(%'789:3%.5>HMIF?4% &/41*$ !).2.&  0<>CE;."ź +9BGIID;8* %!   3AC??:3( "!     %( "1514:7+ $)/541)      !)%,1-&*/' !#)(%      "  +2*&(/5/%        "!  %"""!&,*#    !!!"!    '''!%,+   $"    #( !    #!    &%%%  !&'          %0-*+(      &$   % ",/.)   #$    '33-'#         #  )*$       #%%%             &$   ',$! !%     %%!& ! !$$   "  %('%%+(#$"      #"    )**-+#       &0;970,"      +99721*         .8;:93-"      (4476,+#    "  *6641,"  "  !&%     */0-&  #%$!  !"$""!     $(*+& &'$!   %%%% "$   !   #%+(# $)'!  $"$%"      $)(%$  #$%('#)%     )(%  %"!   "! "!  "$!  "&"          #%    $  #!!!   "('!!#(,*$         %+-+( */11.+             &)/0.' ÿ$-5660*#      #-2.)( ɽ",996/*$   !)    )'$   )/-''   -2443,&   (('(#Ǿ 120)'   &((# ').43,&!   &3.+-+#˽+7741,& &%   )/.-'!   -1131,# ð +779:70) #"!*++(!   %-2764/%Ͳ #4<<:=<2( #!   #&'%  ')+5::3/&  ι*6;@@?<5)#  "  !!  #*/8993/) θ+6>?@@=2($  !     %09931.'Ⱥ.17>@=8/)#         #%,133,&! ı&/48:9/*(     $(*''*-'!  %/20.+&  &('$"!  !&''!     #$%'       "&           !           !!!                   !                                  !!        !#"%$     #&''        $('$!       !*%    "  #!     $%"          #('         &(%"         " #%$         %$!            !                              #$!         !           #                                                 !!         "&'$! "$$"         +*''$!!"%%     "&'((#  #$$"!     '%%(#""      %%$"  !      "    !!        #"  "!        #"  ""                                    #$$"      &,-*#         &,.1.'         !-1133)#ɿ #!  !!$-2443,# !! "! (01792-& !    )27741,  ""  ""!!  +3431."  '('%""%    ),.0)$      '(***(#!!  %('%$!     #)(+-+&$"  #!"   (+*++&!"  #$ "  &+*(% !%!$" "! #(%"  &('! "!!&%"    #(**$ !!!$'(%      "***$   !$"%,&          $)*$   !"((%     #$!"$%$         #!                                            ""     #""    !"!         %"         !#      &(%  %%%    "$',+$ '((+*      %''*/0&"&+11*#    !  #%%(/1,&   +/0.-* !  !#$).00-& ɿ"*+10*&   #"   #$',.-'! Ŀ ),+-*$ %$! &)(%"  %''$     !"!  #!                                     tecnoballz-0.93.1/src/TecnoballZ/musics/high-score.mod0000664000175000017500000007225012412501752021664 0ustar brunobrunohigh-scoremusic from reg#@@ @Q@_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! *** M.K.    ( 0 8 @   : @@0 000000 00 0000.00 000000 00 0000.00 :0000@:00 00 000@:0\00 :0000@:00 00 000@:0\0@0 }0@00S0@@0 0 0:@0@0S0@@0@00 }0@0@00S0@@0 0 0:@00@00S0@@0@.t   (&/  ?8  '   - 50(    +5. $/ &$   տ  &(  4 #"  )( $$  , /0 .(У%   "+  & $#   !,   "&< / , <2%78!?%$2 ?< @+*  );0*?M5 ?@   D?. ,+8>4%  /F&( 0$  <&'( $$+= į* + +!  3(%&( ?" U ֽ  , +0ʨ "@%;( : H7 )('0 -K +ǘ %7(?+< ' &##'8  824%1 ?P ɨ &#& 0+S '0  #$.'E;;KW ȫ' '-;,2 7 7" ' -@$+Z)N"Ȧ /P 1 'B/4@4? ( +P+1+D4#P+:0- J+%3@@;!78&$( +?$/H% '' 7R*к /*!E 4?g) ܱ? ;+ث%<,/ _(/% D' ¿13I7D%@$г 4ط#&-KD ĹN7 -c+ܾ0-80 BG̤ ܾ?<$ ˶]Я />*37 <0/=,\ܿ 0%M 9"A #" ';c*7G*/$/8)/@ 3:+H 4  P^$ܷ# /XF '@4%74NW "-L HF%( ) )+" ]0OT( 9O@"_9+L7<+o 6/ /_ $?0B&-,0'0 D5Z/" ?'6(+#U0-S?P2O0&d/P' Э"'$'%+ Ǹ $ȯ"& )$%T*ԣл(/OD踿=&'԰ ﰿ10L')ʯ+  ʻҐ:0#;+ 乧 8D'"ȱȻJ̼¿ / ̻/O8%H йԽ& 8?H옿+ʤ޼/ '8  7U=B ;0$`!3JL 0X+ ܴ?DOQ /DCoh /4 ' ! 7 - OL=D/X'-4#%?X+$& л76+-wD,/O@6 !C /(I 0$ 2P$_`P7`9< *GjX3 :8-?@)9\Op= 8 '(1@ 3$ (,;)/O[dP+8?L(0 # ?D7/   6- /GJGȼ ;?K~$3[ ȯ."W6;-@!9 ؿɸ +"?4)ST" 1л 첕Wp ȿ 5B(ڮ߸_7C2ą+BЫب?p ¾ Կ /.;+ ȸԶƟ(xGL27/8xD /L6 й?ةؽ5_D '誮ɺѠ?|$ԫ'wP0 д:7Ј".S30/VR /?P$S`4 $Է3 ,8O@9@(ЭM` И'2, LU`<*3+?;OBĩ:*Y6º%)7WoDI18/d3@-M@"H>IH$;!Я/Q'@'2:q0OP?J"@d, ܺK 97Hિ 5"?i$-H?P/ٲ , -H* .?@(/63@  &%(.=/@ CX%,"/+? Ѐ #?0-0,,'ٰ7` 571) +Co0/T'䈗74'w@ ϢnAMD?8H!_ ܯ ?p ̢OXH(0MO\0;LJK 37a(?Z2gh؎/\J;(?DǠ 7B2%"?kP舀 4ӿ?:(' ذ%W01-P?PP +?@Ѐ7< ȀbM"+$?XhHĀ (0)_P䙿=XWX*7W,2ੰ 8؅EH+!?8ED;<8Ŀ4%A?h@⿹-B?`gR=ϲ$ī g(6(,G0%_T2 / ҠLB3KJ(0m`OL')_@F+  70?X^G'ě7gH<(+, OWS+V(؀ ?8䰿 P X8ؔ?(HEK@_W _xI r Г躮 93SA 'U( S(ݹ$S74V'ĔgK`#1/~GHȨ/6?pS(O7u\;]$Hз,??VS "П/o@#?N-)G(L"'_k` `"L=#v  H/TAMV`Z 4;P('6(RoDؿ )o@@w`$ S:Ķ47>7oT *+( /BMEZ Ҡ7l_pKgH, /@ȿHW$1K` 4ꐀ%/;/\@ K0+!7P#, $G?`07U&ȯ" ?,+kH+)'-5P4?5SP5$%7d #+/_0$M8ȤĐvpBx0) ? ،X$/?\tLϪl :"/0-˸/GSLHX:ďȭOz|]0(·̌?Oj#~@Ȁ_(?MP0 &ت+I@ O@-1#H$C0w@o@ 䨀 %ME>|:&ȓ°-?OT,WX% 2D,"DW/'Z\HԹ*\ wF(Б'P2-G}V($ՠ7[nX_@跼"-37* ,+TW7DBĐ٬+,7xXQ0 )KopNCHР߰+_x?>G@75C-SV',,?N/gx0Ą777HK}h(0 & *̟ #[/h,,Цګ_1O|/D G %ZDM0$$OnJu@ <BWgth_zHM($/? ?>("蚩X7md1- sXw";!?rI{@ AȕSPg`H{JPܲ '[nL: (зؗԲ[T?f0ش.g`ж+Z ?T?L3Xf@?pF05Tп+ 'DG0 TH8_kxŧ'O0@Ѐ[@Wh;_L /@ؠ߽+4&ȿ7X$зҭ _l8ʐ%g~g@Ѐ '?Z7^ww( Ā?h('P./B' D4'+ K\:̀K0"'YG| +AbWH$谀'7H,49 Lࠟ;P@,)Gp(b+(; _0D+_hP]RB;2HX 52O(>'4f2;n@?JO@܀O1O@,4/=:)Ox'CЀŶ:<->?t}pKT8/S4/0/* "WP.;SX?ȯ/tXPO`E80?𮢀/PAV04%p:SK@հ;'f( GYv@'*+W0M@+?Z/o|x򨗫'HK^GX ?^PR@ ~ 'P؀+mP'\T%7B<"?Hय@2_p [l0𬀕U[UX5HC00+  #c8:#_B Ի  5+𫨀?LF*GX_ZI βԄEjp@␇0ȶBL0?X"وȵ!K'034ЌrM`iH* ओGe(¿OD"8 ?hHpTI() (<А'_HJ0/@/d,+$ ̾Κ  ?8 5_P;E̐<YP  ?C@KH?@'P-< _0/e`@o@𷻠M?0*d% (?0"п͠.FO  ȯԀ/0?vHϴ5 ? X"*<طз"%[(̿+(wme|@"O?7@³4_XK$+@Х5$gtqT.,?ڀ̹5ط3 G0}|h(̹%7h*h^H į€%5:78+x )˰'%3\@ QUp(7{(O [th@ʷ& +_# €0Op@D ?R{t0#L$<㰯(O0 equP/wh<45T'?w` -䬯 ?gp0) '_TK0/}`B@Ej@-, @- 5olL;{p=@' ػWhbH O07:«zm4/ %EB 9380OLPX`8_t\R@ L'W` (2Oo(/(藤»Wt#WP}T C@Ԭ*'_u?\ECrgT7^(UO@-䤀+Pwt?b+gPʖ ;wPO0+_h9' ) o@ 虀Ȁ]+H( ?m Լ€,䒻ȀB'GP 7(7Lֽ#ot?x4 #P8ȥȵZe@ꥢ:1/khEw(  ̘07Hذp7p/@ |ȍ'Њ od`vh_`Aз? ȝķ-p$xH)opW,ȐȬ7+,H',wDODmHР*8؅𪨀"30@/nbso`" W$Ԉİ&)KԈ℧'@o8;Oqxrȫ ?4@Ȍ#'@/8;`Sg{lhgm8? Ȥ58ī֮;  OL_cn0' K2(П/ũ:=rR /[Q_rrsp(,E4 ߨO0?HGcz(?X(/UŶ5[H8??zpbRw`/` ;H ( / /P&Kc@ ?@^GB2OȷȻзА/gW0MuHg( * 'X o0; +{@gdgLG,?`/MZ]m ?/OHO(mqs~z8?p@47( ( . /gJ/0WypsPGLO[wh ěȵ?D'OD=dXoh>e$  (+VР E ;^J8-2;`(0OR5O@'[doP 가ʷ7 -Q,WX 'Jc@৽̯ /7w@> O`H;Mbh/}`My' ԊC0'D%k&;,#  8 !E #ү3&K[X8?jrH'Mw~@ ؀Юֽ ר WP'ke}`",? Ԯ⸿--Ѐ"Dԏ/_@;kXGNDux+4궻K?j8?p'Kһ (:8,$ϸWLB?I}`X~@!?@ ഀ㰋 @#9mtukh@3(?<"#尯Kwt µO]J$7sxeUH#H֜#'_H6=_B)DNK09P7$ˠkP mnD[8OWb^H蔣Є;Ԉȟ[`0(+ACRGf,%ĽЦ?8:0h`87pH@gh_p4 ;ƿ3157MT;$_0L :ҥؿܥv ?  _r0oPwH/0,Я ߴ_ '($o` 4 7i0@+85@ư ؜< +58_~P*K[kH䐓/ WP Q(<C{H/4 ࠙ϴ'  5OeD)53K` ȦЀΰ_t0 ,$:03H '嬧˴ը7@-/sHȩԔ_| D/b ĿвPJPZ0,-ά䘁3`[@ - /k@ࢽ٤ *ėMp/d0?8 %,ЙĀ 'rg(+' MwDB$ЏȖܼ1ܿ-J$?\07X 7@"W0蠁أ*P# 7p;L촕0謝W8-?EB= _0#?S:,Wd& '{H G д ή?( 'T OV89 $9'Kv`]<' Ь60;fx23" $ !'eSP$'/&PȴR@;0/h "/P$/o@?wdĐ'~:= (( ' /CBA*/*'?Ӵ ֿK`"  ?]@GX.?F0K\18Ԥ#?o`4,%(+69?<SL8*Һ%%O89*22=*- WhUD3=_R8'0/86=Ge5$%! ?(;0G[L ʲִ5CQ@,%!( K]u0?^A4袟ҳĻ:E2/8"%?w0 " >\X蒟̿$ gt$$+$-sr(?NHHЬ𤐇ة ; &  GXο ,= WY8 /sPୠ𘀯ܺ /(% #[Pؠ줛+0/8?0=U@Ͱ^rPPͿ"':; Ȼ O(?[@'!?ZJ氛Ĵ$Ш7ot85{`0  ب.аИ  M$Uy,/=3;(Ƴ!$Шзe|X7~aS@C4❿-5+4 ./b@ ;UH?T@ +4꺮Ұ"/2=@?, F2 ɰ-3R@6Ҿ /A;D 3I,?I< I4'" 1! +. %$ #4G@ Ѹ[R2@(+5( (#3ZX2 @__P_@@`@@?$ 8 ' 0'0j@`+L?;Lh 臇ȏ7/ <0;jYXx|P_Owoyo?O8 *ʓи87'7RP|XqjiYPe[-9"+ο$?3B]xUlx}w\_gOa>%δ˷#8NM<9OH_2?LDFBT:LLJ=AA"0ȹݼ1 *")>,KS;lxOnjyqxybuJXEK-кΡҰͷ $ /$%61-:V20RWPWCgcokWqpjw_ptVk|gdcZGM6G$7ʸº9)%9M7TafXhl`kwxpolhjj_kec]YdOR??9*% ѸͰϹ-)E3C1IBB;8C0L3B?@771?58D'@"9+81+#!+ ¾) 85"  ¾Ƶž  &'%"!7:B?ACPCBAGNEMMOHUYF\LQXKED=<25%ݽƸ$$*1==KQMOSZB]EJH;41)Ļ&+/>:DLICNOHDY:EA<<)1.$)   $*$00.14-@;7<<7;44((  /+7F>DLSZ`^gjkmlezmirwnyrwqtuwjthff_bWXSIEC@07//"'  ƽ ($%+3467GB;CHGCPJBHC:9?.:'$   !%#,&30')3#)(1" ½¿ %*"$.'-8/,4)>-/40)''  ˻Ȼȿ #"&02.:91?7`߀_0?poWl0@0P:WZ@@t lϏ׿o9?ȀC @:@P1 N€ (-00BW?Jx$+π7P03k8(8 o(,,*F w~'UkЧb+OH  HM ǰ $80/ H  %1ˀ 08?8'0Ge/8"Јh( B`8@?08+-7,͟`(`@?# %+ H%<0,>"$?=P(_$+ܯ@X$ "34D/p䔷8XP@ `ʬ=d@8 w%/XH0%  `O;O37Y=-!1U ,+. NC_6߿?8K<'(* /q$%%.@H0 3 2#*#T@L,_  {H,D7 /'  @ $69/秪 ', Ġ D  ߔ !?2$@D%;$ $ 3 '1% M$ $/ "T - ,    ' ';";# #"K 0#"&]?ܠ6=8꠰`@5 OCeП$ E %0ޟNR8߿'MU+ EG(TD 1!;;23 ,-  4! Һ-Sȯ;!8ծ%*$E9/ 5 ++, tecnoballz-0.93.1/src/TecnoballZ/musics/area1-game.mod0000664000175000017500000017372212412501752021542 0ustar brunobrunoarea1-gamemusic from reg @regis parret @@ @@G @_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! ***  M.K.0`P`0`P`0`P`0}`P`0`P`0`P`0`P`0}`P`p0pp`p:pP|?`|:|50|/|*@:|%P||`||0| `|:|P||`0S @ P: `p0pp`p:pP|?`|:|50|/|*@:|%P||`||0| `|:|P||`0S @ P: ` 0`P`0|@|P|`| 0|(`|0P|@`|00}| @|P|`|0`P`0@P`0`P`0} @: P ` 0`:P`0|(@:|(P|(`|(0`|(:P|(`|(0S@|(P:|(`|(0`:P`0|(@:|(P|(`|(0`|(:P|(`|(0S@|(P:|(`|(0`P`0,0@,0P@,0`S,00`@,0P`0}@P`0`P`0,0@,0P@,0`S,00`@,0P`0}@P`:::S:0`:P`0`:P`0`:P`0S`P:`0| `:| P| `| 0@| :P| `0| `:| P| `| 0S| @| P:| `0| `:| P| `| 0@| :P| `0| `:| P| `| 0S@| P:| `0| `| P| `| 0@| P| `0| `| P| `| 0}| @| P| `0| `| P| `| 0@| P| `0| `| P| `| 0}@| P| `Sp0pp`p:pPpSp`S|80|0|(@| |P|S|`:0S,`S,:S,PS, S,0`S,@S,00S, S,@S,S,P`:Sp0pp`p:pPpSp`S|80|0|(@| |P|S|`:0S,`S,:S,PS, S,0`S,@S,00S, S,@S,S,P`:|0`P@|`0}@S|P`| 0`P@|$`0}@S|(P`|+0`P@|0`0}@S|4P`|80`P@|;`0}@@|@P`Sp0`:P`0@:P`0`:P`0S@P:`0`:P`0@:P`0`:P`0S@P:` S 0jj  jP:j 0:j  0j@S P:jj :j 0jj : jP:j 0:j  0jj  jP:jj :jS 0jj  jPj 0j  0Sj@SS Pjj j 0jj : jPj 0j  0Sjj S jPjS j j 0jj jP:j0:j 0j|@,,P:| j,(j :,0j|80,@j,@j |8j,0P:,(j| 0:,j ,0|j|j |j|P:|jj :j@p0l0l0@l0pl00@@pPp0:l0l0|l0l0:|0:@}pP:Sp0jj jS| P:j0:j S|0j@S|P:jj :j0j}pj jSpP:j0:j }p0jSpj jP:jj :jp0jj j| Pj0j |0Sj@S|Pjj j0jpj jpPj0j p0Sjpj SjPjSj jS|@0,8jS,0j |(jS, P:,jS|0:,j S|0|j@P:jj :j0jj jP:j0:j 0jj jP:jj :j : 0jj jPj 0j 0j@ Pjj jSp0jj jPj0j 0jj jPjj j@p0jj pj@Pjp0j p0j@p@Pjpj jp0:jj pjPjp0:j p0:jj pjPjpj :jSp0jj pjSPjp0j p0j@pSPjpj jp0jj j@Pj0j p0pjpj j@pPjpj pj0jj j@Pj0j 0jp@@Ppjj jp0:jj jpPjp0:j 0:jj jpPjj :jSp0jj jS@pPj0j p0j@SpPjj jp0jj j@pPjp0j 0jPPjPPjPPPPp0pj@|0|0P@j| j| 0@0|j@|@| P@j|0jPp0::pj@:|0:|0Pj| j::| 00:|j:|@:| Pj|0j:Pp0pj@|0|0Pj| j| 00|j|@| Pj|0jP}p0pj@}|0|0Pj}| j| 00}|j|@}|P|j0Pp0jp@ppP@jpj0@p0j@p@pP@jjP:p0:jp@:p}pPjpj:0p0:jp@:}pPjj:Pp0jp@}pSpPj}pj0p0j}p@SpPjjPp\\\ \0P::::0jj j0:j`:j 0jj j0:jj :j0jj jPj0j 0Sj@SPjj j0jj jPj0j 0Sjj SjPjj j 0 j@,0,0P@j, j, 0@0,j@,@,P@,jj,P,0:j@:Pjj:00:j@:Pjj:P 0 j@,0,0Pj, j, 00,j,@,P,jj,P,0j@Pjj00j@Pj0P 0 j@,0,0P@j, j, 0@0,j@,@, P@j,0jP 0:: j@:,0:,0Pj, j::, 00:,j:,@:, Pj,0j:P 0 j@,0,0Pj, j, 00,j,@, Pj,0jP} 0 j@},0,0Pj}, j, 00},j,@},P,j0P\0P\ \0:\(:P\ \\::0jj j0:j`:j 0jj j0:jj :j0jj jPj0j 0Sj@SPjj j0jj jPj0j 0Sjj SjPjSj j ,0}p0`, `}p`,P}`,0@p0}`, p0`,`@p0,0P}`, }p0}`,0Sp0`, `Sp`,PS`,0p0S`, p0`,`p0:,0PS`:, Sp0S`,0@p0`, `@p`,P@`:,0p0@`:, p0`:,`p0,0P@`, @p0@`:,0p0:p`:,0t`:t`:,(tP`:, 0`:,\0:\`:,\ `:\00P\@PP\0`\ 0P\` 0, }0@@|0`@| :@|`@|@|}0p|0}P| |`|:|`p|0}0| |0p|8`|0|(`| |:0||P||`||`||:`@pSp0@p@|8`@|0@|(`@| @|0@|@|P@|@|`p|0`| @p0@|0@| 0SpS|8`S|0S|(`S| S|:0S|S|PS|S|`S|`:`/0:j: j j: j j: jj  0:j: :j :j j j jj  0:j: j j: j :j 0j 0:j : :j:0 P\0j\  0\j \ 0j: hj j j j j jh 0j: j j j j j j 0j: hj hj j j 0jh 0j : j0 P<j<  00<0\j 0 0j j j j j jj  0j j j j j jj  0j j j j j 0j 0j  j0 P\0j\  0\j \\ 0\j .j j\ j j\ j .j\ 0\j \j j j j j j\ 0\j .j j\ j j\ 0.j\ 0\j  \j0 PPjP P0Pj  0j j j j j jj  0j j j j j jj  0j j j j j 0j 0j  j0 P\0j\  0\j \\ 0\j .j j\ j j\ j .j\ 0\j \j j j j j j\ 0\j .j j\ j j\ 0.j\ 0\j  \j0 PPjP P0[0j . 'Y''pK@I:0̬;8AVG8,"Üv`3@x@+$S П `.V|`8G88ܴ+/@AG4!'! ȸĮ'S4O0Y&i!@C" 8(&(@0.60$+O8  琇 70 {P l0987E3# F@   *9@OTO,'33GR# )<!  Ƴ𰓷/(gp-6f4N8G.* AA,&# м溙7:OpD%S30@!&#)'&7I0$ ӥ@.slX)@K'I,7# @4'! ׿ש 98#+`ugICS4881  !#7@,#!"ĵ0'@`gXKUF;@8. '65,+-#  !%7NPEFD@:83%  #'$#$   '@VTKQQI@;8#  ,,"#'    #+AON@@A@.''  +,#!    #8LN@@DC4,," #,$!&"  տ##)CZV@@IF9.*  04)!#!   #;KF33@@7+#  '    6CC43<93,#   "    .75+'/.)#    #)+!$'#                                                                                                                                                                                                                                           ЈCD`K @Ћ"p_?H``(gt-G@pGOȀ GHxC oLoYH}&gpoLDM0$退ǀc9`Gy@Ї-]q`sC5Ү'Ock`WPܴ&ctsSq@6 𸹠GVpygiL@0 +<`nxd@L1溮NIoXLJ,6ئĿCP7`3U28ȝӟ6&GN1Y'@ ˺ɾC0M@@@%0GDOP^cecinxzw|{{xpjp_]hWVSJKLK<838/(!  ú   !% "%(#&*, !$*)%#$$""$#+(' '-(!)((&($)&"%%# #"     ""#%%##(''%&''&%)(&$#$$""               #%%"!%'))+**),+0//0.13532321245224311220.//,*+,)('&%$""           !  #####$##&&#"$#"%$#" ""                    !  !        !!!!"""########$#$$$#$$$$#####"""#"!!""!!"!!!!"!!!!!!!!!"!!"! !    _       /Nx0@0:H_P/ @5O/;/4' 8 /@* 8/`4 T?@ 0@00 @ 4'   ?=// 84X<0/ 0 ?Dп 3(, P.0 0( $4?   0  @@?7@Зిd@0@̫- /0( (?з /@$( '0//ɷ? ȧ $H (0@  &/ +0< -п 0   7  ''<(,(п dЫ & ??@70 O(0O?&/?';L 7>o /$0F) @ @0 0=? / /'0_(@6 ?&(H?? /@@/H@$?`??_ ?N8<70_ @?#@/3O9$ '$oO@POp/07 '"_ :P M/e?h P @'0@?P V?4=G / (??0O 0?@137'$4+7@/@o/|@@WW PD, 0(`?<&5 O +_@_X@73L/ ? P[D(? ?p@/'8 7(@Wd0@ 7@/(/, O?)?PD3<4(+S/`@ OX]2G??@L O7@PV4HP/4O@'G0o ? /`?/@0 % +* ( , 0 /0'@/  /3/6$(O?0 ( 7 .0/(:@0<+$ 0 (????%@ #8 /@D$/07/ E ,! 8?/ 4K ?0T0(  0?mX;%??07'$@@,,8H;X,/0(XnD7_+['P/P U>7()@0#/ / SPPh?D /o x27 _0%GO ?T $$O[+I HOP?+0 7@ o 3(?XH/( /8(P)_@J/@  O+''D (_, 0B; < /08- /0$'X?07(?'@ '  ` (8, @X_8 W^@  @T/p? -R tT! W (;(D ?N @8(H7_ /0(;$D@/ o 3@  7!/ 0P 00(7P'(0747)0@00/ 0$8@? M=  / / 8(: P0@'0Dg +-(?2?7 ?.50<#'   ==  2' 6'$ (<  ((*' 0@//0 7  4( ո G ?Lؿ? '( (7?80-/   0+'0 (($?0$//(/ /4/ P?  @ L (@?40((@ ?(/(&#(  0 00? (3*7@/0  H :/8& 7 ?& ? (F  (/4< 0 ?, $0< 0 - &(0/   $3 700(/ O@,  O"/( $*$(8  1?.70 0 5? 0 ? + - / $ ($ 0$ $  ($ /    $ && 5(- # '8  / " /H7/ 6  #  $/  /$ ($!% $ 0&  *,/ / ((  '$((##$     0"('  $ & 2   @ʹ,/j@Аγ3P 'V\ZOQ.ԯȑ+ 蠷>PHPG//P8 OP/?PWؼ_SXP'-@+[kO@ +ĠW`H /T;?O1ДK]_?0̿బ/zԭ^7+/X0?P ,0ʿ;o@h;?6Zx`'H=9 (/wX /Oؿ8GH𱭿//78ȟ ? 4 <( ?X'J( G(Ы 7W`0 '( 욃2?p $+(ла?(7T /O&?@ J@85c@ S G/?@ .OPh+җ' oO? Ƞ+/?; ($$=8үTDڿ1 @;?K4$8/(H?@;@8@4ĭ $X %%e4Ԩ!8NP>$80 <% <+H @:%7 4($ /C+$+   /R4ȗ0'(+3 %O"  $;*5 0/4 $ #/0*$% 0'$ '$+#**37 $;/%( +4 60   30   02/  )#"   $/ 7    #  +(*      (            %         #           /  3 * "  #& /      !                                                          _/ 7: $' >  /   4/@(V0@6?7G/ // '> #(@( P(< O7((P 0/4/ 0 +@/: @H 6 @W/P;@?@D*-(/(@_E P @H>P7('.(( /( (/' '  H. $ 444 /   &  ( $(( (  $? )('/*7+/ $7 /$@/;0  $     #                               !     "     # !!"$-$    *"          `?0g{`@HgxH ?G@07L#?YrG`O$G8 /,п0O8`$@$ 7L0W@@h/@OHH'@OpT0H@OP$7P/360/XY ]Ϡߠ D_@v$X @OH_$,𚿲0?T+lP/\ ,ؽ.3S*SD9»L5YfFcF&8 ӳG5KX8G8 ̠.1GgXgcCG, д)1?\NSS3,ᾟ3X`gs`[J)ּ.LS[cSG8⾪9OaxrpfL8!Ϸ1GVff`R8 Ȭ=CmxpfQJȼ 38Wlai`@1 ذ,GoslgT&ä7Yckq`L8ذ'Oix}rT8ܾ;Vcsth\@ ܺ#Ke~TG$丟 ;OaxqiD,K`|`N(¦3I^|tupI6Ш7O|nX,Ƴ*@cx|pYGԧ#WvzT8ѶCcqvkJ'ٸWiYJ ଗCVstL9ƘA_zkP"ܷ1Os|l`@ȧ>`xfN,0Oc~yX@ ΰKglgs`L@ɸ,.GRCO@$ ت)0GbYslOX8Ӱ /OCMR03ȫ +SV`p`]P0#¹#3)! ǿ3' ĿMj\TOLHC>93.' ĺ@B;1.,)' T}unj^Q@;3.ƽ03.'' T^^\VOHGG>5.'ĵ'=963.,')&' &O|pkj\O@931' ¼.1.'"!! 9T[a\TOHC@93) Ƿ,3111.1.'$&!9hukj^RE8.'&º"$!" 9QTTTLB>=93,&' ο)1333533061'$9Yu|pj^QB1,$˿½ ' 09@@C9..+,'&!! Ľ &+3333138931!$9Ojsu}upj\L;6.'Ľ 09;96.)$'"&!¸½Ŀ˽ $",).51.3')=O\ajnu}}uuj^OC9331'¿º '.31+' ˿!)',3'"!$,9EJOT``jcc\^jjku|||ujWOEB9383'̿¿ &.'   ļ ''!'''.9HB=991'.39@HOV\^``\LB;99331'      $.,))' "',1;@C@=866133,$         &$&),,+,,'$                                       @ 0!=-'  #'+'!/ ̼/(;0ض '8 3C< 'C&Ŀ;*#;3,Ҿ110589 /D,,3J ϴ#G@'.N@AN.'%GO0 ؝'H80?XI0곩798.OSL̲/@ @O`0̬A(+?eB丣;3/YP8 У'9)GYI  汮 /0"5OX@ɳ32#AWQھ)@/Ob@ܬ<';cO0).#'X\I య),@X\1IJ.!+G_H⹫̼ -07YY0Ьؼ1F`H  칳.&1VS8 г+"CVL ³&)-NX8 Ӹ,!?XJ$Ʊο#('NX8ܸ'9VL,ȸ# 'KS@ཻ ! 7OO) к# CS@ ! 0OL0 Իӿ @Q@ Ŀ /KL0 DOP^cecinxzw|{{xpjp_]hWVSJKLK<838/(!  ú   !% "%(#&*, !$*)%#$$""$#+(' '-(!)((&($)&"%%# #"     ""#%%##(''%&''&%)(&$#$$""               #%%"!%'))+**),+0//0.13532321245224311220.//,*+,)('&%$""           !  #####$##&&#"$#"%$#" ""                    !  !        !!!!"""########$#$$$#$$$$#####"""#"!!""!!"!!!!"!!!!!!!!!"!!"! !    _       /Nx0@0:H_P/ @5O/;/4' 8 /@* 8/`4 T?@ 0@00 @ 4'   ?=// 84X<0/ 0 ?Dп 3(, P.0 0( $4?   0  @@?7@Зిd@0@̫- /0( (?з /@$( '0//ɷ? ȧ $H (0@  &/ +0< -п 0   7  ''<(,(п dЫ & ??@70 O(0O?&/?';L 7>o /$0F) @ @0 0=? / /'0_(@6 ?&(H?? /@@/H@$?`??_ ?N8<70_ @?#@/3O9$ '$oO@POp/07 '"_ :P M/e?h P @'0@?P V?4=G / (??0O 0?@137'$4+7@/@o/|@@WW PD, 0(`?<&5 O +_@_X@73L/ ? P[D(? ?p@/'8 7(@Wd0@ 7@/(/, O?)?PD3<4(+S/`@ OX]2G??@L O7@PV4HP/4O@'G0o ? /`?/@0 % +* ( , 0 /0'@/  /3/6$(O?0 ( 7 .0/(:@0<+$ 0 (????%@ #8 /@D$/07/ E ,! 8?/ 4K ?0T0(  0?mX;%??07'$@@,,8H;X,/0(XnD7_+['P/P U>7()@0#/ / SPPh?D /o x27 _0%GO ?T $$O[+I HOP?+0 7@ o 3(?XH/( /8(P)_@J/@  O+''D (_, 0B; < /08- /0$'X?07(?'@ '  ` (8, @X_8 W^@  @T/p? -R tT! W (;(D ?N @8(H7_ /0(;$D@/ o 3@  7!/ 0P 00(7P'(0747)0@00/ 0$8@? M=  / / 8(: P0@'0Dg +-(?2?7 ?.50<#'   ==  2' 6'$ (<  ((*' 0@//0 7  4( ո G ?Lؿ? '( (7?80-/   0+'0 (($?0$//(/ /4/ P?  @ L (@?40((@ ?(/(&#(  0 00? (3*7@/0  H :/8& 7 ?& ? (F  (/4< 0 ?, $0< 0 - &(0/   $3 700(/ O@,  O"/( $*$(8  1?.70 0 5? 0 ? + - / $ ($ 0$ $  ($ /    $ && 5(- # '8  / " /H7/ 6  #  $/  /$ ($!% $ 0&  *,/ / ((  '$((##$     0"('  $ & 2   @ʹ,/j@Аγ3P 'V\ZOQ.ԯȑ+ 蠷>PHPG//P8 OP/?PWؼ_SXP'-@+[kO@ +ĠW`H /T;?O1ДK]_?0̿బ/zԭ^7+/X0?P ,0ʿ;o@h;?6Zx`'H=9 (/wX /Oؿ8GH𱭿//78ȟ ? 4 <( ?X'J( G(Ы 7W`0 '( 욃2?p $+(ла?(7T /O&?@ J@85c@ S G/?@ .OPh+җ' oO? Ƞ+/?; ($$=8үTDڿ1 @;?K4$8/(H?@;@8@4ĭ $X %%e4Ԩ!8NP>$80 <% <+H @:%7 4($ /C+$+   /R4ȗ0'(+3 %O"  $;*5 0/4 $ #/0*$% 0'$ '$+#**37 $;/%( +4 60   30   02/  )#"   $/ 7    #  +(*      (            %         #           /  3 * "  #& /      !                                                          _/ 7: $' >  /   4/@(V0@6?7G/ // '> #(@( P(< O7((P 0/4/ 0 +@/: @H 6 @W/P;@?@D*-(/(@_E P @H>P7('.(( /( (/' '  H. $ 444 /   &  ( $(( (  $? )('/*7+/ $7 /$@/;0  $     #                               !     "     # !!"$-$    *"          ??34*ؿjࡠ#3 D0`pppg\[RSO@ 0/0 0@@DCs0K@ϰ8 1$@+@; 0#*& ? 0PG, $ 60 8; _p%;`? @/; @߰ ;07(+/ $/$/ 3(- #@8   ##''(??63G,/< '9+6?l#  ̾#-#@?`P19')$,,Ե۽ 'O'(,C4'V70K=(3 ̻ 39@D7 O)4+5H  0(4)89+?, &$$ 0HP41/@0'(##пϰпֿ '8;5@1c3@8A8//  7 3# '#!  '''%    0 "(( ,3 #',               #                                                                                                   tecnoballz-0.93.1/src/TecnoballZ/musics/fridge-in-space_from_reg-zbb.mod0000664000175000017500000051536212412501752025232 0ustar brunobrunofridge in spaceMUSIC BY REG & ZBB 01 @, zMUSIC BY REG & ZBB 02 @+ }MUSIC BY REG & ZBB 03 @, {MUSIC BY REG & ZBB 04 @, |MUSIC BY REG & ZBB 05 @ >MUSIC BY REG & ZBB 06 @| iMUSIC BY REG & ZBB 07 @| ;MUSIC BY REG & ZBB 08 @MUSIC BY REG & ZBB 09 @MUSIC BY REG & ZBB 10 @MUSIC BY REG & ZBB 11 @MUSIC BY REG & ZBB 12 @MUSIC BY REG & ZBB 13 @rMMUSIC BY REG & ZBB 14 @MUSIC BY REG & ZBB 15 @MUSIC BY REG & ZBB 16 @MUSIC BY REG & ZBB 17 J@KMUSIC BY REG & ZBB 18 i@MUSIC BY REG & ZBB 19 K@MUSIC BY REG & ZBB 20 c@MUSIC BY REG & ZBB 21 MUSIC BY REG & ZBB 22 MUSIC BY REG & ZBB 23 MUSIC BY REG & ZBB 24 MUSIC BY REG & ZBB 25 MUSIC BY REG & ZBB 26 MUSIC BY REG & ZBB 27 MUSIC BY REG & ZBB 28 MUSIC BY REG & ZBB 29 MUSIC BY REG & ZBB 30 MUSIC BY REG & ZBB 31  M.K.X  _ :0 _S:   < @L 0, X <  @ L 0, SP 0  0><0< <0<@P < @L 0,  < @L 0, S 0  0><0< <0<@  < 0L  < 0@L P < 0L  < 0L 0 < 0L  < 0@L  < 0L  < 0L  < 0SL P < 0L  < 0L P < 0L  < 0SL  < 0L  < :0L @@ <  0@L  ֠< 0L P@: < 0@L  < ֠:0L (P@ < ( 0@L  ֠< (0L @    <    0@  L  . @  S < h ֠}    S    <    0S L    < 0ŐL S < 0SL ŀ < :0L PS < 0SL  < 0ŐL X S    <  \ : 0S L      <  } S .  :0  < :  0L : < :0}L }` < : 0L : < 0L P@ < 0@L  ֠<  0L @ < 0@L  < @֠h\@h@ < М;0h8L М4 0< М+0(L h$ < М hМ\0   < < 0L  < 0L P <  < @<  < p@0,  < P@<  < 0L P@0,  :< @(< \ < X0L @0,  :< @(< \ < XX S< 0SL  S< 0SL  S< 0SL  S< 0SL P@ < h0L @ < h0L @ < h0L @ < h0} L S P S< 0SL  S< 0SL }  S< 0SL   S< 0SL   P@  0<  h  0L @   <   h0 L  @   < h  0L   @ < h0} L h _  h< .0hL   h< .0hL     h< .0hL    h< .0hL PS0S Ő 8< P}P0ŠL S 0P Š< P}0Š (L PSP Ő< }  0ŠL . S Š< }} X h:/         `h0hh:/h h< h@h@h< h h< hhh@h< hh` < @@<  <  < h0Ő Ő< Ő@Ő@Ő< Ő Ő< ŐŐŐ@Ő< Őh < @@<  < h:/h h< h@h@h< h h< hhh@h< h` < @@< @  <  <  P@ @< @@@@@@< @ @< @@@@@< @`h h< h@(h(@h< h h< hhh h< h 00 0 @@ @ >0  0 0 @@ @ >0 0 0 @@ @ h>0 :P:0 0 @@ @ >:0/`}0 0 @@ @ >}0. \ }0 0 @@S @ .>}0 `h0 0 @@ .@ S>h0h }0}S.0 0 @@ @ , <@@ 00 0 @@@@ @@ >0  0 0 @@ @ >0ְ 0 0 S@@ @ h>0ְ :P:0 0 ְ@@ @ ְ>0}} }< @D} @  0, }} }< @D} @  0,  0}}@D<    }  <  < }}@D @ } 0, 0}}  } <  0@D }0 @ @00  0 00, @0}}@ @ } < @ @0@DS }0 @ } 0   00 ,  0@  0}0 }@@D<    0 @}  0  @<  0@ 0< } 0}@@D  0@ 0}@  00@, 0  < @ @0D@ 0  @00@ 0 00, 0  < @ @0D@ 0  @ 0@  00 , 0*@* *0S0* *S@$D@ $< *  0*  *@*S 0*֮ * ֠@*< ֠  0@ 0< S  0S@D@ c   0 @ 0@ (0  :0}}  } <  0@D }0 @ @00  0 00, @0}}@ @ } < @ @0@DS }0 @ } 0   00 ,  0@  0}0 }@@D<    0 @}  0  @<  0@ 0< } 0}@@D  0@ 0}@  00@, :S:S:S:S\,0\.h\.,h,0\,м,.,h,\,м,.,h,S::,,,SS,:,,S,S,:,,,SS,ְ:,,,S,\/\,м,.,h,\,м,.,h,.?\,м,.,h,.\,м,.,h,,\, ,.,,\, ,.,ʰ,\,,ʰ.,ʰ,\,,.,ʰ/,, ,@,,, ,@,ְ,, ,@,,, ,@,,\,,.,,\,,.,,\,,.,,\,,.,/,, ,@,,, ,@,,, ,@,,, ,@,,, @ @   @   @.   @   @.h   @  h @.S֠֠/֠֠,\, ,.,,\, ,.,ʰ,\,,ʰ.,ʰ,\,,.,ʰ/,, ,@,,, ,@,ְ,, ,@,,, ,@,         « & ڸ  #  !( ˥   % .. ڶ 15 ú +(ʭ 9+ %- +-͸#+%˽+# ﵭ)6Ұ&+%3®10 ਙ%. .#(-&!ߞ(3>۸  !⽸&! #+9!0C&ʵ  &(ﳨ .&帖( ;F&Ǻ -ʥ.>CE)0  %5!( ǽ %%%99>&;!ХKSXUS8˾ &!)%.!Ͷ  % C.˥JXM>6 Ⲳ#-(ț%RZgcF5>Ҿ-HR`gc^> ʫ #!!P@C6ߨ5ZbXbVV5ॎ9=NR;%!ǸҾ9Cbjb;.Ц.9HR>) -!Ц%MSjuVˀKjoE! 򾮨);8! 35 ˲ .JR 5CHgjR˞-@U[5ͨӵ!Cur;)›.ghCB9%к)( # MH ǭ&^c}V. ׭ RgM.  ׾Ů38EX[#59KRecX ڵ&KuRBK6 ը%1M@#ʪʲͲ%5K`bm@ՠ%KHK@ !&F5)콑63ES#J6)帣 (!1=Ͷ0cuxH(06轃! [h1%˺ ߫&C8@ME##Ӳ %øC;9>- Ž0.Pm^H>ej;ໃBK)9%罸.JXJEcg@ =1ո !@;!&]@ ҫ3Hخ%+NP@6ӳ&;Ҷ6+ ¦&&Psp8)-@%ȸ&!Vg@+)³  HN^k1첾%#!)++خ-6@. ׾08NV!C. ϶ .) 9F캪@uhV&1JǺ5)-(&RP %# ำ(ذ%]P3ҾŲ=6;õ@U@3&0.`eE)UHǦ>@6.%&#Ҷ>#׾ 9xe)(+ ߮EF13ERZH򻠀6PH!(!Ϣ˾95)@;- Ǚ()ϫCeb)ҳEV))6U`ðCF+.MNhKŞ%϶0RS1 !•KkNF&=0ʶEc# Ps=)(Bp^.5 HS. Ӫ&K3׶ ((uM#+95•1xz9!%EcV1ਭ)E#ó -ZS+0&-⮥@]= (%ڳ !`mҋ.up!+NXSM׮=M#5PVSm=Ȼ&F#Ȱž0+.Vg9C1 >c{=3%66EhHҮ (90gRC@ʨ J=  %.ʻ +%+M Т>VN=beBJUX0 ڝ%mSE=HPPR@   »0 9#&ͮ@Z-6. ;K;! ڭ C8P[xZ 躨˨ C&E+. (ғŰ);)@CHR@588Ъ;U=6MJ=05ʠ!0  򾰳 #.0 %&5ͭʝ!B5B`^UX⵳@F HS߲ݺ B^9-(&þڞ&5^P ʀ ->. 䢮!&( . ﳞ¾ 3 )MM(ʺ!CH(&+B. ջ!Se- 5J3MBۘ#    &1   ( ¨5 #CP.3; Æ>;00H{]% Dz %FCճӸʫ #5[R)5M-ʶ!3%ھ15.MC¸1NR-ઞ +gbP5 ##+SuH(=H[=ͫͰ98 J3ھͳH0-R( 3J 0J3-RC.! 嘈.JNB=N5 % ȋ50@UXB (-ڵ;KR %>]= ەǽ1-( ȥ1!  J.Җ50 %J Ӱ=H))BMSR>89.FR€ 3((6=Ph ߵ  ťۺ #(-M>6B.װ!Hp1);3HZ#£!%00 BRRK&=B)͢BK>!53ຮ +3쭐& !er0%90ݭ@e^===^Z@Ϩ꽭-ceN ϳ0@>E(BVK5՘!%ӳ9]]N+5BK!EVR9ʽ Ų & 1E538BR.ʐ%N>ENN; Ǻ+ݽ8!>;6ύ>](=S6ᄈо 6-(+V=-N+ͦFPgH =+ߝ9ʺ .9!MXH)盀궘 JhV1M[Ņ!6!!((!!V3ڽð@X()# +99-)(18𪝵͑)>3)CKC3&!-@8! 360ý !ʣ(&B&3;# ʫ#@oR!ڛ)U[  ݀8rX##ﭫ9[B.0H8.ͮdz =ݘó JzF躎gmXM03-8-xx= إ.oU+36>86+)0ǥJoU.ӰPrK8FC%>ؖ-ZoXM3 (9-.1EB(Э!  &;Ǿ9E=03Ъ(@E;0;N5&ϭ R]P[U.#>!Ϟ 5`E=@&һ  º !PU5-˻о).(;[R9Ͼ+&3B>k]5ϽŸûåB3% ص0 1@;8;3+ڠRSF@-!g. 嫀 ;p8  9¢.žӲ 5F% 8j{`@ .հ!;&0@N9+#9P]]@߻-.)+9RV>-( ž+-3>)K.ժ=@X[ʦ #;+R8)𥉉3ozbmb#E01XR+-+ҵ.)!-=˻5@6. 禎5MVUMR%ڠǫHoR1M5;@݆1K^B(#亸)@HFM.䶦.-!8 -ώ;j}k^Mť.HS]w@% Ǹ! F51!¸ bb`Vղdz !MKPEK6&¨SBZob[.%¨FXU@8Ӟ!1--%!`kUu9ȣ )jjEۺ 9rkcwgR8ҢUVgg.&亢% ڭ>rgoeE໭+oprS5+ߞ!=+@M)0պú+BJZcSJ ╀))BM5(Ж%-+91ǭFz{w{`eV䘀9Vg{u{;&۝Ȩ& #E))+ϝ MVSegm&Օ)C%&-) Ѕ%.>Nguc- 碀%@]HF.!ඞ )@!+6CP[V9ǰ9R`u{jb;#ڦЮ%5 !嶦  %( 9(ڻ  ؾ¾0FKU[BE9(JX>UN&˾-B.%-0+؝5&#;XKP=(к ӳ% )3+)%Ӳ!!  -;۸>FUR 6{h(У+-@C&> CB@1FSR #86% 19Pg;#@^c3쭥 #)&)Ҫ)Mo]=80- څ %KeS =8خ#%) +V&컰9;>1Fʛ%6=( 1HRK8>9 %-ظ5^}F)Z>ؠ#+6c ڵ  B.)8J`g@& (=US9##׀@K^obgXSN&ø5e{ZKcxӨ   PjNC8&8bMcp]k`.>@[M@B;1.VSKebڮ5J5CS ͻ .%#- ד-kpkshVۦ&UuC)° % %J8=N)䫠 BZKK9 ಢ1JXBCEݐ KekH=Bʻ 3-N(  ʾ˸+=9S`k>- ǥEpmJ63KB&ϸ++ 0.ͳ) (ݲ )m{U8MoH =w`eH@@ ǥ 5( ߫ŽF6)׭ -R CVMC-︣í  B.#9%ݻ۽ȶ=6!@S>.5;03ʰM`]VF0&ݽ  #%%.+ͺ!!@^B9% ʵȻǨ.!!&1-(ϲ¾ ;E-3(+% ++9KE彰%!  !&Ө& (+9&-9 ˘ =H>)ҺNB+ ׸5.+#E8%໾ 0&+%+ͨ 3@@& ˻  8K  .π+ %5ENZHز򭎣 )P9!#Ŷ!B䁍E) %˺&;  %)ЀͲ=ZZ[VUŠES3 .PP)ø 9PPP&Ϧͽ 9B@11춍9-Ho]UP5  !+9C1@PV  ţ EZN=˝@ZEcp@=R&58ӀȰ (P9) )6VF#-ڋ )8&  0P6ض @Z(ë9XgoK@%.XMhwNCN]pF罐 PN-& (@& # 8ZSN>=C쓀139(%       û  )!  ½    %! ض!5&˽%&!ͳ !Ҿ 1% !-.0! ӽ   Ұ#- !=3ˢ&8#ඪ. ǰ+(+  . )H&ê)50Ң). ˺ &)찓0!>Sۨ8B-( 3H1#  â #08PN гB5-#9%˛ !-ò;FSJ1ݻb[1 ҭ0VF;&#!5dz +&5£EP[[1ŦVZKHC#ݨ.(08;@M䵰Ȼ+0#.J8׶&[[UH)!嫝(M5!%׺ -P@RXNH5 Ϯ (9C38- ǽ.bUR#ǽ0jor^5⨞8KchU66%亦(FP9 ͨCKP`M͐#0JK ͫȻ&N}c616Ȧ%KVU#+1#0.ǫ5`mwwX! țFx{VM0)Ӿê@8 &PZE а PX%ۺ׶#ko6!Ͻ3]S+   ʾ +^Kbw%²%buFK>. ߶ --=F˻.6>=;ȸ =Kh; ϣ;9M@+!5&ò ҳ8KegV`3ś%9gbNeg ® #B8!.! º-6-1 =從%3(8%צ 0-@@% 3S8 Эӽ0RbS;>%æ%3Xrmru{U%Ƞ! )9@+&#  )1+.PR&ذ!(&1HǾ(BR3 >S&۶6!3J0-!!°(@wggzo&†ͽ+&1 E)Ө@[#8e[Ǡ9!5!Ž 3B6%5(侐 %  .5ǵ;MuhJbE 0)(#.Ҹ;%P9CFMcS;1(3-B)+!孫 !&;(++&ŢjubEZE ڢ -)% &ڽ!3)ȶ8Z`^hj&ڽ901;  1-#ź@E % һ⾸E@% (  ob0HP60 羳=0@E## ř#8;׳ųBkzsr[#ڳ>5&);¾. =Ǧ(]])% ۺ&F%(  õ.bbEP-.-!Ҙ3 !.9MR0!ۭ UBŵͨ½# r[8E9ȫJK% #9SBͨ96侎 HhF ó ;C 宓 Ug)8%&11ǃ C@1KPe8а BH&3-bh #;9)- Mc)!BM6PJ ӳ - .R^ ب=)%B659(+ %J>HHH 곕!B=+^}B6@C%͝.uFC@RB.>1۪Dz >Z&! +#.>յ0kzJ=1FՈ )#>6 +  ϥN=0HePPM= ת US9FE=6@)ř-;F@ͳ !8.ز#590;HŢ  6 @0û +ջC@%;VJM غ;JXS#53쳮ö  .U6 ;)ʎ;1쾆 53-.츭 丢 6K5 8׭!>h]# 58P!ʘ峙3>F%.-ŸӲ.Z@ =ͨ>+!&%eJǾز(6  - צ9@[] 6]ZǍ(kh&H`ݵ5bM.&.͢0!; -.FS3ҝϾ0宫3% (( Ϟ1kE0^H;HRӶ˭ؑ.Z^ +J^È 3C%0SH81(  (>(!0% .5EC@6 ң.rkM6E1XX=0ǰϪ @#)(!9]`.ȶ&@MV@SJ)C`1粀#( 0 ⵝ -0B6ʦ @8ص;P5K=..CS`u`UEF^-ꥃ 1`zJӲCwV)) Ţ+@! 6B- -%ғKV .%Ҧ Jc8ؽ 0`oZE=>M[좛 -CH)Ϩ)PV.Ӟ Ec)(1Л%@6)&!.80ڦ @@=;N%ʾ % .U9=F[cţǵZrUػ9ם @]66>@3ϵ)-@%6!) C]h^(-հ#ʀ 3& ߎ )NZB;M𮕨Ø.H8Z@!0Ϡ 1ͳ#%U@0@E Ϟ9N8KJ#.) 򥘝1>NE!&09򝀀)SU+ 95&0+쭥 31gR.-+ҥ!& % ҵ((>o]3ײ KxR%(Eŝž)  # &Vh. -ckcM@+68%߰-cX`^# F=! PuH;ϳ 3oeZR0&M9ŦHC%(¦+SpehE 縞 (ȫ 1C8=[H!ū 1600£-91B0߽%B0&8kJ(9ݭ #bN; +#í(>@83HE #!ʽ!&)3Hh3Ǿ -@>@&#1ڪC9((6 CN%ә%5Nw 0ǐ%XJ-% 徭)5;0+ͥ!30(1]Bʮ.=EV0 ˓1MEZgH(Ӏ -= RJؙ0 %ϥ=gNB1 򲞋+Hg[HH 0ӻ%C)@K6sKڲ 1 1cjZH)ߨRzhX (.ʮ#!)9!@j!>03 E[bM93-`oU) ˾í!MU3;^NK@վ 50 )ϵ-XrbR@Ų5xmH ȝ6.;J@56@6KMضź([Sko>ঢū#B]kJ#ғ%Csm^@3ˮ+MS. ՛!#B^S)%Ю r[P11 HN[`5ŸJN;8͘N^buRصgbbZF+&& ZXUgE˲׾3]VPE&#ʽ%;^N C^wbJ#꺉11B]CPϪ !3 縰@cwh=X 𝀀 1^wrZN1!  !&𝓮 69KCF+Ӹ#;9E9!(&;XNcU9磀  &&Ӿ%³3RmkZ.# ઀(SjZUF9)  꾾+09B..)ݺ #>KN>NF0 ʸ!ۥ(    !ݪMjpZ)Э 6BK8XKϰ¾ϸ 6>Fc@&1;5> ߮ 3hX=1.F3Ҧ .Zg ) Ŷ);貫9U%N{C FZ &!( Ց少-Pchc^&&Sb=+>bNC9%-辶踫1me&ª(B%BJӣ (S[ME>NО(@-&B9  #ھϪ;=ER[mj5=rN۾%;Z;-Uz(ҵ #!ئ!8HbU`N.)එ @XH#C]5PsjBHː 8JC B@ & 1EENme[5ǀ Poo@>[)س   &J@UeSM8.#93seK@Ӏ»0U5jsR90ʳ Mesu!Ͼ8EBJ  !P]xZȎ.^hb[-@UݽB^bh] ڸ9kZZHݰ)xmNgNྖ1-Rg@9( 8;66۾+5SV`uNڝ)FMJ0>%ȵ! 3(Ƕ;^5׸ @6఻ϵ!HmE&K>ذ%-@8& ( ׾)JH##BVպһ )NJ.+  E . զ #6+.0]B5.은.+HRHK#Ƕ͵+#&CF.#..՝ 5>186(ؽ (-)-ø)39KJJK1ҽػ5eZ;6.! жõP{V>(!!ж3N>(+   ϲ. %EMPVڲ8^C#9- #׺9zo`SB (6&;e]Fȵ 5# લ- Ⲱ!6 3;&FH6ரŭ8BJ-5. +϶Ⰰ SmB3;0(-B6 ҭ >^# 0#&.N +߀ B0գ-.FHݳ=mM#6; À% !.@1!#9˾(KPZ}m.+)ͥ&-E6)-ʪײ%=SZP3 բ.5@>&嶝&[j`Jڙ6 (@R=Fò䙀EocC;& ̀5g.;M;׽ &ȎEe`u^##햅 JX9=>ؐ(;Xe>&#>!U00 !KF򾲮; %呣 %5[hc]+5)K=NREkw -!à@]P;& #Յ+5=.;F&œ)+5)1+)=K+ +>[8୪)6 (1>B+ˀ .CXNFUbF]5Ȼ )N 1) ˑ 9JK6堃 呂  .>B@8RJ ÓӸ9E+&à &6;0;^ec% О19+.˸85- µ н#(@M;1ʺâ 5VS=-%+ 糣ͮ˽>6!&8ZF>#ט.&J91E)03Ũ (      ##ʶ  ս   ( ݺ #º   ˸ !& ˰  !½ ˰ & Ţ(%! ŵ!춨&#  ڲ!.#+²-!-  !嵵(5 ⾵ # î.% 譝0;Ȩ0 >>綨+8嵕+!!  3 #8+ ͢ .E&찞0!&ð 0=5ൣ !9E#ǻ!(.  &ꭕ6>8N6)ӻ -3HN0% ʵ 093 °3FB9KF+­;(  躖FSS]U09Ⱦ-FPVb[ZK ли8=-)&%&µCVNEE3#Ң.(0+ ( ؽ;gbkbFJ.țHhozoR+˾ʾ#(#185ź+.>5%BKKK8 ؑ+;C1 ͨ%Sgx}h6Ћ.]rK. ʲ+=;# 68«9MMȰ&3PPU-˫(8-ݶ&HMo^Ӻ)Vuw[9EM-)+0#˵ >C5^Z. ź+P;CZV-߸0VeN=KE )!µ) £ö&BPR ӻ 0C)8%36צǰȲExj!Л#0M1.¾) ő%;3K^+3( 徨  &.Ⱦ•Fxer`5)5 €&)F8 (8˻B0ϫ)&>MC!;E#𳅀!  8 ó=[mMXjS815߻##3@UBǮ  5@Ǜ )EM9&(X[0‰J;!&0ý! û-R3;K}}& )K߽ 1> Mg-⦋91. ڻErJ(CZ= ں1N0(-#%޵!5V-⫰#0)=9(ҥ-0>.ϻ8Kbj;!=.%Ϩ@(! 0- ! 5{ePྻҫ!9!&)-K@궍8C3=#% ½jg`N!;Uڮ-P5 !(% SssM+ Ͳǭ&39BH;=kX+& Ƕ5jsP.M[=ҵ 1===E;%%ե 5^Z5 ݾFU>(5-æ]Z; Ƕ@wr[JE1@HȰ5)6NCbX+.þ PX5 #զCN%#!=#ŭ9hU; JsS3&>g@ ͺ=bKH6McX3ϭ6(Ƕ[^-(ӲXN+)Х br&›.3Z+ MPB.ӽ8sk+5FK[k=ˮ+.߳ ¸ CV9(.!ڳP[&)ͥMeMЕ0=Xu`@^M)#%eE%3PH]V)ͨ) ð596 1&ۻN@ !⭢#&9cϓBZP=b`3B``. ҕB[>0HS@J@)0!վ 8C% Ϡ 9  ͸.3K1ϘPS==CS1JRhE趁վ)cp=68X@(=0(@-ݾ  1;ȭ 3>.ȵHP01=JK`6 簳(EE8P )F-踨 %P( Ҳ 5E1µ ! )##8߰ ->+!HKU3˝8 )RK0%Ȁ !95 ט0.+! ꭖŶ(% &P8K>ϰ+;=(0.8˫ʢ9S8ӻо -&!59 #!# ӲӺC60b]H ؽҎʽ(1;˳Ũ -B@Ͼ . ( ö35 (@C=J׭#@K.&Cgc)Ž糓13  -E¸%-øȽ%) R.!) 쵛;]#F0-⦉9^P1=CV;Þ)0 ;@ 0H.עCݓ 6VK (K( 1#3]eNCBڦ)E=  %1-%5g+ඓ&B;Ө 1&RFH#3(F%䵀(9+ %9bBר)˥.===9&!=ύ#S1+0>j=ӻ)33͛%30#RKKR&;1⢀-`C85&Uz5° ʭ= CkX5+ǖ]oUC+>K)&).Ȯ%KspE(8+(ǃ-`g;.VX@ Ӯ ¨>+]U3 )߫VrP68=.еû!  ض+6XSZ&.@P˖JM5#(NbV+ 些+!6% E9☀ 9568H.  3  Co@=ZNÀ @!UrR)ҽ˭  ӵ-3)H!8+=((J=0 נ¾ ۮCC9KSC5%!׎ͳ Mzb-;N ҆505!.՘ +V3@)Ҫⲍ9X3P@) ھ)KP(Ϧ5!&8ҠͺPZHCEC)콍%FU6ғ-;%+)5 -UwMЮKE;3;CE6(Ū#8((C^(ڥkJ Uu;JX;&3 %⛉jmZKKR=F&ødzͶ69軺(P)ŭRrF3 ˫1[X>8. ݣ;{hB+&#E%-S^sbB8@ӻ -+-& & + Ϻ-()! ӻ3E@>RF׭ϻ@X^E1F-!E5Ý39[pH0)Ͷ%)E90(ж  &    (89BF(->EC0.]N%ϥ¶%(So;Ǜ0#10= ŽN ó(@Ҩ]ZF9!ʦKB3HHB@ݺȠ#=VE נ#HM Ȳ1-5(1)򻦀)=;Uuhݺ@]cJ.(+ųŻþ;K͠8= -& ͙ %>6VKͻ %8.(M𐀀([spx`ʸ  UKB`R +6 ǽͽ.0&=6[Ⱦ (5) &=MM0% ߸Ҳ!8M;.@%)ZkF(ݣ&9NUZpp0ӝ8B16F N=źŸ@3!߶ȶ 9ZM! !˦@]KNc@Ȟ Zu[ Ӳ 1Bec69검!.MVHJEU3 Ű69ڳ#56-ذ0moNc-˶;;-mpP+.Ϯ.w}cK5!πEPwxN6 Ӷ+ ý=-E@. ț ZX]`B ϰ@S9EKŠ;rpphV8•1cep]F 坓 +  1HK131 ʀ1KKC([;Ŗ +.  س͓) (M]mzhj@⾅NVXgboC0#&!  +=;6;!ঀ&+PBC#ϻǠ#6c[C@&%Ș ;Ub{](жؾ  &>B=NE%ߪ-B9KC(岶 #(0886-ڻ (%(Eb]-6)Ҧ О 5CJN.;.ʙ0+@8  +>>(%9-å RK E8& ӫ = 6͵15-gg5+=ǥ(&J! ó%PXbB3ۦ6XKS3> (@>&@% ݐJX1#=h}P&3׳.@cp9ʉ0B[oX- þ0>XXR.>M 8P^jUUhk А  @0  (ྡྷ%&JZcR 5Ö-BRgN63흀=^bpp`E&U5𛍀;uNhR +N0)! )-=ho; Ћ#1Ue@0##krsUHBϢ6+EB³ź % +; 3.-3ݶ3P[555粪;U533#&ꙉjr{{S(V{U-ǰӸ %9 8%)F8ϫص9H53&ػE@%Ů&9Vo}r+ShcmJVKSˢ &=)߸; 5#г!8=Vg955> Ǎ0J%.XhP3ŭ & %9+ݶл.& ҰǺϳ ..1RE(=N&^M;K%1   3B&!粨Ⱥ(!(- ¾) ++(.5)#Ǿ555B;ŽŸ1;1-&߸׸#(;9##ӻȭ%5)( ͽ &;+  Ƚ98( )(Ǹ%;N5! 丸þ +! # 孨Ÿ#&&36B%3+ װ˃ &SS5 »%%+ ׺>35. P>&0%#+6#襀&05ESPJ۲ߠ5VE+.!EJ% 50  е !!@(  (8HPSKokȻ-SxK!E5 61 Ȯ)KH= +3) ˙ͽ 0EB0 )!ߑ @^eo^)Ƕ϶ =^xcF&.ؠ.69# BjK6C5)+!-;C );UPײŮ5E.^r15ୀNkZE Ӹ).@pPʀ)CKmm=%H!(8݀ 3J=%(85Z{eǮʽ)&.B.-3[+ ꖀ(9[h9FB!J&-VHJJ+NRF]g))0+ )RK.HsPߪǫ 1    #    Ų)      ⺦+) %(ʺ#!嶽 &&   Ȼ#)&¶ض 0( ź))  Ƞ&о 10꽢!.#( !5!63䶸 ҵ+&͵ 0!%(Ӣ((  &5𢞵BJŖ#.-BU ò # % ͠1)#!Ű%5B⢉&%;H`)׻#0CK- 軛J1&!%%#&@R>à 6ES;Fқ;Z; Ǫ@1-& ⸵`ZKM6 ݰ 1M9E=ӻF=1#߻5FSN96FͥKrUX>䶵ͫ=EKH3%ں >K]CC&ۋ0cr{X!Ӷ%@MB%#EZX!꽨6B1 ۥ!;[{@! ͫ 3U^@35. 0NF )FKu%%B^Z(þ9M 1H +8jNӺBj]Nʺ (5ʶ>m^ҾSs>׽%HP5+   )SVmZj Ű+MgEJ@ )ʻ%-6Eݻ3(!0ի1Zg{`B>Fȉ 18)C. !# ۰+VN^g@%(1຦10!=Ҡ(.;%C>ݶϽ0Mr[F=ȝ1Zjek^+ ŭ#-E8>9#= ھ;+!+컪#9FC36H&Ÿ& 9eJ)&и˲Ub]]uX%.S9Ϡ3+ C^ Ͷ %!6Ǯ6 F5س+6.µ 9u{JVo{-ō.;)-K#訦 -8)&=; ⮕ &!& Ƚǣ J0 C8 ʢ߻ 1zUK(HȽ %.U>. &лîNX9RKU@î>+#1ҾǠbVKVHM1˻ /$!NB!˳PmK@^u]9Ǚ)-(-9.M;  ū>E 6[V%85ӻEVCUbmhNݫ ͺs{@(! ˶CR+C( Û6NB.0> ྸ&&=S;ʸ^Z& ҭ!kV5PM ó.P .F5&C(%˶9[#!@5w#;ϺS]6(0UH꽳&#+}k  k!.Pkj%V0%0ÐHhM غNH؞-;z6;F0Cʎ 6+RR`Zʽ9H8ÑN{s(19#&#8R M%)cK;9. &>mb Ӏ5SVME[U3ئJK%𭘫6 0 Ǜ]UC)@1+-J[19!!娘8.@kp9-.8 ڝϮ-(M. å ))#ø))ʸ)+%+>Cå@g^[R&+) ӣ %8 += ҫ )@@=. °(% %=9B۶® +1E% Ȼ)ͥ&XH&9@]#À.HP# 005. Ӗՙ+& %0³۪ [Z(&ߓë>HpNؾ>JڲȺ0-+MR) Ϡ !+(  Ҳ ;Cװû(K5 #נ-[h6%P9#˭ͨ!>SS &CPð98R 50˵&1BbB8ʝحBb@9J&;8! 8 BN . 3ϫ.. BB .Ѐ+[+&MbS9Bоב# 6Rkؙ85;P]JE(1 5Jݛ&(VF6@9к¨`r.+!FRŀ>S) 0-߽ KU[=C.% Ø;FS (0.URB5Nm6Şխ5#;N^u># 襀 5sgbN6mSаJHDz&1HS-+3˨66Ӷ&XM&0) 8P(8^`Z09 Ų;pc0 ((!ݖ%F+ 50K35;;1Ȯ(&9!ػ1583% ϋ6^rk=JE3&箫¶%Һ  + # )л15M)ߢ@0N 1孅жgZSXC# עB)#9!NS86تȸ%)5=9 .)+ਖݭ[x` Ֆ  M^%@J!궀9.0>%ݠ @kèڃ [ZBb5( 򵝓(#1EU;   .M= .!1K(ʦ )8b{g)H8ﳫū 0(쫵8=S- 瀀8po;003 =cZmc+ >=c0!􍀀^^SC.BZÝCuF)͈.eSJ 콝;(!䵙 Me`[3J)𸃀BB^C%! &%) 嶙+Ukzk+ųŰ!˪586cwC+ӵ#-  Dz +R@&B`Р- !1rcN;ϻ(! B=+!V.ES((Z3ȑ ;Pk ШڭEXM=3=Rˮ R˦+(!+8k3Ӯ +& 8B38J[]H-8E&𵠆 &Ǿ !!к V])򾾨 6JRRK.۵ %3UH .]9ղ 0;M[m`򛆀+==eF96϶ 0%>8!K ˪3M( &HRKK!Հ]]%ݳ& J!Ž(16բHwhVKHuh`(B98U0 ҭ)N+˰˺ 0SjPVR)6bhm5Ǚ H3JR(ո@U=9.Ϻų%PPeS-ʸ H]ocS;ݸ 9F>@Ǹ.UZ3+Т+5{sVrF Р FPE`> ó.`V`B׵++& ⶖ3cgb1ھ9UPVFC  ϥ->E`@ҵª1V=SN! ύ @JVV=%ʢMj^sR&Б9`xRǪ;^H90 !䠀3hs^Ug3ڳߵ-!%#0##CHX6-祀½SFKB0 䈀)ze5+. Nj 8Z;1 ؽ#)!5>8;>>BC!ǀ.1MgPEȶ侭&&( %+%  ò%-(>9EhKО%H!ť(8F>í+Me]1%6 Х6) ը& 0-(ϢZBBwV1Ͱ%-;P 5(.ǣȺ&9C-J H@  VXBоF=𻵵» >-E&;3MSK Æ!>B0.Ub#; ¨ JN6²8[bMMVo6Փ&>(-૝ 5K) (# ʾ1@Sb]hCMw͙.[MKrS (&(08EeowP #8ۥ 3>H =SJUB}F警61.-=VSRK5 ﶀ6E[{sk991!#6E()9===5ʭ# 6N8.&=ZEx{h]33K ϫņ;zbJ[JP[ûFXj} ð۳)Fg{xڮ 8[}6 ¦#&B )ߢݾ@[wusH 58V8ڽ 1=3U8נʻFV3H9𭸥K`R8۝+`hb^6C1껣 H`>) ț(Zc5-=%@- ծ-  Ǿھ!@;ZK1-MB.õ ^H&=+& )k^EC益Ŷ+# !#ȫŭ.;030ã(6=6% Ȟ þ110(=^5µͲ18FE5M5 Ͻ)#+)Ƚ5-3>5ϸʨ>XB) 򽢦 #6CE+ȥ(%);[g(.!## !BK6&ûʥ10B>3#;J(ý;PC % !  .ZC53F50#.Ƚ09E5 յ½՞9CwX 1.䀀 -&Kpxp ø(&( +  6 16EXppһð=z] @Z)-纰Հ XZ96RNꥶͮ)-NZ((!˭ǽ8NP к5#(% . ⪉ոUom{e& %Ń&(!&(B)((оǎ!JJJV! =;.E `[N}K)6X (BeSum µŀ&6rzE353KK %. 5PM)FFתJ9Ҹ ǘ )@Xsce& &ˀ9(HF+JrS 0BeVFK &>%03+);=@NRN08(Ȁ 3Sg#倀 ;MFU8)H;S1ڃ68@#+ !J (#ڝ #!+8V66>co!Ҧ+)磓.H- 0 𺘫&=B9Kr1Ъ & 63 & ҵ%1E=R8 .  Ű 5EC#&5˰-&6`PB&.#Ȟ +0Ҿ((+5-+>(&ǻ &>(3+!ڦڽ6VR06@.ں ..M= 81 ȶ # Ȫ6P;XH&cK+.@5M( ʲž >F.M^H5îһ 16ˣ%#01) Ǻ  1KKJJ(߰=3;xcME-%ˣ % ; ר 01%!H93hV 갓 #>0-90 ǰ5FrP;1ò )E(93 ضҰ %!&&;]FЦҰ1Zzem]J°䶘        Ϻ   # !-0Ϻ(ۺ%5 ͵) վ9  Ҷͦ01Dz& )򽫲). 궰%- ҳ 踺8+ջ%å%#!# í.#1Ұ .ú  Ϟ11)+캺 &˸  !& #)9S #쳓053S#ӻ   1 #½#+0NPж!; .S.ȶ%!-# 𲖠6;>33) ص#0=@ 6粖6&-NB- Ⱦ+>8J5-˶-^bPP9ͻM`jkh6׽ǵ(BC@H+Ż!(0)+J@ݾH8)( --)( ؽ.BM9FB9+ ˮRju^R3Vk{R8 ͳ3EUJ0(%-Ц-1   &8E@(ݑ %SgmkV(Ǒ0EZU#˞͸+Xj@.0 ȕ&XowVEJ>ž++ -=9-ж)C;Ƕ)KSxg.ЫC`S-@V3%%!ϲ3B3ں+][+ ó6Z6Krg ½ (Kw`#)!պ­>NX ͸0BbF36&!佥86  !вí>RPcN媋=)18ûCVj^˺JpB9ez. ëе69.;-簣 9˾ %;9кNkrK 8E &# (E- ź )Ȏ&;-%)NH! őھں9RC@>E9# 䵝!6.((>XU=У!&-ͺ%JhP65Xk9ūVP3&)׺׮0>^c9(06ҽ+Ǧ C-#>rV 3 Sp35]o% )-553.! ϻ!   5.ϠN`xV3RE!Ş#(8)! ð 9# ǥ  Z]&¶BhXM& &½+3 89`VȘ8136#%ŽNwkS3HJ9 !&"*2<77AUf='??A0:I (1.0!϶@!696#н%PS9c{X>5Û ǾMP0!ʁ#!  Ǫ8[U%ϸ UwrhcU!&ʫF@(# &J 5P111#V&ȺBB )Um=Ŷ0+&UM  óR{8!)>9˥ ;{k e^.8Z]-Ŧ !XpNǞP=ۻMkEڭH;ը-.gj%(!&#ҝ86+F`bj(精+5˵ BU+19P)ล-= )6>S`1߫#;;J@0=;)(Ҡ+MH33BS]0;H= &;=BJUо#366S^#(-. Ҳ1c=H1=( !>bU( ⢅>gPVP[J#0+겘˪-U36%>5Ӯ )8>%#+ ͸%(%#&NXS>HVX1ثFUHR>0 1-   (& FHPH%!ЖZV%(JRo+ ߳-#ò 9=^)⣀ (-)@5- Ӯ#-ӳ+VB3в8(ݵ5@## ׶-%(>NS=( ׃ 3J(10#Ȼ ǥ.%(+;+ &=.. .5ڸ .M3#=R9צ##@00b&׽貍&ZU-)  ˳¢1M3! > ȳ»ͮ);!е0@51 ;+ڶREMF]MӺ(;>  Ŷȶ+#۵93賀=}F BS)58;  +N8+&؛..#9S(#͋ 1Ng>1 #6b=-Ǹ.C5辛%`B!-RJ9(ꨨ)&& !N[1% @FC!09)@X.Ў%%& Ǟ)CSP-91PMRkK6-;&ͳ.Xw}SF#!(߾3岣.bb%;{M8%E3ȳ !䶘  BVS⦀8hh&8(+ڳ 5F+ Ӫ(Zk]8=Zb▅% 1(11 ۭ5H6)ҫ#UXJ;RغͲ %N[c@--0;;VczP ۽ )mE &Kbʪ-.ps=ӻ (ǰ%!H[.&(յл3+9B  R^>C 宺XbUS+N( =N5H9BRݝ.=1H)  Ҷ+3 +uV)6% þػ+N+NJM& -3S  ;FEMRM; 9@ (V^5CF%  ؝%-&)1%+佶!)0绾%1)5>r^-۽@gCC=6&5E%#.! PzS=HC).0& 8=0=%Һ #`]E1往p`B;-9. mb; ⥀@r^Ug^^[1껪&0J1 춘9Z]@6 ߵ%1#àCojS8@=3Bۨ #C]k`HE;!ő-& )أ @ -ʻశ  =E3#B ݮ -=J;0MjUN»  ;!ˣ%  )H5ͽȭ!6H)9՛ϾES@35 ۾⸙+ +Cr#䫽3E5U691K1 ݶ  + 5-ǭPH( Ţ 8CN[6%()(;VZ=(䎝 &E%˫%=NS˾%0=.6>1 -MF>9%ն0ZZ1MU#Kͻ>>Nx@ 6ϰ(%1&䝫.^@%ϻ-885Ȁ Zr{c[- 9ShX`](.ꦽŸ-E9#& !Ǯն%5-1F&%#Һ+6- +SgXK5綻 6pssuJʺEe`[]9%+˽-ebze.в##9NB#&õ &@Uc=+ 罽9k[3ڳϲ ;VbZEPȰuz`80ۓ91MsP;ͽMK5.ͥ (((FKºcVM; Ә6uk>ϥh}skF5 % 꽍 HhH8˫156RN9B5ȵ-Zp8)ӻ!) Ⱦȸ(Ncwk>]Հ(BUoom]#ߠRhS8!ϐ&&CHPF&.+#%(01)0P(&žӰ0FSC5+6å@# 곖 0>`heZ;׾ .bmbUB.!!+MF׳ # !-@5 ۽ (1@NF=PK#%&-89ںݭ!=MN) &߭ .H0F1(-.KC+!ř >5=6Ÿ-[H )C 谋9b38r`+=-׸!!3+& க#-V 6H﫮&90 &ߞ @gmm69hR)π-&>hXJ5а- ǣ(SH# ڽ+1CcxR61݉!KmppX]Pإ+%)K Ϣ=C(sp  0^ +933VZhXk` B0ץ !B^]C3R >h^.^!%>U[KxxH & #();JH5! 5.-CPZ+ #핉 JXFEXJ! Keh򲝎 ^U^wsž+%+&!ݨ&8EJCFH>@- @uxm}Pʓ0>M}{g߻ǝ>Uu+ǻ FPes3!۽ۻ1ո5(`R59ºNz[hh8+ Ų9uzxE䵀6SpgB+Žʳ-& 055 RuP ڰ9Cˠ8Sm@!!3 ՖF9-R[R+ Û(.9 е %-1ݸ-9)&&jF#Ӡ %  M3-9 3&86(;˽3+ ʰ 05ذ (UcF>5 !к굨! !;5ϻ#6&!(нҽ[H0+%Ŧ  + ⽽˲(98M`-Ȼ -6!(3 ӽǻ98@ ˥ CMPB6FV.Ҫ-H1- ++H6!Ŷ !+US%%ڨ˳6 %JV.0ݛ +  FceJЋ۵8Uu+.)#9Ү-C&-퐲  -#B-Ų(8CNeS庲>ZFMȺ %@1(Ŷ9@;B@ 䝣 M^`U)ȕ6[s{hS ͢.5CN;&&س %`] !#.!Հ+#1J0+%0[)۲Þ1%ʮ%%1 15 XU@EUh[{pȶˎ!Vb^FF1U@1-#8ksã .MME @1C!86.踺)ꐕ-=R{rPR&  Ko]ru# 5VH苀316##500%)S`` # +NR) ǀ0@JMRN6Ȁ!#(;-Rg@玀 .MPUbJbF˵P.    Ҿ  ⭰ &  ۾(  !  ͣ &))ǭ) %彵 ! #Ҿ-1϶1ϳ+ +轪 %#&(5 ͺ#-&ݻ6ê; & 糢 +&!60% 6&ת -183ʑ ;+>. +(=Rʳ (% ղ5@ߢ&&@R[ߺ16;PK!Ÿж688%ʲ(8- ) ǸB=P[]&%һ;HEUB@-춓.º MSH5ϮӶ#0@)61˞ RX`eZ>6˳ 9MZMEV.❎%9 ZgX9 в0-1>1)%հø)Xjz]Z3&1C^cX.;.׵)8@.Ӟ.Smm.嵛1BRC  䨥˺1`B0.ݶ.Sb@691 Ƚ JKȫEKemg¨+BZN բ8zR>!ǥ6R-#-! ͻ)B+ͪ1CPrZн +bZ%ûVz]1&#׵ 33 .6+Ȳ1BHow6›&M^P³BMs881ݺ(#13 #׸ 0UZhp ׮!8J[Õ0@`K+9X% ˛ !( 9(0 ߰ +B@[^3!0î H6ս(+(BB1&cbఀ  ;.+Ю @51JE-.M6娢%1(!ཽ 3)>E;CBrR! 6++3(-(1588K^6 ʦ-&5 ʲ +RC-;j^3(0#(9Eճ>F6hJ&қ9% ;+лKU#3Hh1͎36-KX蠝 %E;PNઐ 5#˙F90XN5 ڣӾ¶ &cVR[ 3¢3%0B1!ժ.%.!# Ȣ !+0V]&# 򲨨>xgXX;1 ʫ&9-(9+%Ӫ5B3(0! ò !9cE3û. ª(UwSPV#ǻ+C3!0% . ŭ3C 50ͶǢ&& (HRB લ@6%ȮȪ.jxX[C#պ.B60%)%+׸ŭ.9&#5%䲫5- 0N>׭%SEе=bp[J%3ϻ6R0++(ݽJ! E9ۮ N63; ʲuXأ#>{^J501߮V= #3 ¨ 11=C1ב=U.6 ȦJ`&˛ pw&NJ-)æ0H+ 8Ы @B!-0N#츑#>  Ƚ+`hB+X5=cZ&.&%&ݻ %F0 08°) 谪-Epoˀ .ZRFUhK)!آ! ˫ @6 & 丨 3&XU3+⢀1spP=g]((Ϟ (ʽ 0;%ʰͪ=%5FchJCEБ9XPXH;%# 縦ȵ(3 в-XMFKC`9 ߳!9UR%# 0߾+ ϻ(5 (#  ߮ϭ8S8968K%€#J6 ).3%Ë+) !& 箵и)S;+ +5 0%ڪC0-.P@ݾ % ˮ1&!µ-Z6#&1B#Ǡ0+-!BK3) ž-F!Ǜ31  宨@X%;5;M Р#+Kc= 쨻51ߪ -( -&ņEP#8E 5;1ਝ˾;KN 6к+ #H%1[;05CFNX 3&&35æ&&% ͙ (SB 򾀀 NPJ%09+hRE#­!ʭ ESB0 û 5! J(ǎ9h[1  3Ӱ!;XEPB1Vb-ǫ!ի#V6EJ;&3զ;CNzS9ڦMhcF.]N ʦ3. ヲ#>bsX0)# ߰0.ö&JkN%% £!@1-6HMK 򺸭 @P%Ͻӻ[m031+צ=!! Ű8bMK)-=8Ү EP^..9@!ר  Ecm85C@– (˳ )J8&9ZKﮙӸ;X86#!56О wc[]J-R.;E;Cꮮ͈H8E9 ナ⮭S}@5Р! ]r!B-σ .80 &(!HbϞ؀ckMjC 긦E=>0980ˆ-;F5.9.!%0-ڻ袀=Joe  Þ+ Bjm8#.6(狁 KK.;V>9%ť8%𶑋HR𘠰и=#Uj8 -->+UKES=K89.Rו!ZkH𾦣+!혀MxzNM6=-C8SP8N0 Ҫ&M[UR>꽭H`ZZ`cC; 궠BV3H>! +ͻϽ3F9+S- ʵ˾-)( #ʻ3BCM[gJǭK>&! !&.ݺæ(%+8.X-нXE+#纳@5(8Pk5ȶH (-B%ϲǨ&513;J5ŵ>RB-  ž9H61Sp@ Ž FUJ(ϫ HS95. ǣ²@FNK. ؾ+;[B.U%Ȩ &CgkS-첣ź 6%KB#K-ū;P6MN&6î!RE;J-# ⍖ 6kugS)5R; J>)>&5@+-ȣ6`VH-(+88&1Jw]^h%𾞫ЭXM5C0 >)19 !í-JJoPҾbhEJF ڰ XrSemH(ʳB;SV>Ⳟ9)3ŲŻ%Z^S5䲺ȾžH}NU ̀=mSjE-Ϩ+[HX5®3E-.ݸ=H]Zг-wP( NjkpPM& Ƞ+@Z;岫!>&C9׳.9CU&ǵNohsC À@]peMU& נ(38(ߛ%1!&#)R93) ӈPpbmejE58R`b@²) ǖ +򾦸 )).9ř +FRRbcSC(׀JcZPȻ== ҽ&1śʦ!>F9RBHZ3נ)Cg; ݸ øҾ%&CH3 ͝! {ջ ;XB= F9 6BEظ(eZ#FJǸ(8(;ϲ# JB36 в&E 0P 0ݽ 8@B6M1CF> 壅!;8 ;P5 ®(09++.. (PZVKHJݞ!.9MU+ҖCVH1.PPۻ(&9JJ08!;堋)BCZE>[1́1J`PS5 -Nr^3Xz׽ж𾥵&6-5J]U6+ 9%@SNK5c>BNgrc5;.ۀ1^oboZͶ=8BSXg^=3%&69hcCFVژ!K;mUHۀ Cww}Ƚ #;c^SX85ﮕ 63Sjj]ϵڵ&=m&Ž#No= ʓM^{hsX訣õNVNm=ˣ۽JUZ}B#+36(  (³&^xjUKݳŪ.HCH%)л϶E88FjS)ȫ    )1Ҡ 3Ro)3;1 罽ȭ%(M0-UNH ð %!.⦲ +(9..b!ǸX113쾻 >6+R%Ҹ56- ͽ«  +;31+35B;Ø &.;+ݽʲýM]> 1¦ 131(!н)-8;%# 갖+!dzھBkK))3« ;= 廽H%׭͸5   ˓!6EK#(;Jǵ(# ((ž. ;C!   6! #K^F׸1 65%ث& 1`1 ۀ&. PgX(#ˑ %08U& ! ͙&Ŧ3%6F- !.ŀ Mz> %׽%=8PpZ0ݙ3#%56 !1#è0NU ö 8%⭺›1Vbu{V(9 Ӣ%+865%א -HM@)13Bڐ}{U% 9BݞE( #= )HKPV5(9%>E 򶀀;UrH+5jM(.KU 6&+⎝%%!1%Ÿ%.C> (+쀀@ejc{K&3U!;[=׻(0 ω. 8 .C519#ˀ#8CPhXN^;pg C[!˸ 5  ߙ().)(9-ݫ#55X]jP`xE쀀˻ +&55  ȣ Ҫ#9 &E=Ⱦ. FphKZ}.½ .;- ͽ! ؾ-( 3;Ř6MZ^Xp=Ъâ >0%#0 ϲ#˺  5ϳU^;cZ8+Ƚǵ+C09(  嶳&հϻ!R`ME13Ų!&K;&!亸 +#  任C^8C.           ۽)&  ݻ#    ˵ Ҿ! ½ &  .(ᆱ% 𾙣 @  ҫ! +& !1 ߺ !  ); ӫ+#ݵ !3M䳰.; -%1 =%к  #Ů #( 1о +%). ţ )(䲛&9EVȠ C8#%ϙ=EM1#˾% && ;-ӭ.ECE5@Ǿ+(;)8NVM%ϻHeNH;ņPUg`KE   ˭6XM> ոB )055כ-E]bMK3ڸ%->10&庣UN]@&қ.g`cVC!0Emob3 흢)Kc>.@SJVU૦6k}U9;!ǺڥCF-%®.SSH ߸!N`x%ʶ(VeV1 û«&RPھXNӳ !xN.ص!@& & =+׶+PZ9 仲)ej0ʲ;KF¾K]j]`(ظ.VH8@綳!% ¾8 ۺ(JX5EӦNZ}pMPm  ՛ &;)3 à3)& ྣ);Hg[>>K ګKS);.( 𽨨!B8C`C-5F⺛(%05&;3!FM%%۪ã)XoZHX6)-Bý +06P;к.!3ϣ &U#H@)о8oU`kמػ5ª((He+ 6ʾ 1ͺ +;em15N.!B=.6 -Cנ®11K->@J׳3-ʨ.&H31^5% ňڭ +uuSV86!Ş-.5%6 &ب0H( ϻHjV]zF. ͻ3coX;+о 0#;ŲVo[CXM( ͨ ((0 .9#øòJNB`N98 N=0-߸+;SgUMص(#ȶöͲ&RUR;ȥ+C6! ) #!;۾ 5 ʶ0gF>!pkSRVo^絕 ୈSU#׺FF Ƞ +3gj00&-5ڝ#5B9 )V) ҵ^w-5BF+Uk  ⵈ.V!B^PF Bҝ 6-K#&!ЍBS &Bŵ0 -)>#Ш( ˶#8bh % J}EMVMHe5 !SC63!Ŧ +CӞ]B8>M;0 ͳ!!%B-8>(縀 >X-+E;ʖ =X>898蘀6 M+6#&•&;CgrH9;ˮ!첮 !۾B3Xc;F ®9JkC=&&վϸH-+ +>%˺Н#8RXJ %5-Ñ)5+ B+ (ʉ08 򳀰-+;E ݳJ5=-) י35%ER 縀%%C-MMϝ«#)% ;J%ۢ &HB8oZ˭-0ծ-л!B!8Z5m^ ЦSs1 9&Ͳ@ .ڲ E#!E 0)츫!+Eoe.˾ =ݵיJ05N)&%%(!&&91MM-썪%(%FR-)€.0BV;K9)%5N0к۽ B6 .ˆ [[J%@8#hM5Ȳ (˶CgNť1. @%XZE-& Kՙ!)]M ݸ!3C&𥣉(5goc`9J߮E=1#ӳ;--%-E3⺥35غҶ)59so@ =6&0>53 ט8M!۰ Rh;𺀀`sF;=FZ갭ϛJ]8B #ʐ51£![eP35;=9䳙ϺKe( &-1  ̀ )N0@RR+ڦ5.09.ZU-ʀ !(g9BF5䭭+%)3!Ȁ+8+3;)0!)բº‘!`J+S0.#ݞвץ#0-b] ! 䍀 !)(^-KF򐀀 9B%06+ՙ-P8 å䮀 # Rs{>)V>!(9&ב  8j]+€;`;0SS쪐 Bg8鹿 .bRK1J5%Ͷ( 9kB1;9ǫ!ۦ+S35!½UKJ; ׸ZgjU䦁&H=pg@Sծ(% ҥH}}P ݻ ҭ81&6c]9(ث # H]JXN+V9KC3ғ6=Bj1໭ 1[J%+= ͻ;;EKMVH ȠF  V0׈ 1ۻ% C=0+%5m0 0K9u+õϫ9NC39>Ҿ+0%ͺžBXMFP[0Ȼ &M^Z6dž&JN3峪.ENM!(U#ȍ >  BUN-ýГ5ps0S&˰+#϶ &1.(Hڳ)  Erg1ã@>9;(KX!-Vs`P-ŀ5bxZ.)ݠ1opPZBC9Ҿ 첣5p{`䶋P]J8 &«0JKcS%ŰȦ F; %oghNÓmpsR). 򦀀>eP6Ȯ%EKC1ڣ6re)ஞ%`U-#瞀19M%+ý;5P3Ŏ)zs{K۲xzxhH䀀PJB^1 ⸞8KV3æ3RrU а ;ENP5 ⑁C3)+;ؠ8P;S-ǻ1c{c(䞀KwRC % @+;5KR;ë)U>E%굓 MSbP.! # &19F(Ñ&@FK03˘6XRJ@-ȓ- 举 -%319& 転#FSB3; ׺    ! lj (6NHE+R8Ū&1-3. װ3B&@;г+R0;]1 ø(#+ )˻ؽ)5^ 6X䮦(P###˸);3߻.쳋 Mck5;];Н+UKESB -.%C`M Ҟ %#9.55Ș1XMBEXϲ-׮#B]R>+(Ý.VbF.joཀ.C^j&-ˉ5SK3ؽ 08C;筀#FKE@jV&^K𨕑18)8F==9!H!ͳ098;#H[ex[F#Ej[Z² ! #0 ⎃&=SFBUH5 倁 JsE(쁃 =(psbgNϲ68N!1=xs` -H]â+NXmmb15XhrXǽ9`skuȻ98UX9);b8- þ )&)jmbc ݦ8hxjSoPø;[5 к%Hx^;3[>ǫ%!  5  ͻ&0 =3½R=+BР )gB;)&ͮս-;RM3Fݳö& ʺ5%6C!𽾻ͻ( 6#%3ح8VRhSװ ! CʻŶ09=ERP= ݲ1%!-+õ) ϲ !C5=8%Ů!3.-1#+ Ҹǭ 3C;;  +%!ú .CH&! Ϧg^9P@.࢐#.KF. ҽڻ잶 >j8 .J;cpm Ÿע!3 8MM  % 5JFNM࠻C#HV8 +.%+Kk³#@V}3%)=8-9(쀀0)C8J^ ö HH ;Ꙗ(- 5@( %5FM1ϻ(R`; ..J@- а (#+= ը)!!ӻӖmww0 ) V;EB 3%#؀MM^P ! BKx= (X[R0.3[k!+Ck[@1-!9;#C]BF@#Fk .FB+M=&-16;= @Ve 1CK0&CX;1CjC疛JZVBPC0&. 15ݥ.6B1RB˅R5#- 6!Ö)(^^;5ʛú 1+(#վś5+-.(%NMJ. )1#9&  þ( 6׽B^`K[0 %%! #-V@U> Ȯ#H.C&8> ۨ1SE; #+ 䶵ʸ#.B-EC#+#Ҩ #CR׽ó3@96S8!һ% ŝ & %%-îȶ RC=`Pjb˺!!@#.1 ۳ 6  0C--3=;۞%0JHMH5%9E-5 ۮ & =Nײ³(HU`9## 򺨃&  -!ڪ)ScRoZϦ5 ˫E6 ›@9`jF;ǰ¦=>& =H˸-; ئCE`S Ş H`BMU@$ *˿,G$KS(#/VXSJ8Д_I!hR07K@ښ XL4Ɛ(]K+\A𗫿(YO=̔$SH  gD8OPAԘMH(mF >7TBPH4Đ_EK'P$ @@(;' 갫W+@Ԥ`D#1* ?)D夿h9Ħ)1 +.?k%00 ʟ#/7_0@' ԥ''Ķ?4%H$# г/6*P"# ڴ,'C $ (& Ŀ/(((#.',-*,(%-)8 ,0.1 )E&8 <9'K'@?;$)O'H?=,0O%T'/4@? "N%@@7" ?!<>/00 7 4/+/7 ,0%%/,( $'!"ҷ+-(@# ܲ%*'H 0'& " C& D-ۨ%* Ч61V֬0(̚* /W$ت@@Ġ$0/O4ةTH 15 7'H⥵`N0@%3W욯gK$Ī 0L?W핫_?@ԛ@\?[풤?B`P_$ ?c;Jpℭ`W4 7m /TyaGH @w0+Ww!䌟[@`ЀPw@Ov.蔍G@x ؀`_P G| .0dd>.1 0迕A+n@0f \+ǚ06NǠ&D6N^vL)PSkkkղ.Iss>y+>qSDT0Ŀװ [( Ҳ  N^n>F .>n ><+ nH ) SdH>8.9ʝ 4^& >TϊȰĝ (ط 0`\VT`Ac&ʿ׷A81DH6VV484.##Aߗ. #Ĝڷ H l4. #)#.1iH& >1<^^A4c\8 !и@&+ V ėՌ Ā ! <>H)L^nIظ̷FF.TIIN>HA1N >+!+H. غոF@ Ȱߏ߭#IT.8HnvsqF1NN)00>1^@#8X ) ح#К蝭ϸڗ0#.^i>fب︥ LHVcTH.! &84)  Тďп 9(L86Nf|t0 1Е40fl8.VTX9X> >V0>> >A1>Шהʷ(#+ S6T{X КLt)0( !9A`69Dϝ多ʸ.!L ҍ8ݨ.)!4 0X0ҰfvA NP Hq@ڔ𠀚 ڭA[^ivA88. ty8&(  +1S>@&ǰ0F. @ו&6 к ݷ ^8[^N^A([ +XX)&8+&>(4@ NV0 k\9FD>v8ȷҕNT>{i\P^`& + .&.@ N H !D )@LS )86ķϷ 9\ݍк)cnNlNN4@>Tt> + 0L.#.I( +!^S! ! ^.T>P8ڿǀ&PSFP.1SAHN # PP) PD>^  P1 ^ . >N>ǜ.@Ϻ̌ڸ(4Vf6sk&6v`!! &) @@(  1.>(D#iT!PD&T!ݭ@\[9Pi+kvS4[D[T`c  6F(>  >NN0(S\ d48ढ6#+ݜК .ns n [(+ 6Ld0) FV<<0A.+@!! 8(ժ)&9⠸¥ڨ S8&6{A1>Ntc!v[9!V ( 1 . P+6VHN+ L .94ǀ&׬6[fsqc@i {@ V>6f4ID 6A(>88)8 6!&L(0  1윊ݴ읠 1DS^Vk+F `yt @ # (0#P> 0+d91AXH( & 跀 F>SFPD\X&>0S89 +NA0(P8P9 9+& AN 0<(VP ǀȪFFLyk{4F >d^lXt+ #A)4!.84 F)9D ))> H>L>& d>06Ĝ)P>NLi(4V@NNF+ 4 9@0  +N(.+d1F >TPtcLJ^<尰ķ𰠀π¬)0 `d1PI.cidV#\ ڀ иҌʸǀ߰.)k")Uྀ֨*U*~S^U *jjS=*,ˀȫȕ)"*#a^@^{Su{Uf\Xc\8F8. ˭Ե)*K53UBfcr~rapk\XcURSK3"L*)."  )#" )3).)3,*.))3,"). " úú  )=::I^U^acff|~{rpka^\SFKB=853*"   ""#), )55.5*=8BFBIIIFLKSRLXRUUXaX\\XU\ca^\^\SaUXRRSULRLBF==85=35*)*""  ÷ú                           dG.ٺ.t*Z\S.Sp\.hWmBZFN%"'"Bϭ.Fp|hF?3;ŀހh\*\ZKh1 %"ꐾ"PF3hP1%WҲ:١%BF;㜡 t.PyPZN3.?. G; ʓ.GWN::ϩƜB "*; .Ő*".:.ʝ٤ϕ3Z*; *ư'6B*6ҩϭ%t*dB?ZŀϡϲW%.N.6:3ϤϤ١ * *"c1͡ٹ'K*'.*6"t\ 签*ީ֡ N*FBy :.Ͳ 1͕'**. : .۹'6 Z':ﵵϦ 1F: ';".͡ .BN;BBB"F Ҝ*% BZSF%FW*%P_hN"_*:.. %..1::'Bź%%žꦤ Z**F\Ƈ穤ʓ \ZB**P N:%*.ϐͰB %ZBFZ ;"ﹲƝ 6 Z;h :G ްֹ 6 W\'".ꭰ G66..ŵ: :1 *S־?㡲"y?'B:" ްҝ':*h1"' .֌ϰ:::%ޝ󰉲F.G%%ٹZ ";FϺƤҜ:6*WKmdN1*'Ҧ% *P%\'*ʤ; 6: ꭐSF\ր:c1 * ﹡:*?.K;'.ҩҹF"Sp?F.F 'Fƕ١ NN ;F*3:'ҵͭ*Z.Z 3" πͭ1" 6*.ϐ޾"1B\'G\ 㹦ŵʄ6.6ŜF"3?πϺmmt"ScktZKϺ Ų\S3_hhBmh3*Kh  ?wWSZ;.  Bꐤ۹.1hNB111 ҹ3۩*. "*"'Z;"%ϵ6*B .3% ϭϤ"".F'ﺹҹ%1P3Һ%.ƺ纘? 6 ? 63π% :6*"* ƤҺҰ%  *:."h:ꘕީ'S.  6?ҩ 6 BB%*61󭐀' ⤵ "6'* Ť۵N*:..3ϰ޲''۵% % ޾ ޲ 1"""%F⡜ƹٺƺ '.%B3F.겦ֹ֘*;K;NNNk6 ֹƺž*. 1ŲƤNNtK*"; ƾƲ : 6 .豈%*K.KBc*ƹ֤Ұ**B;1 '' .%1' %"3֩Ʀ*.3.B'ͺ * .." Ʀٲ'"1P:ZW3⺲Űź"%.F"' ""Ƥ " %ź    ٭'G1  . ϵ    * ..'1*"ۺֹ";3  63K_W?% Ͼ"" "Ϻ"   ޹ "%Ź  ' 3  %. 㾺" *%Ʋ      ־%'.ٺ 3  %   3. ϰ       " ƺ  ʾ 1.ٺ % ަ   Ϻ"%  ?   % ۰ŵ  '   %"". "  Һ    .     " ư         CWȞRL]>򰋀(hu3㩄1oj$ܚ GWƍVA򬀀*du+ؖ8s_Ƌ GIVx3㚀(djȋ8oYGz~>򡀀&[j͋ 8h|IGo~f+ܡ*VsoCƕ8]mW$㬍E``>Ƞ*N_L級8TW6ƣ&GWAթ5PI㰕"AK-1C: ա"8:㰓 3:$ *:/͞  56嬋-:+ƕ  "86㩄5<+ ->6أ 8>$򻓏 *>3 ե /6췜 1(ϩ"*㷥" ƪ *( ղ&6$޽<6ܿƓ8quPܩ`~f/ƏCxvIةdz_+绋Gqj>ў&]jK 緆GbR+ ͚/VT5 㬀KV<ƍ8RA㡀(NI( "" GT:/㚀1VI16ƀ GP/&@-򚀀-P>6@ʀ EI&"@/*E3 1:Ջ 685$/-+͜ "&1봖3(ơ /5㲠":+ƥ ¿ 5:ܰ&ư"<+(3ت15ش"@-򷘧1ƹAE՞&ؿ8N:"LLܥ >R:ơ*NIధ@L-Ƭ1I: ط"AAƻطչCL+컮 °5R@ͬղKN$㴩8P:ƥ շ"GEجƻ 8K/-K>ͥ GI$尠@R:Ơ/RLܩGW36TIե KR/6RCժ"GL+Ʃ 3G:ܻ"<<Ϳ18$ *8+"836<$*>36:Ϳ*<- 56ƻ&5(ջ ++¹ *Ϲ "ܿ ȷ ѷ ໬ Ƭܴ  Ʃ&㷞 & ժ &$ ƣ$ ޷  ͬ  㿩  ϴ࿰  ͷ   &(ѷ"-( -5$շ "51ƴ*8+ػ56ʴ *8/ ࿴58Ϸ-:/ ·"66ѿ1:+ƽ *<5˿8>$ս 1C6 @C&ȴ /E:ܷ8A$Ƭ *@3 ز36 &5(ղ1/*/ϴ&1( 㿲$3/ʵ$56$ֻ 6@35E>Ȳ -EI/շ @NA绩6NL+ƪ*GTAܰ@TL$򻡣 1NW>ѩ"GYL$뷜8VW:ȣ*N_L㰚@][3  1V_Iج"K_T(>YY:ͩ /P[Cܴ G[P$ 8YY:Ͱ*R`K޴Gd[/ƥ1_hIթRm`+뷜8hmIƠ(]q[$㩖 Gkj>1`oWաNm`+반8djEƞ"YmWթ Gkf35doKƞVq_$ܩ@km>&]sW͠ Gmf:찚*`mKơƿNm[+㰣Ͻ6df>ƧؿVjRܲƵ8d_3Ȳ*]hIմϴNkY$绹ط8jh:ȷ㽧*buPطƩRuf+뿹ղ@qqA͹ܻ"dvW޿ƥ Rvj:ͪ8ouKӰ&d|b(շ V|q>ؿCszPƣ*jf+˪]uAӷGxzP¡1k|_(ˬ]|j:շGsuIܿ1kvWͩ]vb/ֲGsm>࿜5jsPͩ]s[(հGqh:㿚5hmIʥYmW$شGh]31_`>ϩR`Iܷ8YP+Ơ&RT:թCTA㷚1LI(ơCI3լ5G<㽞"@@& ͩ 5@/ ෠$83 ȩ-3  ط/( (* Ϯ("ܷ "&Ʃ&"ϲ $" ܻ"$$$$Ƭ $*** Ѵ *-/(ܿ(13/ ʲ"186+ջ-:>3°*( ͹8IG51GL>$Ʒ&@LG1ѽ8KL<µ *GPG+ʹ 3GE/"@I< 1EC+">E:5EA(" 8A- 1A6 <>&5A3&><6A/&@>8E/*C>ս@G( ƹ1I: ѷEI$㿵8L: ʴ*KIܹ@N3ѽƲ1NE մKP+ʻ 翲8VAط ϴ*RP(뿵㻷EW:Ͳ ʵ5VN㷵ܹKW:Ȳ Ʒ8VI޷ջ&NT/² ƿ AVAֵ1RN$뿴GR6ѷ 8NA»&EG(ѽ8E3 *>566"-5* &/+ ** &$"$ µ " ʲ "  ܷ& ( &$֩ *("1"-66՜1& 1C+򰊏-/"GA͓ 6 @P3򩀊 6/*RLƋ*:GY:란>/1[P5<R_5㖀"A+8`P 8<V`/܏*E+@bK @>տV_+Տ*E(C`E @:"VW ͋1E$C[>C:&RLƋ5E @R3򥀓E6"LCƋ8E 8I+硄"E:"C:8E 1@ 㡊&E6 :38A *8ܩ&C: 3+ƚ8C$"/ܩ&C:*"ƞ 8E(&㰜"G> "ơ ƥCbW(ذ"YbAGfY+Ѭ*_fC㻠 KjY+ͩ1dfAشTkW+ƣ8hhAϮW&շGkf:1bkP ƬVm_: ʴ@dhI͹*YjW/ͽKf_>Ͽ8]bL&²&RbT3Ʒ@]Y>˻1TYG( ѿ&KWL3Ʈ@VP:ʹ5PRA&ػ*LTE-ȩGVK3 մ @VP: 5VWA$ͩ*V_I+ܴRdT/Ɩ Gh_>ա8hjK巄*dq[+ʑ Vvh:ੀGxvL*s_ ՚ du:뷀G~I͓-s_ 簀 bu+ ͓CI 笀"s_ƏVu/ 㩄8~LƷkbմ إVu:뷴 칚8s|Iϩh~_Ѫ㻩Nxj+㰩Ͳ8kqA࿽"]oPͥ Kh[$㰥8]]3*NY<ͩ@P@ഩ1GA¬*<:"Ѵ"35$ܿ "-- ʹ "*( ƽ(+( */(*3+ *83"8:& 8@/ 1@5">< 8@+/@3"<: 5>$ ->- 8315 (3 -  ("                   ѿ"ؿ  " &ʴ(շ &&㿲 $+ʰ+&ط *+®- ղ **㻬 "+ʮ+$ܷ  &+¬/"հ ++㻪 $1 ʬ 1+ ز -3 &5&ͪ 11㴠-5򿡡 $5+թ 13緞 *6$ƣ5/㰞+6 ƣ "6/خ5:  - ѩCK3  巕8RCƚ"RT3  ީ G[E򿏂1]W+՜T`C밂@dW(Ƌ*]b> 㞀NhT 1bb:  Ֆ RhP 쬀5b_: ʏRbK 㩀5]W3 ƍL[Eء1TN/ AN>"͞*GG3㴓 6E<(ƣ8@5( ش&8<3* Ʃ+::3(ѹ/<<3$Ʒ5@>/Ŀ"-II+Ϳ@N:¹-LE ͵AL3 㻬*K@ͪ@I+"㷠-I:&(ʡ>C "5箘*E386ƚ 8<5G&穑&<&&KA Ɩ33 CR-멑31VIƖ*&N[3쬓&8]Pʚ"V_:򰖮 EbP͞*Y_:򰖮GbP͞ -Y_3򲘮 G`N͡/V[/G]Kϣ/VY/AYIѥ*PT+򷡮>VEթ(KP/  8PCخ GP3ƥ 1NI㲧 CT:ʩ 1RL 㴧 GW<ȩ1RL㴩 GW:Ȫ 1TL㷮 GT:ʰ 5RI廵EP3ͷ5NCCK/ѽ1I@AI+ 1G<@C+ 1C:">>$ 1A3&<: 3:* &5+*+ &     &+* *6$"<68C+Ϳ1K<ػ"GL( 忴 @V<տƬ1WP ذR[:ƹ뷣@`Lյ ʥ*][(緵 (㰣 Nb>°(&ơ8`Pհ/ةV[+紮 1(C]A-6թ&VNժ<& ET+봧 8: Ѫ-N:ƥ-C&뷰@AթC: ϲ-A$뷣8G$뽻8/ƣ*K:ѽ(- ժEE&㴥8L5뿥*LE ƩGN5 Ϯ8RE Ӵ*NP:չCTE&ѽ 5NN:Ϳ"CPG/ȹ5KL>& ĵ&APL:6LTK3© *CVWG$ʥ8P[V: ة-G[`L 밍 8Tb[:Ɠ-G`fP؜ ]o_+㞀-RkkA "CdqW͏5Yqf:례 *NkoI @boW͓1Vmb3멀 (KffA @]fNњ1TdW&및 (K`[: @[]Aթ8T]I㷠1N[L&ƪ&EWP-ѵ8PP:µ /IP>Ϳ"@NE$6KI-*EK:8I> /GE+ @I55E<&@A&6A3(>86<$*$1+ƣ@5*5ܬ8>6(*A- /3թ>:"5 봣3A&1+ʩ>3$3㴪5:/$Ȭ6+"( ܷ /3" d111`3[Y^xD<3fKfF$+͘XfK&X!ߌ313dd~f131dLԿ31(s$D> $ dSyHI+߀f1 1,! @d&1&13&#$K̴K3XK&1F 3&K$9)$\31&.13K31+)3f ;1,3 `ڿ9 1)D  &0 1@9 6! 3  13F1 & < + #3+$$ ,<L $ $ 1,$ 3,      3 $ $$K 3$ 3              3 3+@I9&L X +$3&6K$ $3)C$ +1,)1 &3 #3#$H 3ڭ>+3F+9&!0! &V313& 8 >1+L1 3ՠ&$61a3 3&!>LK( 6 ,033 $H4+! +  ))1#8 & )0$1  !  . $$ ((30 [&)& &F     $&   19 & .$ !$ #    $& 1 6,)  ! 3$!   $ &     ,&   11K d \3d倲~113ԿԚ$d9&dd)̍C3d13n1K & L&Y+1جX1d!d lfYFL3F ̭30#cLϢ1 1 @̲ \@L <n ǸD(;(18 L3&  1+>̭L>#DH@x;ښ(A @  4 # +q. 1$8 & $!1+ 0 &   3  &                 tecnoballz-0.93.1/src/TecnoballZ/musics/area5-game.mod0000664000175000017500000015701012412501752021536 0ustar brunobrunoarea5-gamemusic from reg@@=J@j@@V@_* Original format: *_* NoisePacker_v3 *_* Converted with *_** Pro-Wizard **_*** by Gryzor! ***&   M.K. 0@0@0@P:@0@0@0@0@P:@0@ 0@0@0@P:@0@0@0@0@P:@0@P@ : /  } S/   /        ::S 0@0@0@ P: @ 0@ 0 @ 0 @ 0@ P: @ 0 @l@0l8@l00@l(0@Sl P:l@l0@l0@0@0@P:@0@P@0@0@0@P@0:@0@0@0@P@0:@,0 @ 0@ 0@ (P 0@ 80:@ @0@0@0@P @ 0:@, P@ 0S@0S@0S@P@S0}@0S@0S@0S@P@S 0}, @S 0S@0S@0S@P@S0}@0S @ 0S @ 0S@ P @S 0} @ PS @ 0S@0S@0S@P@S0}@0S@0S@0S@P@S 0}, @S 0S@0S@0S@P@S0}@0S @ 0S @ 0S@ P @S 0} @ PS @ 0@0@0@P@0:@0@0@0@P@0:@SS 0S@0S@0S@P@S0}@0S@0S@0S@P@S0}@PS@ 0@0@0@P:@0@0@0@0@P:@0@  0@0@0@P@0@0@0@0@P@0@P@,0 @ 0@ 0@ (P 0@ 80:@ @0@0@0@P @ 0:, @ ::0S@0S@0S@P@S0}@0S@0S@0S@P@S0} S 0/@0@0@P@0@0@0@0@P@0@P@@ 0 @0@0@P@0@0@0@0@P@0@ 0S @0@0@P@0@0@0@0@P@0@\@@ 0} @0@0@P@0@0 @  0  @  0 @ P  @  0  @   0@P:@@0@P@:@0@ P:@@} 0@S P@:@ 0@P:@@0@P@:@0@ P:@@} 0@S P@@@ 0}@}P@}@0@}P@@0}@} P@}@ 0@} P@@S 0@P:@@0@P@:@0@ P:@@ 0@ P@:@ 0}@}P@}@0@}P@@0}@} P@}@ 0@} P@@ 0@P:@@0@P@:@0@P:@@ 0 @ P @:@ 0@ @@ P@ @P 0@  0@ PX @ @P : 0@ 0@ P@ @P @P  0@  P@  @@ 0}@} @}@} P}@} @}P} 0}@} 0}@} P}@} @}P}  0@ 0@ P@ @P @P 0@ P@ 0P 0}@}P@}@0@}P@@ 0} @} P @} @ 0 @} P  @ @ 0@P:@@0@P@:@0@P: @ @0 @ P @: @0@@P@0@0S@S@P@@`0@`@P@}`0@`0Sc@S`@P@@0}@}@P@@0@@0@@P@@@@l80}l0l(@}l @lP@l@l0@l@l0@@P@@@PSl@0}l;@l8@}l40Sl0P@Sl+0S}l(@l$0}l @Sl@@SlP}l@l@S}l @Sl0@@0P@0S@0@}`@S@}`P@S`@S@0@@0P@0S@0@@@P@@S@0@@0P@0S@0@S`@S@@`P@S`@S@}`0}@@0@P@0@0}@@@@P@@@0}@@0@P@0@0@@@P@@@@ `0@`@P@}`0@`0S@S`@P@@`0@`@P@}`0@S`0S@S}`@P@@}`0}`@}}l0@l0P@@}l 0@l @0}ll@@}lP@l@@@}l0}l @}}l @l(P@ 0@}l 0@l@ 0}ll@@P@@@P,0} 0@, @} @,P}@,0@ 0}@, 0@,@@ 0,0P}@, } 0}@,0S 0@, @S @,PS@,0 0S@, 0@,@ 0:,0PS@:, S 0S@,0@ 0@, @@ @,P@@:,0 0@@:, 0@:,@ 0,0P@@, @ 0@@:,0 0: @ $@: $@ $P @ 0 @ \0: \@ \ @: \00P\@PP\0@\ 0P\@ >@, }0@o@l0@@l , @l@@l@l, }0`l0@, }Pl l@l, l@`l0, }0l lS, 0`l8@l0@, l(@l l, 0llS, Pll@l@, l@ll, @@`S`}, 0@`@l8@@l0S, @l(@@l @l@, 0@l@l}, P@l@l@`S, l0@l @`@, 0@l0@l S, 0S`Sl8@Sl0@, Sl(@Sl Sl, 0SlSlS, PSlSl@Sl@, @, @}/0:J J J: J J: JJ } 0:J :J :J J J JJ } 0:J J J: J :J 0J} 0:J  :J:0 P\0J\ 0\J \h 0J hJ J J J J Jhh 0J J J J J J Jh 0J hJ hJ J J 0Jhh 0J  J0 P<J< 00<0\J 0@/0J J J J J JJ @ 0J J J J J JJ @ 0J J J J J 0J@ 0J J0 P\0J\ 0\J \. 0\J .J J\ J J\ J .J. 0\J \J J J J J J. 0\J .J J\ J J\ 0.J. 0\J \J0 PPJP P0PJ @/0J J J J J JJ @ 0J J J J J JJ @ 0J J J J J 0J@ 0J J0 P\0J\ 0\J \. 0\J .J J\ J J\ J .J. 0\J \J J J J J J. 0\J .J J\ J J\ 0.J. 0\J \J0 PPJP P0PJ >C0+7   ;@;@B1+'+ (  ݶ" ݿ /)H6.AcbV`bbOOcTV\<>H**  1+*@+4:4'  ǵ#$  +(><;-"4-JB+ (((569@;(   ڶǿ ('.>F:6';FB_IQZQ>BFB."6)  "'-/"  ɻ&33$  +4HW\1>;;JJPJ>;;00/+ ' $$+#   (-"#'  ʼ(.*  !#:CDCNVH>7<1*&  $&   (!!&&!ι';* '6FB;)-3=6BPF661'!ʾ&!-&  "*-)))&0!оʰ1<6  -:.)1==IHIAB;+޽˼!!())*./=//55.ܻȬ (3(&0;AB90/1:@>BDB>9(ֶ  #((" '$ " +0-9=>:74&"žñ+5+&"#&)'&.(&-*(#!&&-0/+-.(+13$#!Ū  &#''*(/.499637933-+0(45-&'-.('#ķ "'$ $'"')"&& "&)-*-+*''&$/3( ؿ    !$()-)//)193/+-3147/!")+#! ż ))' ! &!"&&()()+././0/*(&&)0)ν #&)(0*..0*31.*)-**0&$"ʿ&("#&'$#'$#'&('***.0-'##&*1- ʯ  !!$()+*/+0//**)*$+!!# Ю'+  !! ' #&'))&$$(֬  "$$&-('(11.(&#$$+$!"۽ $*#"$$'"!" !!# ! ܼ   !&(!!&#׾  *.( $$$   и     #$(" $"λ #+)!(##  &   '    "ھ    !                   "       '##'                                                               "    #   %  "#% "#%#  %# ' ""#'#"('''*##% ***+## %---+  % *000*" "# .322*"""    2633("##ļ#5863'#%# 㼸 *8983'%% ܫ-9<92'%' ʟ .>>90''' "2@@;.'(% 覣%#6CA9-(("Ҡ  '"'9DC8+*( à%*#*GC3++%վʹ '.0*0AIC2++ Թػ+23+3DK@0+(ոɵ#068.5FL@.-' ҵԹ *59809IL9--αƮ-8<;3;KK9-*ǮƳ "3;A<5GLD9CNA. ɮ  '3CLNDGL9 ⵜ"*0GI3̿إ *06@NTUF@GC*Ŀɍ".59CRYYKAG;"ܼી(39AIW\\IA9+ǶҪ'5>CDNY_\K>2' +9CGIO\`]K6*" ⹼Õ"2@FKLR]b]D-% ҹ (8CKOQU]b_@' ʻ .IRZ__]YQNI# ϗ%8CLU]`b_TKLC ܹ * џ.ALT\`dbWGGF5 ໏ 3FOW]be`QFF@2Ԩ5KTZ`ddZLFC9.ݾ 8NW]be`RLF<5*̭ %R\`d`TNL>5-%-AU]bdZONG95' ڪ (0DW_b_RNNC60Ɵ -5FY`bYQOI<8(񵟶08G\b]RONC;5⣨ 29L\`WOOK>;*΢"5;N]\QONC;5 %6<(׵ƾ'8>QWOONC<5 Ǹ̹ *9@NONOI@<* ߿ѹ"+9@KKNLC@6 չ"-;>DKNF@@+ľض #" 099AKGAA9ڸ'""063AIAA@+ڸ*"#222CC@C;" ض* %-*3@>AA.׶* %('39@C<#Ѹ #( ""%.9AC3̹'' ".>C@*ľ+#2@C9  - 6AA-  +';A<# ׿(%+@(*6@6  % "8@.  '9;%+<2 -;*  05     2* -  "       "    #%   '(    ++   Ͼ" "-. "%'00 Ĺ (("(33" ױ'.+%*55ʾ##+2-(# +68Ѯ(260-'"#+86.8920+''-82ڼ"3<933-+*+6+ %8@<660.--5(;C<99330-0 ʫ(@F>>;6630(ߦ'>D@A<8960(>DAC>;;92 ؝ (;CCF><><2𱚱  *9@DF@>@>-՝%-5ξೢ 2(+.3-5CCCDC9Ģ%8.235+5@ADDC2Ѩ'<5563+3<@FFC'ܹ+@9993*29>DFAբ .D@<<2+06>DF;  2GC@>0--5@DD-̾ઊ#8IGA>.-+5@D>#ľ̕ *;NID>.+(6>A6ܵ0@QIF<0((8>;.׹̟ #3CTKF;.%*8<3*ɼճ*8IUID9-#+86-"Ü .IYWG>.%'(%ƿϰ(5CN]TF;-%%#Ǒ  -;GT_QF8*% ή%3ALY]ND3( عÄ+9FQ\ZIA0'ɼǦ #0@LU`UI<-"(6DQ\`OI9+  .'  ɍ #3COY`YNN8 ծ*9IU]bUQG. 꿑#0AOY``QRA" ΢(6FT\d\OQ9ꪘ"-FR_eeU>0ɾ 09<>GT_e_O>*չ"5>@AIU`bYL;"'8ACDKW`]RL8 ڳ +9DFFLU]WOK5%(%.>GIGLUWONI* ܸ-0*2@ILKLRNNNC% ̻2606AKOLLKGLL<"ü "6>68ALONGADKD6#ij '9D>;CNQNA;CG@2'>IF@DNRL98AA90(@NNDDLQF86;98*һ %-@OTIFLL@85335԰ -0@QYQIID<93+0.ѫ"36>Q\YLD<<;-'-"İó%6<@Q\_N>6;6('( Լñ(9CCN]bO8560*'ɼİ(LQNONN8***#"0>LTLFLL8+*(ϻ徨 %0>NTF@KD6+* Ƽ弫(3@LQA>D@8-( ׿㸱+5ALL>;>A;-Ͼݸ -6AID<5;A;*Ҽ #.8AA@;0A *35065.2<3 #+20.32.29 '-.*-03.2%(-((*-3.'"*'#''-3*  #( "%'00  ##""'0 #*+  *   #               "'    * '.    +.  #0+(3% #-6"'06"##"*35 ' (%#-62Լ#*#%*%'29+*.'(*%*5;(ն .3+++%+6;辻#5900+'.8;ϵ (8>50+(096 ༶+3*+39+ڸ((2CKD3*-36%ƨ -.5DNI3*-33ض"366IRL5*.3-Ʀ(8<;ITQ6-00(Ǯ*9D@IUR;..-Իƿ -FQ\WGFKD*Ɲ'5CIQ\\FCKD+̳Ķ +6DLR\_G@IA+ռƶ '.;FOTZ]G>F@%ʢû+5@6Ǒ '5>DLTYYRK<;'̦Ĺ +9CGNUZWNK>5̱ø".INQUZQGK9ƘԼ"+6CLQTWYNFG6ժ (09DNRUWUKDF'Ì %+2AAFLRYZWD* (26CCDIOTYZR;#-3NLGINRW\R8"Ý29FOKILOTZYI3踘'8;LOKKNRWZRC+ڮ .9@QOILOTYWK>ԥ#5;FRNKLQTYRG6 ԟ (9DTQLNOTQIG9峔 (;>KWQLNQRLGG*⭘-<@NWQLNQNFGDܣ 2@CRWOLOOGDI9ң'6CDUWQLNIADG'ϝ*;DGWWOLKA@F@ Β  ->FKYWOLC<@D.Ą #0AGKZWOG<9><尀# '5CIN\YN@69>.'#*8FIO\YI8598җ"+(-9GKN\UC558%đ %2+0;ILO\R;332 Եĭ*603KONTD83+īι0>88@IQKKC923C>9@IQDAC9(վ3DC;@IO>@FG99C.ܱ 5INC@C@86<׮3KQF@;693%ϰ 3FTL@339'Ƶ 2CUQ9-05ܿ "0ATR8+.Ѽ"0LPLVu|un`QNLL@0  ʨ "+.05;FQW__bmw}~|~xrlh`XWUPB4-/) Ľ !&,374+)&$  ¾           "$'),//0139=@?>BIJMQU[bggijjnsvyzz}~|z{zyzxvqppligfecbba^]]][YXXXUSQRSPNLJHHJFA@@?<:864100.,,+)$!  !#$'+-0457:<=>?DEGJJLNPSTWZZ[^`adfikmpqrttvx{}~|{xuuspljgdb`_][ZWURPLHFCAB?<:752.,&$! ¾  0@ =9  "(@ @@9 @ 0     *     "        !((ؿʼ+1?=/8?D,*1,ഋ@9 <"[DrU[@U ?@صHOP-?4?x]P)WM4 ĀطBb5?t{XG`A5" ٪ %ʠĻĠ  ?8R'WpV<]Azt-A5$Ē誆Ԁ   %@"+UX WP.3p "57   %DҌJ0Ћ ȭ $  /745@ga,(/F"+XG8+  !Ԑй   #j0 =nP ?0! +kj8HM8("  ȱ )ۯ, .B +R %?H!' K61 Kz** 7 2  ?D5 ʿ0ʼEOL4( G0 ##GI ɛ2' 7:$"L. ȕz(' ;P-:Y (. M+(/ڤ[R2sTM$ ) ] c@&[pS( !:-/4= !1=7 ٺ'MKV K,'MX 5):5(,ج( %;8#5⠿cV9J  - $ ?0в=1$¸( 7U' =8)?B"69" M2Կ "%  G$%)6+ 1 $'iM$+!/$;N(+ 8ȶ=*! ) /Y9#( !"  0"2贵 15Ĝ=$:6 ' kp   +/$' #,!%9'"آ--H >2 >   + 1(&/"J(  ! & ܿ70-, #    ' 1*&(  -:  "D*    .  *#G5 '!  4 !(!(7# !"  #      Ֆrsd*SqM gѤJuz^ DcK̟jQֱ"]sh`.P3ϳ>dKڭ7g\K +) ƺ#**#%겝,KW$% '!,  #3 +1&/ õC>Ī>+&7G-#ް4K/M9 3H_?ȠZY(ؼ1D(޷'Z\Y軠"tfԾ,4*Ѱ&ba^۫0}gδ̹'#0 û+`nTďm|S۶An}vWR [R牀LKӭ/lj\6ԇFvY9U񹜍ckQ2韢/epP18ҳUrS2 ĵ1T\4?wd(ƒCfnV4-BA#Rf8ۚCR^M8!)$Ѿ ha7HV@,+"(乻E}]̤)09M:/C6(՝ik媣ѿ-:3D/%'KN,콍#a笠717:7 4SY0򬂃*_붩Ţ?9===?S[,:LധAT=<86@PV#80۳ïH\890=ø5NR*쳋;2ں̲M]A=93#QF&촐U0ͻC^O>>J?ஒYi'ֿ.JUMEC3ܵYEǩ#9MDI4&Ҳc{4ǯ(7AA:#)š9zz.ɷ»-;8?1 /%귘F~m(%.=)5$.%鹗ItY+ܺ,1>'+ "0 6aR.༺!"$  @E+    /A0   (?1    (=0      !:2   1% +'( # (  *' !,+ "%                     %   )&  $&$ &," $!            !                           %&+*! )$  ,% ( +!  ( $               #   %    ( $             %  $ ! $  ( "      "                                                                                                                                                                                                                        tecnoballz-0.93.1/src/TecnoballZ/musics/area1-game2.mod0000664000175000017500000014517412412501752021624 0ustar brunobrunoExtended Module: area1-gamerst's SoundTracker }   @t='F*:F.='F*:F.='F*:F.=3F.:*F.='F*:F.='F*:F.='F*:F.=3F.:*F. @ <=):8F:,<:< ?F0: :8 5=): /< *A,< %:: 8 F0: < =)< F: ,8 :: < F0=5.A0.:,0F0<=):8F:,<:< ?F0: :8 5=): /< *A,< %:: 8 F0: < =)< F: ,8 :: < F0=50A01:,0F0 @.='F*:F.=': A*: :: F.: =': (F*: 0:: @F.: 0=3: A.: :*: F.: ='F*:F.='A*:F.='F*:F.=3.A.,:*.F. @0=)F,:F0=)< (A,: (:< (F0= (=)F< (,:: (F0< (=5A0: (:,8 (F0< (=)F,:F0=)< (A,: (:< (F0= (=)F< (,:: (F0< (=5A0: (:,8 (F0 @: (='F*:F.='. 0A*: 0:6 0F.5 0='F6 0*:F.=3A.:*F.='F*:F.='. 0A*: 0:6 0F.5 0='F6 0*:F.=3A.:*F. @V),0),0),050,0=)F,:F0=)F,:F0=)F,:F0=5F0:,F0 @=)< F,< :< F0= =)A< ,:< F0=)< F,= :< F0? =5= A0< :,< F0=)< F,< :< F0= =)A< ,:< F0=)< F,= :< F0? =5A0= :,< F0 @=': F*: :: F.; ='A: *:: F.=': F*; :: F.= =3; A.: :*: F.=': F*; :: F.; ='A: *:: F.=': F*; :: F.= =3A.; :*: F. @5=)8<F=,<:85F05 8=18 0< (A= 0< :8 5 F,=)5 F5 ,5 :5 5 0F05 @5 0=15 5 A5 05 :F,5=)8<F=,<:85F05 8=18 0< (A= 0< :8 5 F,=)5 F5 ,5 :5 5 0F05 @5 0=15 5 A5 05 :F, @8 =*F.:6 F1=3A15 :F.8 =*F.:6 $F1=3A15 (:F.8 +=*F.:6 0F1=3A15 4:F.8 8=*F.:6 ;F1=3A16 @:F. @~5=)F,:F0=)A,:F0=)F,:F0=5A0:,F0=)F,:F0=)A,:F0=)F,:F0=5A0:,F0     @D5=)A A )8A :,A :=,A 8=0A A05:,A A ,A )=)A A ),A :,A .=,A 0=0A A 0.A :,A 0A ,A 5=.A A .8A :1A :=1A 8=5A A55:1A A 1A )=.A A .,A :1A .=1A 0=5A A 51A :1A 50A 1A  @40=)A A )A :,A =,A =0A 0 A0< 0 :,< A 0 (A ,< 0A 0 8=)< @A 0 @A )< 8A 0 0:,< (A 0 =,< A 0 =0< A 0 A 0< A 0 :,< A A ,A 6=*A 0A 06A 08A 0*=*A6::*8=,A 0A 088 A 0A 0,8 =,A83:, @>5=)A A )A 5 :,A =,A 5 =0A A05 :,A A ,A =)A 3A )A 5:,A =,A 3=0A 5A 0A :,A 0A ,A :=.A A .A : :1A =1A : =5A A5: :1A A 1A =.A 8A .A ::1A =1A 8=5A :A 5A :1A 5A 1A  @5 @=)A 8A 5 0A )A (A 5 :,A A 5 =,A A 5 =0A A A0:,A A ,A =)A A )A :,A =,A =0A A 0A :,A A ,A  ,=A A A :A .=A =A A0:A A A 5=A A A :A =A =A A A :A A A  @.6=*A A <A 6:A ==*A ?=*A A=6:A <A *A 8=,A A <A 8:A ==,A ?=,A A =A 8:A <A ,A 5=)A A <A 5:A ==)A ?=)A A=5:A <A )A :=*A A A 6:A =*A :=*:A :A A 6::A 8A *:A  @=*A A A 6:A =*A =*A <A6:=A A *A <=,A A A 8::A 8=,A =,A A A 8::A A ,A 5=)A A A 56:A =)A 8=)A A5::A A )A <=*A A A 6=:A :=*A =*A :1A 1:A :11: @~1=*.A A*1 0. 0:6A 1 A *. =6=*1 A 6. A*0 :6A 1 0A *:0=,,A A,0 0, 0:8A 0 A ,, =8=,0 A 8, A,. :8A 0 0A ,:1=..A A.1 0. 0::A 1 A .. =:=.1 A :. A.0 ::A 1 0A .:3=00A A03 00 0:<A 3 A 00 =<=03 A <0 A03 :<0 A =0: @)=*A .A*01:6A 0A *=6.=*A 60A*1:6A A *:,=,A 0A,13:8A 1A ,=80=,A 81A,3:8A A ,:.=.A 1A.35::A 3A .=:1=.A :3A.5::A A .:.: : : : 0: @)),,00,,=)A A )A =,A A,A =0A A 0A =,A A ,A =.A A .A :1A =1A =5A A5:1A A 1A =.A A .A :1A =1A =5A A 5A :1A A 1A  @F1=*.A A*1 0. 0:6A 1 A *. =6=*1 A 6. A*1 :6. A A *1 :. =,A A,:8A A ,=8=,A 8A,:8A A ,:1=..A A.1 0. 0::A 1 A .. =:=.1 A :. A.1 ::. A A .1 :. =0A A0:<A A 0=<=0A <A0:<A =0: @~1=*.A A*1 0. 0:6A 1 A *. =6=*1 A 6. A*0 :6A 1 0A *:0=,,A A,0 0, 0:8A 0 A ,, =8=,0 A 8, A,. :8A 0 0A ,:1=..A A.1 0. 0::A 1 A .. =:=.1 A :. A.0 ::A 1 0A .:3=00A A03 00 0:<A 3 A 00 =<=03 A <0 A03 :<0 A =0: @: 0):: ): 0,: (,:: 0: 0: ,0,=)A A )A =,A A,A =0A A 0A =,A 0A ,A =.A A .A :1A =1A =5A A5:1A A 1A =.A A .A :1A =1A =5A A 5A :1A 5A 1A   @' 03='D' D'3D' :3D) 06=3D) :='D) D'6=* 0:3D* 3=3D) 05=)D) D)5D) :5D* 08=5D* <=)D* D)8=, 0:5D, 5=5D* 06=*D* D*6D* :6D, 0:=6D, ==*D, D*:=. 0:6D. 6=6D, 08=,:D, 08D,:D, (8:8D, =8D, : =,: D, : D,: 0=:: @:8:: 0D: =8:: D 0 @S* 3=66 0D6 ,6 D6 6 .3=88 0*3:8 8 D8 ,8 D:: 0.3=: : )1=88 8D8 0*8 (D8 8 ,1=8 8 )1:8 8 D8 *8 D8 8 ,1D65'/=66 8D6 0)6 (D6 6 */=6 6 '/:6 6 D8)8 0D8 6*/=6 06 ).=55 8D5 0*5 (D5 5 ,.=5 5 ).:5 5 D5 *D,D @'=,? ,8? ? ,.? ? ,/? 8? '=,? ,,? ,? .? ? /? ? '=,? ,8? ? ,.? ,? /=? 8'=,? ,,? ,=.:: 0? : /=: ? : (=(? ,4? ? (.? (? /? ? 4(=(? ,(? (? .? ? /? ? (=(? ,4? 4? (.? (? /=? 4(=(? ,(? =.:= ? = /=== 0: ? = @p*=/? /;? ? /1? /? 2? ;? *=/? //? ? 1? ? 2? ? *=/? /;? ? /1? /? 2=;? *=/? //? =1:: 0? : 2=: ? : +=+? /7? ? +1? ? +2? 7? +=+? /+? ? 1? ? 2? ? +=+? /7? ? +1? ? +2=7? +=+? /+? =1::? :2:=:? @r*=/? /;? ? /1? /? 2? ;? *=/? //? ? 1? ? 2? ? *=/? /;? ? /1? /? 2=;? *=/? //? =1:: 0? : 2=: ? : +=+? /7? ? +1? ? +2? 7? +=+? /+? ? 1? ? 2? ? +=+? /7? ? +1? ? +2=7? +=+? /+? =1::? :2:=: ? music from reg(@ @4+ʫ6 "2]% 8TsͰ,?4*A`N(&8   <   04@L!;Zͻ긳'E) 8Pߒ%2-$ ,+5A'?nѺM %M0*  -     304%2S0ղJ N &,  +      $2 4 P 07 .  (  #%000.(   #!%E "    !    &5       !                                                                                                                                               regis parret(@ @иGOgTia.DTѻ-`/K堣] u? g 7`ooqWnlMӫ#$<.8?8q_Hf'8`7i@}7u׌#&5\N 3 =lY G_fF28  7L0"(D1( 0#MD &) 8 ' 0$ , # ?& '9G0 )"(68,G!(  , . 0&     $ 5$ "0 (* )  #  $ &%!(   '# !* ,? 5= &2  +# 1) * (  $  ! # %,)  $   $   A  # %     $  !#!  !     %                    !    !!   "    -                                                                                                                       (@ @2 +9 ̻j` J.r)OHyho`ɐ'0Xp=_ɰKl@'X|4&    $(  !  ( /  !/ D1 <$ (E )D#( $(#                            (@ @_fE#Mq_OA!7EPkQyyOp/!A:1OO '{8=M N q!i5Fak/c߁_IU+u oQaqY1)1eR)HA  n~@h%QQ)'9)` yH_?1ء_U9Q A{Ae`tI]|O)߱,]7ڱ;Aqka99h/N 1? O;/(#9/??e7/p)?q? Am9-)AAUa_!שOݿG #P ))" (wai.H#.OP7Ѣ1Qr_/@\A  Qst!XA7AxQp_ (9,Qy5l]O1!. ph_) ?:hq_AOaqI" ?7I\ 6*AaT{o#1hI)4 !)U|X?9!!P!!K|?!`qxA`/!$9p1YpG0q/ >_A21pxW1ApռQ!at+A-NMA1Q1&aY3 A9;!L _(A!)pQY//9o'5bmt!9a lT!!=ះP1IY!?H)G_0J ! 1G_ 4/k4\7o-!I8ٯ`OG%""'/1Gz_:$JA!Q?G9 ÿ!_A['P0 9[!w")qxѿH(!!_@!m)O%x!{G?юkHM_p!!_W3Lj!%^Aa_ Q`_/G #Lj 5v06)?Q!!!_ o?#%)X9 `A0!1@$7HX %%d !`e)A_ OQM,'IWMPѿL4߀Y(!&)P>Xp?v3M !+T%$$T MQ! RI";9$3;?EAT 'p/(X!A7D@>or;7/\A(G H8` ['1_`)>˿4$I?11i8Zg1)'/h'|T!K ':)15i 60%|O!<!Q5- T/ 68ѯp$/CP/ >1(4H'M2>L  h0I80!+0E$'$aO16:  1#88$^8 ߸_!c|1 E-_\1N2"G!QX)6_! 1!VN "'vd%!' 5$Y~->?'O9\`%/_!& 8>36P\ S!QL>./)%?!8:1/0%A{trdDh!,M)`)PL )B8G*!P:a9 8%&b!Q1PH\? ./!<.7M:9X0FS!0/-dpeA1Bѿ!YpsN?(',7!a!8m&Y')YVoEo_<0?Q]!J '3O 1g d/QY@Hhy 7 `ѧN"7\]-+t<9(8=#?  + ' WI4= Q h{O!/,)` C;M 160%yKx1a1)95O9 dY蟘 A)R5OaT;@.%Օ\/U+X97%36?A=Ui߀dUuQO )-7 T@AQгLU)`SO@E821;!A9=2!!%9AX!,N"K1) 4!9;+B5 MM1A $!<1$Y蠙6N! !o!!82x L6J7/! !_O4p6o 5IA) PE}%!/P!!'1 O P 11m *Qظ_} %,/!AU;%!# > /OGS%'/48 QW 1 $7A5??5T9'wAPyA _WA;΂a%O(m1\B q?8/#g1!5/,"% I4Q  /&,7\/d',LK:1/H!E9)Av* g!<,%!x'A7B B @68?8! <<$!9@0E< @)-!+ 98@ -5;8 E )M% 1))!T 4'!0 %7? )V!J + ):Y9   56# +!891?7> A $/ $ T  %:% 9-%>%?!   +  -@ 0 %+   0%)1  (   49++"#.%" )(@  @2'> ! ( P OP8H /0@<ȸ4SR!!$P8 p / hٛ'I1`0"! <\ 037%;hK!\ (pP emI؜oR# P4шSMPR'IXɘf K* *&PHh>yXXi3I5ZvD5ܢM3 ?9 Uh`8J0h8%`,\ `WH(ؿN߮VY 1xG  @H 8$S漽B@p@I< *=05A1IBE % @'X$ 3-184ܔK>L=;X;UD"3O(\F9 !*A !-ܱ.(, 0 !! # 7 P= 9<- J'+*6 *&% +6+@B!/+ *0( ,  &! ! 337 "( %  &TL63  :$. 18+  %#! !, #$7%. 9  "#(-%3 .#(.'  8 &D48 $4 4 )*0)-%  (   9%  , && % $1  '/&$  0 !9 $(    !           $       /    ! ) (        (                      (@ _f:5#-/9@41 %vW)9s!Aup+!  !.Q!5 %O/1!A?$%'#L 9W)y? =AGHAI<#)]80Q!Y3\7H/ #7) A D!913!!/ A1 5d/!,@G !FY1/CAZ#7))@+'8!a"+? -35e =G((j8%'2G)X!"$ )?!'!I% U ,755- 9+7.3. D  %h )B1@%/+#@C #B#//+ W-/(O+/(Q>'Ol A, !R(@/=#-E  /6 1" < )%   +4 #4 D EB 49!3 )-% !H% 1#5CK "0A)  57& 0 " /7% ;   3) '! #  +)).#! !  10! , )  &    '  #         '        $                                         (@ F@a k̙E8)[gH/Y\{wǠaeZ1wɻ?-|gxϊSC\ջhQ#-C `X=&ATT#%BPA%! .98#."7رgidO1鏰q/ICOhyEgXmLWs`dc1{xd7wh雀o.An)]^MM_M_%h[9' ?RL3-HI- %9T)=<A-.E ?% ) < <#-$  &3. 2 1  $* ,%  $$   $*&* ( (,1( &" ($ ("" ("&(  &.,"8 &!0,0(- $(##*,4 &&  8&8  04 '&3"  ,$  .&+" &)+*-$ $$(  $,($#) #,)#) &#(&2&) )$(' #4,4$ +/6(* ,,($. * &0& $  ,  (  (&    $0 , , * < '  (   $$     ,. *.  0(      $ /$ 6 (  $! 0! , ('  $ % ( , "*   ,    "    $#                                                                                                                                                                                                                                                                                                        !(!(!(!(!(!(!(!(!_* Original format: *(!_* NoisePacker_v3 *(!(!(!(!(!(!(!(!(!(!(!_* Converted with *(!_** Pro-Wizard **(!_*** by Gryzor! ***(tecnoballz-0.93.1/src/TecnoballZ/hires/0000775000175000017500000000000012412501752016734 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/hires/Makefile.am0000664000175000017500000000047712412501752021000 0ustar brunobrunoNULL = pkgdatadir = $(datadir)/tecnoballz/hires dist_pkgdata_DATA = \ all_sprites.png \ bricks.png \ font_score.png \ game_fonts.png \ gigablitz.png \ head_animation.png \ menu_fonts.png \ paddles_1.png \ paddles_2.png \ right_panel.png \ shop.png \ small_fonts.png \ tilesmap.png \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/hires/small_fonts.png0000664000175000017500000000324312412501752021765 0ustar brunobrunoPNG  IHDR $PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYs]E|IDATh횻u+1 D #&t6@1#װ*!;xMlo㽳8~C-t"p) qԿ+AK9~;.|g@phz+V, vȀ׏}ҿk9HP~Tz~!4Gh=z[CFO7so p)17^ 0CxWc3"갱7^Y @xk^ O͠ 8dl/6Bz{a г}e|bKB~Cw 88ap~5A4mOs%^D- T@CWߟ<<2>S0RK(1aYhCw`5ԇFp7@>p^fJ?O>?̏/EK(K*E3>凗w;V*;`_@> N`ġ/'p>ۧ?~M`Y%oMХD82_;s菉p>?ZB>H#k}W't(?G'ShcK K@AO Oс8i/ >O ;0B+CplIENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/paddles_2.png0000664000175000017500000001362012412501752021301 0ustar brunobrunoPNG  IHDRbZPLTE*~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZC~IDATx]AkW&]h."W?D8-"a8$C- !8IBkT>{7yoycs|ѕߍ~OQ7|9 \O¿?}>&|OzV+˃Oŗ#>6~K J>n[Oχ_O6 |Fq_+Snn's",'9uOÁo' D>Q̯G.>4|9:c'Iu:.)|8MdȧSMnk1F >cR[c߀O&I|ڗb]op _15||m?Os%h|-$c|B(k'i> ,l87`CI|9Os&>&|Or+|-)r|Μ_||?Oߗ|>4|9Nr5N-OÂo'$>^F|0SOZs5||?n{Eq/>4|9Oso | |>Y')5h]F|-irt5||?v%8.Vx2_$ZW ~z><|OP2MnNŗ#>j>M'X'a7 ~e;-i/sIo | |>Y'YZ mIǏǣaHs pi5F/jOX\@>2q>)?kw3O_O9n޺520ʟW 돫G&Σ1gCW4S|Xu#1sO{{ssa}Rff[E,jOX\@>2q>>VSa<3T`1O-pe}>aq"yt>F |HJ>LSaS~76>ïa+չX~FYNIuB"yL-𱊟+g+9{<k8 _Gph^p>gi|VCR{colºTr؏읒VkEj3![c?V|>+Etս0KCŕp/ʲwJ\'?^d 8 )Y{^7773\{"jOX\@>2q>O;S|Xu|x*> Zd{WRՋ #3!+Y?V|>޾/a p RՋ #3!+? c?V|> Qѣ0G߬e{C(B\'?^d 8 _g?S|Xu\zDoNNNtOn\ OD q>z|d<:#|>$|%ʛWw FG]nlw\B\gTe"#yt>F |HJ>LSaS9 }I x"Hٕ~=`(|}>aq"yt>F |HJ>;ǙÊçTmAOx]j}>aq"yt>j +#8C>s>$|52O_O &_~<>ee&?laͅBiiia yHxlK_ ~_9G5P''C),"brf0{ef5P''Ctx+ ? ^aǬYmOOiaDYPDLL~@bxcӬj~F[E4` ʎP?f7P jeV~@193 YMs΅o~r?Tm|[E4` ʎP?f7P j~keV~@193 YM0}Cܟx,("&g&?WvzX<1iVIo~r?Tോx+ ? ^aǬy̅o~r?T(əh@?Oo|Cܟx,("&g&?WvzX<1iVIo~r?Tോx+ ? ^aǬY'--> P.,"br3{ef5P''C^(əh@?Oo=·ŇZ??.EYPDLL~@bluxcӬjq'y& Ľ mf5P'Gޟ{?>9d4a ehf?`ŇZ??|!'g? q/C~@=,4ݷ->w'ޏO?9M;9aqǬYmO?~|rəh@˰U\1q\P'G X3`=gπ=s X3`=gπCO<~@^Y;T·ŇZ??|!'g? q/C~@=,4ݷ->ޏO?9M{aqǬYmO?~|rə];~@7r}i~@~@q>3Є ?Woujq'y& Ľ mcӬLw߶P'Gޟ{?>9d4a ehf?`ŇZ??|!'g? q/C~@=,4ݷ->ޏO?9M{aqǬYmOOaex=jt&~|rQTn |?exَPK4~j4K˭rs'X?[)O>}X[\Y./_*غۋ^)U{rgyr}Sߨm}jey?Ղ{KFͰ~8_}SEs~u= y_W=>ueO^!@t'wN`vwXL[gg sg~XWSPiNӏIC`xo;^' Лt?oxO *8[!\ߦHX尷ښ!& XEwC`9+{ww+]`}C~G :t5C  B/A/0!@C a @17?ςBtv ,/6>Yj3 PUCUaji9=(׿[/[~ *{ ]^ܐ ߇0/C!@w~B`8d}y?/B^ 7C!C!@\r]ZC p B ! 0 Bx5q=P7Y; fq=?9ؕsIX*E!>Qq[;8;j[ P7=@_?6xN<@wCPy>| u^~9쭶f?vw !|@!@k@np  ! Xl;9_[6Eއ0ć!LB!@ХF=!L0 Bx ! >~?B`~C a @!4De., !@!@0~Ar/^C}|Ar/^?S* P$o%*wpa 8@ #5{_C.@0`/&R}Zܗ/  0zB ׀\! B k^!0!@C _X ÙEsM}apv/S*_ (!KT0!" 0C<\wz?-qu` 0C}p~ BNzC a @C a @,k70@ B`S4R H`S3k˽/:t|<fӻ/<}T }>Ds @ Xd!v}a@ /s> UW! /%(:  0@ 5 0@ @`B b!L B  /~~/ STP%P_}CD=`B T>\z :.B/KPd `C!@q B   !@1!@[`*קӡ P=T~AC+x};o~IENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/shop.png0000664000175000017500000026652112412501752020427 0ustar brunobrunoPNG  IHDR,PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYsIDATxmsٕ&/twe\'̪DwTČkds1mfS]3QeU˃fP[` 5At2A$)t h 2DDHw&`&(9'\kks{ݾl}S*VOEz eU~e ʿ 0(۽[o"۾r{Q@?Rn,<\wOWO^A'̑=ןQqlcއܳwNV+'2{/,\2'cw?pVr2P'+|+kuӤK&,p=D)v+B =5~f<zJVv^jKY}NiW^,J^gh?N56ugW6_9 7bbl6#H$BMZ[+\ڲ{gӥy#@dJX,&_tN'4cM:_4:1F)'Q K!d$,tQQQU܂(ʲ뻫JTo8mQI'bVHUm&jA-[|֘嚠W"`.OUUm@V?ZD@0Q~ET^j VW_e]T\CB@_Cwj2MػaJ-vXS%'݅`> t{0̧d"iA_d0HHÅ<Z&cIG>u?JqKձB }DlgIx}ͻ[U%BDžk- cl,`Uv Z_[`}-['`M "^VYf#:kP2;]ki4+nh67w`z$ [.&{0pr$$ +& H(-aYxIIbdjrKv]Ju,mNboT6bK1T$ Z,n `;-]qI/[w(`<&XSK?˫, I< G@||x$+LN4ee%$Sڀ6fH [@Tnn}76H0NLE4KK)& 7l`".EEa "-!/(lK@bV*E$Ҥv}!\-z> YPired;!YIȬK=c.@H32*#KPƚqTu/|\e#%KʦxgGfVTUx`C# Y!ϵM\{Yjd)V6o6PRD^~(Wb0Z (wP^Ž\,EBрͥI xIG"EmKoTnq'_ ߎ,l+sRm(2 N}U hȶXoՆiXN9]ۛML?|yRuYy )nj(0]TC?V>D=YIpVKb1FɈ}Y @xˠs,ֽ1&`NR X^JD"˛&8Aol~t\%}b(?,~ ޲)ޞCv6wYxIH6PQŃڦ>oC&QEXBG-wpQ >ߴf??==_]Zk[[WW_,<^V?(ϽME5pϲJe-n-ۻUYq&`B HZPXhkq]3 0 z]5K;+㺞Qڃ63sUX{g.>_# \f[?|DHh'dpL~lI`\z 8 `:;ӟ]3^gh8nY$޿>$+6XX,͞SLV¯>YY6a$"`?kڏG-BFgي]V?D(JEQ/N@FnU="*G |PT Ǿ3J.>| x C#`8ޏj+巻j c=6>(EB` +_m8qQHz){&LCJ:- x?v=@@$Xiu~adH<(}Gw巴O[7s0{FW"`GĿja+y >^ fo__Ő;B% X8 'MY 钓2SD;֏{%^38nP7/줢NNrx3Nff?ͯ6?çfYԍQLgPe/̇|x ?nFȏs}p?֏?a,Gnɯ`h5 Ap#xnݑR3'Xd}*oűtrK?ɵ {o`x?hJ,$ʻs8 .%][WcB~'dVp(]X#JBۡa&ᗭ\ ٌT*C|3 \ʡ*:>R5Pr93?~W&\V{{k&a6Z-"H.[cD@U5 jDB]V稩ݽU>NZ(9B,'v?.FgL~|Bm¬=ݴ+8; ߱APML &q<]KaU$Kl}{?ߗVq?& z&MC5AT|OgY`,.GCU.J@〞$0Կ}D>1?j4 ޻w^17.>Vj4/~7w͟|Qn8Rq-߰m/~ɡ٪34>+[Z##ً, E Qg,y 50icS~h^o^f'Y&Vl _K*_oܽ{a{QUUGx5Dg?^[B 5[D]5M:w}_ۑn1d6L'5d||!iǁMs>M|8G>(t!nbA/]O t=@ h\GfT&-ߜc31t4+Qn@ l?vV܏Ͻ[>@~|3Nd`a>ə=-j(O'|$;8#BC N(>/!`]_ZdXq|f_~{&8Hr$DѤSWI@sKg8\D^iTV7BONr~,5Kͼ KF'KE1??|7Epy_0٨Bn!\?oO%+Htgzt;IV68w7Zv ҉CM<е j5l?.L@.]=5JO~ ku%؃5g~|W~kʓg71I>AFQj)>0+H7򛰰d S af%sX?C]F!iKt285'0S%Oe؂i2{̪M mD |8CF׾kn12(MOڶ'ߕ_G^k{"o@~/Jq]+*/#ǭ| i;'Vځpn4rʕxÌMGV䨹Pk 2z" 7Mpi֏O>e7 ' , u dKM$Bsc%^, jBӇ@6ztCV|t9# =%! #}#藤WbG| 7{M0CabL t ⇲}M1'|pP){+Z޿w|43( a{>| 0AH5}X2< O_yqd_Xc|g9ePЏYJlv1:bJ!diReX(̚* 81qj1񉀊oI"o|/UT oe2/ N^Ͽ󯁀rg_~& B L3B~4#nAq-]! 8߿vm|$># Vv ?_gXDM #yObT=XVlHǮTe nfCj#wt8m|/AN/:{%ѸFK-"ஐtG%?Ws:VTF D+akRa} @ x"#k3a-'J|Zzfƒd 4E{QR/ȿ3>q`:B %`HtbLiT~0AkLW/!:(p%p'$^X+ Goaw?\5'ҶͯN Gh8;s~|W~P.ޑ}H>s8T_4̔6` qZP<0}@Г_ԃJ |%._ǁ~N3#`x#vo^} ȹyݞPY?<7ˉS-t߄H%ޞ tU|C hiC .>Ă/!U-)|NPW" WLrgp&&OU?8w(~Pd|42DÿJ-m5]0>F0<55/|!E!ϧ%yaf X8 |/VW?A=;w<vo"-&iL : XZ@q߱sZjӁ iϡ~+o 3dLj0_#VX'o`e.Yg㳺ďA~r'$P_A@9ϧDZ*>X_/A|~󃃅_NCfoW.cBU>$NэٜOfs,8 3Q B_LN9 `Hk߲f-M;|i2 OPYIS=g, ",r~42ɝ1qBv4Z8 h+吡#2,`$|kkE5ulh0Y&1s- 7{/zC$Gۂd #7guڌaEVښG _c}"`2{SZ؆)_v,}mt?D#۽)%R1 ҅d}'.NZ@ 4z\8ۦaD@[5ol?Aw mpXfiF6O46XWU%sg>|]fbBjpK|o_G@libgt NS O}DX2TV]Q%㫍|?_X ]JpjH!z}/u 7D'dVϔ]M3O>,0 t]0P}# wrTC Hݓ|9u2n#.tM>=(P/Gm6Wv@Lf|j Ge?"o( {*Yh3ah#t)݉GEه>'( ՂG+ׯ_/S2(~|]>?]4# ĝ*xhws&'乛8 C9Mpwt&fAM/>$AzQ&M쮞o$ޏ#`wьO$AfB'ah)2&qUć_idPmRSOxJ;*3k'`P?jzO? :$a;:] 7; 溆xZ=|;V 6o8<|t! 5ݲ֘ q0y!Pdjߌu:_3sr,>gj<6tv^+v~9X@aA2rV<9.% <\yֈHCIy CqyA@" &:-#Lೂ]@v-n<8׍~$YÜݧ}z?+rkGH1d(R)A~$AP]lڃ:UW?oWKZ@0xQhTy: ʑ){NTiji^?Û2FHA@Mfg23n6oЃ͞ 8d,.0cz>}JG~L* JjX ɝ .K@q~06t^x>7 NcX.4+9=>}eBfDu7@7}7xEkԏ_E`P~}D>+ &\lH@UY Y[z; h"Id< tf@~OaÆ! KiV bYP[>k?0k _έKE AGǟcəv8JV?>E~TLd[Evo]0;> C =~1;H AG\e r\z.q ^RpؙWy^2Pe@XaO@ntl51j^$F=Mxo cV+k.0wfC_=8>㹻p3w{`Yݜ5F2GUc|Fן/͟zՏ_3] m:SZex^>1s3=5viLggJ&]գ #b78<%2 ~Ƈo|tvh$h5H)]PU@@ x [pb5OQN!y׏,N F1A,9eS2Hr͇ABT,8O@Ut1Ma "|s } F'$.!&>VwC.E YXˌR:44ĉjD< ̩Z@t_gHŔ/> _TtԏxgoP9@jp'_{NsL5:`*<6s7#~,nt΂kȅӃW  Bԇ N:w>$y\ۋ[Nia-=$85]Z:Za9ɜFpaa)!̬#uy& % rP~̸{H7oq$?¸kr<|HwY/OZ[;:Bi9_AxÒ4 N8j`Q͆5, &ܨZ-j/T' ?k.C' 亮>&rY&Wq C쒬~YMoos9$Oxw7t; 6a7^"RRPHcA *&E`AN'Dr z6?`AUG&R^ [ĹjH`|-0 `HX&K{QݢVɠfu40۠O+) M$ x*&]gЭ/lYyYipܭ CmO?oluY}ˎ1G@&k$RǓ ^.DdJPH̖p  G@./N@.RX-,` q3cb|ws̨7 Wֈ[. ߐD/~#曮wF?.P[@z~ 0Yp)tE Aȹ4ZN򳣰2%}NJG]12,) Vx}5sM$ݯ\tIΠwX(/[I8oҗ_Oc_ER`ƿƒ!ςh< 5Dk%? _Sm&dʛeoÂ%[ʗ;ˀ~bR#~I,$Ed2"g/]#]n5Ǥ. =7?YI~Y hrO/zȎ$2/>NI#\> #|`!F@̒Ba[k ;K, S{J1=|HS%y/~S=[_0dM ڇdϒ?5 $ |g:q!D2Ymd>`_КQ9nvߛE::Gjb6FЄˬ d^';]~0>> &,WhrI>υL2qrb$ÏMFLb[IW?y"/eLD"QSE: oi|l,>|(Bj+Yw`>)n"n)mlFǡ<^p246I$- &$ @h}=,R$Tڇ?Rf_R)eϦ]n>zyDq¿S7R5G+(K מJj+F>_?֖Q7?л/|2_ X ojAU#cblK q~}'0˳ }Q*id?c?W.sղF!fCcƩJ6w5GkBTm^Rg sqwh?D =?nςH9M35$1Mo?Iݿ{|<Sg3>MpL=Nn5&8ciqFSct;!=|?6[ ˭ᣉo$JG(tw؋* >.)^0?`h_.'[BEg;qM!ơ$t #5 [SIlV RNl;0'*GTU4!gM$.\ό!ٓ`#.X;b9~jLE'F3tyI=HΔ$>Yv ތZsh򄐃Bf mU=-M3f!?9f9ϯ]kC>}}⾇ lci@#|ں6]|0;[aGlX‚p" OJb;)0쌅d=&\sGa@S8q'_~#H^p$w)ބԈiz븡!d0s!|# װ| .md4)kQz Ȩ̝ G"i>ɬA^+Aimӊiϑ\[059`r:\6>:ƿ_?fz"c0cMi8M$#)0g\fGwo0CQsD2/ L/SR*dw{S16 +RUL;$+7G=:vQ,Ra)ގ\c1!ݵ3.dxWJ&o682&}BtņS!ӍUW##Tl*M;iO\8UvC -&9$L,M2ӏ#p,5\_?`@7׏<>X?W:p:xI#bgtތ ;Bbh_rfx&y3lm4"*6rK9=wt he:IǪQ"`,T"G4q'[عܛk۳L~LM&yLB{` N14:C W} $xFC"`LI@*žDz,E5csfH- Ssx!nf&雩?\vB@@FCߏ%:ĕd&i}@ HJn+A@օT J*T:;;} @<@Uf+d ժue5֤&wwA3R`U\ ;p#S&N gY.v'c ΅KV'25Jd}J`@Q+hYftbk<<F1b-KۥӝfLc,4qn 8w80K#Kd&J_s0$QjY^2MA6HlrD'[EV7cP"\&,l)ԉ|Pl okѣ#R޲z#k^/_~ X-\{v: Ǐ~dp-?;]dr?Otzpxd+F,2 ?⣥VN0B'+ϵR.?Ubjq1ۣd+e'HN_]A"`sq躣 tYJ &I '>yjaxKG|{T4LJ{F@̆ioQ+-E?>tKD;[@|-=xn!x2{#`Dr^[>o_Ƣ̃Ew:pBt V<n 6R39+0Jwbb5Q~H!,+~ eee>)y<n|p{E܀` z:rSP0/CA'OeѴoӾ*Vs2D%[|,)B^;[@"S|c O褯~%"gM610~ʉǜZtQҤX;.| x~!?,J4%ϙeիuAC2,!&FmWfZ^ ,`|~[fW=  "`7) x>@LFC}) !I<'l@*GOmaٷQ|HT=8U&A@h^G6/GB_tHJe5HQf[ 氂' `%o?z= .|52jR7c nt [P]N;ӭmc$% •X\?Yq?I<#tC%egΎMv'G T'ء[k7,MJP$u:D@l|g ߵ3%Y@[wboK x2_Qք_DN6]ҫ{d%~şt}y][/XBJ_ah= ?Yښy3: $ >ǩdlpBïFF ڸy(GGҏ ."l'$07ə^KK- *>' _yZv/7%7!u%mIASA@dmd䘂ȶnU琐ؤ^paWe% hK>sҍV@|؏_L׉.ww ڊ)8vܤda]?ݭgFHRG@#k_~ (pw7qN_ԖOxG 42ᮂ>Wik " D`UC fpf>"vG%h Aڊw"8\qA$# bdkd>ҪGT*zY=A@mn,T8q֛}X3& 8|XFAi4Ŀ" &Jx<:jvƹGb 6\ѐ0 02!׊ qii9qz<i.<m.qßA(1mF:K Q4안 `6{QYv*iZCnxvUyB6*VjfZ1||X59D4Czk5]vԩz긢z::_|Dz{.ƍmXR uB:!fS|^M> 7Hq~J'H*#2a%y&& D%0g0>}Q]/ Oз& cK[ic:N1ZlэׯCdܸ֯jUC+Y;"H^U!"8zOߐ-d^eZ!aU_  snסƴzP׽*ZXnj:&bMJ cDգ5ӇfdCB(eIJ=b^y4UxAҥ!p)l` ١FE<L'A'1Kf6%b~ y1fYt+Q|Ϛ(6{ᶢEL/D`4я+d+20/Wy9%l& /K dSW"`K c0+aUW^d$[]w*f]eVjPy&cv15& 7j0(-P]1n/~V`ݸbQP7*g*t,J@:ǘ[x^@j`W6Ej|cKt,  3 /̏?& i*)̰.u!+E@Mߤ%mAô2YD]9+BVZ+Нm5.Nvp/L-]oEӈlϖpK;w6FyjɈDN/YJӪ*n'TzϯGVglnnڶXOTj+_rߟQJA(%MNb#I__ŋX~\D|5lz]">t/DQsxP#=lʁ|pژX>:e/LB6[DBUԸ) v77 վy^s2bC/_/w[GL╿gǕ)H7'iW!`#= gMZX {+ JU}b+KO~߭M-\zxv-/5j"k?В}6,E8kНE^_τΗ~kpGL?C xNH( ۫XvtE[p/_nGڥ׻tb1*NOoVpaXe*u7r:%*?ɱ<ї'XfsbڌٺX-NjNj MzKV⾕?[9 ȫ|s_6N N9^lrq9G\Ǯ^v3ΝTbp X;oOIb8)1ՋtVpXz^^DPD[ZPtz0.<7U#rBVDDͫxXC*CoBYY +48"Ă]1"gN7DoVXp lmR}1dA)YJqXan uBH/0(G6ь*kV:ok+0ek& eX%'a䊌b@Z ~BşY9 QyaALa Rȁ "&( K@q"KƍxKd2,9X{C!<K4}iꈀ<"H-:bH `I -X? 8]^m_cwݚ2qbt+=~#H}ѪBLP,R\ݑE|gx5q}[@n5&x$Vl%`K5sYF",6 PpP% Z-JqGd %ȷ%Q:rȢYXN ($)GB\މ [=:ꯗ<GvhEG@ B,_MR F=;u|]m8HO+!QRB@讫j8*4.)?ϛ$`ؗWC FKO|4g&-`DS;NFlt\V^COc5vKe3߳ꚇ77T۾~wWh{AG |+H(L\< P#},e7/8m| 'vng xG@1-6^*i9'4IxX X Za7_yT7i(~(>)%J OW/ ,8#~Sm7 lM1=Wiбȁ\kQEXBg2[0:R6ǶHm?=\WMT&{P|&q@>+XAM ~&v6)].J@ԘO?xV?g]O2/ m'aG񸮙i3v skdg?XLN e֙= 4L-m4%͋N9O܃>&H frbS08{YqבAȹKC@~Ipp(#~TG| K:;|KLupt$t}x(?{Epwݗ/ya k?vb-]/co0A)iıtz6D~N/̛!o}976@ qJ _!5i) Pn 觇o|2{_}rf69_g[lmYpG@!x޽w=pB ;XK?x 8J\'yk!Tz)#xt$~ {Xȯs"~]w!ydω/^gG .+l/"`@G@C~.J |*tS&LCJ:ml`n uSVs4DI +/H/7x؇znk)񮏀`p?n0cdȝx0%zocR8^ 8e{?tV;^ǏW;xG~M ?" xV?}|mAXx "MrKN`{L2e̛R+6p{IQ'g|)O1\U(ͽoF2Җy,g,g2M`k~s/?[~:~.'{y>| ooJ|~v;ʺO?=r76W&mčLv!Ǩ0^p\BySL;CݗYd&/>33&K F7ctZ27KI?njE[equra%`H/ne_cя "q9Us~1?}_rxk ֯uI)$ v x~N1  8r "`Zs4gcxHBjt}0,X wص ^D<pOֈR싩Z9 Ǐf!`M{RKOMpWjĿߧ7?9Yp~>[o>9})xBI(jWO t4K@1UR̦قG(vN8n'`w=_c"<GgV4=ꅥuh ,gu*̓Ak+l=/?k;xY5;t$l]Y~c&{%15OAO?_9}PW'/1PsQ I[:RW/F@P@La acHJ띲_đ{r%ar<`zoc"p >BIFݍ$O?>=qpVZ_~݇O:JJA34g5O?={&&\@$ Bd|YG#V>ʼS%.F@ #~w uSԐ2;*N9(< )6m6k(Z;qN7h[9JʸzLZK_O$=ocfs`y;S>R|sMo>OGf##<Տ'?Ư?9Eʤ&A<= džr~H"\?;V*EA vB2pxnN?HrBèq޿'T˕\GxX'kH# ОAcd̟8fjZ\ ؓ_>[ԙ\9FKxJ@lltm.K2 'Ƚ?Ot3Dža"B ׏ rw, `3r4D0<$麏 RɒKg8\mD:/Tjgttq՝T(ԡ~Fw2qմskT_u& :l39ի~iy<{~R@p&5Ֆ?L> ! \qLw~O Rpߌxۧgm>G@5̳H錂2OG‰jﳜQzDd>|1 ? u*O D\}=jZW|h f?]{c񲇟)g C>؉$~,ߏA@.~8`B/x@(O5#6(djP.?-%x⟼pz."I^Ar4ʙk;̻d4u'cJ5g~ m6nU U$8nn- ߲C(ψ\gϾ#DzM>5Y_=.\@\+>:?U=?stN@KR?>T̴da;MUCptZhwC\ďV%~t|a0jM;c.厾5 K4Z$òbG5ôq>ON% +?WxENJ 6V _?% 5ݺzA|W/}:dGoA*>2ɹ|dW~/?G͌ ]2O"z>0A@) Ww!p|Õ򋜋p'6G)UQI ~CCv=sTRU \0MC [)0R,B;V#`lQwk|_{qkߤn >0q`o1@5}Y Kb8.ulR\ SsѨm0S#'Y-9:A0ү>WrGϝ S^0Gw4 ~~7 {ޫbb}τutiN7`o2{Kq%˥dpPW !A71tHYoONF&'6"Xe D@,F)ɠ+9S-JOF/Sljk0 aLhxB@Y9:B'|6 %`756o'#O3_<|BWyd:AJ ~ɓ>U߿/X#QNwcFhBQǣSڛ9x^2 v4j+GE: " Y~w{V󋥽>0^UGWMj8قW&$h䘆NfeL<#9?>@.==|  JI~|SU78P[K3;0n< Go=GPo>Ynja՛%y{ `E9cQG%>|睃5j,5)ҭ܋T"`hT̚*OA@߱명GWzk3`;#۫n&CI7t2&;V=7p )G!;Ps C^?>ѯ~U7)O*W^>y☞u?#;.Scr.gz91ou sܔntJyxތU[{|zej#xzp ~fU쭊Hb#biO2k]OW^Wh, .Ǭ"7B?aN!YGxmt 2M& @H~ ~(~ Bh'"㓔aBJ"2?z} /^~˓{=v_jϜNc2fhIjZVD.3LUN(Z꣙ 9W_WmZm\%~\wg=7>] HedӮ{9| >N؜w-wg?OF\x:a ӦGG5\@|"P}g!)뇷?b֭]|Z^Yo%[$` (Nnjy#. ,0mP S38΋ ,#  nj9q;V`Ijvv=聣s~ >бC]8tV('AV}]|p,_?^' |ҏ@VU?APV@@>q?]v?WC '7vFop.FC:j~M.VZ+O?Kby$ G/S=S~xT~[&Zz\aI-d50F'ު6h,`>Cq.~|,ڗjL&K7^&W +{te,#%c\<0{$=XxAWH?}ЏPE] %Fs=R~O>|= ^eIeѿďHNuH $ LSC`dTjNOFL:+&n}S]E"gHOYg0PqVVIjrx+X Fh%6֓ߤ4cc3DRÎR?S'$5(ؚy ,&=~~2><ϓ $zp m2kOGi?foWehDWWeh7M3uBӏ݌4Ss> ImyOZ8&r;n6#I|0{w2Ra6˯o?UF8-YϹĈhjD"~ 1H]/M@LiuW|N|}xxh Kc6Nnahu842 NPgX,t1ݜ o5M_r(Wb>ׅg?v0ұ&C^AvF̐ћ2ʯ |asXOWA@Q$sFŤAtjOYCN1MZ>0ćt)!?q)ú2_~䨲 <; @w]}0gB?d5_?,`H `A@_h+ԌU13rd>G~0,C]qM]ڦ' ۗFTdy4)hxI-&ošCL&DgEL"$j64Xd/ v׿W("X,P<-oZaDՆOyr&^bDSPa#nr_OxOA3H|bڣ),X3CQ^AZJyUX~%{'b'ZoZB+9!S'QU71Y0Q*`;ȋJ^N`YKĪ8{7uj{55]4 93&]y=? 4z70~*q"A| q~pfj+lCld2O7 U'Ik8TٱX~#n`A%BzpK+HXrZɺmoEԩXW#"'ܝEOjYf J%_UA9[W5?.fKz8f3,! (װz:l'.7= }C7s~O?M$kR~ȧ&SeJŧW|rx |只JTia8(e% ?f[t);{ضK@fxKKksIWqĔA=z[gl5p8ի5m#!j69uvg`V>*Hgl%{yf蒩[?scא N Ov" [9@Bʒ6(p-` f0GssӥBs{{9O@4, o=2k;(2v34is N|L'JR'|V(Ʒ| `d l6;D@x56o'|0 '|jbm'Ps"\~Q۩BB쳀}It XX6o\Ҡ? 0p@g=й@4ө[E%b}}z1wpc Og͔J{% JL|*qUPf}4*_,ΣFFx?O~?~ҋH}p|&`,^"f ?R(kG"1H@PՆ;=w%ATrrI^U2 "A(O :b<.NK@+gă5Z$[IpNV 8W[# =|7=ŔM(z>hOHjk+ [Ԇs'$?|u'/L%^~t= eRU"7V i0[1(]"`RW#;\ݮw1!^||=|6DKz &kdZGqRFD?8P> O5ڇA `?a`,z>9XP^V;x 2ܚ^͑嘵\Ƣ# +$fY=a'%C &pAt x ;Lwx@l,U ^joA d~|]B@_ ƏK|}/+ .C^9I3iIqܬnAZD4~j0F },6'+nrRLg6g[9>钀]0>|r]]Nut{0 yJ<S*n/+Y^L]Zh"-54EuHjfŒGLzi4D6Ȓ622LVE|Is u:5b 4 E`Q&y2 wL'yf,_O`4Єi?OOV7z-V7u HۂDgwg>cHM$א+uwN ,|7#pӲjZE3M0+ϝx Mpum<,?C}@rrD|Շqq-iZ\OcZCXj"_I@4-!X_ !Io!`gEw;}J %,a9keSvY_ʇݳ?Ywv% , r1_@հ@UKAJCohRd'VB+;,6''d\|kdYz\py„Γ|Hal,؉<uogC7+,`ݻwguӓw:].gaCqk_X4z RZ@ӵݻwA8kPq}%! pB=Z@O;Ww{qI-yg$0NƤJ1DLIU:51/06y6+26&aL.+|t /q+Z@?>جK!F |\˕3>K\x>+?:!;# 'K8L@,sfsNLT֬Z&{{b0y_#CP0{2@ږX%WIz|ooRi/PrV2WKJ53 , gH~R謪Ľn6ޛ^dVђ97ӽb (y> ~%Pk6 mŘ$WX52`d><=#`>+({ h!qCCH@Jn|&C"͔!=skez2 = Ly^)Mwb_ݽ{^BJ24C3ƙA#8e¾@\A:"-:%\+{>KV$]=͒L @xMH8Ib!=$)iD,xr,=|{J D4X9naYMHa8j$D=e/ O"ހX| c6s޳Nf' }d+xn-Kһ8 3d#BjMo!Ubɚgkm0nɭQ/̑Gm'=%,&#kkH]o# Ϯ0ILk> ']fО$&> 0 $Lw:˃f6j,:ٙ܃d>`P&aG/2SZL4 O3F z0'-eIbrqGeU`DW4=|aeqXRZfò`^ †5cԔM͚)AlZ3g rj-[X8ѿJ(}XWa5O"Otf +^/͆JᘔO ! #只 JmS RͩxV5 6}͑w65[<0dqbbF1IuNˆ$]<~|KZh:ĞrȬC8723C_~S# )$0 g@@Nsp`NM)oQq!NzF3>cYdq`|Fo88u0L@}ߚ&޷mlx+g23㖣ē:YkH0~g4 ]D少 &_d4ubi MVߴt gƓ4tBg03PxM'36G 5 wpִN1M<9ɯԑX8n͌#5 y # !ڌ uqSVfuB|s'C%ePOtqy|0*'8u3BxP x8z:74"2-Q创%ӧ P[ZM9X H_~K&X][Ce$0_f _ӽYʚUJ/` U|KZ4fJLEG-B仡#A:x)I;^ik^/̵kYəiBVHiOƵ5\ƻ8_ΓsR~^LǓd&%~) i^HyN!дħRwθj]iXY?~MX4j8iu'M g7 $ , .Nצ~ >6>EӐ?4w~)/nݮ ƪNJ6Q3ꠊu[Q݊cYj䈣S%|%\ !i=3{L(#Sj-[j{L!};XOZB@OE3l:x7S4YͼWCŒG-㥥ɤg+ dš4y3,9IO'* j+(܌R 1R5䶎8 _~4ou7u̇I439e$`[=ިjHӳ>(SFnZ[*͖W=v};"ˠmqZjM=#q)^Һ 0/Z-t}}3-R9'xʅZ)Dfb)a[;9:9i7l[lO̭Q[_FΔg|g>_i#3'sc8[{F_ы1/N*f6B'cN2&!YgzXu@Eu$( ' sɹ1WP:n.Cza>_ZZH ronv^IDAT-E$w\ы||wZ?r7uc|x-d*cep)a^XY"nZ$ll+vr`yg5@ {,^j kрr)bsU 6% Y$>(xY+WE0?R,FR!ubj8[[ב:ywj>c:Ob 9qOZ\w[XnwN=* Ilqkg?=l]vJ^~[i2;bQ)x Ln/<ي0mU]qG%aZھ'spV pg)~@@̙"D:^z8PJ<><{i@`kv3+s [nW:IQRVl+4nQ4'“{ƠꀀBWd*ZXlbhGvS81.f~v/Irycc#1$ HyՌTʽ렷*+Tcu;> /I^ƆGyiakMjCBbtdjBArP[UGdab6m.;;U(u2$za-ުC )"c6E'EtGG<{2X)B,.!`,ᗚa?2M9S7/vmsDF&A'Oz +8iُE .gG2O$EہhFI@Nԭ:,~YCPЏ7CAy)vJ̷UG{y( !`nJtORGtCvwO#Utsr"m]h. <a~{xԵ[j5@Gq l_܎CmZ7ܳ]|W|7"pٛIi|9jY'i=) Pȟ͆ClZٹd TNbGFIetNڑЫOym3myAJ W Sl jkܛMF޿nP脠qK p[_> TXG6A^'o.OMUk1.UG`WögFBow$ 855.Qɉ"KBZ" -g16Xhl2?ES|vn2>ۼCO.l%PATR[xN.aHT5;5u.&Π~*+(NP<pNk( VU0@@ZPxd}u}7y2&OO $Ro2(-˗ڪ( ؤ^@hIto L\r.m.5{}|r8\+ԽMhJIP|(#] %إl!JA@#06`x(N xNw="#iEVМcH WN}6;P'BLShXٶbV+NrQ؞]ӕǏA@:u#d2>CD0\' 1i^gJV$[#AAk,>(Dx:JZH0TjƟ]|;bߪ~[']5|'dp(/1Z{[@p{{'N|&X뮋g Ca?K yaEN Za&_ſLEILʍ73c'˂ɖvDX_.+0凮9!LVn-z! OO ou Z{0;,Lv'GJ'~qݰ gtzYO|_ %_vۻ;;/-OpM9tA~C'.X;=둑ɝV5Djk[ -UB4\;0% 62^l;XwOZ|O+=pG'A@TQdU@Ub7\`;Cҵ]5Ũ+yٕ;!|L,]cy( oSW J 1l{(= UO zBn^:!V >mȺ/? wG%9&|&`HB6[nZ9MVY G=Oq8A_]¿LKQzK="oblٶcG@wCqD g #2m& K'$ YXbV+_[7@KlZSΔr3B ,1۱v6RC-`]Tv~\LS˕TJxn D%|UHv-w"ﶳ5W=t穂,^Ў$$GNJ%. BhM0 F m<n\y9*wfROؿ,5`wl!W*W8<_P񣽜 &~4D"u?,'nV !`j2u=#X fOD̕v0*e>|68|պʻꩁ Xmp1㳀:.cH`~ULz:BCR 0|=&ʇ :!0@w)"  5?xH *?0 +fab(OZ ](;]i5a^#\OJHۭ1h{5{x \q$^! jej5J^E^'>ND>&)T*ܯ- ۊ>NPp򌸎ް.fpga/TjT[>  5QJ6L텐bz"; O j,ڐ$d>XiL`#~#Tqy.oӈ/_nD&61!˟!uQ*At+my.D 5-f"ոDM(قlo)cNRZbhD!vb$r~zIm>HL^[imq+gI,yl7BhCak6&c[|N71N*u{ ]GXyoBb7[si$n:]HG;+!ۧBvM H3Ɓؒmr+12#^ȏFsH ;4KuxT$M34- 6#n5lOe~c.-ĖA򏈊W,lvy2Nޝ 3Me'P]Ob{qn*-?V ;зF\ 9)d7Do|LEd߿Pl4 7f*r2'ܰ~c\Lj؃wD&\. Tl vOgو{CHb В T vm^J^ (ˠ;%]hUFǂ3y5q-S6/+čW'!v庀ʝ_&}[NkAGUށ"煩ɡ__*ObA;SyR^>P`v,.8Rb:xrYX=Zxey&CD:At^wwypD,^G ^h"0:&2`18"Bҋn*2Z$A"I3;[[VNw4%0@ڊ!u>:tG66Ĕ3!P〼-{H+rYXu&FucQʫV}Q6 Z/[jbob`djmVVʍ^Vuo Ĺ0LuU8\yzXN͍1ةհ{V/nKO@,DS$mA@, z=_!VK 8D25ZWxLivWQFDخG@z#M2,2]I a4ed*V7%l1ZoUmDPH;l0[hwxhI^/,b#c?\`NK*wG@OݕBz !l,#*V^mF@]-^7. "t*/#`LAe_0)5 %V4<޿ C3rk6l͘dx`x$x֎sbma#>ڦE;g > D %!-<#`x9b6.{-mRv.C`jwKOa H% oՆiXHkjɵϟH!RaHUr dK+hS[D#"UrY'?p/+R'+rV~YJ%<\TpE?H@d^QFjl;xL.75,|I|Ǧ ~ /uR {[w=L~ r_2W{~^?HB/CPWvtyFo}Kg)_}S*np>+b^ɤ= q>u<#*S ܽ,&- 2T* Y,NPC|v_b_r/?pA@ '^Re0/%$q yja "fK6' )kjdH"D梾&6ʗHN9T dz}[omRgͽ=*N["ew/n^V:k\^7Hy\Vf&vL-du8sjυs(Pm&xgG$./ lqbZ8N ߮`GȫA`^V?Ԓ S}K^B'`am G?lmo},*3s>p?G> bfol.X=qJs 26QoDIև'=~^5}  c~Pׅ֯>QrԌ d,^V?KԟY.+? ٹ,7tEEʭD32Çf\]_`n̰<ו:Bhm bXL(%G9r'2)j :}GׯOČB^ >_ȚzI|9%"`/s>|@N asL@,2\?QXEr#Zۗ" b 6̹Y37w!h7:~܄iH A5Pdk0,:i< *f%68H#37}D0#ĿH\ãR -c}j@9<+ _-9Pl?ţ R/Bt?7C-?V] '`XlA&=r%U*s~fTtI0wT.+"Sm=|>|&~./⃅6iݓ0~02e+Г_!ze=cZ<_̷ HݿJ~~zZFP">v}! |.Ml57-5FvXP/L~W(?I%ggPMVn͗_.4 $>|r;zvUd?>ŬBAzO~""e0/yp7zZ# HfL'#~z, h̺P"~jd?_^Vd,PV|˘: ~ηi Ѝ^設n_W?!CjvgGTV/ߺ\n Ҭ; |7f4saF#"f::H 3_V[r]&oo٪m]o(ZY}CU)l%^ktxL[AdͭcXTHr{Y7==3b>`>B>ݹ}~`LRе{M5kG'յɞO`jag[̌sss]L\y_V̂_ :pC ەL, uwV=eLӰ5y&w=w j_}{;k#'8)P?g;hb!O.+z/dGj^n#p7$c3e&n ERo)gむ꼷Yn]PⓡLUKYt )[>|"Q`Ytww~ L>=n>$`:@~O?g3@;" ^j?wE ! ՝܂s*}س ҃b2lWkEr0Y2;-WqZXsd/=Di`1gj Kq[( \㟕 lEF8d+HNky% t47mw,vXCYK&WDz:lG%Jb t%+ X׋b (麩" zٵ|d &׭ry?Ҍ<Ĝ)EH r ;?~!/ (Ƃ{Ly0EC?[bߟPyaܨUS/Zu͝nURbl ez_'zEY6g[]k "X܍|UifL@a|l{w vk{KH6v'(鄰{%tKrC޺yH3{ W l_ 7pR) xUП |l[bJ_C _ 4v3,'~Gk ~' &`=??ҕׂ|V2eB䌋h#!`/82]eWW@Ќ5t1vB=ӳ$"{ @&,,ɖx$ϗk`[B3343'},b\-#ؓȪYw}\Q<@@Dq${~Y?oOzhgg|93H[o/]WnɄO ˺~~*6xj D9X N8VcaÕvn6+ ȃQ& G?I*qd'݈la3W~!co4|QM%>MT 7ڙ'R鎎&{~MwN_ې&8_O@7 _5 &`jmK3{T}b0변 JC1:hЃ~7H=$[1裩r<.~ &`v^&O" ypm_s cAСD &` cUZH4g=>^DzrٰՏMG:{,FhbPV?>9ZBX~?NGѹ+Ff~ymvP~?|(n>H?g5 yO$Nl m;8x#p{'F7> y!s'g5D>|5 1bZk 1Eibn??F6!Fѽ\`|r\0J9ɭ"z!®S6DXI4S1]nMƉ43USZ:j2mL0a>4DN35i C/,/W'l!W~ oR1j=}:jK)j\5-A 8b.!P'_G<̽x[ĩe}=ɦ%{  >|H'X✫Hz&e L@=Eȯ(v#:{|l;7p8[tܻ|||}_>Q׬ҾPYCtw[x:S܈c,& H8j@NCg- ▖WM$J#hv2>I|R)ǝ~Y>X2qdň]pbt;Ș"lj׏n<,N513]7EJlaxp=|bOm0LO~]%>H? z&oЅeI@@wH8>`pzs?O!?)27W9[O?93ߟ[_{WP*Ġ '`қXoqYdƣ!=PE|#,:dPX;H69:ܭ,s+LPoaZ<Z /M"+V{P']'VNVf>l 2B~K+s}z'A#211CX. >݈ėA@?00I.B~$yxt[8Z1@fg׏Vn `6Qɉm/QF4]1PԻ7LIJ)RAT~'ltlAR[&2}+أ |ޢYy\gfm!wߊKb$ɏvBcF+G3M~>ϥwQ> 8Ab%]֓4}q3[.H'fHm8!TUS\RiO;_xd&~y!` j:%m{fGSCD*[&Hj.+"7_u8T b%BT} Y#pnpV2I-7S`¥ce4Y 13drԧtȯKRЇO'n6J ?8.#0@LJo]@h`IA !$hZ_fU ]AySr-j4^Kght4 '~%nũw%`S9yxysijfɊ O ދs_/M+8:+R, D&XǞx8q4Q~Y0eCAs?7M"O1{L(1RB@օ~| '@3lmC4|TaRϧ(rۗ3} `tuwkz]Ǿ18a.o|D'>&2߷yu ōMސd 6BfNǞ(IWRl\#29' "S+gFptA@| ` 78^ 4ny E>b< oyMHB+=MHϖnrSG:s><+_{bn= EA@c166*W̜%R)H[@DQm]^n>O@e {7'^-GƐkg+= q%!k6G1 Pd2} bD`kg;JB[P|Xt,˵SK9?(&, X7/G-'X%FDND" !2q =_=˟^$OT#g0'?t̅gnu6߁δN$R4ԉhc'J(%[}"=tP0n`ܓ]C}@_ _qz3+CF/$H?>›` ~(¾1 aBX~,drKX[g&\]B&Og/]|M ` ` X; C3lT HBΕI&HJ3xPmDE2Zf` qe0F>`]RGRoL@jL7?^\Mb% {;q|Є50 %$`>p|%F@V+${ Ƈ Ȼ=2< pxG-0}A 5c<hGL4%ӝ[ -Grdrra"GcG0HGf6&ƗGoW^~j%La\z )Lt9K`ެ51g^VB~L&MvX$0÷ڒ˽ؚ Zѳbmje uO ъ(T84^G>ˍI1:0!gtѲ n&A@:8d[`}ЇWsk9"ޏ/<&I28ZaKV5 .TsNT`ی'db `>k5&0 P1G@]U,ƀWlY4# :"<۶od@JiR)şKMiS\.m5ki?UA@sƁ Dǭg C}7.3ɂN7Ú`Ю WՐ&X?H@؋VNj\r\E!YDѳl0@@03yăՏHH{0Pn$y Yfllo-L&#ݠJHqG>\ON~\9_?lfw6 3eUPi$`<x P ^L>f!꧇oN|6I O0>?eWݾ7C ~b6_uw)륽r:.gL@C9{;C/4Dd RŬ-R'{k2 HF4dڰiv3Rˈ=7840+D/XKYwٖq%ʪ!byFuY"cyek=|AE!6puIKRgxTjRR[U0шL'?5M80]|>ӌc,Og`f%`rC)ۗ@ Y@ ^m#ZquWg324\C`%Mp_ FO?=|`r0}vKr`"x9|, @=eWڕ& Dw|X`K vj- B*kŽ N证Wh1[h[˘mJj(XZ65ZQtU )&KSWr7cdvr;xvD< G@-iKlxW˭H|A3JqSF ^qoE)j|v9 跀hB o_Z~RBlZX$RaGy5Iʼ9,  UGT d7v*NvSL@ݝn_MOTQ^ pDN*b9mMH3@ 3nDZ3/l\wqjܹ0D{͎j}fr,^f,ƙ_.$ !=IP#50H@Dhp $cykH$4pӟ>yВfj* ȮУ {~CAz*`0§kleoYzMܩ<ʞs:'Jec` GI1DoTpC10k>_L5 mAa-MݬeŰgw'ٍβr;z1/#>g8F8p)b&&Sǰ >\WPn/%ٸ xbSͼk8+ٹF?NO7}k2[D,t}n"&mXHrȻB{SB'tgvV4o+oz耇\'>,|Mkq& Ե[]y^p/?9"$6H>)!D4w?ɓOb,гl% ɓ3N4=> ^;@.3?&9NoX璅9\4fvN<da]0}؀P0 ?bu01< x%\"& @~WZy1R4%cqx\>` [oK]xH~|mج?Ud"}EPɏ @UzBZb޲d^l4|(MO$4 kb'Dp#£i/z)KOSl Ye}4MdTOWEBAl@n/ V4k {Em,_ΊLZ M0~ k`~ID;\)`,X>^ תI\..@CH2.rDԕDm!*. Tuuȧ~(NPDggGpk ¬D竾?OQ_46oMxA'n3>PO9r'J~lzN૆Wl~:^KFcx=䟎U?>u'`76$D)tf}3љGtTi cl/2ꗏ@2 FtX~]i@KJ.xvQX<)٬%0},?TUΣs3]#yXՏf5|,=> >`iC*hH!{ޟ8F?_+Do\;OonPY`q/]+YPy: 扩 b*MWS³ԁ`Y"4auW3¸A&b18!$M?UmYk%N,Q_ܹ@"Ā(0UK< ?^sG!qjo,zy\.WZtO(;8- %n(CwyOFb>Ip夽4UL8H*6!8~C8\- c wH~ݵMԀNYXʲ!'EX%O!'&"PO F5DՏqzcv YQ4y)mA=a?yr [8$<#:ج#9js9.M$D | k1ze."*$w'k&dEh E$X6ki{6B Ql{?YdzIyo7ly= Gv={#.d#|TI,jþH>ȵ k႘ԧcK.8$ ƈt9^>;UC{2Vi8;  !j2CaJ-q*:nh@.g*F z+%f)"Vg\`:t&<`!fyr0b`cWp.o)-/C5i_BBͯI]i] *oSZary}p'*;_6%'>To^IW PIÑԛ&!P(S8.-ak.d1dy. x0opQhHEHаlzӵt4EI2aL>{ ?X5ya7I+?4I͈.#+j(M^]~hj0}TFg 9f>l Uy}b-$,Z*ZʢTORHs%$`盈C*`]S{JtwQ>|p]=\?Tb;jjj#Do'bd6D$Kcc cR9)Ú}ÇFwsKۤ.zu?䊍 |xV[v˚VFtX]94 f6׭5zK\3R1AAcEz5y^X<\p^:J$}{eч;$Qo:8՝މ(4SX}&&mPh}MPA;vl5k9Ѯ= @Ufizj#'p1M#޿){8EE>jn3qI6O"@a.|M#gUد~l@ĻR*b/uTV~ɑCE. ű-sK9BhOwF,wy$ ӀGDBrfuUZ<5ǥQ;9ozx?#zMVaM5 :MHr:hۆ0ཝNM}j]Ӭ/dѦ=AYJ+fT]0*c"Ā ]`r)㱓_%ZAxih! 9A%"rtGE{HO/CIU U' Zn}jfpeDaAkW`HT :Fװ^O\%7n8"W+3N]|v}I=T(5mꋯ5xۀ k6<{Ržl-%^^KNJV|-QbOq C 1к?o9 t?W]^T֌+${Dc`x|uUoxIz-WY[[9Κ޸14a5Yy -pg`nMЌ5tgG|A!YE)cr/!awH2ԫ!5r]5r-Dl&@+ߣ.҆Y}}e*??P(5/ԨЛmL, gx0& lqי@IXշ$ `0CKXt,X*[NOWhdrZk/5ɱRɺ X CE[' [0$Kp}'.iDM!gzõru{C5HX(5OpZ1U9@Indf u jYӿb-@gn,e Ŧ$0=EWf^εϨ H&ӗ0vۮ=ˈ"Du%Z,..ZS" /,VD x]&%*,_F }<bҩr}D9S}3O5GÅ!)j@C&2TTA׻O㤒Ȝ&6 妚9ȿ}{cC'[I.ɿG#_._9{&K-GR񔥤l!^`0%WJѭ v-O\;mЍ-O\iFw:J7)=1aX[%?Y%0D$ɯQw\Fc ^:[X&i(V `V;O"sӤ/@]Y*zƨɮV+%"Lf[S|LImMX1izs9]o@^!uY;M9R1yu}yQr/qJ]$#x[;^V|3')2#bK^-S,Y:>LyٙGdB$%ܖ`7>UG6GVˑ$ArA, Gz]% /- ȩp ="dK*nnA H?l}U= %`P #>žn̚p}؋,,{yK2GS ^n73 >~=i [d Ws/d6v%5eQQ9K;"G=FxuŖf.AЀMR0 fBByDWf{F ЉdFHFdLMlFbd6vWj<%op] gz*YdHsXp@V _{f_b}['ar[M>ϧ%wϜwk7M&W3}kz;weߏƴ/[=}̙G0eڂ6ƻɚ5*S{z-9Y|'PRo:wAmR6= emZ{(g'jXxv zMZ=_tN>瘵:N=믯 lg!8.[i㋼mrtnu1N{K3qTU$c}F5v});CCǠc^df@=:\U05iNg!]}thׇZ*{x-cnLi&{0_xvF6㘹bem Ző85X>4LctfV{=ol &cH ^v5hg`xS45R*2cy|6I8XΔxlϕa7ne̝K.W|eʘ(*q4 ReUi4M`>k%Ş.^9}FMFJ+iVѳ6 @bmf l<1 J:7JABcYvd܍F2}.\JerFm9KDfo)`<@gRU!3nV\=LryH6 2WH#Q-]MBD90gQ|zBq\\:% K{f|'/uR&L m1V=:a>V^ 7lt=y$EisBzH7{'_A3p{%|RAY8-vs(P]zWA1PjoGn2apj>Jw 1^1g_ņoPT~5 =[#'V; ބ Q;|XO{vUU@|zg8 ~{E~TGEXzZxj0FwPiT> ?{Ci@t'm6HOX- 74kr:Ad}P,CBP,KJte<V@X{Aaaiq<.8^?'ГK{s6E K'\=6 l0tG`1Hڕv+#* *.Q8QMN F171Qf?@ꂟZȯ7;y|qs"5fMs>i Z?iW}TؽR#$vAWICS?/ C&yE@?x_z,e]j0  =Hvz~XcT~VcG6d>~90 [ ?g¡bۏߺC rnOJ[y=10fPKTt&ũVkuvR{nCO`3xeR%?VЈ ySZ;/ŏnN[iX3\&"oJv'|t{'ϙ1VR?E,<ȑMd*0]ΓFI0P0d [7S}%"z?N~!W~z@ ?_ɧ?2@  yLs|5,FAPSDB:iX@ tI ܢSEϾ2ԍ]C & ;}E?F~]ʯs mxǑw#EkMx VWk}vE#]@$5dL}8\=q j{=mL; =N āH9 R$8TR6;\`IYuT.}%emaW`̧4AG!]0' XW`3C`8:i pDA >p;^F%ZTajwTaYU " >6ͅJeA_Q0A"?GPuȏn6'mb d 䬖9]>]WB\= X`#Ӫ$_$ r U7OnVGƮžmI7>H>O Dl??" i/ o`ybû_BTƧjo.?(1-NvO0A,Uv%o[: |KBDp4˥R'WU !eV;u+s꿑-XO&S<@Ѐ*&,IxJďG]Kp!"?UpcwcTZέ`@DW?Gc˗v>Bu O$//dy@3Fqz!2AjpjwV^;I#e1ŽB3l˧???K|O&ߎd H~[ 8SN.Mac.^X;L'EE9_mWHժ4u)A 1Q͠ X~t]qLngpo}@]esԬ,d _b bD`B7ET~Q >\!х4Y]j2La$ ?V>pãʷa 8!'?yd Mgb@ f;$!yve%B߈}yx@wl>1u+J6pC/OЪ| dX p^,"SNO*Ҁ,q`|Bp|B$!b*E6szX< Trԟ  ?}"HZss]89DAWh,D?.)ad>;`lPftwf,`3' $:D 'ij/Gnx "}PRp7{Bi@x#klo|N]Qt){+2gRL`U0ͪCk04i? Gv|LxxRg5G|bx+{uKB~bdW'o~]7 g $g#HSc??wyaQF'2RGj`vK*p`/o l^ i^E?pU_\}vrAhb}D؉D ]\s-B}b}DiX @2z,uÏʿuOz@ h?y.>%겑c<:b>T1b:v{ ^XRn@C\nHFjljB`7W?O C ٮ/L`ۿ;P7&^[Z,y`U(X~4֭t:]( Gi_asYXLxQD!=-̝G?u>X16hp& R">{ ҵ`g[B|RUB +?tw>@(hNWFb8 KMGϝ?Ku[W%?2}"sأM*;Olaf]fYpGȿ^:^|3 kZ:e.9*_!|z<YnD 2NG7K_B_ٯC8מn5;6`| Q$?}?W^%FS;Dp눩ޫ̒M?ڝߝ=F]K~ҒgȏnL;sy?R,T0a{? ||{_;*_]QR{ oH&ۀ R:w P$}_E? 'KƇ5ѿ?~Wf_ Pص6lBpꟅ|Vi?$"7BsXuZ@,uҀXiZ JCZ;eg??r]' Հc~8sTzMvMFYI&!lWey:CB%%#>6V}A;- h>[ "@@VH.ɧ/Xϑ?w߽}m~!4T~}h ްl^n(}njO6O%YR`՟9GD>P8`XH>GX#X͝twTR13e^ӕCIop(}wE-gcjQr=ӟk]HD >"_;b\uT0 ۝?"Zw/ 86I.)>v|J)ttڴ^Q[>rSIOv#: ։o? @io.?04O~vw@ NۤĉpC H?/WB1LɈe:HGdzh ˏf^{Qz#m/!D=X>j,ѺZ8R ܓKM`^}|$-5tt5 Q8E>x8) 򱻋>]'MIG}CƩWDEGbpU7"5`d ϩT 4^A+pFO=!Hto(HvA/Ĕx- a :8Bc*0[#HSľ=TCpL&$ W_}h($W슐󧶐ap }}@$UD`F83R?ugm#5~  YԿ:"GdrxևFJq."Z%= BmQHFVxceEp܁_F(xqd!uWp{;"l0W4X. =XT`fx/?) jf}Q,>@h(O$s8yPy.'|Hb*.P" ?*ЁYU7$Yjhx<@%w!Hʯ Uc@y50pl"Fb`Hm&BsFC9z+⃱)J"4'> I돉nηSl@O{m@[CX  Ug,@FwnܸAǥ?1߼?ڝBA `Wr0ۓ6 F`CC+8C~ `hPly TY0`8X>ooכ{ɽ"lsGM(+ j۷_y+NBVTx ~, ^^bה|_dQb~~ɣ]>U>u*O"]IGɧY%tHEH*k'Y Ҿ|hTc'D>p=O?A]7CB"($ 툞s/18TP*TC`a׿ۍ>Wԧ\-u%_(u I?ɇ7.v@tt삃/0.2]<B,|V./pSFuaS[:OR4U]p^7 V#  V.tw}}45% Vſ;$?db|'ALӻy'OmnR TQJ=ȷ߾ &e2Z2CwGB`"Q (+wܱъȏ ~h'O[6{t@M3SQR+cs B$@ % CgW dJ HxK@׳h@_Ƣjep=rw9`$|0c3 ~O&ߋtx2\n(fľNC4P1 9&V1e-)oД].'XBCXqH+В{fcTZO&y|ǀ#w8O(#~?zJ?'+C§ ]pҀ'ϑaJEtfrHeDt֓O> >ᒍ|?vWc7F&#Y ٕYshl |s,܊%|",B !?#5'MKCev?y̱7|ג?:{ܵ)߂4 s![L fi`"QظyBRr&kZ: E2i=?CX k8~`Q#R2}0 Х5{XǟnH>kQc1g7dr++!p G0\0N$H%o22.t ddaH ԩnhX$Dd+ I sJ»I>'|۵Vy3@Y o#14~Ry`#)Z;R]}'nb7@ ~k>\YzK+XbBsYǢiys}> {E#H6i:UX+| Jnh2Mlac1'?l!650ߖkٲw8UQ!96fVR\f4 G]Y<|N:X>7g|4 .:R 2Yg&zh@$0Ei'&XEJ'hـYg9Ԯ6lUx!Jo- 1%Y6 ɯMl$cwY>X9ֱɭ d:^˟_"XJFʘB9|ɖ9@4tm*sƆoooyjIDATnX C/4? Mto>'- oMI~`F1eӑZ1cDp뺦yr GX@X/?GG'6j .? HcϠmk z¿psB 5 eD"kF|d&DGW69Ar Wb !%1$YJ0&b%crUJ>*wv?o$ OJZ>1Oőkm T2lf "v/!o:%)Tb@g l@L5l a>!I78S"aXw~~~K/g7odyZi#q;y[쯶ZW8 ߁JhiȾ@yһH]CF]CyțG8.a(iv예l/!h+ތvB6 D*)MАޯr Lw[|%mzŋ\q`5_o#ޥm|m:-b\+mWeR! 5(Ǹ-АLY.0pY'EU'9GEǏIܜ~w_Sƍa/҅c,jHP{SBM;X2pte7}ZP0U7h<7Ooi; $B,Pˉ%bhDR=CR &<:z4Tuϩu)pzz lC Ao!^/^2- 7 RtctOW'BײP2+ĒŇ?0S$y)EKm40=c/%MO T~L)By"uR=4"Ȟ@B\PHX'}J0 i>!MI @':ʿ 򥸍wgmOzy"8Do@7rm{x./:ԿnZ `>Nw,v!q5TLLi6`bn8=gc+8@>KZے_18@uؼ ]"d^,S3"/:fBV^X xzcY%HMqbK5F6`QZC,',^gޡ# T kZoiZo)?&i H/a/fӻАI XT*EHi-+uʤq,S) *ChĒ_֚AHEobp| @ =m0xPPHA)u0ҿB>qJGŢ[CkBs0V-C£]z v-8hF&Spe}If^u]bNVt'o@W =y4lWLF0 ZlUWiOJL"rZ1Ho!lXLY}9V|>L])N/5h=eAFjc6*"QVkHhM,T8ן>t|Q h? _sݞ𽼑:ZcoK%5^[btN$Iԥ"6WT<'?:59++W"ԇch3 hVP-}7#5jaRQ>ޡ^j}vvJ ιms%BҠ5jR1Vb͵Ngggt>\wGo*jNR/-Xg/ձ]{9 4xው:H0ܚ[x5 _PHdU.CȁziM|l 岑yHHe+I!Oalskxtenm8zo3s.ij6ۢHcMe<Ȕ( teVr2Jf Y7q4\*qX  M祂GG5{_qʃG, eRֶ̈H;@i5 b [*/ԷE_gg8{H|Y?:Uý>g9Zr}i] _XIf˥4j |J}XK@=({`<]LuZ5_RĊutd+Նͩ_WR,7`Q}C!nrb؝ h,S]){Ca<Tw=,uX e## BHx|t%() :Ova!w^8(ɂArXwN>HގR<AqrEGyq*kYZ*:ȒW 5ҦOGhMBϒ41Hh=ߔOQB+dB4ݦ۝ڳ7$)?~l􅒅Co}8/G!2kY jd^f߇֕g:H*(;)T5 />K>8A#;*׊kORO?xo}8/DzTnԆAFMFOY:vӁv{LO*J2pJ#5>:^[?=양Z 4$nz`=1|z<|f  @ͦF>yX? pnGjDr6idn٠f3vQM7E[%(vF'ٸ6\[u(Swݿ`ο/6M&lHb]Ɠ?":R`ddFqhFl_Zf2-gᥜaEM`j9{kT >(;'G!]p%V,q*TN&;GZBcsK,3UQkCbN1s'BĂ)9r^@ҀSֳM9W^8hm4G>zY^p^e/u9 Z ݄ڎhz++X™"19 V6Rs9z &hd ,+︒#-E'҉4z7(خnԜř֬e}ZtvZ3;&4` RԢ{Ȧ0| %o[_Nc+}SmFXxH6ޙž/6t4kc!Zay>nXiO%ٙq4GV2MM]Nݧ%}^3%;:=)VJ6l,l  MR8(o$$xڟ@%qe]F;{o]%]Pg H6{8=Z[ RY ̩%Nb?'-5g{$[, zקF7[wd:jz^n~I*߲K"kL9SwONI [u&;f-c}VS\ء읻P 4##$b`k v-89r,Xy!p9!8_HZ۫;b}Tj%*pq]imKޝͽ;#h%#*8ۀ"o.$L^t^{b~ 89@ԩ兕e:PE;جλAmHlv Mѷm>DpÔH#(-/yVוfl=XE]6js3=Tϛa ZmqV4Ues}#mx:`o0eͶ V_a"d=&q4 d=ytXsQzYyL-@ ؎{X Mm%OҘK=q1% (jF!yLM\ᨋ2a.Un/t!dEBh =5=)у,H$q\9܃G\\_o^z!C[QO<_Δ`SWoM3XʮPmm7]bVd%$\< >nN7F JKt@@h:_]Zc&cjdD͕]Znqs4$.Xxs5[1B ޕC- ?}-|+6oPCzE_y w‡; ਌"!k+=CM8'TF^֦NY0]h7$0Iv ]f (36Cdqw^f,wT+)vuMM]doBvΓ9DVJIfxITo83gˇV/5wX`1#7@zf;uL84M ]02tVH柙d񑕐~ej"H fzp`:3!F1g#qtOkxB&t ~Ebx|w|46A%qF+~ Pn'}/'WB\/n -U7;p~F`00 PÔ[qҞ5 yzlz9 F"&?^_c~i ZV "GҀ8 D8.r~]/HcXDu%/ͥi-a!rBmJTMȨ2G; 9n"% ! T_vu!1#0!؂ob%;c7i+餚$9'RH$y:?yBt`^\|ԀX~N/˷Qd>a Xߢ+=JTtQ|{ڦcϝɐhXE_H#e'd8epM| * .JB }Ȗ.N^Hi  3Lt $ r_Kp Ŕ)YHRww%ty6c;1HEx:42yČ /n #  k㟜\Nj:Bnzۦ۞ћX ʠ< ޳jBW+ǻ8iX_(A i"w `d].qT%=D%Fۇ@^ECn [ODoA0xaJu@8#4ydm P$vc_\\WB;o%xO^' ]p5 xP((}ȥ#( 2K GWx$v%/L.,4z0'+ul=6']b%0sc/LV! (u…d_Rdz蚣 S1)[h@K }(!ӽ{_EX'{.aUF".~I,vk-KGi*k[O&b](fUEM`-=E6f]^pU"zn7L宸AAbI$cn{x:v{$b A$qV> | ╗3LaqRA4İ[g`b#DcH\i?B"鵐F?J2 g:z l3]  @%/1T 0g').`A b$ D'nw"PC`՟d} `(xD> O^ l3Qa+9Hx!R$&U"q®qo?Sw`n#fZ4wP h<"gi._u>=_#*1Q_ ` K@dSIUhr4\K1VW+  `h @LX: pgǞ:u "<!MJ#`,Iϣ BkX sH0T..d\(Y%@4IswC؁*|ĕ}ѩVdy҃`C&D3~\t6H(A`c]_Ǟl6fitK],udY|`4OWQKea 0W| #3 ;v9##T!uGln椞NQ:YrSxeYL@+<HF ⫦ ;,2C.u/|s'OT"?^Wa= z5; IIZN00bK ʼn}#d%;Ig@|^  Fxn93/JV邡 W FE=s$ݙymUa@d&E"bzEd_ S ^}(ЀZv n@;Zƍ2ߕ_wŏKl Vk + 6svڠf84 R VAX O`97}2g ՘lU0cR~/ O-\x`(K O49Ū] `ؗ~lz^d_t,ÿb uԏB {`$K%+.@E:Kaz{ʮ䦉~շM^_dHqV~S0KcXր /_t, X80 hM,e ݆J 4J݌U4mf[x^3 @bk6C4i U|4 (*rUGi0{3}Op S/|\Ǿ`8& \ +%5d2*JϚ83TvfIN"(]0dsũS^عvg? *k@~)HLJJEl!+Y$!+ Tn˼NkT 0g\.#]pSX0gRVi VK=)Yٹ1R}'8$ ȱ8'S)X( , :@:K_x[TdUr (9^"a]dC{ET`!Pug?1]_1.AnY JOB&B7VgG-;AYpZT{8\3mI`dꙑPBCYRP޴,-uLĄɪ\^N Vlebf2 W< [Hn7EQr,"3f1 wup< c=  4 /X,m''+w d=ܩrh-`TU$ e$ W`i`#ULDK0B@z@(҃II>sD$2j:u p^t,ЀTjPγt1 suFznDi @lxElRw`v| [#þn'ӴDZXrj})]p bDG1 u1Cc]QC @~J4%_:+lg3IœXG,[z'ܱxSRI$"/ ʕ9ha)i؀y ~ th)atw Ies@ [Qltvɺ2Lf@9&GWuc E!q?hЭ0;SVvG@c\@96 y6 /u@ͩLdAx;ϱtOzY_Kޥ{5^;*-zENapww R!!z\]?]!}gj%/ -C{ЊxD2sxS*T[-B }ZL  s]4o 燠b1]`ZEwKm Y#X,$ Yv c/8]Y8H̸xD#̓~[ + 4!P*] C\,ANZ 1vݦث/:(JJ˲@^5\D2$*ݵū׮aoe>A / |lfK<9uoln\A-PE:`7RzvdGVĜ F6F^{<Ȝ]eziiWpӫX9225祸}<67̜aV|+ lG48*2x5z keLndlg-f<2 q <9tXTу Q̔c+/ |%铅v{g##`ésee%SKK = ˽|I3c~[[ؒc`X׎' ]NOǩqE" }v~Ӌӓ//`ٝq*_Ӯ/nU(yc?vp`Ⴜ 3!^1?/VB :?=-X7ndS<6{KEch@(Z7W~QyaUf?я^ѫ7L9 _}UW8}dhE5!=ѐ$5xbV^i9F]-OQF[#5^{d%TJ[*}QEۖgax[,kMn3]>R.3РzC~,| =A߽ߝ~3;x߽wyNUVHj;8J˾JX_U2}1r*M@Vq!CIWMJJkhdRTJzʺi1.W T`jۼUFj?/K5'ePFYksHl{xmmom?@@ZNiAe*e +ֽ˥T+DTlXim'L#LI{=")5dzUQ[",F`yyʲ _\+Cml)9T¡梃K-hz _q].W.[$Vcì$#(WybUw:3vIUnMQXfZƦ[T]qLش iIdU|##KV꼎%+Y"%ukBK=:')[1625U7o`T^jdahg "lνCޙv Aٯ׳4OMS+Uoe|v/ggݗ<~\Y)NMEcX쨋#%Ψ˄b%XυYXda&/kKz d&ʥK-{|<ctu/KU:+55C]3m.@OzHts.<ȊԔ׭oԩS^{M~ujSSUߩSЩSȩS٬DN+7zJSۗʆf@yAYq-b(C.o[/z $0XJT=054:|_//KBA L&"ѩGDDܤr¾M:Y#QRI:ێͫ 7ˆ{EhtJh/U9` jYxu%r,+'* Ꙓ&Y$5+qCv*).6OM}cS+r.td069=]'|1\^v i*4qPsa0=e:ʙ0O6b=p{i(W<[/Tg*Vƙ28#^h&#uz~1l!J;T84?>uOSԩS_|qW_:uS{SSNkN$h.8@y1s;xE??Жga7WprʹzS~MNL# LH7E@WD|_7IEoߺyn_޽;;Vjvv\<;̌=\YD=l8T.*5f]m\&po {WCmBy ݕQ[V&W;7>Ɲk[7gtJ1 QDf ~t2rY6.JAPVӈ *OwHl(OɗӍ㆓C/0LJC&[5}]rMI;!;ӴwoF ~~oC{WW+Ѓ}ש἟NM}9!ʯd5:7곏fG{++M6:'~AE6rኗxU.[ on2]}q'O>qc7oC"̝Gˍ;p%s挾nUƉ\(;J M_gB R^])-G`*: k"޳lw:co AwSppD-O|dy) 5c̰7uFM8{ _.YqS[4jrObi=k+oGÒC9SDlv]ܥO&V~땕wWVRőWsΞfh-}.5GA]jF$u/Gv],_2g;;gIjͫ;Z r!ߤ >{ի*w7xvX50Bt/ ׈tf/鞥#jxl >#[ CeƙD ?&Zcހ]GtqXgQXsF%i"qa]yZӆ7jP4@lk@[p5o+tv.[[CW; z/ߕo_˿o_o;E}$%~|}rrs?_U8|.\ FcAqlh$;Z͛w:;>]T\[3G3V! ]5ۊ52'JtdF%“?NwG䕋%O7&5kCX U^15fLvЀU@tQ?DKǞXjc@om_R只^ZYE.(^Rv[7 >6Z\8 fk׋7^ـo[Oz ǫ?>>g-.~b端:w;+Nǿ<~y8xN-3az)/-; ?0A,^#eތIFmq6+D!7o%VDYrfZ"N[ӗK<)Orýfҝ0<+?om*JݼB5 VV X#+ՀM茦2SL^uM8[6dNHZqss|O;Ԓ矏ߥZ63:37>tRVYDFO}'eʛraCW-'VWwB(y8yNz:i:g__}N߽N_I tn=x3yN.:jGK{˺ٸ_ .`EזV 4s=yxkthh;,g Kͺ+#j!iS7YsQ]#_׾p;N:;%O9FܶđݫZеxQl=dt^{d[֭ԊKZn1OZukfZr.^=ب϶ԩQ=+x' y}1Wg_= x//ogx7Mo7>< ki8jtm֭7߼~\]O/OҨXeıE,+\9ث~2iu,K-AJI`Ф1 n#gfK9[҈ߚ lj9uq# ٳњ)53D!Y^ -crY-cVtqsS-IdZukN!8Gi"bK {ߝ Owx;!>|~mo{/}w~w_KEG?ψ\1u7;R'狋_||k;NMߜY\\]I&Kc_ Y8dg*R]3Ѐ⋡k.gj 7<񖌧kdtj,7=՜xDŽ<.du||sZmJcۛd!nkɩ֕ JL(dKUjTr_(0´'* x05`4YZt>:ٔYLaΌ͌t:ssEb"- 'Ne0kyuy=*Zp{?8.X^C=zhzŋ}V}ŋ_}uݻ/[/./6\lf67W=\t)'3wͥZ̄4e2KbT=y`s-r4B0sjeOZwaaedå1*):7?^X0it FLܹ!sgY1Fіf-LQ9EvQj)5~uZpEjZ틯j_V{FZmZrZ{͋gf5<8뀬?HCׇ!kw!_wȯ8ݱUJ4^4 /˜9=ṙpM 7]lȔ @52˴}a!\NscY^*7iwU].ҀZ+ `WcΉ 7m*;Q[#(6؅ ruLtwTI`2pQ"c8p8MyWlp#j4%WSKZs;p y]tڀy-x"ڻ vz÷z0o3gdN>w8}kv;`p盭R+gOVT*5JZ33LRwitt@2ḵDaGބEt3Q$L@42seuAG-8RuYjE=X1:zM4T ؄dƔJ Wg,KsЈjxkk: &i\i嫵:Je~X|U_W*wBrqRY|Ry@?3+ᵇp$3@LAV9ZK_r1x߿Eo>}=5y-y_=M;= rys\L'_|Q.U|Dj>3L1/IMbM^}]o^3B%6:Q͜YeV:Pq'B Euxe8 k qY. -y]N%'=({ \5vn\ظ&C-Шe+,}lV/[-]Ƽ%NBU[yqzz:ΑMY]..qgQ[6 9,_ /vz~PwT ˗~]Ӗ>>,sM+M]-ww/rss 1UrUGxge2S sZXyDý/..3:kpZ!QA&w_"ZwTGec}\aM$\%Tٹsďvv0{. 7?y;֖UY̸__}U,*LVk|y@Y_0]zVqxoz{ۀ<CS?v/}}f_|v3y̌a̭i؁׬ id^e[4faem: );;3ÛP(lE:w-7J0X_q3F=Bg31^69q+.vXmH#% wE >rN>8W;; owωcG7ū<ŌN>>{֨0Dի!cE`,z .871>RH͇"#E/ :tb{^~zpފr ?o槟ݟ}6?"+W];5vLsf~51Z)AwU^W@o `}m5m=KoD(:OHjH0Ph=%!HlE2\aٛa؛k ;wlnwP}ޫ}9읏nިI-]Shdj] Ϟ ]k4+B3:{6g k믿wyӧ_7h559AZ{6s4 @Out/LL.Լ  @_7B BfeVZe3k `#dz:b/vKF-`0Z/gW|X  e0UhZ(6o;XGl/ 㫻vP4mfR|z=Ko;@6PbmT 2v|m-Fnv>xesQRS>ኇݖrt+FSᯱl$+O 핆(>: wxG䕉2(!Rmwn\<[k`3=~cϳ+ξW~;Gs6M^ g27wY|{4;; Ү?y3ϭy<z`H HlֶQ3P5 =z?AdV gug*F F%t0 x$UBD%ϲ8ODYeVa .:+L_5o|v䋄b\;Gg޹sNOwLOo~qJ~yx_K6 >HQwfNy%ߴX+}ћ;?5 1zm;R:O+'J8NLQ ;AQ,[`;hq3Kha&Sp [hھh=&/,mZ t2ƒjmJIsĚ=)pDzR+ӕ(]gӝ7>LL{,s*7nܺE?7ss@OF9_ @palT9 lY'D?M$_6-6uSSPW+HB :B y:Ljht:7n[k^T,J8Ń*R - 󲵇ĕc1(vDw^-ӴMru^Gk2Ug5t9wˍk2 rL:=!gKM̼^3`קL6|nm#yԩyF8N4&R R-ó~t,u>7252L!й V%=r_:r1?H& >MJX ؗ,˄9.NZD%?#s>]Lū>:DX"\x%d`~D[!pl=X%S[u/={:,G{3BHhRK #d׳T9ܡYXc !9|=?nA(6Wk΢ݍ\_\?P4Rފ°JBaً]ȎjBa Buhr $ bT%hI:8E-4++_а@zMlx7MJ f^vNM(9pE >$8s&7v!4 s\s ZmѤ9HɴjKOfHf0/O4Ӕ!gσI,e9Co"lO^vBΖtElܶC( 86Dluٹ#&U|^eZ)(dzsZJ|yƓݚDӚM>̱ Mg=ؒm^%o۝i tx=;-6_UWǒ>gX4tD=*PSZ+}w~A̝vDx ~`9Q*l>@cc#cEPq ]0wv)2` S~*rlV[ P;,Hci7tV`FG2yY@L!CՔ1mRh`T*K^M el8syQmh!˻C{VZ[o {1e K#KKSIM,Lxy;ʥ%#hqS0ɛ\FFWIz 0 |!|mPkfNąj֬IiaZf%^' h>/};.x ֤5jVji:b-,,uo mfF.Cڡ2Ub lkC (<~Nje9I91P12,V^~}:RnJD=ud#NGr_iZ i[<*Jt\#}-/ xIENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/game_fonts.png0000664000175000017500000000500712412501752021566 0ustar brunobrunoPNG  IHDRbPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYs]EIDAThZ;( {SN&w"r{ 4HB̛WuZ-80Mj~g5ldh_ۇe$ mw̷M3mGg Y,?4IЪ?y%$U; 2Km>_/,kszq6/}^LKnYQ2?WΔ~g|Io^luhҚ_\/pPȬOcLcY/gc[5P-6kJ#ZN4#a8|ZE ެ{w^ RG|vl~ot zQKߕ_ȿ ci1lT8Q/xr3u @10ћM|06[άy8yP#8&@mx %m}E]A#Gq.ntrI?5I~/]f3F)3\ў.ʯձB㟤?{i.9;ӹiJVwy pO+8X8W`EDHo=&V;$WG{a_kpD=j14_?̾|"\T6Tj®9H!,)TSsV!6N5U+JJ QO,JI;EU.Q/f)眻EԎ"_kZsB0N*8YQthv 3O F0Q[R*:Y|&y"wП_M"MzPđ(ǟl Gl$WT|B=IbXV}!52?߸goXl(' X0!H~)NaEG[ד>'I޹Gq$QCR ʗ HxHzܟYB^sby|8< 7瘡tb~`">^O|Yެ>E_iQԨ$>'|^gYBEܢ?q~=?lmolj~`At"IENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/tilesmap.png0000664000175000017500000054741112412501752021274 0ustar brunobrunoPNG  IHDRP7q3PLTEO \,p3y1_ ; ?p.L\{T=\CLJl pHYsIDATxڴb#=,頼 ((rY>q|i!(qߏq|Î߻2?o4`?9ۧ-yA@sy.8~7>ey{w4go^.K/2s%SHIo=NCߟ?k@y"ǩW9ЩMAbqk?^9<⳽ngk.YuĄ_Zx͊o场u7&҇KXj8ݾOx>S|}PmjQ4k0|MsCokiH|M=~<ޛ~I!饖6*Bcv]R{לymV?e~h*_^6ݠ1)7Fwo?5y>߽{ywuT/|j<m Mmj@g2<|oF†ުuz'S꼽.Y4^?Qf m+s,j׮n't } T0>h4GTRvK ^w:Sz>&CͨN2٘LM{Ԏ 6˴Z$&i@ ` b/Ѷڿ>˿36Lṡ#f.yrmfd]?yT tS <+4թ(XNpƠ[](6SuzUP& ɁQmlfC[쿦Fʥl Bϰ.فPm8ߨBqմ k8ҍr;j@r{MħyVz;>e qϗ6jc\tuSytԊ<:ۼ 8P7_\;|MfM67 T=v-ٿMׇEz:b5t/qfߘ~V#sn%&DՉjsl$T_sy#zL]&n6zi V{rNkq|_〄H3VӔ6 ۰jGڲy~7}\]uk^Z+#gyoTBb=44 /CkbjQcT[S|Sp_cb`ۜۀ.ǫ21UR@u 4ckp:b(h g B T't!o?kڡe][h[{**(ڙ7^g01),6{ DSgs._7!V)8i1< Co-Liq*O8t,7!EB |$ЂBUz~n\afľi۫ pjj@]Otdm@yi:B9nX' hN/83;!#pA2T P,mezD ^ա.Z78O{fj*bVYTj{Q՜3^4L{8K0Oߚk@pBl؀&t @uj.x%ix|} 6t` 9Y>#;OűO,iw?k~(%*r>XqE#C5jt$Uo,SovtmtOLM"Q=Rab@){z2v窫10/ ĪϛS\TTGM1_C_"sMe  yI|7o4*?͍Ma)[x> `OMJH{{~mҺźs* YMz4S؟C {4,d 'Cq.( Y*Q x} `y|Tt]cnfVD|}-Vib_ـ.cl_zroz? ;L?vm_:~] t^4j6Nøy٦eL 7.HN6FHaxRij0\*#QY7T3j{'ˆwOOﻇN>5p;GH?Cź94!3иk0{s@fN8RߴnY!3jj@CmIa#٧+8Q>¦c#綡ۂaʑ_؀< g|S{`2Ѐ ;_ԯ#ᛶSOqK=S;vc̴p]}p(5blbit'ӇXƱ?۩@,hS#ڿnn?;ٙم[pz!1`ȰXp"z{nM 1 y^,0VptyPl߬׷;DKZe?/w;(>[ ;Xq6%37P'R{datѭkv+n-Jjsbzwgb ;/`p˄6s>cɱ Բ.zK>IΖ~LccxlSj `Rp@붸_ܼ`#b# "C d=uGo5?FQaշP(QOǞ04z|@W=#{:pd\X3=Ψ8E 1 8-͆4zn|P,\"SiwE9xoD!m"VԡB2{}=0{ :,jWM P81c{O{e3{MLAd%Q8@ՀǧG_!7@a3Hge~(qjRL閳a6No evl R< m1X[@l}zgռa`y_lx8gx j}I͞c*k2JѓS*ĆoV(q^FJCq LEZ4-S-G1_ՂmwS`qƕtB6ݟ~ЈL㏬D1Ab,~!rf}ra耥eB #ϳ\(Zf 2 M&Ӏ? A V:ЋBC͚%>?>Ӈ̜ˢ$3ao1ح X؀wUqo,W"}cQ|g9N~kóƪvFAZm9D{/QM04 `}Ԓ/6< ba@J}ӌ aB&„|ӣj-l@Oa&Zˬ'd =wcP7ذ ֈkȊ2#D-'m0J/kwsud"gw6OH5@|*Mkնk#` ZQA?ܴ{7Zn̤{ wNdQ,X~>#ro7Ρ)8F ]&:VwP-j` #GHK^V{1Tvru}w0~aa.;ARtrW6>G$e.|g yL)x:nZSညFMecZ]0[>X88kRbhQ}КS=*+tԽlR#ա^4Tf<Ϳwc$ 6;y 02*>'{$l5޻r=L )ؼ|ڼP(M|XΛ_bmrba*" OĿ.^k),xvs47#w3tݤc Og h.GtoK MD'][`;DSDD\FB a^ڔcRKQGϒuF|A7 w "ٵ&2%i(Wq]a= };|i/3jB >70$@2eC2vGٖGؓn#`P "9oxŷŦʚ2לȂW0/tN]`8,?]?Ii^?7|zf> 4..cu ]uy@X>Ӝ~HX~C,Qh'2$S]jA(8q:2b6$HXk W}yby>LM"0Cu٦5as/f>-FLzP媽ϧDFd"G$55{NZ@oudKtw8;oY dؖ 7{w؀E_fK;ҏl:#Fnߧ= ło_[ǒBݰE2TJ'YuS8~@g^5Sk?S8޽&$VLD"rKLq nhvۧcAqKR/8Tm<ӀGA>׫biKda?o|y A}h.ojʑtOT0Жϴ8Ut@L-23i?+mZdUvVwyzi$zlh?+g&k<&cKyjg=Ζ gCcA7>?W;*=1Ų~d3@մ]9_M\ E *Xxi.8tF $;7rj)lꍢ+qeK ]Gh 4iQp%jS847Ø5F< p0|ë22woJ:Y0HIF6 EqUtX=p;Ii2r=騡18mXLt8 5T |uXO_U`ypv)Nj̚Z 2a=|w7c/^NEl8΢ !7ęz,A?c[ αݰN}WXH9&y. F68^w(8$W11.OHU@x"0'^>@^;Ů5!X ;y{Xr34ol"W x'-96X߭yt 0W(zhs6r WKRM 4]+~F,?-5 {ɾLK^tNy5?бcZF<4A::8ub7 j؅d@o Pl@sRt LX4YO8C|abwR..bUV^pˠ, ` pT|9Χ]tBKF91dwˎ/|M!6NùN)0;pDF4E3X+̀lALA(==h&/lG"k: "s֕ {ZP!YZ%+l\8Xi7qmՀsD/! #O{&_A ' ·355$Gy7v /ar P 1-h=8P(Nr:V2L@mULZPTٕ҈^!h5F5VHCчQÀ TD[`z zہfA CWLtdàqH*x4!u&ƫL'\p[Hz6BF Py73K—oWÖp '$Bt ȃmw#'D7'8ᱱ)8Y9T)JwV12uכr41ADi'!+]]ȁpw Q]nV*M'.` e}_S/47Y٢|—װ .8m_oh@cSQ`AX.3nR7PbʢXO=4};R-N~}~6m\~gY얂?\ 3p#U,q֟xxvZVErŤ~ǂ ؀ *@wat0lxWMaZ"+hc2#T+pZ߈:uݴhy/]5n\' >q؀w S9b!C_ݼRvӫcS?6.S+j̪\ƛq]w_aGc t.=I䌬L>:2'/4hd\5bֶ0B `_F^x.2v9lHPAOPK6:{Q{Bj*|딡#Mq.Q!Zj=g2*6`DBȶ,8:!v$e!|qd rT(6rY[ ,|{'2p%gp(i&Bbi4ek xOF!9|@ul #2"rj;0)< -t(D-X{Js00zӀ`!ArȸLAh%#?D4>j]emQRlzJ]1b~wCǐX^Ch%g0C\6uI9) S$}Q,=òP5"P%TsJ rquEBQ{{D#'&^Bq > s i/M 툺Jх#鲌S4\(Q;<3ٳU̿E,gPjPRjE2qa^[ A5.I5ہK~o${4nG=# eK#'xڀ|? `ץRÙ8'j|tۢH>/|aE_O%p!T[΍mĢIa/{gbK |@^ 7t%TϋHݠ()4^j6_Rg.I&6aRx{Hpiv~ڎ=wu~÷S WX&[u!L3Xq@34t"#%et GK>xòa4+/u1p<WF@g6={K'dՀiFv~ra7ﭽ\9@Ū6$H#0@"#gyO7P#ŒɆI< <~E$ʨe2S6S Uk[{V#P5<1R{u;Z^#Ko5`er̄Nz]2[aiyjF:hɁ}֫ C^04bm@v{$فvo_]G9hGܢp?JSYC[按<#5Pt^qAR7Yi 7,lrTƑ Kqj>ӀP5U3+gB$Վ.rUıӒe=A˼F\Ђ=$/`\~HsĤQz5‽sd|HQƅA'E vR= [֊Jǂ,ԛ;5P[Ƃ {K"DG6/ޗv8` Gml£ tu3-b,|GpՀ/=yoYpS~K误sP7߾aeglc9H1C/%gqsOķZK]/ xnz=]` M1,(8KA4_~jևόa!cEs:EP%dzc˼#:^k8iRYZ}&2oXQ|Q)gsnc\ BC@I1rg9ҭrb"%?u39d:dZb#:h^=M;0O}/U+:04yl%ai)m$̐l2i.&NW*U T):m_򬶹G]v4wB|6chƳV֛3? \a{<ןoǽ=+Wj0/ty^3^`iF>tiK5cǤܻ-=:XSmI6^+6^= y݋e=b†KdϞ94@xV >^ax<{~6>?oLdlp!R}C򺕹'g89A`|:\?va#l}*3<\L^U[,vSRL򍭵"kx/<+Zޓ)i3UXK/iNw{ܮlo+7Shv神*<TӸ픡}x?XRl[{3Hj 7CIyG>_:ѰJߦhnokhˈ 5 =^_ L%oT-xXO1Ϟ|=5.R%W=h4-v)8cʵ6['MQ)֮]O=;dS^)h9\6db]{nblž}BI.ޖ /BWu=4`!I#Ec@^k0)S2mrvȳ>qGjw׏b^p}|<&?ogh)>V6.; 8$g@YxXnAڞ폡,3Hf-O/<FN̡lxzT%l@T 4%,@͜=g>_=o﷏ǒ6v v>K(`loqe3 O Ҿ9I8?vdqFvztAd(/оGD%zhH&zޯۀL w~&ߞK)jrLq_bm!$,8Xֵ=?q~?k"\c+LrDp}UCb_Ũ}X!R_)Hy{hf#*Hx3oYY5KajmM4MD̺X6ZqbXnIb ޮѐ'p@_Zoeͥ.z,!ϯ$5`迫n}؈'j1FgwXy f~:KHHw96˼O{5Xf he؀>}0Kqh,lz.?2iͳavg|9֡2֝k?]DcPUvs\m-|^Jlh w1Զ r2#!yqD{X1xGUO%z><i"8xD,qt U?M phS<-)nK>N_:Q 7ƵV}ܾ|dǛ$ӺzM;'rB[ǐ3qn6 |?(ZjeO> {+i9]w"XC~&< [ ^ɪzz˝_>|/rvM{/p V}zmS K'8NB$jyWgӔl۪UCޟl0&kN` Yk›_]D| 72IQ]7n_\Abˣ |+=?U'^43Q.2ig)l,  4$EBpLt5ׯΛ3u _ݢa_ٔ+^l wXcKL!jZm\p\*h*؈+Tq,7`?Lk,Qc^q]mM_/4dC% EXmU꿫 =BF!ڎj6^x4y.7@]^-[zM"0#!h|dj~M\XkL| ɸol6ܚs׾_Rz~[4a/[<|xXioC.2Z1dׇ납>p~DΉsI@ _1S304`Xh@pW%8^XCe..0G&*~ 6`b$)9ז_dj Yc$oXqM^N~\#T32N|y^)/K`6MCdl6p6QG6G)п~LV X4E5+"7pԍp7ٽ㍌ pǵ=a8p3g,3ߙJcԩ Si6\lU{a?_u;ڀ_;VE_{MGUu]5[El4 ZڢTg5#up;*^8gdΘ:Wő8{ʌ@uh |~5J>4 ;jB G, =HȚ𵝑Wlܖc6> __ڶ:m ^sZ'\jۡ^Y[or}b2HW唂Fi/Zz)~꿙 (|DVHV pjGՀ[5}MGq×Lpncj?vA5EH[Z/Rݍղb+2'XXRcQMu&QBqV_i6^q`cҽHVq*I#[clo"!(5Bx?i@#|s(ut*ߺOu5)al:]eOc[Weo)Wh kojx^k|NM|iVEeh0`dB=6y=x }Z(ʓO6VKU[ƂK6CMc")ϿpuX:vZZq9۵փՖ-ì~Y%FWlkdԺ`hCOz:Vz îbjK,+ XpnDTLY!{=]5m}^p϶wPw~qH%c 8VU4\!JtIhM5!MO*!"#FԌs= #yigs<{5pOFV\/"!%z>GoYmuxo-BɸysUuƿ 0 ա}߂.th4uہdv7\#GDī,/px5ϟfp._G @8'kt ٯ_b_u&x9o4PUX|76XE.ϪA{aYp!6Zp&(^zQrgD~HDv#~C$cd,>Nj^Iv߮CM;+$.ڂfbY|g#;Ȏ;y_> ;YZ5܁ֺTp4 \?'JהM Xlw:`Ħ%Ԅq.5!{QDH&d PE<}:lL|; Nd x|Yl5+>҈oG*Xfy0a5Ly~-5@B>`.(/i!_?$hi֣E8 >]F[^ I>g;Ƃ˭5!o"$ECˢ5vjq*{l!ewf91ՕcBe17 0t4豛' ӆӅP{5 iK>b3u$5nN#H [\")[J͡qهV:lѕALZP)d[0\'ƽqslmy͏t^,h8a8@y~_vīf;#z"~h]T#Z|_ Yw&{3tppJ~s_7DHV/뿂[dA^lUTL͘'Xt"7f 1rYjFj/$YmfA9ijz/tP,Xa<^͞XQ^m_D0m@ç|}t5ۚ75%&2H ~]_zUY+\sdRLVu_pB0q]qYڐ@!h@}6J)Q 5 ~!/Xq\[| c"\U^lȭ7}9${\=?b4n,p=˽79IZw\RSs!Sv#*\~FAY.^@!Dl}Ly0bw+_ F,۪8׆~.q68UM@hbѝ' ҷ6`DƒS8dW݁ JFB 7@M3H|Nv6# ؁Ǚޅ.KV:lp[oG 0de(]6ZqR[|+05'-W!km`C _uИ^pB> {?ёpu7&ךK 3oqķ~k"Ѐ(r6܀E' Q}&A;^Їau#>u95| c?8l@6L83Ix?ـ!|3{4 bo5Wɲ,TXaAʫ}Yr)FQ}`$ƍPO/R7!u+\[˅ 8FF6 ilU.(,\Au_m/y{ X5zH5Q|M`F+)I 1P7E|0hi%O}BO:gp?`U l;/8ZxKf S*5!a`?vy حVgdœvl3b+M,2bn hL #"R/d>!OHUj4|Sw3@\b{,imM KLɮתY ¢s1EMw]>"5_P'Eߊv2FAs^DBNou&Xqy?^!xM}`~W܂AHIYڀp%拊\~0WLN1HYeZ}ᾦjLWXP/g 8&^ݹvFP  bYqL4| '7Lϧ0C%'r$G4ـE@!==8j 0߷Y5n7oU</8*g),\Rh~E i_YxѿZ+CF̈MC$"!Yw.^~RZ𳕺`_Ө} O G0׺G0(0?`EԿ-SW†|1 7}B6y!|nn3 Xpcwm_HDt eWP2d OO QWD~@x}OF֔|xـGX[uZɪ/*m_"oYCُ?^qae4Ǭ@TSrɈ6| >c7boFjҀ\DSn#)Ijqsƿ<T . 7ĀqpKMאrEŽ>!%qېK[uV" g9Wۿ_%g}豀Zi{ 7XlBdv\Zecx-BF>PM+q ZtxBkB.^l07Lh~5k6\.ZʶL.,i&~..=_tqCvрDpNVƁ5FiK]NFM{քЈ)7j7TřChmϕe^رp|{Pm8i"&L^_D,y>Ƃِk/Z9ͣdl_^)-e._bsf+Cj)6Sij3%:*2?<78ÛGL)-nnX3|7gco9zԏ鑶^sOE@w#1ovulš.8kLPt~op OnIOtzGeo^;f1ҲEHL0&8`8hQ%wlpA 9 eN@5 /??q~ɖlbtnžUh;r,ciu[^bsZ]p8\7>D< +;wO>TAA3RGT^xNm8.Xۀ]}6L .?b;ڛ?qC?koٿ>)h@FJaj#^x\8[osJTgdR 7? -Iwܰkf8O0 Y&y+UؖE^w~OlSIa%K9o9y[J}{oj]v8W2V{tm:V#Rv8gY64_P:?`#L/m.#i_]`ؔՖk;[›&{nx~5ov5g8#Ǹ6^KWka^@z>+^{ SQj!쬦ϗz{߻E1m<㗏٪67T)Ӭ?Tp܊4V6tw\cq۟Ƽ\P@`v Kޅ벦 ; ^or1? ~qZ1~2 :ǖ?X14fSo]D!>>%+u}']]O8SY_/碗z 4HV뚌Re T3ApdeD]bze]{myCf^J+z>m=n|i&C](MQ%#^ -W3狥T,iYOp9,8^^ +>j@ zw뇢 fY .lEt 0Z&󭖾oώF#q{O?Ukp/;4`cG?_qN{ɭ Xn{jUE=z2XNs˱h;>a;CکL $@ia';Ϡf?}b9~*vJIע9x.jUv5Waw12c^q#Z\ `)Dh"{N/t|n(Px]5͌Mk9w#"f}Bdl?Jl18~a# 419^(;zݐ3A.>Fb NL+_Ɖ)xMziHs ҽ崣zhf#@ǀ Q-NC5CC:Ѯhe: (V7\04 l}>*zͽ~G2l09rkIKHFaA+.r(ޠ<\h^7nBC+c`"(Ij r1 a&\/A^^.>UTʪ$VWY b,;ȀV[N pw tSvG][ Wvs XKڤ* /M*ijY8XޑAd$ 'kLdtB3mYMthHhԻsm1g5/Y%W/Q K>P]{1f xA̤-K~CUˌ&*{$Fw_kv p#c N|]/~ 8hsJ3?BքGU#Luz [PF/]% ZO􀯋%Xvok0L[m2;MuW׋Cm6U^+ǩ΀:\H2+ExsJд[xzم{mauue;/jOG>G=:L> iQ5s5ʓ4`oyq7XpN{'؀9 j^߱}.3.;_(kÀ㤴)KվՀn?~֌W*8?z~ifڇbjB\ڀ(x5D9{%c?T2ѹ-FBǩ{2SR5ܢh-BNQ2!Y)AL_\ ϵ5f.0czPܦ}A|_K~QI5*pM*jc/g^`BFUVF^>ۀ)zuhˣkʨKNJSKk0yG֠as;95cCd+H>,@1<3׎LlȠ- !&_Ğo?ݾ9k!̒]}B8p0;&h,Ak'፪g>; *aqhk6Kf<BO|Tq;@,4wT|D-k[$al)sr wb0قC6[a_) rUb˦G7}$p $L\S|J;yD\DB g-kr0-C`~f<)5[e{$'C`R̘G`ӁO]i~WṀE*3m9u0Gv2s« <u=&DBK}l@:5=h@.8`&>{뤰|@ ;W{69fG7rJN~̔MAqC> ,8] iiCvWZ)\5!-֫se<)T }!sc*|yd6/0<.pBO%7ly2k>P)l"evDyP ـt_PJiV;Fzpfd,HEXƞя1ғClNS{V$=p{wCx~X @;Nh Ԁ$+`р} x^T<g]nw|P%kL|L8; Qn(χRuW@;|Qv`g`sq;0)ϬM"獙izJIvRόt 8{KD:b$qM,]rmPi_o4`tll8N!|A%B@ɜ)OMA98H#]y|]< rD4Ώl\4 }DzgØkq_붳경0 y=4AϘlZpx=P34O2:JI+6 X URlV 8&;xF_ޖ8iRjYM70vНej@OĂmp/j(o}>+"TfC<`b15oȞJS'CS&8`Kc|d~O \TrS x}FX@B}nNcKQiSn-5~#rLvH+i{'h5ċl}>,N6 򉘉O\[* W;#qR{y `80Si 56U~ -@cܻ4f27hg.R kYi { j~S, >`B 97ư_U^ۀaV5Tl@%,z|y42>+; t;Z}ժG2H$gnS2l@7YϲZR}#>|rpLfad~tPҞ7zر}*\ ps3^|xhNL^ iOQ|=0 g>łYouTf8aKBW 8i??7e?aɞ7Y#G>GXEq{ll?mVrS5A}~ݤjsz`/ew (6}##O d={l6lA¢aR L#z, Q8g'@Ԋ8u${ƠukQ~!؀V#8x`z4ȟ>L,v_eE23*)imΥTRZS1ݵjF)Ѐ#yqRsX.83PMף6x˼;{q[k=n mVFPݾʒR{c Υ_/8*XUKCؠ q;l@IY9n쫜 Dߞ/ˌy)I4yGgjoY):Rm@(t~j͓ӓ|dx+'R4zayQ1#e? <#Q={1S6 (?uzSVK(,Qt/8]z.)33 Ԁ0.*3R-Ҧ={bno旁Y`8gy72/0Nգw+0{JӘhM>`7GP8EB;p.l mgf0Fu!+WL̡)V.gpU~lr0q{[!ԊFB_hh,./&S+W ÕkU50Wts/|υg|P- b^\r󛖛cޛt}v}TnjTlǓd /&mHi1U(t 'Ko&M;:P뙲NX}0=v Kz[q_[ o^$\t'Jc>ɉH&O1oSDžYWC?~QfK6گvųiP@~K|#>G:v~g֮z]_5` XbW{hֺ`\ϱaWo_mpI36ޢ[\vTQP<6:#0o 0O,Ρ)M:_UcC&N2aĖg,ώg ,X+{ ƫ# |U|*u&k0A_(cHN^ˉ&hH?{ jE6~;K@ܝq{q1$|j@)iF4bgh@.H|{{tj҉j1sU$ `K6Iq|=݋QPbW/UQ3;EfwL$ӪdXlA7-)>Oj Z()&ĜupQ_A7|OL'P1|'4ౣgc ΄3N6SӍ:_`&uk5 ( a}][[qQ4y}O{oPXN%Ǐ2/8 ҏ_feǥ5gKTK$Qwxt8pW4'˙aK؀  8/_1 Zm;fn?)f+A>ܺԻj@A4Ī!Vl<._ s DZ/]xAE"b9PZU6.z=gE~菏}p.}cr$yh28{rF;zQ޼zhU X*6տvs 0k4< XW}ob<߾f]HQ75="Nt_iZ`q1H`j䑇nv#~En'qK]0z~s5o〿Ѐo!ˠ)YpL{〙ā@Ч{>ƖZ!"Emq#Ǎ7ƃPUz<_OLۯP",(@y,>q=9y(疀tt˅x tK:RG/Xp⬮z`O1OG7[~;agl´϶>v,OaSDW (#%yѴQ'yQ .8 4溸G#|?.Wk_c%|zrV=zF:-rЀ9!~ϻ{ *+wG5d %ƶm95`{>_Zkрؖͷmd vȘtрydpNIGvs䧛>I+,`gIF &JC*Ix`G=/+pB4a~ҀM51a5bz5w9vTcu z/b6$;XZ+7V!1lfk]66]*>q^sG_9Pd&Mh0oЀ;NxE_^#t%cj /OtLF f+[b3%"·ֽXA^=̞GvD0IR??qzUg3^i˧= ag " *rf?|AV@MVNR&,3΁t>1q$2 &c\괌 ,)ݽ pHT޷<[\3B7p;1$p8`I>9b>rɼ9ctrDuspM|즗q4 CޞlȈڇ.>- N JvϽ;q'j 8#eArU^ 8CM=+tIP594K>6~scq̔: SjٱxR5혶HI>ZyzyxYc>2sn c-8Cr)R=O^6.i6Eo8Mcca?C>`t2Xq@O|7_$S}^ #jRNy";/m_J ^;L^}FFڀj{c4Tl):%8S N K{Mty0k|+\i[ܑG8 n|us4)z8Ă/5O2/9 XK'|8L ^y/ rĦ1-ݦ W-!:#cǺT0FУk]y9(D;QRA$Rs-]ș&ȆN4^pq_ nOxϰ~C[~@{w--Q ݱ"G+(U.s|c3eJz~ed \Ґ]}[ϙ/1ŭcmwKHyų&'5[R`͗>`xoݑp5zP"+is8'jYb|vxkKdejWЕ| 3_{8g>8d)qpDKowTdP/.enkd(׏7GU$RI|DJ_"T'4!K&UT`|cěh,~$#>/64o V)Fn^OlҐcl{PY"ȇ]c=PRL{Oԧ>fhNqUSgqx~)(; <[p-݌m/5nY}ye%Wh |>ݢ}wozgL}jA:gOlzb̳C]^3% NSV#fc.GLGIZ]L#a x~| 4IEGy^ãJ[Őmo08OZkٳ4b}'p7Zn!XnT957 HEZ>ogL}}zpַm#[_BNzՀbz(h,t`:ol^Guy?+ᜨeB١B9Apf .ݑVnZ*R]F w&8Xc\'U%rS{- ϐ=Lzd!uO}ـZSp;11Y 1útgE<x㔱u.@*jź=x#CZh@]QXʙ;q \>jh^s[0g_6{^/,CS _x2zGГsV\14~R玫}:dEK 0Tv^s٦Cf%oԶ7ڱXx0^r ew iEMaS_Œ§E0-@Db)B`Yۉl*IPcf-E]X;v;P|N/WeIJ/LL,h81瓦lgl3JSp؀y P}~HE!fvR8SbWI+կQ dxΚ R r 3LT|U48S0}рo5;'G|Ywք& ?䠺ӌ ׀⶞i@s2V5`K bрu״&|#ʥY~,4stNo`-;@r4b[ٛYUJ'*ጲs 3ӭhSvjs_ _jJ.Qp@gW[Χ0Ϛm,* 8@-Աۗ]ccd )>Պ G{EHE[|nh8wY8;2JLOvѯr,Kmo/C}H/eǪ}k<OB,tC + 3 tgnu"pF#=*T4Bg7?jh@]δ5`r*y4Ų= 6kn\QA!EaQ̬㎢G֗ow^F6YynH3 Hg |ZwB?ۀ;r xĔ'1%fT41qczmN/W|J0 k6l5۽w3L9lĨzi ?˦ߢ 8G2`|Vkz>P$0R#_ڞqS5%jZeĕ}JwCv>| VfL<!.&;ne)P^3>xb؀6M}h n5Kr/Ѐ}dDH/QD'L[pH_k0{!t}GݩFh0Ԧej>hu~vjPֹ̻}mQ4B,Cq#&5ݭy2~G (VD8; `m0+WkcY wS2$V_0QÒPgT,jIaJ-`|QK\uͮVCIͱo8L9jʷ=4 xtmSNp :r.uYEU !Q0&)owR7:+x!ol@0(h wU)jAV;-0)!Npڀ- 0k{yn H+¯qU햅k7 p; ICbпpFn]?N&nPBRD;ٵF؀94il0Oe^0l,99^)"*Yt5?.5uP/^iāHHhBĂpB^ð]v}$m^wF$,:_ 45"N4K0ǀ|݇-\&.O?x[D[:yOxm}ΑitD|th =j 8h@ t`;]y(ΈW½|8|g8n"H /਽9 izh^Aoe}T^?p/J8 e3d CDxcE(>yB<؈Jd~pd-瞕vY/ L Q1s (tTm=aCpHDo~W ӁQ?dZ^g`NԌPË'$P5#P‡#uG-YZ]Y;`gx yNSpY_sγn@\nmbZzn!U'ЀGv=SzFaGҀ=⎣18~綶c8`XK>|%bɜsӖC(\5`&+36 /4`;%q#푐(ֵ~.4򉪸ϻǝ`^8X,'˟Ԑ5.pb v-`X=MNZ| ؂Ԏk"n+VʥG?<-P dD$] 5= 5JHY:n+0zܪM`pl Z'hwY# 8ͺ>+iǨ8 ,N> 1S?ӔQF4b2]c-i%#x`MP.-^ɂW7rb*}δ,$н`#oSp3 =#!/+:nC!.Cډ,6({>_ hO2h0S}/~ Y8[Nh/:k$#Pl8?7ѧW?VЁgj{G%NlpKB Elw|5ӳ:Oi<7!p}lؖ @Q+ib 7xj[h:y8L6}S\ӛ3YGHP5`f4]Ӥ.#߅6.b0q*Oj0qR[IDAT[n.+'wyn'0-8`  rjbe9"PH{> ?JIMpe=:{$b6sO)pI"PYD:w ,h֋6+JԀE(.:]}}#3gtɋyp@fo1Ub IdK,o30SHR0|Ăg{`!/MWp9Qv$QmtL@S(u   M#{7 0L^Ռ?1(J (RCZ%oKqb@`n颞5sYpKݳ=-]|ax4`m^`>8L|F f2r ⥶f/NXߒۤ{RýȐaZё,|;Õ|nCjy{%̳8 4XDxzEy3I`h(x5(Lز$ȶ zn p~%Kp[] Hb <-U(^3EG_W d@6o R:Ӏ))xH#q pDfډn?~7ڏt`R#i0XyD(`/S{ޮ6FY<}k XKN.8DB6dqҮ@tq$e~fMdL'-@tt!`Z'l.Մ LN`FPY&4cRRa> 4CӢ|,B2C#aF,.VK,|nY0o {H(EF.29~Қ{B?ؾhJmi{ȍdHvD0NΙF`ͫynz~ /Нgy FFV*yq$h3 G r3; l8Kt28({%y"z=4rodnWՉX%Li%܌i% 1 eҒiyc3>fɧљ<5{ ^ B@0œ| &l#=8MˆA^4rq@:N;PaNjJ`V(t7Cu[j x}xԺ2PK5)ܧN1,?\sǹ0Y5TWO{X4L3 QE_Z)r|o2 hmy#K,#9 -=ER eάAfOK$V`QĈНP? }\TZ"˜xʑYG:ihDʲh͖u&47'!lfߪW'_c10\W,QN*OO&zL5/'χk="8yyJ!Lc"s}eSo^G#:fn=,~8 ˆ1EJu} fQ5N(O <0VnQ"D1CBX?ժ8- c V6T~|W⺑[scըC1:@v4ۀ#'!eh?'?/m ]*=@hEFsMw']_- ->o\כpmBUQ*UH9f8?\-Ź`9>uR]`Oas-<~=pK'5$=ﻃ)4>iyɠv/7wa -S\`"+N) A0jOdT]}dhc.<ipȽ@g!#mT.\?|GCߴtj7@^rlw` t(l>Hq]rW-ԙ-gwlmG&ʞ R{e |OL~QTu^PkH3(vS.WA@{j9]m Qwh3oب':F@PwHHi$D٦ [:~W/Bq0VPO}HjVi@wJɧt,)Sl4`3nr< ]녣QP>>mCKŕ:(wj"*O^9'Ӵ<'z/<}śʰldoxhozPkNea!@Ou$JA`"o-0<CC%f !1a0Ӂ qdyK>`\->P6RPsr(|>א0UU~ vgF)8Yf^,ZtD> =]ޝO횯eˏ-0?tg[]4L7uv~bb/e gkLԄD϶!?4\~*@ϥTA3AKF5*`#I d8[dA1 QF͈V'#€A9G2^Grh|&%G C. 6}aw*Fr;0; )WK hF %jGdHѐB ʀaf0Oҏ*M#YW} (u V'+4ipH1Pw&D;XဉeN #R}7H+qP-P>C=|Ѐm"Zh@@Bm`;3'U20Z^{>ʝ蹾.?ox@'-P$bOTDmLk[5 6v낓-ZES޲mDф牔 Gֶ\ w/`ڀi$YUhX/.(n[L' xGw'W{n 7L<^,=Săpu*?R-UsY0c.JH,ē QaBbj VhU hqNiφ`@]5E y6s⍦8Ӊ8 ,%;VY0#|3+` A4 t(DhV˥8l\C;0jF"GQ0C0z&4bq^:10%*~`w鮜<μP6}#ph_lĈ>uQ~p'xk:4C6Z-GUs9xN7GFB. AXY:8!a})יQa  bRa*[V5̨ACRi q𦍁@ќ 3 xp+'4̀ЀtTҀLRɝ+.8)Y^p3.%(8UAG>"Fbt&LH[x;uJrnhք[V)$J_4g?b >c>ɦ4Ԁ QqhЀol,:j{~^rV=sA 9$'5+i}> YgtpzHe ?t04j]myx(뿯Ȉ9zkf t4VCgN-BҀpNPؤ/fnP؀!aNAq^l)pܹ)6Hڀckz^AiEC\o_WV,)xG_` ޭ俇3K``;GBd 8-ώ蘂 2A=;ZG'No:7L6l_"M^nf0dՀ Ӹrр '4`_;T'9rx=G/¸ߥRaP 5cx8t 0BY4JS4r8@ϡvz5jdzZ'38N&4W\Bi`~ք,69aWPLg'|?I[v;g0^'ơgƂa^7`f"EGTnߋt+'l؀bG{/R1*07_{pрBc/B R!.*81H8=jth; Ya J4`Fq+_n&#qR1b{q%Œd[{RB` E/ @?/DB.6M~%Vjý D|kCM ^R{q33mU4f$|6Az1QNy)&nxad,x܈XkH3VoZ cp032I;mm#pڀv:W?H,,?2L9.QhcI-ݣ.ݽ<+x4ܺk׀SWzOSOڀOnnh qW9DД襉~wxgⰗgZ}RoS/ۀ5i<Όpt+ cWB"BfxZN6ܪ%L?6 iHXr[R3f6ٲ A'3-s'vG)h̎`@"s- )NBz+}<443H%>{\wojB*>pA`~j@󗓘.t>/;T(Woƴ7u8r)?%K @cΦP AP"!]9*% ~Au2;`yxi;)!L x mAg>]>\惶ojA,3|.6ooi!ۉ< o.g4~Ϡ'B})P YC#EIX(]4gloHk%O~nh8+0g1k,&>>'Xۅ|xF3DM ˸y嫧3=[ e@f@CQ3g| [[u~S._P/=JѬ}m6Fm0uR1K!Κm3ڻЀ!p%}9,-u~.SBr,o;=[6^٫E/c1bZ0Vɫ*8w[QXzSO ͧ6 l-~@TPc9ǏH;yEnn0Hh=SLoyX=_1 װfa"n#:i6k@MYٽ9eNg-+[8Q{է{Iy63lB_i_qNEıǖD_p/ҶQ{QnSkx6_Zgń9qv\5/r:0طhw?]Y>2C 뉈'Xo*HmKlǮ_ Tm5*rγ?Fd'fnOb#ONA N9'TRC;;/ R!%{:T)G(3 qF_ȡKV^]h:P=ߺ ؓ ] O~.p>zV!) Ӏ~LMV%L±L|:PC3Tbۀ4/8@~aLVq  1o [\sasV׫RpF킖_!>C~7l_G\A{ԝPpc8D\[s/ ))%;[4_$*>ݖHIS'umO* ofr éz'HO7[4 xp1M')C?Oyu8C5[;8('ׁ3i4MS!jPBrMFܛo,NTP\;!\E76 +C`+Ó`ցyg K@<T4=IlY?o\Cw<|5 oOBրR < 70(??3f[z^ފ0а=<ʓu5yѺnaę.@4f kV}$dMy?!Sg>)뿜߇[Swd?ǥ:|z}(8 ?3?9cyTḎj .)M0v)3L'~@:ਫUelJ?*?aC?$2F$H8]`"ksz۽/yW0Zq#7s0Bv%&FжHlM^gyohUEx#-OZ3{*@3+,6#Jv'nxTh^ǻLړr{N՘Gf&. r`h=w+|5,jYЫi*^`_OXL~DCj_|=L8LX:Ł?@ӂ¸!}a\UCWؚ'8%kǒsɧQ_xL\[&$YꏇRtsh♆?.0LU,zQ5f+0`>t}OSY풯YXS-V`˷Sxۗ~ ]&KwDWEyf}-(Nx:.Bq>Xp@MQh$ ӚbBl)Ml̅uJuғ9p@ZDF|I_x5ݐ' p+bå+rO (o@t7*1wQ\Ͻ`&|Q_ `~@6@~..qVSp}]EP> z%ǣہg1,VFp<!}:rQۀS^ȋ\fMӷ;y^NV#`oځ=S6muS}--{/ՄԨ[D%]Wdpb` CDowǶSK& BL Qʷ̜cÝ4|@ y;NG笞lq.(o{ъ!Ouh`G# ZX}3y[#m6S05ow GTI9\a4_)}3oQ)|}DdI[ʚw6`T~+JbkVMdD+~i1љ9vX}>YOM"AneZc j}bҲ5m|UKV4l@0rV-~,kq3~DAAԥ"-8]rCwqU[ -g(ºk@*P.<\:c\pe448(RLj2rz'L&q9LÎUeJ .L99jbEINy{\ḧjPoEgx8x=JÕX3߯%(~%W3p2HB]0p5?ڛśhKîq#,HGℑ'6 ]2s`;m<8O=0 6 ML}N~h"!T33wDPzl;NSV;;2j@=tlY.\s1aNu*t6|yqpO-_us/:/C{N$Ny7& #uٳ)#O1,"ܨ{C V(h#EI ;'L>6ѝأJ?I7z,mųaeW!^~w/'HU>'$ E3/d;^g#u7 t\ fws_KrL* ^fѥ|ڀ8Weؒf /z'h_\2?ޟ Xp8WީwƏgalӷ!_ ΏϺmY-客<ڎ=.xߠ#ޡ7Z{EmB- #CfP/[M9t$G:2J߈$[Fz!mg?w<Ɉv]ة#$8gPG+Y+' 04m>783mlr^\x a bASܖ²s_x{$sU]oEdOA7hÉXt 6`/̈R!QD(W_e̾R+l^颯PE^ 8 g[1߮&oI >vu }qY@5^eXB:x$]^,$Rᬕ;` 7.^DvzĻ{\3BYdo3#zEZY2iԺ\)%oKan~ҫ{2cV;d|;g$,/ .8:a<9Ϻ{k 5#x,G28<0%'!?q&쒌A<-"t60L&AF?3D) EW-f$H[YdMǽT1jX9ˡC- I%,̪(z*^W'6`^~c3߳jℇGy-J$o̸d?oap~-n3,o!&yWVe^JM+1/I!{DW(ׯi|oUQ6{c2,6CoWd\#tBd3:²1,quuY|ǨN '. Ev,zna߶C{~P>xZ{ 3Wf4ׇ_ygV2//vyxLNFSn}<vq+|k~)r ʸ]4S p~ϬڽIJn"!yeԣ7vЍ6_/H֛qu{mz?8 ƕ.nY^l~f\57o}8X>K ΣS1bD8gG=S6Wݽꅣ^ys{ȋU4ٱj[y?VvjP<N/zo "#[p?ޫ xr:+ nhׯֹY!fzna=L$@ Mܗi@Ag$̈fD3t{-pưC1UYJե&$-#23sh~Z0p5OP32-; 6GLѾ3a18'_TNx2׭#x?D0׫:0# `Pld@sQ8oe+n [_MBu!Y+{md\^iϞ0Zxc>~)[jo;֜[~@T+:.$x7D0kB9bՀ:`3:8MtZZ;qolvd_-d |Jzurm G)h@t S?Ol1  ̮h o1nl:)"q7M9Ftݖ[- d]h̢pR[b۲| ʯG~; ck!WЌm{AK,-LwZO/<3U n(q] ЂcWNHͤ lkpL:a*#c~O˻H@fPg}~G xPG >#5 u^p@ Do4OgL`zUd_ 'b z|3^dHƅ3R:|Ά;.Y"OŒPfn}qXOg~Q7x8$<𾌙4(|6`G./8u< W{-V( w?wE 1ܭ9lZ2NI_dISЎNpuf,J*DZCWf4 PsBFׁJOۍY4`>"D h: ^(8``;uȼhnsxo HpD_gC$Mҷ~) I呍K)a$:W6<O(_>~zhH0.x6^q gMȖp{x3,yTkB `~HsMMfUȇ'>@j Cj*?2#s 54U>0POs.ѧ#^?dPE`ISt"Zv yyU|)oq@'DBP#_&@ITܓ(3pCױ m[Vf ΎniK&4upRE2lf JqDxתּǩxh)P}ݶ{ExGd'-K|'F.&m3bpYAmȄhAnwᆑUV>_"ΎMJk@\ǰч[L>"aO 0\Cf,P ~kⅇ‷ N:6 :PΡx1EW5!o3v .$EpC~=ӳج*9 [GlqkVC6;o$0mO1tYN/}&FbUq׺߲ɈXdkbi6ojBP_sP v8nLh6%JA'{}’׀TW*"pM8YBLsIe {(1Wf6>':/9vJ FMM1a z„fvwQ},PU~еYg{X]@NT׺`pp\p:r"#s]?sdkp 2yX'{;axps@~/ɢ_Zbqa1c˰DK2iH7hnRݬ_ ߵ*Y*ο=KaPz[!:p 6{G8cҺH(NpӰ3U4֔ +t7eg%ɪ~z%XMM7cF U[iroSTBU9y4Zoc'7oun|1l2 @F<"'G]21ګmѦfCS]U\K)H'&9t@E#`bQqժ ~Q>Q 6qױ#rb -76@poLrN LRiV R~LHѥҋș+BÈg_4P"ylٿh-e>`s8tI8e.xw~ݻO;&Ѹ nuJI}+># PW|y3+;y$K#`{=ux9.rVkc|+'RNEsXlȜ$hm{xf ~.EA-)81'zIv3*^_lOr@FeZ jSbyn, ,‹ ZZҖNȠzcGN!Ho 'w<#-ຟyS#.v$j,:\TufG\-;v)HYrZd늯"Wh#+?+?䌟U9yqj')|/\jȕ8#F2HUv℔7(.o#V (DO.wSCMϧ 3'Έ\4P>C}@‰mgH]1{CxfۚNiu[Ո꽻]ߏ_?ب*6FDW#Q 1t,G6Lg9-{~"geH x.ڮ&7a9y!f n: mTm$k!ˉ*8$E۪8yD1]}03RW>,x-*f2=n3:p%qRRެh`~kua7+Pr [^oj@L{ErIPV%ux DL#ᅓ')'/`μ9ի*k8 "v*>P#: 'AfAc"6^\Y}ʥb=Ơ >"B¹lMl@G<|u߉LYh+E{k HSi%d3]ٱ줬 x)Am nrχ)oqM??_f hYO?-tjr;{G{_p<Bvd?/8Va4 4`O5`ļPf4|_U!ƄRkk`!(;65!fa+:<]_"5`@55G3K>iOJ],uǙGخ}?gRx QU 1\l,>ո搈ig2ƪv^Dd{ǷƅPӡε; h*pANkW PfLGx [F:M#T7&L5Uzک_KAdݲC"Ey67Aۯf!nNMUs'ȇh-Ǣ )u-2 ;sz65XV7q*;'D.1 ؀Zr( $e|WVOtN"S`N힞Rn>!?HC p>&t}4iýF;%R K Uvq%!_GL)HDhv 0c]blkB:qxaSd,Q h]^c lT"f >p6"Bwy#$0p8m{>". nrABS pM~X5OypqՊo{ @yNE`{T8v { ~u<4nnd^H؀fc6:CU䫙$,Q,%55%W iXu*8p-Im~~x--o$KSa= \ye\`\HV#{1l_/~>ݏqYG#0 jAVy_VK3a" Jbd[/p1 I2P"zv6ng2JPQs r=7Ǟ_UAТ[HHGKt`" sbm7Fӂz(QORg<=VzP| ."`p}N^eJRlnvMECC5?FFߢ.:ǭa1+~~,.5נȶU2T_{J^Mt7` >XMqՀ_W pѽ?? cI_rHs%}ʃ |F?)077|@KQ{o1}QUp8!Hq%'<Кy ݲc]ލJv1UgAeO|o=!uN2_L (nQayGᒗ~ףE L[7"Oθ/^G8|߽m]>W"7="y_,],̟Zآ[sػ:;Rdm@uuPz=66cd@GuT7oa!m$Eɩ$6Rp7ohpca(As/^v HHdȉajfj[ OoeU񗼉x$k:>k۲tx-pϫ ])ŷqbCR1G֭yrmKnX5r/%_X^=wSQD:X$Bq8vz- Svv/Mȭxcda/1l. pwAbtφՌ޽.&;RpCtf4cR'Yí6EI 2SAE(Pwawcl%/4y ŝTrM33ESX_?2fD(Nb:6[]#o6 эFejƒ~xkufUǭCX[M/fmfc,>&(_1iߘ@Յ y=SnZ`XpONrp-‱NҾр^e4ba]~7lt両xMɭ9Dzwgfh>~6 uB]gy92f]1-3NE5KD{?ј[~XmY7SxTq? /Wξ{ Pz /A׀0#a{'uѐv C+\fdk;2 0zJ|Y{uBI "0"U8o!Y1Oò?OCڐe~-{ .G n{x֑=;mq˲JS3Ap]=c n]֋1yXd4l@*P*8f_yuo$1H~LP4@.tMx6ix5cՀh9on/2tZI/:|ՀF<d^=,~+N8C }68#ߏ|=L)fۊ v!'pShmSw 3:5)ּny`^/u7Lg 89HK} "dp$7ZΒERINnYk]Jvc o};R=uwcQM><6Y`V)rȥ2m$5rh &,7g7AlNlvlO +ռJ^KbϜp$0_2O$~oƹM|zV끁 .WЙg}Ju&`l(t<~]Ξ&ad̺jOBdBEE(^F*jiB9=yZuzV۱G!]OzÒhGʧo=,BEe𱗟:GQخS`KF ͮ,} u# Rp?\G`J|Qm8N}?]K:?^05GcF1ci@넹4#=|ȠjxCnı,RAG15*n$ -WT򓗜7AQw0\RK'a=9"Bm>EHfru)@Fcwޜۤq^eJ'zfOH1+> KblLE%F1vqlq;(+~A7^%4 ćW#9Q(m4b#lZn\U&Rqb: /vԣɯg:WձG$Q2xVE=6җ}r4`2LFTC2:fg!Y@LM>!0rٶem,c싒H@CH\F)Ob(~Gk(M pLKz!fX%d8R?H֢GCǝ-/A4@aQ;; >QkwPgWv6%5 .sbmPDt;G|94aō ȃ2gdP\E I5 ;',x'F\6PųD%ø:W|/x\p>9t| )676%XKm\6qOb| ڧE]ȻH{>3mxh"qcESvZ mUѠ) :&7a1C].D\Vlj( #/"`;.{ӱ].™뿃a$X9o=ZXm--b^] h8 gTW̟aEnC}%]E#Mk9{F@UXZm?0}VR;opcyQ 11 :l@rtWdL@\M+]8fzޞ̃tl鬎;Na: dP6"αP4 KƘ牦X:` %Բ78^ FOCO@C,f V6Y50mP2,ҷ e?TT/7Oڱz[=G7 r_F5l)5fIeNCby~ >7ӈNel0'1HĂM̈́@lWq<Gu*U8nk8[P"ѫia 7^p/<: yO9ha_G/m f 8!eF۶ P9b]U=!hz z!Y-,EKCk改{v~SZԫ}׻Dh9>TFN9];BlB+;f̔tTVjy˜e4huLFq9vοo%0/MU&n_d5ܲc`q^q*\8eMbW>c=nΌ ZAnM-g@WX&fAm+rrq7}UU W'6#yIq#s!=%4:FbB`Ms ]lNy(ohDM$3ǭiWo;:yvl&sf¼a@X Pϣ߲8 v k=ZLr,L@zpJ4XQ,$[@6bҽ[5O[ܳmpHx;F5yF==Ⱥ8^EхhTX{lPUș <@s ha: (iKX 8%U;kL'< iqĽ`1[ځy9ugwP*ܹﭱ^.v?dGȻ)82Sc Ῥȫe: ~{SǢn?G&3k$Mn`(T3 >g A(RsHA.a񉰆qKP'e7cWL̲Q{$q`hԁpaV9+ps'vew27')ٶ^tH#5} N8#YӉڰ*/zUeXcxEyCBvCN2YbU^81&5x f#ilx 'i9ҧĥEXj07N8'l-Xzlos8hQsx=,[67iViclkZ+؟b|Ѐq `cЗ,[Ɖک!XnPG{&1G@6bw0DxKGDЊT< ><"a+@斦~n;&urqu} f<.i `3!t@c3g-Qątj[eX Dm4頟'?%}{5@Zf=p@&{CQcCGXΉkwFyC m4E//8;-,t@ 9S: p֡^.Mf]ʎYaFe,50_C;AE[yg/#!hyI"G'VU'duc$Rm["/.mzw?P_|`Q2`1 _1zd 6SvnYrTK VdkĂ?sG;v,3&Xۗ΋ޔ)̿W>.G*Y0SPaҁy%fJ5L =4G:fmJ_%/rE c՞o6q>|譔#ñ,2Šԫ;/gVZo\_8ڝs:4bviߵ1[Kݱ>qk#M3 Ru{ăO%vp:g7ZuN}%Z`:flEjE}~t~@]31 4LGRˇeW>GbbTP^~3BZ]7뀯۵|=}ac/w \2꒡cGͮmPz0ֈl$_K:WFEraRԮ&%"ivC> hB)P),8h@$I˗8`~)X>vfT`02-xQweQ gW!5OQtf';e?)`~\QYdpW,7ؓslbae? a׀Vz绷af.O9u? 9TIuճrzo6f]{]"/i㲑+/P|lZG c;)nOh!uEH*> 8([ 2V!v .ۢ"E{ݥB]<tOmKck4,~,o@ثEz,/a; h"+#3 LdRaߞ&DHf [̭,ב*E2Q El$2i'߶Kպ#%s\Fo||1s||qyvL<ݭ 7>#K7L*~mVA4,jpa)< HȹF0˰uphWW6SpV+򕘷]ޱocѝ/#Xµ\F>ˀ`984!#q_6uG0}r;u;za :=YI&+bS䘏=n|6`)<;ûcmajaCR(Њ; *L:R;":Ӭ |v&t#Gzm0R 9Ź|ۧ"438Ի~j~.'fؕXڸսѳIYaci@ F8h-Hѝ^f0/giuMhY+ko'olCZ,!fKd.X>l@읮m-3a'o"Q#H\ l}H_PfF:؄8JX)̤q"[ 6Ԃ{5j11v@ 9Yt⥞z,kVfWG8@Y6jפRS;9Q2a?}#JADNu`?X mB^yQO{yU^R{'CN%X.^ f}@hU揬`T@M cb O+iHermRnV_*oi;u_Ks6(j2ncKFGVb.ݚ@0q[}ܘFLHGIO|Z׀0(U^|G~Ǒl3D47cjE[n0+FΉ=<M:dQfNo9ѨmÍ -A9{ {rV.S04 ZL9bDvtSQ`Dvl CCe|>M^'؎|-;eBMsf3b+ql*{{?IFB^f):#Rԕr-W^> ^ Z7\ 䪍-C.ԟ^c70zDԜGbf};[`UkB7v5 ]ǪE2.@tQ/X&DFsDGlܵэi) ]|ϼϷ^8iDO<ȲdLW݁{y̋cϋ{ ]WSUH/<⃎pFGm0:js(b%-A>,ZPXr %7P}=.~ lDҽo o)CLbx݃x8ϼ V]dAա]`M dۚ.{y7C!ae͒?Y0Gl>W!ob|S@ͤe>s϶!CVW](}اgD۩Mu;n#`7Fl;;7IE$D{O (A&R@Q$?f߄K1{%6.J6 `] ~XU^\#/c\2S#V5黥:1(Ӵ dkJޟ(v%)2W }`̆ Z2 F3j,Xu3h>"2cwd7kڣֳze]"AcJcto8YvsX9tk p[&J(9`BdWӊRqs<2›,Mvukdz e;t$x6m2٭l^.ԳꔁȻq*t_!1Ik8d"* ݝG۪&î@NRj누V0BdsRtAKFd LT^P9 RdpS_Ţ6LTW>% FY]#ftI }uFo<}uBræuHVIGhW~ay@Z"Є٨lJ]R;w2=sMFRa$qS'RO"x-kZJ") &dt {A0ro< #k>OQëwaDU ʌ}@"?! GB0H5wNˊh!@ZsQSb1=?#Z[5c;v̐nݛKMT יܓp\>ײ*ƱyL|b3@L2z/ҩ2e^yBpakD_=a/bzQ;[.ZѤg7}ԈG!ռ 64+O2[$^S}$9"|B!^$o@ebu3"х#=LN_0"FʣI-ׄ7ϙ{Ϥא/ HP *<yxhq7i^![J\E]84"@bPp kbFEeX*ZHq m_ #TP↡} e,mib/=Xz~/ a58P[+;>7&b8q'G}cC3ֻ+nѺi/y0yc j]0TJ-0mRc|aTYb֮G^pol=YYZpn6& B@&\Wզ\|NE"V5!RE1792tsҏ/|ʛnA M!Fv7g*kMVAxVFb}O j)ogF5Z⇱KUu(1KGI;?~ geR+1ݰ?[syi@k/!糸0+?`0|vV)B@}[Ehڂ /]6ln mbJ[Wa)p6:a~XSx< 盢,\؁XyyQ~Q}L^kZ49f~'s2?`:s΀wc§Iwp!W+'k LSa3jֹW:~XGvĐ>{v/;)*!+_>P?oyc`H(T'ݴ#9 *KLd\X@+Fwqԉj? `Qn7~@RU]`w^~]YZT|XJ3B QZ?ɡ>+chT&[p](ur88]eҩR$b/R1,?2hd /0>5#xȺnK?`^tc*lHPNxe,]wgASLvnIYP8 ] R,_'!` {\Kg?`KP$3Hox[XĂ(뤖V AƄF9j ȓ^5nJ1t,~Lf%ipGwo7K&ks>:v*FB#2~e г1BaO `sw5 h:~njҺt0}}m-PUnlo*!_,Dńe5 3ރR^q\` o^~@A_jGy*:)kfJE=E,Y\XU)zc)Si6>`||-`ÜdS*cE9PD]RS+#ߐׁ#V@D}lSOdl̂A֖q";ۑm`-q:}M+?RnR$H%Ef[p׎oZ]2ztl+o5~(PTvni`w f+mjL脀fj d*棡qE9A- e,YvZŗ;sVwEI::`YྐྵƪL +jF{CehFMUa(V0!JP*\S DY!לlY.")Nl_a-,d۪xGukIDATvrݸ ] !ƄPKC~Xtp@_݋OZ.ؠLh+O}ZX؂"`݃T&TJ1 0O8#]1Y%&_Z>֯$Ru,ؙL6&VgV! s(+"vL[=bH#kUUuZ٥־/O:d$Kga3򔐘 .#K:-ȝ*Ovf& 9"ౢ?֕> ~g)#$.u@k X.B? i;cn>)!lu EG5*Wa{_f$|XE9- kO%RFȌ hUMǭOΫ5a/|NA&ΣO n>y8ʋa=ⶉEXU&7J4[`ȑ_! j˨uw"@ Q_x<:`>ӲsP~d <Eem}<}y#W["ƝZX@W5!5)r`XpTJ ֏R.:T3&83obQ,$'|? nINI$O†vrO#j{D7z,W>*7@pd['Mn-xdCˆxdPhot8(8sfEi&űE9/t@߬NX҃5_V/ꂋ&k?M : +$̛Ubw q5)d;]g[9h|~h$;Yvm{`~}(a{Y7mdn'Gh=|W<}Sk$i a6l]t$XL"صBʘ 3)*>h+Nw o~4׺]?Ry rP;AZUG%h7&:ZI1)GêzO]H{!dlaYsOIͬpl|&y&Qgaf4n; |h6Zu^&w@ @y Ukk3@.q;8SAYd(/O+ WZ{vEH%ؗeQ4HE&4KX+`چч {o ;v>|{hoi?A¼.+}*]5@Z$ͷWa]jY܊֞k|lH-XDOL@öy/$@z 5 7d,Vn-A=oR@[@AP.v3uwߚ TNeR 1V˃јkfC%U"D+$C@>[phBJ%Gڝ(fnGKLe@Z#g%M @CZ$IC]c El 9<g;~K5e͏V9,$zI}9 +|q3L&_&h  u<ܴB0JcJ(B1="oQ׭;nX=m`oRaG$d{Umi;sj1qn8/53NRYzmj5B5J>/c5Ͽ:`] Bf[O?w6^8 瘲.:HC_|A$Du@ YޠˍoDP#41="K=iJRfϬm" A5o f9j Ͻ["9cOH:ka &w$ 'l2^ԃ;<l6hOf~ȭM\l adbY("%">~oT>!*pZCu@6!FoK!qS"*FB,"+qy8B4KVEsP :`7||3ϒ:yrE]\TEY5lv;o5yR Cva# Fyյxj:3J잝iePa,d^u+ꆱO%a];FJ$ai58QW= .PZ@JYePO;̗-tPwx8w Mup3(u\3wF:0Z K&\#YT?1g[0#74>Ҵ g6: KHKPG>}:[x%Pdk ~Dvdunh'} "Y5OVE=@ eq68{l!HU-$ղcKziECAד~i '{ $#iVny-d^G,d>|u\ !fo'-uUFv˂ kujntN^D_=l 06X(@.t@r k"& iw3O"L /0؆whWF |pS@[ڶj-> N1LZCix !+[i fu@+ wn0G7ܿ#"<-㌀Z l;".l@33^n^ ZK6^ZֈQpWք5GCqM(f0Q=gEcHФI$$M MP<$lO CԊRRq1cQPzt"wgF@q^`n5;Ax,09)MaEpPpT| .`5;8Qk5l7lc.sl: C C_1K7jርؘMt1q$Z8Yܴcw2)_Zb5*u2"4TOڨXz5ӘV:JyX.I zM.PzqUvundg75xrVǐw5ݝIA*nݝ,]^g=dh>0 AK=_J y&-Q|œK"JT0cfrk)A~*"0h ʊ %`pwF:``zUz) ^!4GxjڀXZnf,T bnB?, {M|{aV1k}McҨ0&~c>{cGz!-r/Kp"9>Вod uԴ[@uXs|1|; WϘX0-IS>`~Jɏ㵫m{ 9V[#"xI5y~+GgG@&Wn$ \#!cy$1rF,Er. ݂5%4M#Ap=?g{;LQn^W1<ٸ%8vWyf bY 4Ȭ-kBq{\OPTϋ/ 2lq D :fR`To%U bVAI#!*P TbFZ~<9/5slM'=)Ld_O3YݘlZi0r-*Džhw1$VO?ɲ,Է1]ᖵ9{Ub#ƚb{iMBfV,z[ƜGېDž@Ys.aZLQψV+ҔgOk<4Rlpߔ~nV S1fE8<"$prdd/UIU)ꊻtePY[f2.PEk2iCa 0L2A@r氾4@dZVj2k\͉ɓPZy8%ZݴIpuɋ:;N8Xc$8'#h>2]E!w_9&yc 2ݘT6^Ƃce&[EBhJEI#}BY*ʪ0i)aJX!!&4H[oJ"T`;ŀ#"‘=Cy(.Ͼ*J$BE<3! [VՃ$n q﷯J j?j^gK& b _]2g䵲]HP;Wrwmь4g+FMj'S9!0zS}znΨ"x54B_nX0?.Yt@`4I!_vml᪠/O=4>O0 |WF^oTp֏gc<fmxVHD<4fp)k$?CMZ$v r Se%S2?྆ϪׅZ逮>B,ڽ[3毭07:BLa!|l] ٵ2%k7(UHXVI^רs{ə#ʤ^Uj>DT;x\dS{y4QH\5(LzV afpϢv@z|Ǯˡ74ֽ,(lK#BkQ7Bŗ0G[>4?œ gIoޜoұ|*,|c vfC4calz^!8D"[s2$F>eC !-Ttzg|L3'2pح$Yd=42[yE/8EL,2cԀ75-?1*Kf?!wTAkf.܂[~%/ JUQQ=C›Yzv _.IH~s$a(~7t\jc49BX^PnA y"/R{#!0> ".SIrN:Uv-bPU"\ԤMlI/taZ1Q ]}¿r,+hEL@<* <;"`v\ 5tOqzJH&SUp]#%G$F##]#2m~z,L2Y+ f+,GwL ނ(I2QT++F{=bF=UI z nZ-B; h:|GzUf*w G7yKߗHWh}1)ਧ{gchD`_Z0>ˌb;*j'{H 6.=ʊ3pB*_ .97AүP]VS~8Zr4~o3"o Y4vה}Q\d$QQYQ֗g ?˺WɖQ[/t@nzyF/-# 6T7ǟRiRJ/خt|8?ctc ̸#rQT[ʈ24# ,y4lEMQb1`FIfg[w1)2y7h$L!6cefm$ ¨K<4U0i2vmӋߥk~ulj1w ׮ yjwٍQt˴zZ6t}qHk3J^qa+Gz"b%eYb_ Pjɏ@I1 ,rdo΋h;=Ð/IhZTQN.5!`t%'=]pVBY s{8=$+4a1ޞn[PZ^uښf9XN2iN\n&TLgaqЬw"ׄ@N\d/ #ôMx~4y<;zbNlቧYCb ͱ%=)`TO7;"Mۜ6n*g {(5Fsi't@]kXќ¥w 6oh"[:Xg'P,u;- Ҏ yDJxYPv +0ǂ-]ޯDδN5 z.&#!g% X_H.PnU!V暽R2be|-˹)yǻjS\88XH$WE[Zmދ 1ܺ1=/XSiU}) }}fYݿ-k'#7LkV"[x2#3nyhrWcuCJ׼ 7;P%Z.TPg)Ni-3+Zߦ:S@[ɀ{`'/dyH8R,`M]a#*M,AXoq-Zrrpneɴ8 d?hHiMaO&x] Cs473yiR]"=:9n*BTdֻ\ K{`uXRRԭ,dG+l@T"F3!rނf 'R }G;sj0+!Hk 贪 JPcg-GAo ӓ}. TH V[?Li\VuD@F0 |E@D3  G塺 P8!9űUYee/~ >>I*}͑B!җDd7 qdD Bkv/ZgI/:rC<*W~q/u/0u@A@1@ 0|4~D4V)w9)#jUX8RJp9fZAb1_cъj8 [8F(XEt) #̰ڥcBƜ90_$#P2$+u`Mǐ_ejB;e@(Ⱥv\ ::^;<*׍ܗxi5Tv$=Y})1^dHOqRvg-}I`;' SA뫅ܥ_p{ԫBé|gO8 : 3h{WeO\1&fw:s^ F׃b Vjoz:JǡZ:.qf k* դDldx$ ~reP*8w½hrGOPw"J:0CzbH8Bj 3dzT띶B딝IK3{kѓ]Z9ih4*wG3bѡHn^| 4.8UCj59rQ)׈-&<d|:N,t3sFt!I~8|}[$#ؕ_Ժ%!M/`wrD3=Y-VdVT!pM\(9`%B1`%GW ~@&(% N(^~)iUĹV}>f 7,h'ʊwcF?UQǻPsR[K _.z_9. x*uCܧ>ȎE0@+T\4N+tȍ% !wʱ m#R߾S { `MdpNG f+=6luQEgܟp]?&@/*L17[n,(}N nͨ '0Bdٿ=fW-XibI (ϒCqN"J( h-*Xah+N.;!yKo˪8d D-D tvn Qp5@58Tjel M8Z}a{h1|!˺FJm3{W )̈Ⱥq7#'Kv68$U9Fm³R,8ݚF\j8\dR~`w5tKP(+C=E?XnYP][g+RwoP,DUs|1ҧ>[ru=TM qNkѶSi;:Euy*_Z[DGXS6xSwZڇW\bXCëҥ7fZ$pweyt@B]k[!`w|jEۨ:F*T;zbhfgPE'вVXne-!إ@0l4˪8o `Z ܒts0s4[.d:e(sBY:]? i^<^dx{5 IT4r緹q1{l̛1XY>"`~m޲jZȊ^nHh>) u ^gDHe`AR`'PL']Xte{IƂYu~n!I?ꀊTk;tg-oWUyA/м,zh< @Vq3nث&`z}gI߶ %V'+CCuXj ldv'yq z`%3+ `(!zrk\v n=j$R+,Ky-8ןď:kZzM f+ -3&KJ5FƮ2%g0eB E@ctn,`4k.! 2JL!V-5d)h(*asw*|O>6h\f*$D@h‚%^̓*Z"OqͮM,؉dM6e1]?ꨟ +´#cC=ؓUUI2H}:i0vAOo|ia/NӂlUuJ.=e٩KGrZ#z!?yq^=IHFcQL`_5 N؄D~ $i#22M]dQ0=n7Z@ÕPT\6}75a',`/I^]/Q҅iXVYB%wF:`򓱌I[.1cRn غWeIޗ!{Va'cwȤMӾI1j s󖚂QfjL~B@9C .8x r06ʕ;ۆDBƗ~j+]_4F}<ůٱ$ƌ Vqh,cL ֢)(٧Kk#D'a3E>j '^ eb`ǕɃV#807 : 0r&P{FfB˹ʼν␼ K!4M.޶[9,8udFFrX)p۪×hiz.fC`>KEG^ػ lƯpi*61ܭ9-:fi?" 3y bHٳ˜Vϋ`FȻ /!]$꜎~pu><$w2L},#w=!D&,hG$~E6P9Ba쪫'\q؁Mt|9[dxQ:^eMiϮ܅Z\b pDǩ}"u 6@`u ߡY>*s,/P5.M)P8Y[1qeFuoByR4ϑ^_|npW c`w [n5ߗ,t[4"r5ET~ɭ]mԖlnHKXK Sw {C9F}rM  wSeu@|(݌QXiM!ŭ/Pۄkz} b XѸz:exʰz~G^ǚ]ɴK Y#˄V&L.G).ZvxI?6_ْ諪8l@tM+P>t!aU]1$3^#"IH̆b4.×WYLsE b4@A X1` S\+uLEa@~؂m.x(ʪ2<ɸi0Œ[&06 u7eOMy9^>Qs8*zW5lxfA1^Vi#AY ?oAj jXHs?Lke!__vSe&#yBP6 ~V%"Ǝy^'sI29I'!;*/VB,Jdro/-[D;,\RKeӪ(.uin] w`bY;4S\C,TgAD,Dp^+'F$˗3漯gl)0Plj9~sĬS|k⮲)/镾%K Xc΢Tu`LG<9I㼤%tn떻M`#6n#Fțy=ixI:T\gҁ $vh%CeȧXpRlT;5?^~tuY7{g$;VRu ]ȳXSR.(1[XfZ].$6VBuUSbFDhaؗVlByk|AͲ@e莒zg*WJh@$Ԏ!ek?4+kүJб`F FUmF#PmN@K}V=q$uz3kJYJ4SF7MMfK~N&դ U9!|*$/%xピ[/:%QSL;fnWg?`t!}On)j+Ԩ^5l=b~9#:+F{` Kdz|q V>do 3ILZ'C,izg6Srpw;uK>^$0׿Xrh|xgQ/kṇ|Z6K? .@?Q-Jy ~,tΩox3 ->%#XJ@6Q>s6lWH \$3h;i3ll3L[0qTp%9v+nM?"3}Bfe|)ʊ꽸02Dt}.S'|g/`2-^K_@|H-c27k^kGJ/]&ߜuut@.P.t@YWo`DXf+;Za(J|/Hiz[:rj=p0c@ PϛN Z|S_#5%e轞}PӬ_04MÚg*p"?xI`CԔ>!밪u&k}|WTŸU|bEBUҼe9^?X ރE֑^0[ U_l(]^K7GY%w}}1 EG}1c8;e^Y~x;g [%_nv\Q\ &# ̇b[?|^`xޙd5=,#)"s xڈp]Yڊj*_pJ۶i8)ͭ<[r5i2 ?U6مo cJ.PU/M0:-6Bw0mH;ReY)ɳ WDZؾ&)<` !y\@03/_bVCBu5 rjan NxU>ʢL3RƙtxI < .2E% K"{BLdYYv ~:B16_9 ֭y_%#/)mY]Zb]-4Ft]byEEaJK?l :!̦^6-^E}C{kfl˙t^ ]h+w*~F*qOvj ?+IJ@ɜ9S Z]4SU(P\kod+-+lc]/:Vs}W}զ/oi&ƒd=DsQr*V: ˔\օd\rAE5V]5#C, d!\(5_>KAk嬃PEl!܂˖xtAaĿM0X-R2\-X0 `iVh/v7 0:=QGvM&#">߽-+P Aq` 0_[nZ1kdZR"As/':Pt%y=5"#䜚ͭv⃲ZCtZ-Ǻ)-1n _C4Uc3UΔ-˲ZԂczZ}t@r~@QەD}īY}"~%GPuYTjO<74GL@*uݔ֡ v +%>)'=)8b>p/W2g)Z_;2ۼA}KY[ai^WOOba+,yhX\dCihZ󮿠VrO7qY56޾u𕄆<}NS(Zk^Jɴ#y=/o~ 2RO:~_^ ` VM3n&9|?}m=oU6@ )pS3I 5m${[k0m& @owof7h4i-UpwҌcYvFW0;~ ep  j^@TxA_m5Gn43t& ?u =,4M`F@1oNߏ_FfB~An q WOv,-dp`zJ,{D osݕ^G օ%}Zڹ;5ѩV3qrY}'tq,VcnA KBq5xdn^' $68~8̜ g{ۯr<\(Ť|*7`޷xضGk>u'iF1k3U^-U#BxDU~_s ͇o0Fqf^2=_M{7qqqO:n=7j<ֹ8z<[Gp+6=K\öu d[3MYw: 84;#-iR+z%o9t`}~ong۳4B o>ܡ܏YI35uoz=82u_.I秉R~ނn75TiV -0`Kc4߿d?h5əg Ǥ/-GAe\I&Yj:*tH~9K;-f#IMU<.m1+Kxb{4$i{Z!C _«-,@% {V@Gљ`pڐ%[@3].Vs-qeRt4x%UzɨA\~_|sbъQw*] ǼmB@Ρ-+NJ;'$,`)qW,ܕP[ b}s LP S~{_ `9+aFokRKֵZnPJؔ-֥&[Ob `9OeP-3knd8׆(-Pi| pbp$5vR,z7Ľ~̎l:+y*2!Nk] &~V؅|pZ[qM7M] & `727 ][#QYܫކFw½tkxp;3`I% O%&ͳD蠇J\oŞbZ}\,zWΉ8.#`Rc= ac.ݼ9NzqCXeI;ԃ!"-t@1,,~WD) f+cR(]P|=:iԖ2Y]Jf|G`+!aq؂GM6Ǵnϡ6?`F&-^pf^AaSؾwLXPUW{aKKM5/0p?R$٘N>܄L{ ?Cv׻>A@3&W@@<`rXmdkmcQJ;+8%<h6ђI:.A1Vn"tEL2+[6 {&u 91?օӀ5UYi[VeWtيH,^9Fsl'}$5! oW۲"R$-$ʈLN݃⹺A7l(zm-W{ l!koRgLZ:Yx|1{aT*]t|:b~k#k ;#{QD>_87E1jQ$$!O֜zWWV0{\.C4G9I:^Z$I.sF@'MOjO ]4W)-nQ#^1P1omn洆?mGy |D<~j=|wO0лsɸWHDJTmX"`BL٨½%\ 3GN*w ׮OSp4t=(_ohP|Hn$%ٕo:|[ :Qd~F@@M{0:s<\_Yo"}]-¹5O'DPD7{B`k'\JKҾ8@DRؿl ~8.aplx S(BV Y=_2\ kiy 1hHWG PfO#P˙k|BckO 6+}+%868_o.ÝcI^c&ެY_z޳I!˻Z?^Z4 ,#8KӫF tQvOEWq32+EKt@#E>vFa͢h[ϒ 8 no_ãDŽs-݁jAHfT!p@7͎1>޵~$ccQJWddj^F潬t7̳i3^ϑkl~^2^ i6iN|Bz5v-Sm^3wtO%PMY^I!+4ᑔhQ?+c8OC=\,rk{잗FxjGfh xuW'\Y۲$?޴Nʌ#AH oݜwm׳;v vg :?ʬ6S(kM jn a>Dc Կ%Wco Zݪy,|[~SIk$wG9cNKJo'5]0c!v"rG\ʼ~N#N "Z 7^څe7DW;I|L7M}"`ă@vjZ':sݵeo b;֙ !Jfu֥(>}½GrHpizJFG"p$r|72 tZ,X6 :p9 G [t4PFڴA q,A}z"@IwS K4Qu}hO&Fg!eyLb3ܱZ<st,Ցf̨:kp{Y cI-nHut'TRawKqNli};&rK; Mኦ&' o 0S }9oi b4KZw~-#AB@.]fܙ["CܷxOa7f{Ҷ%m G85W(Y*1{vL 4ܨٿB()}Z{)f5әQ$gcA@W;KMgoo8};x@*$\|GmD5d6c{']hR쪐I&%jt"Oi-=ͺlMs35ijq]|ݴICP'ْ&R'Ul1 h肀j {NJq:>ЭE۾ ,]^ls{r AF2e=L7k) m: {l\iє[IOB&"!jWGClf݈I~ `)281?T1lH+9ҴūДLhrs{>`6|`-Bj3"=ZRY_ m~ 41o +s_|s;-1r(5#Ҭ}G71nr\?ڋ,P5j?GkFD 5M|"V7oNbTNxXb!'v&`L)S!x $ՔX٠?7֐}~2Ch^ɢcX3$QQDئ1n.:k5g,w#ۂ BD=lЙWԵ#hgƻG59S9;·VlR< \Pͮ!ۖK螬`- *= ·3EKw1G,N?S'r;qݍaD-urTulhtVͣoк=%w޺tE@@t cȦߢyeAH`I w૦a:%p!0gLjV` U]Hr$c>բFtGePߵMUPʒέݚ;JldDɸ)H%6È]Xmo6$jA||!Rb4]"G;Π!0}./=ꮨ[/* QWM ih%BIh\lHK -o-i:eZ=mQ'B̀d .w`q7 6>_jdTND=8=)KgRRL#Rv:RDH6>y6d~*u1NDi5g:tݫĄukcT],b,]EI>jh1^yVMnYU=׳ [VI+3 Nd^$caUvLQ[_nږ^#Q=&$25!;l5b y%;Yߒȏ:'VBhIn/}bJL2`nUZŢ.F"U N HLGO(Kr#v5Gh!{p5# }x2!cf`k07/yE/iIgfvR}18d)3FY;[ GM>+LI }ɊwwnxẺZ$~(FLl7}rZXJCıdig<=4sؖE_ ]3+:F*m$U7kfXFϚ[krqCc!E6LBXRuP_ٷ`g m眠]h{D/xm;NY82oj7'@',c?R#]߳+y04Xb:˫@OwH'҂a]{UZSg=SeS nIfr$6.iN'-wѕ2yUVAP8OG9MndetG WՠG(KxW{T$oXE4/Ƀ骁 vz `O>brBǢ*͛ *$%_=Q$U>T6GW{QgpbǡncՌ[g0ov*2"j|- mw5ĺon8ؤФ #v+6MWuĩ<Z1?b?<4İLh Yp&ߣMQ}^;v~F@oZc!}KogMԪ">6]핬`eV vS #2^ҷb9!R1gG ر\v*#l2^mF'B t7g&zF[Xȳ\v_!Z[~]hрinJ:=Gh2sns!$$0Q|{.쮕xboѨS|^c?qD#C;w|}Y,kՂGY˖$ w7e.)hk\@yjT/LZ䇶 @<9>o]dmJ}~Zu-]ݺu?BUȬy]<ۯ-7'kcϕQ~ȋ˩\M\~Ӝ=-a=4Ȇ\@Oqc7P'b7r`^67OtgXͭk:0VK J)Mx%|p<5Z+Rr5 :nnuSYW>FN8(2BsLq F@}dw|l?>/W7e9.X>ؖe\&S[OhNL1r6)?!x|I||)xHq!>K-5OK}smTif,{tjN:2ITs8K-pmO` ۂqKQb_k>/@x2JGk (,maT,w[-q47^x6ת"Mw#7B'iZe(Rs\b' ?$NnVzpgx^:w;eB9hVeիubϯ]8rYmb >FU3M1~!%J^<~64%otxY{Λay5zC]p5OV=Cx oQ sJ+W;Y7Ax"Ve$ hx+6!1, flP#W6j~goV.w #؜}a ~f2q|}%SYǯwPno"c ;yõ}K0G0>oO%y9~U(P"mYQ% ̗7;+o'>7oy{/؂G'%1ArUo0<i(r5raFB DP&nvkvq*"_\?_ mO?ϥZ}-7(a $tGaz]O;._o@--?_,٫C A+l{ `tnH  <\.Ui?d0Rm,NN@ι+(q4Ԍܔkmw`Px7⋿4"ȫ~+@C>!P_?{ `ePvBI+]~ '$[ݝ9K"_Hd`ajES07?9EZ_p X*>LITU{.-7unY4hĿ\)q ?owobIv^(6pp?o~Fq;d6rzHjڂok)7)#z91}M9һo?_#O ?_RLV|?y{ۤ7b 䯒KߖXrl0T>{i\8rȬUGW*3kuz|lҥG/tIG[ 8۔}PA~zg13sgrh]QFt nC-kU.v_>?x){X'Zp!SQ]>RRVfbv.%`l;o5~5 ͻն.ş9.?_ hAĿ]#ʋڧ{?ޣ՟M!s7h]/%la)NdI슁`wd`ԟt8ؕ|~H{2rAOKqRK,V>XEg"" , ZkXxA<`7bg du7B~yk K3nXN֯k _낥u~\x[װs cMgn߂KV픭'z#qUNN؟;N^X~C7ߘ&'FUP|pJR"J_)ft(9hy.=50_NSFzyǔQ?|ޜ4`-IF5ꀷԲ;ՙRyMz W+>40V۹ |*+Uxuy<7mϮY{=b ϣpo;'7T>k}tE\MN`hDHmTk@OtJz`a 0S=jA+VBc2!2$d~KMvܗ2xv·.Sjӯ]V*Mx/F8yN}tN,{:F'gRǷ Э cs> t}m s@e{d|i ui:Nk::1n* `f!gy'#3>o+C"vt͒(g3Uo8[#9/܀t@] a5/R w s TeV5~[0A`hk)eyvrÊVHͣ8xBgȞ~-8qlCcH82 3yyu$'{?~[E^x`3(=EԤhe0r$wO#!Tlz:䀳h)ҁvéG׮!o`=J\6>'bEOGW^MA*sd*y0)H:{=_Z# vB!(vw,IjJ$e] NV8't#ٺQ`+B"/ς0b\XkPT"T\{?WP[6^&:'6מ, zC'FYjWm6 as7Wf݈}IEzFba:awHu{?তDIDAT3*vkg >n | 4~3Sx ?tcPE?B\cj_ĂjY,X{n ֧:30)cKjm\#^PFɊ6GP+ vΖ WkpSCZ䇇rSoɆ.} 慄aF,.S^gyű)K;? ^§ Au_9Y7Ya J]p?~h:`]p@Wsn;e xv ~ӻd;\܁MtH 7qOQH!= 4Ȳ(Uv#~u[IlwF3 {E^&8v)jB:fDzIY?ҚVt+јΧ.cឥqȿџ%G3FpdV -NCoفyB]tOx{.$32hΣ?ϴ7X+i“Hc:>;χ{B)J+y̫*Mcb iNIJkg4:v~_O4OFdg!W"{[O(D֥ND*{f?M٘ yz',Jhɑp)c{XF>9w'jk#!XSn;Ϊ9<ܟv2~/,u@^{%7Ns8|K5]Lo V g}K'^w#^Bp/}?Ǧٿj6Ǐp|o,>]~z/"~Ԓm\?g漾i2M=,rqr?q7d\҆bl\]\K!'Tpdio_±YUrQ$Oi~oZ$Fz8[dՆhg`N {ӌF4lb*>Ǔ M-":}-~nzBqSr DqsPвxኊ[ 6 që*|R =r9II?i淙֜Iۻ7BŦݐjU}L6a/5gz%+cS 77ұ=B#&N̜D|<Bt+C >hS/{s <1AyWbf鰶ԥg[ufK(e3 >@yd綀aD1!-'?:']_˚! Q <;Y6,ך*o: {s }2&í{t8M1~x5qIvC~@q/h~/U`B2#$zm6㙖d wχAXn´R谚e1_Yk{u7?ر~c M)Hh9 y2F77c!Y_  GCu='6 cfS aYLw<@ˇ1}@scF֌QZV!պfv`٨_Wj5#=Ѣ.^}W xB5K7`rVU>`oW~@6 0"\ɪ7=Iሹf ַ 0=@/i^遢v&4 4wUC]cc<>[ u5dk?`Ă (nܭz#nrB$d  J[>j?Lg8F?{{`C~iťEY{.OU:Z$! S.rDJ#8c1R;J_IL˞s\څєhsܥGHJy z0.bu= f]&5~/N;~~7K7߈nhxH3Z\\ RӮ xi0dߓ!FMH;ͪɄӦa;g?O: q[Z [w@/1vMfԽ~En*=7oE@-Oa]yo{w]s $+]cOa"rCIBE^_X5"18 uG 3C-p\jFB 6>/GN0ȇ B7!TvK7HBEjʹDo1EBBݥέ1Sq[mYŦ۬;x 1<&iU*C"sKPCB(?~+# *Vؑ L?bBM n>1=p< v{nҕsuPX5M3]X 's=UD[;@–PQfC[𐤵2r{X61`swSd=Zh6U<$fcʬ+c_n-om*-XuzWAO>Ft븰:2/d"L@My\$iGŨ뀜3i.XD ) ړI4 & 0~⤺0hTOuI}#~ܫjn'kr~-si,J䎽Gt ɹ=fR)uHW}S>̟#%_EmzfIl_W aUGtqvjh e:)$LE_QQXFt_?老o}/V/( ܅o ϠًpBϡ;(D_*V,Wt ~NRAW:pd=Մc2rdyHKꂋv,|UNZڒn=6Z#- bdE`o.ǫ||}^'c. ]mUϻNuJd.JJG $U5Zw2ĂX2W ikȒ:g,t@E03A ƈWnLmt1KS`/S[@XuU](_3C"J?#X9l_ ,@w+IUn<;>}&6eeܻ4d( l5!B}ݲ"Mdļ5Do[$W2iOG|-O-_]҈oTJcNd۷?s|lȲ [D.QM-lW q@maSmg+1#! )Jf%ϻ p/@Ç2  B[~̮fşV9j*/X1k~/ ɥ̕ȩ&En: `۝N2G@PK=_hr$&4BX{:通@BaoH]"E-`I5aQܜkg^Xa"DOj[+F%L bPe]`HVV!CU*"lO)4j납/xw<ش^ʑ^ SʽD su,@sGpnlQV!vޭL׺Ά m_у#-X3vZw>Ebȶ'A,/To}%cy{j 7TJ䷫OaKI3>s8ak~AFF/LMYäҿp,x6~ӭ*qTjF(/D W _u *kq]MDXȒ|#kN} *O|UJ$Ɨ?KJezG&yjc}:bH uOlԚX&C*]g+ݕH$5Q` fڂ"$qN-L/(_hj0c+V&D ~f212~P&}d0L?4'z9mrq$0&ĭ@C5z P|io|~@Lqwp|W;u裖L8yztvCq/FF$#Ufl駯왫Ư_@@".f3nB xe,ǂmؕZvWRSi~ ?'++c,5ix/q}y M;/Wgl;! ^@Xў_Z|P7!?fM8iGXZNu8ܵTr]29F{0 E.Y!l9֥ f!u|%CBְ)29n]܏^M NWЍܡk"| =XafwÆpatnr'fmƺ'Lo_ފ߾_34*v\hVEOo1wQYp}TeW\-W` Woћ8z8:8ԈʻC`/2^m?~ӗ'+[L2] ,+c{;g\ j-s51 _ TgKϑx֐3!@ǭ;_l^0 vzܲKh?c- ѩ[#`Y)K+ܫw =o›A;쥊^J$ˬ@ő62[N3| ?\ԀtC^XQ6KT~= i}nf p1Wv;?{d_{.>}Xo$ZER L{P^`k Կ)9N뎐[0uVG5^GWgH7Dti:}ț|hu?o9΍3^sXj(8O}{MGQ9}Kq﫻S뇈=x__yhsJp&Zczs|0EdM8vusꝶpDWϸӛ}jN{i5.K,,&U:V:g1Lu{?_Su:Փߓ=HQ\_W@Q渵oN׵ߜ᣼X._ܾr F,OAyu媱έ:I 1 ?LH [\[6D?{O^QՓSzOv:XEuo @*w;kcЕ·Ȩ9jw)ݸ$U٦ߧ#4FU(8USбbx|eTOO CQtxgm,ϖd@%2)~7!*ƊCg~4K=QfӉa`N")|&~yT2W5L^=`ޕ { z:Ө{IF f½~v߄ʉ/WvH] >MBS uEa igOO˓9ؙh8v>YpJ| C[W"30_mju*/?z""%3Ǹ13U*BkvDC2^gʘ@&]\~;d9<4^&L=1;Ex,=> Ix^q+i-C|EϿImZ7\C'!=^ܫ `^t!yBpGݮXxJ"қw{l(T)|}7nL9xLcvn{H>{m W>t:7 īI|=tS"Wc#A$^6rt{z=_ [z ft2fxB2Ɗ{]YyES8 xϋRe?/3xa+ߦe|I0%$:`O1*ܰ2 S1 cT&ȗƟJܻlDǗjh9d1OyDqNMcCWq-sGY"꫿g3{d85 4NbmsVy( 12 F 3p/F 9v9n`1П1Ag hE)xW^8)dԚOdV6iXoRa$l 3`@-m yt}{X+wis$don9G 8/E 6[ߧ`v}aO*hx=>^8=WG'4Q_hDVr >=:uRyo'#$# m{BO.݈319sk 0R)GV&wO/'=0fNqM-;Fz;xB WLioYE5 Y,傾ht7Qot^u(6r ^ot;=C h[f''aa|ə=m D ;Y@'HEds1Mj\J4@k9%FͤԬ?H6N ԋXjb-x}9Vp;$f8g|$-thJ5XL j14L)YM /l= ~V߉#r7F4P9Z](Eѥ%4˺Vp捣kxZ ڬ`Ý.cLp[7~c9>@@Li~}dLfRr[O>,:S ]2bÏW3d8Ǻ9B1NUQ$pmT7t&/7Kŕ?/6FHV`=C@LzFkdZQĥE0| IY ;-'#*j}?rS39cS[}f)N wq^8oޝg,^ `UrNLXO6rL( cƠD67䇗]M߈I_mZҳݕ@"[mlzgZ&8Ŋ-cqp*%{tϸIu6<0bh?ϣ T6k3&T[z%ܜ͓HVZiQd=Vye6 1p{s3]ڍاHdanψ^~Æ;P l|tp b,h!aĤ))79!Yi6,米73E<| `ŹWQ+xZpHO}]/%Nv0{EꌱYW213:LA"!m Ƅת֓MC7[fugn9\6߀"(hlH$jρ{1eH.j jf32֩^1#PqWjKn -D'Yqh11.gF; lOaa0 ƌ!kw";{If\4?x0랆\%v[eR21csS1I:?}G2U?.D w@g!zd=7T+Xs:&8fX _I  6۸-NBRUcϡ0E;? eߗ&e6\qg.gLfoʘVt!>{ sE4$l'<Ox$Fӊ i2j%Y8.|Z 2#*38d[jkſ vh{$t4բtwpvy9͒ *b}<)>`?/,|@ݡ3t҂5w{&KXEUUhT1#`w+XlS> opS FnE!%$$X G:f+yJfuF`HFQUG.5N |GB#Wz؎cu 蛶Q:̏6jIfÁZtj<@,/SC;@AbDL;i'wu$>6F_PX{,3(1h%dj?%Cˋ]2v,~{*ohXߓaqW*eRVp 8B0ȎϽ6L2L@U{`#''QW)R]*[eբ8iڣQ _/'ς1)I2 `4 ~dJj\Uuߎl@AnT?2UP˒Φrc']ub+&`{Xq?3ub}LJ|JkۗZ$xVm u7eDzwxbBk-: ;W96IRY] K-"#\iP<ܓr+h6 rjSY?M"x(E4;MbW0ʹC <УdQHYG4K'O؟_+ WqwbV7{eD*8%v,2υFĮsܺ^Nv\'mf-\2c>e~`նTj>0>D*獸A!@4.طydz4YʏB8$ʥϟu ǘ hq^eFۻ̍ :{ c=Ɏg`.'H3kypejΆyi7<`ΑnG{FI81H yd Y9P2ߐ"8)"ޠa-Gױt Xoa0ߴؼ[prR 槣 Wbra;+bE~GeZ9jGd]|NfSé*<ޫ*5&-FXijU &Qy4y~'[“OOk<._rUwŻ#EMG:hH>uS"G:BB$;jҊo;dOLɗ*i97O{I'}4"$gX9#s,\՟/? 8[z̐*#35x9{n6`їճ!J ҫL G؟l-@737$[DHZVǵ[P؃Q$LhXGF)1?2I &XU#Yf^-K2./"L]36h-FdS[}M}n"Cr T3dl;G7"qvm{Jq-u-Dݣ:Җ.FqW-ŗ_ɇ]Ux.# atAP\:ES0w[ ηgz[r~Ϥ 7F8ujGО?T̃)M6dpw+c n*DmeuUR`Hʏw_y}j45)]hpuS8UpPF6tSQHOSlOb#_fyIY?gmNIzOs_\ܡtt/عZѾX/qav,.x#:"7 ynGќz32:UP/"_gxRpDv+9ou p83s"oA2M5X'd eۄjˑQ:`bRo$}> {]γ9y. kB>jTtv~YxiR.'- Z K~u&I!͔c3zbwQA`5%KDߥ[8 {wWݾFxf[܇??ǵ*T-2*X3ُz/cHy o,2Č)_}+?⊎-oԮ91E7GUSĒBgD=qR.kT|Nk'#OBJZu p4@kYk d LؐOkӷ 'ձ \5уcg)8hlyNsJ6h9\L}{y\:iUglb wܥ}ti*\\}Z/9|15z$y '?ϛ#AږMXlh\~I I-d[IK}GJc ; }9"Ez9%pV)V]@#01 4ZWO}'N`iԉpD$!UK\w:~np 8mϵD;ҷSp$ٴc.h>͐x/v*DAmڨӳº@ojFyuǪ[ 9] rxN~:Nig f'=e%y&&d^4A#}VxB]B: Q.UqI^:<}i&XXW3߮&<3BeTLk~wZNy-O t✸d)izŊ>]3I]>P~G0.$⓸j Md6PvN0._hJvxCbB=Ko#]]OOOGo\[A=[Y^i7$/9m C5~N\@wvg IKu%D+|ǥpiKLsߎ//Ҵ؏Q͒ `Kq C<}Wk3d_3]D`rUeqdXU{Ns8Pu%7k m+2L.<[9b%gг`:Z3f=F#C`B'봦Ue,=okv')Iw9 խcM[: 8NZ( 49 U0)8 LJ^G_g ͸b el?u7"vW't;i帞-2-I( R=]qGor"~e0~RbLE=G+>$st<~ڂCc<{Gna{A~#Uʸپlmsq!l2e/}!JO RF8Ň)2/X9־CKHBvo˂L$;9 Ү_(+g 6gd'TKOdQNsٌX9[H7NmLF@>˸Aeɿ{! ҏp 8i%tsmjfҔ0gc_vd0Fp˽QA,@ ?a:Ζ! v1 >In_ H!@2f\y:zp5*>;݉W֤E$Q@=*ԿohcWY%K {(pBwv|Qc4gAw_qsq-?P ,f]( Af,t-q#x|gU=1GNئ NN` W{~zu0Hukz3{ Iȯ6ZotP@lopPmjx5'Ktt?ԭ13*íf}?uP@ o%ir( w, : pio~.mt>Qn7(@7!0pTKi jyA@rqGc3 lu"VjN蟃=#ǣ3r7NuPJTp?9(~MՅ4{<>&$jJd&C Q~t: ^l c Ggg D=~16,8dlaGH()#H_sr6>D>$~zw|?耖 nxH)ey״%ry3 +AE@hbs>/-S0P- R: DLr^҉m>Xq{#,n#AQ"6B4 Dw?#kuwV^YGTuZC1R2`aN?c+?mCnL0ړ(J}fvf$R~.Z~n$Uwah~vd3_}xFa?(1 n v=X%l'[0}RQhAp HkyotM̌\O+K.=Lc> vXŘNxDr ?TspIh^}e 2x'` YU8#-9r߂Xθ5y(,_w)6!m 6?%Tti2jhXѯYY^rSa|:Ú'd\W5 V!7xU_qܺa`̽'GXhv0%#&2=C!Df <z&F*ܑl,oCqIq#H1T2fA6A`lڧ&kMǜcN[Xl7+>w82pkQ{Yܜ ߄өphhNUuẑm1b wl<Z0کlY  ~yйE9%kXV,8۲aMzK 634֪Y0wiBT/{uXh0 B$ߕôA`ay@Ǝj Y١'d7S<:-Af w?@Wo Dw8FEfDk108+_xH?\a}GGAx畝 ڌs\zhz xy,[{t|:Mv&+0{wYMT2SV0K,`ZnvT+ ]<VR&ZKܐޣ [Nb&w--a# U_=G0z[#OzMμ?ѡ33^Ӹa^~ n 3t{K{rF@fz=v@f ``\EC@ey%zɒ6S~#q5j~/#QŽ].=V6;~C|4YS|0V5?ߩݥˬ8ZםOypo4MLt"( AyE1U@Մؕ!pbE'#F&( м/#DIj:~r[TPm:+\Z劢;! v7 b ]^j̑:T j V,>[C[[Їr%3l&bnrFthӍY^f+Ϊ4Lpr*CG3p]dy[#حi ;4jPB:k=Кe4ğ EhT:?pkX9ce;W jStL8F*/M!qf,[F?T \Rc.]]@bhގ'ƦL#HK50سTp9C˵؉4@@?p2xtEuLĭ Vtb6\\9KOK]nlMޗT.X]0ݳaB]h}&9vZ GFb2p[Xhmvoy*$8,a&q=`AUn4Mg0 IHH'_W(ՍZiVW){'lHiS(d[zuC-Eir)~QMka+˂^bXXzd eQk3_wxl OV IЀY!p w-rbSZnS=Ɉ^Ѳt  EPy 1?jaq[,dWx3zM4{fDݘNo:xeF`X2IJDwr2}' 'ALŀ:僫qV2ӽ[]39;ffUKV0FnT BEMיp2bowU=OZ&A$,XM3+ph5q.kBXkV c(Y5-#+ Ʃ͛Y˲4*ew&ǫlo?hL5dsh%QO#'PvzZDB)wkc*:M{_z ̕9K~9FyX3wֺaaLѺK-LRMFCSņj"% ŮPMnCb&m7 W\XVf,pdر=F|ihlT4+iUDst\ցZwJ+~opx/`JE(=a~@NF PZe-\~׵- V:шAګ>JFtl ky# B@=| %?o_ `kS,ꂃ+kw=NOq! Uq1l_WʼnZi [F5ː3Fc;Xsi]2%ElW6bɮjD?`D'fׯLSeʬ t>FV027LY3α`K^Wݭ*̳CGqfl´ F1FsU6L5t V;5"Ps KڗH8z?*Y /a^pr8 VKXHceZ#5~2ci Rd~@pD30tޅC;H Οs&TSEW)^Ioküf{(C*e1T<=Gn@;`suXۡ 3X%ÃLfc$0~#-t;9[^LZG')oz`(dDz20 3cBEL/Q`%z% #l \s߁%aȑ~@0N+C!pe(#Dk@D9pM}ƀ-snV+itwHs% rlZ:vG@1g@+>,8&c-م`XE߁GxwO3*̀hO_)zSBloeJ&/+3%4eT636(ͣdž{2b?8Iy`Gv+8ϖ[0_WW"DM&iGXi.|-hghbły~:#穿k Wҵ3E/T| KG{ؿڂh_5^I) SXxO`64 B{A,h Y79#q3ԯ#| *zhWx0C-r.9bcJP檸[Tr#d.oaY/Y^送,t/_lK#ȉtBFZiuL)Fp0%ٝ2/'^y]-FjJ![F9,Fe$ {FlYvV*hc؅.bWFma}4RxwJp97ٷnZ[ ti(N_0rփ ;aQ$,s$vE}/ej=/oZKE6!"5vu8}8L i QI?x~<ʇJj4紈MVr+1]ϯ >8 9"U_ ow(by~",ޒ[-clyJ=ڔXwߔ~oJ;Xv][%,Ɛ[(vS1W. ty՛7y&lh_K*Nc |hb` TRR_ƒ`^OX*cw?"Ǣ ύR\*!ɶAF@3Dz^Ea3C?ROt 5m㒃,#bxú2"ǁNȒ(y)X[Gn5kҐ%AJԘcr&ߺAAA,×DSш=UH#1ܚH|”%kc?7p3 ]B\'MhfZ27Q"Gq(:8#u"?{CohJͫPl/X;|/K `WzߘDI/p]qDkr2jZ՗[LB^kGHYeCiB" 2b$sgZfHڼu@~[l#Yt8;rG&z5M4Җ|滱@}q헺%EWj-.=q޳V&=-Nxy>*:>]`LT@f4UVv$Aw;Ɲ#~%{)jU>-F =ꌃx,/0,VӉ"_} ~":ԑW6=șA9I}=;)nyDHru0*#zyÄ+\琿@%ӿ-55>KNժ=+(!ld[5T!QPA!+X(/YZnսi*I`چqBؠz &;2G-OPy^d+Z{7`~ ;&cga<<NSBx|^F8ޭWF?hOi;v|K[~YIvv^: {aTB0i? vY'ĐcB;JwIlobyrz.5i38'%lmziD;Jv4}+4 2?M  "3LLb8hjt'd3C܌>w5!8D'$w3yd47a o t5F,oZw^':ᛯihmzi9g(ZF;}N8\ŽA9bcf{%'ކlu@DZ^hj~j-I~*j Ϩf{r,!~974iJM"~wh^U YAi_[cxm^V5>{\=y-}ԍ50zۏ]HgFn?$Ҥ)﹞3~þ 2VgTQl 9 g3Eo15H+UCt:+ oHZ\={M=pL3 o3;+OB9fR1{l8@l$V&Wn[,ot|{CPꚙiy `Ǐ[0`1LreX-X('ʥ~ 14 1T 3KSϨVrnQm:=wo_n_wX #=-V9 ɲ'.lmJ qT0!C//l;;Z5R}g~&o:h=:%IάP5>ga NvlQz=M}Zw<'T5,]e:¢x!yIi@Svk0tvޠ*n 'AoWv}OkI@m2\)R;LLvkRaUYCuP2 }`\q!1XJc.8z}T,t_)xV[ +LJVmp`կеHuCBٱ0 qWN6EiQ P?/H$R/̤栲{ç{XW|YH<΂>s 5{A ILЖy{"U9D!2,p \dF䘛pGO]{Tv8Tw1ڗ]~$ , $l푌%f8߂F.mԊ+Q:U܂k,%(߱P]Kf~?߰JW`a n-i &UI+Lt@@櫼nx4@@zҍ稗cb fm;z&`7D n%^/3Ch [0,X6V:`@E;tl!^PFJJ|d7p ٤>Ȼ_nxYm)0:loa/b&7s#ʧ߽pE5V37m'p0);Boh\wH ٔK3mv?g R>F?hw;.׻S)S3}Knt%Ѿ"p^Ƃ |YΪ`\o_mע:kdžqm\=wNfv&~` IHK/4Qwˇ%x}ty- /}RVeފ#3,0HjHI?~UHO{Z sUE3eiag"Wx+#-HEf!:qYFH2h=&ugu@VE:s)-Du,O%W,*dPpux;juDq`2sbAM65L>{;.bbegr)^LӃk]Qut~O{qMn42oq`kgDiOn NE7yV(k%WCƌ4뀈v2NN IIEC}̔az F\2E3  -n|fg:?0RdUgo ק%`@YpD $'?L i KJ`T%=U13|aޯ{7ĈZSXj!]s<P7^LQ<f?`Z?hmO҈ ^'?/  ) P/lNVX+^y$7Bj'hi`[0Lʾ@ESTXZ=$HuQpe@&q=D*󑡑 ι$?gnK˂"O*}K0^3P-KtwOh: Y{fT,F7IO~jx\FNIZՐp&-tl۩fhe FTw"h ʔ2VEGS}zjȼmRtBttʙj/7LZ'@{ZGY=9F=|v&(ʷUW_^FNc7]iaX, vwqDCG|9ߖ8 3h# `LZ_Yn i%O9zYG{`,ΰ+%QώҔōQ@^9K {0BLތ2}I _Wg/!)A$eFvq'kxu섬kz\m` &iAl'+xE-hXHKiࢮbmZM˳jQM wKy 6F|V Fjшh6[e+ɚvzcۡcc0`R: 5PȼNl*9 ٌ/ ,GA#2Z 0cA"(a6P |)&t~*(ZU; ݏ7kn7柫׻bX$pK:`?rwEE YiϺ?CG='9ƽڗc"@P*DC.ߍ6CKJ=aXnu"\-c:-nN;{W׷_3RZ-߈qC̩Uh{y*ACMߛ3_\2:iuGjVka;;w~j=pbq+8 'Xiq ®a@r˷J.ㄍZ(Wz+;z״Ln0ݡmSޚ۾x yl] ?J`CMW+u8"!`c?rBm@C9OՔ@ȼxeCO,gx!K!ꄜZouE]>2bM5.6~C1-vv#ǝFB6؉w[( w1[8!(g˥EymKԹYUjvo{r֛ŻGS MBc}͹3J3se?f^BNh\Ҏ:*Ulz<7 t6~q;!D sZCzw@_6p_=vRJT|nsc7ӱ9d.T/bRkNͶnF6Fnc%^8OVޚkɟ7~ٝ:+OLUX9YqLM둩M:pL7cƟVpbזVGmjptVvBd^⡽`齧HFm@b/;C'!EBaunSYRXb^BF\ϡ#hcs]N jf6o{'{/[>? ̽%:.C(Pb*GV B zwᡢCvĉܿmTʰG}[A-WXjg ] Fv itDwt~QQK[g?v.NN?~4$ANJm_La7 kiɋX3+X'"/}WO`^pSPgint|>F+Z[ԧ}NV>PyN?uI0m~߯{4 &#&/LMM0.t@2ivS 4)HG>v֧Y>ukYe^@U< [{"s#.ˬ4ס$js[K/Q,0裡]$.ЊbsD f;7vw >4kB-QgQyxy~ZU VeYeK˨%V:'4OA -) n!cɇ@!F10oìߢ=UE Sh+1Z%߹xA4g^T5.(bM\g V%ӭ{\ c(}5hʩDOnK)4 ?@8/ѽZih b$n秖Bj*vrl+L!r%YiZֿȸ5%h 3耱RyU97֜v]P6^`\ugR돂kF~~AC^p<@e9PwQ7IyReCYRRBša>Q64&l O&5N2-u3r(}W󆯜2C pߢAu3 < q5#7ws^\ ed[Z!jL"+^pDSnшkkYp_(]b.]!@Kb'Xs,- :f9]acݦ1/mYj~@f®eoVȱ+P-ɇ's@ѢqlDVb+[fh0BR·?{| aG0D-`On[#؆RCȣZ2? f>%!` lI]JEBM߀x L&  :du/А0FHNj!\J@ kU'Dd 'se52#;̤2c4"Xav|?sϤYB; v0PRi v'd?s,9,Gl6}Eu@>1 `П^}")f:߭a#kMp hZ"MA#G=P 72>ޯGpn[,H:;p*O{! 1%! jֵ2m- }{u3kQCL3&D)2^0w/F-:p9a5Ɏ|kヤrKM-ͯc r8G>ͻfa®C=v׿WN.]y[z:#7v "FpvtK.oKK|wL^:2egv?|X|f'v,7 >CUo@0+[R[, j7{T>:).D% Vc&~*󩹩Jֵ+c$*DܕݍcK>Ɨj1y߱Bwfxأ#q7-~@ VnW;^I#Leu+]緯[J:9OI;3{YG}8m}PM5lQ:43AtLJUN@p6W׊;z) Ϗ8]t7KDJF:`E/GL`IDAT]KSV.3L [Zŧw:kwy=?考w5LL|(bV/|;!i6"a=,3LZv5qS͐a٤z'VEJ?B_Ċ:ϻU#7 &rkCrulں"{-u%> #scw`xqye k : ֘'Y c)MlODo>c$ƒdM{|P[{z!B,SsI_#/;R͐ƏȰ2mU!GDTivS4H  d .O}~JGa i)m_B@H3µx {>RM.*P'dv&{G~A}l#6Hqcӊ"K5 ߞK΍n};"{3cD7;Jb:pfƫ]+Jr-pozm'!pdQ8-]wn(y[#;!>i!zs'<ޢ~9!M{*#5N}K DN;!£dkx8ouFnclGН9lM3"`!9--}m,O'ƍ@Q4S\hWdX޾X9>'RǣDOWcdm>Sj8}*;5NM`߄G@f^bo됛,,8_R)sAf:D68[ri*FQ Ɲ}p#<|* 6ٺg2 #4w^2kj4,H`c#EjOP3>jF';[+4`P |y $BFe,W_gva 6 < FAsfL0-cAq&[_'si3l!n\@PSjV;WHJ h~z1+Xd>54>!pA}Q#Ks{|xC kf썳db RAa ᣊW%g0&^ߕXx2,痾 -_E%Jnڍ'?~Fg@D?@chpdڲ{O2MT *6 _As.r>Q`ҿ8P1@lrte`u@3 vy"; >x&[ j$m4ތVP;=_{tk G7SQ.CA hB-[" hJ6*Iq嬥iF@ҲȳAwK0׾}Y!a Kc>~} _*\1@Z}h$%LT!b;x2iSr%JNBҬUXyl%8'_"1h]8xKg| m&HEHe!QVٕ-.a0ѬCƒKm o]L5%E{!ku-c6a%F@nͰU-\@@i@l-xR[ju|`h_QA w;n7So@G=m$On۫wr"߇s*~FeD;-@t+/mSisDchva # >!`Cn=;B@b+nuj*+YNN߽5k6+1g^ᅿ]Ìx۰~7'i_ ZE'i7Zc%XhW9:u QJ+_x 6LuP`C4%_x>30нuKj+YF%ތAy9ixowF++nPakˎhC<܅#Zr$C"0[r/X~uÈ,{ FE @Y$}ȶuߛh׼?eHN#xzv&/k"#Ew-;ֶ>uo`Dè0&1ӊ]l˟Vp=̽m\`Ey+PFŘVF/X2K4,3CT JQ-6 ' -G< x|H[.Up.?e9R2ح+0t8/qaD Cư<$mbxT:`vꝧuÌTwLڤe"hފa`e mT󚱎!vdzx!V^Se.[ s1agwV0ي-Hw+eHN"ASJUyq ʑSx~X{r=`x"q ֽK+ح_ýGRw!VxhA*Y%][}w_ʻ4Z&߮T,o`jl?^ jE7rHF#lBW]С󾞽(yijY NH?;!f'naC,%ھs.jBdbk6J)= Q!$^N`udQlJ=zI**fSg!5*WAJ`BfB Yl!N/;r9,ѝ˅32LVa~^`+x --%^Q0mXXz'}TP/|.x ڰIjJc0P'W aW~eNh*>ʯG|DԎ" |DК^ҼO::_di"&*>E88~X#-x}mB.b\;caJ辣 i9YD6 [fYܺtV5Bud^0a99&r~}خ@F@M]1%y|Z WnAұiE-ZH>zy*ɵY#0 `k6vDfp&-VEaUWVUa9 #S+glY5"elw~5!Bh N;C: Pj,f VR"OBEuaF@W SUF-qd[m} 3XZeA1oAլ-O֮5-:I(Sh`T$K1Z?`0..e;!-|Ca_ɰ|2BZ@ϭ'cS NKϳhyD~5௖`caCIwS 4oD9jArDdz<'\R[[Ez/}t%-uH_aJ`ryESK[ڢY%Y!XZ_IX۟#eh+&;0 lo ґX!<|iq؆OGmcᇋ.̂m?.9!}FKUHߒ_{Xch3Z,O줍^|ey2MC&MbVծq=O`jc@dݿ"(ix :T9#縴l?<6}7;`|r>bdWy:$E5BC@`"Y(r=N ,sًe!{~$g0\8\5Pe7FPY5:H E߹!5+!lG|@ms^-/B 1OkFz^ RRXB:pF|y9Ĩ; ;7g\B32FYDQyB溻ԃfqK:&^~ɗb ™b v dOPR"s&|m@,~-C8YXX<ѮGBh=ፉihdk_Qrmq}g=&!̂B3 e4_ߚ`]cU6xhEV `/p@@nJ%xTt@e:DB  rtmgKR\I@%qM\XwŒu5|(7W;j럻M!O-PZЧ,SS@WK.:'H2#UoTO=Pk%, t~~E|PMFHߵ'wl}H]?7`mYd~z=g(Z=[Gg8@jui@@M@;dY㞆!Ɛ /)g蘼{;*+jeug7i);XEF QS% }rO\A4 uw> r4:`{f*Vvb"6ߎ8!9_+yu { &Y'3f8WV.~cЅBTK:)Ɍ"5bd^~E͆#*r\jua:NDӈ)/ @1/^jHY>0:ubܣq)V8A zf$)8Y%} FEyخFvktCE'WH:bѱ5.!h0F|Ie]Ջ3 NRJffފkG{}o#OB Sj/dV~@FP@ۄ1C\5j (pƽ`5'-ŝ+mװ(waDuAT0T| E aU0BF@!j^oӺEmKpQ ,pD km6c5tWCwBhw:`:F-9!`tSk RSz )ǥ'*y; ]ݔ4 {CDt _# (lUfPƂZwI~ z|mӎđ9;Zc'7 _4m6m{FHWa%IF@|ٮfv [4jFF55YLw vm&[%\;fΉߤe}瘬qJԟ1p%m'>w|ϤL-C  Ľ ޠi\ˤ:cT% nSģo?'*Nԥ%>OdJp\+hDҝX9^sr AKY:S#gq7&ZXIm'$kqEy__f˖(PXp 97zSWt) smal`|'d\{Vh}H\"3;V<xkz::`4O]<߽yQ?!j1xG+،↱g=q)1$$ʘsEӖ36zě+'?_]K~cZ洣dyK%/P;|{;OuKjvj\]{YIs6t[2P3D;^NuN,>#o^J Ж)"ڡtv!uBZF@ָƼjTuI Lj/0b9/_섘3\<,CNby]Xr;[C^3"`ϰ;>Xr=|Eân sL\K\uBtZ & }&"? \ϕ,Ed C ~ȶi]W[gpL?*0C@9 5^G_^m ?־SΦVʻw_Yl~2hyُi"1 (&2\-/(.;|p,! 8Yf:8Ub& H1wW$k龘G!L7"1\xo};'3UdEV%?`OҶq܉Lm4RXU|%xZ+[xlg%f=&302`ۤL(hD䝤.UK{B2HK#eNd^{O3d*rĈ,iɓOH S<75< @?ζX?!'-0jP'ݾo Tiyg04;CPw{^҂lǑ2tfɗYD{r%C0*zXBwZJ֜LR~~s# 4? 1~?|q^O m?fEU_|7`|W)I=wW-\2Tsn`O:rɸ& r+w,?M^(vt5f^IޡVJAdN1! mZ}e_ѬxU7Y\LB*T \D8xe'n[q4WgAH[i>``k 1}G~^c=}cMR@]Tˤ!cnU^Q_O- !bmFs.=af+8f4s=PYA'-喨~$@%5PV4w'\9)/''$%49! Nu=M< P'^_b|G R ֿ ֝_1ZShV*hhK_DšY^ %XvT\/ W-n3 ,)B} beM~fwJIQՀ-7FP,? )i@F0LXo`sVAPj:߃*1LD AIzln?l_` G2 uoiŴ1ZPx\uLR{;fZ _C=֊˼ e ͭ)@^sli=IX@V["-f. "˞gH`4=Ll<+h3l6;!r9U,tFYYr+Ω2'yQ|ZD8=4pήXYst>K_HkbӍ: +.1u(Ԅk hBo+702W@TwwBFmqxYR>!:^#Iuh'~_a@Ur~as" l8zp"gT--Fta^hH@2!6=Ü"nYيfUwi~;1AuB(MeaM{OvO' QxBfowp3"ZA ף̚fD`-b={a'u5k5 +S˵y#)3 QX g*sc}u},0; J9mq3K£5ɼHHFV/_Xס^f9X8 FT7b3_1]YI d29p/O-5~ŸPv |9q@lq,Ƒ|l! .2LO: ,b\W6BЊ^ 隹XQ('@AOk'}1ϔ!m} "JDzu34ϭ׎ڌ50-'{KeAXagqF\焸$ hJ(MsoC6s{ |B0To@![`[Cxƫ1jZxcفٓ7t>cAf@_#8g;?ĝAfmW/HxڔYt/(KPfUq_DNu_g\kmÝ5t}Gh ;u![R@\_]bUT)+fPJ<g/9ܮ0Js]K0X`ݭ,:3{~ 3oCo5u~eoQ1>S=bq݇.  nF8Wy"/q{~֌_-vU\ [PBG۬t) Bo(QdcuϢ}H%fuXjGjj*%U*)B\ks:M@Ƴ-Kꁶ\QSL?-P;>ɓ#+9~&.`_YȎWG<" OyWBw.P/O`+('IB?c/^<z<9dwpYo&Z+`7Nt}ϙndZZ~N%%xOG} ~V6rԐŐ U `|]uAPu*ΕQQzSvЦhDP3@ &xʓS-H5 .z>?}gLl7A[+XwBٱ~@N\|QE VMqf:ؖ5ۦjaS, gc6:5|CpY$1E+U^hq-}Υb 3b?q4^飴G}iuGI /o1J-@{19S0>%=\?X^u>_{AQc1p~ ޷e!( A.h$iT͖b t:y,wjuBo{qH}p vW݀H>|a!#mG*u]$r':\Qx!)$&@$ 4D:V eFr[8ֵ*0 l<`aQ0Ȭ;4|s/%I" |fKh5}S%Zy'_y1 ?k*.\P>,?Y/ ~ ~<}r}x^rsdv( K L |ONV.-QX-Q-x+;jPK72p wI~+8Cx/ut/$ 8ON_ޕ~N kCgrnQP:f&'-~hIonN`7@6Ĭl/-VwR7@N1B/VnA#KAZ;-Kt*П"(Zk((~@o6ɾ6* lf,էZFM} %aw-SO(yL'U?MZ=sqiK<6LXF8 QqKB9^DJLۈ#}n%CD QjlKha K{f&^i5a賩>NHߨWB1zRPR@ϐWT^ 5 #ٶhv#ºʖ 1} GTd,HNh=̷u@;Kjz ?G*M76@Dv 2La2 ݴݗ?3Jzn1ciry" y< NBxԬ`Nb,ˮs 5VpWF"P)6LST_"վ`& ;/IXsr!VT8~L6aeL]^ZP`GQ57D[g~ۈh?^2.Fl" /! ܌?ݹ;E!Z>Ts|`c':waaA 8p)gs]U#f6nɡ;bKhvM 닪[)V- 4o!Z34j BϤϕ-h;3Ҹd +XQ5w4If(p4uQ]3h4BSQuGd 5E49tdB#JHBY&%6Co L3ؼ72gEKW? c7 zVᇐsZS)< \M~@v zFpFC ܮdNBxXAxFleoeV1#e6#+`@F_,P\?1'~v$2qT8~J j Č/x b-FK6";?|| s+8XLmo0:h&**_~@ CZeA옵F xKEKsX<:pd<~ɕW[.q&yͺ`Ce\(թ~x=vVkd,&~ To9QW/òKr]Tc{jv9|laֲ\7D6 fm_VT*_gA4kg2v{"+^V.05H2]yVRfEj^C8إ:M7{ R(?3P~ϲ.>/9J㟯Iۄ2o{Im59s}jS8^q22̋U}-1I t/h*U3/ n}ؠ,;i.|3? u/}RrW^>EҌ7ġ#<?P:(z]lq]| 㖶8;8,=Ζ,. GI'R[,'=ό?Ԯl-lѨ*S_~UWn<jDom$>hk]wϤc4 Q 5`eAx$c!FٛÄ# x򂫪m;^ꗐr+ӰJGIuAu1^/R/Y`t@aAKu=Eiر'=|68YB% ɵ.F4ZiRb逆(k䄲95nθ 7!;F_%>2ft?-n3%fZh33|#-.G>50F.A2Z`,Mk+p0q,pX\*0Y'HoʘwVL_J$bo" LzzYĩ4?޶VSS-Z$0u@g@A\8(?5V繾6-=?aLm?J>A=f K Cf!SM PKp؜,6@|p|0)aw" Ifj{mdʈcu(np8q[-UU?D{g'KrXg''5 ,..Y} Dkvb@/#0?횿?G|yni%JfV,}2|P]!"qG^2lkF?C.OoM$";8&(Z\3te _YnQ+=mn._:=vnw U ut˱x߃|>~?Z3Ԏџ¯ Uw{G]sͼr_qQ e@BNqf^¼x`j ﻺ!9Zc9/}H]o~8YpmEoIʧ#o+w|/`WnhQ韯pk ޣ/^خz2H狆?@G|GX=Cr;v{_I+vڴ ozs4R |>(L Kp G^r]7Y|j+;tt g i]mw>|)&{$gGђd2}ߐMCFO_f:" Xxkz֢} mmHH)n.HXxR#E_6.czt;}N~C jܲN2bK.,m}3m ;ve|G[/f GS 3!Rw5նRA"~ݐ?X8tՋ-TdSzb.m"NT9mG@JyMkgnsd˪o\ȫ#(ے\^8Ą?)+:1;ǴdmVηrEn>p0C`s$R̔Zssf'?#QWxoױJ^r v= }q˲(v*Z@6 / Œ7jK@ {4aMP!bjx"E[T9n d#H|#~ zǏVgn=yԡ.23#($Gkʖ4Nl=Tfз:‡n:{m_ޱBtU@CTRCBǻS@S]e`W8ph{˿ː % FY5Q{ZO;cյu[׆/OIFn<,<1g{;^VzfsN׷'H7Y4n0Tq4ytXZ$`siu#:z 1-cIns( ۅ9\kvhZ|ߢrO}FA|xUq3Xy_DBI޲:!'3(@n5Td+؁SwDHWJZ$ZVl.[|!+- [$&In@r9O֜;FhUM؈YhR|z6x!z5(Dz6Rh4BZzZXz}|w"^[ w?~<~E«M +KϸðuxjK{V`LH6!~B^սǮ__7phhLlceR¿VwMӎ ܽ& 84=GI]' Q'ĜCm߂}=W#WY6Ujc-iuﻡWo0D=6bKPUGPHHSL16n/{Iz.!%ܟ[ZM324gw&[ͅU έ!ÛhQ.?kδxdȵ鄩F ># elWȆ칪񁱿VmZ/ìQ5zf$K8R4e1D1S#d~GV,]pO)"ϧsg&W!T"B|+n\^Gκ N* 9W$ >f`G %u4m[+$'vĿ{҉1Og)b F_^$SyBiip?_MY*Zп85:<ȀPF'R za<],*dɍR s]c@w]x͖ϵЅE#!9jvFf#g_"Xu> V .O!6F5@.#PeM i8X{"kmYxU4A oP{_" jŽiqf5os| Lb1`Tj`j @zpEjxo%xO#I1}=#YcE%J{roӣ?M9nz(%(A/ xu HxIZ<W zmf6:S$v<z`/ޛY }8? jߗZe[Aঁee9ᛷFZ6,Jp|v(k*SFI/g:Qe2zu.:ko2J#e6l^oz29_ЂJ6/ΐdE\]>li x/Q2|)I V/O8JTO+WiyqC5=?`zL>Ψr4>Qa }pq윈ܿ Iv%p>l'JƶOʚ8BR_[ h ~j~TC: iZ yCxhGpV +6(Uߍa{z_XCur=b,Go!jťJ@,0 V$Ψ>k!ʺɦ5kj"ZVV-%tlMSW?xg^68##jT)|Α˟!c|=۟`  . wT9%o#R'! N"TiF*z+lf"ܾbRk>,܌?ň.|dtvČr$Q \V]EJnJư$;m ZX()p֞$ ]3Z˜;^E5q.̐6$yW"N{8eZ}l=+1 \ctOmz*d=_6!v zc6*ӽ%.=+|EiqD1uM<$ϲ6o4#ODK5u8Xe~AjRHP[؜|ca]#(**Nߡ$$A@„aOG+/.9Q:\rΠtư@(2m TlvA:7ץvAt%U|< 'ێq\]P˖}򖑃q*gSڑaI . }M`lb $*/a7kyU PlJȰ RtoXqgkY-$ 1qCU?;]Xd:e&C_Yl}񫶝~Wڸh81 m8PY$m9MunRC*.o\{iuDvbW&^߿pFMe<+˴Z-Fg}a=Y6X̮aDI]ś^joqYc^p[ŬN tϴǙ1Tާk)U$,1 oӽߢDΪ6P@0bZk< .1Ii͢q;aаpmVC@ c"i ]ljqAWk8bY[ul;prtk_@I[˵e2-2V>Xz.҉/5-qEAތѶC ^`[?n%8m %@ hGo,$ \3ku&,Ҏ%Q+BC5!C** hJw摔\!` 3E!۰Fc/Wac ="і zuhF+ֱ#z!;ű q?CvogdXg;cI >8Q~mkOuLJ hY5 YB-Q  o+HyFQ˳t2c (èD n);Ǹhkenms79y Rk7Ӛ7,Rf͘Uh;9DWS\cMD=H5%p^\O|Q` 0lnFQK޳W^2c8eJ#Xe+ {ui_Hy5r8Z`9.fH:.S6D}N^|!xAV49,$#Cj5'!U|cu-0H:iqmY['Nh95;=&8徎LϪ=7"-Jj hQ(.R0|l]rHp.gŶ^Qٝ =RڿXٱ_Kh4- G(wrBk 5Xl!" |,#Bch3Yc^ӹ]mwT.R6"S"z=yYKHyz7e/x' ~b yz4Q}/KՔq,l,uvĈbUSkL`0'նc55 # p+vD `]TR@r:3Bȩk}Q=bBVlvkTGˎ4i֯53v!`; \AJ*>/Z~=R'iZ]Ah_E ^N+0Vl: QFM7vmt!2?´-]9`Sg"nK{›/y*[rWwyS0K0Ru`7+9[E ׆QeFp%][S3'L)PZmWQ@vhygc<3(qiz-;XvX1'B/L[.;jg'Hp} s\fhm+9ü؊6?!0l+ac Ş̗w^gPZCt@sZxe 74 j?Y~+nxg| _aw[>DcgBօwXi3~(T۩YΧIR3{qdM92d?jdG@Ȃ1)72@6N%|h~f. 2 xAF(K$"* a&$Hx5fi=G '=^ 'pnBTsK\s;snrB|XnZَ8~8_V٣8PU*?DHu,p}i}?Σ-]Ԛzp}=ݦ=p_m79^Q"P=/˙GqѺ%nR$Qquޟɣw_#_DZ磻5Ȅ#L {<(I%,R(<>{kl[A=x&u~qR_a(=T֊*~tZҞc _|zx}|~Cܷ|Q~-O~}G\W<˝!Zf|ʣ..2Ҝ I+|[n[p;`}Jb.R-&+kf)׏bS=&r;UYI/1hݤخT_zSؽ"z:ޯߊp<}=-xEj@kunͭSuD .@Ķde~%/.dUx,D+(NF> vVɓ E QȯϾL}v&@,3p>^8Z^'LأPϢxcAz?=Q,R=a} #ץv\Y;Pt G } 3&B*BQ7ȯ]Ƭ]s ͏w|_50ozx傅W \O`Q"g^F}n4Iw/~ۢw6gU `C-J ohA.@߷Kx˙wt(ߥnx]]~Z$ U4CaIky2v^Rgߛ0Q-mDAfAp9EϵhiV0,V:r KDW|D0o5b}LtAgt0Sz:Bґhz#)e钹@GK P>\'s>[rZPE0\feN ^ȳɎD Uև_+twߘyFt0?6QXc{p%Hmu<3"revdBGn_a/5Bwo!36l.I7;2OW7Bw W#Yo:8\1o1iv FMoa$ZVVYPCf02 4b0#ݗmù—hr{X\3RGYQ6㍄Ep%~-.!gC'x_}F0Z$ ^?P}?és\9^*$%S6>P..IkA0 %ZĐ ߟa KNX'߬>9f7@|~U?;Fn o67 B^oIJk}T_u=Fڈ7 `Sv>tg<;XUaWrM6X-YAv IMsUk.Su(CAzO: hva=(+f0A7y;Yb%xbڮJ0˧xZ{JM^:Í>XfJd~Vny9%Xn#"6,AuX!^ʧO$}E,@xtN,}GFapYm/j}BQm]FZSw8_/%N?lrwx!Pͼ _R#JV+Fe>ABr$j%|߽%O"X>\D?=0%cԤ:>K9Ϛ&xJ Nh`@ǖ+%+(:jS 4:RM~[Ԉ+'/ GxpsbxŕolN;%f};H w7b[}-Ndg +Ѽ-8!|yVD{ֳ&E vκK: %ޯN5+{?tWhLEn򟘘0;]au 'Cqqhs/"_HX9ډ/S=|^Myt;^wx x&,}+JH[ Ne9?LC>TN[vf^WCѲ 8}nuz9Bs`gB nE _1A{dެ_n@ì9q'#^!'9לh8ldXas <諼7mt$>iU6+<^pX/EuQLw+ԇddG< ;Ea,[~iwny9nyDS2rtu/@{Au|p'"`:D*,/' 7iI7 b?â">q`zld?G)Ϥ@N";R"*WQ}-Ռ;[=.m[Vª]dsങ#!7 zI!{q>GTw?ٿmqzN,E N{(W;ܿcaJNKp%臗Ys{#Zxꊶ+ c?ϦG^M;"q9Y?r N 8=ޟ\QDj Bi}oGe :eZu'?3}՗dgw݋~=|>cwVA>橓=Sy(AXmU ~xN÷e6e:H3,d/V!ZGYc? DQ?Y 񘺫k%w_w+HO;I~m|/7rVg-#?l}Og/z _^vH>'p {~Ynªaݤ,6w؞tilqKA~NUw^pfZ[#9jA] 619hùp9*筺@M^3^]=og~$5/X=AI`4a/DssHGnB6/aZݜt4+5~|b] `][p1xߵ]j8W̮G a9@sg߰ _RУz"S"HcU[>Ev/ _WVMjF/~3DŽrF9ȟ{8.znHODu$JՊ>i%* i}bX,.3xVn~ǛT/j6kG#Zmx[7 e<^G@ͭg龖a}R u2:qlEAw]}Γeee Ry*+_|equ"jV,-A?a3âRgKW{6g 㾄 !0z^34-v@rc̝:OAQ-gsW'xy8U3/S\_#+$I^#k~"&SqOQVEa RZEc)Ti,T: Vn%3T_ " ÌP(ʷVp?Ghg/ xؚ!| >ܩne`6ͷnè4Li]~c=o qp GɃ!T`Xa6eilB3,mhh*{=a3^nM\|̸KÉinOEئtQ䬚NMݕ!F[w]aǼ|O?6F+/@D*,y#ⲩ%YlhLOspxCG|y8ԲQEa 7Is B/)!$`w5Nkp8hͷϷN?0 eOsi^|5NsѩӗK2YԧZ(9}8Ƒp1f~$ICSMJn5̍ˤe9y2u-/<zFE=Ou8.WoKsO7'ݝ¾[NzLORO>^W:Ou~}mg\1ή"V78`3ܜ`xli] Op~c, tyicrýXquc;Ǵx"!;AǙ;Hrc?yw7x8Ǘ7<^ e3ßOgf]|y@ :̊}AwLql0 (ǷK۪3ۼ0-~Ngz]WЄ6F lu5ޙ6ӻUb;޹vW%QSNfBqzB |ߞMȰb!3YOS@K lu4{a^ &`:!."q9+njʅ\(p75|&VG@ciFRN7S?yeq a ![i ِz@{В㈎%H*}qL<52& ZzCq{iJ)<ۮW'|Zo0q.E(:AuHH򬸺?g8.Z9g©ol]WZG3.o`M?y:)\DdqGԗGC֛5Q{Z'[ZABJl=__-: yMrRZW,Зu|ɽ)Z>k@f{W5RPt|ӖOY}`o>Ve g<Ѕُz`EaE@Uľ8 t^s~JQ4/͢>P}yuOo)>Iʚm?`C|8S0ߗ k׳@UJm,i8-&[` ?oHa$`V5XOةFQ% >6#`.yк#`!^e0،ahJ4@ey o^2B,+ОCMb N@Gz'%#oTi<'m3'WpAE[G4`È?*KRT?M*# O}brS rC;C70Kd4QZ)>7gf_SKp:LzZ$k OʼnF(k,'+gu8F(ԙXSPHƢ  R D~IݱcӇH L%0,]Y܎p?(dH 36x£I'!Gj||F  XbW2}^d%81D!N%?JxYԵ#LV _eO{Tv9]4ߍ;%doHblG0 څG<؄vk[=|V!&A^doZ&N8Xi*Roq?Ƃ裾P=GӸ׸?_,l{}yCGŵ=B.gr(pL¿ǧ~z\e@ -1u~ө PO"IMM?L7u(qmGN ~L!$b(}Ny;GlF^yAKQns4D=>7~H(0 r;aD_2_fŅ(&-[Sz,؜+l ݳ`ώSϸ7p/'eo'<ֲwp%R6p7pcwT]{@% 'ͭUGz(jA2A2H6rn ?_>ËqϺ!ϝ/@no)ŏ${OH3kv7pJzА>zm.|c}f0߂{|tK驱j1mRnt~ sS>`k -:: uAP-b/P~*ەr MK\0cw t<6po0 =4v'Wk>L" G{)pn0"rI.+=ԽC[E8[`d&q|'v驽X'M8S?4q gV-Gw8xĹ#=P݇ -E*hL0kky9(h"y('ɰd5񳨁i?TT\4]$l_s6iW˧ۢtV״]*b&2K *p8@Gn3!}YaJV]G91_.nU6/Z6pڗu n 3E(x?ß;vi|T -id& j?x}\S l;̖&*^2̦R˩N~]LMggZ6-rfחSf)ZvGj&:¦ ի8pɡo&p955\/NV97ij{:'լjiP;16{ N|o} LMa0Pױm<-j1`O)C4IKkcT~x"R`ӂ *A>'I_cD>:;P3^a]!~!{>a-{t.ZkPnZ8u|@@~jP)=Н;3&]` 31b$s|b9Ut@)pBz(q s0fo,e*3"e]v5|UrʢZE`7th8[I,sBZ A[ g͙'^+@ִR2 d /A 3#bڸn ND).@TG;s?oFYGKm;F .;@4Ċ#4_}x =AwvymZ)W,M31 #9fKbm/!Vys;ϑtuH>`K=+pHˡʚdTj/-_q&s( bgpQ?IߟA)^[#-Fj -4$D G>9r -pNZ.>ۨNњmu,?0wx0s*C3N?twpу[Ht MjR܆apZ2 95bŢR'uk5t-cmȃ ^Ϗ @1qI,;f9ZgP*p3}$/~Q:"C\b1$ 1d2#G*aeKGSENa7Mcۗop >+f0FxĨS'pÙXC뜘BXFnBR"y^ <3EwPLݾn#}jH8V r6g #NZ&% Bb>ķ8;o z :\:1G],};I݇-Hk'|x-`2㐣y؂{Uv|   B {kEtO+T0LBfY\6(gѷx~PJ%&#" ",&YXCCQ -%5:\{5b8,>!ЙPGpD+Dx<߻)cRV)Nt2 &8; l-ţ:#`$R3XqwMrA?+* 39 E[st*HP8è`쨢H5:!cŸ+qij@@ۘxܮp8 55 ~L;Y 4[2YppZΦ%>k%?c Jal$/>LE;sNOR89(x d/Jԓ>_f'DΑ9Zia%4dC׵Q6d(6P[Wۼ@ΐ R>@=FGBLjUmKO<,<UhG1n (\o tئE/U85fqHO@Ukw3A2ZbyN\(ɞt@(%+yb I*9/;8R`ԭ,5LQMg@v #̐S;Ď&{5L3TEA!ƨd\aK2 c%\Ӡn6r*h⟯g P,ϡCT %NjDAGP|%FO'­5gibzxĎ,#P7fK1A׃z=uWn+Q zyiڅ\ep\kxGc{heax9U-3N6VžR l?8" &K x0aOc*r*#ogK :zD[@2|ly/Z񗮈hō ccUP 4-!kw`~@BŠvɕK.>>:XۍgftVA2OmL[V{UoDфDU-ݪ` _k C`M|5ڀ Bp:`'Y<6£0^aNC D`7LZ|T 3A*۠ql AKG^L rk VgpT/LgŒN38gRf9 "!Q' 9ĺإiB/?հC^x *L3j0Y4%pK_z5Gdyb/xOrAq] Q\rMz#hAlK0&q-rna:'ۢ'gRR9ɣ$ Lioyy640no[y]tqERbO䴔-<  =t#~xi%7.v:#& +/C+h=<5a ˘<͵xhKX>NT/ TZ] Zsj 9ZTGdކ0:`vwI}½Ԇ=Z17;m+^v>~CxISDkҾhLa|[y1ˠ@2c:1z+ˉ <얲 +8iu9N O7`]IA|sbBʓ! 7ځ͝y)gss`k: Qa:| /|, #ᚰ.>nZF:~/I m(ė%mmFtmqlݲ ر`(!# P>mwh.N @|O{@\ N{zẓ񁣝{`zå6)RwRTCoTHgM Ac T&F=<d =DDG42Wu@c߼'">EɆ3?jb6d2쉮G@s~u?1xӌ2Je%Qg:M;{I}|@f'0O*t~HlZ,n>xIzz>JbZ2&2]z˴BxxN@v1i 9C9L(ENmB vLVp!59bID\JcJՁ5@aqo&{ss=ߋN;ǰSbŨʈ~kE4 zonb {%>Y@O/g 0u /'j*׶zxin=SB' `bb%6"wAc8yLP]c@@e^@gzpZzRD~8I@/%uhQE]$';hh%j){@Hh&VT\Pw-L=wL:6ZIƏSV爁 p#h8'G4/u@uCӵW7ͥ`dV.;RMJj%儘`+``{?Kj ټ>>#mQ),4*Hg LpO}yJ82rijs{Հ+~mtq M+ĈU6v DDVry.0Zs\<}GF:+ T#nxB`f;Uھ՜A4AA¶gZx"B[Ygg8g;v7t[I{m}NƍF#kjzOSV}،X"W}rMD3Fd(49~&xo.D*ݞK͏wF^5x 1HQ½P M8&1i7>rb1;?J 79 bWs<1 -|^zX"zZwG"?~ YԌ=ag޹u[^*A4ϛc mᡲy@gR # `W6´;`>p`F]}sJyȆz6jS+C/=@md!JA3@20rO~0R*{N6& 'vy.lTYveZ8uܖX°>G g [Ɨ1ޭ%Ph+wҺ1׀Hg:wjR]gǹ#*5fEVp_&l~W(iyJcE_"2K Lј( iG]';^ Bi?g.9;!;rԠ#3V&3CJ[80;#}u-Dt x-!'O9bJhC\CeMь{hK<?WZ3Ǵayf~x_ʷp==aҲP|mkV=ڜo{Q?"}6q{)<ɳk>Hmtj)x8ay, r/K^dXAC/Nnݮ0fUD->{tOG-z HĨ@ܟf%>ߑ*=&/ϞD,+dzKlCjGgZc[9v~W(==N>³S_a`vfw~z3[i=(R~N4O57fkⰃ=NIF&^g:qHI12Eٹ:ZX!g{y0>=ccqߋse3 W}`K͸>۹r6`P=FE8^\it1$lUEėa -0O>|@b3g 3wAnY-G 58O=kXրg뎀-:A] g5cA \{m쭰y3K wHNrpO 7`Ě~ gYkՌ+(2 贌_g9cLXQ{mއd[1Ͽ<-J_zD*ݎd4BVEDj[VNcJ^G_OG~M 7=g~0| ~2?TxV)hm(V5iPY{ 2Qk?UB{kei~GW7ej/TyuWyJhYi0nnQ;G'iҼ8 -%l4*zʗNM * Qf}YAs@4]84{v~‰@[ѧP;`]0S w2jS[cL5,ZYFmC- F`!-NO|y~S%!ꛓ<7-}'=t5!&骣@ʹ >JX?޿(23[xd`BhƵ(O35+>KyZw+XC9af˛ RS{p 9N;V4 x\Get6$8I];SP'%ؾ0 _WOf$y)嗍 D=*v/FnɤͶrWEZ:r!|e\ e 3 hN0hxҖA#Kf`f6lw؈#+"xXIAvAZuJG 94X'B meÛcgυ) ;<9t|mk,./oO1B0ͩgD:mr%ÔO#N泚މSw ff`W!){u9ipx py0YpdGF"8{zKC (4b{n|ZYr|`۰a>6lTYRFov25qC:27\#.NQ4c4c) 0R}{O:b|b>JpBfX&D[S)~̳p&! JZD ӥn4sˬ@uZ.ǁi#[lIII{.Ӑ-󄩥]Ʊhhcx 'N}7+=Lv0`+]Zq< ,d8+}i\it7j]{ W׼R,Fwapss%p0sy; >.J\b7_~E_0nFp޼nl"#\kwV',P8VuÛ-]uGgڜL@pC[j1풐f$̹Չm9҃A 3ů =<{\rIIs+fSϊ-dABItlZ$u/z|%gڰ\ge; dFH@nY ӸmϸbZH?7ͪ߄bHkL92Bֈ;*I ѭYq1{݀pL]9}F6f/5ѼT}ٓ+4hEWT~Q<+BU{}!tOz 'dLsRc愠#B!I: #1 ;-i2Wp*Zք^FR״ig3?jkKk~*x226\Y+U{V7)'#@-tq,RqR~֩W秊 #>h1줬KPn?< Wu*>I'JzXGgEtOI׬!DnJ;*DuUşjP_JZ^s ?mMED_RQ[Oi`c85Rd/CM`EBޞ_Dgo4իkuɯ(2vAOSZ'X$P/y8afG/8TKlikYmqA.8=jgfˋ;±&CG0zSڎtlojΐy@4Ӷh^~yft1X xHn94T$mԍB܆y&J `pk V1-=&-NH\Zg/k8:[K=knd56sdWb5_kf#;oI-xC9BwJF1p'~sG^|J,dULE3 et_qvZk%uqrdl~x2Cs 2G.p0}/ϴxR/F҇mo(Y>6kLYݛKsuρ!MZ,c ڄU v{4<+n)wr-K9L{N2tBi$?;rc. Ǣ/+) vFG*ZALN&K\752;/&P2U\[|juq Q˜q&V Q|6O^Fw~,|eNzjw*+@TrQAY^y2*EpV"Ayt48vZxĢ 6{t!`\~^*%}hӷ1E-ZGyh3H Do(ù^J^fzȽ?~exCefkb[5%EQʾ֜ w_7sFchHRfL4 8I%9uY^yr,^} i?8+3_ |j|–(S8/#J<8ՆQT)x}:!t c3|`YiZ=ԴRƦQF]U:oղA($FMsW8@ivUd DaePx,k>ao ;0sv`H'2 d7B3a;f3'?q(rdzg 4c'^thg󷥘UVu v[#zBce +^,W었M^4vbL GS@Y'y 6.F6X!h _a?agFTl΂)/ bڱYiMtܪ聫ro9j꽬 o}kӿJW0ReggS-4b.t鰸0-^Vn;UDj3,nnN~EM ЪŒV;3ך"v+d}8#!bKq'1I t{A<ϝb2{`wMSrbfqwokJUG95< 6^&T,pfCI4,Z  lS˶*Ō0ä\ҎK_^}MNa_iUׁ4-x6u#)sR#zB9:Qc ChncٗfJP---*iROr!|ov+KpiQS];ɏ6ڟ̻bXT\MY4L\~F57 g>mjaѴJ:`JzzuhܕO׿ڥz=7v9W.A?18Z˾X:xsj}vdY?"\ǟJ+~鮲Pq^YZ- .0~#>\o+,=P=EѼ"wnxdsnW|}r)_ބq^Z䏍8,r$c!0o.؟j@JU?FR8ܓ-,=0aI5sz|0G!X^'2m79=EOD-*ώ袊pTm/RA]%-<^ B`%4F{C$lw3*jUc(DzP4֪Wel5Tn.2ƕnt}+R*"/v¾8j %byA{k΍eti./fQʛ6XnnñAUptےT^&?˼YI΄t@h='v˧3J=0Pl°NZJ?15v`/Sh"~.73ȳyc{M:@!Ze '~]_m n 姅UP!_r a#n֚u3뵥Ho~VQ<=ΐ*p)/{ 3=ªـ?A M.?/>rb4U)mt`wLRw3g5`0ƭT8g{? s^k|^"_nmGd t +jB x,%_0iLujڛͲbhdXtuJ"=n{~h?OxTmk:>x>w37ayS=y"Z'mwل^?^1]K#]͟f/_b͊;bi YEEc UlO{<9kNA7dtX BmSI;\?4-&\X&pU8B[_|kŴ]m, Nr ="nuL!E忈l' S85sm:ݡ!w^iB w{+:/-3oKfسb@#mD[nSFo 9xwmýݯ43 iD ; az`c6hDoT&${oڏv38z ]̫O1 +bY@?>wP[ijO8/ /Y{+*_!y&ETm;`t1'%'|xHv9~.Rs6ͭ8I q :!CO'ĕ>,/'d#OvLz_v?ZR\.iqR+8eӬs h6t!WI*Rvw=s>Ki^/j:י"݂8P6:>04?ԄIIR~q=HptcXcN #.=͠,"{3j H#ڛ!rjn2Fu;5_Q0#{x, -0x]%f(D޵ުbS]<GBIq =VхVnT!9aKj l#"+MO\3wL7NbkZ/@>K%ZU^%7Kim'O8;*?ѐz p F/%u>̫1p,+xPP-'1/9FaWCG в+4Gt\8#L߶DX2 m΀oڋxy+̞9匶sguRC}e"dX0Fv>aef)0WvuW.Cb>~_sd32([Zܤv!$Ŷ6ˁ?y)mf hZˢMzp?@\MO|I\A##Pl&l\<""%յk3G饊5D)]4fYqc"HղPAlJVurOFXENɞi-j|Iϓ9"NTzX* _M4=Þv xݑ b +;@J;$гzb\;T88SMv7"`G O@hlh,q0X8@ ǜ)#%,LS4ʤ(>Je;= =}wyHa+F]-ʲ?)͔ m׷d#ԒM޼«nmwIqRotmG8v曜7 VK"Q8WOIhfB8]4@[PQ7ת ޸&7|h=o_m̔[!8w7': "&Z`{E8;p'(Aa]^|)2:OkZ:j0_8kNk  GSz: ̨78GG;6s^C#Jxic<=jMxj^fX^WH;ژvpt~֬y@Ϟ-8jOv!hdP |о0${*Gf54ۮ,F+OV F;zWOX1xhf~sk6 wJOѢ5104ފfi;lMoL=X )|ʝhs{"70[fTK]4#-1SgeҠ kOC5}}*YMOz}oJW+dra>07#_8JOV6æPrToAHӘŇ LM3 #Ȑ@SB:ud[\/ 4oI ~*Lw^cIENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/bricks.png0000664000175000017500000015552112412501752020730 0ustar brunobrunoPNG  IHDR`BPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZiA5 IDATxϮ6_wr!BjV;UA 5X$+:4M\d`<^DhS]Sr DJJu$Nv(R(ՉO?yG?yѓ=y| 񗗗:]/_~{ᅴs&MsW՝+wǗ6%Oz3g]|id~~z5~Z}[6?}wӫ['onݗǟ_8qyK(~} ca).7w  rWO_2^k}^~\_ \9cj6qb/lp=9CRAy~@_>[?Ln_C&t*%Z>ͅ\"hy3<}3|ڏE'k0gdR^]F0CY^42~E/A1עue/Tp +`q_f&C)wrP "p񃏹(~͐w7} Djjn[/هEW޶pjf f<|Iɠ|#ϤZO94Ȼ͙>c$2YtTWnGd6{n3~^G{sy_>f>^s>EsC0TG ΎVMOqyfs\ݽx5a;0 `2@tc0׵8._&8/# wVxGM8?bF]>y#2-$ӭ " 3#.}zq9:B%gRLOn>+\p`o V{N=xg3ǧbjMǏ145KڷJgeC1 Vr_/<-<(f׸y%YNp5(97} 뗖#.5yo3SGF΅YێV\Te;u){2^UGޒAEB]1``3h9bØ܎/<2]^E^qvA{A(b![q91%h5߸! /)4/hAxϸ Pn5)u%o!$zow) mN%mhlAJ/Ց}$4D,r)0B=[S៩wO?'Wи}LǗBp&o :]ŗfC?/w qI wЇg!uq*!CP+FM`X0lp*ߖǽԶɂ5h_.n?l$` qۏTyl9Xn %ڎ-?-,3kox򄬷M<-DPO :ɱ\(pYm/ԺŽ߇* ꎏb&8k|Ǘg||`BfIV & $0xt滤>nǗr\B y=hV*\H^܍#O|q8gYƖۜǞNc=h|z3'mb_@5W8/ -NHk9SkXٛ4MؒhY8|<f~-r< xC5~Y6{-?*q# ?c|ZǗg|`%~ׇߣQ {#KGJMY6x0KIf ;x 6,(e Bsm~}EDоAB0LIb%t*!g;` ۧ8&pӐS9K}͂~.X)ZԵfo`QVy0og1S׷Ymxe_N/n߆=̭>_C5L_}]}]ViMnC[2}لM^}($J_$]Ot#m pmjkëWoҾ=پ~xW7^OK}aa?COou6 l9y|\ߚkz=_ߚ?VI[TiMyF%a奼C?U(<׏ó_\^2m/ JBNp`.>q DĦȤlӚA9tynj]gy:u$?55ź6%e>r㋟.1\Oڪxz9e2IlS֨~[E) > 맺}_־ c9P|$cBvC0Pٺc #C iv|w栟1\}5Ο纃fsmx) 6tE˥ >mάmRǗݣV|ډ/CNt_ηUYG0eB4:e*:erE%pRʵv2= ֜'r~J#R^ۨnsxw!@밸hHUԜFQ5 ?9>}]Bl`zCqx]њyo8盪sѹ6ߔ@ZiO'K$fD &.k_P:h*̤!w!tCFN6:O,b< PCq09/: 9fwi شSpZH\>Ub[k|%Rw_ ) ҭ-As0{X_K  яXZ6qQE6`_<|hU|<|ZD>9aS-)7yx'!-вmN6xh;Ɩ<.}D)dF_Rǣys3>{,5D ڮ`2=./]4O7/"Q/ǃkgRxֽBgx?̐@tއx!0 06EڢC^oS{2{//l[S6~5#ĺ2Q׍vMϦll-@I2i/ z:Yfq<~܂"Xoʋ:ےmJ3˘lwK&*aM2mʸԃ6Xs8o96vԸءDg[jϼ~#L8&PLdiO7ІR [虡o7 o%{Tc¹d%;bj| 9mRc۬*法O^u _=xAG>7 GY7/9-XcS_Ȅi⋗W>Ν2ɠïew^ئ|9'RƦ1m#g8MĴ<q%,l>g1WcdvZߗ6Q$S%>9~CH6JYcNtrᵕO~kv6ж,e|)&lL_62N.\ v|ǯe UgllRVɖ7:0+rjR๐W MJRz>+J;zG%:>1G|:?`n1_a۸m:[1~ mb9\\͛'oVlw:?`F6\(>p6QEf9x<ۇ()i)&e56h]ro;>o4m릷 ʖllԏ-lM=jY66oN\nϘs\>a+~}Gmm?Y.~)lx)6W<݃Ml8Թ m <$˛k%L`0;vRoKߍzӾw}GmЦ۷ص{ng#\$H&lLIv?7;Oolw}'?orSO7Z ~|8WL6f;qΝWWo?wVnj%MMM,ӏII. `wߔNy>~|rKo>㗏\rzO憖R|Ó'/)ᗢZkvK璊O^ek|ɓK?'f5W|%^_RoO?3 ҧj4_8>&/8?x'.}Dk$5/:8:8:X9 _N}|9ÀxeBy(A.µ|L֏$?M .r! ?TfhB( xTƲh8#|s+'eY˲RX|/iZZ}'zj8 [QnV//n ]1W9ŗ o)x1YsrSv;z\>:eYK~k6.lӷ53/Ԇ IԘ^5#UL憖`rS71#9a(_a|zAeH ;x&~Xs$ǑKq"]sUaf8;~}_ o& ȧ'x# 1ɣp 7qߙ~fi}on-5Xr\/\wvTnl};zY-gr{mӕsSK/.ƛ'|,c+Yg[O<&ׇgqOnꞋpƼ '~ x9xfynu.H9 'M]0GZ¹cuYB4;j/*y ui^-Ν$P\ s LbPӶgÕ-LYl^&l`f&kƘH(aY&\xQ mei3c΃a["< TN6 ؼˆ-ۧsccTQi#S܎l)S.Vnj/ z$)M=.2 rOapB 8ofȇ,x`AsZCaf4`rJ3`0@yA+{9.Rl kޕ'%(_Mx\#Ng01O*<+~"43A-̣ [)h<6LBEyo!_ +>_g%B>ڶ>7vl%6[[&vprsc-`J3sSù²Ap͚_L>7Wwo8Z{~zfIפǹ-K8;^Z"̀A| .ٸF>Zȋ Z򣕛:#$kaxwa"0,N,ၫcY`m j`v\0@܃B5g{!gU5CâyWk;kDYDtH1~,.<$1ޅ]%(}FYclh-}/Lnll3ᾝ[`Nnnm{ m.75Ql/ZVnj̕#xKggӶxgJy¦v|?h\0ٹ W_컴6gPHܗ| "7r[AN HGsS@9ax7n`Q>+̵B=:yG㈵@9IxVP|g7\`RZj~IWU妉`QQ2m+ኔjrcwTfy˺:v5f[) XLtXdN52.kٰ7iNiֹŝ۹eMw'7=-}0*TnjsS?;2vX-.=g& $f`‰ ?HsxCrSBMe;|X¸vY ؟"̞ӌeAy?k=2xނ^Kj0Hq6Yg)scOK$K@X$߶Ljf6TM5yM蔗Ρm[dfxddm>7-pa,ֹLHܵ?}A8Ý^.u1wM=j.%87ӓ:rgnnj:p+75=Q ]rSs2/Q|[:~&0ZhXeE-6 PE kaA3S3[Te8BFz` 0D,h2p!YqmSG#̪ƷIp8AG;7o06nIrcש|kTnmy۹qUng[O.+Q61\fRAnj+w777(rYǘE禞2ΝgڹAMmn:!sS{sSsԓEاuXyjɍ-,Eba&rS[iG|Ý^n妞]nk7[ZԒyOFO&4] v/wPG IDAT#܄qA3Y@g|{3>ڳ76M߾-_9]>CcoKu}nlQ^_Ҧ:^~?|[|^Z;~y ?/q?_?dvO'`^_{|O_|<>}ާҳx=߇%|WS؝7O_}6l 3\Գtno}~Δ-KrM?ױey/^ϡ*znTnWΆU໯ӫ-=՝g67aټ+(7?_J H}aW>oַ|+H;anj9n=WﯞǶ}~?c>qj{[|+1ۿsθR;(尥qQn |e̅cSOrmSy;pf8~n˫{W^WO~[>֓ظ:_<YdnaKcuMW]LsSr~iߏi\>ܵoKrSSɡ}Y` g U4Y:r)>:U \n_e>ݾ{ ]}qqiS\}p>\=U'毭uMa"۵vU@mrSOi6mµG|`SqerO8>:i۾MNMmgSwڮ965> vDER P&menaΫ$h^d Eu,CF4/w: 뗼ת}#n},#>RᵡZ줺뱝U B>lhn961.adl>Y;E7rS P 8YuU]ʈHUMJR[eMEzOr\KpmƢ,lµG|`Sq% ?ݾgLn}6u{@uqMZppzl+rC߭B?]ǧwCrۜa^]^F|5ۺ}^nqyww ~Ol`XQ;z*B&ttqmj =>^25f]R56BAc5G) UvU)a-GSޮT|Ԗq\ۦ{Րm\ l Cz5qc8>mj{m;65,kSRR1&s>~GGe*O8i^oFpczà~;2wJ0s;C2,`SJ>4ZVboXg j[#79wl ~! Nnjsϋ.lo\W& {`u 6gbNB- R=5ɵMEy3p-9N|m'[m3C{zG641j˻mꜢHy#}=͠>&^U @X+9Én\m?p &}1gAծثx*_bCQ/8`u",TDYJd"2CnGW?:6t'ݳlqn#>sDcA15K\沄Vc_b糖jJp/oUkpvSQKLmr65;/xmj#[޲'9FyK=?>5q]>-;>aSk>j$pЦj^3[;cxfN$!N"c8l0,^Zح<Տo]}7 S328h^96| n?!9iX g%pIX61P̶몺%xŹT Ve 9lYhĠ Gx USc?X뚶 ]H~9ZfSc:J?}ܶގm)e~,}M;m.mǸsQzmj'mj%: !siKlX<ڗ%RHUR鄯-^3m?Yaso1S2eKSF<_-m_CuN]"䀛ae8)FPe6v}9{,M}IJ<; ͎@f 26pY:-WkʶPGf](SUyڲZoSGe3;6;6}62ϥklZMscSǍOԚOR+=3lj>_`pMӢж8ǬuB0}m>( A;AѼ3WgׄQM,to/}[p mjy:6{1,L!A\LڍXjS{%8;+dJ*sCK.3J:LV@T| RuMɶ: k7%I'{fώ5/zٵ\_|kS9|~Jls۶K hN=o,Mb=%n_pBS7lݐ&r9Š֏<]=[?]h޻|Ann$؍/Ѷq׿;9BKll>[&\xr)#ܛg\^;}wÚF(Jrkjช"RD %Rt-`m~t뚶f-۵% .ϮoS_~qymM=6DrØ:y6u9kSl/ G>LVƳ6w^n/y[f[9K>w7Lsew/\acam!p!qos{KlW[ŶqRh!ߐ`0wo)h䉐&w,/es-oٶ۵luˣvsw-l՝mmrW?zn*wuJDmk{9s(zeپȯ6.fwַvޚǫn)r O=ܬoljw~szh3m>Shm b?c3}e ^U6qm/mm[vMϿN]{zlk{^"{۹뿬j+po yg[k^2?eٶ߆Ӷuei&P= ljoU軪_"hHЖRUo뿍bs۰jM-P[7U-+˽zm\y9~hlm[6rۖ=æ36ܔ$w;ͭMZqn|#0_ۆ 1js -;?}r e~ҎmxuR[ւehm[ Kͪ|6fC^j\C=miux^8j_>SP 8﫺~lSZT4ϱ޽ Q[fS˝)-o"B*?f>8kl⽗KAKƩ036m[v-ܦ>evMOG$!8|{Ms#{ڷ`qZa:nlkë}±735Gq˶ֹ5݇-8VfC=Q= 0ٸq}qE/ԱZ ej]oBPp(ph]1vmt؅!_ y&k0Nu|]cڦ:CY]>j~̦k`6e;{/aw^n۲G/m3ljR8ز<65p [Qp_yQF"*OҜaSԨSy[km]xpc[ bm?&tebHDef8c5QwP5=tfY7/ŃΥXqLx eqg8T18XbP!w <ʯ}AyP01FUE˪*+9)ῆ _#UPv|M-w\>ߔ 0=z&=z9^"[y-{rۖ=ænmiX-ʦnӒźNqyR3xz{yWF8u wm}VǶrOkf9:?=70/Aޖ֯:gn KgD3aEӆq(.x BP>ЅF  y%aIqL{2.H!,RyP ga7.[y @ma/|MmmgUQ6ܶm[Y-ܦ'lj MmOG`bň t7u6i}OKmAaox]ۈ8|gn 4sڶ W]inl>45WI!eT]n7k0٠QJe*miY7>LqtvԹ TT]cV6g.{`PY܈"p"Å  ^Tcҫ{b4i6t[ \2=A cgS7puVuYK0FjMm i~D{ ;}Uۢץ+KU٤erpm~L+m/R-6m#kZ§mjçlj, N([ 546>@,Ob׎Mp0E9MsڲwZk^l=9 ŭ{x}5۷#?ʒɆ8P܄. 3g|ֶ:xw ?f9jsT3& ,>޽(IR"o5^&n+:WFx?a4,¶hè a" mvqM}ԝ(mc-Kiּf>#D٢;8G\~ϤmR9ƾtm[c{[m"(ȌMy_ M wV[65oF#ŔM7Klj9Ýɽ_=U~`W7 G3\Vmniͱq0ɥslk^ojSo=ǃqp| LJ 02CMw6I u5^mNxq2\l8pF8ԑ& e*,&M,?y\M֏~M߳lg/Am^>AtrXM/3cc_/و۶峔#ٲoզNf֦#LoS%0FM_ P*~5.d*i``f!K=M,l(w[WIA$9gL6׷q{Cȶ?;j8>-a|A܌p6'yS=|7CǸ .Q)[~y&+,W`Bl'|7<>r׳l@*OC{jm^~a.5DI[8l/.r(m^~y u 9(ccZjm[8VCٲoצf'ljtm궷wpAcD_04ks7:{0'2Z*F=]4XqN{e26@|k 8r_c9,?ީ#]zhSWhﱩ#^2DNDzˊOM旴˺hlQ󜱢Јp e{Q-Lg~ED`.J6ln&PE3.8@ڼ6qXfOE+9l7~ cSl6qoemܛݴ}V6nQܻ?ܘѳ}ZOp-mw/n_z+ʍl[P?~WzvjʲӇWm{lS;Ӧ?Uu_U}ܿ;Vok G17kB|G^Wr ۼ-Np\bypdV[uо6u z9NF7cw-TƶxK[YQԮ >?m -/ϲ3_eǐzM NmtnQHR٪ۢ6/,s7qIS(,%ZVu籡*c{l}ofSW+Ct;Y\B#gccBxm] W6mcmjy6ϾtE7mQЈxy }#w|{U{:UtY`S'm9]*[R=lPSz<>m絸뱅\׳bolCMgf"KyljE߂oS"ps'+&4U⾪sm,^7ۺ3|4Rocmj׆gc[j9ѯYAP-g'WC[?=c|пn_dS'yL898ݼ zoZ<:,KlU}<^FvZ4#~MmxM-Al l %dLgKc @UIֵRR&\%ٿ96'z87տ918eWdk`k[z:_wEc'ytjM:!zV`NVh9,o)MLZ/"ֲ}]ޖ*:6?tA OylTЦT9I{ڶ65s?]nSmqJ[9&Q 1׿>oiޕ#<7 lK,~3{Tsj/Uq̕We__fS7A)g(#suv fqB'OqX.8,5mcK1l|¦\#6RH<@;Ϧ6jW-I]{CuWm8lk&纙Mmc8~Zand#fw>7y+mcnl,>]}Ӟ|`k[Uv|-/G ^7WGù07x繲j)Sy }6uύM6>Vnj͝Xc)g_Tdzr7k'38m5- |+| mk̲e6ئvr~}03Qk[Ƀߨam8\vV\4y\0usU>xdNjny{ئoc&L&f9?O⋡m=hT׿./ ZU_C{Z:w 1gƦ\bS[60olvWp%b:iڢcC7m]C$mZ&mMMۛ/?bƝC` ^q] IDAT<X4?_~zoSmY s'豿lٕܿۿ_`S8ob..1as `SԼ妞ena|4Թ YODmZK ;FEnm]y;m[#Ҷ>>G lu6~=6"ѷOOC|Ӟ3>\=|Dzܿۜf}n&ȓm6&ޒN.w󒺹'9ZQr!2gتu˳gv>g|Eت߇he<#V7~%^~?6jLqi-~|[O/LRiSD.aMgk:Y/h*~S^qU&U?gñl9.1V-T/'saPcSXm>꿎Nu4m*E9}j hDOO4}OwLڷzU٠*D-jRGtn(oϥJ)nظ^V7up=@&M8_5.eH6u8wHZ>a.1q"Li&7ùTKۧǞӡəD?L)?{aɍ_W6mJ]`|>Injvkn|׍OkW7M%SVW=/kDET6hWض;+fBPHb7¼l~g2|`N=,H F#OiKQ{H5k1če e1U`)@=/}._Or._`I^rB1)cVQ_}~PY͂Tns>?j[a}Պfuf(7>)  ES;>B{|q6=7K,h PݔO>#mQuv9ޗpO)l#?OPxoo%byy"*/@A)Ri`Ff=!ʻLI_7AB;mN8iʃ@>ysE<VTy)DaÑ'Ab3Q$:~IKU1|y]o9NmŠ*oYDVyrS Rk[>=>ӺwP5>'G>ǧiڇ3Xoj(mR)=[cNkow[^Wn'Dzx#qR[U*7Uլ#a :GQ_˹T-gA#0] 6XsiK7[ Pe 'E N8Te% g Vb jt Q`CIaU_?C,@? θs5qچ.￞Z4!NG[c`k׾eSMSs-|ab8>{Ct /i\vq@ ZIIXl& ~}~Y#mT؊ ._8s:|Ƕ*k,T:i{ qrS+O.]nj|$hD{GLXmL8,'9)j&9l)I`;"c_ݝЏ5%,|6uUI xC|uxңmly4ak)O&g8L}9[}h]6jž6/&m_|^g2ELqP7V-rX`^۪LG$٬mعgSWsSsNr% S_msme=gbi$ǯ`MrHbv =I"C[73m X2_MY㓑<^LP۩{Y2ll'.xllW\>攷 ,nM}|}S7:@Ju3ť s&(v+A_cS7M=|fz6wrk:tq̇zg(Lř)k3q7SJI.7ޫ]uKUl65# 1Ѷ+oa`ٜ-^8ƼߧD~GLY(\n_P4ckSohSj6Z6已A39;+&8xǷ{G$r᰿R0grs|};mbc/aJ_Q|yDn۲&F-<m۲h-VtoiLp"omQ4o ui#בK£ϿRn񉹯=U.:΋l}6as۫3~k'I2"M7;oS'ϿMѬ ow_ #ڵ?}l9gSqӗ7jSwepsͳ 3PI~k|ҹm\ƞ]koljJ_mlh\MZ}5mCM}jvmR؎fƦZ},o/7y.6=ߎM;j-oZ=y+ $^֗ـ5uB_Ʀ` >Sh㵡ڄg\1GWycw+:.Lb؛͜>|d[;<Oj<9eSH^mcŚic,pje8jEiǗU6_/cS/sS |63ˆQ@i_?~3泡GB^l plh}JgZ{3^PKmny8_9ح;>OJQE˟9 Hp̃B=n' kUpǟ}ϳr6Hworצw|\Z\8C 4*븬]_74 `oyy>/z07u>njS'ct64c-Wplh/vL-Ж6xc*㘗-A |m|TR7Ptv>\Osٸ%W [t3wۃ,S9<,%0BG#gSSRykSs.:pbōI˪˞:Kqύ=rt3/ ljoiq>B1W% }uF:缳Yh۸T^ \ыKurԱA"W^e!reSg[|zs}$,sk:7TLMWeŒ3.cŪ>7Ò.c34|y65jrҵ{i_lnlϺ/$~;X\RfSA|!K:>'w}nL\49e~anj ]1urM-kCKIu66{YnzzYڶ+:fj͗ظI/fvsVaqMI(M^6>QfKz%= X65<Uz6YKlt|ildAbs}lu4Nn77ݾPNn}aHn]ARsþyѦ3iCYG7w28(:.?ۆvr/ hxs8AeaʦN2Ē#ە_7ҽepMGur>E3n rP6G6 =oBB<4?)pC΄.'a/6daEaZ0 ?/zh{n_Qϡ}q=h] 8> 0̓< G8 l;MFA6uQʆlYG0MbDž7x/ƦtuѲx%CeSM+KmO~xpyYMf9͂mM<І lM_ljkct5-7M9WQqKو DRuZբ4zy/K?'S\l⫑ ?"/^.BKqnǗ/2r$7u2gSM-pIoSS_$~ClD~K̛xM=ka֝Mf9Lm>PMP8ȁ5z[j:_̓~pG:mO,YIiK3g̛_mkIaGgS+5ohSZmF6/ń-j⋟2n|8V=Ilj NM=/>?7eSmj1^{65)`b.G Mp|f!6O b>h0V8%I @$ flXȫ$3|Eh 9+"T9gw̖~[6} *j8Yń-**< Mq(&yTQmc8zhSG-\ymmpm/3-zKB|mm[2mkԸҖ}3>ۚ7wئl˲-ؠ76_oW36!?Ͽ96$|#A[D[o ) vvrbe맒r;|&2KCY<}.?l}<}rg?Go%i[˟^{ wx65zڦ6~Q>N۞?M(ەɴMu1nұIҪK]Ų>suws%2/|Cua< (PO_uuA<s yzJB,Ap{ *Sǂ b=1}!,]A9Kץ\?gd8>L0Οqxs9gs9[Iu|4-< Q |?x|ʪ-~ŕ o}R'ʶ9 =Wq{[KrFq&/ԗ{W.YGgb8[[S><ȲQV|CݐgqN~3zz}?Gz8V:2ٓ0CBEmhhV] U˴hhJSm[rF??aZWd0Ɏ.o/$y]vsS7).w٥oXyty޴Tn yTO{[3>>P]?.-~9+WO, S‚ F퉟hz0='Nn.kB&h׏Tr&LjL,~Gś]Ρ 'yΫY?mp<| Dʚ`H½}υixY7pvG}?Fq90 "Duı-dj*vfM*BWK:ԥAW LM7z"_# q<3S\SH^&34vyG]>0o|\psOa1i'o㸪SӪ,`Rr0{caW\D>A˴e(KcҒ 86ngBI1̍l٤0vdl\,|= 8%] B 0ᶍ0alOK*ږ,qMNfPmv0.SgO?zsyR)o~Ǯ}c~&5D920ȻbLl|| 8lkOٟ`!ɷ. 3(y KpMA}dB~q|ǾH}-Ī.wTo{R=v`-6p]n*m=ͳ9~X0ݭ)h=>t=އPFjyC'O+&8Em 3t0lO[܌Ois(:Wz箭kQp?~LeSw)fޜݭ,E8>CT.cxԏuӞC0GHGYqfZœ9>8 ھ}.Oz? ȓvY՜vyr X7Lðh°)~&I>(걭y`\FS0S}|6 ;Ogqbaғ`BSbN,m;a)EkR@:WZ'= 46ol2待Chgr<'26˒, bܼ0Uζ;;[wl& R* fe*lZ;Mzno͐WrQKGꐔ}|!Y/fNǏ6f2aLb M{0l 6=T>"Oݎ6.ZoRW*ù : gŁ6V+>XL*޺/ $ DV"L gAR~fMt'k#iPC&? AB.d.v_+]_A9L(/\>eCa)Jw>z_~/qR IDAT{կ`e?`|Xa>o.eLv 八UE;57 @CFAo\hsDL&Wr`UfXN,:6@^ 0A$JYӈ% só<1AfԔ5ܼQrf?.TqU CQ(/DBXW`>ހf1?S{|%z6&㎟u/ |a}k+#$`j[[aƜĸN] -߅(Jel%dJgYGIbeSHAmkxxP-|(G0^ O&R2.F1#PGH{؞ߐT 0Ce+lPGk2?y)!H4CR} qf:ei tv0jjpjiGM3td n C`̴ɪ)D^ BN8<շ;ܭ O- 0W<^ 9"FoSo ;6,x$d*$1.DQ,6 G<_B},DlB񝩍vNP۞?`i7OCGxPBxL)vQ[yuȠa~-4_8~O.%nsT'r(5 039@JU\~A+bLalF 3i#D-Y5qRKpoMFM5ՊrH^mblEoCφxVV؇h6ɰ>o 8x~VpӻL^QtϤ9 \2Qvah)Y(Xgy#Ɖ#nOfD^W"gl)yg?j8=:  óY18(j5僧hnS^k8l06Ƭ?R-|eMׇ1VjM6BT?aƲQ ?݆x}1@8"a\\gF|ygϞ=|&pdq~Kyhks`soØ?[?=|(eɯlC5}nܿnw/*7/BzgԲp$?w-^}B^oQ2گ/aRTؠ+8.gQ/WqX*&["}oG53JSx6[ ?> ~#3GnwߺB~k.8?Q~:n_;[EyY?(_ O睑׸RPK~h_51?:_Q-mlZx^M>(P-nKXMS[O7K7qtnMM:]xcXK$k8%f>.KL!^jR,p#?激)q?,!o%+(z {~DQtP(GA%[E ?Les:#Ў+_W]Ք_%Ʉ8Ino[kBi'A?8ZXeX_tϹ9-?s3C-? 9SmnKy~:1]%5i?%$j|)w<?CrPr'LZ5TԻ..ffkj̨}BZ ~aOD7цwyDI ?)|O?apڇ:KpTu㦄k] qWrӟ2qQRb=(:3j3^5ܗ ^Y5f׾gP_o} ~ځuh5ub ncnB{&w%D[Blln`P hJtV|4,xBׯQt]ږ]+(qX9^b,Rx )۷+Q{LQE,AE/Qg >5ޤAE6a/pc-0X͌A[Ӯ;? 'CG<O 닂~][ᑍ;d)zᇛw0N;Vt?[{iBJ}J%x8zO\& zUKL}}PgFx&b 7Q9H%^y|TkZ\DZyۑ\2QFol; Å `rtd6~YlSHk w0Gwswk[%?Ϥ{mamK/nIV87zEwnD[1#KDwsĩDb;Lw76PL+V0r'QlՒUs ek8ַ%v8["B54I$uKqQ ZƷcvD1>Iajb-!I`Wpp RdLqU6vSf>`xo`w0Cء` vΊI] GѐJ)7 .Px퐥n_Dˍ\wl=?W_ϾI 3xB6v{N&~Il_\nn$~  Ӱ8"IPjdVN]XTL ΠB;ĕWK2UԎ4X->L 1Uc"0Tmp=%?@LMy*eUEkFuWXx\^MnJH;gE.)qn+T{Nl  aho'vMY.F]l 5#wKv%)?<jSKܙ_V姇#5~Pb?,qG%M KIV?=u?x+h ^UЃcR`fycTv)iZX y]h$d ?2;FD)jɢGgFx&x nWU3ژ1/2_bgA)~ҁqX)i;.jb8-L<[QMnJDBq6k?\q.SBÐaU~?\{xΝ\:yl>m_`K$b'%(垔~GO[߄ߊf[a6~d<;F~Y/u&ކ3V;l"CԒc` VSQ9~/WԞc%j6רyE\%gwLmy{}Tc¸E)~`XO@ wlԼ>?'վxTc#jbsy#5B K?[@fݫUPSGՔ1<Sg#ԯ9[7O?ߎwW.٫\ !xW[ky O/#I~'_NjWSׯ/?n=痗n~{yi [?0KsvKyef{>sxp3} o~4D6kTƺ86I~'/ ;S?㧿E̥ ;X_|w._Orǯ/׾rgݕ_sYoբ}4j־ o?ǯ/IMKNfCϽx \x,_XR*i\`G %>obIW{ElWHf7plV# ì6 ff}ۏ|ڧiE"{?6~`vvd X0 .1%d ex*{v@MZwYL_~svK1چ_x$`LeB'`jjs;$1.<>A??|}XQ,h> PY5tM DW噐`o>_ZRWin VJ?qfx="*{wǟ̧K}BL'L36S?*0MF\M̹9Uc: j\9m_XC%n(rjmAxyp{hGBT% FVzkV+d$;6ޙsk5uק#>O:O v;~`Ȇ564w0sXx+9&w;w鵎븈`jXh{LˢiIqkq}8ol:M'tS\һpJ*VM4>>٭(w&\\7q#W K*;~K+w2IhZ;Jv߭Ói V<5~N$~5p}H*<ɍ}Z숹"Wv6ąxHɨ?c6#8T,hyfÁaDf9M_Jx\p5T?QUJ7m"љ+y&w$ih)ux% [ǥ.mn/g&7x8#>繇I~GkQhf&q|'(w cNqIkKjp7>~l8~6w)~.df󗇟~џY?(?I~eW$E-a7F\Culn^0݋6}D?oZYXv6Wkb~07o"D]är&*:o_1eq??y{:_G1?}KO`> 0u?'G?{]'r?,մ0ȍwVw[M뺾(EŃck請cmQM>ܸ{߯(7Ye?zg=7e5N&?n:?{-w|?c=-/%EHW8ؾo]^{'U#i?#kE Y{MaC6~9-d%IMB~5ZPm[g~}3Uߤ}K~ao#O_ҴcaˣC -z}ogߙ$jPJG6ύ0:ZTÛ?.up@U&0s+d;pQ)U] Erī9..Cx¼-C?>ot|/C]Uu< ?Cɼ:컸xa(s"CqoΎm wTԂ}TID?9AIAݲ#>Tl)?[y!?M~XY^o9/(DZ=EEmotA ?*XV£W[YKUWemHB//-U1 XZT/?☛*Wֲ΋T_B`^d zp`4ؘ7fmlXO&2~*rsc+~9.B~=5XOY/벽 0wK ?k'1l>A~ IDATO 򋲳sɠ2_;HНo!㬇/,qo-%a;~b,x$ /|}>wT?W?&[\?z?ai*~Sn 5Jk3ΠԨ6RF(alԖрs =zM(g$*kZUTxMp^+QVQdOD-t]w(HM1g"rRˈO bDio!a}ev^CX"WW╨+KƺFV wrb}b5 *y5wQGXed9y r59?q/C򚗵 [|?0GKDpMX$XDa3٪V'媾ZOT}50OAA'Z󹷓 Rs~ i^@]KJYn@7kSnG00b =p&xS2a36^% @ ~ҁQ\Ӥ^'&U(.!?_5 0x?u8iSE!?5mxB~GM ><,?J ϸ17j ߚ?;`M whm\}W|@I 0״ߟXB~iڕ'j̚|59!h8& KMĖXD`j?&[\T檖:aDMTrS*&bf 0Ԝf;\EQ'{Vɤ20򵲸Uk(./d\w(?@s!H[%\X;p;Nj*2~ǧ I alDzJC~a]G5xC ㇷ~G5:|J^?Wg33O^=^EW=\?cįv^_`CA ӧfP-,|tDͱ||R٪7^O_z?<$Ga_)+>5RsԦ)$!0UBOnScF,6 tŝZbAwI%T-۰O7Ւ3^C0tĩ_n^੊KW"do'g0vܙ_8~.xCnI/ŭ-Dߒ&u# Ԯc}{`G;{pcI4yGw{iWQ{?eOsjjѯϩE#0 KjO?/nOgUv\jxM}j>0Ol?zQd|ٶfB I#.PUi11E1TMeiP) )aYnXay+`B~% .S.s[G| Z~8;ُh8 yϵ2UߙyMl8}}$kN$zh_Ziо=O+1D^~6輈߂1~w~>ouAC?K/#k?f jiX'/#3٪sU/'3U7n`Tmj0{'%r+M W@1" 7 *we\AݽWo?`Is]qe48zy#zH_dp%r83~ZFym{~8nT8 ,np)hm٧-jt|>kJ2~о.ԈOya#?eZ8?/t=?[~zSgjP3a)w2Z(g@Mٺ`*Pf$nq@jaL0Gdy+8?F,Er#'5l5~h\r5pU '4{GgHtc$״†} ~-[[oo޾)?<~P״caGl_oOwVvA.YEtsOO>CkjE<ûժҤED{ea&oI%ڇAt"i^_QC]segtV,&X|M̌?_ؾ%Ioo4gR IE|Vz}ogo^yŽCLA ?GAɽk|d{+9ΏFJ3cnm:?ɓalm?1?7?߼}S~YG%}~q[/'v|/_6TK~/M5刿[h{hӻ?jUgƽw~߇jW}~^Qnڿ:n k|+~?Ͽ"~'j{r뾪Gh~ĭ4sWūWSWjTmZo{V>G,]LմK|ES sCO>%C~`}wg#3W_Sԝ7䵉ľ|{6ɭo/u s_{<Դ~Jy C~U>~~anc7wemkbR'ɚK篗88p.wq #\=. 2i~W1"M~9pv':_?/5yg?{ qJ|K7O6bhw8?~ JiR~B0pSB3_YmȤX $1c?ZǛW J C4Hy~ 6gM_7.$ݤICҕ6%!{ixa_wCtc=\_o"a 2L˼vg1-/ҕuO!slcQcq~]sE(L4&JHȯv>7XBDx~(2&1Y,Sl) srI]oTBɼɛ[OAٟ~G|_.t7=?*"hMM}ซ*;LEG%&ѢD!qVAga3s-C[qV7~W{\V '~=fQ2qtF^0k@  5Y ʂ3E~c ίw\ٴcKwNmV.? ]'yXB#wl~nߤ͕-7!=o0%3͔ۤ{5lcNnO!q?W+s?ۆjdoGb]Oۮ4 'c^LA}awm mOjy~~<O5NmJt~K&†w}aL7Z|uUJj`{7X:%.񭋋arP4Yd:;Zv8~~8T#tF|SAA]w)ݽaL ^Ui917x^n7LWah|"uF0yUf] Ӌs3C뛚G N"k % Q8a`rށN<"?1\֣idC׿  v@51P܀Q)?c.>5)&9&.?|[Rx>6x%^_QHKJP`Qf-= nWqMIg80 zQh_Qy~? 0\ jj|×ێ; 5ix58n[/qǼM)FZTs4?|CT CՙS5U1`%3|q(Gsk\B#\w63[1㪀&"~GjPm}>ڷceҏq[(N h,Q O6vO,.I-//Vl^ S~nZ$ޔHzw}B>u,Pw\R&+!Z-R.K\QM "tUmI)Pkt|e* }iC ~^[^BQϹtP0``"5}0w]&M"\)kcMʨqaJոdn\k7;@jmKw~zI!SqLlʨ'q#KΠ&M 9O!`nqu7~|i-B[$]ZE7aFC<1rR˳묺Olon/9uݔ]MWM)N!K~T+ABao8ki  ߑUSe*1 pK! :^+V%Wr]왾HE{ժнupb3x7.$A tG07!؅)O*W%nBZTsYH<ƥbF( w^uTESKҔL Y1'aPb64vfkRw!ho5'+0B+o.Q -G7aKq]d5¯F~&/ pW%ocJ0o"馬)dMr6Q n p/w5\*nbV S~\hٹ__0/Ѿk//q\U _7qxWpVl~(7t!?6oVr[7*F3>  f*b:/8^P]6sFlvj;ˢLms+;SS]9始i}])/o(7-3ŚEE9q !Õ= F\8"%+4_SgYp*=zV^ڟ'jj:\-=\m=Q7U{quޒ>={~Կܸ?ۓWŏ䦦MmfƨmGAɏu[:TKmxY l_|/3oPܺ>9Fuo=Kcs믟!s{Qnhl;fVynsG^ECQeuWjq:VMG,.ng׋~'ߠeɫ(GGM5fr޾SwWsqrNWggE64٧trOG-u?-\*/U$xVj 79x^EVU٭ᙔiB,lt)Y.[. Yc6⧟YRgBd,+E`S QgEOտ .4:(2Co9B}]Z~CvpkXggv!U¹)7Tgq͋:q!Mq6,mѴmqPu\ K| ? O[5OaRQz0QZD8>[~}7Ա>,bW3=< 0z`CYk #UZu 4OXy#f .A ~!9BiqD7yeqeZ]'H&~h?6xqp$l K0UL[Ju>cy.#35_5ďkO3>_sS#.x!ҵQ&4厦],xo5.lƷ٠)/n(ݸd~g.3黴B֩Q3cK:LViĎd>dyZ1!ZU*-"Ʋ:ovCV?kKj}qv;6_펿mMnބɁAF0O?@g2\n1# rT0 >ʷ0uѦz&fï=?厶XE px񋫣8~?ږ<>ξY6-|6h1~yU~sv]yrzz5UklDkTs_X*C5ts.T~Q6WKwg,芚y2gwR8񫾾WK%M~ns?% p뉯ԏ{nwį~&mHcqL I "<|?Lz0!v~..Jݔ߬~Q>jʑϲImuiMj j w~8->aӨOp0pao>o?<]p⤴O:oQSS\^SF\ LjQB:1"2»~+b`ոFλ lVSs(Zk v LzgڪU^sjZgt(Zu1wŨuY bwfѿ(#JdoV_x~F4=^UևbymMS$zos5wƿuݫUn?{ ժ^m-/.դr۶u}`=jΣj{~"~G{z/lF6Zzۇ݃7_]}FmS6Cp?!c]w3kf#,dZ2c]2p$jT~b"\}J~Xs{ٟ}۾Zٴo8 C~\"ݑcqX~ įk#N_cOy}V؏}w6g;{5?~%uWlIV|mX}GZ'R|ǀ}YGvk*`'QYuq>on۾_SK燚NM6W5U6B0vE}a: DŽ].)/B! A!?;a]&Nw7|fTSWjy!l_!57G_hE\#?tű8ȾA~7O9<pV#P_5 A%SZƣOTAx~x #W0diw+rN0}KӒ4̩)~q-L8828^8㕱A<^]!vb?s]> Vb[3qTGԅEeʞdY5 {~IQq &l"{̭qg?}۾ewri3jHxk_p{A93BźXi=X"_]h5p[WRzn?h}`ߵ<-w7N?ZJ7_Σ%Aza] SLaWqG@耿͋QOT ReY~^(vb/ <컜3}w0}H- } j6R8b'•"p*tFPܪb+ 5vb?'֩2]U̐8aBݥZN&m$wWvѮh ?"];Uo,Ӿ#PV-/ؒ])*h3-< "~IZ3e JuTO3~Ъоm.[εn?3i G_W7sq?F: #7I!t~`JQ#~,.Z_ky8\FF)Ie*o7} !F%3;-?I8 7qR[lզx\SsRc x/ռ?@Y5) Ch_>Sԛgk'.ų :Sqv:c(0iyٟcjej՗U7{4"ǏE,bϲB<Ίc>3F~CgZVG/ q/Xqk?_`߶o?mNLpMԔp$QM*U&.IWRTjUf s >R7]5WwgWSղP={~\~gN/GSSSC 1kk #[ϿjOOy>WiIA.nM?jR>}TRlb:BQ,/’Q_M]Ilj oo+˼_4ݿػo_!+ݩ%ާ0z8EwTt?I;-_xh|vwsNGJ2O)ʶOp oIHp«˯EZ͐V77b?Ys3h!$}c~#4n*nB?W+;^~)zOqC>G )~7u{;Kп@~7n Xկ\]<oYpY)؃.׹t)"^:zE],OүѼ{БP/6=w|@~ٽجu9`} g%eB3\B~n'+#k [; `;q=>] &)2EpM`77>r{`V}xkLJ{8)f8Ri>Eϯ п@~YNI](il8~rްnB=+:pPZp8H/\6F~4o> ɹ| ?8@J-s{-p C=|73YuLe7sms0y,qx[ƃImߟ34]3Hw g12*HKIDATSS4d?>`3|kvZ8;!3m;KOieU_%A~y'D,lF3VSß/.<˔#0Lyo| hL}" k΢unձ}N:3}s__/oO\.s7oW1<|j53xQҳTK&@/V+S^3lJ%2M<5z' 3uzQ碒SG* Y;5m$-6Wy7q'5}ez| q#F)L8 ;Ў9!ǰB;kCa~~vr^4V8e<{o|&)d̈́hS7IپOe^焿<3'> O1Ã}PF/o4x39jbsCB2hؐ*j 4̈́{_ ($D-; O>>G)yoݷ#L.s1hrKK=-òn+\zĽ%g@ah`6}YN{^kk]t6d*p?;y~e>g,>r#~yt]뽙e~32ٝ3޴ u-v+"1pGCl݌oJW*ػ? W"a/{~K LHU}y/e9gx_^W J#ӱ/"_H'LNg8o, ċSS&rl\͜KVV88yqWn޴ $C?xãޜغ ᫖Clݟa4\2 Ք_hDΙt|l(#O>ɸ|lꟉCg2YP~SuMظظ{!/pln.[9+ l7ԇغr38v8}byo6~Oc#onCÃqm|'{oCk¿/Mkx=<O468vϯɛߨKWwxoy>) w{N?|2NLsfO'ķoV}7LzܔpC=ؽCT;ȷϾVC+D֩'|qȿ2׏Ç _^Cc(Omߴcެ*Ͻ@xmhN*xHw迡!ޡPmw=|sy߭ G黕51KNJw-׽7s޾_[]>|a| |oFc8oR}J\ |$1ǜG}"ߤ~mGuyQyOVwxM@܆ׯJ5@iwD)cTP{߇*m4S5߄=zsT=^ƩuC%T_T;\OPj^? _^V}^?'>=$}B?Z=%(xJ_Y;R^OqFeܓsQ~e?xR{cs)ɭkbR0U~Vw^?7hFoM< VyqQ,.VitxΔlU+]."zzzj칋UrMu?5md'mtԜ帓(ܡco |0>e>‘u1Pցwt2P*u*;QʁS& '߬c͛;!@qk5 =yc]^ m`iQ_)m++9\cQoK-"O^x.B#yptrƼR[ekj|~]Ot9o3)ya^nQ90 0P"ޞ\d`4!MwHL"DК|D ߑcQ.1#K#?個O0v('5G [?G?J!& AEA?ϳQ΢a 5 <̄4Ϧ&CYWJn2 fL__4tV_CAtm:x@F}d=WsrG l5Iö^?j9Sfh3<i[د:5-68uI׹I<Ǡ.:cG04Ӕ'pjuC S%y$Ӽ<5˱5M0O!1pBlqL0skgx$/xM.{&s5)֟878(R/ 2do(,f<6^1 =ԏ L x{.rju#&G-UNk,c f* @ax)޸ 1+0ZA\F<r*@CK/~^VYyE;ȏشEd#ijq`QTъ΂օ "v̴y bDӴb9'Z`#v1ī1.\ԠUO[*R1DriP|HTH*_l1ȼ|A+2b+wmUp[ n-I$Scd9g7BH#re&Hv`ۮZ&.F ɠߖbaiF~m Uhbs3_xEśNxIdyڡ}v8 Qy^KZe8y^Vz<b'{[LYԻBYfL)e&"KЀzS'?$Ҩšcwmh~&iY[";߿_ {!Al[l/?qX~;db4('9rpbZkE}=GcsSH4I`$ q *3FojGN |pF)c\՘bxP|@oo㘆,:i:s>Bnk8wȠN .|~ C8M0R`Wma<&K:!~tzLu Ѭ+({9Эug/3GmYf.W8)F5_Ҋ)W:xj$3.1@N$N}Bn-1T"#e;q.9NϽ'b.i=A e+EEN͸꽙e:ǁ #c^Y3Y 9B;LS1[!-Dr,"_˧dU'Hʡ8K~P 4d<ud7Nce*_L>F{GQ• fx{.̙nb,xoJa"x]xJex𩒔Q:k-:R*8'iM%ZL<߄.}1W^>Ge[T&"v-ARٲs/<19HfEU㤟fпT~"mii;^YmD Қfݸo9ܕdY43 ,#{U\Gy3r; +Oxn-9}aMf9N[ /p .{;41:%Ev\~F|\ƪ}cu_YoR͒72買^ⲣDo%#=U|-#sɨ$%MS):QoOELJ"(RqI|(<#P _ЏS|ϵоqP+GEPǐ: ??:I91%gHN;LeE]yGcl,rs\Guꔏb_O|oOy,:oп3yν}8w~^3_=W͢7*o9~sOÍ-ۗ1~3oT s~Ƿ{o ?{Û#om| y {zo>7?C`p_#+|' ?J1$| ߗ#~"ߑ77 } r:~F ?c>װd?~__=W͗r|9_/ǯ_=.UIENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/gigablitz.png0000664000175000017500000001774612412501752021435 0ustar brunobrunoPNG  IHDRh,PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@ pHYs]EIDATx]jWjV ʫ^h5 ?COCC]ZԜAqZHg+3yq32*n1s hY i2>>%t%f.q</g{G_\%t4IN֟|XGӅGx^}Zd/shx09Z/,4_a:W1k {I N(pz95"M/ tqy _ V ^&].DQ.Sd8!6Έw$Q͋u;s;$ݸ-*w),mtn; Q*WfDxj2Ԡt: At@P造=A z@z@*z@*z@*u@]9UEir'teҌIKؒ%iKKHJ4ɤGeR#H \ H)A R&NI%oΆC@J޳4jup/7PxsJ%/׫gw%Rw*0"=MS~Dc?әd{=aɞNZi + LK|A;\2Ɂv$Ʒ-VX:Kb,AmVY2K{7n@vvA[aila]vv!S@ՂnO`zO A'P0A' zO`z>O `z>3n@/>_@P!;1 *Xf/T/@L" NThfnlʒܼ8#U#*,?|^6QawVɹ-,# Rq|8RT?W[KͰN4޲%* {]Tځ-n5>,Wm#z!Ժci<(uBmJ'Gq%BZp3M .kaU2psxg}{} Pr5A< )ڍr_У/w+  kN 7d\h=%*;RN-gNm\W/&"/" u!BKv/ #,]E $K K J-`)pP)pX)pP)8u@)K"L w4QGD׻ZD"=9b@Mhs;#vwxdgť4ŎmH>LG L 4@+Ӣreut JZ>Y2:KYyXSD)",s@A9!K\!hq?-t񇠷.?}Џ!t-. 9`A?u{D]lc"j:ۘ2&Bh`a4C0YB@V1 lb"61W|ϼeĦeĸkʄ/юa;ڈc)@/c&vLSYR磞Z]pmM= .Z}"?,`2>|nB<\]R/:OxGl`B$JCчG*1*s#A6N⽉[kI? G^8<86Dۉ}$L;1L;1P ǔɵ$N 4X&Xi&XjHl5@ I:y$icAH[JJKxIHHIxK\tIGp}SS ܯvv{Ov|SciC:W1Ё @s`~2ؿ!_p`Yxܟ_=CTM(`"6GX1Sh O!,O!,O!0"pSO$\rO!&8)GB^} !x)[ (hlh Nɡ&8jS@hH>usF֥xKJIHD\ . {9QOD0wOCYTF'8bb{kau nX[C0+`i `,!,XZC(+qY-;kh XX+젎da ;. /zШ qq; +=Pq|Jq\qH!b{zU+\g9/zp/Cھ{/ //,y(O ^^m(/G[ޝ.&%/|~=yZw߭8֮-AjVVKϲ y k81[͸`绱 Vz3B]<̤*DSLM `f1]F7C%?"X뻷-x\1UO$yVnm7ëeR6g‡ijz$ox}FG_}⚠Tyua>JꕁJ;0ڷv}7T]zץT26-+;úpXz~l0D9gܲ){$_,Kf/ _?I`) ~CXg|q)1 4=x@4 @=`BȮ솨(\Y)_p;#~w,7 t.[z‡N&\:sP>$(R4c!NiiKB h*)J߿}F_N~J7a 77 ~͆G1(nΥJ3 툵%HNL0V}h!,-8 ȷ~<;PVPzL}.+hLIT Ye v!dWCvCn;8c:YʠC2Tb` 3.Lq@y8x^C {$c##ۻN"ODQ”#tϓ#,y2"OF#TUDJ%lJSfcLÇ.wD~ Bp&(ld92A *(jRС%>2KZ:9urLS&g]Րb p~D;HD`ސ,kP3,o}~u8eɏ:y11 !-g p Ϝ!ivIn(=qx a4vǣhx > gH7?P"Q/_. R>DɄz7xzoB(K5:}bQ<{˹dQF$U/qIQqx^}k"OPqiCC 3lO(2KXa$Y`Su*Y ;hdC5H  A{&A R4Ipm^$Zo RWh [ޑqw踰 HWw$FPck;tv뀴zЭޜAad=0Î::-<{Rc{0'=Az<_y聿 $w=AzF9r@:0pP: Et@ ߉J'$QNH~'*9NDUr8!y*;=UZA p0'K sp@`0'=Az,^YHxd: TPt@ 602u2 aA #ChP'6,Yd db Ь KgxDOG9xDOG9\ԣ: bwCk"iڅhZvCapPF;Tp bKDpSAooM<_%Xt/xP+F:Q?% fx'j\>S x7ϟS|y?ϏS|x3ϝPS\yp5v5/J﻾<]/q}s\pL`~ug.I4}n!Ai@4N465T&?;h B0ӄ L5@C` 4C a)} ;8= ]$.)@~`ڀ@KD. !I?7orY#fD3 ^f)Mc F5:5%5kH2j v5$5$*֐ n!,xYCIe5$4BXbhz@ : zp(0@ Pr= G> ,:nz|YMLWoN\:r\t^ A%kF'uL           q;wy?'\؟?tb5~܏ѯ>' @6zxڿ>G#> SR3F(%`J8B1zV hQsPWt|Uw(P=kZ^@)IENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/menu_fonts.png0000664000175000017500000000526512412501752021627 0ustar brunobrunoPNG  IHDRpdPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYs]EIDATh޵[M*>%ZE K΂{p9AމrqOO-zLQT/?{L/3QnEy@@-d҉A^M=NpD HfOJHJ"(EfxZZd\׹\2gtrfj!Nxybߞo}IsԤfV|!y"x_ϒfqF^)ib_oSv1W_:P{`|QwY,__z[*(3ϯ'X1F3u.!fؕ[VvX 'Q-Y`1ϴ@S\|hS-\mSQCΐ*gX`tB|~;q`d6MD\?c,<Ez @@s7' nsuz@( 6N 7|*D8t(MRY _S~xfRm_0 z*d|C' i 8z⁢J_}mE-%_)3<Lo0C'n߻/v_D%I"=WAei4DcAgvb([U Az {%ƨ t>ԿWTJN/pk0Cro&cyJpOELwH*}}m9 'tss30X}0DFaeΙ\e*-K,%Ta1ŒS_-V=XѿU@Oޝ1D:Xg eH( j2ab%5-PA@Y׊=@6zBGڗХt"QNe%R`!d Pp-L(=Qa=PJݸdw}ݮU @[P{ϷjKJPN.= `,Y65ok K۴fiYB*!> K@~x!cyM݊' j% _ t}c qUB{ҟ*.~~ 7؉C'O鲄GK#/ޏ .)%w\޺a(%ÐB-A $V߂f͜.WQfGI .~C~MfRJXOOl%Է(,Kc:Ƀ@% [|IENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/paddles_1.png0000664000175000017500000001363312412501752021304 0ustar brunobrunoPNG  IHDRbZPLTE@+~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ]IDATx]jIK 9d!'?}Z F !,#%Z #-dX~( 66®ђw5#F#OwOUMOhz㮝?kT^:1 $<8Z"w 3 $?#>&|9 9G Oh?> ~r>4|&(oxP1~$7~, vQ plG?O> 4c "(>$|Rӝ1~3s$0|D>w>$|RS" vxۍ1BY?O>&[| |>i9(qO[0Q|9sc> 4clc\=[/G |^[G䃂Co'8>q""|9N0C+|P|H gpz·Y? _+YG䃂Co'8>Ó N yxp@-Er9g`> 4cA.fQ bs$?̧f > TTA\T˜R z!I-TFO·_O:1|֋AԾ"<ئB|9“ZVӶ߀O*q|dz9wZ#/SI‡߄O|6}[RުՎ_t:X H q_X@>9?h8ާd|@W/'a>$׳2pR|Eyp>F|@J>ߤ)_~$^ӯI~RfeZ,ǯ?^d cO?R|>[+Oeq>OO-pd*>z|$r>~3U|Hu?Sd{RZ>je딴G5S'G)g{l<icO F 3">-ߢԭ;Q>{RZ-pd;%6EyT 'Cg[&/!ԹD?(c;E=G"#AO_ۂ`0V ǯ?^d cOM?R|>?w)o7I|*>z|$r>T!sOG?  ~'a B"H<8#|> |%'aP!{/RT~M6_~{)U|>~a"H<8#|> |5T!S'Ot1*A~)ǯ?^d cOb5U|Hu\{>}LO\B\3V rD>_ɧv*~>:|/iɓ7ox?S/W^o\B\V/2D΃1'W9J?R|>ZˋRRzU&_R?F.bG%ǯ?^dPD΃)9C>s> |5SO_&WW_۾e"?g8v{}}s^\_o#~;[l}k'gMlRGyVwf>$y h@P?f7j>I@Cytx+ ? ^hcӬLrX|}vAo3Ѐ+?Mo|cnYPDD~@bpzX41qTX|8D[iEL4` EF ~pP.4"b|&0{âYMOR|,>P.4"b|&0{âYMF ~pI@Cy^ h@P?f7j>I@Cy^ h@P?f7j>I@Cy^ @P?f7j>I@Cy^ h@P?f7Ϳ\QcvAo3Ѐ+ ?.Mo|c?~|rh@c@=,4$y>3Є!P?f7:~dZ??| ^?>M{bcӬLvX|#ND2~|0wraQǬY쾱@Gޟz?>9dL4a eL~߸CM*|,>Q<63 3`3cπ͌=63 3`3?~|rh@˰VT1qTX|#ϗFO{˜~pCƏ4~@^~@=,47hQ'iIbߔH>0mc? O~Im?Qy>3Є!P?f7:~dZ??|!g? q/C ?Uou~pCƏ4~@^~@=,47hQ'i& Ľ 1zXT1i&o,>)K=Z5mt?I7dy WkbqzB\8~@=,V')>h+`txP^wNez.:_*Vz~ygUuuշ~s\ON~cppܝ/.*>-l|\uշ~$̮/՗')kғ'zGlw]EOyBUb]Y,@ О+o^_Ԇxu|:9&$B_yvx|몟YWۃZFҞu 0T<˖tf=YT< H,@`׿HXy8~]ퟴKD! 5C31+~^N %Gp: u.Z?5kw㼭CLJ0o??e z! -!L+k_YVCX蜰s&@ׇ0!Z0?zd-:?IC ,@ 0| u^;_W'- ma29?ɺ_W( hSYC\aX,@ N@?CY,@`v0G| 3J Zׇ0/QY)e? gf~|h y? 0 R~ 0C]P~ dZ 7YW0~A۱ٳr5wo)h~AgsT? f>\P_3 @,@`%CG| 3J zt@y dm>_jǗNry`9ɝ_Y_/AY,@PQxdY_/AY,@ Q y7 dY,EC c*קq}/z·OoIENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/right_panel.png0000664000175000017500000004266512412501752021753 0ustar brunobrunoPNG  IHDR}ϔPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYsBIDATxnX/wg`t_Eoڀw1Op(+ï wL'H-J=%R=D E&5cQGpj-Rv}N2XUkq\J2`0v7t.yqOјi}c Gv=$A.)5yC*S" +,+ۅRcX0"͐!HX;t02L l9$U1?J=?b e(j5Z!oL49LK츊ݺZ]ev(NāթcS'9P,a^Æ5s\_txDA^W Ղ ȋޱ_ kp0%|NC*a(>v}tk]lPUrK:gӊ z+HqlK h4ePգq@I~p+M̀8w/8qQԝ@3ɕUVtF>oeЫbsRa(U 4# dB: Qu7ȨfXe90Kp0 P.W{b5bJ1cu1o汐s/7}9"LLvG2M@xIÌY}ϲJ0զGpyvV,r9ՂGکG<ޱ ƟA๤jԨ,Pvդ]$zh&'p3mžlxH)QE?T>L^4eGDD,3C(;$[*Ru’+=Rm pA!!Vd*G#SF Gj$|aJ* -C]x !Gᓑ&8Uj +V [TQMI*!F6o*8Ђ3`2U`#W $Um9QNv1פFdT5A#2DJ*lpJ<X(x1T@P-0ʂQ4cR*pt: ?JJM R)q0tFli+07@XH#gM'&p>_3s@B봟nEf:\ҠRzA g& xп3eN\0TU-|E+l@#YhY6pc6еVQ@s$% VAZADJ2@ r@QTHujGD@QB Yb:@*@*X@F3 1Q4{wwЧ$iaX l`7&:e2YK=/CqRm ʻ彽Vjflk]{f&m8 _P]S؉Pc3qV >p|rX2s_TyL_k{*ptd.c 7u2]՚ͺWܔff N˳ y Xik#ltU}ѹG8byFmV U|r5^.ph66<~}q4SǙsyig<Øa=ul>WA!E}%~{G P#u0Gk&[sU=8_\i "Tgkhvo`,:GkHGJ(=?bL(ޑ:>9}[t.ߍy?5^ZTZYstem  T~r!%mVxGGO>_a_I,OAO=}GE+o咵h*҂C Aɽpr.t/"H,n8]Јm#xRq8}H0 ړzl|F+>:Q?,)z#^rK,oJ~8pkx芨X"I-1Z*T <"rvے\-v*KE.uXY͐% 5< x*]w".tk͵s+eM~ tM B|  4>|l/%V=q|ҁO:@q>0(n k焥txd0'|Q}X:o̰=4>oK:>|Cӥ2 RK>0]f >>>'p͔$uƗTPS2t| 87&X[p~'EmTXum$@Tm4t w]t@.][ #Jkuwr`QaV":pnt6":И3޳|O~'7{Ӂ(| ܠAޜ-.Xv :o;FuQNi0ݨo+D>{+֋t w[IErX׎%J|GXAN%w@!_70 r"pHkDkgbW-RrXdPlF[sU QvUBZe8KB.#, mk|l]O)J@\82eIW "&b-.&`\BCK:קh<ף|Ff*L$ިؒ@-ZցPlaYN-ֈyZ)" Fe{5s^FkK^/S0/+ ~ty"hHA|*x`Hbq2SD-\t5Rj)4a6j8@k*gBޠquNbeB_\QEu8KF# LwU; d*!vwSgfF=4瞧,-f;Yf2RC׻Ll`@1X W9 Z]gY'f2N: to{nxd;AAE>!8Mn^3iN DsNg2^gbϏE7f>0ٮhPmXJ9(OF5ILhgNv}{A趗484vdMؓ] }mȣxN1MctrzLx7-c`] ɸ)fvMB3Ba4|4+nD^VvBIMiRȂiC Yd`7̘o軒?|R3$ܤE+ڑ%DF# P Lyfʼn4&rՠa(^7\\T^YEf1Fd~!ȋؼD#Ldϝ ̡^vifţY9p@lW ܦ%ZdJ_0-6a<qkiE&;Am8r.j>IQfh6D A^/o-F}qhi%ɘ/ZlV ~|,iD(kb) ˷(bE5@unY/7f6r"33$kƇVWR|QZR@0ĭ4iK+I@km~,m|n/"__?QZ@ ?/Qet PiWQ{PX@JM-EQ@_ƃ~I7&uWŸ"7110oRÅsM*~׶9~sJ׫gUQG˼hpU )C ;"֩TŎt]akH;goRHY~90\>oom}{hK<}v1;B|^6|]#m4a=Ʊov:׷~m`|ϱ|c ɩoq΁"þojOAXxZB HC츎L\~Z;èW^8iP횲گ+dQ9r6VgN @.1m2M4.:*7Jz9eA@kaZ dtIzr25ޡZձfZ/@ m*s{޼bK*;r Syƛo;Ǒ9pcNfvbu45^KcVlʜB8y}= (Ep\TQr"7qQƖ6g CG+슊)Aqq T3nF2͌K}=%V!rPL1ޚWxtׁsm9!oa3d^G'z@q(~Cg˱tθ|hZ'iy4W0 p@t*WgkT n oURO;p5gWdbR-k*C\uZ2uY;7p mcÛթ8,&y4MQ`ACi0pBOEʠ+ȁÀ}Dw'b\d$@,ʕrGVQIj2 [3A6B_6:u^<4j3#kmyw)!@*Iu?ˤo PǗ׌e |@C>v,D9w(JɩfC G\t&W9DhY8 E VC pZ:a`X h{ Ɣ9J > @@ /UX!`l` RDDt`ߦz!+8\UC> ~wTcKtJZ44W ic5Ӵi$K9V$C xlz6A@,yMrD0hD,1!xEpS-<%!,#{KyW ol >tJHpNYly1%Έ 4eC <9%zߕ\P+~qh(^I8aN5^<,zdId|u ߷d`bCl;,GY veWq.U Dп#_r,wD^ 6A@=N0n@lp>]f?܄'pA Fma.)Re*Ywp|w#tFN&& O!U DCrr9a =Etu^–FR_A p  FL0Iz^,D+WVT~/m  $`E0Revq~+γX%:}aZ*{zn*9@kssopISC `Xߑ9k3$?Pd%1N26>tۡ"0(G.HɛD썹2f%|co.^qH$zxܕ#7GҚK)a22%R"X;J}C"pTAP\}ދJIiF0EP {h8ѣVq?t2FYsj80;8ζ~!wԁɿ#tB AC7=b_wCI|5}n..DGFV̳29Aodst#R1=tBLb$ɿ**lz^IL?~}Z⾑ e}xO$ATds8A6h]: U bb Elے*0t%wqÁ(WgS"@ hlrI9]} Mn`Mc^CHw7k *8r,:TL+YT%wmŰf2ѥߣ.t@]aOFa*2v^q-%fA"&q`Kgjۈ$`E7Q&wͿٺD%'9]^W)xˉWr@cť7@j uo5UW@j_ 7i\HKЌoRrK|[$Y& @~_L92xmt#o{|*LVmnF9{}Zz87Ӕf_WX W,D UE~[~_:p{$H:8Pޟ,]Au`:f"qJԁϑM RE߭{;Ȉ۬f!M\v3pxu1hQfkޙ~0>,jJ{j-N q4dnׁJD/Y߾gg2^{K2Y3{[{DyxWwp֒7Elx"p!哹b&Bst[w d@nP́O:I>'^{5]n1쥷TKo-?b$LBFׁN]rEB"rT,t;>u>屋@QB,Xv<D![%ijx|r'+|N-Y,& WwE+xG*-pت']^ǍVЭukGvѰn,d7Xv !18ԒD:o2j `0۹o@Qp8xz"<9˞ J^~-0x6yә؊Fi̻,D<۳,/nj_a-"bl 2Ej'%*Q>N:}kn jo$&>5*nGX  הf]E9<:y8gFizNâ\Z5i]a:UG_}|ǯ6#z8MtbT)Po[GvwάRG"4w͵Nl@fk?lJ/|Ϭ?]~gPFQbG5Ƽ;tjwvs~:u/_=n=7_qݟҿN+A~gF_g?<ʍ=(fӯ@ӿsbT?M(靟j;F#0~?qf4u…~5m@_?~u%#˟e 6oA4ߐ/:hrFi?|Ug;P`;8خV+UWp"bvy*ן߾[hXI?Ǹ?ptv; ^)D<>֟/+) >OHz}~ы u5Zm9? J>0`#G?8x9sZG|S}'t2zz":mxwqR_&c`:#*%0/їTulMxZ/(K X6C]#j執7XSU+[}gEa^8vșADž-tHKv<.׬Nbx\xn(y XX (0N R:,/Eդ#Ƥ^^'i@$^QȁNqzxVY0xV,:q+N)Jq*r/:6grZZԠOYx6sa(S$b9\& N2q@. :)Xq8SBx#ڭG*^L9"h@=\|%$ԁ"@8B:vCZ5:N[O>n8u~-FCd  /}ql]н*7 P^ݺSBzBDtqQ]L@a{MC _0%$Xt*DuyI ub DAT-y\`\D%4Hp\P 1㳳39pZJ/4@5C\YqE^A&ň2G:^L"ЗZ;Jxw t 꼼r*K:IЁ`(&R?q }bԔ|p\:< hgVp:V^8r3cFmp88Zq`ug ]9sԁ))@tXb^<CKZˑ^g",tխ_ , osEtRyYt7,\ ac/(dro~!9Ք&  2Vw4Uhn37 $(~TA:\^key>oǂdNC\8³nL]lM{;%(o{K> 55,݉w/ şM_]cKvlJ& _Sd{0w=oʐi /zw ,dM*_:IvGȡ\pMQdNT\7nRڔrs:@p}a'mYVdɞaKI_\ WA`?ͶHdS3\Y$Mb&婤0S TȦ`/?؟^@$0C'1i#Ѧ4< @&3 #N# pY/8i&;tIQ 4|87K ~鲚\&>b7\ *6isjP MDP42:4l@0e`e Ȑ|@pE!Xjgp )t-e9c ]ZLu棅-9XdeK ]4]<yUc1Af/c1Fnybe$]ʎVr3hRz<¯fk>=koLwsr9 ]wY/ve\zJ&ۆAĸO,Ω՛AV 2n5S}uڐ ٙfn  ^VJ=L+k5`keNmr T`jI Cx勋X||N5yC-@6GZ{@{<}rr 'O1=l)d^atK'D}O>'D}IENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/head_animation.png0000664000175000017500000002015312412501752022403 0ustar brunobrunoPNG  IHDR:SPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYsDIDATx]QkH?ٿJA^*W%(]J}Q & FP7^:6xi %P_Q$<^KT 9Gc;mo:Imhy晙sfkl䴏f{g=>%eJߢ ܡm* EJo ?ݣK}E#K<೔ΊEtlӥ6όa]z/==R2.]׀ǦuՑ]z*>c| ~w{sI,e4Q .UGWeY8p1U̦r]`J=3ᾦIom3(HoDtp[:2%c"s-Lxqj{u;x, @ -aco9sEF/KgYpt\w߮0Wn .n5XՂ)+UBwYtgbnJ5& %4w?5 X-Aw* T]*P0*`? ACVj:A XRp,zvH󘲺cdEUdCx ɋq4T}p]sԝ[,E(7;7XcU =.* $tV 0_0l.άC+=f@V`"1l۞ d/yYi GPA979=94R -L?rsd?1py%Y-`u4dyZQJttvAތ2~]| [~c5V0q$Ukufrf8jA3U#9U lQPqKA{8Y` R#B9G q^:+̊<ܞJƶ~"d17|seE\ȶC8RWG0giY#+kap.'[P/{~޿-ZE6ҌK _:/qY ,c`E ~egE*/#(@ӍS|4 /u7pv҄0ro0-*_∦,PA4=ͳZ/tQXÙ>:Ge:0/\UiNz53Jj|`=/×jPx޿-Öx69=9\ؽ0l Z_ dM^vO~:?[arTgӌ 8i>881@c-peJ %EG$Мֹ,@E[9C8 @foW8!u8;@ 6/^zMW-J<۟)`܇P_Fa\hAYk>k'gAAP{9콬#.8ރoA5DxV NMa` v']Xcmm`_O<>?hyN/>]L,cB٪bj*pWtxUC/Υ))a EO0a%5\*0. RԖ  Ȟ1uD ZP\2 C Ed@=xk=30|jN d+hDMPpclD@1jT.< z xcdzqrA*Ԟ"0`7}l5Xe2{cٻj:-b|Ԛj #c`MYCmOiJsW&Gǚit G#ɤUt B Wxh.Am eh>oFq_ebޫG ׍8(x-3 *p]wXcmm/Rsql&"+\Z*v%ܡ+; nWP2d0F152=b*Ө ,Pp=emhoZ jɁpJ@`S *AAC5_))9n1F^`FlC`_لC]ubR)ZBF <>:ek􋌲Fv <|9}r6b+ $޿-Õuޕ"~j x;ø_^ֹ.*8dXXy铁CҊЇD9 z mc&4-/`{Jۻcrdq(ac q1ySPVZ1ٔV"ei ϐEi2UWQD%t[u_φ _o}.2hgo!4Bfǯ7Xc[[N3.Wy -i UE-Yd#+dzSc]*8KtzՆ[pDžDnM ȼT1 m4vɣiqSA9(I\h&1ļk>3(?#΃ݛ(`2\*|w2 S^i uA+ $(%ori?Xcb/{DO z=e„{q=/thi>A%XBpvnES1 2MҮZ/=c QyzZ8c{Cƌ8b|KjZάTwh#ˍ5y7_1PV5<Q]sx]b݄a?&|R!+ N~3|6 ~c5tAGU{T@f>3`Q>uDtĝٹa6 ciLI-WC.Zgg Mo?!"2 ðyaCAqeA1(] A)yQ rZT ' qC`(ef?4r"z%=G zގO s:%w>??^??,-$!OeFBH㟗ڴߟN|1d@5(wCAzKP|Gir/[{ PYz\\B,OCsu:X89=MKSq_!eWpfn9JhWO3;pE#٫\w'fq@l 5~v 4X_&\f|^𤫾l#̪!01Sۤ]a>o(_`mG†ڷ %<W B{YGpԣ#h#^ez%g!ۄagQ8+vXc7gډAUEAwԯ(-C%ljGQ~VE)SQN" 陟=Pr s1I}I J4`M_={71۠r,]>ˢoACZ9pqS0 }.,|,|БjSx,砰11(u o O**.mms}|U)q~nWOJգօv?qv_Wǂ )J6g(ٻE[\y~\?W,c\?ƴċHu{e2^n5Xc{Gkʁ 328~ocv΀rT4M-a)p +6 ̕mB,&m?ofa4GWA{*; 3m#A)䒩gs9,M&軽{6l~{CoT2>_mHq Y0[eU|xT/xS{R$~.\R>\e9&]/wLa^  :ʶ'?vc3U(eN xSfW2`Ƽ oaz?ĝە~CK^O cb;vu "~cS\iKF0n]Ɔcp@ 2}ʥH)~,"8U7dكAT܃lՃMV=`<;M f؄ڙDqLUu|F{0`Xl#Q7S{jhϢ*ʾ0m zp {y܂4( B_  >_52萮KFkݭkocۓQM {8M+Z:õ"|_l4c%<(Gr!(7 i1_R2/~~ENT(8+S6+-(f?1 4ސEVS6I6 %]ڧpETB X5 %vj7it>~ǥsn(ȫ}]ҦcW5&j@؈֞b+X2_n`P hxªet,w>"*fЫkd)y,)zZ+lW+Ph# fkp;4r/3-8ũO̤A/dNktPzۜl('MkI.ϫ>[ ? #`LK qPK5tLmSk_#Ug@-VX{6F +A@8pk Jgr2h%A`yWX2-7+UWFq ]@\A [ϢudϟC_72(_@:݊+ ~w$Rކh5dlSW>ɰNqMfjsN~{vp-Y6 i+G?-h姅ycx@/((p)a;{VY?%iOuӴsDcQ!MGkՃ{C϶*bZXi&f@,iPbu tACЈi|(Ǎ-VfAL*L5Y=bT$=? Jв)} ~8HT\7Dā+Ե݂29y͠N)TGlX1^IENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/font_score.png0000664000175000017500000000423312412501752021605 0ustar brunobrunoPNG  IHDR/P9PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& pHYstIDAThYK 1+o)X1 }$UeZM~q񟏜+Eijˍm%Գ~',6'>>*"\Lue|08Z ;Kfk/^]zB?=~}^|T%PN _L,ZSa1 E^ s+Ǖ彯ӫ5_ys_,ZfK$ \_ X;"9$|12p>zH|1 luQOAB/uܳ0n/O&N(({ qW~<ڙd^˯^7⒕bz|e]/ Czl`e`=GVS;cDԽ8ee4pw6X3O;zZ|XB^ue bJ/t yCq9@63? Ax _GuD8#_A ;rk^ xS*$tq);ur1uM \!Iτ<yxq:oxbD3~A^'놯z[yS)?_IUM7^\ٴގ\6DgD 0s\i-~7oUUf?FpV'kE]\:ӞAF}?%èk,ƱG|=?n~3-pᓅaIENDB`tecnoballz-0.93.1/src/TecnoballZ/hires/all_sprites.png0000664000175000017500000044473112412501752022000 0ustar brunobrunoPNG  IHDRLvPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ& IDATx콏SS׺?k آ0(FCOG=L=1ux60zjr C⹽E_52(M5b3'|u& }ڿ{B $O-$볞V?<ϳzCniti[S3t6Ku27|jUqaPz߻kgž^tv^f瑃-S5{K+kN[(wޥks-ܽkxdijJl:].c?5ꗬZ?PR TVR9p ),TOZp[Nv.`=m}D@;3}ع?3}êU`fgf"(" Hmj)RY: ΰ͵Ђ- |t?}1\N}D@Wf7d*&3AVIE Vn>C# p .O o1"3\5>Hժ ܿ$#cFQNcEPhEZwy#Q&O;[, 0i^@0!p A?@ ?H!@Of7Ć.(0Zq;8hHEl̏+N B5bdc`fC?43}1 !T&}bOAFIa!0_Af`?QLo"Ţxkg& I%,B y7t?ΖG N>X$S%VzEhL&o#= Hy/-"#KO@3͚r3'bqZ,,&$ F>`67s Pr:Qˌuiy]=R1_38سTԝ\'N瀓=_h`lvXqq 8NBKoZsrʑ$Lz/>T3UH}3_*7j0D ȺDC專+GWDw#r\TJ$EIĈA_ff3B,YZ1_?c'눈dC55$PSs_Wn˩D%X| 4x| #CC2jjJS|;R/ǝ`4 ?m4Nb3l`5mm 9d} !񯛽 "?@O$^!moH+Ju} _`BQ.l33'Q 땣q3o8]d'NC$ A",`0MDgÃϟЇ@Uv*Яs1bWHl4t!F珋*# .]׿hV+Dz^:?u}_ovvF=s֗7;[h$2bÑDd / XY/zV-HEnY@}|}+X AY@-ֶ`Zezr\ӂ-LS7ZRf#0Պy>WňGCG֫W ?_:9"`p*4 FƐ![7JcGc@p=i%wd0pg|k taNo? LA?oqOz]֏p$\>B\/",' ?, Z`G /> C97Ë*UNJUvHl{y,#x$RQD?6Á nt VPH,p&$.4[aA_h?:M_"QR/c Z^!q,&^ݐX(~2G82$rCOH#bB*'d_ 8rXٿ#VNť>" *"~siC~?6pa/ f΀1k8xĥKgh@k0:,GI#;@ԑ`8O̗aBhI(P(c\Z# P גw44CcA‰fD7fYk(6x{^_6qH |#ak892h&Ns80Q? "w&|;1W <N9Pj`pp`i:#)s,̘)$ZZRÿnu ^VZ 7NEoqȏ?|~B|J,r8M`99|0 ?jY@ `8qLypc$?&Ey+EyXz HI}qR_S,?[-W!%9<,;/^tJ=qEsG"zRpqU!0%MQ]Ԡ/SP#6<@}gGY@D@r0R);9$+C]Ӕ1v+ 5HE~Ul!|~ oʛn!k2+NK-Uzר_蟓q -<7rI#J$;X8>h3[;cóO͜OǢ!Gfd'C?X+ 2a"kCk֔kwpxS/o_{&qo$qV [e+|]#xtV.)Z~J_ON⅂Zb(<.)aeH!f 8IkNq%Y#H2iu?L]9 .MRAW`v2T$ 0ڃƂ@ѩm#d\%+0ى woe<Q$5"ɸ+:h460p$3p#~pRWc\Lh'@Z# Wx'`(n|\p9+jG ٶiӦ\~x|/qJ`QuqBXNq.Jp3ǫDs:QxfNYFFo3$@ ٩'If.vCnH#I""$OHG ̗b6rϹ o$Md&Q.w7F#NB C5K[[h̑ %3~?X3v7F"BNbS3@4A9-OA kH#шU ! (&׺鼴y~Le̬!ǷFK5;w$zz&61:%FR` [mcHdo42%(g>_?G9<lW t͛0>o,fx~ӚvNd ¯g>]Or@KY5>\g}˥|؉`$ MIGwȚbp&)A $b` xT<N_x‡Y= !-Y0kx ?Q NbaՇ'h~&(J6H%:¡K3Pߡk2y/àlɂ܏KDr .Z6 ^cD7b'S/s bp8)x.0J;0Shx84LL\,b({ |    E>'fU7 9-Dϋ(|>"el/ee˵lߦׂJ&N$Ro4`I&0>\iFx46vGxಧ|MlS0= b:}'lE<>t,1dݺ.g:Y:Q`zdɳQTdlݱwr[mM>v(p$ ܢ- 0 ƞN=9 H2 <AR8 |R7[ p220.wX>I5a| b6ɪ~),Q|N+{-b 7V  sYM_ܙDh=wߞ|F#|'>>< Z$1B"8 4H8 Ed2BB~ GGsQ >0 s*ϛ|)8C8̖Q',8f.B sI߽ϼC󷿾}7w^9 _X,4Rg|oW*Ɂ~\54yV=}8˽tބ<[F x6R~.o=!T~y͛VHt&| C$`l8@3A\w x8^v`|[ye0%ȳeԉ(.P'pao~2.]p8'燏H94:HW2^Dj, N%3W"%o?z=?l.AMt,-P]WTϞ+Qt~bwn9ly3M 3>@]\W>^z{n-~leg㭲K$!pzVDG^w?~&})GdQ7pW^g{ )?R~d`~-`71sԏ~oF!y7D) -,Y@.C\"?* WvOq=<]`+, WX85Fx ^\H(TJN@?z ȫGh Ql\!yp*a|" 98-Qe+nGo=3j\nᨸqj\a~JqI"Bۏ=pL>Ixs6L((?$xL`NMDYtX wv]C83{;=r\>rL_h8bi8)Gh,O<wWGcOfCNa#`0sYv6;Ht ol!ŭS-[(_j5o_ cݗ^sC00Zģgk,7XKÇSpX:WhE)LW~?0>3l!gLR;ɑa;'d"o$ MiVk$,7wD,>9N '-$ vnN.].w9Ec|I]GV gݴa"'$|cU_j}z"OΝyOq޿4*儆Ih8.X ]&09=gX8c0-DY6WDDdO+SU[/\ͅ [W)M.Dj2ׁ}ܾAQ8pxOr`)@,a uҲULEtכGV7˝#͟¿W:'O) ۝3Z8w8>}}!-5zAX )xñ+)h˒V (3U4Y߿iktj|՛S`6_j~~bkAģ;op][ϵ87܀`0z0 R -L%#GupgA5?k.kLZ6Kv7ax% gR:< c "y.@QYu kK??+<mE}xF3'`5kּn^s5kL^0DtfItz w _G&Pwb.$=\Bk1s76HO^os{?^| Țİ I~nG_'2O_wrxwNNQV"Ξ8l_[l.cޓM6p#Nn łAv$lal'!M<Py1,\a>y-FUWAٳ@@$وMh"@$~Ûȣ:+pL/Y_@C/~;!P2[Gǥ~yEÏ9*aAJrinCի"dp!wI",PLEGgigxFϝtb1"/htjsX[S~yiMl_%-\(X$|'wnw9 &}5LНX@K&q?]NI"e> }.Dw'|_|Jӧe,,N8Fs'٠rq ʟ~39#;[FMwpiJW |OtRr'I"fO}e ֭b>-ep$(y;/?[FLqA?ţxhbui{` `ogoV%GV9?_ ]i"D6>XUL㏋YyDTY;Ɇ+VᏢ8[ǽ Ke q5*:>.2 IDAT󡗂A>==E[d0 (eg2I8ƪ{8(PpLĹbC.| wZTލ1\)AIҲILKn4yoч% w?UR_4+ x ~~MIRwd?p@ 1 v` J9s9x=z>=16 \,_г_ sA7y::\=glG;(cq/ 8xDkG@p98 |qIX _^ pc/wv˞t6L?D9e^} {mh =S{Ou3:/.'TşDzƒ0CLCU6ttl@gUv]a9o6߻s@vt|s_g6ň2qק$JIX7FɽʥۤbbKgԡC}0ؐʥ8_L,'p Rb SQ3oegʑHss皯rq3][|]|wO8H {;eu76ViD6ǒe58[D:[3R~Q^`%$ XFqpvBC&koK02`bO 7cf\'9'ƟVNPWBnGr Gť.vΆR "߇֭^a0&OKrq I&d[hz Xj\:[hglO?sn;l2pgHk y_WoZ/[%yriX-ZD6Gqßfl=WpY2G ,$ljltڲgÀqq/pA9kPs;g[h xccNfsdGE*;hxA;{iBc7j5Ά9ݻ_,0^5?iS.õeX(-h8>ΉY/$sJ]GGPI15Ϟ<;XZ/leKKw `]]ݦMrCfzõ;hxq@&,Y/$.3^Qy7{ix=0Gg,jla [MGRp4u@9H@.ȉf,.ΆQlm`L& J s‹/) hlk I\H[ۋrJEe9%l0*\ Caj $ʕkp4.?\ ,-ݫjIj6Wg,.Ά|6@5o)1t)H$[h`Mf]*,1pu.gLlVYd\ 3vTkbfFxWF, .&Yhz$Ay $!{uM2~ΆQlEU0j\̆F5 ̕N?!q KGP>b@͆0 \ȸ*F^l? ?z%)J} .Iv4Ƨ ICU}9e:0TȆll~zKi"+V dipf%nCUV} a l*Nd(pU"d6y92G"Yxϕ a-%i34D냚))Ïr: dPpY6Wg,.Nf\z=%/u|?5+\pB`( 4j/g flNf(pU[w| eG!wri աv4ppˆD?igèqy6 ߢf`뎭hSnVaM&W2I7h,.Ҹ ͟ CPaT"0r\͒=c[ [I~'셹<$/sIjWgPpY6_H; <*/0%fYf9%l9Άl8`;@MEKQ+Yص]{ПX-E%0oC+*֯?Z͡w??yi$tCk `OP:<ȿtwPLС\`I_7Vٳx.~+**v*-SZ}E eepuz{}\- Ey,-ncyM%W-۾woMY#T4]v#bX(RȄ6ڐp&A u (,D P3Ԅ Rpw4>Tz7CoMMTp4xC9M&#Q"[UWa׮ڷe̴:`&_Y9T[Lʽ{܅"hcm`"m].cKz"ň hD#N*?-j+Yp= "G_~ׁaLCw{w}g׿UWWOoSj.uꞜDٮ^&F= U`0un//kC⛘KDRdB6U"VUd[15{RܤFf 6҅M(c v&d*~6 /]Wq ۶б*a @`:{a.LX/!H(yu# X Y10\n רw IrK0%bc#Z 8X'@4%*:D&Ю!TS{z_u }wE bazg}ĩ@O$ÀkK&}M]x 5m2 ) 1Ǔ#\z𻴴$X0M@Vל}D tLiXl`VvtTDE"6[{k F+ѣ i#n/h%MNXe*b`0L4]rπh]~]EJ+ESߪJ>&(`9nXk ynt0F7! k=E޷8b"q܃į!#MQ$`!O@05F'`,`V2L=f^CRB-,LB`f!0OB D Y?m3G)'Ie$xur)eFPdS`hӍ6 ЮV2=Tk'A: Ct 0ı#PZD@,2la"]W9( 47 ָ;h~6Z 9 W֪SQj\zfİze ())W0dRbwwY0XA=YXAhRab70+gM^ y&!@@SCDH0?!YjO2"KK$#87DxPM1+ˍ~ `yc|Vi5@B2 cKۤ A+1h9Bzz6NxuJ 3&###6&!3}仾.J&d$ͮ s55ąB;2+z nQXi^r~Zh+7y \pM$#,\9&#rk!\B#^q,JPccaf{@dB2WN"`Yu9.rh&iS"P=5u0祺'.CVJ܌3{BL\[aעC35Vjs:btaq5ZT,hC!Fe2KhLw 1<b?eBCh/{jbxCW2V!u@~ZG( 9SEDVP!Dnj6r/RPX@?XԈw[,L.s 1vg֜Dg58O RJaIiiln;F!mU&] 8JN"6n?P,'n.1ʤ@H- 0} K{KiDЧJ%Ak"_&)Vqm|hbC~%damłQ, T3DNt3R yY&۠Na XZ-yܨHhLT@?%QF?8i:9i//[m&åf§ZOq`[멍kn9Y mY%\jHʋ\Le2(w.)_NjO`*nC}}9AS&؇vtQ޳+p,B)I+۹EUuꊋhs5i-ee[h Q` mCq&b{n% 4:A5X;[/ v>eTw-$!V. z(jh(ҩ``ݔW^'y%/yK^493?(Q`45ӗ.,:h$;5J5m,Mjeii=n0Fe{ Q%5huMmPs$'oDۣ{)4 ){T"ƢԠ~=O!'ck,#|D8<\-6 {͔ՠEY^ɰ;ʧQsf?KF@ӧO@&APȯm!G´G,d1~g61Q~d ZEM kȺ}=gT)KiY!jZ!,2NTa3R_^^VM5J6AyzjRkȺ}=g3}"zƝNg{ * VY VtbEWMr }d }Vmz(A߳D^mC5hQY>UC)5dݩ(GgQP!$xz n$U <ftb ̓@R_=+K6D^e5PBo#U8QV]cIRbtmkI=r8\@0<| PלQoRՕn9~r$3'{ נEYd }JSGEOGFFGԡ>U?sA3(K6D^e54| $6R֝(G6FGCP'D|nv8B!G,,A|<1nh fiooFT}V]X6e 2 Fw9f2cWs$5 \œ 0<ʷ07@Wa>ᣪ;.>D"QWg܅eC6o˜3+bHUH`u9fxY@Ug¼DP;Y\[;! $hQՁCFT}V/("Bc͙1*Th三cH qe (+9iEAV8$| ~C1X{H9t'fݧV4}VWN,kά!U!BCer7߅"w^; rgr|I|Ó|  y,§ 2ILS^k^pjOg%j ǚ3+:U|*D,uRsFPę Ixt }"@,Rr"gtTz&ŕ(ƔH $:ɀsV2`NNNΝٶ[8ӲpLJ7n~ݟE1up'p@U:GcKWfl];wfۂ??`O;.rЧpi[86N'0eK@}<2c .]\"U10͊qfBfl&4 v,& bD$kzH'}] KƀXt,9f&C>qI(8!uǿR8_ KbE/DCm2qhΣ#"Ԝj!gp~2kFh$Lnc̓9=F8&ŧ:3g?O%&ʅF" :5N W|J"U…^ Ҋ`0_><uEٜBw觬8BtT.Y)I~W  .]oǍgJ9~~c{;0AP[!OW_) j˚x]-/mãOP*. EOz' F3{2#e>t!:4 ]- &^)N(H"(b),]*˻(o\^-* <>{nƗitĚSq|ihEEKabӱX.J$RG1:>0`|]JXc`ҥm!e- MD5[M_M嚒]T8rQ^aC (Q ȻP(d{0d[H$j/M` f@(0c<4 0.!kLba6 h $]{dM,[lOXgz"ȸ@+he#1|z" Etsp"->g8hɉc0<[^JeKǷ%/ XZW2T^rEC\'vrLbz !GUT0YCLy贆0ӽt7>r9FڌFcY;JXLA6&k^vэj a~{Po|?1%ښ髣JiC*+a>:n5v!hKo|?HnLvttTNܸZ@)m(Pe5LGogwc/eje7]Pk,荏\&`{fK{)b1RP jgnLk[Oe}`KK_Z@)m(Pe5LGa7#!do+No|?Vd~?YL(,(i4pCmA-`-+Bł( ?L'; `8Y~~pbTPh `|,-Jii)trRșHr@D]Cie5ؽd|r尻ܭ P_o9 V\@aŇ&ŭan t@sßt>{+YOGj i2@=DMn7[ 7(Rv.w!CU Q%5up˔7L7oܨ 2(Aw}҅o+,aruo<\O|U/,(br L2&%M611pLo,2lqm5?mr9yMDUCeeT5Tq8ҮAFƱU[@j5lZKq-556tcZ>l. ^B5jlF[Ԭ-,uhCNa!33Xlcl`|(R`պ{$ Lw^( D+*GUR?GZhM '+aeVZ; ed>:02 Biw8<>$-_R -RZhzKdf°w; zTvfdf<pj @BJa\tZ'2N\:dj4ֺ֖N`%X[|0BabzVv}2ǯ%] $@@N&7SAvgbk+{Kk˹?C$Ds]]_Gt-o87; ņZMǩ83\ ;Xi'nmh]H2Ld=Gە.4~y-zq&pI]?kbmF&8!NWeY:0E^;|F8E%;P5\YlZ  5! 8j>:a.-\:^XW{ (t I',\/>kIa}pBU̒ӱ]YXO sP‰ HH]AۧP52q&?Q&jY_it0BB: t\rNuљkȁH2{<"莻0zW4|'t0BPSaeK.:bXBˁ$[A~B&g8˫&͒0WM`!jkjnEH8$NqYY_) ,}*NwYg߁c9/eee4N"B1ʟ&(KjN4w w;P*ҧYtVY_W~ֶ60*`!g+t%k/O_t^RO4>#1~cb*N.sk,8mƟ_Y+]m-GLs[1Y:+ԶqGcm+C;3sejXo+kplo#?d*;JvTh1^y(8KoGw_jT8>EDI3Jbi4!(nY&#( x~-#Pp؆WU\/e]oXY:UVnς5_oNq"e9%3<x 9Qxzs?0;!kS섬lɟ(6ʇprm#}=C+ י1K$c%srPz6P#lۧ_%Of=iJ5ehlbxvv*K.]Ԝ "?/`]Uny_{+*NzC:߾Nu"N*%4 W,k幆#B# wpReKAiT=swPV'HzGR0IxC(.V|0G\9/2Q$s7HXkW E TXi?ٕbWSdU"Ϣt[`zG1~ ސN0[[^-+=[سh8{V: @=h*.?WPS5Κӿ'n/hQ0;^O#cZ81\hA:.:\8I= ^2eڕĴstj.by<]2~ĭpĴsq4.byۉ?}ٯp[.=qH]^@[q}|~*gr_0nf  9 E[, A?RS0D4\,o MX[?]- ' ݅ۤ}*C<م$`5K@ɇIOspHa/*6]d.҂оA Tݒd ռbM@-mNOv! BE&t ӊ)Bo>';EDMu4 ;م$ӚpҘ' ȅ}at޸1:1P-E++\T zIuDJ ]81(jH֭Q@g{dwjPM@Sj2Rj8 $28:"' 6joܦ~sX_d.Zf@u|^v+QP8er-Gپ>=6_DL' WUt-PGfjrk-  @I.L e.מǩN h.X2 _k!\ja,G' ?(UR{C}rE&b@48I>4 IDAT A D;\4b!Wt8zTp_W[H- /iaE#(hI ף=#[ӋrV:hjwC 6ͅp~Oא"';!}q{℻pR:\h[@orJ%%S`h"$ F_VXH2FǹIXpLox),LƸ \9j.?q|Ġc/X~_-߅;y:RUȄ6=۾:i֎/^D|N'z;!,N\Zu'#:Y2FI]IlYdiCڡ΄5}U; 𡮮qիZP^xwOwW͵t-ɂiﵦg!%},ZO±t, WƈJ\r1,iGhvNώ/5 쾯#}==x[& iC8Bh2Fc4E1"׏1* _yOp˳-~u??w_nXm5~/.޸񛳹x[&k_*1qǯ;;iX4#9ӌG?N|+Viƀuf8񭼏^(tƏYWp }q_ hEֱ1՚ Eu(xWqC" ⨊?"G840ALDCLjfr }{_0!FM]pCT*U;4~p?w}ΤG4Z5yq l#WG_W^5e6k̬xR;q'oT}q;^ O.;& L4Cֽ'ÿ́K[G_®(&f& #C"ڡҜ,$ ёh敂ιx˃gwۮ0b2_# qV 4'f;lŠIHat5I7/Y|dc+/{{_?d.. 8@Dw6204 4oG Ex\lq:3NC`59!sk%sBځ) :B.>HYHQb8}?_rA?(Et'<'5@&?0?WF <(!$ҏuuD2GSOw 0l߾ǀCd}6vqwDNA?o" 2H?3b;v+#tWM}$@ yvC ]L]7MB  1'݂|OF&1~~pgyV!A ;/uA%/qi!0'{耬H:`t>Ƀ;X6u@o&~4n_ 䄐N~} b+d*6AzWnVpl>V7iI:}t(=.q <]s|g&>Bח$>FNɡ8c5Wwfk'Ġw7[.ߢeBL{q|4z"k@Əy| ]o:]]{y=/.7"B滳W|C}S|xK[i$Ԡ7:= \YO/ ;!X8̣ܶ~RܬS|{{B1,"M %[cٷ:=2ߓ"'RZ;e@"zQ4i.?ǝtw4 c&1'R0G}3@X^hX2? G?g)j)!8xt3+Dž֪ q'f|?ʋCMu̳7*1 ^!U!}$aPWD4{yw^M3{E9qyaļs/d!ܷ>=\oʀ8vˇ1#rB<{rdw^=/0'7dW/ A]]FXCh`!oxVo?_^.wX'G2WLxG/лVz`7ڄ;)湾/zۏ TK!n(2ɫw&m#}1PTskc=כ|,]m3ۍ_:8%>@&/X"}1uguz )_U v#f5pv՝+W~Ͻ)]IǾ v#fTk^x{. fr'_f ^||>3/չ)v@_1^7&Q='HH:tr Ss8 `_M{ 8y$w[6+젛0wtQImi-KǗ_B6Bn0'麠 zh) wKgz{k_vAmWA7/`otQImn+# v!܍B&c `ۇu\X.D}[v&ӧӧWA7/`Τ?j2M-V| q2@GmC&`ESkx6() wP^AdݼQIYq:>l/ ~>;oczwl fIc|U`^~,A;:WA7/`c!+Ĥ>yb?q_!/ߟ9BBn'*K zd;/geb.#^[c߶^AdݼQ?=kkV׏W_;یpOΔLg`9bY[{KF_sPGGmQDvҍ u{+fR׾_/_ۏۏpC>9 ;yDD?^hqB)-[zv谄Y n^ǖtc hg/!!wgR㝳sBt-iĝRi-jv|Ωn8pΦban^BV:I}n+OWǗی;p O~V22y'ѾX[ڐewuY n^լtѐIX!Kb[rnyRLk̐sBwcʕ_Τ_ۥ@?ztF]+4+%B_>Bl+BHܑg/'?9φ~9!!GRO^AdݼQV:hڤN7X閏%"v"!\H郵lݕ"'e*d_}?^_0vls/BlBnDt9!u8! !w|Hlv3\j'R2Aۅ;p{^7/`mCB|RfNֶ!79@ȝA7iBlwR&rG7 ۋpmEm]G_&]c'xWo֋ 'L'^7mWOo4YNkn\S"oY_ݺ?9WFYw>g=m5ت[>nqzmorBjȽnkJ*έzkV\Sbln&mmj!p?tbe"8e+]v^ۉ9!L |qÇgmz]g/-XKVɤushV4Tz|X :]3?LYvt| ;g>N۸S4Md^ܛY=rG &hįXKk&|zÕXҞaV׎|KP aze(+Iͱ^rg._4Hn5FGPhWk~xxdff}=LƊb9XZEҒNO "jP7GVWW=;銖aM ~-kTJX,<~k+a}m/''R.['3)-Mܛ5qp?MP' 0}0o^ҋ ޺S6zuֵgJ?<8zٵg39= VVeKI PtV\)jZR>ve=z\MXC!.z2=n硔I. 51D pgϞ+03|SLt|9;~g32!f!/#NWB,}fKԘ9*Mw^cWZыiM|󥈞,'~h.D/ IWll&KXKR秦Y43P/-lvrxvskx;2MQ2&(C#~X$mG T@Me8055|0[ZN[dzc[ë͏5ZC+.ӝqZ`^3Ne ]+8'V#\մ6de߲“How@@Zp68,E}wj:^m~- T .PIWS ~|h{VX4`B_27 Sͩp,2q)&C v:J>.!OAr?sӷdxdV]="B1awΐEa5+ NOEs!(()Y^/Lejv-L]S-fsAZ\8^u&A/";NOg-F/zX?? :PGb[.^-+/wԜp[޺?|NJ5(q2?^^<n;|ywWԂ(oqe-3B+1]._i"BNoCKwFD9j|sw9#ru(ůόޛDO{3Z_6¯S](~:vIoi9N"_k[(Z,t'oW1k> ˅ۄ\~P9wgg/9ҟz߸$ U_2CC:kj*?࠷tK~ tH;/OwVc\5 [ύ}c4GK2͋'D׼>.27_6|~ }FKvj#xw.:|'o/W1nwjk>ջL {M0ц=%`ֲtb S׉FIB"o%uYHgȉ;pw|p}&n|_[=t"9Dv.:XbDrF?u ?_EtޚY<"ܹ.\ɋÕƸMi>!VSk./,|ss@I M}7N}ՅO.Ncܦ4Di8Aـf~Sm,:7FE7F6czN܅ |O^BG=>.GD>Fωp_>Pn{Qz eYt1v9qHŽ٥h?EhR4'=Ft='[5yqw>|nٌv9utWI>󌆹'nĝ*/m͑ݭ_#5ڥB Wf1Яh/>FmEa~Z89퀐/ȶKУI8/ߏ'WoD, zFX]/7D?(Ab C$٤>B/7cAJ/Y_6__!B/hhm*D 05D'Tk6oa?k'KK%]\8/"dWXQrORQc=ZJQ`!,%K`;ոr3˿Gg4|5dz/K}QENHCC%FiZFʰGTrOUr^R% d|_;Kw!7p>[jh,ƥ:{tK:ÿjrBc?=!0 X;ņ hTU2,*}okRՉI vnkZTNJ#%;9z!֦Kܹc9?Zp-hJ?yNHVd{{W7JXlbDMUEM A8NVz ,Ю+bXihd|v^CΟ[-YW\p땱2HQWn]>'d9Rj"_`4]`{$7J.)RДJ[&Xj1/[V!/ӝ cY?off)ONz$>(-[h꜐@xR|Rm( @!٦ q<`7 (TU!$_2]:uu!hnofo٣Y&Xr|l7Ҁn Aw U|4XvC`%U} !b![RF/ &D04ɒeo4{ !E8d|)D"B֍pr-,';Xm6Y"#膵-w%kGzsuyx'(45X)X}4`F9Vي*Q?QhW;^4Xˍhz#+z/ʽ]D h},ڥhDL7͛"v~bMSD.//Z[ڊ&*1(-;˽Idoi96z{{c=t@D,O(/_El#BnG[lm-M-?ѫ ў r. j;9i?6l|[.)jUGE2-9^-{MU?֞1\g- K 5\Cvd|)[%ۈE@y^J2˔hTъC!O'En:4<`NqTqG6$ }Ej%e)BnvOeyј,EJLIi,ibLH@}.S2JƗO0C0?Nv ە=W*jĀ0E=,*,dop-\\b !+igeT^ /y9>R4O'3bw^p"6G* _Ntˇ_ӷy+\,jQm O{-i{H碽k[^KWGG,'{qq] A}$xcW'tY7_ }[x]ac׾Ǿ:9ACw?yo_x}!] WCf{{luѫw.{zkAc美+/u 覂_K{ݼc;{zz~Z;_lD~ǷVq۷HoXN :tSA&oi{.K3T5cv˙BK.C!މ _lO| >gpuS~y'C;|4H`Gǥήt COhXw3T- c>1x=?yyv.hg{]_0h;MA܋fɧ>,ˆSߟ=όNi~k&s;]'JL/7=]]),J{*'3~cE'WF'~:Kߛ̕\.RZf)/72W>79s~t L'݀EAtџ %=S'اW`ߺ'~:f_ZsUo|M@__]x+;9W 0,3W[/޵(NV~$#CO?hU2zUY*>z^߇/fuO/?WLzn_qN7&o[D6~$]CZ]fhU`)!>xWͿ/qIdeBGdEшKюz09LMB/&~!ni>~]tm5EXtޖ?$|3aLwރ~Jw ߬8L- A䋩A~[7छ|tc >ğUDe{xirhEqz{г[hkFNр^ -SE~kHM,Nsml|b}8xdCAIiJ*;W 1 |"8ejCE>88uKةڼ1KpP *[{^Ob_5ښMzߠN~nh>PTV U1ѮPTn >p N |wCec?(Ϊl=g/~|>6Zм~Rddy-em%!$p'\tcvomb x{KON[E4OZДM-Vǟ19ltK-oU܀wwH0?nZiq>G-/_+ZְGXX.z@3.H79"[(Y܀~ovFeGa ?㠯_6W?,/h3{[Mt9# [.nـ~ C6qH76Jlmc%Ƶ!2kFXXSGh{f4䜑V`Cs#ƚ;h}󼿟7v S90nןy$i ז}/^\` _d9"ۦ)<:[%{ =7a3Fo+0ta4@cyZ 6K7q5+H+A7•9}P" DsD$O`f۞M[1j7?vF,w jڹw]0.UA}!}9";:젻i}z]?XQG@;(F_3E@ǥw0猰FHpC6_ExMO*rأax;c8[ׅoVX#" wv|_ pӆ=A%Z7-t9"FH`;:kM=1\DآeXdW([wNrHsLw/_czsFs.}oo_+ۖ윑Aw0Hċnmh9# oZ)Gc,zvu@_ 4%pfSK[9P,F /b1UaCؘO*>{v6+JQU4~e,ٳg[_At>Sհ4MWqN0X@I L OCJ~n?ʠ~>XLhf}}&0ϮτJ1Q ;D~wX?ݕ7;zs,htދFGOv[{Oo?8x#څٗQ!B?` c˖Y:kA?{鲳|p[RR^t:wx{TI$c=@dz3ۢɃR8r!S¡ BAg,ϔzK+>!t(gO&4Y[m Τ<,ksоy%bi w= L|v,N2 ܲk`^ڣw|ƅԟzdhA?EX oay8M!v=g?cqθP10;*࿙#pZ}@<Q ~hE8w_}Ǔemۣp{w|:],hABO5$4J`) IDl:" |(Slsn.$PUe ]xlB +3.fJ3qq@\6eES0b 7 `6;-OhBi6;fUYW|*0lׁm}Ꟍ!s, x`w3|@̈0p?O238G (:*;w֟/w;[n$%,Ƀ΀oP BB¿2|^wH Y \u}6"WK@)5/9TĿnD07`zf+ZCIx,o,֟ # 9Bc*i)SOLsO _MxڣGZNJ]hD>I!%0" {Zc3Y0 V@ں Gw/W^ʂXG &L0pz.s Xn&TPz\ 8צ~D@@&ZO$ g2B/cQ\~FxiP e<"5"?x ra\Bb^b ;*]D@>â>[&1Os=끁dښ{Y4&WJ9oQ[.YH"'TPMԘ• 9!!CĊ th~RZ|z.ʭY- \gMdwsEv,8 ?rb Zp3F2 ̵@Ʌ -ugĆ`X`ną)lafXT$}Vf2hl =d[%l©pw?$ڥ(I5@uP]B pa}}xW/d.hD"Umfn/tK C.ICB\D  9A|Ct ` 7.VJd8 R C?H~6tЛt{5 4Q80HӨ4jS\{5 TȌ;x+=kCi}il&⡙-`ÆVAke&=w(8qai+!Oc`4x\'MVe¤Kp#.M|Dǿ=~BĀ( %4%8ˠ8+QV~T$:$B}цFs6 tX :$ɭ|_*Iڵ}(4b'9W؃jho[xZ"!)wr^ HAEƯ# S¸%Aƈ$܊i Sj2nHz9Cj^@EUh{ NάrA}> Ǧ/ȅ-l LݟG_e[\h.+w$FRG3I_L*N#t*j̵,Z؇SC>JL Z4TO+@f  ݖ\6].߮7v昘F2ZzbM?5a%6іAyDo \F6/h_#L,SOP_O%#Q8$84k-o%]0`J ʝʳDռ;m>Hdr|biHMJS%uB>s]@#s( !翝?nЀ;wz,EHaR:X9dЮR -`eB_]: ,!. їJp%0#h&Jo/ja%[Ac9N,)_ӖB͍̍O( /!`.wC$< _ar*0=rFZq&^8Kp_L Ѩ5d j _ $ 7-C~wep|")9DHT"gn7S r(a[-QH&OȂc{9g $,fLouCV /'V_9 NMI@ʠLjH৘(M~Zmb>° /AGXHv0>IVpWI}ZI!L9!́pV !.| {7~dM?0v{ IDAT7x `^!J9B3NYG52|y:>AI`7$GF"90yZ_sse` fL %AGꐕh(G3{=q152@p^ haj.Od /. jѵt@bZL&$@@|S )u=؀ש`{sa>(w ,X!8d-2|?!z Ql/ݼ[2t@[Y t@SC"Fp-[W%gz&'EgF#črC_"@22"·'i  O[}L ݏHG09|. "ac0 *N‰Q-# ~@/`Bg7v1Ed=H(UBF"#B@QZ/RbZCBy&,Z@pbmqOQ6Ƥ_d2iy!K!܊p2wxWF;5d;A PuJY- "~s]: ~"8ykRq!~>X&{~fץ_^AZF[ _y 8Ui"7D2fZp*c{ƿ0qBB|'$K>Py0WI$*JԬB%%I"F`G4MC} 7W9ٜӗJŅxa͊Tn~_TŇt 7hDdpNQ)0D#Â+*%]aZ@Yv"RI:bDB+f=S?yI-FC@5 :rppR9Q,TyVmŇ [8 r#iECrϓ2,"GkbZXGefe֡{'qeSTeDVpLgЋ<{-@_/1N@9b+XE 4u\E)fxl6; ё W r'YИB!wi3lc&1{JDc(~3䫷h-.D'gx=]?$^Zqҽ`=SJSX@ɡ{yyFPOѡcZ4^V0@{w*Dϗqb+,eAc&6UԪD@,6rgxV 恠4 ЛiCikq!:9$'} [?@0H^#Sz1$u/kiaǜzÇEDz,oLFLI@qbD ̈qdtqo? G8s밴UFEda[ZrsM!᚛o#cih'[Dg Y:Uhq $^{6ȅ s"rŷĪa_ŏXx4\發TF Oz"`V)[d(B@ M Zgyt"ʣ)뭼6D/q-iˢU?=]=Xdyr:J6) b3Y9#ba4FQXRdvYT?hz|ߚ'wUT2u8Q0bϳaC̍⛘},e/7VqYSsy|{AKoL 8hB0":R(|t@4(ΏT*Dq'".eq;*cs-^Roi-&dέg[D;ZNO WJ}hb\fݨܼ, a1P:T\$ 2x"Rn̶2|>j闋h9{*D(J |ktD k͉$?H|3YHg `m7BcƸ^LAX_ >˭[uZz3}9YY6$ ;\xޒ 0`DID 0L"AQf!FSQ ԘKG!a9zɢ+,c%䉀2N.ofjij`)\gfP{a9Յe8c*gIތV?vR*nļ`VFV.: ^S,7+i/klו/i.ʍOs* NLrv(ws[-#ȜMRO2hv!̊ Gx^k;B-R/MB @`9aR^tn0T%29!* V1 Nf.O~'d4^f15~)xF6!4" Gma582h ĕSG :?>+N^yk,[]b@ #qV^ӏM6lX 1JD~fUQ4O*J "FF!̆9)S(ƩZc/hu@wFщb쏅iY,GpmS3 y> d{7 ^r)gK/s:薯ϥ?𘾐KB'p1 C2,LεEGQ+z3N)8%wlO|4oK&x{n)oaNe,n+[s37~~^"w"/An19wvug*^~1IA|}&ax4^rbPz!am@@W}>DqYp:> 0C-ܕF(QdDq=-CcuUEMG3Xl6r(ˆ-j13o<}ZstfSS?M ꬷ /P.ãdMDGy E}V]*#+ TߞmwB c:<1zVH9% pnv}TPΖǖZ_" o@@G0/917 Va@(P_P gL-wf1b1fg0g{O `ۗ_3 9Us+Ų`)ʋeŘ(ޏ:t$#VُkqLu<\gWƘ8O&ؙ\1:F ܨнSӔ蛫*K~j?? n؜ jgOC=D|q3UNf;] rFl&*xH0ЙspI(=7+O32zߤ>BX\TbQT9Dee] 'Ƹ ǽ (!y?3keO)b~C IDATqX͕*ōj=?A|0gbqƭHzyL;0N ; GL;Y {l DbH 7.A{-H6uh?T$oyFCq9g'%رE^ 6^'EXWsy7x?xxBWo|UW6Ǹk7UPn[~ѽio^nГ]/m+G`3#l|z+Wny_ݿޛo~oꑰ?ߐ͌iZ&*GWM| \;w?<7G BwFy}r&zo^Fl<|Xj76p[~KzC@7n'B{m*>udO>/n7[@^*B>kP4?ZuHC_vgrm*D. v#O'77mdx_[tPwFG;#lw^K#]BS4|-[Ɲ)B3j7}80M:/[ƝE:SV`nįixGkB@ۈl563^a˸ -ף>|ɵ+p~45mzz{3yeӎ[p;s,>/ [Ɲ)B GU塻0W\ů/2uejz-p>{y툇7wxĿ6{ppêz-.׏̄'GE&&iFLrOXB<c]O9wq y}uMjmm`}^a˸==ڳ_t4# nn":gE} X/24{oIds:?ݧ.|Э @_V J[|٭c)pkFݞ%xyn+449v8djO~`;O8>q trΙlnk*$S?re)nNX!쵥# qeZ 3JUa,f<~8"`Ih,|iZ03VI,6GMLe9<_*Sg&aFo=mQkzҲ}Žr?qgAIcX \3f#HnYl.Z=!h8lFK@b[uɫkWG?_OJp$4γ݇??g_Ľr",nLģslΰ%xK / D(>utct58݆aLGzJ7'W[ǒp?_! ΆGL^ sfo2-2+x 2hsp3 n/ >t ቶ{?[GVo ۶SX1{mr"Lz0ps,י,&+mJCћH+pVtsB\`.>@vwS @E }mӗQ. 6%5Z7g!'V^[>BUEYfu8BtE6;sb 2YZl3^XU啵\cɶCt[^~w&TnЃˮ޿5ԧV"?TG@jz32`b<p-uk+i V91{V{Enn\lIWƴ^ef}ߢ9*F]<ʼn!7`TZ۴P5ܙ{BEuZQU d װ9D4t-4峱j0}yst戫OUcPo˚["C<iv`YvB,:m 6 iv'' ^_YYwj:lqjt_>|:c(;Sfb֍Pn;s-yw:`/A*=GgV_*QR=T5U}*Q^)/?,x)`mMHu##ξs逫3L%8Xu0Fԋ ^l~oIlh079<X(Uy,)wo&O4xkF ɝe F|4<:|~tôF7,tD`gGTӧlvU sx]_uYԗKN|2ȧlhurg.!ᕤ~@=z+'<9 }pImX6zEI U 9=Wo{dk|ieY/!tǪ*QuQvɭ35.tNޒjS[*+)? a-l c6#G&Ƅ;R}_>/pJLuWYǜkZk[Jc]^vyg’]dW~tGEBYtOiff&20tsq arWZYV[qu$,FNMb5[+M+]˭6B)T1.Apd=`^xR-vryh d 78i-.$삵s(#(zJi#TK ZCAc5 n=BIyz`(KiХXe._[ A]u?n\ne'OxMʤ(+cE.'P޺~99#1XG n% ~gK̜mB-#pW fZ4蹫ާjN V@zWV pfNĺ` ZZyqڵ;J{ &\OheXJM`_(+W NfLT|:]#H!A~~4ZpU낑2 ϋ{ޙ_λYR_ܘH)jDmeu& @آ.eUݝz( +W^-,\!.XZܕZ[E?UtN\.X`֘ eb)e]lӋ*a PnF?1>(Ӡ箺st2`j 4PeJXyR,<+n0*Tt(Ӡz)bK\yqH7 U5qa ȉwغυCR.?K)w=F )3I(TH*|wt}F.DSXy@.XZC!4V Yav?)uP#a)R%P)OD\;DT^# <]ut,Zy0}ލDoe KԯN&33q6ukN#R%P@ͯ!2@E *w=k4Peۉ+/$j"%)%5!bj o>o$ _j]syzU!PWW9@y9^[V ki0^x+K/Uv"*h(N@x02~ ҕCPyz:a1ʹ\ mH[ZW*y*i'6d\p$~g()(5Vi{y[91.Mz#`YR5XPR ]ѡX@'GWY  ;9XRq.̥yXm_l1c3.?R`d9IIC!psK3@}`z"@~ON1Njo_kv{tD*EF}`Z邕[]\00z)}.X #@'-:qViu'G ]egL@L=E+ gu6\a {tL6L'9Dd`Ke|*f_^PR08J[R]JJ_ (q/RTqfm şsp[68R4O>`:8s]z+t2VBBP]g`LkG ^/͹7,+(êx8`*7=[\FYj ݥ]`6\Әn4Z@&gR9Qvr',ݞn۴gLEN~vZ\wq<1ֽ L6XrjX xW@=.Xꃍv+5tZ bJ8D`׎c4JGip#Sr58:ʰU*`yy~YEiP `].Hή@Kt7,jK{PRPtq@HL-6 1+K|. Q|z`YYG@:'WPq@ 0((W ^q@@6 $Л^3cX}A.X⃍vOv؎][/+,)8q@:HEaP@z(Ppr`*1^jfE@%>hA0 ZFic8 M0)P1(CU  Pf]"zgX}LpTP `]Sa>+6qɅ }B-5=T/곀]mRq@(dzyQ>(,=whX `#&= IDAT~+< YFNm,qKa0:Kw/8`59L/yR&(,࠭ޘL Ѣ@3{&z9.6ʯe sUdb62lɆ2) P ̩T,utc y,MH` #/{?gM\+q◘>' h ,U(*4š瀎+Q6JeUP#s;FAݥYyz\09FH`\ႇD'L<-;A 31 N}X5 [LdK wdCXN`>/ FT($ѥ4]y 4 M`.8&śY TxOOԘFl0Cu:\ v8 ;mKj<JL6TBRj b+դt8@m Du)=Ylw\ :s, \>\P6eeKI!=n,5:{Iٔ-S**g6w#$]d&m**RJ59N"zGupiB0}~ Q0{,%ae岩Xݱwe|X27@jpDH]k9d|?FuǛR!,оdK @-3q̳1jtQҩf뎅p`T펅pch3'C2lM n4DHe]:e.780ϢqDā|l\v,6tbKNHwn#Ūݱ2Y.]{NWs`}vBJ]0 =@ (I*ΕH $ Bٸ`'0+b,>cm>/HtuǂL2W4=rf3NB/>+pp`0!A dCjJvѡY 8? Y` 86*]:lݱEY.y%Svǂy8l6sl6M0'_. qBP^!\O)=zqB\"\QFJ@v;PٙႏZ==)X>3}O*X;ֈxGw;>ԩc@&XSd,nh5'ͫ}8utӍPb!VR>8K;4c 5O>.RAr6.;9Av=[@*zr@ ?1%"4X!-ꡋ R[3kc}"$ -n<}dD떬?̠"o޸T0R<%Ⱦѓ}ĉj6w4{A-T-I[JM F?W@45]^wMS4$ 9$߷YIe#0b7;-=s@ F'k|n<$Zq!udȟ- ׏jjԈ)<* Jp o2MG&\vI+(kPɹE"ϟ7]GԟNdϖZ6JuBb.zyT,'ƨ>%%:DW׻Rn^{Wu%}L0/DZp?w8'ʋD?waIƸ`+,nVUN[.;͖ťq'1`бe`}$#Jk1*j}Z@+ @\DZE)1Ccܫn1{Dqh4؋Q]ōgJ鴍8 wVpϣLLz,I/׊Eh()?ٽe:+!_V4ȁ(QVhMd-9C;`VezVA?b` sX!bqCߵUQy:Nx^<V+|yR6`P=_)e}$h̉r(QVH@#3WPw]n{I3 D?>8mu=沽X]܌d_|iU4t*2@C{f5W ʐ@@ Z IѢciN F/{ rPU4qB{6 pդ@KEsb @̦+V 'xMvoYJE԰yh+N 7%]nUP"bJ}Rb 4s-l+VS>-k΢)7"\ 8K XX&JG4*idz4A?SP=bt5Z=vnJnpVc ΟkޝZ|j'y5lōOe8$ܶI7 .o/޵{`HZI &Y}esKEmXj4/Xxwt!,ghE (i1apH=}` _366)]Hɟ?GMXdkDՎ\j @?UqZX7}>͉w2=}Vnϓ`@Tb.%^ڍ@SfDJ7^]s+ɏtU7%)-]_ִjv.Xޞ_l_<F;k*n="1A8-Y0n:q۬@A `hef.ndwtH\2Rr-a gztNy"]0fXE &z@X+@@pH@R] plvT8 O3!n \T\0У7÷[+*?eMOsgi@)s8 Idh9!eΚ9"_,E5!B\!:* MGAzZɆl< փ>ezŪ{rJ՘Q׵Pepe ҫΌסڙAeONKCh|-%XzιR$iDP*8Sm5X@6 Gf ,3t8vqZde%4Z=u/Zdv2ݬru tG+ cҩ&kEb˙h@ #%' GJ@m_9`_4fM`S3"Q#zS2^ UV7Ͷgj}:Mpd`ǻ#%@tnkX TO]摒| @́T DhH mv}$SP= +֨ <)?q3`3`_zsnPpV|Pe~B>%gD*0 R+c s \l,&P:L IpӛYCmQԟzkEw1r0w s 5bhhWs:fV!Ԍ='/T`rp2Fv`QGaQz;T]prkJ3W}wJS֠|[c2u%.dK)s}љ ]ëoͅ)tpէ VӠt[cr_E~VJURp?C', ˸`ʠ!NQAS0ph3`Z(SR dǜ{Ca4hV TVeGM`x]+/lOVozK /@ ֦}[O7?XM8^ƹ IU.01W8<v[G'(csݳt;ݡXܖ}>˞&3MFɴ7 Z#/;YB\;GJH4R JՎl#mэ"ok 3v 0۪) d6C\jf%Z(&o̤RvǯuZE(l25eP}]09PfVvt Ra.X,\Eָ@;NW z[?׫(5+ѣL7,89[Fe5Lt5k. xC][ ĬDLb|)I89.+<5B\n= IGlĹ`9aou''5XGUIA<`aa|A,0g炥/4#V>~=iqrr)=c7j 66!΅0 ? Y =` Adjs;q._vmE;I\1jp /P@A#GGXZ3f;3n{2"}Kmpr^.{RY1qh톷tpk5h2@-DV~c6A!q$0לϜ O*1L_%nR?!0NA'(L!yvд[t7-C9wu@5h8;YX0e{ݹ)S84(}ZC@@jD?2P_)Y@xf0[E^@sg .w85. xJk׮or>ҝ2yxr! >SpN.'BbU QrCY@i(nOT;H4 hY%pHqQ tV#ـ+?w޵)&̥24v(a^mx0cB?1 33DX6}ʜLmވ47ˤW\j?M^lssfd"[y&`ܬ3l`Ba&\٥L ~`a.ft7`wuiReOW\'y?!w4'oeK_}r? \8X6_V7 0Љ3$ `XvC&f`=k\5zG!Rɕǭ ]bΘ'KbbwBx&\%MO+$/a8ñ_5ǣ3{F~Nvu 3 q[ ~ Q8RY*`x _I=aϟͼw^wæ`fsn `z. `8` (L0Zhk` .xմݤ nSFH#0}wygZ.Y: i ~A)\p`m863b;w7NOg_"$<[z-0T,dzk-3 hDQHv<hH@ϝ]v,t*Ҟ$C8\2)́8( 9qљ…K6&䘱>rF>/~y]A!)pGq\L{p|w`.9;,zETp 5LF0{ %)z*umdSa c" u XK@S&FeP/— "dZ0b a5;!oB!/7\n `:I(w~Rw6xcqf3؝ E)/  부.9kA;H6ͻkS|r*hFNnxbnئ)7Azs+W/5Ȧsn*Ұ;Ql/O5sD+9C1uPh E)UH&^ބXF\&j!bC>W@:DxRz뭜~D"Dx[T/ĝW5wD.B37 ?^8X(Yꋋ) %)]~ H\(`{,Gh4 |$ɝ+:4x"X :M'GL03B_[^5 S6ՈϮB üuXFNnw@B=[q]g1TPdvUzWl`ipaLNo LYMl=1]p\k) |&#.8sz^fxpQdBuKxg'/tȎ_\O6U JLW}Ln:.gz2u"dt"up+N绻ʹn.wۊ{l`$lxxp_O@rϾԹ4T`ēL(y.Ws;zwSR0@@8>o+ۂzG0X/lsni~}=g'+%hg(&;_xA nIp$\n9 X[Ix`ga +xGN1͔(/͗RHrG#33>F0q\,3*1"WdDp8z(C` ns|`q(0"9!`wӷíQ~aF .K@3O9ȴg qvPي e!ngJjbx"2 s#!w4t9 ~1E {jI 1z>vst:u0#0ST'o5 !O E@vW|KviGEr;0 @Jjm47rz=ݚG%QznEdЂ^϶D֎z[[-)YLńP +ur ôcɺ9MHLF05z'$7|-;r9N+0[  U |d18Y+\*Z'#,^>Da12p]䘌!O6;rq)Jo#)6 S?ҫD<{NWvHx,`VN/5=Tu^>4"!ނB XtDɬұ ''v!yd[o4O.cd\́epj#"tn #ONqj5!@%E`?<|rn@`_Bv \$_^1Y@Lz5#6boDq];IZO2hѕhf1ۀI喙a)(q҈pZ`lVWŅ>GgڜĻaHN/:lԳ9D8H̚ /`d!R;З`I[KSDl>V@^f] 6([n.xDf^,ozyR= ,\()di~up:G7PsY]:S\pa{zj4F+*  6\e6 Pc%@1[OX @Ig\0QOiD.^n?u?]~G(JgUN/E1san Y[)\/JP'f ]0o[l@nNN2 _3E&!G\`#8B@[-=t 0Gd|p|p/?]vF|[agWMuWN_QOn\Z[8(H[qlSMy'zM1 (@@s>Ǭ!y".H Grh@lipktuVQϓR<J#}x@wBeDU|EGK|g`W_U_mT[]vpqLvE@͠H1)-9%@ n8Fvtd!L] @| Sv_YG붼o3>/0yP%MG8/n};SO[bK}_ܭ%Ehyg! URz e'iϫՍP':;`]@j Ӂ~iqn2 PPRjLu*˫Taj}>ǩm/J~r7W~ѭOcxsu?_ `Qt*/Z J@䪌&,tK_uFzsh ^&2Rs]X; L9WDdl:׉?޸(pBiI vȯp%0δN*Wv\r7nB`jV\^ȟ)Ȫc$?9WM!wp/4u@;,.IFߝ$vG؀=4/T2-`'ɤB!_MNWs덿XÒ9 j !mxKՅc$CKxPp~ٺR,EZ9}עp 軽$8?@ǎsex;~.Ma3f+mG"Ky $ iݾ_ȌNL$tes,xgv#nB#?U#": 0"4ͮ%'/N#HdZ(Y#֯)H_rvAp]4a7z|,QؚZ:sM`Fh'< L1W4:4#< j4NHbl[qRQ3, R}WDrP3B u׵r˒hQ:`7qzzIM!۱ \1t'趜т1,1Q/Y^/S5 Նu*`XI>|9# *ۼ_ρe躘?p쌰[ '<:#д_}yϤ @8 ҝ t͊IzPu욭8t6悑yAn@a@R ` CH u)8 lĴ,9^yN?%^_ tg _ρI:X|.\x">)P7.< (;o>(ұ0^ 2.xa"~\0 sD=jd|ݿHBJfgʑNr{n1Ahjr*|\ euv\|x`7_G^tFi4S X{,ɇ' AH76RgbF"}Jz8a;jq3J,0 jz#A!hBt2%pi?3) U /RTAw|t.ctg%7 v.5RT?Hꂩ!hQR9`O/j"~\K~Fm)!LŒ @/ӝh].LbI0aНpT;sFu~RC; R g 7q:fn+uTD > )?cBJ02VP':g, S@n[@0@3`* B_#Fp 7ZNVKFb[@n5E`7R˖Ҭ"} pkC-r% d|-"Eh+N ƎUs=l'-Vb@ 3҇ 6!u|@@4P^KIֵնD*w̤LJtw[@`f& .NFwF C%#XhÁϻdk`(/T:Uv5Z 'K7 (+W8}6q"domH]D seldgApnZlK^wU-`3@^JpJʫIV1tiRC;CY(^.j/GK0p/{lz|p]H,a0 '\.49&ipV1LSz䤀{=N(`02Z\0}2-Ed Vh/'P #HHEe30@f5a LfTѧGlJEfmmh\SAy4?n2:`|VP=v7IX/YB|%}XD ] lqFlػɩ@ma@ 64ΥTh x`*XYCytEQ@\FK?9!m=EjbFHb^n.lB*2.#a:8fa>ұ>ezlv&xğRy*62!@71$q 0LlpP/R첽QW]lPbX^wVyK<{08wDg|rxvFbkj[3MƩ8qb#$C{l9xhO/el~jb IDATa󇙲ֶHkxzTƞV)oQjȆ[ X8  _#&|$> 1)tgq<<VOANP{GT a7 s@ya E9epF@H1,wRtuJjHv2d\(@g?B0)aQZ(ڱzEo0(=Kwpa?4,_4f&usX'xH@0.< aQJ2@iRe0Ű0QG4.F0Y4vWN[|m %NQeb]!%#Դ>| o ] ࡼz@iF[ K-lݬSfNNOz ڳa8,ˆF=@" ,4'׈pE-)Э9"I0 kfpUD-B0 TK@aT[ 43c/2`%͆I6-?d0B1 OC'ir]9(E'[]mT@ęd&P\sYvPaTQ" ì.X\=Vfxl+NGldÜuK ȤSEQP<ܟ0\WpZ4 -Nʓ k? @J0u/[@6kY_ݣ-`\euGC:$sYӆc& bZ s%`lA'_ xY 0?ca &z馽1DyHvCNE8bk.W3w܂vM[Zyt^y&m &PyCRJR ^A-YoܣtK.;)!R1EYTa-D8|pp\^uQ6̭ Ȇℷd0Q"_JF8=It@s#P8yZt_/Z`boM]X.XĪN# ww?d 3#^zbN;3r̍l57hzR CgDs-za.&ea\v?1ؐ)G DSvOmlãpǥVY(PDƕo@ 2[@0Lmqc fE=~\ph~3r"$>ҁhlwߺ|qan:La6n(F>|+SE?g+$H\B4UݖIx$b.[:FmS9n$Ң&9XM11O6b7XlIN%gV=o{G*fΆ/|Q`Cb@(:#l^j4za`"§q0~z]of) \!l7 ZHī%_P#u$~ LOUҒGRP;FJ露2,19,W^)fμ$@ŰԦR0Oa:X/u6B/RH `»8.3'HK*g2gH) 0 1D[eމMٟ{q 9 :Y*ztd0%P= doQcsb A)7-@ 7 s,`ѱn&ZjHȾ~F7G+`}<[jWqB b]Gq4]}T<3I[c,:ɅaTA-Vf怺a ʯ+XX[$Z$4zƣlp;QgN"h4.{-ZrV [`a :NfKQU&D>. cz+L6G~xepBuEGxP+Gqe#Jfak@o2!TgJѧeJѲk&8"-ߟ $s:# ߒ_iP=n.8ϯ%0ݺD0>a@2U N@ǦP/A) 4|q p=F;|%i Z_1R?#n7",^?/nWdQ=d)vap08XV48$ي{@riGM@7]Z@窕k°JJe$r&];;;J&m2ы=d9!P sEoq0<Tr[òā&kXMna{j8κ`8 /o%V+`MuIvĉ1@o.Rvn5g7$aߺ|<6Fgl-xH OH[@ `&6;`㉰s\> |G$7D,hV8)C1eTJg+1 @ )o5, s\ʍ{thE l_0n eA2qUvqVWFs$=>~.pps| ђl@EZ IO[W>#wy Oe;zA7#F")'j77T*ʍ{$0/Bd a؝a8QΜ5c΃Kp.6)9lȡzPd,:C{]u46`{]@xLTdA`~IA Xȼ,")`&0;C PII(R9[([yjFI^Ph\0NJ?߿pP$yV {h82R>.g:v9˵R=ktkI)XkFDל`@׸ϝ(xof?/P$PaouѲS&9"s,p4^--ϻ)ׄHׄɆW;7nyt,`^[&y\@h@,'JIP^0FJk?c8thEKiDW(_gq@/wT.]wքԄa[q0SGoۢh8 ]%lTPk3")Y>@ :sȽ`I@FmŁ9HEbƫǫ^)Lׄ(hұũ+Kv6ٰ;^Jv&x ŻK9x\qKƉSׁB ~$6C*e"Qb QAt4$AR{!~:$}v8ܘhO/?E|n'x,dSS$7 2[\̢|v/$IiLog%+!ti:xb%Y?P;w$T3ձ=, 8[:;ةx-!ȵ`@wpfٹ/$ }gr!/`d4?rL|`Q `#I~3ڥWBl6u{7m.г`';5%2̤ݙ[O"}Q Ʉs*NkGGP"Betg޺#YaKqh9؈IIEH z7I; D.G11-{ H8;E z-%-ܶ;Wf;>"L,O;晩x x[x{Q{D4jO TcB8tO(">7c4̰drw29QzqYF BNLTB[@|0+֝-9옅_g31V\j8`B ݙE9ۘ(G%̎bW\ w NJ KN>)gÔT]ʬ,glU,qnud> [|Z9h |b/Mӑ< ⤤"]hT92)8Z;wE @ Ndv%D4DTcsdU .9 {Z|bM Zp}1w #L4 gT#bÞ%hkjZ )[D3Ŭ*DdN<ԔPH-hL9z*F@9ii<΍ӂrNi+s@q~@i?fdהPپlCU4 |,P<"\==0&YN,΅ۛ/W x,<-[lPVxw0|#t\iiee5_#.ĺ>=TBzw> U3kpUw|^P~(jLbFo)}@NP GZ?P8)倎X^G!MÈu5M Ԗ2.x0n$hi9+RtZ_92ΊR, w#NJjjj?҄?)/%'% -k%%}|0ɊUk\zO57 )hi=uZ湧[T2 zsJKRenR#ϊCycz!PIIMonS Q?;7@ˎS!x͛ k}D}@u& ׂJžIè9 S{S$Pr67\pNM4 RT7)&P#ZsrT=-szDƣ M I$ H=qj9P4 s`5̿DUz.=!u@0FèȰ'݋z'ALa0|={[UsG v_pQw̏<%Ui0 CΟX w:[[w+ A#o|7 .j9{O <--0&(btj1A;vOvo8Mcaͤw1 lV 'dGE\pӌe|NiWG KzV-0b hJd Шhu8t]xP?QL0l2GI -`P LH-Ɋy& 3wci0p#IJQ.xYeH@D i<<e?-J Z@@E iy0G#a^_r|]M4~Iuu}( Ώ?sNF(ݣ %I- LP熡Wz0WxE V[``B#Y.ܒ$H`(M pqvP__eM(ůj r4xII UG[>`̮#4J~~&@n[&`74B- 1E{$Q0.& `$_.75]a)F . U낱sj w l yA}=t49[&? y憹L[cja1:P:>t E fӝD4tIK;o~/~_}Kzm| j,,@k{a#7}z`0h;q==,%ܐ10쒧ӣ-|*u\5KB 2JIx`~A;[=A1],%J~叆9X0t"qy:D4L]a-F$@jW@ ^9ȞW r) zl67!?Yp柲}ۖ !@Ьo@}@@m *}c9ǣ[j*4@O&9*YJI SӴe(;@\ 3]C]q< U?fE?+-]4,2g,T\L~QLYjyN @ҶX&( &ݱdL<2V`T),Vdfl+Sic7h*;V IDAThHDx:\4E<٭*b:0B(m(2-#8",LΏ˝5tr `99ԯ<jZNjx㶰'\H*$C^tߤ )q.X,RʕgVm#7b|dbaTOAm$OYgY+ZøQ> Q>ꕐgQ4c J dB4dt&'f/m<ߧL&[LHL^&pFjY y]rdOw{6xۣdQ1PCܑӐ?+!ZMHMH樤{|h |㛻dz4@8qo &j~+!  ~WBi)z0whrz&$)B8T@gTvz|hu#!0f$7ɂ ߼:ӄp)N!&PC~CꂟͽIWA";7)sh]NgӻgCm&C W/!*'8_4"FAu88Y<vCt X܂Сcj!nu6?pGΗ:ز*Z !9P1)VXNcK(YtMzH įb#ݭ"g*p2jʛb=3q ؕ%MNcb؉n,m, }/54JdƈVYqSTlppKJR ^ŤX2v[@ohDDž,ٗ? d~wPWةؖ`͛vhP)Tz@j7u\e- ݉~<`KuT@QNvb]IؖٳBoKtkdV |u;0 rbw*h-bdWBJ0SVfVzx"e-8$U , .ݭ&Z˦Xkа"wM81ӓs*F tĉMVZFNlMsRv#Vb0.(sgq+!e]64I޲lTJى#(׿d\*X@ʀ 1,Yp+= S)sv<`8~| gce- v%˕.obR4R>T(3W>DVZc, ~%|p;J dKh6{gbd~1I87vvefp>.c+!峀&0+CWJ*hÕoogMk>S ޝPurD4{5flL.,9e- ~OH,i}IR%4ve\5&gM/,}ԧ?o~2@Ƣ ] i,_MD*-o'?9vL4 yT Έf;>+?z@}KK,!kDy: E7Z<4}yG1|/X>Yأ/ h@T]x>7[!PoK-ԝaxN4+N4ܤt'[h 1!TGzN,r+!LC-0JtVs' uu;5`"s>Qc"=-6ʿ{g]}P[4^W}cVB1@gGˁ<:%F4;A%hh]<̿$] !ψL cGV3~k`,zsH[Wm*(MK}tBT؃ />-\t{Ccgc>ߠ{p'hK(\eN{[">dKG;y Nci q{bYOkcMJ(wׇ@ndN{(Ci /rtrzrׂK4=Y c-bV % LUdi KT*k88eF 9;^L PίG{H,x'CS38%S-Fi;[\'8$D==f.{ʛ3383+|td} <$6`ˈ,ȢNy ؘr\lNe`9t.mDn?h \.x;`ֈI:nN o~N I Z@uuZ%&f-r"ۧr93= } MY{n>8.Ic>ܺ>&02|n3Iǧ(j6`uE".og$'I#h_jŽY9JDCT&Fwnu>o"\'O]>1-7LE+F ˠ 79Mg?~0W"4r@muX$2@p }@|jC,D&$Cj'Sƫ&zxG `LkNXWgnWGg-E# }@ce@"r}?}F &-BAPQ"mqC,z2S }@|r0XL0lh/1ٜKT -؉ wRKg~՗O-@@v% }@<cjW6]3;1Vpmy~hu6{gk mKWXZOy3!)e.htEђcM   ~>yoIOiYv"(^/ \ђ06ЂRM'D Xk?Q &W5&-pǨڜm##>]gX]QzBѲĺp<[6CZ0f EN!4ى=tsk=4&8r4 !B|=l1`A@m.xR Y\P ¸}9s Ld}㩎;\`}1>ϥ_Ϣt1[cMr _cDy?/h ^ &`FP(i LChKV^M% *gH&‹xs(=~7֣\^(/65`ꐵ!h6BP\&B(̤9''W_T-2$6:I bǰO.8$Z m*';OK_נh$PSukH3 `S(RM?*NG"t;fFMȸw- 4/hO,|+WL"wd4"adg F|ƑV@`-z޽{k42߹{2QULC>*O%L?N/z6FYZP<[#ʳ|%V'XWA^WBhhr 8<Ðw@~*'jP3vLN[nɨC#8QDTLd@}KmzlX 6W3?1#x+WNr]<\2LxDT!Pg(&GOs2>_`ĸV>WdՇ€,-t{ ڲLdc? u@Z-85O4^@ mO`bz*9"Wʓ垓~@DhK,3bP`޷@fOq2{gܚJY 2'f? I%H]_C$RQ'5 dqw1nQxO| Mjru=zW}٧PT!o>ZA)Ѩv fjeu4'[gRϜ9+? ,74'[OQF ;ɧ\GcvV`c-4?Ϝ'>P%ɫ|L:v µ]UZ"˴( َ "`3c !\3_!*|.ӗ>y˯8;@,,µ`*-Dze]̭03w8{,ȉoBzԭ(?y{!˽K}4cbgoׂwTia8mdg -Tt7Z%Ɉ> ,?b>ѐ^ABy?}_:g5 36ׂ(j4SOS#붧(42\DL3ird?S+fk µ`~0s3Q:h3X_pcq.GN+HUTgWw 4 8/8@Ѡ9kţdཱུSkOgCC9 rML\fWh!3gGﳿ~Z07>8<.yoRH%W`%O6ozQ^ a.F'H@IXnT̓@}^M^rҤ3`t9z׫@uYUL0ւ.xsc%- &p*`Mfi!"@p' Be6Մ#^F` VX\ ݶl=.+!HKczgܚHȹh6{z)|GԴO^XPk:=5E NO;wM]Z(0;{o:% *v5hIȌQ_|qw`h̔?ǺyG֭[twwGQ+狳}~!GgHy:K@'- DHbO!n/ƿPʁ4^9z^ĺ!`..[Dv0J"xOqͭOۋ{NRvTby.xѷr Olm[7mw>>+o89-=93oep ?~X5 v5,lI Q2xDs|}4p} wӧo/?-țOi3= 3nnQ.xxF@1 ϔ]ܲo @xe_úܹs4d, ])Dz+H&/&F3$ӛn@ܿ NS>/Fsۛ[Oﰧe& 9my۾;!DCIC/}m!5!GYp/_{낳0eapsi2k6v->I>:U /X#q>pJk"sN0xL#&jbg,ӒjG=pmN`@(gdOuF³3}tb{]oFif{Eh-@`@`OO.u .qHc~WK:ڶ]A_B,tɑ6%-csW|$6V}$ X㯺dc-{> H/wnKYS-9\{:ZP8 6 0lk#RT$Nv>]B^w<=qD2o.NP(H=S;}wśXsa]~huei']}7%'|( (WD gu]hϞ md4_,<"k+OQޓ֝;vmgern%8*X7XWxc[e7 2{DMp%y艳'Cs ,c{I]zsT*9QMaߩ3 vD\1}le\h D<a.I7A4*AJeǪAK/fP3nhLNbJQ m'n= Ai߅+ױtwHd26`rT|N9Ւ?9 cxC種~+6BtߪQ]&X_8yǵX29kքLkZ/Gu pF00<[oN5kr`_|;Ie\R\MR\MTj5kRs5\ Iפ&5\ IMj.&Ͼ _.eIMtDIMtސD IM􊮐Ԥ&5IMjRԤ&5IMjRԤ&5)]jS59PMHҥIbp:%I>K?/@ЙwT?W$"v1Ҝ$EnP8]2}.U1}`/:۱7LE+u&]]}N1-ْmd.J}v- cbq0ȹC)XdNтMk㾜> A>\3bV0iD:N/6FK~}l% 칔I-QIxJ B;}Wp/s x+'*`j!Ғ2P#LQ,VNW[vS@>h2d|Wż.+j|i 6?QI33-i&93熪{ h2 mr+=A5׋D4d3 64$)>($;C`Ksyu\8fw/4^V]s}Z== I-S}S}~9BfXH'\XGQDwǴ]Z]s}]q'@cXk?Q &w`&L0́KaNG]0baf#ޗvTk [ ~ Xniln2].Z_\FxX]TczP 5쪮 V\F:Zpl RY?X0r)ABcpIn0mNN_4^Z.C2:PC}^Ce4ĥ\5A34?BLL`@[ ;$vvOPrzu!xA iǎ:dmMkoɼJ3i+FW7ή?>F1z+I#[ P0׭MP0 T> ӑH$O><4tsQq9 }Id)JgD(cح DD0p!j"3HA 1.s?:ĨkD}pu8hn[ N 4B*ͮ Su"tA @g_?Fёk Vk0isR { Hʸ˟\7i!bkp!<˭:)}R娯TR4HpԴvon9 @GЕdrTf!vON~w1&:c s\ 8@|!rSY5(P>gf腃fsqnn9\ RTv"nO/h->J]eRΩ>HB`9+U}]B@['Z[dr?\[F#pH,{riaΤ\dڊtxBFQ_5zY- 4/^*x><0.膋WN%.8].#pX]g@H+M 0lc wh\94O2n֩!rb?V: +U}}hssA0 y~BRs pĢ@p}]QU_,2ԇK|,@ԯ;&&FWWWWpI>@*Oaѫohe% odd]oQL~AV?_uASk d`_r$UρF_ V>WdՇßIz (2ZF><6 QQz> 7^u=ߕ._xk/}z[\;GH ?(} s^}( |C3xH^vڻ0JkV@UB `;}pl ;߻@]@+k(/o4^YKaQ[l )G|vǤ\̻oֻ"˕5kmRhߴ-S~2*_|]WZ?S&9#%w4 5TyW.9Q׿ݮF GFmo+A6@cqtya0&ƟZ4"+ΖY9k9t (  z!d|Dai>y)G8|:[cD~ c2Տa "ǂW_y@?5]x^As(O otFȢCj1^WQrhuX/KU?tx+qyq35kg/crX~ 7>vWqy|'~\#_ WyUE"w($I3c<)HJl,M.-y^XMoW +Ly8BOTzX}oW@+u@|AN#|BMf3K E W=@@=:BAW[Kedʮ_D(kD}A_[%wgoXye=SP@((>P @`I/ꚿ;J5@Df@r}R,AhWd ! Af1D^8JPehdeQ!2Hn.ȕ 6}ʞ Q^0@}F+{~@C$J@Z Z ?+_-;S A=t čgt?$WB\Ɣ;mNfs/c-+Y+`e_\~?/xLSdniW?\~5ɕ_ɟPY\tc9I"UEяվeU߉e'TPzCT?XHIKp/Ti'ԗϟP)!2 ?L-vOA/el\'@&!'З˟P9B 7h߇A(}F &KȝVuW3$ w|}T~ۿ`<EGA)_c~9x<4*`˻^?~8I<\_9ٿ/XQiYkN)NsA0 4=8*Ѯo$տ/XA43SIWfC;sn@T P0]~6w p`CCbM`KBv%a_-@׸_I;Dґ-ONN}s4%ǚ@2&#bTkB*k8˩H,s㍥ۦcx ZJ59n",jp_f6i2tD蹓o ^Lpc9lv jM,~Mp]d \G|iH* W9V/wt*əw$*g,̬_< N\ =k JS@}Aᄟt W;#Ds["12Iab a/W'.5B 4) e`ƙ1">_ ЀC_Xnc@kT8Bk+Ngu4M!(.^yaoa!Q f Fm< X@:R WAMMDbcw<4< !ūN`NN T> ӑ #>%DN)@a6^]:0m$<~n6)`(,BՔEf(tz^7$H H8mv 7 }0@o)rբzu}nl>" l@*xڷI[:rxق!ohOWl~^ YЦ a&P wƍ(vMd@v_;o*m}2"ɐ}DtF2.n(ˡ| X02cQ`_hJH ,8b>ԯ{ikR2RՈϮ8ʳ7p>A ӡ JԨZ|emex9;tf}/I+)rV0)FP]rv^66ƘSH>v=CD  O`{X}L9}uˡG^68k[hn >3{B s Y| S&[5פ"r? ϖ#~ 5ȚfM(M_~M*ۧ& IDAT5AMjR乔|:lxXenN36M8UI^}i5:淳mF;;Lvnb]v4!@iv/ka-&w%}n6n'j 8dFyAxE##Di%&z?45MFYh ^9^~!DwwGv4 {zhÂs,Q˶!xT_P.Ht.l27)N9ap I߆~ȼ {L%xD^}|&===67+d7]>/SR{@n0Y׻{zrӹ6bغ\Eha5inZ[];D!{T>>֧߫O@Eta`mEd$K0 1 ~h)m߫bx"! @Ux_E!!_A_/֗_}?Ck}4H`cr@ɕrQr>+|rvKOӍxՊ }@aCpE}pO!_ O`@`]"}lfi)[^Wp(Tw(2+t9_[ 8U(J-'X(Y~S Zz^LA9ڜ(^|64Å_@cdːBvllebO@$w'o ¸~{/,1f[U> 륇H  hq ɗ k `kܿC#]C{څy,z?OO */]ɔz%./P&H%9>uEnK>BdP>qxV@Yyg>0IH] E}*, [C!5ZW߇~ !jN_AR%)@'܆OeSJ7@$A5'>}:~_''iZ.}TN5y@p{|p!ܿ>f^Um2+c'E؉h#OtrÖiz(0lE:n6zeŷ8 @fn;.Hm~fk5 8L W 0z;(\l- v&m mw:,:x}$ &j_Y7ar ` D9lL: F.^ 7 PWf U5 @*Ai":JPj@Թy-²:kP4rlt s(h`v0@KŵT \GFȭ6>nڹ1U#}2k}$ma j }rU oD@f-Ǵeb-^6YC L@^xm,>&P@~( KEH(S2(n}` MJ~iGFck C!M)tiP₥-S:gLT (6A+3r4$ 7 H{Z2Xb(_)~7̢L&B-_azWR.@6>\[IB!DH>Eш0r,l\$!'/y%@LHO8 ߄"; |L+ަD)]0fSMaSR@^RX6}[) ~1 7|ND#%@̾f[Ma[f߇$#;t"mqGԳ8n1ێ" Ym; 9A|}r1ӃI\HvPbxO@^y[!7k}5'A\EoEEͳPU%zJK W[|:T?74gP5 h<Ufӓ+\a5@}ϻAhp6f&y dc1&@:W;՘A3NwOYW%aNN/N+ qC:JY L`y۾¾&.gmk}`,,'k`H\-aWJ`u; UPxkA^Z0)-`g? _x`V|C/L^o2jQr?+gEr ^dOsওBB'v<: Ul$!o/#"as ]ѤM/U<6V'p"+i[vdrj>Bß<9}$M$s (ux//*'TQDH+duPb9m%RQ[lGI<(Qz2ai]ut*_%oGǻOxG=*ޏ[DEPRDVK@xmo#y@ؘ>ACR.Z,W*dʑ ]D_TBʟgwN ='V(?-BhȜxm3 WN]+{Kp++"\H⽴!gd dQs*|arXV is2s2<&ޮ:~ Ir ~qC),@d9qU'pwsTOg$pTR! Tėphp{ ~85X@n3 @)(C6VMr-A•:żN!Am)s8danjE!x>Ry t6@f̆9G)@(*$tȸ@^B ~pq%(8%uG љ8H> ~ (ׯ f?~4n ]\ޮ9%$7bbƗsM)s8'$V:Y8Gxe ˭^~CtrυsĿp`uKRȁ4]>DT PѧkXtG=<f)h%vO 阆A\+ s4n/&]%HFH/(|U/_'KWb%ȯJOOf/oq99#9}!ZτvBz,\ Պ~?_rΆ$ZO|X) 7}pka9g(Xh^~a!]kUx?}+Jo l@3qHZoT(B7@~qtUdQ\$6ٵ`4?j&oTd5W`/_%- l(BX-Z< { ;zs&p F(}b0P:ZXII>'WrlhfZLHVs[gwT@ @%TpS SH+)}hvIdeP"Yʹ ΙarqӪ"(y~^, l(BZ-V`Q,eK^?M8rN[(3 {E5B.˾X~Jl(Z/6^mPu9#(,R/ U8c2lȕc)y F8've (PU*G#Jz*Fuu)۔80n#ijEVKZbnJbn d܎:`i<蒑$OM8goSS0}v-ڑ&Tx/tJq8 ֩ɯ?8jԾu| wa;!q8U*ӸQRw$>NZ'2Bt'DcW/k^;d|ek'D;u~QwNvVMKIMݞ3;MShg#"?Iv`ҫ`ZT#RJL\wBPvq4;ԝw{ݠ'S5evq6Z:8NH闲|VԎ4!6C3Ss! iCG:Z'j)Sw-CzEs駱V\!Gsv~zm; y94.%K\!G㝃|I%igB]88"m@l֍#wλySu[78j~uւv {N@ÝŝSG͈*wBV޸P%o:: uo*vmUˬluԂTVI?կK_jz^ ?3 8+ˡc?%k_/tqvƠkKs|| ?>U󂱠;?c2{ub3=YG|>܈>kӶ׶W^/iN o?2u`;2/{Gyƣdgۺv-'wc˻1=կkҶ$xj<|uy+IIpk? b_[%U^w~o€ Lc?R~_+RԊ} `oPvKK|҂stgdkLq!_/,YR0QPcDfF=oOF~3P~o} u?=?EZJ?:俫抩oOg~MܥW^/?`b'of4,''F'ފ?Q^o-m1mkbietT 1:G>ϷyO`2?3w^zN{eGA k;:lk42VR=N>J8-35K?~ ɫځ[7[~^NKO'S )ił|>,}{hчZ?҂Ͼnc~E>ؘg`_*- &Oቋ?ߧO?{e=/,-l: it[_TS?}G=o S+/7K_Мb 'OK-K3d'#!{-W\K>J9GK=- [/aN=;a)ߙp/ ؘ  J݀z*R6 Jj~7 5*ڿV>̓P5ڇ)ϴ4*yJ364>FiƯIڧ-?f]wݻPSE;SUJ%y>r޼(?znnyv>xo||R=Zг7>j}?Q←^Vݟag!FZ?߬}{{{m}wު+=xӟ [w{E IDAT:˿;e76f>& |h;o[?T}k :wU;oBGYZhF/6}ѴXXxoXxӧO#)EEF֛,o~Wj>P‚՚[RXWHjK#V䫵OTmߢ<fޥw47}Tۯ5Fi)h;oQK>[yEߐH=pyjOW J>ڈoyzߒ襵կEjl>[oٺ~Jv>]eXxD+䳑lI\ū/UiSgܢfMoF F[_ϋտ6@7nU,]-J(r"3"E+Z~67vps>rTQ.oQ~uN3z705W|EUY7\m%҆Z,^y~~ZzZrו*ݷZoڮ} i7o߻-ѹP}j b|4ʿft:z䧒 P?[y^kTWX_Z2]'_iC+9ZP}Uοi߃t-NWP-_ɠW?)Yp gO2sC 4jM_x"ksJy6}V]H| w)|}IپWMaOҲ}w^o `Rooo_P}>&VҾۯ_mFlm&?J}~<Q٬v*m|ۃ#<oYmNHD}L^}rrlߛ-_tW2 W^Wd7WNj<>=>꽦uK6x݁4kINy7<_a 1 HPp/ln,t9c80` q8PaP*:(@w tځϣBS`v8:Hd4zǯ&&/uq1 p6I^(L~fAmNg`hJ\!ǧYc̟n}hFCm|>PG+! o0p> d6%qB7ڍ768&/"?D ǭht[apy8;&;W E.es6?w#@B~SoDA0$E`®Y#, ЁL$oh H9jLۏc|_(r8P:9"N$`h\CS+y8FH;_fGDD4s\ Gǘ K=i;6xA彥̢o &6T^n?-&ҋ{Nń^辡v4 .g(v޽Ey)Yt!\dlRD7/.CQQf?0sӃ̪ s4K/ҋx^a7"ކ,!Q՗ {h1ڭ {=99??O+O` - #o,turr^S]B5PcaxzE>xMV8e{O_ AwDoo)|ܩm֓l?e|"q֋=X]h v3VFãj"MD쬙LHklw,ܭ@GVYy)d a5 _b$__1d\R§ oیv ?g~O{Yg,_,L=x8 @P7:a3Qγl:[gI'(Мոcpkpb=9Ϯ-s 4@>tu:r ޓ/tJ0lz;9Y4&ah#fO#z/|Q\]{Tzz)an@-P`^dNw- i`6ˣX Zf$&um[ %*|dhJѰ<2_FD ӦV3h΄aǟ=91Octxwsz=' ]!;680@g!"hp'#b]_e/As Gی>2]2/xczl-[@$5y_ #XS[)@6gG/ vM7EmwIuxq9: #SXnjٳ2to7gkJ}l-$sT29U | Z 1L"d|P,<ǣU*x/n1(zO`+q?Ob:qe2`C_V`o0jp`60֖'J|%Uö́ |"iOOOYk!hF+^+{9C+|@&+8OfzNd> ؟3S3'{@)}z 8b K c%?x.L|??W]K6YoG/?׳rn^)?أSzn-?` Sv_/L4S@fP@` o!r{`QBob# -i1~?k_A?+f_ Uz {Y \J?d"ÿH{nj H [*%1 3)('pqJ>t /c(б1CPP-=/NzΎBr&{65եSīp0 eyj t pMj$-c@^{LGS?~ #p0@,ܹsa;(ZTCfM2~c0P˃@K nlr=%&; v7#9"V$7_ȽMwˋ*PE 0j)c;?:>>.  pȌj],1pN{dy1CQ0@8!e6494 i1xA'g@>W( @![?*ǧ04:Px`. )i{$0cK/5_o|I ֣*"0U P<(m\sy@]刳?w,%4$$e'92j dW@V,M7UЬ+$N͟yvNDE3-K% $#0 Cʉ`5 @++ o\  HR)kRYKH|tL8 nN`ɬ 3 Ay@oT,&(P$,87opd.Y 6 L^/5a;,Df GwI 9^4hBAA $48ɏ|F@O$9&h/׋t7 Ah~5x8TzoN/Y+(r$ {RV'4-A)ф?Gijwa! ==д0FK@e$'da >Sǣ!E7pXı>^2c~@1- Eo$: r48^6`}股ĪWo30۱T:IW dxx/hnmx2\3~!*ڍpC(C$I5=BA?!Hr l24 ]U!"G8a?w9&V@ #Gg@ޮޓNGd9 Tp(~ع+rKK%Bq=*:Fb [OWu9.ϔ萊A՟8cX!nP- KhRcwbli5GO/Y>OюhRcgmI$W$oK>~(f ڤ/#rvD O8״f#b̘@.')B.7{Q`_̰ppp~ #Nl<4kqCNTwG}F:R97z`*1QC@)޺,σ p3ȟ">-ÇrQb`>! P`ۦa^a:ţ.c#FOq {X_#1@E877%m 1`68fW\Hg+@9܄'@`0A}b6A:!Bk`P~0L` ad.r@>|{{]Z07kGjy$Р$K!\LMS. <Dͪtq^!3Qhws4,0fk a`ȣU` 3 Xoa,S::1]@ l,n4-qD~A Eh6@"P\yd's"L8y٤^Tʗ4əN_'~kf& 7zc!' ]1m#.\$T@>1 QK%Gh.1 &`.W4>Aw <&ڍ0"_|]P  @ܴ|Q8Jxi"E l64\c<`Y\GJ" 2 w{lX#p^<:C_ɱCm6=1CH.$s$\>/7BH> Ŏ#@ *sz}'`##QT_@Bkd x9a Fh H5e xÆ/JtRG@ix7dspdl x0Tb1P(U1ƶF%'7Tpb;W?|S> `&^'*Wqe(Eg0tL$e:3MSBϴ0z$W!Ø~leo- g2ágS8kyvQ>|qW)xX|*S 9 +%o\4"~!thh0E\8 X4@kOq*4YU~}=N-'ƨI쟟$z>Xl-rce[ /" cPN5 wِz\ wb1$P?N2\^Y ;ιh6!ij a4BxA8Nl ms;G_ E~LGqAwP&62H EdݝA{̌뀄ߍL`A@~g~Ǔb#* PWAb0YۍLJ`ȟgcGl~b3Uߟ& 6`O8u4۬P~_zfY9yOR:S[ @ 9fgp84ģ<0Nu8."aGq>t@4967r|i-{T݄pADS HZvp"!r0;O1%' vGQ~"ڟ D;Ѩ,SsB k saC$Н|ě]FdMh *H> 6$x}cF8ywtټAZ:*֭<KGՆ4rї9#LPK(Yn+bM>.TAw`R‹ p j ʖÅA @D*7clntBPX}wy =M`NL!hxTAhB| fLŸn2te}01uXY IDAT% BZ*+RRb6T3Ġ݈*7(';e$>W _@0U_e6(zF ?|,oFT,E?*6B _Cx|5]QK1x@X\*\D<Ϗ[i)T3tI0|:g{@O h 2𻸸(e*@LݨX*hWeƠ0v|Pީ.l2wa0׶x|er'XÿWw7Oմb@6ICN(t(`T"-`nZ2Pxͤc QtxVC`R:Ss!WfsY:^?JZ`\sƟ~ߨ*|`6wγ#BQ86tAop%Lzg0FZ{s?Ͳ/ @@C FR"p,lŇ@|c?&@)C+U_rf{aBGd2*9i!mD po l8(s֭#כEA~ 3mȳv\!p+PC8d0lͅMPd7$ sTK.!ij Yc&PIn>Ɖ}b[.E;G?3#w(W@2I9\>ЫS7<![` ;FR}wQ'6V2# @ٚ8.'0~_d!~:u@ܰ/ a"CK ScWJuq4*/A""l^o18Tr\(ptGd @j fvBx^*q``Zذ%  OS#@ULV2q.<_3jD^L滺>DNmH ƑgH xT r6t&$X9E<3CmW5~cfwA\$t  P@ݣD u (fhꖽV%*G/Ή>ey/SƐVll5V ~wS4>1ul~27S@v hR tYuUOx)+Lv0?/&ӟCZǼKpfNz+)hOp f Uy3nFKPP=ϯޗaYSzC7ڭ Z5A,W` Q}hċ7>d颕$7t ]$L8w7N%Fs @ڃ"4 J}k \M@#rrGž",65_5Jml齷~r+*C0@޽/m΀`bƧ%n Hى{NpGW 8ש|\;ԯ?ПZm7]^9v1M*0J{%2V,)- )b: z QhH/ɋ~X.TJe6h-4 @<ӸVZÅ; ! е#09Kiȡlo3[< ʜ, U3& kø=XfPi̷84wb <'ç'{ B60|^d'̋J e3%ms> yܟ*33A}ih)3@M5؉C/2hQb$ʋV`FHf 8ɷ< U;3 -DQ|\!&[ Ak떜3<@CLdOREA-m2yś.ۭ!T_V.1Y`RLM^y`s0%Z? (\'% ~T; O~A)<զ%GRt}`8yݪW[q6$-&\.'vv$cpݖ*ж)PA+ XR`IF_L v}CI%W*fenphdjLzfo;qf 1bw`-T@BnD@@8BtH7T1#?I.t2ݦ8J;kӖQn ?Ts&|p$42a!4" fv%RxCHN|_ L7Iu4>vS0{R`qE,b YNn" H㌾$nN6$ݻJMip\armݳO~ : bL(<Fٙ|DUħM]l8km0ϻM.ԁT@ Эd n`Ή a'X=΂ 8Y?97^o2:TUIk|\~ _sr"p(tA;3&ǫcAlD4Sd#lhl΂@== xhK:~F?FO;8p'%i XH4Tt \k3.74kGMJm9R>y whkz']4GEсq  ].Cz pشVF'<1(Z Џ$v3FEv:%>Q|#]f[%W"QNAvJBz_>ڟ$-,nvOxފdʷ4W2wŸ0nSn`NE<7fm`$7:,5u)ڝlsX-o>Dᨴ? |(ЩvcܭI9AjD~lLX D ‰Tݳm? dg}G\QՂq߅A%=`AkČct7U  &]ob֌Ԣ p+̗Rh WK-V~!&Auwz-lm6+rf4{;NLe aea ߆Lm `){io@.W<8&*8oAœͥ`/nDp $ثz >Zt3G3kq.7SeZ Y|`@Qt;Dm&S:>қќUT_T++: S-?H$z ӑ nKKC8kAoA GWmחJyjqAf3KDb*ַF Ǧx/ϦL޳pu`#27oZ=ADb?oV#"1L7촸X&tO˗+U&0^>K( 4ic_P?՛\ \*x5_Y RG6NWվg?SpcjQY>B⧥tU9݀@!k >,zA.B%F,gJյL9[Vq(-k~oCNg{0[(fNCxjAE"v-%ALyڀiM %Fǰ+y@ЋL'k4贴 _% &*8L}9c9@FxeXx9$ӥ`Qlu8|{ŋ/0ho>#ElAbx7+9(gߺb5?|!ͺtr$hi9 /K0k#̡na_y)`F.ٓDzexytbceip[&z$%x5? E,ĈI ɚtLW+@#!8 $쎧S<|_RPIaWlLxgh!l6r:ֽ>_&@u744 s ZP{dIZ&|dO,/nH;O?<=ؔm%(Ϸ!s&{˦=L_6H++*]ҥwu bpbyTPb`Ó;ه8eWPGNYr T-)sGs_cKXώtDTQqrQާ^0Ĕ$OfСía v&ԕ>J.6m.-lsZ {a6 !_{5y/9FBI-}dwN ֗{yd*:PuEisۻ5WB<~7 xcw,]FO)Qa5 E^Q}OPO7/͆[M0a&l,n"P'WUb􌞻]ւd/ O$T_gͺE-4Xd7MjT_0'͟K /ʢy|B cWJlɈ(./׉8xI+-S0ڭGvb'v#JTg 9CTOf]7Tfkq4&27A)\n&V@͜ @S)_O 9M ЧكOb>^5ȯ*Tm2XpvFY~櫙ؙ͚BB.C6 @1^pEcw+8FYڍz ljY/L@ω$ T0΅Q')Af63ij9o IDATpr h -ب[6S(\/n`*\'T(/1y}k,zy<6ϐ< @3-s l,9g _CZ-q75'(VB X(< `NAm<{K.N:><_^t{Q @|P‹Ç*l:)\{=*of =oCYKQRa90P17J1ݗ\ ɋ?P>  #tcBT!r=9cSգ=zoPz}YF'iL~A/Њhk^McCݳY:ƯEr]@`)EW[%IK_'pN1/ Tx.`x]I_RI#~ DLT{hsV٭?C[ɰUA:d])"|;Ї$? ~6kO>3P~H"T >ϙ5\ s$M< 0Ӊ?^o0賈w#Y@ϨDa&* QBy}q$&?TiCyAn\&.ĢtОkzbFxYӅt;fя3q$M % 3ŒOmBlx%K_9 joG^׺z~^Y"MyU__7p K6DiwP. qR; k&Gy79B60v=28<4"E YO*qb@,sq~r6k*>_Y)8]\3]ts*+œS (_!zGf J O!{(v?q F;WgA@J> bp,DسY2###xe.`>JU4ˆ }|oe!Чj. , `LO\ 21hU'Q\&Qмh ŲXjdv )C(Z0P:O?ǐM`% otF=Ο8gH7iF@zd=1v͆wAS: )/$~#+j\qy[^xw|15@T60黕L&S lvJ{Khx"zd?t?ȇH&mcO&A0F뛟]L"!ր6RFTS`0Z+`gpGP@1iOy5%~csc77ElcI>.tR2`Đdϻe zO"ÿ>Z[щT@ߏc!#ǃ|2X0?Mash?2B``7d@~5*#B8O"C2M>$,`*& ɇ|S$ueM>l@`a|40_8NSpjf 5q)|aj (7+r؂HT0nF?b1GhќR`OJ`wA APi, YU`8s1Gc./Lq*hFh@r& 3?,pCf !5uM )ud .4/q?0}b@ " XӸ N=Ðrv(9>$qt=YNᆔj]d38 ⑼ EM8$N/y  "RJd&:M\ҙ̫Ѝ@#qx@'b SF0xww6Ǐ3H=GGPl&zlJ&{cK%P05S&0GXJ>Cۧ }+W0T@Ce b31af d hL'3pIc>c9l<F܍B<)cvO)[>2  z8@NR!w?3 ?1kh>태VA6N01~B(ȇR:7`+HÝCq?((C P@6B؀Eq>rQPhxw󴌑j./b@Mst:)RA|S73 (CTBİЂc*0 0=fGl< { hxD?Q|y b.@;b g; |X~܋Gh4Jڭp q  3O[xͩ {ai d-;_dz ԚodS&=TDg{; 2#Vy&vݿ3??#|ʉ<$@@=Re2yVOd7Ѡ΀fU懗'.]C8x7\I}GǺj|Hh'^<#@{2#~E/zB`l.h&'B{E4| ޅw5[jAiP @:. c; x,n-RfnţN~{ fhTǰxZYs(`~7&a`&]Q w=yW0m '}tHr8 36lYyP@މ<pJM^.~-DWtɋXwTG\@J <ޟ;> Us+@`GFыF@<0 gb٭ei.\( 8qX9ԍ {֯O6N/Vp@Q1l:ZM *( Gogp^phu#;Of6$M߷7K^/hZ(ԁF?:I`l<'t]4av;Qp@)*`'QCEQ9 C%J ?ml'md`r+.P p^ yc䀀Ɉ]sO!ƃ0lz:`>S;p3V?#?m v#>\V,)%'V80OxK#b;/lFAaB`X` tEBP}.ȩ~j\n ZCp L^TcHam:XZgB |c `n0qum>tRل 4F`vGxh"}>_H*,܃@^ZTr]!ES&<a򝯏߃&i6 `_) Wh+f 7P{ B@v>~tn2Ga`TbC=T@HF A WV6.`؅x$ ڴƕb[񮥡., T})ڈ8'xOQ%@麎۰8:1NIO :1.37>H3P@:gA]Qw:GW3rN> L.'eΧG71(Z @l5Hu|^?(xe&o\1x|:' (eq#~$p?!D Hg?z@OΟ*ZGA~|_NƎ=r $vjv %q(pݏV`{/t4GKh~ ?&@0̝l9<<}W>&yg y?/T y\]@8cxǧ PX+K*y4$0R{|mas:_QLلk,Bd3xpCOVTСkm@@~sNJB=G=:=mdh}99JS #$^XL ֥@ W[>/I#nV2Ng(B-%&(mm0RǴM"ͥo4A1gk.eLOמs֮]{zv\y8.*Jo!zxqutTne -Q^$>Z#>H-I?7NLw #{H*,)l yRЇ_qD?!.n_&:la$.ހ9^>X9g€J ,[%m֮nn@PӕWCs^:j6!tH/6z?W :jO#KFP^5xxva݄609\Ef$<ӋYO hTVrv2?Txq| U*ؒb8,/g@|G,80 _N^qhA'ST(K0{a Y;\E!Mӭ+ +/8h?ڃcF4,IYPa:{tEs0݀n$lBAruōYD%9`.  A \};yZɡ>I\/8~\zƇd|^h|?̶U9?,U yUj,v4,c OWK=e^xqx?h%0§0kpBJϱ p-D_@0RHᆤ4}<.jB!rϞ@G'd~}L/!1%_,~Ǔs6LG.9/af g&H)Q6N*0ԁ; ؃$ Pi 'o2TtG@|;_4gnk@KrwD3I~,C!vam^ 貔ƣe`jr84)U߀/\T8 [C߯H :,S*Ǚ} A\>UI9dAyAlIӁK}(qɹ!+{T*闏4A :P}H!V4ѓЃ u1)v.y7bYG_/_7OOw8PNFLBh~nd *{=zF*G5Y.9WCe:~$竎ƵşsZݟH%?)Ũo|x|<<@i~JD#o@ epYw{(%) ߆r>g_ DC\|^F' X g M~_z?#I;f}tY=܇#=\2?nl7pcFA J<{K$´)*5KK[ U@KaYqH)S guJygD77^L94!NY`p5nMCL?z >[c5#F}S8R@?B` W7 MAڳ2Š$j0c^ #椿˻,@]}!p::@']K@Tœ'b.%u= $]OI@o"UY}t.I%TQZ7C~ p>?с29&0(8* $0MF$Ē(Y5m+bq/L۪ItAD(Ƀ IirN?)(CA+u>3m93U$_<ә\HJԄ.{Ї7fktבg#I5ŗJRQ{t&JeWK:& -i`LG1L!M ^Uq1 Fއ OADhܼ'ϗ`%njIJ_¿eU5@_mCkH;A(:Mj tgP1/"h*vQLɇnJ?K%< Ȕ^$x"Ԓ^os3G1r&]?MK-5TwTUuCޝ8 rbj@չW-룜 "m5:(NPqTc2o~t ;{D ׯ_Ÿ;Gٍ-'q S0AدGuT@M#-Gn ]IgiѸ_󧂿 |~18Fu`V[ Z L nykCqmHZ^S9K jE)uX>yRK )!K;i1|B-`:͘-iڒoia_XR M,վ_C1;yj}/_(+aa2ٮݭSoke>븺0L+|"q^]x*3_{'畫UKz{U(jw{ JI׽1Yӥv+QduWT<x+^^iNBѡ&E|9._m5JU8<.`X/㜺檑wsJç2 HVd45P(HC, -}jm ےÊۆ@ -n IDAT_<_@ǺBzEbIP,+W\V[PoPx cimB=QĂ6N= 93V [-!pĒ0y Dt 2@'O!uH6[CsW /23'B'XAZ~ WS˳TC>9BpX bT*Z ^ÃL^Qvn*/9܂HA< ܊тȦB|> q &tz"]aNV]?tCMr~N@TUIW%p}j4_ B` ]yӯnukr v-F&ܫ &cPTt=~U%U+I0#" a)> hܖt2>F_( j@VfAq_Œx UM(G (8fZ2 Zm(N 8x tOUBE^I4zE>-y7x@رN@3B=+t?|I<:'|5ƻCNDw= }ωtU#եn )jjȯ@]qacɃ$i.ډxV>;>eu58 ~OZٝNolԏ잀~0.̌ I&s$r.܏@ tGx =8\L]>VZR!(%QH<0:;Ꮗgsk MJ|~03RQ'oGpeqv{k((tG]  9? H p0zgCÌD Ғ%D:}#Ij4:?2g'2E GTPǻ'7Y)n\o}Ч`^O\?rŧm~LRv&1 ?+ݍ1L%&v0~j/,FFfŋC7AgJr+7Fx<%qԩX*{&ip2oOQ6 !!rR.R\yO+OD8[x7x3 \Y}|7Y/Cx9B|o7F"x:$J3HsS3uC7:dD]#k v [j 0&k-Q&12fTm($ O!|>_%QG+3ZSιN*ƁhKs+IſaP?F%ZXX/;(v.?4(8ls3 [ R)9i d~I,v7iG#usFz~gJށah6(5)Ot7jowB?De"5"ʟs/nALbGn.9_ȿ5oxAF猉㓯|a秅wP,fenSsD7 Ul3tpgLb3Dz^=[ z f0ցmoddjpԪM 'D[t[% _֛:B]c7/v v,}ih~`H:.1)P?3&y(WDW&'OHz ᡬ I&sƘŽ1@ 7QK*2 NxZ\e_ȍ'[Lf`g4 ǥƯqvf5x:(@Գz4`_oeXY!Y)L<(S]PogQ;yi'f>zgױ4'55@%Thi_#MfO/O !"yDi3`F@ 81L3a!aR,c ;1K:-c5}A\>8P0r#[LXjNy'{X0({ \ `>3,ncH)? *!0K*8jOX25ӍQgJvބ'[ @47a)mq~܋&a4EQچL.TMB{czek]?KM[ov@71h&rZ>)a 9DPeAߚ& y Img35{"͞WPYL ?2O?PuM;BhtҤ}F^gQ>q([$+t[!_4M^=ȓAT`Cޘ%Q_`VZ+/_|΀|9EGU)i-% ԻQ_R'Wmwv} C' 8~'F1i7y"\˓wBAAĕW/1,QnF|>"(]`S~`H; ݴ "[SI:׳mǐ5do>SS?8EGT/-0⦟/3#~4^OQ<a\5i0g.Xv *H_f{Sq^zkjkn;V޿嗶baO|>~f ?Э#]~̛R.e @ݙ0 ߓ3=RpɋF69uSDmDPKɻtPΤ}N֗8q!_]lGX0rn[t`U/lMJ|f'~*UN i+$X,c ;`+yÙVY"dR7!_hxG)t(]Ӥ &^?7k@ !&b~g A9kB1\yiy?yK @i2DxZz7S݄PuT0]^\-V(KZ]ݻs)SAC@x9OZkg|vs@C34Y"FrxQM65@ @ h1ta2^Y@0G.$UL9i22"F:1޿}ȹ ƕs C8jP9`ud;4N& ./N`tF|753J6{ΜnU픈[Ae}S:C1|;1s5N\o{HxoAxe2ϝđBqfB?ynd5 p_| 7's<,Pm t`r!8E`?9CiV[{ :X7W #† Et,K1# I(3>4v_ 6MI`o/|f}Ccd4\| ([+W,dݞGݵ5v 8蠥de kܼܜ@IN/#V,}83JH\* +29Ӿك!G-bO \&,Q/pIyz}P@材Pۼ7pTj *Q4<ç0~gPTP‰:ᣊuyK?h?iKs}6O`6 ,C$ 6(xk[+Tˈ_taB-ރ!ܢTm2 +t@C,?]#q(ӕ2F÷Ƀ\~ޮ"J%-IV hPi`qf/.@UA٬6@:LXC g9%+T?Any\D,׽ i|_,0}u _kyH'I,"/ެ96#3ŋVHG92AͧI0',˃+*D6 )a s0(^ i2^/cKډ uɂ\I!mLOߟew6%@c_Dn'nǹӺMc?=9A 5#(ư;0F"74`zEl m3B5C`M|UrgÎ!!KjL'u W K7<).@柳c7R٭W33 Q%I Qv0Rd!4` Cd~pI&"ٓ Q'!+jb.k" ;[E ZbTn> ᣳK|{ov!c pR_9( -Xը Y!S:@[Z D0s,yn, 1q2Q;Ͳqh v~~L_>nEfUP~zz2kC tYasl:g}|@AX[`'8|q( ~D7!<\8pO TY +e(sdp#*]o8Fsi•l@0Wa^|;A9[̂ZEݠM)*ր4|tG Ԕ&L LI3oI Y`j́*rMg5͚5ȝi>/֫! i}6:@>Zj8YOfjB m4t#8a }>rqL'']+] IDAThCOh3|%$K`EZJn4#^O?ex0q  ,YFS"Y&mPxkstB^gGNP|4?zJͬ.Z٠',et2|m!.0w73-Jt20̆Kglq%HaJ9˳#~ 9~ Bf@IH@sۤ"{X)JqE?>fsM#HZ^lUщOճ9 X0@"@ X%2ͧ@g&I`<&'pk</yNLX-7s pBA? #Mӗ:T8 {| >GDh@]82ly#OK6yl9@3cX-5[r']ʲ~dh Cl*H׭ c6/%Ҵ,U:Y(>Pd1KlIy=bFXJÇ.#xT|Jknc@Qm6W}m,:.ס(ށ#]1v3  1_fH \U*GLaTOHz֓+ ΟJBgw2-/(/3 @\B?IJGۏ clp>U厯لJ9 h9H˝Ö݉K+ !-3l)5J7R|=XBˈw.mX0/=C> hY |G*ޟ P1C`I@  b8A@>m]MW,3kl>јtLi'Y>(:ߎW~B KK<$ٚdzچy< %QI3iS~H-#/BK><$ #V%h*]|M٘l8 %؀ pK?Sr4lA@y>ˠ@ҸA7ؙI6M?x*+tT؊#d uq;K4Bx !1}]j4(敕/e:PGp;*Yf(:u߀ . @Ň~|.~?3Ow :L/hv/;FӨyW RŝR0dT SӉR<ǺRb81Hi_ }aLk0~`A8پ%~G;`0Sӵѧ Lpֵ/lIQק)!'1eܰ ,Kɰ/Ht-N]JEE #1C#hL054xY6=-0:,F%ʒjScWĂMj[9]oUI}YR/8aE5uI_mX(TIpvt/-D@]W6γ?M7.x*yu9P|$ .e3$7JP4!$9Iܠ))?Jif+ê8nibX#?MCD1t<% l"cK5E,e B5}jtKmȿz}XSWf NJTR^*}α翪G~1EQ/34Uv\r +(/+n{g;^Wx+-{,0ϥDY hy? qz=?^Ix ?Eu_,ZWI Yno/!L{ PbK{oIvvWq0 )ԪO!vA%*F㵃x%} zֻeM|~)슒HaP%hg4#tUW|)&EW~qijЭXg4Z Oäd{F:pX $?;9//%&یT~&q.OA6hg*jg?Y[Mn$i>~^ČOg_g:(.nkQkb)A|dzA:S֥kT쌆I]68l^I;5nzD\ )"pkM!zT̪-w E^F,ciQ=L]49:Or;kLE[AT ɻ1G''49XAe+BIi)әu}+ JFH%Αkw֭2񀢨U5G4 "OD{RB^?y'핻(g;}&ja+88x&I~Y'K^{(DQ14! H(Z70_-"*w xR+O[׀dPx.%3yJ+F87_D74X<pu mC* K, _|vd_+)##~NjdC i[4&O '/XWA?lcR EU*Iϋ.du,i|HWQ>Ke@|8":Ow˅,ͣX/$p[% ? 2Vpt E&_`@F+Fgy|Q<,7 KK0E/pu5&P`u(crxꦶ*qx ߿9^{VQiVQ~~&Z͇-x{=(?ջED_aLRi"nOzD܉"7NO/>}:3=` \\mrчǕgO7iʭ$,:+ $x n>{++K+4$ eٯ}dU0ީ"nA{++KK) k,@ݘ{)lT3`hG3tdbqu 3 3齱2~Di]T<ztFh'ō<` &Wt[Ј6AIp.+1S˽b.ķ/|6.цLW~xr E~E/q/T5%/L4HSK.H׼*PD"\̞p[% GWH@k6O"/T0wY@pd^&'ٴ+ ҵKȆLfG9,~@ƿlԁ`WWY \TM\@\vv5d\Y=*1X ѵōc*[)T,W ^Tbw¤.>UGey9[>Hxv% gbcFäϷ߫W {1?}S%H'H<L(|6]xՑKkP~`\}b Q\qpk߯T5~T مLJxtGWY_@= /3@߼}VX~fU57r*!~^{OG4S^*h0oˇo>zL$ K?_* Vw3+D0xpr&eƯZ Sx=yE " 2!?o(Ž+P6TfRmzWENџIy)$`*A(a1<vy+.=.`7N4k #^%9iIJ S`Lm==::MmyR`7^əT5Qsuw + ǯhGmZwQW~:4W])/ Wx+^Wzj(^H4? }ڔrCӋeZwKh~'oEL\|p|_57яa!" ̲=MËCmq1*=`[ѿfkb‹z,,kUsX?#DBy7w-lѠ! Z\à [?Ш']_9?ѦPQOY ܚ%?_n~E`ƹuA9<ѦP^8~5lM$m AVS l?:pj.h3z5s݂lAK9<ѦP^8~$n('+|4 5 נP^P\ _M5[P~'ʻ7k#{`/ց9 4E2(x@$6{5cki l"Xkm{iKNjP4~L,R`K5e?Dli+) c)z`T[ChkGЊM9K:@$/?"PG :<Yi&LEk׌\z/4^cV!(2": O/hL?Cy?4kHfP wbWXw,q?!D ` &aSsSCE@@gyXv  9 ٦uƅl;% ί"lTțW-! _!_r^(vB 6R-\&:/T >Z`#>`Db [%Λe8;!;-8eS -/у00 gG^ [%mj H іt.w >,]1<΃&|V\ig}^Knjs E#eίpw@.y02m]$uu J]sƇ n_:tȃIٱ{z@牷JqkQ/ _-Z6P c w q҉yu 7=nh!bպASqi;r "y:8 h[B/ az e(v?:[|@$/_ԃ  ;&ﴎ!|sa]Ջh-R8a:N Z)< oU B_\VX.׮uvc;WM;EB_\EY&iqt@Kfy+%{\+!+Exp|"N _!q_S;>!o,PouAIqŶi] {zjY q~;oR~ AR.h3߻IH -O3kMv3oZ{n9wx9+Â(7 0:]Z\c;Kmǫ6}W z_dos^[O_-=1x_[x=@@QH8((ßm'!k:fokZy6/ue@W$-6hAD͛W(h;t-lܥO_SkoW@5 =zt:ʻ`+½F ,{}|IDATM@anakPpQx2C8t{JrE@@|QD>PtQxp*lyS p6޺z@@qnADl((K nc)^\z{,e[@x-L^0酄?w!jWRt]sq}бS[1L3P`RU??mF[W-0] ɰ( !ʰ'L( {\$;!twy׉(H*w@ | a.:I]k.f'XwA+ 8w\fq! q1۩p?0=#Z/{ll8Uw*^ {M=Bml|DS׹ Ź%[NkNk•I^sHE2[tSVZ3x_ T8-D zn;dѹ=DDZ; - -hq T8Yuhig.+\4h2Z\l4~~B؂j_} vB\}H~}X'_IfR*N[&I~N= y>s-|2<k騺sBz:vN ?/orW Z+ext.0 ZHOgn҂M  N@2(YItF2|T1V Zn>N|g l5{`/BGwmO[+Nw%Dmk!=]矓\W=\!ãky+^Wx+^Wx+^W~eQY$^ţ-QW>0 ^xC4W~LW&w\ڤW.hsV'VgUO<_ZLTk^qŕz|ɥZ]|_;+ܩJ$`#P.6z88;+O ~6_l剝|Wa/_Sy?Tά]WjEk* y[λ3?4~k%[T[giM?sz]FhL@#Lܰv?0T@-NH(^|Ecj-]%kr Ԗ೫ѮT& Ws}2 v ĩvM,jWdQ T&Nn`Qjr'j@wFQn|TZ^},0r a_ < \Qp{헄^i-RƓ+ʻ5 oh Ox|'WwQkNOxz@Cm@ghIENDB`tecnoballz-0.93.1/src/TecnoballZ/tilemap-menu_20.data0000664000175000017500000002525012412501752021357 0ustar brunobruno L L L  T ` X DL L L L (  DL t ` @  , @ 0   `d  HLPT@D X \8< P T P T 4 ( , 4 ( , 4P @ 0  , @ 0  , @ 0P (  ( D <(  (  (   , @ 0  , @ 0   (  (  ( D  (  | 8 8 , @ 0 <| 8 8 , D 0 | 8 8, 4 ( , 4 D , 4 , @ 0( ,( ,( , 0 (   , @ @  ,  , @   D <(( D < D <(  ( @ 0 @ 0 @ 0  | 8(  ( (  ((  ( 8 8, 4 ( (  ( (  (  (  @ 0 @ @  @   @  <| 8 @(  ( ( ( (  ( , 4,  , @    , @ , @ 0  ( ( | 8 8, (, 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  ( 44444444444444444444 (  (  ( (  (  | 8 4 4 4 4 D (| 8 8 | 8 @ @ @ @  ( ( @| 8 8,P 4 @ 8 8 @ @ ( @  4 , @ 0  @ @ @  < @ 0 (  ( D <(  (  ( 44444444444444444444 (  (  ( (  (  , @ 0  | 8 8  <| 8 8 D <(  ( , @ 0  , @ 0   , <(  ( D <(  ( (  , 8 , @  ,, 4  (  ( ( , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8,  ( ,  ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 8 8 , @ 0 | 8 8, 4 ( ,  ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4PPPPPPPPPPPPPP  | 8P 8 8  , @ 0HLP| 8 8, 4P \ ` T TP 4 , @ 0PPPPPPPPPPPPPP @ 0 (  T \ x $ $ | l p ` \(   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0   8 8 , 8 , 8 , 8 8 , 8 8 ,  ( 8 4   4 4  (  8 8 0  8 8 8 8 , 0 | 8, 8 8 0 8 8 , , , 8 8 , 8 8 8 8 ,  4 4 4  4 4 , 0 0 0  0 0  , ( ( ( ( ( (        (  (   (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 | 8 8  |    <| 8 8, 4 L, 4 ( ( (     , @  , , , P T H L  `d X p  | 8 8  |    <| 8 8, 4 ( ,   ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  ( 8 (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4  @ @ @      (  @ @  ,   , D < D <  (      , @  8 8 (       8 <| , ,  (  ,   8 , @     (   , @ 0  @ 0  , @ 0 (  ( hl(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 L, 4 | 8 8 , @ 0 <| 8hl @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ <| 8 8 , @ 0 | 8 8, 4 (hl, 4 ( , 4 , @ 0  , @T  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8 T <| 8 8, 4 ( , 4 ( L, 4 | , @ <| , @ | ,\X\ \X\,X\ (X\,\ ,\ \ 0,,PT, <,,,, < <,\ < <  < < <  <PT 8 D D D < D D < X\ (X\ (\ | D 8  | 8 8  <PT 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 ( ( D <(  (  (  hl , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <( P (  (   , @ 0 P  (  (  ( Pl (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 , 4 ( , 4 , @ 0hl  , @ 0  , @ 0 (  ( D <(  (  (  (  (  ( (  (  (  ( D <( P (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 ( ( L, L, ( L, ( L,@  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 @ , 4 ( , 4 , @ 0  , @@  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  (  (  | 8 8 hl| 8 8  <| 8 8, 4 ( , 4 ( L, 40000000000000000000088888888888888888888 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8                                                                                       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX XX  XXXXXXXXXXXXXX  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                                                                        | | 8 8  | 8 8 , 4 , 4  , 4 , @ 0 PT , @ 0  , @ 0 (  ( D <(  (  (  , @ 0  , @ 0  (  (  ( PT  | 8 8  | 8 8  <| 8 8, 4 ( , 4 L, 4 | 8 8 , @ 0 <| 8 @ 0 | 8 8, 4 ( , 4 ( , 4 , 4 , 4  , 4 , @ 0  , @ 0  , @ 0 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (   , @ 0  , @ 0  (  (  ( (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 , @ 0 | 8 8, 4 ( , D ( , 4 , @ 0  , @ D  , @ 0 (  ( D <( (  (   , @ 0 D , @ 0  (  (  ( D (  (  | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4| 8 8 , @ 0 <| 8 8 , @ 0 | 8P 4 ( , 4 ( , 4P                      DL DL (   L04LLL  DL DL tecnoballz-0.93.1/src/TecnoballZ/gard_lissa.list0000664000175000017500000005541012412501752020634 0ustar brunobruno0#l'^+/3;CdGRO.W``abcdeffghijkllmnopqrrstuvwwxyz{||}~  !!"""##$$%%&&''(())*++,,--..//001112233445566778899::;;;<<==>>???@@AAABBCCCDDEEEFFFGGGHHHIIIJJJJKKKLLLLMMMMMNNNNOOOOOOPPPPPPPPQQQQQQQQQQQQQQQQQRQQQQQQQQQQQQQQQQQPPPPPPPPOOOOOONNNNMMMMMLLLLKK~K~J}J|J{JzIyIyIxHwHvHuGtGtGsFrFqFpEoEnEnDmDlCkCjCiBhBhAgAfAe@d@c?b?b?a>`>_=^=]<\<[;[;Z;Y:X:W9V9U8U8T7S7R6Q6P5O5O4N4M3L3K2J2I1I1H1G0F0E/D/D.C.B-A-@,@,?+>+=*<*;);(:(9'8'8&7&6%5%4$4$3#2#1"1"0"/!.!. - ,,+*))(''&%%$##"!!                                                      !!"##$%%&''())*+,,- . .!/!0"1"1"2#3#4$4$5%6%7&8&8'9':(;(;)<*=*>+?+@,@,A-B-C.D.D/E/F0G0H1I1I1J2K2L3M3N4O4O5P5Q6R6S7T7U8U8V9W9X:Y:Z;[;[;\<]<^=_=`>a>b?b?c?d@e@fAgAhAhBiBjCkClCmDnDnEoEpEqFrFsFtGtGuGvHwHxHyIyIzI{J|J}J~J~KKKLLLLMMMMMNNNNOOOOOOPPPPPPPPQQQQQQQQQQQQQQQQQRQQQQQQQQQQQQQQQQQPPPPPPPPOOOOOONNNNMMMMMLLLLKKKJJJJIIIHHHGGGFFFEEEDDCCCBBAAA@@???>>==<<;;;::998877665544332211100//..--,,++**)((''&&%%$$##"""!!  ~}||{zyxwwvutsrrqponmllkjihgffedcba`__^]\[ZYYXWVUTSSRQPONMMLKJIHHGFEDCCBA@?>>=<;::987 7 6 5 4 3 3 2 1 0 0 / . - - , ++*)(('&&%$$#""!!   !!"""##$$% % & & ' ' ( ( ) ) * + + , , --..//001112233445566778899::;;;<<==>>???@@AAABBCCCDDEEEFFFGGGHHHIIIJJJ J K K K L L L L M M M M M N NNNOOOOOOPPPPPPPPQQQQQQQQQQQQQQQQQRQ Q Q!Q"Q"Q#Q$Q$Q%Q&Q&Q'Q(Q(Q)Q*Q*P+P,P-P-P.P/P/P0O1O2O2O3O4O5N5N6N7N8M9M9M:M;ML?K@KAKAJBJCJDJEIFIFIGHHHIHJGKGKGLFMFNFOEPEQEQDRDSCTCUCVBWBWAXAYAZ@[@\?]?]?^>_>`=a=b^>]?]?\?[@Z@YAXAWAWBVBUCTCSCRDQDQEPEOENFMFLFKGKGJGIHHHGHFIFIEIDJCJBJAJAK@K?K>L=L=L>==<<;;;::998877665544332211100//..- - , , + + * * ) ( ( ' ' & & %%$$##"""!!   !!""#$$%&&'(()*++, - - . / 0 0 1 2 3 3 4 5 6 7 7 89::;<=>>?@ABCCDEFGHHIJKLMMNOPQRSSTUVWXYYZ[\]^_***++,,,--...//00011122333445556677788899:::;;;<<<===>>???@@@AAAABBBCCCDDDEEEEFFFGGGGHHHHIIIIJJJJK~K}K|K{KzLyLwLvLuMtMsMrMqMpMnNmNlNkNjNiNhOfOeOdOcObOaO`P^P]P\P[PZPYPWPVPUQTQSQRQQQOQNQMQLQKQJQIQHQFQEQDQCQBQAQ@Q?Q>Q=Q;Q:Q9Q8Q7Q6Q5Q4Q3Q2Q1Q0Q/Q.Q-Q,Q+Q*Q)Q(Q(Q'Q&P%P$P#P"P!P!P PPOOOOOOOONNNNNNMMMMMLLLLLK K K K J J J J J I I IIHHHHGGGFFFFEEEDDDDCCCBBBAAA@@@???>>>===<<<;;:::99988 7 7 7 6 6 6 5 5 4 4 43322211100///..---,,+++**) )!(!("(#'$'%&&&'&(%(%)$*$+$,#-#."/"0"1!2!3!4 5 6789:;=>?@ABCDEFHIJKLMNOQRSTUVWYZ[\]^`abcdefhijklmnpq r s t u v w y z { | } ~   ~}| { z y!w!v"u"t"s#r#q#p$n$m%l%k%j&i&h'f'e'd(c(b)a)`)^*]*\+[+Z,Y,W,V-U-T.S.R.Q/O/N0M0L0K1J1I1H2F2E3D3C3B4A4@5?5>5=6;6:7978778685849392:1:0:/;.;-;,<+<*<)=(=(='>&>%?$?#?"@!@!@ AAAABBBCCCDDDEEEEFFFGGGGHHH H I I I I J J J J K KKKKLLLLMMMMMMNNNNNNOOOOOOOPPPPPPPPPQQQQQQQQQQQQQQQQQQ Q Q Q Q Q Q Q Q Q Q QQQQQQQQQQQQQQQQQPPPPPPPPPO O!O!O"O#O$O%O&N'N(N(N)N*N+M,M-M.M/M0L1L2L3L4L5K6K7K8K9J:J;J=J>J?I@IAIBICHDHEHFHHGIGJGKFLFMFNFOEQERESDTDUDVDWCYCZC[B\B]B^A_AaAb@c@d@e?f?h?i>j>k>l=m=n=p = ; : 9 8 7 6 5 4 3 2 1 0 / . - , +*)(('&%$#"!!               !!"""###$$%%%&&'''(()))**++,,,--...//000111223334 4 5 5 5 6 6 7 7 7 8 8899:::;;;<<<===>>???@@@AAA A!B!B"B#C$C%C&D'D(D(E)E*E+E,F-F.F/G0G1G2G3H4H5H6H7I8I9I:I;J=J>J?J@KAKBKCKDKELFLHLILJMKMLMMMNMOMQNRNSNTNUNVNWOYOZO[O\O]O^O`PaPbPcPdPePfPhPiPjQkQlQmQnQpQqQrQsQtQuQvQwQyQzQ{Q|Q}Q~QQQQQQQQQQQQQQQQQQQQQQQQQQQPPPPPPPPPOOOOOOOONNNNNNMMMMMLLLLLKKKKJJJJJIIIIHHHHGGGFFFFEEEDDDDCCCBBBAAA@@@???>>>===<<<;;:::99988777666554443322211100///..---,,+++**))(((''&&&%%$$$##"""!!! ~}|{zywvutsrqpnmlkjihfedcba`^]\[ZYWVUTSRQON M L K J I H F E D C B A @ ? > = ; : 9 876543210/.-,+*)(('&%$#"!!                          !!"#$%&'(()*+,-./0123456789:;=>?@ABC D E F!H!I"J"K"L#M#N#O$Q$R%S%T%U&V&W'Y'Z'[(\(])^)_)a*b*c+d+e,f,h,i-j-k.l.m.n/p/q0r0s0t1u1v1w2y2z3{3|3}4~45556677788899:::;;;<<<===>>???@@@AAAABBBCCCDDDEEEEFFFGGGGHHHHIIIIJJJJKKKKKLLLLMMMMMMNNNNNNOOOOOOOPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPPPPPPPPPOOOOOOOONNNNNNMMMMMLLLLLKKKKJJJJJII~I}I|H{HzHyHwGvGuGtFsFrFqFpEnEmElDkDjDiDhCfCeCdBcBbBaA`A^A]@\@[@Z?Y?W?V>U>T>S=R=Q=O6=6;6:595847464534332221201/1.1-0,0+/*/)/(.(.'-&-%-$,#,"+!+!+ **))(((''&&&%%$$$##"""!!!                           !!"#$%&'(()*+,-./0123456789:;=>?@ABCDEFHIJKLMNOQRSTUVWYZ[\]^_abcdefhijklmnpqrstuvwyz{|}~  !!"""###$$%%%&&'''(())  !#%')+-/13579;=>@BCEFHIJKLMNOPPQQQQQQQQQPPOONMLKJHG~F}D|C{Az?y>w=; : 9 8 76543210/.-,!+#*%)'()(+'-&/%1$3#5"7!9!; =>@BCEFHIJKLMNOPPQQQQQQQQQP P O O N M L K J H G FDCA?><:86531/-+)'%#!           !#%')+-/13579;=>@ B!C!E"F#H$I%J&K'L(M(N)O*P+P,Q-Q.Q/Q0Q1Q2Q3Q4Q5P6P7O8O9N:M;L=K>J?H@GAFBDCCDAE?F>H@BCEFHIJKLMNOPPQQQQQQQQQPPOONMLKJHGFDCA?><:86531/-+)'%#!          !!"##$$%&&'!'$(&)()**,*-+.,.,/-.-..-/,/+0*0(1'2%2$3#3#4"5#5#6$6%7'8(8+9-90:2;5;7<9<;==>=>>?>??@>A>AMAMCNFNHOJPKPMQMQNRNSNSMTMTKUJVHVGWEWDXCYCYAZBZB[C\C\E]F]I^J_M_O`R`TaWbYb[c\c]d]e^e^f^f\g\hZhYiWiVjTkTkRlRlQmRnRnSnTmVlWlZk\k_jaiciehhhigkflfmemendmcmckbkbiah`f`e_c_c^a]a]a\b\b[cZdZfYhYkXmWpWrVuVvUyTzT|S|S}R}Q~Q|P|P{OzNxNwMuMtLrKrKqJqJqIrHrHtGuGwFyE|E~DDCBBAA@??>>=<<;;:99887665543322100//.--,,+**))(''&&%$$##"!!  |yvspnlkjihhiijklmnnooonmljhfca^[XURPNLKJIIIIJKLMNOOPPONMLJHEB?<9741/-,+*))**+,-./0000/.-+)'$!              ,-/023567899::;;;:::9887654322100//////001234578:;=>@ACDEGHIIJKKKKKKJJIHGFEDCBA@??>==<<<<==>>?@ABCEFGIJKMN}O{PyQwRuRsSqSnSlSjSgSeRcRaQ_P]O\NZMYLXJVIVHUGTETDSCSBSASAS@S@S?T?T?T?T?T@T@TATBTCSDSERFQGQHOINJMKKLJMHNFODOBP@P>P;P9P7P5O3N1N/M-L+J*I)H'F&E%C%B$A$?#>#<#;#:#9$8$8%7%7&6&6'6'6'7(7(8(8(9(:(;'<'=&>%?$?#@"A!BBCCCCCCBAA@? > < ; 9865310.-, * ) ( ' '&&%%%&&&''()*+,,-.//00111100 / . - , + *)'&$"!      !#$%&'())******) ) ( ( ' ' &&&%%%%%&&'()*+- . 0 2 4 68:<?ACEGIK M N P Q RTTUVVWWWWWWWVVVVVVVVVWWXYZ [ \ ] _ acegikmprtvy{}   "#$%&'(())))))(('&%$$#"!  !#$%'(*+ !!!""##$%%&&'(()**++,--.//0011223~3}4|4{4z5y5x5v5u5t5s5r5q5p5o5n5m5m5l5k4j4i4h3h3g3f2f2e1d1d0c/c/b.a.a-a,`,`+_*_*_)^(^(^']']&]%]%]$\$\#\#\"\"\!\!\ \ \\\\\\\\\\[[[[[[[[[[[[[[[[[[ZZZZZYYYXXXWWVVVUTTSSRQQPOONMLKJJIHGFEDCB A ? > = < ; : 97654310/.-+*)('%$#"!                           !"#$%'()*+-./01345679:;<=>?ABCDEFGHIJJKLMNOOPQQRSSTTUVVVWWXXXYYYZZZZZ[[[[[[[[[[[[[[[[[[\\\\\\\\\\\\\\\\\\\]]]]]^^^___``aaabccddeffghhijklmmnopqrstuvxyz{|}~1/.-,++******+,-/02468;=?BDGIKNPQSUVWWXXXXWWVUTRQONLJIGFDCBA@@@@@@AABCEFGIKLNPQRTUVWWXXXXWVUTRQOMJHFCA><97531/.,+**))))*++,-./013445667776654310.,*(%# ~~~~~~~ ~ ~ ~ ~ ~    !!!!!!   } | { z y wvusrqonlk"j$h'g)e+d-c/a1`3_4]6\7[7Z8Y8X8W8V8U7T7T6S5R4R3Q2Q1P0P/O.O-O,O+O+O+O+O+O+O,O-P.P/P1P2Q4Q6R8R;R=S?SBTDTGUIUKVNVPVRWSWUWVXWXXXXXYXYYYYXYXXWXVXTXSXRWPWNVMVKUIUHTFSESDRBQAPAO@N@M?L@J@I@HAGBECDDCEAG@H?J=K"<"9"7"5"3"1"/"-","+"*#)#)#($($(%)%)&*&+','-(.)/)0*1*2+3,4,5-5-6.6.6/6/5/40402010/0.0,1*0(0%0#0 00//..--, + * * ) ('&%$ # " !   !!! " ! ! !         "$')+.02356789999 9 9!8!7!6!5!4!3"2!1!0!/!.!- - , ,,,,--.013468;=?BDGIKNPRS U V W X Y Y Y Y YXWVUTRQOMLJ H G E D C B A @ @??@@AABCEFGIKLNOQ R!S#T$U%V&V'W(W)W*V+U,T,S-R.P.N/L0J0H1F1C1A2>2<29272422202.2-2+1*1)1(0(0'0'/'/(.(.)-*,*,++-+.*/*0)1(2(3'4'4&5&5%5%5%4$4$3$2$1$/$-$,$*$'$%$#% %%&&''()* + , - ./01235 6 7 8 : ;<>?ABCEFGIJ K L!N!O"P"Q!R!S T UVVWXXYYZZZ[[[ [ [ [ [ [ [ [ Z Z ZYYYXXWWWV"V$U'U)T,T.T0S2S4S5R7R8R9R9Q:Q:Q:Q:Q:R9R8R8R7S6S5S3T2U1U0V/W.W.X-Y-Z-[-\-]-_.`/a0b1c3e5f7h9i;j=l?mBoDpGqIsKtNvPwRxSzU{V|X}XYZZZYYXWVUSRPNMKIHFECBA@@???@@ABCDEGHJKMNPQRTTUVVVVVUTSRPNLJHFCA><97420.,+)(''&&&''(()*+,-/01223444443210/-+)'%#    !!"""!!  "$'),.0246789:;;;;;::98765301345689:<=>@ABCDEFFGHHIIIIIIIIIIIIHHHHHHHHHHHHIIIJJKKLMMNOOPPQQRRRRRRRRQQPPONNMLKJIGFEDCBA@??>==<;;;::::::99999998887765543210/.,+*('&$#"!~~~~}}}}}}}~~~~~~~~~~~}}|{{zyxwvutsrqpomll k!j!i"h#h$g$g%f&f&f&f'f'f'f(f(f(f(f(f(f(f(f)f)f)f)f*f*f*f+e,e,e-d.c/c0b1a2`3_4^6]7\8[:Z;XV?U@TASBRCRDQEPFOGOHNHNINIMJMJMJMJMJMJMJMJMJNINININININHNHNHNHNHNHMHMHLHLIKIKIJJIJHKGKFLEMDMCNBNAO@P?P>Q=Q8=7=7<6;6;5:5:4:3929190909/9.8-8,8+8*8)8(7'7&7&6%6$5$5$4#3#2#1#0#/#.#-#,$*$)$($'%%%$%#&!& &&&&&&&&&%%$$#"!!  !"#$$%&&''(((())))))))****++,,-.//01345679:;=>?ABCDEFGHHIIJJJKKKKKJJJJJIIIIIHHHHHIIIIJJKKLLMNNOOPPQQQQRRRQQQPPOONMLKJIHG F!E"D#B#A$@%?%>&>'='<';(;(:(:(9(9(9(8(8'8'8'8&7&7&7&7%7%7%7%6%6%6%5%5%4%3&2&2'1'0(/).*,*++*,)-'.&/%0#1"2!3 456778899::::::::::99999988889999::;<<=>?@ABCDEFGHIJKLMNNOOPPPPQQQQQPPPPPPPPP P!P"P#P$P%Q&Q&R'R(S(T(U)V)W)X)Y*Z*[*\*]*^*_*`+a+b+c+d,e,f-f-g.g/h/h0i1i2i3i4i5i7i8i9i;i=<;;:998887777776666665554432210/.-,+)('&$#"  !"#$%&&'(())****+++++++,,,,---./"$%')+, . 0 1 3 4 6 7 8 9 : ;<=>>?????????>==<; :!9"8$7%5&4'2)1*/+.-,.*/)1'2%3#4!6 78:;<=?@ABCE F G H IJKLMNOPQRSTTUVWWXYY Z [ [ \\]]]^^____` `!`#`%`'a(a*a,a.a/a1a2a4a5a7a8a9a:a;ab?b?b?b?b?b?b?b?b?b?b?b?b?b>b>b=b=c>?????????>==<;:9875421/.,*)'%#! ~} | { z yxwvutsrqpoonmllkjji h h g gfffeeddddcc c!c#c%b'b)b*b,b.b/b1b2b4b5b7b8b9b:b;ba?a?a?a?a?a?a?a?a?a?a>a>a>a=a=a<`<`;`:`:`9_8_7_6_6^5^4]3]2]1\0\/[.[,Z+Y*Y)X(W'W%V$U#T"T!SRQPONMLKJIHGFECBA @ ? = < ; :8764321/.-+*)'&%$"!                    !l8l8m8m8n8n8o8o8p9p9q:q;r;rt?t?u@uAvBvBwCwCxCxCyCyCzCzB{B{A|@|?}>}>~=~<;:99887777777666666554432210/.-,,+***)))***+,,-./001223334444444433444455667889:;;<===>>>===<;::987654322110000///////..--,,+*)('&%$##"!!! !!!""#$$%&&'(()))*******))))))***++,--.//01122233222100/.-,+*)(''&%%$$$$$#####"""!!  !"##$%%&&&&&&&%%$#"!  ~ ~ } } | | {{zzyyxxwwvvuuttssr r q q p p o onnmmllkjjiihhggffeeddccbbaa``__^^]]\\[[ZZYYXXWWVVUUTTSSRRQQPPOONNMMLLKK J J J I I H HGGFFEEDDDCCB B A A @ @ @??>>===<<;;:::99888776665554433322 2!1!1!0"0"0"/!/!/!. ..---,,,+++***))))(((''''&&&%%%%$$$$####"""""!!!!       !""#$%&'()*++,,-----,,++*)(('&&%%$$$$$$$$$$$$$$$$$##""!   !"#$%&&'(()))******++++, , - . . /!0!1!2!3"4"5"6"7"7#8#8#9#9$9$9$9$9%8%8%7%6&6&5&4'3'3'2'1(1(0(0)0)0)0)/*0*0*0+0+0+0,0,0,0-0-/-/./...-/-/,/+0*0*0)1(1(2'2'2&3&3&3&4&4'5'5(5(6)6*6+7,7-8.8/809091:2:2:3;3;3<4<4=4=4=4>4>4?4?5@5@5@6A6A7B7B8C9C:D;DF?F@G@GAHAHAIBIBJAJAJAK@K@L?L>M=M>?@@AABBCCDDDDDDDDDDDCCCBBAA@??>=<<;:98765432100/.-,++*)((''&&&%%%%%%%%%%%%&&&''())**+,--./001233456677899:::;;;;;<<<;;;;;::99887665432100/.-,+*)('&%$#"!  !"##$%&&'(()**+,,--...///////////...--,,+**)('&%%$#"!   !"""###$$$$$$$$$$###""!!   }|{zywvusrqonlllmmnnnoooppppppppppppoonnmmlk k j i h g fedca`_^\[ZXWUTSSTTUUUVVVWWWWXX X X X W W WWWVVUUTSSRQPONMLKJIGFED B A ? >!=!;! > ? ? ?@@@AAAAAAAAAAA@@??>>==<;:9 8 7 6 5 4 3 2 1 / . - , * ) ( ( ( ) * * + + , , - - . ..///////////...--,,+ *!)")#($'$&%%&$&#'"'!( ()))********))) ) (!(!'"'"&#&#%#$$$$#$"$"$!$ $$$###""!!   ! " # $!%!& ' ( ) * +,-../012233445556666666666555443 3!2!2"1"0#0#/$.$.%-%,%+%+%*%)%(%(%'%&%&$%$$$$####""""!!!! !         !!!!""#"$"%#&$'$(%)&*&+',(,)-*.+.+/,0-0.0/10111223242526272829191:1;1<0<0=/>/>.?.?-@-@,@,A+A+A+A,A-A/A0A1A2@4@5@6@7?8?9>:>;=<<=<>;?:@:@9A8B7B6C6C5C4D3D2D2D1D0E/D/D.D-D-D,D,C+C+C*B*B)B)A)A)@)@)?)?)@)B)C)D)F*G*H*J+K+L,M,O-P.Q.R/S0T1U1V2V3W4X5X6Y7Y8Z9Z9[:[;[<[=[>[?[?[@[A[B[B[C[CZDZDZEYEYFYFXFXFWFWFXFYF[F\F^F_F`EbEcDdDeCgChBiBjAk@l?m?n>n=oa<`;^9]7\6[4Z2Y1W0V.U-T,S+R+Q*O*N)M)L)K*J*I+H+F,E-D.C/B0A1@2?3>4=5;6:79888796:5:4:3:2:1:0:/:.:-9,9+8*7)7(6(5'5&4%3$3#2"2!2!1 11122234456789:;<==>??@@@@@ ? ? > = < ; 9 8 6 5 31/-+)(&$"! !""#$%%&&''''''&&%%$##" !         !"#$%&'())**++++* *!)!)"(#'$%%$&#'!(()*+,-./012 3 4 5 6 789:;=>?@ A B C D E FHIJKLMNOQRSTUVWYZ[\]^`abcdefhijklmnpqrstuvwyz{|}~!"#$%%&'''''''&%$#"!   !""##$$$$$$$###"""!!!!!!!""##$%&'()+,-/0tecnoballz-0.93.1/src/TecnoballZ/tilemap-congratulation_40.data0000664000175000017500000005252012412501752023446 0ustar brunobruno < L < ,  8  < L < ,  8 ( 8 ( 8 H @ < ( 8 < < H @ < ( 8 < < D @ X\  < D @ X\  < @ 8 L < , < 8  L < , < 8 @  (@ 8 ( 8 <  ( @  (  D    @ @ 8 @ @D ` \ l t x T t ` \ p D L < , <  L <  ( L < L ( 0 < < ,     @ 8 X\ L < 8 ( 4 ( 4  8 0 @ @ D  @ < @ <  8 < @ , 8 ( 4  8  < , p t d p X T x t ` x t , <  8 8 X\ X\  0 X\ @0 < @0 < ( 8 < 0 0 d l X | ` t l `    < 0 @ < @0 @ ( 8 <  < < < T p p | ` x p T T l   H @ 8 8 8 8 <   < L < , <   ` \ | ` T | ` t l l ` X d \ p 8 8 <  < 8 8 8 @ < D    PT L < , L < 4 L < , D < L < , <  4 \(\(\(\(\(\(\(\(\(\(\(\(\ 8    ( T p t x \\ X ` t l \ l( 8 8\ \(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\( \(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\(\ 8 < @ L < , < 8 @  D  @  , < \ p T X \ x < \ t l , < <  x T | l X t   D ( D @ ( @  ( ( ( \ p p \ @ @ @    @  @ @  , , 8   ( 8 < ( 8 ( , 0 < ( 8 <  <       x |     X   , X < < L < , <  X\ t p ` p 8    8 | \ p T p p | X\    H @ X d T X \ t p <  8 X\  l p l | p x 8 p < <  8  8 < \ ` X p < < @   8 PPPPPPPPPPPPPPPPPPP H < , < @  ` X X \ x \ d l t   < , < PPPPPPPPPPPPPPPPPPPP   H @ < ( 8 < < ( 4 ( 4  8     x \ ` p \ p T < (   < L L < , <  X p \  ( 8 <          X\  t t l 8 T x l p x l < , <    p ` x l p < t ` x t < D x   L   < D < D T l \  X\  L < , <  <X\ < D X\ 8   PT \ p x t l d d x T p 8  L < , <  h x t l t ` x p      <   <  < , < L < , <  PT  8<  t x l \ < 8 <       X\ 8 | ` T T , t l \ l ,8 <  <  8  p t t , , 8     8 X\ X\  8  , , ( 4  8   \ p 4 T x x t T p  8    p X x T t \ X \ t T p    t ` x p @ t l T l ` t < <   < p t < l ` t d T x p 8   x \ p 8 h x t ` l ( ( 8 < ( 8  @ d l X l p < t ` x p    ( 8 < < , T ( x X ( < < , <  < ,   l \ < ( | ` t l 8   < , < X\ T | l @ ` x T p < X\  t ` x p l t  8 X\ <@ <@ x ` d  8  ` d ` d ` d ` d ` d ` d ` d ` d ` d ` d $ $ $ $ $ $ $ $ $ $  T , d l X l t \ ` T T x t, | T ` d d \ (   <   <   <   < (   < ( 8 < p X ` p( t, T p ` l t t \ 8 <  < ,(,(,,,,    < , <  (, \ | l hlhl < < , <   , , , HL 8  8   8 D D \ ` T T p ` l t t x \ ( \ d T x p t l < @  8  8   @   t l ` p \ \ p < d l p x \ | l p ` \ L   ,  8 8 8 t t p d ` \ T \ p  < (   < 8  8  8   d l t h x X \ t 8 \ \ p p ` \ t d p p p  < < <  < < <  t \ p ` l t t t < | l p ` \ T \ x <  D D <X\ X\ <X\ <X\ < H | p , ` X X \ x \ d ` l t p x l X ` p 8 < 8 < 8 < 8 < @ \ X p @ t l X \ h x  ( ( 4 <  @ @ @ @ @ < < <  @ l d l p p x l T \ x \  D D X\ , ,  D X\ D D X\ , ,  D X\ D D X\ , ,  D X\ D D X\ , ,  D X\                      0 4   `d $04hlhl04        P T H L  `dPT  D @ D @    @      @   L < ,   \ ` T T L < ,  0 < ( 8 < 0 < ( 8 <  ( 4 8@ @ ( D   4 D 8@ < (  < L < , < t d l ` l X X p x l x \P X  | x X ` t t p 8 P X X ` l P | | ( ( x T t x l p 8 p h x t t p t  8 < ( ( TX p p X T x l X p t l p P    4 ( ( 4 8@  4 ( ( 4 8@ @ ( 4 ( ( 4 8@ @  D D   PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHLPPPPPPPPPPPPPPPPPPPPPPPPPPPP \ ` T TPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPP P t P d l ` l X X P p x lP x \P X P PPPP | P \ hP X P ` t t pP P X X ` l P | | PPPP x \P p h x P x lP P `P X P ` t t pP tPPPPPPPPPPPP TP p p X T x lP | d P PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP D D <    P  HL P < , < , < < P P \ ` T TP P   @ DP  P @ D @       (  8  0 4 < ( 8 < 0 4 0 @  @   (   < t d l ` l X X p x l x \ X ` ` PP x X P ` t t pP P X X ` l P | | P P PPP x \P p h x P x lP P P X P ` t t pP tPPPPPPPPPPP TP p p X T x lP | d P PPPPPPPPP    < ,   X\  ( 4  8 pt$ ` \ | l t ` \ T \ x tpptptptptptptptp$ 8 8 @ < D  @    < <  < ,     < ( , ` d l ` l X X t ` \ < 8< l x \ ` PT t | \ ` t    T x t x l 8 t t  (,  8  $ 4  8  ( ,`d l d p X p HL | 4pt l (   <  @   @    D  @    D < L < ,  tptpt$( ( tptpptpptptpttptpttptptptppp$   < <  < ,(,    ( , ` d l ` l X X t ` \ < x| l ` X 8< ` T ` t  < ( ( d l X l | l p ` \ X ( 8 <  \    D     D     < L < , <  tptptptppptp$( tptpptpptptpttptpttptpp$    @ <   X\    D  ( 4  8 ( ,`d l d p X p  < @ <  8 @(, D<    <   Dx| \   T  l t \<HL  \ t l ` < | l p ` \ X t X ` ` \ t  D    <  < < D  ( 4  8      < @   (   <  ptptptppptpt$ tpp$ ptp D  @   <<   @  < << < L < ,  <<   @ <    <|| 8 < ( , x p h x p, L p ` d l l t   < < < L <  < < L < , < LL  (,    H @  $$$  8 < < <x|    X\ tptptptppp$< ptpp$ ( 4 ( 4  8 (  ( < 8  @ @ < @ <  8  ( ,8< l x t p( << @ @0 < ( 8 <    < ( D    < ( ,`d l d p X p |  < L < , <     4  x <     P T x l \ t`d x ` \   X\ tptptpp$< ptpptpp$ ( 4  8 < (  (    <  @ < @0 < ( 8 <  ( ,`d l d p X p ,(, @0 < D    4 <  D < L < , <  ` ` T d < 8< ` \ ` <    D @ <  <    X\ tp$<< tppptptpp$<   ( 4  8 `d  ( 4 @ <  8 | l p ` \  t l  @ < D  @  @ @ H t ` x l p @ @ @ D  @0 < ( 8 <  H ( , p l \ p <  @0 < D      ( (   < D < L < , <  ( ` d l l HL \ p 8 <    D D D D D D D D D D D D     X\ tp$< ptp$ tpp$   ( 4  8 < (   8  ( 4 @ <  8   (  8 <  8 <   @ < D  @  T  | l p ` \  T \ x  t d l ` l X X   ( 4 @ <   <  x \ d \ t x X < t X ` p ` x p x \   ( 4  8  8 ( 4  8  X \ l P | T p ( T ` T p \ x t ( < < @  D  @   | X X d D  < L < ,        (  8 < < L < ,    8 < <    <    < < < < 4       4       t@Dptptppptp$<<<< t@Dptptppptp$<<<< \ d d \ d \ d d \ d   L < ,  D    L < ,  D  D   D    8   L < ,   8   L < ,   d   <  d   < < D ,   , 8 < D ,   , 8 `d  , d  `d  , d   `d `d   `d `d `d ( `d  , `d `d ( `d  , `d H @ < ( < H @ < ( <  D  `d  < D  `d  < <  L <  ,  `d  <  L <  ,  `d          `d    `d  (   `d (   `d H @  8 <  <  H @  8 <  <    @  P   @  P <  L < ,  < 8 @0 @0 < ( 8 <   P D D       8  @D L < , < X\  <   `dHL  8<PT    \\ \    X\ <<  <  \\< ( 4 ( 4  8   <   @ @ <  8   \  P D D  @      8    < <  < , < X\  <    < < P X X\ X\  D  @        t  <  < ( 4 ( 4  8  \ \ T<P @ @   (   < H 8 \ \ H D D  @       8  < < L < ,  t<       P t< @0 < ( 8 < H  < $ < @0 < D    t   ttt$$ P D < L < , < t <   < < <     <  $0    X\      0< 00 t      ( 4 HL  8  \ ` T T  <    @ @ @ t    , 0  0  P T H L X p   @   0   0 ( 0 8  ( 4  @   (   < H @0 < ( 8 < 0P @  D  @   D   < D  < L < ,  < L < \ <  8 < L < ,   8         X\   X\ ( 4  8 ( 4  8 H @ <  8 < H @ <  8 <  D  @  <  D  @  < <  < , < 8 <  < , < 8 X\  X\   @     ( 4 @ 8  ( 4  8  H @   (   < < H @   (   < < D  @   < D  @   <tecnoballz-0.93.1/src/TecnoballZ/sounds/0000775000175000017500000000000012412501752017135 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/sounds/reject.wav0000664000175000017500000000346612412501752021141 0ustar brunobrunoRIFF.WAVEfmt _ _ data {yzxyzyzwzy{z{|{}|~~||zzyxutssqqqppponmomnkmnkokopoporpsqsD@JCOXWd_omwxȿȿsled\XSLHD@=350-.#' (&  46'70;>7?@?P?TGZO_`kpo~yvpid`[ZSSPONGOGOLKRMWQ[X_deoqzyȿ|h_PB3/   (!/'/0/@?@?L?OP_`gto}|zwvtttuvxz}}|ppb_XSPEB:3/('/0'8?AKPW`cos}{xolef`_XW\OWPWX[^_kcoxw|ÿ|mcSA90 /// /8:'?8;H;LG_hs~zsrkkhgh_iekprtz{xph_XONA?87@?COXWferuxoh`]POP?NEOPW\_rwǿpUC0 /006'787<@N`gxÿvonegdcfemmuyzpe]TKF@7078/<@?PW`kwrk`[XGLCOPO\_nw|aH' 70'6'7'78?X_vypkkcghgpt{·reYSH?/;'?@OX_uxkeSOP?LK^gܰf@('/0/8/>Omzmkaglvm^G?278;LO_qsfOOA?NSfwpG(,/%/8/H_}}pggbkq}pWH78@FGexo`GKAO`uجO0:!70/@_ygghmyo\?>/=@O`sr`UPGPWrзX'/0/6@^xmhep|`?>/>Geyu`OLG_|ϰp/,+/@/@kvggk}iT@?@KYuxcTCKQoԷF!70/4/^ymckxrO?17HOofG?C_x@/@_`GDGge@;@W|ccgz]8-.7qtZ@?Ts]>!/1WucWX_Ϡ`O@/L{slk}Ǹ`?06Gks|}~~}}~}}}}}}}}~}}~}}~tecnoballz-0.93.1/src/TecnoballZ/sounds/Makefile.am0000664000175000017500000000106112412501752021167 0ustar brunobrunoNULL = pkgdatadir = $(datadir)/tecnoballz/sounds dist_pkgdata_DATA = \ ralarm.wav \ rappar.wav \ raspire.wav \ ratom.wav \ rbricote.wav \ rbrique1.wav \ rbrique2.wav \ rbrique3.wav \ rbrique4.wav \ rbrique5.wav \ rdetruit_indes.wav \ reject.wav \ rexeplo_atom.wav \ rexplo_big.wav \ rexplo_rak.wav \ rgadget_sound.wav \ rindes_1.wav \ rindes_2.wav \ rlife_moins.wav \ rlife_plus.wav \ rmoney.wav \ rmontre_touche.wav \ rraquette.wav \ rtecno.wav \ rtir_monstre.wav \ rtir_rak.wav \ rtransfo.wav \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/sounds/rtransfo.wav0000664000175000017500000001321212412501752021511 0ustar brunobrunoRIFFWAVEfmt _ _ data^~~}~~~~~~~~|xyxvtkW@787CWbyd_UOJD@/('$   ,3?3Opwxpe`XWPC?1+(',!73?8;>;?@?@?LGWS_p_h_vp_`_poo^A?@?POn¼kZ@?PWhw·kPKP[tw_P?FC[p{`OF/707@?XkiXJJ@70/0!''704'?C?oĿ{upeaZM<+4!6AGH?L@?@?L?NOgq{xous|cO@707H?oбpUH7JPkyhKLG_yĮrO?@?LcÿaOH@7'?L[h`rztv~s[RGG@783?@?17HOZasgWJ@7KWTOVGOPOXOg{zcC;0+8/Nc}`?<-?Wm~x[NAVkܸ`KD@KYsȯgW@=<;ROW`fXOdgzxzRMH??@?COPANG_hпxd[LWiih_c`e`g}o[H/,//UȯrU<>@[q`?DKkðgSH7HWopWJCKC?@?>@?G_hovovts{y}`OPCNAOP?PWngȿrqctzzutsqwstTG0*.GoСa@/4GatpP?PktX@>AWojWVPO@?<'6@GXW^W|wwgs|ow_C?P?\`WP?h_ȿq{hWO;0,K{àpC70/MfpK?GlımP?F@Vgÿtd_H7>%+0/?Uub@OweH??WĨpSH.#/0/P?ZE?IW\_VOOCO\?WmܸlI8?,!3Ol8'_h@+,4'?@?>@JO]XOLO^P_px`G(/,/Oqi<0GoPGgWD/[ye= '0<@?A?PO\G[POX?jwǿȱvW<3%G`=0SqwPOwp?<;nr@/04CDA?@?TK^BOXOtпЫv`@8/?knC~Đo?0+4??@?@?VK^COP_pȿY@7@ot@K]hCkW@7wȮP/0#>@?H?VO_P?`gph?.#/Atp;?m`Of@7AzP?8/>@?@?TG^GWSkðaG0'>KgJ@ggTyxK>_èlC7'?<7>@VCOP?_wпȿоxK0<]ȪqD@}O^`/?r̯X@/@;8/>GOGOT_kĿȴW0OWPKPg·X'/@U?@cOkijuHCfǸxS?P?FOVC?H?lzȯüG6#=hd@S[g_HW{пlKZ@?PO`GUGkg8<_?KuX~БG/`ظ]H??@N`KPGlo<;`p@OWsȠO8_zXS?@?SWXOZo~T0/`y`?oo\[<@Ȧz\iJ@O`OTGlp@6GmĠC?yefo@OĠvXOJ;OY[XVnP8_SX_OA਀_`OPK\`WhvA/8oPG|[w?L]`OW_W`?hsP/4opK{WyxGMǘp]]GWIWXdP6kP?Sx\/_ķlc[OkXSXki@?_HWoiWOȕkhG_`_Tgyk@/G[H}^_DvΠh[[MkpseS07?k_tg?efP_ZOWkh78yHm__FƔwr\ar`[l_//o>e_s`OÚyo_`OdOmgW07{`SpunPИuouhknW87SOnn_C}l_Xmkw}qW87COpo_H~xtgb[w~Q/K_KugAzz`gdWv|O7GFgt7tus|oroyxO@LsoX_|gczoP7oAguiOoso_pxokG?|@nĐGsswug@?\Eg\Kwx`_mf@OkGkXofcZA?GgX_pk[ulO?{y?wmq?osdODWKgxwWq~WGDYWykSl_{pgTCOPmyvf}nci_H_KhKmkguxgm`?\Okg\ik}}jSOX@mZ|fSKpvkckwesk`?glKgTwmjr^PO^tGk_{_[LWGniuikjM]Peeh`OP?kXo}v[P[_Os`p|g]PkK[k\pkx`OPKilLxgokEGPO~gofxmmo`OPGskuxxm_P_g_s\ptrO[Veu||[^OU}_wxk^Ke__lMnygIO\h_pnk~kOWfyhp|lOW_pPi}XOqOgdp|}q_SWkZr\p_Ta`omeogP?du\p|_Schnkezp_QKcs^ty^Sc`micz|l]X_K~?v}~k\OOmum}|lWeOe}x]XOUmufoqfC_Owo_}}]H[my_yqXg@ssqlW_Xgmj_C_SOf_XyWgpwu`O\nowbgTGmyex\Uk?o_oyiOXjggKXk`gPcO}x_|p[s^okspO]]u_q`Oddqg{X?k?ggxpWoU__wX[wUvWghO{m[nP]epX}hKX|w_w{`[_wstSXwxhE[}g{kpPtOcOUkWfWpSxtz`Of[kkr[[hqgnPzfsmgO_Wgc_^owm{ePsf`u`gS|gfOygv}dGpdoXc]mcCosvwlOx\wh_Og`oPt]smP_`ouK_\guG__pw~X_[zo__Um__]|gc[_ef``okt_swo`f``gwpOga\m_k`O`}iOw_X__~o_^}i_`kuur~GqlljO_ko_Tohk_d``k_{_Gzxpn?oma^wu]So`_Pdhrbkytcggoe_WckWg^O__{paaOcgp_U_x[`__Wor_[ow_sekx[`__Uos_Wwv_wckx]O]_OommK]^Xox`jdyh{|_c|cWod`o__`swKk_d~e`OtgtQx`i[Vw_[P^oSmk__wvjxhSp__embwopk{pWo[Xc[O`ytWrilot`}][k_\go|_ogncZx{XE`[W_xqs^wo~csfO_^n_[osoeo|dkfPypOKW_\g_wpes_qk\t`[h__wpoov|`o`tecnoballz-0.93.1/src/TecnoballZ/sounds/rdetruit_indes.wav0000664000175000017500000000334412412501752022704 0ustar brunobrunoRIFFWAVEfmt //data88RR\\TTXX\\OOOOOOWWXX\\eeqqqqWW##33IITTWW\\bbwweeKK,,22 CCVV__^^^^ZZ__nnbb9999ZZppuuuu nn kk dd `` dd aa \\ ll II""||99ՀZZpp~~iiff]]~~WWWWCC쀀rrppuuFF''WWJJNN==__ˠ``ɑ!!==厎NN䕕ƪ--HI 㨨||ss||FFffaa[[__NNzz::XXᗗ ooߥ uuߵ !!!!""""######$$%%{{%%%%&&&&''''(((((())******++++rr,,ff,,UU00II]]~~PPҋIIqq..{{FFggzz}}==á//RR^^0044rrII22YYdd99>>~~}}hhccvvFF{{==AAccXXVV||xxZZ__ffHHxx7788~~88||88||89<<||IIwwRRtt[[mmghffvv``XXuuUUeeTTVVVVMMUUIIYYBB__AAbbAAggAAjjDDooDDssDDyyKKSSWW~~\\||^^zzcczzaa||ZZzzUUmmQQdd__gg||{{ssdd||~~ssnnWWvvhhUUZZxxhh}}UUyyaa\\\\dd}}ccaaww{{tt{{lm{{nnyy{{mmnnmmjj{{ooxxwwnn}}ffww``oo\\mm^^mmtecnoballz-0.93.1/src/TecnoballZ/sounds/rexeplo_atom.wav0000664000175000017500000000345612412501752022362 0ustar brunobrunoRIFF&WAVEfmt _ _ dataqspoqmopnpospuswx{~wvpnhc^XUSPMH?G@?@?<7>7?@?D?LAOPOXW_`gcotw~~xtpid^WWPNLEG@?@?<7?@;87>7?@?H?TKW`_`_nmww~yxrnhd_^WZQUPOOGOPMNGNGSPOXW^`chgpovwÿ|tojgb]ZWTUTSQ@?HGH?F@?@=>7?@?@;FA?C?POXO_`_hkto{w{yuqolkjegacd__`_`_`_c`_`ghgngqpsxw~~xxqoliea][XWTOSPOPKLGOCKPGNGSPWXO\`_`_hglkspwx{~}{yvvturrpqqpqpopoppopoporpspstswswxwxz}{l_[PG@7<+707@CTWgpth\ONA?8?D?LGWast`K?#,!/0/8>@Wh{sh[XKNCOXW``jp}kQ>! */0/4>;O`sxo`[XMNEOPW\_nwlYL7/  (.!/0/>?^cwxoja_`_^_gcot}Ĵ{p^M?8/0,/0/8?LG[`ghox{}xtpongnpopu}qcXOJ@;0/47/;@?TWccsx~}|zzwyxxxwyx{y}~xpe_QOH?G@?@?HCPO[`elovz~~|zzxwxuxwyy|}~tleaWWPOPKOGOPOXW_`ghotw~~}{|z{zy{yyy{|~ztlid_^W[XWXW[W_`_hgoouv{|~~~}|{{yz{z{z{|}}xspligac`__]_`_`_hgmpsqwz{}}|}|{|z{y{z{||}~}zvspoliihghegeghglkoosquxy|}~~}|||||{|{{|||}~~|zwtsponkniklknjokopqssuuwxz|}~}}}}}|}|}|}}}}}~}{xxutqrrqqpopororpstuvu{tecnoballz-0.93.1/src/TecnoballZ/sounds/ratom.wav0000664000175000017500000000066412412501752021004 0ustar brunobrunoRIFFWAVEfmt K"K"data{xhxuahrr?^xrr7Vk<\c#~Ȏ<uV^ȁVcI<~q7xfRKUdž^ZFsnf_wk=L~WA.<ƾk6bő=*~p?Kk5?}ڽ^+Kp3,.<.w ~B.6  jҏ:1yQ5u^XZKW~uo~]}|_~a9~˳G#jk#SҞ?A~ɰk4jҔGFXZK\>y%KG,eҏ.SЩB1ZcJU#<ڳ=,hA_obtzkbT_xbozzpgwY_~zhypku_yf~kQwfFou%Zي8,W(Z=,uWC̅F4~̬f5PҠk9j҅bLefEUdzEFyz_ZsCeҮfU#LZמW!jݞL#t,~Wjڀ=XfCoWU\Kwk/Nҩ85y\!_ݔ36tҀ+A~ٮa.ALA _kA8%j҅1>lCT~kWjs~sgo9KҪB_u<ӫWtfElL\~uZnzcwSkkO~op~ltbb]hYL~kJKLKwpF_NLzzA_ɔBAյW(oހ3>˸W,ZأB+j&~W A#"~f,Aʮk>Sɩ\0Z̏FA~wW_~]e|_lonot}~|poohtcoptkwaoWXoJocFtGKŰn9b•aFtaZoaCj?K~fBjebwyoo~hjzhkf_~QXfF_LKyuGSaHeEN~n?_NJBNҘ^9wnNZZPyzaTzQ]\CyuS]kUokW~fbkZakkc^W\WoQefWb^UoOUkQ_f\oaW~x\^nPl_Tkaooewu_w_XyzNekNtbWjWGh96ν^.AٽL#U3j=A.ou8,~u56̽p1KҰk5ZÞ^EhhYepQZzLUu=K˳\0NڮE"_%,ڽ^4UǞWHlbUyfeuook^uQZkG^W<_ҙB,~u.<վX,PҩW1gҔJ1oҀ=>~dzu:UŏaFwfh}wzoufhk}bkyzZjk^wxjy}zy}q|uyw}}pstzzsyyzuywwyyzuypfwWbaLsQN~?Uũ\5_ҙ?6|u/UҞO=oLU~uObhXw_kwh}uwsyuluf|xfghfzzkswzyzz~uk~h_~zQ_bBjÊNCyCH~¸u8FհY'Sڞ?(g҂5<~˽u8FDZf9SǩY=eWHw\Q}aX|\Z|X_~z_eu^hkbtfootlukkp_taZ~W]nPgaTt^Z|__waepesuq}yo~gbwWgkLj\FtJKn?_aHj^QoWZ~Zgukqzzu~|twzpqzok~zbhuWlfWtY^~_eueouspzoypat\X|O_kQg_QlWQyW_lTflWhcWz_X~w_jzgj~|_en]jfWlW]NZuQe^GtLSkGjWF|uKUaC_YU~lXkpcskf|of~uswzetxsutoyzkspkpeylkkf~wo}zyztecnoballz-0.93.1/src/TecnoballZ/sounds/rbricote.wav0000664000175000017500000001005412412501752021465 0ustar brunobrunoRIFF$WAVEfmt _ _ datau~ii>^vi?USs2~U~Uj~SmujHJUU~~j~~yϕO^i}v>c~CiU>( (*(S~U>H~S4(*:i ( iU(~S?֩*ij>U֩iH~Z(U?(*>?i_~jV>SUvUi~U3Ze_S~s~*{sSUSi~j~}*HOSCy*i>HSu4iYKriiZjnCO~^UnCyj3r]ij~Nj:Socuu4SU~Y~Usj>>~US?>*^(3֩S?>4~*Sj( ֩*S*S'~?S?^>~UiW^0~U~in~Ji~Uy~~jis{{(SU~JjH˙USjs3Cs?iP>4~CiNjN3~eyZNV~m~UyqSr~U~j~oi~rri{jvuvv~nuk~afigKUSiOC~USof;Ji?SP>?iJ>P<*iU8S?~4^_(C?~4Y(C~*~U3j(~B~?sU3(~J~?s_>C~Z~_nKNsusoucuks~u~~yo^Uyji_S>?i_s_CH?iUsjCU?~Zy_caY_yk{unng~y{~uzy~}~uu{~~zz~}ugu}v{~u^a{n~jnjYUyg~ZcHJ~U~USj3~:~U^U>!7iUSj(*~/SSj(*~?SjH(6sU^jH*?iZSj>3~4sU^jFH~J~Z^NP~ZnuiYk~ernuuvv~~o{sie~jnocR~Z~UnuijYSU~Zsj^^^~jymnsr~~}~y{~vvuk{nzsuv~}v~yu~~sy~n~ujs]~nsje[Zsj^JUy_iH>~US>+~?S($~4^U#~*Hj ֩SU(~*iU((4~USNC~_i[a~_sjj~uyv~k}yzzku~}so~m}wnuynunuvayjcjnus~Z~vnu^~r~knnnywyq~u~vvun~uuys}u~unnu~uz~srk~ukf_yjiYVyj^KUsUNG?SN3?cjS3~:sU>34~U>3+iUS./~USj82~US>@~U^PU~jn]e~esukk~ovzvn~}z{zv~~}zz~~y{~~~z~z~~zw~y~zuuzz{n~u}zno~uyruzuuyuzn~ou}{{~y~~u}~~yy}u~u~usjnvjgeasiV~_sjSO~U^jSB~U^ND~JijCC~Us_PCUijYN~JsjSS~_yj^Yb~jiejsnk~kyuu~yvz~z~z~zvsj~jvuc^~jiib~jngmvnj~uskn}uuw}~~uy~osojynf~esuie~n~vnry{z~}z~zyz}}~~~~v~zun~ryuja~ji[Wyj^OJsj^VZ~jiij~nyvy~}~{z~z~vvq~o~rsnn~uvzsu~z}z~zzz~}z~zyo~nywig~j{jf^~_sji^^~mskn~u{yyv~z}zssn~u{vrn~o{usn~o}wsn~uuzyw}~~{z~v~zsq~uyuij~jsng~m{urnr{zyu~z}z}vss~ryzri~o}unk~mske~jvujj~uyuv~}~y~vr~r}uvno~uzu~u~}v~w{yuzuu~zvw~z}{zz~z~zyu~vyv~zzy~}}}~~~}~~~}~~~}~yyzvuys~uvzq~uynoyruzzyvy~{}zyy~zzyy~zy~z~{}{y~}zy~}~}}}zz}{z}}z}u}v{k~vzj~ovjuukzvzr}y~~z}}~v~z~z{}}w~}}wyu~yuzzsy~}uv}}z~~~~z}~yu~zv}v~vsv~uyzz~v~w~~~z~z}}~z}{~~z{~zyvuo{vzk{v}m~u~~u}~~y~z}z}{z}zzz~z~v~z~zzz{}~~~~~~~~~~~~}~~{z}z~zyu~zvo}zyr~yyu~zvu}{}~~~}}}zz}vw~}z}~}z~{~}~~y~~}}}~}~~z{~zy~zyy~zz}v~zz}y~z}~z~z~{z~zz~}{z~}}~z~~}~}}}}~}{~~~~~~~~z~}~}~}}~}}~z~}~zzzz}zw~}}v~{{z~{z}{}~zz}~z~}}~z~v}y~{}}z~~~~z~~~z~}}{~}z~~z{~}}z~}{~zzzy}zzzz~}}~~~~~~}{~~z}z~y~zv~}~}z~{}z~~~}~~~~~}~}~~~}~}~~~{~~~z~}z~~z~}{~~z}}z{~}}}~z~~~z~}~z}}}~{~~~}~}~~~{~~}}~~~~~~}~~{}}}~~}}~}~}~~~~tecnoballz-0.93.1/src/TecnoballZ/sounds/rmontre_touche.wav0000664000175000017500000000340012412501752022706 0ustar brunobrunoRIFFWAVEfmt _ _ dataV,SSSM=VGVe_(IG9_(d=V #+ooeE|Vܾ!DVR6q7$#H0+5Ƿd#7E͔A o 2Gf{^A,A^䱐h>$=E>>>>>>>>>>WhE6>Wh_xtecnoballz-0.93.1/src/TecnoballZ/sounds/rlife_plus.wav0000664000175000017500000001221012412501752022014 0ustar brunobrunoRIFFWAVEfmt _ _ data\oS@;\owب\/FO_pпD-MSklc7'?XlqyC/P[hg|c8?PWlpwOOosп^/OckP/HWgs`/HShw?3OdkyèT/GXexp/HQgw?GchvWG_n@?X_u_>Kgs}@GXgwO>Ogs}x@K^k}?JOgtj@Ods?NWgw[@Whw@O`kOAWhvp?NaoGPWhudAWeuGP]l{XE]cyp?P_qNG_hw`?QgvLK_iyPK\gvkKGgqPO\gxOOWku~yPOdm}MO`jxgPShuGW`kyWP]lwrGWcrOP^lv`K^hw~pOX_p~TG_cw`O\gwPOck{PS`gx_RSju}PWdmzSW]kxkPWhuOZ`my[P_lvpM]cs}UX_ludO_gwpOX_r{\SegwvS_qb_lxfdo{kLgXGmдAVfØ?QkЀ@[w`?`uKHcw@Ob~;Tm}gDWrX?_q@K`y?Gdz}@Uo~`?ZqOH_qHKd{?Ve{sFOodC_pGK`rKPcyHUi{p?Zo[L_tTKfuGWc{JSk{rC]q`OasOPewPWh}?^k}mP[sdMerOWcvSXg{P[k}pO`raXevXSiuO\g{TWk|zO_q}cWau_QgtXWhwO^i}X]o}xOcs_[cv_SktS[hwW`k|Q_o|pWds~_\ewfWksO_gw[`k|Qep~pWds}i\ewh[lu[_iw^`m{Vgp}p_hsm\gvh]lu_dky^_o{[gp~o_cum`kth_lu_`ky`_n{]jo}obgul`ks_epw_aoz`gp|x_hs}kdkvj_ou_go}|_p}hozknxh?lPgK\y`WwnGkNb}C_~GWq?Rq`KgH_y?\y@WoKPo`OgxC_{JYxAZqLOoVLip?`|H^wGYqCOp[Pk_Oa|G_wL]s?XmXUncPgM`yP_wO[oGWp_OkgOczKdyP_uO\oPWpcSkOd{PfyUauO^p\Wr_XkxSh{XeySasP_p_Yr_[kzOj|\c{WdwX_t[\sh[msSi}[c|Ugw[asY_rh[pn\k}[j{Sgy]as`_qf`sg_k|Yjz\eyYfs`_tc`rc_m{`kz_gy[gtbav_dop_o{`k}_hw`ftcasb_pv`n{dg{_jud_uefsp_p~z`k|_lw`gtgcuggqx`o{fkz_js`gtiasp_l{`mzegvbkslesnjshuhqis}_NwTiXg`[WsLmP_P_}YWxNoHeC_G[w^RoIkH_E_|KVukPkHiF_G\uWTrwPkGfK_}O\wePmKkK_K^u[SsxPnNgO`|W\vkSoOkOdS`w_Sr~UoOgV`y_[vvWpSjWa}]`xpWqOmWd[ayl`rWoWh[byh[sWqWj[azf`ux[s[l_c{_byt]r[n_c_cyp`t^r_l_c{h_vx_r_m_h|fdyp_u_p_h~dg{l_v_q_mdg{hewpet_qdjdgzaevcqdodj{`gxpgsfrdnaj{cgyogqfrhmbmzgjwrhs`qancmykhuvhsarco_lzmhu{cucqgn|glyqhu~euergp{klwsgvesgpkp{ngwtiuluoyo|q{vcjpjdp]qOsXy[zWy[_`_\gUiPmTqWtSwY}i^`_[gShOkTsWwYxxY|a_`d[gUkSmXrWw[zm`}[cXi[kWoWt\y_{t_}ce[j`m_r]u`uc|xcjf_k`o^oau_wc|gpgflcp`rdwe{f{xcikhngp_scufyg~|g~oiemhomsgugzm|mzmrpmslumvkyjzopvorrmtpunumxp{o~pyorrnupvowmyp|q~q{qutpurvovnxpyrzo}}qwtrstusxpwpys{r|r~ztsuvusupytxsys{q|txsysuvqwtwtyrzp|v|u}{swvswtwuxszqyv{s}t}yvsuxwuxsytwuzu|s}t}{x|wyxwzxyxyw{u|x|w|w}}xywzxzyxzx{yzw{v{x|x}y}}xzyxyzyyyw{xzy{x|x}y|x}}y~{zyyzyyyyzx{y{x{x}z|z}~y}|zzzxzzzy{x|z{y|y|x|z}~z~}x{{yz|{z}z}z{z|z}y~{~|z}y{{zz{{{{z|z}{}tecnoballz-0.93.1/src/TecnoballZ/sounds/rbrique5.wav0000664000175000017500000000211012412501752021404 0ustar brunobrunoRIFF@WAVEfmt 66dataOAdkk|q'nn8ܪK&̻nSr<{]{A -&H9{`^Y>RR4~SkM^̪9ZK; Wd YH.'w;{˾PtY>㢄tKAE?TF^BEmkP~OHt^?kodY4|&o~d*yxkdnm|FfKnEOE|CfjkECkhT;dL]'|>HA^quYWE^nOn|{\tt~Mx({awaF~hy9{`^Y>RR4~SkM^̪9ZK; Wd YH.'w;{˾PtY>㢄tKAE?TF^BEmkP~OHt^?kodY4|&o~d*yxkdnm|FfKnEOE|CfjkECkhT;dL]'|>HA^quYWE^nOn|{\tt~Mx({awaF~hy9{`^Y>RR4~SkM^̪9ZK; Wd YH.'w;{˾PtY>㢄tKAE?TF^BEmkP~OHt^?kodY4|&o~d*yxkdnm|FfKnEOE|CfjkECkhT;dL]'|>HA^quYWE^nOn|{\tt~Mx({awaF~hy9{`^Y>RR4~SkM^̪9ZK; Wd YH.'w;{˾PtY>㢄tKAE?TF^BEmkP~OHt^?kodY4|&o~d*yxkdnm|FfKnEOE|CfjkECkhT;dL]'|>HA^quYWE^nOn|{\tt~Mx({awaF~hy9{`^Y>RR4~SkM^̪9ZK; Wd YH.'w;{˾PtY>㢄tKAE?TF^BEmkP~OHt^?kodY4|&o~d*yxkdnm|FfKnEOE|CfjkECkhT;dL]'|>HA^quYWE^nOn|{\tt~Mx({awaF~hyASy}vzmkjbckaYZbu~reRgVH}A`{phdpzeeky{~}trkrP|GCYsrYSRNL^}topvihfly}kw`{I}IFUow^TQNSWfk}vyzz}}{|wtspVvVxOw`]tlpZX^ozpwzrurr|y}u}mvswurgkylw`d~ecks|{pprr{fplxkv}t}woupkdkd~eclw{wvp}kw^ragwcY[{}~wrlkvyxxr]Ue|}srpw}zfVO|ZSxzkoolraafwweZ^pytpvy~|mtecnoballz-0.93.1/src/TecnoballZ/sounds/rmoney.wav0000664000175000017500000001005412412501752021165 0ustar brunobrunoRIFF$WAVEfmt --datau~ii>^vi?USs2~U~Uj~SmujHJUU~~j~~yϕO^i}v>c~CiU>( (*(S~U>H~S4(*:i ( iU(~S?֩*ij>U֩iH~Z(U?(*>?i_~jV>SUvUi~U3Ze_S~s~*{sSUSi~j~}*HOSCy*i>HSu4iYKriiZjnCO~^UnCyj3r]ij~Nj:Socuu4SU~Y~Usj>>~US?>*^(3֩S?>4~*Sj( ֩*S*S'~?S?^>~UiW^0~U~in~Ji~Uy~~jis{{(SU~JjH˙USjs3Cs?iP>4~CiNjN3~eyZNV~m~UyqSr~U~j~oi~rri{jvuvv~nuk~afigKUSiOC~USof;Ji?SP>?iJ>P<*iU8S?~4^_(C?~4Y(C~*~U3j(~B~?sU3(~J~?s_>C~Z~_nKNsusoucuks~u~~yo^Uyji_S>?i_s_CH?iUsjCU?~Zy_caY_yk{unng~y{~uzy~}~uu{~~zz~}ugu}v{~u^a{n~jnjYUyg~ZcHJ~U~USj3~:~U^U>!7iUSj(*~/SSj(*~?SjH(6sU^jH*?iZSj>3~4sU^jFH~J~Z^NP~ZnuiYk~ernuuvv~~o{sie~jnocR~Z~UnuijYSU~Zsj^^^~jymnsr~~}~y{~vvuk{nzsuv~}v~yu~~sy~n~ujs]~nsje[Zsj^JUy_iH>~US>+~?S($~4^U#~*Hj ֩SU(~*iU((4~USNC~_i[a~_sjj~uyv~k}yzzku~}so~m}wnuynunuvayjcjnus~Z~vnu^~r~knnnywyq~u~vvun~uuys}u~unnu~uz~srk~ukf_yjiYVyj^KUsUNG?SN3?cjS3~:sU>34~U>3+iUS./~USj82~US>@~U^PU~jn]e~esukk~ovzvn~}z{zv~~}zz~~y{~~~z~z~~zw~y~zuuzz{n~u}zno~uyruzuuyuzn~ou}{{~y~~u}~~yy}u~u~usjnvjgeasiV~_sjSO~U^jSB~U^ND~JijCC~Us_PCUijYN~JsjSS~_yj^Yb~jiejsnk~kyuu~yvz~z~z~zvsj~jvuc^~jiib~jngmvnj~uskn}uuw}~~uy~osojynf~esuie~n~vnry{z~}z~zyz}}~~~~v~zun~ryuja~ji[Wyj^OJsj^VZ~jiij~nyvy~}~{z~z~vvq~o~rsnn~uvzsu~z}z~zzz~}z~zyo~nywig~j{jf^~_sji^^~mskn~u{yyv~z}zssn~u{vrn~o{usn~o}wsn~uuzyw}~~{z~v~zsq~uyuij~jsng~m{urnr{zyu~z}z}vss~ryzri~o}unk~mske~jvujj~uyuv~}~y~vr~r}uvno~uzu~u~}v~w{yuzuu~zvw~z}{zz~z~zyu~vyv~zzy~}}}~~~}~~~}~~~}~yyzvuys~uvzq~uynoyruzzyvy~{}zyy~zzyy~zy~z~{}{y~}zy~}~}}}zz}{z}}z}u}v{k~vzj~ovjuukzvzr}y~~z}}~v~z~z{}}w~}}wyu~yuzzsy~}uv}}z~~~~z}~yu~zv}v~vsv~uyzz~v~w~~~z~z}}~z}{~~z{~zyvuo{vzk{v}m~u~~u}~~y~z}z}{z}zzz~z~v~z~zzz{}~~~~~~~~~~~~}~~{z}z~zyu~zvo}zyr~yyu~zvu}{}~~~}}}zz}vw~}z}~}z~{~}~~y~~}}}~}~~z{~zy~zyy~zz}v~zz}y~z}~z~z~{z~zz~}{z~}}~z~~}~}}}}~}{~~~~~~~~z~}~}~}}~}}~z~}~zzzz}zw~}}v~{{z~{z}{}~zz}~z~}}~z~v}y~{}}z~~~~z~~~z~}}{~}z~~z{~}}z~}{~zzzy}zzzz~}}~~~~~~}{~~z}z~y~zv~}~}z~{}z~~~}~~~~~}~}~~~}~}~~~{~~~z~}z~~z~}{~~z}}z{~}}}~z~~~z~}~z}}}~{~~~}~}~~~{~~}}~~~~~~}~~{}}}~~}}~}~}~~~~tecnoballz-0.93.1/src/TecnoballZ/sounds/rtecno.wav0000664000175000017500000000722412412501752021153 0ustar brunobrunoRIFFWAVEfmt //datahvU%*2B-@UM]HU~Ѿӻ˫ָˠs@J =X~έΠ{*-%n~۳ӝvev]"-UJ =2s==țӐ{hӽ嬺вVK;aV 3w66i|^;)!!woקV?VI^̾w㾁:4(,^B*a-wD:oB|fBf a8-@ޱoltȜlRJ_btڛliR#+|glSjl@Wol.>l_A_᪦X9M2|m_X+/ƨNIXAmS0VXmXBBj[|||^m|L|ͥЁNtNG@mٓCwt|>Y 4ʤWMH|ֽ`F2Y-2pmaߧhO7(5\uXrÁAP .:ɤyZdޒ|PZaZDDʭf(Zȇd4I;EuZݭyOOan|nA)BHinqqdgV]nFYnX`7,tڛQOܯ)Ze)Ԅ37]Kq/'_DFԀ/-5WT-y˯ *nO;݄,;Z_7ѐ0>nqTFLssH3HsbXKUkfTLWbhy\IZnk\KR|hXDAL`w@>W\zC8Kk`Q|DAK}]_tLARnhOD;NpWbnDń;L}R_qD:Iwb\D>TnkZR\btsbclwqkehhens}tnltz}z}yywqntsyszq|}y}|zwwzyz}wzywwswv|nzpwnnvthnqkt||zy}}z}|z}}|vwzys}tw}ww}|zwwwz}wtwt|v}zy}}wvz}z|y|ywsnyw}vywtz|vvt}sz|zwtliqwkhlzzkkkztspnnt}vpq|vqilhpwzqntzttqvwpsvzqifnn|\U\}kl}]X`zph_]cqwb\]iysnknwsllvt}qnt|tspsy}qqvy|qln}vv|sqvyz}yyv||wsqqqnqv}nlswzpklq}|snq}vvyqlnwvqt||tnlpywsnntywqptywvpswyzt}tsvw|tqns}ztqvyztsvwwqnswzqlkqwynhhlvzlfip|yslnsz}vtvz|zyzy|yvw}|yvv}zvqntw}qqqtyzsqswwsqs}wyqqwzvswz}vtw}}yvy|yvvy||zwy}ywy}|wvw|}vssyztsv|zvqqsyzwwz|}wvvy}}yyz|}|z|}}|zz}wwwzzwvyywwzyvvyz}wtvzzwyz}}zyz}zyzzyz}|z|}||||}tecnoballz-0.93.1/src/TecnoballZ/sounds/rexplo_rak.wav0000664000175000017500000000356612412501752022034 0ustar brunobrunoRIFFnWAVEfmt //dataJxHxlbbHHHSx%SHHx>xƀbxHƩb*9b9AA܀Ҁ xL LL:+V Lxxe$xMxV%B2e2%2MpxxxPˀ3x xi+PxB++...S5 SxƩz9z*z9iV3zM:MjVHqH 555[~۟Lz[:S~9:z W P~H˗PǖpBb % pez$5pze >p*x9B.][H [lʹzPpSSMSAPBB +B]VaWbb3+xGW[He>.Hb2B2۞BP  zj2e[MLbb3~%S9+ i9p ~p+x9BAǴiMGV]Ʃp~PPuSG :> uiW9jƟeWƋbLaxVBzꂔHb܀ lAapHVbASa]҂a e[blLSb az35zAeuGz%+jip縀z*q5Vliiƀlܿza3eHBGl P۞qV]b~$zWVܞapVA]qblquMLjiAM.[lH]BpMW] 9[q[AͥL۹l52եAeBelqSqL~5lGWƞPuG5H>Vj>u~M>ܐl~B[~SHxSWeVAe~BjlǔiSpe5BbxW5[չiLi[Bl53xM>V~5՞qe˭˥pp~[G]eaeaiqWiAuiqjPMex>Wi~q9HbzbqqzLjPAiaLeuju:zzzlpjxpueiHMBBeezuzuxaz~ezijlzej[Viq~~eeu~q[uzqz[eS]px~~jVWequpbjx~pzxxqxu[uzpqliapx~uixxbpuxxqljuxu~xz~xz~q~qjpz~~ullxzz~zz~zxzztecnoballz-0.93.1/src/TecnoballZ/sounds/rtir_monstre.wav0000664000175000017500000000615212412501752022407 0ustar brunobrunoRIFFb WAVEfmt //data> ~||{|~~{{xzx{~||w{xx||t{ts~~~zsxpuqm{t|l{s|oxmp||{tioh{|u~pee~{~othu|plpibuzbeiijqtopx~z|u_[[[[[epuojuslhiw~zttxxtmlpuxwx{~tpmf[OTfofX]o{~~eXSIIIe|lbipp~lhdjh]]fz~{qlfXIDHTXVRT_ijjmqqmmqplmmjihlwmllql__te_ɣqj|[66AOIMxzidLD@]msоѵuiaTGGOWODDM^ffipw{~z|{f60_q['%Xxwܭ]7A=##:oipٮ]:6',l~6OmV[ʗztpmlS2#3Vj]KPmltobloib]MOwPMPSXtzaWe^(IxoWssb|;$ GE:sxij±ʀ[H>*$'$3SVXhsswxtx_q~{x|l=Ezh7RZҀuͪWah,OP.p_ ];mtta! ,oOPѾξ{tX]{taXR$7ԣ6+00/Lqbe5V=e{7Уmw( lZmDDEΏlA$9XLqs{VbA#buaalLb;l WA*A·VTw_*xTɜ*'txm~^mmBрTpwSZf^e/X('(;αxP3E Z3͸msmH[a[[B=eά#$w_pwR3 :G2sj^p0h(duZPh^pfSu{+;_9¡_@>@HB zzaofl,qjtp m]jdD6qlbb;ubss*LKEGGWpbuHH%zs^6fI뀚zbt˜6zz_[ZE>LL%M̀Sdp|m|MD5;5+>*tX{԰|O7>{u$RP !!!!ݖqaR{RXŔzlj=A={wp_0^5l2((((_jzoaWdwL.Wj+q˾{;l..B/>x˷s[wEjPZKBmq3H|=eGRʀH@OVWuɸo@7:EÐ]f9B^];DLVož|ŀÏox]ZM^=E===_={fzwqK@a{@a|p^SRmxRfqS~{zdtqtqj~q~mOoORwssobjVSLS^xzuu|lxXul^md|tetqT{m~p~{ff|~]|~wp{mzsjsZo^{xzu~xz~~xwwmm|dfdpqmdhlzwzxx~xxww{modpuiuxzojzww|xw~xuutx~zz|tsqzw|{wqu|wxxsssq|u{z~|{s||~~{xx|||{|zz~xxxz|x||~|z{~~|~~{||z{||~|~z~{~|~~~~~~{|{|~~~~~~~~~~tecnoballz-0.93.1/src/TecnoballZ/sounds/raspire.wav0000664000175000017500000000053012412501752021317 0ustar brunobrunoRIFFPWAVEfmt _ _ data, qOF t tecnoballz-0.93.1/src/TecnoballZ/sounds/rgadget_sound.wav0000664000175000017500000001336612412501752022512 0ustar brunobrunoRIFFWAVEfmt _ _ data~~~~~~~~~~~~~~~~~~~~~||~|~~~~~|~~~~|~~~~~~|~~~~~~~~~~~~~g~mB@xF1Yye=NL'LZxNT&~SbQ~g2LdF@e4sK'~'4'N﯀hWLkNBrW.?~ȍN!_߱s4?{Ș]$!WܱF)Er›g1'5VֱS5'EjžrN45V~ֱ_B4FgʼyN@BS~DZhH:LbSFBLu|{{{~{{{~|||{|~y~{~{~~{{{|||{y~|||{{{x~~{xy~{{|{{{|yy||u{{y|{x~~yyx{{yyx|{{yy{{xy{~|{y|{~|yy{~{yy{|~{x{{|{{{|{{{{|{|{~{{{{~{{y{|{|{||y{y|{{|||{WSrYLZr74L'aeb\m4֯d!~ENS._ᒘuITkbLg@㼥j5~@BY4_ᒀs֨LTveFaFs㼘n@5@@v᱀L).nțZ'4VбrF'F~ȽN4BeʽkB4WбLBFud4E_sL:V~SFHnmNFaVKQxgNLjrYN_gLZrnZLg_WY{~~~~|~~~~~~~|{~|{x|{~|y{~{~||y~{|~{y{{{~~~|{|||yy|~{{|||yy|~||||~yyx~{y{y~{{{~|{{{{{|~{{y{{|{|{{|{{~|{{{{{{||{||||||{~~|{{|{{~~||{||{|||{{m_g{sbj~|x~dNLνk54krSuY:B{߳p4=kY_~]5@սn@@rjS{ėV45vu@LpL\~]!:jٴrFI~aPʣ\/'rֱvLYxLHsǥg@L|a@\ZIknNL~_N_YTrsSZ~]Sg~SYrsZ_hZkbYxn_bg_m|_bxs]hj_pygbypehker~||~~||~{|~{~{{{{{|~|{~~||y||{|~~{y|{~~{~~~|||~~~|~{{|{|{~x||{{{{y|{{{~{yy~{y|~||{|{{~{{~~{|{||||||~|||{{~~{{~~|{~~{{~|{|~|{{~|{|~{||~|~||||||{{rhupkx~rmhp{L\e~hʒr4k.~Ny!YYs㏞_@V'rʯV{)dF㌱NYF4gУИsh5ʘNh4Nnsʗ܌e5_/vZuQYsᆞVNL;k֥sd@NV{jNFQe_LNYxsZLTeeYN\rvaLTb~j]P\n{gVWdypbS_mg]]eyvhZ_ms_beuyk\dm~|{{{{~~{{{{{||{~~~~{{|||{~||~~{||~|~{~~~{{|{~{{|y|{~{{|~||{{y{~{|{{~~~{|{~{||{{|y{|~{{{{~~{{y{{{||{~|{{{~~{{{||{{|~~||{{~|{{|~|~|||||{||{{{~~|{{{|{{|~|{{|{|uknxhhnk_yprsaLrES~dShYryFLeFgurks\LuFN~bgkYp{LFk@g{uhsbLxFNbNk_nsNL|mL\kvaSd~g_Zrva\jhZd{s_bnxh]j~kbgvvgbmkah{sdjrxkbn~khgxvges{nmm|sjmv|~~~|||{~~||~~||||||~~~~|{|~~~~||{||{{~|{{~~{{{~~~{|{{|y{~{|||~|{{~~{{{~{{{~||{||||~|{{|||~~{{|||{~|||{|{{~|{|||||~{|||||||~~|||{||~~|{{|{{|{snuspxpsru_\vymxs_gxY\usn~rgbv]_xvk{k]g{y__umn~nS_uxbb|sh~kYV{{dexjn~sYb{sbkjbuxge~pgpkgvuhk~shsmkxxhnshupm{vnn~snu~nnxxmrunv|rs{xrssrv|rr||||||~||~||~~|~~~~{{~~{~~~||~~{~||~~{~~~~~|~|~~||~|{||~{|{|{{|~|{y~~{yy||{{~{{{{{||{|||~||~||~||~|~|~~||~|{{~~|{~||~|{{|{||{{~||~|||||||~|~~||~vs~~uu~{uusvx~hd~hYpr{rdnYym|Lsehne_uv{Sv\gv\dxruVrZ~g{Tkkn_kZxs~Npbmedgvpgek{xhegrrgenx{mhgr~umenu|pkgp~vmjnurnkr{ysmruupmry{snruxrmrx|{{{{|{|{{~{|~|~||~|~|~|~|~|~~|~|~~~||{{~~~{|~{|{|{~~~{|{{~||~{|{~~~|{~~~{||~||{{{{{||{|{||{||||{|~||||~~||~|{|~~|||||||||||||||||||{|~~|{{||||||~|{ru{xsu{~ksppxrv{hgugp{|nsre|{_jnmrsv|ykgugn~~srshy|djrjrsxyxkgxak~~nnmm{senyunjs~nmn~vknxypprvnr{xrnu|sps~vprxyrruvpu|xssx|ssv~xsuy|uuvxsv~~||||||~||~~~|~~~~~|{~~|~~~~|||||~~|||||{~~~{|~|{{|~~|||~|~{{~~||||~||{~||||||~~|~|||~~|~|~|~~|{|||||~||{||||~|||~||~|{||||||||||||~|{~~{{{yvv{{xx~~xvy{y~ukp~rr|sv~xmk||rr{vs~ukmy|rr~|ss~vhkx|ru~usvkj{{u{ypuxkmyxrxsp{xprurx|ur{yruvrx|vu{ysvxux|vv|yvxyvy~vv|yvxyvy|xx~xvxxx{{xx~{vx|||~||~~~~~~|~~|~~||~|{~|||~~||~|||~~||~~|~~|~~|~~|~~~|{{|{{~|{{||{{~~||~~||~||~~|~~||~~~||||||||||||{{||~||~~||~~||~||~~~~||~~|~||{yy{yy{yx{{uuy~|ys{n|v~kusuvsry|~kxnsynr~{|kyk~r{jux{xpuk|u~hxrsurkxykss~yuprxxssu{|vsrx~ysruy|vsrx~yuuvx~xvsx|{vuvyyvux{|xvvy~{xux{|xvvx|||{{{||{{|~~{~~~|~~|~~|~~~~~|||~{~~|||||~~{|~||~~{~||||~~~|||~~||||~||~~|{{{~||{|{|~||~|~|||||||~||~|~~|~||~~~~|||||~{|~||||~|||||~||~~||||||yy|yyyx~v~ssxs{x{|urxnv~xyvuy~rsxpx|{y|xr{rv~xvxuy~spxnx~{xyxp~{nu~vvxuy|rsysx{~vyxr~{pvxvyx{~ustecnoballz-0.93.1/src/TecnoballZ/min60map.png0000664000175000017500000012506212412501752017765 0ustar brunobrunoPNG  IHDR@hPLTE@ @`@`` pHYsIDATxͽ ,4-l J`{~u3q8V_MK+9qHO[:j*-=i^˝˯k\퓼 z q%ΐ|\CaqnJt/=_OoÙ=I*Hh: VQP-l50xE" ]XOGj[9OOcy8zJ1pIx& $Bx6;g5051KE;>:>')PO:6Z5 dISy|p_Éq',j`GV8k883NYعѦ1?]hκϯW+N:k 'vu1<4W{[_㾆Z^nkSMFt3[sPoUlSƭǗi`VRUڍaSg|we_o_`Z6ȕNzGer. 68ġk$tJEv TZ]X$q_6q9N0xʏo+suq,~{=rwN4|xʼnֳ籘yNq_:n4]p{ql7|g]768:̫ m+[h};?[*Y|aLH+Lt@BzڎU*X<&{+4r=H+(gVcpZ Kƚr05gso C>;+xs/KXG=;`YRT;JC ZۀGrZMq`u~Ut7rE^} DJgiZD<: sܘ^Ȼk eo#]5j1q#~ Oy./G ZyG5uU2Ha h0X^ނ$mJ~z.uUݻY0{Tt1wO^3pw EP^_]'Z6 7w%>}e/{v7)"k!E{uOjB{< ) G-[{oI*E+ƀN"""Oj|~7czAq}D9:Eu R?,它`&=wj4sk޵[yy0fdY#Mg(o!}+r !kJ4i6R*zA ytPLL4M\}13y߷5bBt`S[k|!{[h }gbk`'Β̓z SkX! D)uY#?q~†k fӳAa&ZR`pAT-jUg"GduN 1fZxAnE)eP~luQIE>ΏpB5ƬtJw (0=ȓtK`ͫ"E&nFڧī@uTAi*Ơs|5zJyjzݦ$Aڡ6^ :m .X(I870SU-:C!"f + z;{mD0h nXx *wu Bu.׽Bgpɬ Ac212H(hfx3 F1sE!@ fg^ 98`s媴c\&A":~o#vS bApktū!BT$nsWڔA7İݞ7QaNB pkt%dv"UA̎-[Sl^ 'x U {>`RL]>8N}[hI*u/T|0OU 7*,HZD+m}o:'P*oGf 1tVS>!Ј1;2CC= I Ji]rT2_|uQΣ[2t o;2:/7N>nTC>o'{+#迤鵛|M^MuP%Y, m#GQ.I#$Lr WQ% BŗH/˗[JF;( gм!kDc [FA㷠>6 e@W~)A6{ 6 ""2]r FRLԹpQ+/.dn^HVwtZ) ҫ/x;9i#yV| ZfR7P^@m,̞n#Cӽ{#Qr;&gxZz~!ɿK R}m>ţ'' ^k9>:kO.3%x9CGaP`Γ=I\yX _}9Ab`b478N bE7'ufP$'4AZTA?_~m'O{]}U'| `>3}w}{wA?LJ~[^EDFoI[D}9 *>C%>O<}~u|W}~m53s^ػYݫ>:>8\CE5=iyί^z ?~Wwx_}ο;#w''UMPN?S#COi`8ʜ9$3GlLKM%se , ޢ/Ȓ[PV)jƒ 8ƶB5Z(#׊ ۧ^' W\w-)l !.!ΠE% 6T1mj {J`A!~}^ŝjI*nA! k.¾Z+x_ *>9A* Bxs@T3 `xD\0Vp@P{V+nڊyqSP4;Ah >Ƅ$fMLVhVAE1T^w n֊!B,V1TF6V 3 ED<5 )f"*PD+d+V[^_=jn T1سV0.ҍUC T:2#rn 6Ȳh*!O`F J4E0?ՎYV#m Zqj$oE7u_߾j9Òz›XUɮg.3M3k+A`YxR&֢ =[OVx ,juw"FR_p^ءK wMMjo7mܦxa#p)t;m˯ۃ HnmAn}ZY]np.@(k$/wbęܽYǾAqJ&bƽAV4Um$'đ!4/PZ[PWg>zדZ0zCnЌ Z8&BU^\}Gcc޻Ơ:ȠnA}S  @}$ 7c0,h&AE ٢`߉~]VV2*ATY$GtJ]]8( APTF ;_u~~>7a\hPU4X/tiMU|Ѕp#-UfHh@ՙu*6dD ;Yhϐ7Oʣ4WEhFJ6T҇' 3zm4pYưZ|Um.r;| I mk#g[i3ѳG؛Gm(I$7e)k w.>xY>2 \^rvP֑0x1؇he~~x)E?%N  !rʅlt83QbghJ틎MF_]': tEs:٫l҃`(&J4:i%rR`@ 1e!Or}`:XA|[ʟ P>擎)JSOo^a‹\)6q3T_`uA(_ bA/W_;i-x#kBgfH|h$*(_ڿt1{9j)%cڈI9,zg{ õs60ANH`fa-0;F6^RSDSuh҈4SgDrT4;MP͓T󗐊\A־垰+_M]eAk$-~uljqz *pXVP4qЌ2CĶd^WeWH[J蠶CՉDdw ғ<\H~z δdʭij=nK|{m{kAe3*otJt=QJ-Ҹ sۺ%}M[M\_ລtpV'Q322v Հj`@3E1͓5>գ,pHMF]]Nk#)xG}yi7ue[cZ kHѝƀG B/Q``璠Wg3_aEN㊧[  ٌ1(8PWVZd,#3l,nb~Å5X ĉ_U;l]6!>^пg' kuq_G:~ڤ^Ib ;Dbd(7n?P4J/{=80G|Kؽ?'~&4_B%S,ޫO Ymp͊C&Ê0>Ffg?6?>6oA$- ɪ4m-^xЧ\wP)-gn w/>q,\h\=Y q>7+ΤXf^&R:Y6ݽgڸ0AzNxD@0 Z'YUϤw3$շ+=`Z"hA[;"a$B#$ * Z_ͬ>A#|Uy_ٷQ!&`PW(-տAJk~ztX)Tz{K1#/زty&L^EkRQGw#mz -+9r5vD"AFRbd Oե> -ڄ.̋d[m+@bKZ-d &z  kN?5M?c D.IdÜJMq]Wbn̓;{gP\ؓfNЯ q0=U( 4aܡfռ *:&sR"CxU=EPv(A! Ș$ƈ+%[ JNA5L%95h$h*`@cf40RӞ@d%aUO VH #h60D7h,)T7%Ȏ= ` rScp$'9ߗ$ vDIr#Ub6YABlcSiO<:HhTE;;ĀVv ޘUҞ43{M,a& .⎍{t q\('U=\ZBM'h4/:0,i"P *Ⳅf4QQ1+ P[ KJpeZ x "AF 1 jJ󱙫ѭ[T؋J0l 6`@K%L$`ppi6jM_:bEs Qu>*CUB,U$yeKU=(Lb_Qe2vMy~J2wzc#ap&!F=urΈ2^ia;c+t}gW\R5Aale=ٺ1taD~߄WV*=$rb0Kp&.h6V %r2fb+V! xkmjꏡsH n]Ncg_'@waA*`vVϱ7N" ζ >ٸdz<,\uh晪̔d&ր(QYxuhbG(8D2⟙gUaZ!-O 9h JLaΓx ˨"r sS&+ݢ^?37 :~ XqvnNg,.dbRB$yVlU\|pg ?~G=kV\lj!7]ky5 > b?ftSEXPQI>mUbH_6y0wOUE s NSK75!1/m&D1l}gSĄ=d3;{s`9HK58OnXZXEٽnYO?9tAˁnXp:%h&vׅ;Nk3+m hfhy*eQn1"u)EZK F93?~b0 k:+2ףE>HW- ؁[5韰LjWq!Z3-ar1(gn͝Qk l#)Az)]['V]URa>v kyI r>Fv aiͪ+_!vS;*h|R2O]Hw:dP/9<3u1Z[iC6 Q)",W3HS~bbGQ^ja rxOJgG3b38|%< -zʿh ?G[MO{1b2_:(."?cQ~?b#8i^"l#W.=m z>pPeȈ4ۈQ6x:53,>L['i6n tb K$/>wŘM9ۊ~ 9>3Ƞ,USڟLF!=:3kJ;j[7%3ES3%{ Ƃ AOn5겗A/ >lK,S(`kҨ\;hiCylm zyazDN'[6Ÿ@l͋AU3ř0سn DvXJ; Chx'Gkmh6vT"<gB儁:fu-\F6kgz`F[6q? hDC>){7Bw_(Lzx+o:85[8ڽ̐WLo7ƋCg:7:e)uROpǤИ5msO鋽<}} 尭'iݾxVX+t%YHm$`#Eyy3[87)یOjH<11 23~8nzx'Pﭛh`ţ!m';.d;»=gJ0`m[f7'UQwjacksxF BxZ/>7;`(O'eҾ@AS RW28{tO8a` ~k{+/`S;<ضO(iD V6RAv>؃"6t ie?iU {W.*$ _XGZ} ^-|ǃeGZ_|z!S-08:x'ppiȠvCJ|~ǎyoSRJ/Dnh_?pᙱ<$ϙD<z)9kqFУA>ݘ1p*8CKQ٢Z8P2\UEBjW.hdMsɗUJF$ˋ& (Ml flҳϪB1YBi\Cl&8N%*4,1Wz֨Cp6 1DVG=3(2*e mAX稻^Atut/n!z`ق/CgU \[sut `PE3֬YٹTZ>Ae%+'qBӵDƠU`{ϭWz]xCXS ;Ԓ3X4aJTYWV1U+@6(WOgPnf{oyyō[ްXG7-u#J445m9*8g5p `:ba: " 5`z`~nT7 9z\UzbpGO'ιSx9 ?ֹI3ek<.R0\szu/;[ G.ਈ{vd+>>C*WQ|8ePl Z%/[jXjr6.7[2Os|U}p? "U]Pl8μ CRӮ`s:> ^j+6|u'IQtXg1Ids;_Ǭ6Z/ /rQY>l!AA2>(bdpC>Am6jSjNFjv@~ic‰Ap .ڔVzA>ED 6 n% rv@Tst A)A5%& `Vg/v }2ej/Ny,SU1"TOB'i 2"z &7H9ڛڎҫk}7/4TF`P;^N#(\x 8G\v-<}S>7|&MPUMhsdoxà`7-p 6`!Fm >1X jy0xo3As`ȷxÜKQ*A ]'5cv<0 c3 RqZ,2A74 `WqA@g Ơ*ft+J\a4yH_I[Ƶ*Ҫ 7 4ް3y6:0IƒW=ܘǞ[LBft! 9TS6wvx=f~XAY+mr5*>7T|=D_B NnfN: rȠFiXZJ|+A]Ic"AMiɈІܚJY$-[qD 0s n4]D =` jjefl4:/)e-1g]tRqssbEu2 h/' uih;-mO5/4axĚWm0^dca] wΕ%0'.„_sO<c`% ЫxN549T}2X)A0hǞ9ثc<d$lr{nF@:,Ĥa^P'{=m/V \mf.(r:O\Hs|6ԭјko臚,LXv8o$/NöX>\4sƃ0Y?8E`<ɓ+f,E&Xh՝= L\Nowvp_}bx\wKTzy3 GXb&)u!,_ ؇}뵍 ]Lەv5nWɟUӥWs4f{/ <|n??l)퓞zu?V7:: ViaSTQÂ梸 H+Cuut˵)r;O4n:dC|2laJSMr^SZ- ]P"i%d:ǩk-Aɻq~ud5g~]c_v!QhML6Ҫ`~Q1\W~5}Sd#<+c|@ttϬS.e Ʈmw >.3ikFLZևZR)C׽-:w'G86;.z-;RSn xvmj:)ֳNfw 9;iQnkqמu&ӭtv/ߠjMhAv5-|~b_',}߱Ņ?SpSU}*Kԣv<8:TȇGR7='z񹮗uଉ3Q;{Y| Z_|Nsyn˫~_|ӻ5NC>iÃ֯:xzMjuØ̧1~dAU?|wc3'WybF|gH-[~bҞ%'?'NP,c ֵ'dMn=[͍,\uAE=;).f @ zXX!0q%;_%2cN@Fr8?ГMA,! A΃qg CJ\Ǻn|bV>ao׉^.^8#E_5W9sZKږ.yclRakKM'onD;*7 W7 v<#J<#|T.g>/V 6 q ST듰Pe#WاQau b.#Q`pkS=:ȚCHEs)ύhJkvͻH dct6P}5Qr'2iV׆.Gе: "~:4j: l6}pv'2bF]O~n6Z-8%`D{wQ%`P~;*ފj5bN7ST3Lrhg?KC=;fXj5r2D:H*. 7VgK!A^D(ZҐg,y x:M9Bp^F;")eDZ=z# ZىUVW1H_LSl}յ_s[#r~qz~Y|Oc/ľ@ ~AylQ|/FރЩJI!6rO  A5pv^%ap&S;AX?12^#(0zߪ47Jyd__0H Vgྼuh%.h .8hFy6ӕ#{B%] u^8_`cC`;?8bMmj"BWM^و% bpS%e\_ӗO V] 9_ȖsW*$P4 ]fD| ר1WIA}ɏcˬs{Yš<=Y`2@=1bVgqUt}VLZS? #YݜgJ:*O1h,&L[k$ 3VFJdx6JP~ڙ=R$8 v` =|;+2Ipwӹ"bS {U/@6󌘴y1TC1`uV$[A{ F9t; [ X]ѼvN_,&` ]U`{4T Hi+l4jt%!zZq"a$/Nc Ʉ3˞̄ Y`17]wb~% K\6gN1m BފO Qj Qׄo8kD]*^2&NZtg7sϜxF֚r#A >cl>pp_lVv>[ҲI` 4taA O)Rby`V"_0H'~#fZ{T[= \TyЊ 1$wpj495-ڛI_44Zv< h 1830ӛ+6նuvLQA0/oͅR(01NTVoxWEsQଏd dcVE U0F"_0 82c _v?:,:OUg,FT$>>be0t5o[}˛Ca(kpQVnD[q@Fܑc}`fn ^Or;"1.o\u !5m!3,3Ƶgr9^h(odPՖӌǢ /S ٻ\p7Ig3s k&_кnsu@&8wQwR̤PVy|y&|Zl+{]LحBap(3^5R[=ydPKϓPð&5 I׼ؠj`Kbޝ$$Xxƅ;Ҡsc#Q=0Q! P3,Dnus0;nIh ;q`GZ:)U;=&A<=Ϩ`eNAK 3' B[ ;  {*oB#߯5iU8CS1ҦS#2 S4vʾ =ѡVΠҽn;7kEтj_GQs0WwF+Է Lpjy67W ZFffBȽo? &'L բOYQf#Hc'C`֏NcH_GS j|ĩ(vҷ r~/l  $kG:=w "%?gP0"b"U%Xu=1> uUi~d u"w)44z~K."$}i]3xM_:΄_]".B=h׫ӡo|MO// Q\鮃i&h^%/MBu? v;dD]u0 , F y_ƴG1dOjhVA} +"Os`+\"z ^ZGzkhVI Xx閸,Oe wϣ0 zw`#;)yY DR0qtFu,+UGP!ݯ⑧Vsd[|AE#f &|%};WGnkWO/~T5W2 -KI'OB2X~=lzҤ=O>:= $T$8u]7WF ?F}?u9:.@8ܴb,:;f?'wmŎ=jKg~cf.\ҖZGF}lwOd@J^oL݁r)򗼒A5Y'nӫI`I$NreN9&Q%$XPáŽI09̟%("}~NPAAcx[2Q[ &Zj{:H4wN F$ޣ4mL< 勓UzA鯚o"Jݺii$MuV륙FSzf7`W!US,NO5gZ?7 _z۽Icp+N`bUb8t#{ǁeI3hUG .Z}쐯[l֡S;WNӝghe ,hŮ?,H9,21v>V46"<63tnd+@݂iӁ_iآK ;%hNL㝀A[d`lPujg = N]=މ1P=މБ [*y> IkvM:5c}} yЬI(zcx'-pHĪNQG08hnS Ii{'wb:U=މINNډ*4lôKOS Mj`f x'ܶhD:<މlACp\9d2q[>B(tgZś;F< ؅8Կ|>]_3H:{ v*?OTxG=:1mOAX/q# #Qa*&[B'imk˱aݤݰ 4dk{l*c?ߍќorFZT13#lڮ~RYZ~[/yx}2orcn`WKL$#kdͺ(w/ ;W`x3({U ecC4l=Bj?16xՃ8y;1>eEDm6ϒtYA?2t$:K7W(O,CKQ% "dp 0` w+gtvgP%}DvV\eFR/Pi.w$H^lF/y|TpC#A5f:6lZɃuS.g tg }Tp Zz.ƣtCbD_CKξb68ű6ԇD5aëfb V3eAnW50.1DoƨOЋB^F)g {" ]A6pϸkmE552>I}8S|Ȁf~YxbZ4Kc*0:I5 !>vDZ~qMp[gPg(W]utgN#Ϋ^ᴴCtiaR;#3΃ry57wbX;a pC#<n5 mgߺL"/wb wL^;QY^XDC=(Пt^@wbNx'$nNL%*L7Zg5s# M$b\<މU1AeHWυ3OUA3¤zwrq~1*X;1z q#\ӅAxb >2NQxgXNFV8={@6,2I@w#iA6S#0Z=މ7 wbc1pec4z9uE1N1ϲYU7 R+^ŒP$Ĕk"2UŌZ,SR\cO Х~4D#~qǺ″{{kUˑξ(5tk8 ɷ<ՂV1{V#}YJNӶr&mU,Ur &_VD0&Wort/Č# w-Zz7`i8aG[ ^?iMڌgk~pms jykKK\"ttS9kS.e03g &Xaolɍ}pL6[< 郧a:2S3D6jڳ5kf̘)<)ު[fKZv.؄tf7 nӽ\3崊ϭ&X7X^O- T7p"t^#X8 8J5@+*.If+Xn70U>w ug[Pvo']a ҊjSx0hZz+,{kVLD#fX֊a!MU`>ῆ>+>t(fPzXfXlޮA5V [?+>t:tj4EOBCV۪i-=1MRenNsg+>tKG_ H/_R՛OьH1tKs9q^dBH/6KU[]imQݜ4ٮW|تx/%Bu`g2笠VYcHvjjsg+>t:jFT ]'T11\ {ϪXq78G'+S 4Q 6#I*q\ZwXU3NǑXh"~U`#_*4'HLul)4QM? #zڪqB.+O񮃆NtG\osksyZzrsp` Z'N]taÉ *NHtS("@1 eJj$Ncj38x-Pd]`*c{"yU|6 փ([9$hyv#=S퍶5}WC>tZCC]*vzjvk=U͆ |W|Uj-JpbЇoUI^4{IW6#mBT@eۢTfNS}F~cOT1\o>ڷ gzzU/%~1.A>/{_D%]_A>2z8-3Y~^BBNƤG AKkYZeÜiv^[; Y]cFF6fFw#AS%"[*WsA.LI0]$(0,s+Nt`pʽZ1uQs3Iqߪ,* V[R`9Ip?IEέXx2$%hWS'iSO/Oз|j*Bϭη^O1}LJU=|6 ܵDa#f`$g[1HҭƭųAuw b!YX4)SV,6aq>b BE7X."ܱI"hY]A6M%=ZH]%M1Hpdt F__%IU$kJ"}$H=HphŃ~ ɭMъ|7~ XЙMlU@Q-ZRepI_FAv : w n$C+pM a;hKI;/b_I4"g%87D3JS_{={# |S %,p+A l|Ax8(Ql B M~ OE~i VAaKRWώ As:0K=j |սTrY^U:AGyàa2m?2 gr$(6Wc}BQ1ML?`[?edz ،V xHw$_i_@ &4ls6~I|._@pd{ď( E]1{*NO)i 2Wf~g> ='y`>|$* ځϽx<xN0j[608 `MJ1X6eЪTJS/_y䇽h nREL bJ1G6[ :`03&MƐLJQ ", T2C'U̐e!ٙgf$a.`fD*:U<נ!`„v|h>2Fȝ'c)c'7R3j46?fNGiC`uy`P?rus6'2B<,t>Rz Q'*uUn :WC²߰&z!t*fz>Ap b`j/*AI.2m T0LTcUVų6 ]'uI0Q`,?YOيݪ;~]qbw7eήY\b2h+LVг8rc0`+*8tnfx5A:]FQ0z(=0qV ~x>tpq Ncd-NQ]"# {=Y3+]YŃ~`Pmk D-\v|"EncRZĎGU#`A˜q 2(A?&کcw3Vfh PjM%vz#+iXk# sl})jgpVxr~Cld0rơ]>،w̯DԇRki Vr[ec1j?n(VLfl ECInnGA7WPh ^kAG> 5כh]/wÚxQk7~DMe,}@~8y@o]хE!~DMo#1s}soW}`NrqUdc !Z/K%?T<7–oUܽUt*Ul>]`ஊP_WbEm@qj*޲Uq줝YwU\-^bbק*np͸oVŞvn3J+;J 8bC9. UL߲*ֽ!DUWb4G= S̷ xQի%󽊕^*:d-VK' VwVh*ZD*^Z%GvKF XғLVŇ> T񫞫-m^0V%8↺ YVFZ[lc[V [/W/C%Y6^fkԇF{4~w1Gxش ?A[*-r\ZqaF>KG$|n3.=1}Ϗ:h1x5G bs `n߇/| Ԝ{F[tX5ɠ3} gmfMh~2h|2Lw H?3yE-^Ҩ`no6*i A vY w#Aj܋H#3#F˛09CwmIs{׷WkFw n|e=xA6ދY@׷gPnv Owu?9 A3fPw;8Ҫ.t;ͼhV-e>WfTP='DTX*tfC3^n8+!JCmqgx-ͤB3:^Rj2}Z'{CݗfO}ЪFb[1ohf1jyihf>I4iӤC'[qvZ$>Inw*vV+h¿u;oG85TP]Zye=|PB8.!jqs[έxBeV,JPycā׾5D b MV#ntP$xxct*A\7i6c #fT+*Z)!Ǣ9~AUro:F)elŇZcL]_f[Cvg0pA@͋~Bb/g r:v{MNj8M+ŋ㍎!X_Jٺ| vME9(Ǔ_~&l㍎%HPu"zAJN2:$(:1/cu%:p vqhѱ}74C{ȵ v1v𬃷 ^' ^KI%x:XUxv/bNN9(g z+B otp:H v<7䠜68H|OfՎ:Bv{A`6Jd ~';:F4p~kSdw:X/:8׫6_|Ac7}KJ#9 \ۈٱuVqkŷh6>A͎>Ak]O4A68u5QUww}7:XN`Q|82bqp>or*~A@mŮ˃>Xio$L+~T ^Zw}&Ai|8s;IoJ$铸IzO':]m:C5>pn?6Vl;XtY8?Q_j}_IѫzO9J v%0c!qvÁZ6d@zPzi ¸9}|}ƚУ~3}(98i } V7w% OLġd؉/>`..'6X&[V '"2XĺsOtHp뵫0M3?aη5'Jw_OO~:RBA=]CF'{4:KyaQ [Z^h=Z aʈׇVŢ C7_h9c;u-}-o j &gNU8$*aqJS DxUtw㣿}K_cbuXkekU dhFVV@o\UU-1ޚ28+uW2P@pbbq惖\AXH7t"NW[+,;_cQ)ÍRC}܉Nʷ|ПMes,/Nbp}oBlHoaU!Jgt}UyV,=[P_v.I?1tqHVw46'\f f-D;? y0DviW˓f> 1聬08yL.h48 ||Cmy?Ԫ΂=q}O:xmB^cܔNAC}o{ac:'BUo@}ptϿ/:O{nĉ1y)oo4]|4Thu';;)|:?Y˿a0c#R[ʤOۂF3?3_xVS#P-\h|TMEv;a-A,).pZK z'Qy?idPq=g0Y@iMpZѶ|D DvLy 18pCπOZ;O,cZj]C+6<g2X8|(:jkc0w }ӡף^Kr} X5OFmBxiW1~_vEMNKdl)BN{ZaI7K֫fh+ fBnAVZp $8oOd ѹAWu=yQw53֊M'!<≙^XRD9>0$Q ѓno ""M~c0 vxFO"]+X( `q&i9X3L򪃯d ävj4r_zߔEZ>\qg`c5Գ5# 7A?]` 3Τ]?+N V_ l`0(G"#L=42xm!ZsQ><8lͺ ,R0POې.Emxi@8Cq_ghf] '=toÅv9kD ixqv'6̛u7B8j FN} N:)IDATLc~Mb@%8 >_; W0U񛝜ړ}W{d v̞Gzo/<}nOy6C4+:x*fd{?1P4>`hk r}<{C2|dVs3a{!q5q#ǍҊy~h@5oS 5]!sC7LihQ alSU]>訃WWG|Hܧ >rH$,Ե4o' ^3x{) 3^dUUSGKnvJ&g0HtEZi &=b eUKz[!أt| f6~TW/q2NuOl.A~1Q~5QUډҫ_yDnA'hA E>f(_W WO hﯭ\ܔi^ D vr_Us[xc׿{&#(1,`1"%2BA}Oѽl b;0)2P#K댰qm%_Д;n5h/3Aa}#Q&yWC>3( P ``҆>KJVݺd[z-PgPD#ol: ӭ|`-lU)AFH ΁[Ԭeti[t/ۓGpG% iWޥ"7rqm5Nv A徛Д O/k;̮"8*ﻳk}FA6dē0gzYJxW}}߻S50Wϔו(~>ػ~bt[eh̊{ȓx.}һ0DzaC0X~/՗۵tz}tœѴ~>oW|AO |7M7E4|?ܠlj\|D\Ïf5txy=-xԯpr$ Hɠ'2Hx ߡwtPZH 4oiii'qС E$|}YxcamH>:F|G f\thr]7_|P|}^j+'^^Wq{k :s9h|Or<fnw:xW|[|\]#"@;cby2NH׈cK[>%GzBY>5+B^.JS]3ONYxd@]0hj.i. Ŷ*Fl҈ l.QI= iYgړqޫj7wTULR)>&fbj*z x2֎:Is#10-Wl'=X1> 5l$/G+2o3vB/FŽ`BR`IJrWZXW]G]ִP1օC `}K}y}!J.nE/E>mfШΥ q>68" É"Tu`VE5.'Yt%]yW6ȧ,.qΉгrqr9knhh(V]6-Uإ3hjSO_ƔfԄ=yOTgUkdA2"B(9ZH~ Ge7 Xb8@E-iNu$ _<ԗ(eh Mr\O$XoBaT ~#'!v@g3(5u5͂WZ zP?0qlTx]/W[yRZc", (S9ija+,/_xXB$#p| ̵pq!'|b`?,₀!VTS>ԾHkgj-]ؚ.YȅvUI G# $0鋊ը&6Z|E=IWbax4+pfU]'c! #/@?DNNPr&W4,qmƘrG=Af<#t2ߡ-oI-=An}t`  6AAX>"Gxu[b]aUIEe08adcXGF   ȯ[2XKo,5L9%2&,V.2Z3a/8Fs?$l] ԅ L&F4-LsʕZl` }ħ4".b_q Bf( oC~Yzb ".VxTp|63k"NOF$} ^}$|4'6 2J-c̠C@Tرp6 Lf6j_Q+ :qa8ͺ..[/Bl]Py&eLfĄ cqBs2Mj`>zk:q}[,e^\ ;+.XyneÉ8H;pLVđu ~*WƩ&zTMEX:M"jyQs`"b "PF/q iyצqcKyERēT=_PC]"nħd N!8E6xCx=b$TL3?(N/ BU >iOAb}0 VLNAk/Ud}!C߇~Ѧ&? r(+Lΐ+"d}At+ZA>џ֞1'ѱd~0ι!«^S3\y(&`A&S4d( V+00W[#f ᷥ6F10}Wc>X6[[Ŭ;tOG|'[_CyOЇ`L s0_th\Yi|v_}\O?%es$!1>c<}L?B^k~c5[?g% ؊IBM.(<}X*< g/Zlz8GV~B!me_z(~xk[9I)Z_]_h=BG t>}Az~ zZx e>{ Co ~u;/yal}ḵ@JӍ@ v;þLO:~#5kϺwW s;u>1 s> U&s;ƼUD*k`ZQSJ EuH.fl1Ws8d6.Ҁf$OVkZaXycII2+eDopyO9 \4^ R!'1M\'!̫xo˫1x ؠ'?\k D}Ӹ6x 5.i <O*#vj_Jש*pSV܇ .:nTʫNdzFzkiC!ś14eIcZU @/1;g p4NKp`Z H*k\Scj2g;Ui`J\>$'L!Y7_g7 ~59̠0 )A6Z[ Z&A͜,$ePC_]Y]|IЯuM݅%{ $V!g fWydhX]AcBJ:X5_ʛ@EAx^tLz:,Z9Mz"\Ofa z-ѽ\^|rs+s+b fǥ+pM>(a}$;$e֩'9sn F˯'( i]_2E4zG~6!RRzׄ ChXy &70]Tm52!i/A!bpX_NZ3[;gޭ^}X1"JUcUCK W/Lv:hGr>rSm ;™gزr[,qrSyJ'v_/;.AyVwF|$1LXt?^ +Cr(Ol5׷=p$ ١ 嶑LMӽ[F=,KӀJ"A8{*[gK'$ g͚5r!Ss| 5K9K([zlO_v 3az]}5l46]2\G4#Z~9zo/"* wrطc9:bi{"AZgG)2+wFY/j;_ߣ*Scq^nGvt}8 jK 6%Y?}l8 BǍZ`7f{nޏ7D%K`w6xr= +=CQ^3V4˗sIz^[~3o[7v#i㒀=o'*qgu-7ns`ȐOPg&835[ܙS^_MH<)D` ^:x4HGS g`뢥t//f2}Q 81:'q"b8bSϩ)t{pn񌵜_M;tl v `jRţ Wq,tRt/rʑ_:(y`0qlQ@kKܙǣK-Ys.7E["xIir#N5Vģض'lXԧldPѡ(=q<3x:+rdPrЕL$hN)v%jSXY<2qXcj:+r`P]Wd2S3ifA w` ?CY9O#.=8A7!@VU6`k$vg^s~2ơӽ_ˑU1N] Wd OtQa0\LGJy\<3FUZc< =L1$\j3wEg$Ȏ {Թ8t Dp$ǩxAWgz =hIAmid].A2)E,95cLt[l^ϸS9TJ`3\4ǔ2E< `q,]s2MhGG=>-3q1<sӽ[Kks#ݒylccXpYtH1O׵IXqg}wmyuE?q_nx /oT=ki8':Dϑ'p;O39rnX8M`T} :=E?A0`7t2m!g=K:qޕA}zŇNZu0 j bmcA7{l8N:43Ӻ}WQqcPO|f𽊏2VK 3߇x9h6 a J0(ᯛ6ήswg| >;HԊiL3<׮?3ȉ~Q  kgP% z[łjr<׮ϯW|U1HEM4VEc̯-GZ+(]Mh$Wm(}qyqO/8ҫAPqnO֖Z ov7gx]58378܊5w:j⾁D?FO_9kW} :U W5E Esa$ӎVng]ZŽR|i>y#QG@3ɳ8'| nC}yחzpBc/K>n9[g:l#n!Uqdo^>s?ӂwzq18xW76D . @z+f%?hF{>A@[ffwE)OyzA1]@]Y u*=@k`>7wݻ;A`f^^5ZW}Ơ|D43-], m ӻ{ylأa<U<nC{KyJp8*sk L FK5˛mKsQ67/ly t+{yhxzx v셍A|t݀W1hdmK3oA~k~L,z``g 4`e%4 6;x?w睫'|HtُZ8'ivQ}y%=9ue)oz#<=KOD}yPzfw@lk[>ǁC+}& \'1[w'np'aӸZ' j/WgX ۱Y u}v 5s[z Tz":EPF|Hq)EM!5|pHBǏ3+\Ƨ9=lj𡉇`>ƪFTOUZwz <q=~g{O3'a5=A_C?rcbzʨkGpiuÆ->Ҡ=i^˝OV_닺Fz>T|+Ee3^ҕn^{Nd4$4eANW%H tuں{9OZ~ ޅе u핇|b|8?X^c0~\8uc7&$Zx&4,L6{tL&ju6&SR1 { 6w:pԽMp  V3XlɄ:nE% g`/ګX n<]d ֔@7 vNuh^Ex.GbKD<_d DAڅmgZ]\ys7eGsXu|WS`WrW/?ͅ76|{޸]L^`RD 7-ڥKZ]VI,Tflhh{魜O'wg82_%Ή]=gMrW/?u3W&1>}M|Ҫו^VZ]\[UAt+vlP6<:hen8)-dx:eVt5)|s !AXÆfxw]c=aLo<=姦{h BGca?ǃ̣nr#<_4;>:>'N'mں$Ak+k8k8Q^:n.r>ah0uPespwxϯ NbsqH #} MVW|縯?LJvVLlOu]*p%Abkܹ3[sPoUl&mª.l kH6gʠ=T28mIE۾+0pĶ{xhMBsudq9Æ3NcGۻZ823fh+suqIkޜ!M;[C8b⽆ ^q%ZoyɳzƩ#~uh8 QvY0p3׮Npt_['VdIENDB`tecnoballz-0.93.1/src/TecnoballZ/tilemap-menu_40.data0000664000175000017500000005252012412501752021361 0ustar brunobruno L L L , 4 D L  T ` X DL  (( DL | 8 8 ( ,( L (  DL t ` @  , @ 0 ( ( ( @ <(  4 ( @ @   `d  HL   D < | 8 8 , @(( DPT@D X \8< P T P T (  ( (  4 ( , 4 ( , 4 4 ( ,   , 4P @ 0  , @ 0  , @ 0PP @ 0  , @  , @ 0P (  ( D <(  (  (  (  ( D <( 4 (  (   , @ 0  , @ 0    , @ 0 0 0   (  (  ( D  (  (  (  (  (  (  | 8 8 , @ 0 <| 8 8 , D 0 | 8 8 | 8 8 , @ 0 <| 8 8 , D 0 | 8 8, 4 ( , 4 D , 4, 4 ( , 4 D , 4 , @ 0( ,( ,( , 0 , @ 0( ,( ,( , 0 (   , @ @  ,  , @  (   , @ @  ,  , @   D <(( D < D <(   D <(( D < D <(  ( @ 0 @ 0 @ 0  ( @ 0 @ 0 @ 0  | 8(  ( (  ((  ( 8 8 | 8(  ( (  ((  ( 8 8, 4 ( (  ( (  (  ( , 4 ( (  ( (  (  (  @ 0 @ @  @   @  <| 8 @ 0 @ @  @   @  <| 8 @(  ( ( ( (  ( , 4 @(  ( ( ( (  ( , 4,  , @    , @ , @ 0,  , @    , @ , @ 0  ( ( | 8 8  ( ( | 8 8, (, 4 ( , 4, (, 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  ( 4444444444444444444444444444444444444444 (  (  ( (  (  (  (  ( (  (  | 8 4 4 4 4 D (| 8 8 | 8 4 4 4 4 D (| 8 8 | 8 @ @ @ @  ( ( @| 8 8 | 8 @ @ @ @  ( ( @| 8 8,P 4 @ 8 8 @ @ ( @  4,P 4 @ 8 8 @ @ ( @  4 , @ 0  @ @ @  < @ 0 , @ 0  @ @ @  < @ 0 (  ( D <(  (  (  (  ( D <(  (  ( 4444444444444444444444444444444444444444 (  (  ( (  (  (  (  ( (  (  , @ 0  | 8 8  <| 8 8 , @ 0  | 8 8  <| 8 8 D <(  ( , @ 0  , @ 0 D <(  ( , @ 0  , @ 0   , <(  ( D <(  (  , <(  ( D <(  ( (  , 8 , @  , (  , 8 , @  ,, 4  (  ( ( , 4  (  ( ( , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8,  ( ,  ( , 4,  ( ,  ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 8 8 , @ 0 | 8 8 | 8 8 , @ 0 8 8 , @ 0 | 8 8, 4 ( ,  ( , 4, 4 ( ,  ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8 ( (  ( PPPPPPPPPPPPPP ( (  (  | 8 8  <| 8 8P 8 8  , @ 0HLP | 8 8  <| 8 8 0 4 ( L, 4P \ ` T TP 0 4 ( L, 4 | 8 8 , @ 0 | 8 8PPPPPPPPPPPPPP | 8 8 , @ 0 | 8 8  4 ( , 4 T \ x $ $ | l p ` \  4 ( , 4  , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4,  , @ 0 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | D <( | 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, @ 0  4 ( , 4 , @ 0  , @ 0  , @ 0 , @(  ( @ 0  , @ 0 (  ( D <(  (  (  (  | 8 8(  (  (   , @ 0  , @ 0  , 4  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0    8 8 , 8 , 8 , 8 8 , 8 8 , 4, 4 8 , 8 , 8 , 8 8 , 8 8 ,  ( 8 4   4 4 @ 0 , @ 0    4 4  (  8 8 0  8 8 8 8 , 0 (  (  (  8 8 8 8 , 0 | 8, 8 8 0 8 8 , , , 8 8 , 8 8 8 8 , D <(  8 0 8 8 , , , 8 8 , 8 8 8 8 ,  4 4 4  4 4 0  4 4  4 4 , 0 0 0  0 0  (  0 0  0 0  , , ( ( ( ( ( (  ( ( ( ( ( (              (  (   (  (  (  (   (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 | 8 8  |    <| 8 8 | 8 8  |    <| 8 8, 4 8 8  | 8 L,(  (  ( L, 4 ( (  , @ 0 4     , @  <| 8 8    , , ( D <(  ( , P T H L  `d X p L, 4, (  | 8 8  |    <| 8 8 | 8 8  0 <| 8 8 , @ 0| 8 8, 4 ( ,   ( L, 4, 4 ( ,   ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  ( 8 (  (  ( D <(  ( 8 (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4  @ @ @  @ @ @      (  @ @      (  @ @  ,   ,  ,   , D < D <  (    D < D <  (      , @   , @  8 8 (     8 8 (       8 <|     8 <| , ,  (  ,  , ,  (  ,   8 , @   8 , @     (        (   , @ 0  @ 0  , @ 0 , @ 0  @ 0  , @ 0 (  ( hl(  (  (  (  ( hl(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 L, 4, 4 ( , 4 L, 4 | 8 8 , @ 0 <| 8hl @ 0 | 8 8 | 8 8 , @ 0 <| 8hl @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ <| 8 8 , @ 0 | 8 8 | 8 8 , @ <| 8 8 , @ 0 | 8 8, 4 (hl, 4 ( , 4, 4 (hl, 4 ( , 4 , @ 0  , @T  , @ 0 , @ 0  , @T  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8 T <| 8 8 | 8 8  | 8 8 T <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | , @ <| , @ | | , @ <| , @ | ,\X\ \X\,X\ (X\,\,\X\ \X\,X\ (X\,\ ,\ \ 0,,PT ,\ \ 0,,PT, <,,,, < <,\, <,,,, < <,\ < <  < < <  <PT 8 < <  < < <  <PT 8 D D D < D D < X\ (X\ (\ D D D < D D < X\ (X\ (\ | D 8  | 8 8  <PT 8 | D 8  | 8 8  <PT 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 ( ( D <(  (  (  ( ( D <(  (  (  hl , @ 0  , @ 0  hl , @ 0  , @ 0  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 (  ( D <( P (  (  (  ( D <( P (  (   , @ 0 P   , @ 0 P  (  (  ( Pl (  (  (  ( Pl (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 , 4 ( , 4, 4 , 4 ( , 4 , @ 0hl  , @ 0  , @ 0 , @ 0hl  , @ 0  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (  (  (  ( (  (  (  (  ( (  (  (  ( D <( P (  (  (  ( D <( P (  (  (  (  ( (  (  (  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 ( ( L, L, ( L, ( L, ( ( L, L, ( L, ( L,@  (  ( (  ( @  (  ( (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, 4 @ , 4 ( , 4, 4 @ , 4 ( , 4 , @ 0  , @@  , @ 0 , @ 0  , @@  , @ 0 (  ( D <(  (  (  (  ( D <(  (  (   , @ 0  , @ 0   , @ 0  , @ 0  (  (  (  (  (  (  (  (  | 8 8 hl| 8 8  <| 8 8 | 8 8 hl| 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4 ( , 4 ( , 4, 4 ( , 4  p  d l ` l X  p @ l 0 p ` t l @0000,,, <| 8 8 , @ 0 | 8 8 | 8 8 , @ 000, 0000 , , , ` x \ ( l p t x t ( t , @,,,| 8 8  <| 8 8 | 8, ( , , , x \ l 0 t  t l X p `  t  , ,88   $8 8  |    <|  | 8 8 8888`d X \pt`d \ l T ` d x T  P T \ p  8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 |    p d x d T p   t    00  8 | 8 8 , <| 8 , @ ,   , @ D  00  4X\ l  ` t l  X\ x \ t ` \               |  | 8 8  t l | l p ` \  ` t P T \ p 88                  88 ` l t ` x l ` d t ` \ \ T t l | l p ` \                                        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXX XX XXXXXXXXXXXXXX XX  XXXXXXXXXXXXXX  XX  XXXXXXXXXXXXXX  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX                                                                                                                                                                                  | | 8 8  | 8 8  | | 8 8  | 8 8 , 4 , 4  , 4, 4 , 4  , 4 , @ 0 PT , @ 0  , @ 0 , @ 0 PT , @ 0  , @ 0 (  ( D <(  (  ( (  ( D <(  (  (  , @ 0  , @ 0   , @ 0  , @ 0  (  (  ( PT  (  (  ( PT  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 L, 4, 4 ( , 4 L, 4 | 8 8 , @ 0 <| 8 @ 0 | 8 8 | 8 8 , @ 0 <| 8 @ 0 | 8 8, 4 ( , 4 ( , 4, 4 ( , 4 ( , 4 , 4 , 4  , 4, 4 , 4  , 4 , @ 0  , @ 0  , @ 0 , @ 0  , @ 0  , @ 0 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8 | 8 8 , @ 0 <| 8 8 , @ 0 | 8 8, ( D <( (  ( , 4, 4 ( , 4 ( , 4 , , @(  ( , @ ( D <( (  ( ( D ( D <( ( 0 ( ( (  ( , @ 0 D , @ , @ , @ 0 , @ 0 D , @  @ @  8 8 , @  ( D ( ( (  (  ( D (  (  ( (  4 (  | 8 8 8   | 8 8  , @ 0 D , @ 0  ( D <( <| 8 8 , @ 8 8  <| 8 8 (  <| 8 8 , @  ( D <( ( D, 4 (| 8| 8 8  , 4 (  , @ D , @ ( D , @ 0 D <( ( 8 8 (  , @ 0 ( ( D ( | 8 8 <(  ( 0 D , @ 4 ( <(  ( (  | 8 8 , @ 0  , @  ( D ( 0 , @  , @ , @  | 8 8  (  ( (  | 8 8  ( ( ( ( , @ 0   , @ 0 D , @ 0  (  | 8 8 (  (  (  (  ( D (  (  | 8 8  | 8 8  <| 8 8 | 8 8  | 8 8  <| 8 8, 4 ( , 4 ( L, 4, 4 ( , 4 ( L, 4| 8 8 , @ 0 <| 8 8 , @ 0 | 8| 8 8 , @ 0 <| 8 8 , @ 0 | 8P 4 ( , 4 ( , 4PP 4 ( , 4 ( , 4P                                        (  ( D  DL DL (  DL (   , @ <| 8 8 , D  L04LLL  DL DL L  DL DL tecnoballz-0.93.1/src/TecnoballZ/tilemap-guardians_20.data0000664000175000017500000002525012412501752022370 0ustar brunobruno 8 @ (@ (\ 8  (  ( $ < , ( $    < ,  D 8 @ 08 ( (    LX TP HL H 8 < 4, L 88<@ @H H , L , H 0 $  0 D   D <  @ ,hl(,P  h $0     $ ,  < $(  4pt D h ( @  4HL  h   8 @ ( (\ 8  (  ( $ < , ( $    < ,  Dhlpt 8 @ 08 ( (    LX TP  H 8 <,0 4, L 88<@H H , L ,  0HL $  0 D   D <  @ ,ptP  h $0     ,  < $(  4hl D h (   4  h HL $ 8 @ ( (\ 8  (  ((, < , ( $    < ,  DHL $ 8 @ 08 ( (    LX T pt L , h\ (h h ( (  0  $ \ ( $@D $0 $\ 8  L , L , ( $ $h \ L  (pt  h $0 $0 ( $h \ $0 (@D  $pt@D048<@D8048<@048<(, $@Dpt048<@8048<@048<048<@048<@0048< $@Dpt(,D0D@ $04<@048<@48<pt@D@D@DD@D<@4@< $pt  @D (    h 8<@8048<pt $ \ 8  ( <x|(,0  < 48<48< $    LX  pt 4, hl , L , x|0  D < (8<@4848< $ ( (pt048<@048<@048<hlx| $PPPptPP8<@PPP<@D0PPPhlPPPPPPPPPx|PPPPPPPPPPPPPPPP(,PPPPPPPPPPPPPPPP $PPHPPPPPPPPPPPPPhlptPPPHPPP(PPPPPPPPPPPPPPPPPPPPPP\PPPPPPPPPPPPPPPPP $ $PPPPPPPPPPPPPPPPptptPPPPPPPPPPPPPPx|(,P(,PPPPPPPPPP $(,PPPPPPPPPPPpt(HPP8<PP8<PPPhl(,8<8<8<Px|(,(,HP $(,(,Ppt(,(,(H8<(,H<,PhlH8<8<8<P(,(,HPx| $(,(,Ppt(,(,(,@D(,(,PTTTTTPPTThlTTTTTTTTx|(,T,TTTTTTT $TT,TTTTTptTTTTTTTThlX\X\X\X\X\X\X\TTTTTTTx| $TptT,ptTptTptpttptptptptptpt,pthltptpt,ptx| $ptptptptpttpt t  t ptp  p  p hl(,lhl t  t  $hlhlptptx|ptlhlhlhlhlhlhlhlllhlhlhl $hhlhlhlx|pt(,hlhlhl(,(,(,(,(,ptptptpthl $hlhlptptpthlhlptptx|hlhlhlhlhlhlhlhlhlhlhlhlhl $hlhlhlhlx|x|hlhlhl (,x|x|x|x|   $ptpt  thlpthlhlpt  hpppl  pthlpplh  hl $hlhl  lhl8<pthlhl  hlpphlh  hlh  h hP $pt  tptpt@Dpthl   ptpt   hlptpt  hlhphl  lhl\hlhl $  hpdhlPPl8<(, $PXPd P $ $ $ h lP`d ` dPP`d@Dpt PP04 P04 ` dPP ` d ` dP ` d@D $04 $04  $ ` d ` d ` d ` d ` d ` d ` dpt  ` d ` d ` dhl ` d ` d ` d ` d  8< $ ` dhl ` d ` d ` d ` dp $ $ $  ` d ` d ` d ` d ` d ` d ` d ` d $ @D ` d ` d ` d ` d ` d ` d ` d $ $  ` d ` d ` d ` d ` d ` d $ $ ` d ` d ` d ` d ` d ` d8<  (,(, ` d ` d ` d ` dx|x| $ (, ` d ` dhl ` d ` d ` d D $ 04  pt ` d ` d ` d ` d ` d ` d   < ` d ` d ` d ` d ` d ` d  $ $  <<pt ` d ` d ` d ` d ` d ` d ` d ` d  ` d ` d ` d p t ` d ` d ` d ` d $ @Dpt x | ` d ` d ` d ` d ` d ` d ` d  ` d ` d ` d ` d ` d ` d $  $ ` d ` d ` d ` d ` d h l8<   $ $,, $ $(,pt pt pt pt  $\X\X\X\X@D $ p\ p\ p\ p\pt\X\ \\X\\X\pt ( pt pt  $\Xx|\X \X\Xpt p\ p\ p\ p\8<\X\\X\\X\\X\pt(, pt pt H $\Xx|\X\X\Xptp\p\p\p\@D\\ \pt ptpt pt \X\X\X\X $ \X \X \X \X\X\X\X\X\X\X\X\X8<(,pt pt pt pt  $\X\XX\Xpt p\ p\ p\ \\X\\X\\X H H\X\@Dpt t pt H Hpt  $\X\X\X\Xpt p\ p\ p\ p\\X\TX\\X\\X\ptptTlXxd\8< $TPTlXxd\ptptp\PTlXxd\\TPTlXxd\pt PTlXxd\@D\XTPT H Hxd\ $ p\PTlXxd\\ptTPTl HXxd\pPTl HXxd\(,\XTPTlXxd\8< $ p\PTlXxd\pt\ @ @ @ @ @P (lXxd\ p  $ @ $  $PTlXxd\ < < < (lXxd\@D $  $  $  $ (TlXxd\pt\ < < < @ HlXxd\p ( ( ( ( @lXxd\ @XT @PTlXxd\ $ p\P @l Hxd\8<pt\ptTPTlXxd\pPTlXxd\\XTPT HXxd\ p\PTlXxd\@D $\ptTPTlXxd\ pPTlXxd\ P T\XTPTlXxd\ pt\PTlXxd\\ptTPTlXxd\8< H LptPTlXxd\ pttXTPTlXxd\ P T\PTlXxd\  \X\   $  $  $  $  $  X \ @ D(,x|4@@ D L $x|4@@ DptDx|4@@(Dx|4@@8<(Dx|4@ $(Dx|4@pt(Dx|4@(Dx|4@DdPP PP04PP\Lx @<dTPTT T TTPT8<PPP P P PDPPPPP04<X,t| L\dP 8< $<TT\XTT$|T T PP PLP8PP P P T  $   $  $   $  <  $@D  < <  $   $  <  $ < P T $  $  $  $  $  $  $  $ (, < < < < < < < 4 $ $  $  $  $  $  $  $  $ pt < < < < < < < <8<  < < <     < T  $T TT ptTTT TTTTTTT @DTTTTTTTTTTTTTTTTTTTTTTTTTT $TTTTTTTTTTTTTptTTTTTTTTTTTTTTT TTTTTTTTTTTTTTT8< P T $TTTTTTTTTTTTTTTTTTTTTTT $PTTTTTTT04PT04 P04(, 04 $ HLpth , TT     h  D L  ( ,   hh   $0 hl $  h h $0 ( $ pt H  $ $ (  88<PT@ @HL H , L , H 0   0 D   D <  @ ,X\ $P  h $0    pt ,  < $(  4PTh (   4   h X\tecnoballz-0.93.1/src/TecnoballZ/tableau.data0000664000175000017500000010232012412501752020070 0ustar brunobruno                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               tecnoballz-0.93.1/src/TecnoballZ/lores/0000775000175000017500000000000012412501752016746 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/lores/Makefile.am0000664000175000017500000000047712412501752021012 0ustar brunobrunoNULL = pkgdatadir = $(datadir)/tecnoballz/lores dist_pkgdata_DATA = \ all_sprites.png \ bricks.png \ font_score.png \ game_fonts.png \ gigablitz.png \ head_animation.png \ menu_fonts.png \ paddles_1.png \ paddles_2.png \ right_panel.png \ shop.png \ small_fonts.png \ tilesmap.png \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/lores/small_fonts.png0000664000175000017500000000173412412501752022002 0ustar brunobrunoPNG  IHDR,`PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@IDATHA 9^[plh;B*nr5|\y8o Z @7oΡi;h|Cyjx͋{|fk:w`7;և84jLIENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/paddles_2.png0000664000175000017500000001120112412501752021304 0ustar brunobrunoPNG  IHDR`RPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@'y4xR{w;JpůIR-|.O oH0hz\kg͓'y2"/aY<xG'y 1CneV? /9<9xGxJC_NGƃ2m|Oi9J7/%3L>cWBxSȓ'xxbMۻ/io5G3#RxOg%%C| VtΥXh^o;(;y7C?\W♦~4\5 ?.5|W$u4B 쾧pyT] 4X8-v8nʪ+Ԥ[nI ׇ躏6BaOh;9@>Vz];*7kU׉=u_>]Tj`}Y4{&[feu拞&(?_ '_P<58Ļ)s1NՇ߮r;s*'߿b;Cf34|ۯ~y}'/2?ǰCy?E5s3gͼpƣ% O޽0u5p0p46Ox[7aI@8_xFk-&K0p+vu|3ry36>x4 kݿp#&(H)FNƯ_+4gV`yrFF"3ĝ xxXe 1^bb <tk8x,A67ټ!m"U`#Sor/h%2 >G=Kyh:Ҡ%4} ۛґ)<+$0B|f ܞN%Z!+7Z"/nD {b 3pV&9qg:Kt糙󔕫В77%I@b OJl HQ{ Yɼ@" 2XQd+ A T{ ]ʏw2"m͝9 ~)@ܙ'Pdc@+tdҶ::2 Ψ:lJ_c$H% .`nlIމ:-:a;+@x %pS:|QW)1Z^X+-~:,y@ýІs+2Ӂ% w?]wA~9b7~`FPQ{x|^ >ܛEVk\:.)j u z?G8_Ku]޺-挑[a%{8y*B<5(ZDd5vD+4P3B%(@R S`*ho6pJu [~xґ,e+ o܎n~ *D([Gp)QɝB--Djb@{N[_ uahs$̈4wjPy_=i# a@i>>*Uc$N@^6PA/ /yL?0}\^t9 &t cĠ+671jDyC+4.R%~bk$:Z[R92vh+U0y;/рIt J)Y0:&dR؞LTx&C'H_[Z*PJ#$F>4Ò;1ҽP_Hyp Of3~ L@T%jm~h&SR(-OS{3@r.Ȋ7+8# |dTOSWu/hOx&Q:QdS-/<lad~Nh HY0u¼}uu U^XP"ΗTT[6BQ? #; G3]Z ~{ ,rpofWցD#%!;5A_XYf#>^'6^xυx,u ȧΑ@ N^Sk{uA`<yIdϑB?1: 'qf_-*P)s(,hD*UQ@BQy _F#2 E&ѽDB7P,>;c:&<`-NIϑ Dkf7/ܝ{. @SB:oh̆IMie't m;[t&P P*wb]^u8Gzw+~ n1nZSm?:ԩ\4c_/H:&W/.x NV:5r {S\RjKЁNfKӣ%NOK( N */30HU= EH/M}V(Lg jW/6b6 |X=Ck@@JCWUT 3vT[=?gu[B=cj-?kU:GZ<xa.'PIENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/shop.png0000664000175000017500000002674312412501752020441 0ustar brunobrunoPNG  IHDR@FMYPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@ pHYs*IDATx]M(b>{hYP#E& `%K| USwٲQBfB>pacٖe]!O?.\}EgPXG3$2(_]RͮYlAU䏮8m/ؗ?,49X(?T ()mOpl|Y{ҁ !yu= 6R;|yY"W | L^[߉|S]ivgy@V7|apoF/\yݾcUQ >WP>m h0Ù6gPm kᶰ>x5v_;N;^ʆ3zEDy~zGhUy C^Aչ|Ka'/dN|CPMD9IJ7Pjn1l8~M=(* 8_P/iO')lqvJ}@sI(_i`) "~!/NggBt6_% g3h͚'@?w}{}qc 먁+ ?~M*D6//3Vz /A ~դ03 <3hpۃW4U τ`U;n,μaRFK^68ڢ'\AzYj$T.#X%ӜCHj 7c +q+8"j?~3^/[[>M$' r > '5pr4L]Uc#ˆ|P8RwQO÷)O$T`{b&xPP~@\FKJHI $MwjA:wN;fM&Qp_4J̌(ꥪM8'%ۃr i`E llQ$ #Pߤcc^Yp hjzB9{s^>BݱFOۥwc#a#F,oKgg*0y}|Th+-]A"+2'Onk寧FġOl#$[\udD&Uy)Qd?/Au.OP&'jiJGz$ Yy֥mU]<\?7G%< hS7+J:{0MOK5.eFbSTws}W~EN @A1><9 hJya0 QSnI.i=gD6"j4` J Ρ-b5yr!ngN}-d ,z?5d>z8ۈD yTFX -IT#q\?FF(JÓ}m#ّ+TlDb8+ 0[DN?z֛սFFW+-O}~{ÁO"ߵdbY~RCF=YIyiP۾9ᬕG"AOOET"4p(fRVc FgMףw)E}*$]?8O=qXw?uOa0m`Ey+h2.8875- АsD C ѓݰ>}r&r 4>u6# txi9cB^3 +6*,atVT)7"Y}84BP\2jD| m:U4]r'PE¹ztk/L~Q0XAV곊4/ɁNG |C?Oo//廊?V&!;?TQ>'XGH*ܔ]/(CQwi`XQwo?;~A(_q 7*0\> P}TG}  7wٻ/(C$XfP~-ߩOpUMASZ~LRU|RB}KPm0.S94RU|RB}Kk6z0 2~p埩O +㾮}忚+\}GGnNʼnKoԧ@}4Cf ?/;?}}Z0zPn%elY0;[p͐}Cmpr.~-7_a3]WX2|[Gxm"YU$kקI [u8V`J!1/;f5Ꝅ[A8 0, [KZ-\>w8U## 2&&<y" kav `)ݱL2agsOq =U-W*Lhŭ g4ЍtQĎX = pXn2X J^0wD)}ۧ Dp]>tvu>*83#p dgI!dItsel[H454+bn9QO\6т"Kn"5@8קܜ4FcvqHa@+42AɒxMyy"waLTRX>0]m//lfi^G\QVf@>k WoDCnȖd 3Hb+0`I"6h6.o,Quyz j'Jg*z1-k;Sh?+ndaoV@$Z/CnF˖qkcz<꯿ Јx~xp9Mw #BpSǛ?é.87"п# w&ّ.ĿV!Pfs矿巍UK4"Sx ٗnjyx-~_6-7 (pbj't8XIfC?(eD xL.[iDЊz+X-\50ቄ݃w&rn `0/TP.61DU~PqoC_ZRϪFS7vY bt\n b0"f=`,[86anNąqIs O!|-XB}$OdN"' 44UЄE+rВy#P.#~6*m!.8c~2G'+ڐ4f{HrXL0=`0>0.9 ħ|pbUx%_*"w9; - zs{mD0f:"5,jTʁZe&[Q}IҶ=L1g4&TVv$ž5-{7ۀ1!^)™;rTx6ˆ a[_FX),qYWc,7+pE -d)'9 8j P=W/ 3>Ry%}>Xb'mt F.T=:K9V8 (jl Pu>1"y-VF@3>YF䪏MhHmW4+ӑQD"!ƁsLhX&QqfH #r88BCO1) #eZ0vLCF$8d.W ²”GQh RوPczDy,؈@]#$ 3"|'2׹"4pOIwDri,4"61rbfDlƂNuf.5|V hp"0<3LO"!ռĐXG##rגgr#}K *zվ;~;,HA^c #a|z?`_:uh#x38FD!\ {:Q2[xAw }&v8W\ki\ 2-ASYt1 TȪ . 7dnOr_$f #$7BiCCXH*H kFF>ȍj2b65TfDwE<&YU<.,g?و`aa8N+yw_h9|ܷWHc} &^"[&}â:_ֹS[yۘ.M4#oO[8d8 ck->$G &nzu?  8W rqyYAs͒~萙㘔EP>M,^h` >q6*ܺG58W @6)E&"oxb:ҴfMTw ;e>J\"U@6*,$F3Nj,1/cV|[`'iVspۏ;y GJ$I M'͇zxJ%F" <9 P!mM1 2H`qRF q儏4QuQ<dO\R'XL6#rY|L2a4!mt0'8gk\ ͼȈeqMN.>dbMTщ[t@5P4az!-ɠ[ӆ;3$&k4P4ab!c pԠM'$gɞQ(u^wFDdEQa3x5s@+SoбpEX"u:@6LCNE+ K]LϤ]<=No4 M2Ѳ g03sO\,EuX07@ߖ|6%5} b&U xIFl>fb +yE`~`ow* `W/Gh"gΏ ~HbF.;ZbaD4 MBĎD)#V8ܒw_0Rj ub#R͜ꠁH j!@bЕ7 #RX1 V8 Tv S}0讘7a@e@Q YarTyYIV8$N(o05's11Rp@o@x@@L4m5cB r#""P|3#~ >:ŒW@2Ɨ۠ Ò+$-dƝߕԄ]$)_yXXF ̹@yԸ!G"ш[ FkYK#\|-QTma^y Hmp2"dH ->Е#҅4"-+h d6CAaТ&Y`2"@~W"G"وtc8K&3nr\mzEd;'59+"hD tf"G"وt> qHv0xbiƷltk-룒!@͇a LVVa&\1;#bUnDJ+-Q6IwHK{ɋ7ə/x 0fO6C$s"4iD6#҈} ѵ8M7mVg ?0lJn| #4"mȈԦlDi,>." k4dF(hi&['ުtD̞Z$V-ZZ%4F+lΪG" *$lvio6ȭҼ)쬚oap*E"r#VuGf,bY_EI2t"«5Es˜]KqtiֆV`QR&lF%FVX(5)SQgE"@iTF^f [xQ#*ᙖ[#H$n<LB7bDڨÉu$و%i0e}5JY8v6ݘu;r%g*A#B1&B Ǜ2;&} gi@Y| ɋ/cQZj @}}ggnj6k&I Cu>xrisw+<ϳ:6оu1_<&r&qdErĭN43+[׫!Tci^UTL^r4 '@ly*^-b8 `7W%w"F%֡DgLάS^>_O\^ "%w?qDZ n]9Rq7a_O\nD:{5cfc+r0ܺB~;c1ŕ;Ѷ|O~}2#+SʁHwoid;$9;+7gF<8>N_Ⱦo/۷N _d߷Q[OWʿvߺAK|5kΉ0OG} ´f[%r;{R~>quJ(p88s ~d߷Q}q*: ^fP"Gԧhpt}}Fl]c o BEhafԧۍzUk5YRؼa}ˇ1}<" O>QOR'n%?O`&(`˅+ͨO4 B2y|19rZ .[>qwҖ:-e;Y}"H{߷Cv*?O`eD֪AW#ⲝ=aD.rZA0bDɆ#x7/_Q@}`.g؈p?=+JiwiD?& lλ)A=Sw-v"- ||s[^[%?PW2"Zo|Uܳé:ZTeR*= ?m?}ʏ &P Pb'0z ,Wu #Byu <{ | k`h#c ԩ)lqvyawlFɍjVJ{ ̔ -wO 4&oȑxRtÈZrC),n1eˏ?"?</ЈXxԠG[q4&gʏ&`J@.ݡdu~˙@(+lNG"^vR)Ѻq7!p݁U <-P~@ 'uXEYMmY.mٴaäh#pР +a$QoÈ KShSj"eԈh#& 7ηbc%Dd'!Gݯٖ_ 4]F#)?86l ı}t 5"IwV bڎDHgʏ&\. ƨAUWHHDK+[vE"1́ᦧ{7V}Qy  >tܪH:\yp 5p=TW=; S6(26BTVh+s!hcغ v򯐗!|W08Љ:a9+3n\#s݈+# d둏k>oޓ {Yru3WNJdс9\O&{a sXc=O?<l<~/zc*?A\s;0aL.?|GQ1, Xbݑ*4;!ءcI[;4pu;u@| l"V~kj͓FW@ɸc_\}+dDc E$rJ} nO.#CW &[.OX_E"gܱO&x} &[> :gܱ/h7 \Z&5I!i;ei/"3”l .3-?F"x 2(@ \qFbH;@rcma.H\w7 nȗ@tת=`Gp1]ܱԄIϦaa.@rE>P4Vint쪊#aD#MxH#bdȎ451Hӎ6;%cav0ёHph߷/E:/ݾd9/JO1A4}"#= if `/~ʍyM}>n좚#-yM}E+̎ RMm)#"mه?~Fch}G:Bk rb߷SPӢ<[|SGU6!Oկ~l Bwrc~#P{0gp ƅ?_rry1*į? Wsw, {Oh{\ jmxn8ݯt6-@4 --qMZr*D}M_}o\= HRs l!x|ezu3'tZ9P]-X\8wXȿYP@5&m?]W&+S|q vk6/3Ϸ*#<kUjjc)؅+{ f4' 4*N?k 6Z>Z @xZt-3%NtW%Ronz#(a @ x@x`\YPsk ً{xB « ~ `z\v0~~ Y(͆}(_zMy`s pê:tW'k B7>D#Mbഁ" vAB@MSR5+.9%@ U>hV^U{hs\½^sF^bHjOk9H3/m:3~= :$AТ] "eIotanN"?2Sҳ?=xŒ]%~t/vWV+1z$K E} qo `wh\X B OͿA{FzyJmA>e O<_\ٸrp)ֽ>ߠuVDVPe')fMxjB U$I* I~LlZ9`9+IQZ1z}p/43(\MURt߅@ @|̙! ـAd6=EB,1HKM3~aL[ KD]@+ |5X*VWc`p? `XX>K]4v #0UIӵ,Mw)AקDD+{_TĔ6`t m ּUD3Z56,HCB  12Ҁ.^iē]I7i07ݍږo% !֭j5q"?`ˬA:1.qbZEa\ L}Vs3f!6E@d I@+.xr(Ă%(&%g$nL#l2bl̐JkqFAcȢrMI2 }|iԽ@j6q"OLN]r$0,.GDcR6YJG'lE2tӣY8Iipu(FX0xtG? f ?S6 %A1ȯƎ{p#7`JjПBhbvn9Q@`h!01.Q,uND>z~dAjt}9t:L<_yL~BK3JWx(v@!Esګ<%򽐽Ǿ/!⏍8>utp}[g?ŝydjscyzyCƌ\l^ҌM͋ϵן{m_YWԐfag'$緫< |œ6Wnr+*ݑ!!GC4eWMҒ^|mtxI) u"KWc5w,Aꊍ Wxp8r./|kmS9Z[0,;%ŀcc D01m0_{ w~E\SL~B }cp5n<Ȭ⽱Db!/`PfL([έF{b#S>,c7ZB dj ĸɝuc*`^cF_fz6؂c:b0 4.јL "@)Ǔx?c mw5,`F,,~`WL7& KM;_ǫ9Pӹ.4(^\3kR$ tjBjPq_nK 0ׯsq0湶A9~ `E C m) @wks ˣ r}8`)H MJ5d'ŧ0 \kZ:UcF^7[ohh`{N+t-6 O2m燿O [3/} iv/AҌX7ʇE7s 5?žI0A>̫_mv䟐A C?L`,~ 2{nTBDJ/gK :;vIA|34aA^m/EQsĢ֋DZ㎬\4ʎb =9V{~R= fAS:sVPN8k1//w%fX⃶"`fft1ǯ*vxg Ws7=NTpM7[`۬l+fgk.28G>-+zo;~%, Đ؋DM"hgI4/aZ/aq/8/sJv:`14pҞ uqFuN U]XKя)&d#AAoe&d@OV|B |1 ؎sʁs6 4ɈNoNlrlL`_ ųV ߎ# 5 ujnBU 6OL"{c j7u'Ao߼QjۘO@Z 0kL!*3* iZIJ'Pu7ny~<%s@zgOtBT}eodU"NrIUNhۡYk1´ }&ḳcG1@$5q4,w4x=ȚݕU`Vй؟[g dz)d$Kzw! Qֆl|;4wz\jOu%^;ov5)r:6~r}>q0&ofL׺[u" |8JLi&t%6rDY1M1YEv&LKd:=IIҿˁ vŖUϜ)yo br]0L,K);w)IV.qƉ!}W]NY_u{2׍  tmd$0@6ILW"9ޯ=O]›(bDuDI-Q1H^fep~בhCP@  {!z.$8`^ &ΐ0>4NιGM&hW_$`%""{k- 2Q<+!b1<q ZBR.}@7+asбB_'t}o,Yywy4H~T,RV5FI79Q׌YHgOv1raxbf/É}|zrA-vVd!b[G7$$Y+{2D$/c,1q bW*a cEz|,I'3WÏ& k_ &2n5d *pfõ92 vJbIMGe숄SEK`S3&c<~+^@Z6Aʊh~vej7αij>uo2U2by~جQ7!\vdkaF%Gҽ+s8(Ȕ| XJ>Ѕ%yX 8snNñX\hUZ9?w,9S)]OT}"!h3$q:0Iv:lb9fOt-~ gBojļjy[xM#"Hj eX'l[`tf#ĞrvelFK f'r̃=ryEFޟ'kCVq̟e_r\x'lƍ:>6btƑ.q@>%<ֹ<~%vAirn+SYphl"Xsn, l\JI; 9I&!oHml$0D !Xcȥ%9i|1 ϵg#^tAw}{ccqW@rUv9*:A ѭ!4ʬjk,P ]Gê~VRY7E=X@r`p *$!X!h E) '+~?"oFsְ.{I[3KP(E?vc",KШ6J;,;N'[[0ѳe[Jr2S$u5u6ņ0" Nn sq#tAxN60LbFGcݽh,8Sn"%M&Fq$yڔ aߒ]1L2 AƠ~aO`'y~t2%ڻD4HB}YtDf5idP(DItQ4h\ib>Fн9$;OfHBkwF=81'x4A.bDS}%Ds[F_*|t\"|U{1X  X#1~k JPSyR9׷/9 iHbm֏I4Wu+gO9jH#"HlAv@}{8BSx[HLEZL vaKݥ&^}~@pAĜw1kᱻb5Č?xğ !: 4SFhfڞ,0I%%_XiT0r di0?B{-N+:s qy@p{N=B, iW'ޚhؖ,`x9Hx<&oA(ce4[Db:-4QqnCM+dk@Iܞh :` 2X.Õ]PY(à !z ^`L9}_H] sPL'}c Qڞ(T<X"{sd!FEnhe}߀ƴpƮjk`*]{k+C ,&@ܨy`4b˦=B/VD[>#@ W"1F4x9`qV2Xb-4ˁRdǕlhY 0a"d@VE^H( Y$DvK_ȧ",gwhIM*i:C9"QNI<^f#, vE[*xiVrv 0xu0%LBVs1o$YA1&;|_η9y23KD̯L2t!a{=]<,I)Wd<rhpH0q37mewM4,HIX?u{' ~U)Xi]@`yåG6 X')Sʘ)ӄiOtrP}lm4A2TfIOW 3hiޒi@n0SC08RrKp~o$`<0xj$͈$z" ,("L76G) rQȢ^ z 9(XϗDH}ԢFlND0H~j^]jg<1j`o䠖lXU(Vϕ7`@8 QQcH bDѱɨfp/^̧#M>!{M*zc`axwwHvo^#[^N]Mu݃،dFD뒎dM<j䠰lL>VJs50 Eo0v1A6,G 9M$gBHD%D-;Y ࢒=WqBC_q~V)ڿ](|@8 I|qseߓs4G/N*ѯ!)H+oҿW9x/nMD.&r8 D턴񄼝?sf|8n 蓚{( ,8BW6%2K`Z.*o/P$zv~²\\"bۢvdsqfLCt]! EsU=( "NK`* ]LƘ00ܨb{u'n#ꋢ_̽3!iq@o m.AZۖd'$?ѣIil ySrA?ȳ.t6G AK@i"O(od:rQw3sUEvy$V.whPт4b Iam4bȓEO,xɼ<.Q5cYuWk%vF6[;;wπA:cpOL] [UݘfL4\1"+$zBJ9|\l9^ŚK‰] C+g'sAM ˳ B:D0Ⱥ^  N3Vj%:[{K."](+{Ν@nqL$0  #+}왤f3ڵt#U^t]Z:Ah0SܙL÷$O /hi-AUĄ1vKD„\ȳzytY>v!!!UvDT ,ȍvqlsS%ZuOOaD8Q1+3H?Z7^e YzZ?"p٢%^>Ύ$3w,(Hl|fc@6H [IRfPpNT(Dݵa ZA) 9.r7f!Z!fhɱ_9KjUuSD0XVhlԳ! U6HV\kCϖ! .o1/jzы9T#τAP".λǷ R}Jx=L{:Q_@@(Asx Tf#Pqò$ͻ_bQs-H&c䴔&Gk) @UV>l F&٩!Hg90"Qx`%=^^₴\,} *Uw|HFLznG|&AH涞TöD5ZaL\4u}[xzU"╊  /-C`x>IOڅd1? _ KsdtLLMkB&>DezcZddӒ&D>`5=-Ī^őe.@Ͳ44-ԲdY(EZXg$#M;,T=/2瞋Z!l hdAR"!s3LmPv]$)AΦW`9>5 4S'V2DK:羀A4D;d $9$08aDT u0/iYEO$r \rK_Yu]BQq>3mא w؎ t?Af|s^բPF& H9$SDJ26RX.04\U2Wc_ Fٕ(sdG%BcO9iyu4c2Q64T$6BVi{"s +ŽV {{Dq;K(4&1NEx|UH=n1j}ߵQ_<'9/}-wͥ&1S& >D:m+{N݆`{Fc"ҰC* Sd%VlY M*[ڄCl:uVHZDڐ8,:V VikOL~xe84-Iv/"/%{"/ƙ΍4ire9EMIrڮqIȌ9;ɫ:DSKA$3Vj:Rh ` DOC$$.3&%WapƦܕ_4yX|G`i Zwb?5AjH0cl$z=%&N?Kjmʞ%&o$:lj.oM>ќ#2Aߖ*hr!!I]pwi=ۓx;¾2qIJ D(k{m?a_x9D#'`ujciNҡd7f TQ9Q7jHk.ҩ(ٿz~6x'#GYb4`bjlp.eὌÛwnϗ#!]oUoq/v|?XWEr!q u14 ۓk]ڭ)m^[? 7gZi"X}irSi#WLèrۃ";ϻK[ c =hm[>SB8^M-@t `]+% \;[ >QG%Kl ۅbNFNZCfɥƽ4$-9tyaWAxLS l,e>Y^-zFq_;qû82szWi` " r%fޕX+тy*< /4f!q?ͧȭ_M]}Sr\  gzXgՊY[P WU6'l3؇,iiibI.}@$)Y$C G- /bdtqwwxi2c%o}#'v1fk VhyRН@Ԕ֜!Ȳ\]OJ Muc%/ Fk5Xr,?uqQW &6DSҰ<Oi;&X?97qs:ur.(/{BN3Z4 5N}=<<ُG$%@/Ck aCw 3~Db H:RIoAo N.+LR cm+(}ۅwI\'DK$ 7]#gLb*dǑDe"Ih,o-rWjU FXb 9YIDfb,! )Qg7& Č4kEawE`Z),#@8g%zZ c溙%& IK8D ;Mqd5ĞIj_hV q#9])M\~\  m9d]HiQuqE=D/c``3e%"ȊAo rnc8 -7YXFnXZh]=PE&$^A&6Kl}[:+<"ueRǝDD{o4{i$yy3'0585y\/qtrǐ[idq#aqPFm1$it\]~3u)3.8}Zn){(3}]AFZBr_zoGfA { bOHE؈(4@ewQZP1W"@gc&!`U@u'bMPr(YY)4X#%bc q\%AGjԑkz)sMh[(v_j]T`}LBRjI.@*dZCn[~+ Р0+5&TtsyDY]Ń~O4m&Keb)!7j\ժ!A:͐Iv?kT^l*qp)9SMbT7Z Z-)zYpr5{w~MKdwAA/w =*ʂIJ`c-A[,i澼wA(mwl75 oAe$٬t F"8=+'E+7_= @UtA*KNő@d"F(ؠaw(pⶃ膻OR3"a*[n c=Hԇ%fj`bAlb(s Spފj7YHIVbxycB`LKE [G;gۅ7Lr1p?qyۃ\Ʃ ~=,@%ω.RWv|n_Iغ 'T9s5:mf0"ā% E%ld`ʽSA͍qie%F^ 2҅ed.Q!!HY2F(޾CDPW [jsK,TB[8MZ#(. >Bƫ*#Z>I^p%NƖvFbdFeY}% O: 4Zsٖk2dC6e e͙_N歑O<(ө9P5ndT4L `&Xk;!֗I#@m0+yMh_"Y+%3jke)1j]O&S@rۃRa\(pdT |Oy^ٔ.`cwݲ,v[Sn7 -L»Μl%u@9&/C&9DV6#%rfKIZ֑757A:(A8Jwy/XuT9/цq$ӂ&ڌ`:C)DŽ*r̫7)cᔊm[ș}^;5â-[=Iǫ*#U`;>%!kF;!H@ZM(t}ctd07;gKvj}|z'*3!օtT-^lsp2OC9i+Ծ] lh]r9tJKl7´

^ z\C_C&Z)E_T591ů,Ƒ* ADG})lε? +K$R c@8R(QG~ؚ>GQӈ 5ֿMoF, fT0WX kI` ߚwGe\-e>!r:EXbK),6R5R?rB؜=MWlZ-o/4O =6' 6W _11ZA*ӒTwr,*;Dէ $[,εu])%ĺr~w(q P\ysޮl@PR %Ld>!MdfTr74w\~1k QE.PO| _0R!˗RL9$:eeϵ$[ ^q}M47 @23kK7K6} FFG_7Ǯ,u^wr9lA|ȇ*"uN&4ǢIJ?yܮg _d3d3ƭYNRȁd!IdF:}8"% ihR!6#w$q_"o$8"Zb- =7qd-Gݕy 9ggn.-܋!4l69ϫB1tʴӡHŌI{# Lƅ&$4iveD&I=u2Ft/*:ʊ+BPa`ZvyKj$I؇8dYO4:̀ (l\|^eyՆe~'pɥtp=ita8gv7|$ɹA-b{P$bL(50Fr c$w-CPګ6'[3 ZAPtJIѲtQQhnrP}w1zSIJ&L>Bu{ql@^qK"J:,HL(MrL&.Db08攆L4 Lk|H8sQȊXo\`@ 6J\>j V]e6,fBh 8O2Z#Ő^$}Znh7욂w{f͆L|h\)r橘L Ǡch(Ǡ*XkxeSbb+g{(MZ^hrhR':/kYd-H$bΫBԅ+'ؓHTfS-\M/y96Q\l8 kaFLBH/.Pu2:-CZ*(0 apSee[U[!oD5hAtcV0[^d&,-Ls7ȃ"sIs}ko/coew:;A% &+EY^̔0 $4 c#7LjIFca^OQxn`sG[XwN6킣c*&-쏵?gPʢ?WMU7Y}acKЭU ut$֏lf9,@V!1G5yv\.QvW@{h-*Lӑ\ Oh:O[#jh<:+9J ,2s[SSygXN^ Yw^,ۜs&ؤ};)kBmy+BdYLtAjBO%4<"4.l nRclH, ՟']x`VVz^x+wg` vՙ1'#C$BqR _{ۢ3|+g7UAì Ao,+~\^ 1.ҶZmvTB!JomZa.4Up%hTށE)!P˕sm @ȌYjYB3)[ǻJ}h"qrt,Rd \HH]y`G-]mxiɧ9JXt9|k.AKL؂S>KܪI7#lMqsT}ˉ<5|") (-q= 6I5ȆQ~w qE:& Y<,/tɕiɸybM䣐"fI 2.\@/4!qFF$ sI"הUK{&%e;ke},+bUo(rTDq,3 @Ts%IK~AO+Bsӊoz{^H,Ҡv#'8B~@F"ɰ啪Iv !&`ITR pm>wUF++t 5*>o[xaAd3'}^汶$ @*(ɒp"&BZ]ݗ4DKcDoc-!3w8Zq̸AunK2FrF\bfbEh;C xΧ%$˪&\̞}4Hzo#9-ZeOsDD0ʇ]?Elyx `dy1$(%a݂X>0!*%~w7OUvywSvYFsw'fCq[췍=ѲfVu\cUq<} N2φ 44f^_(W Xp2v!s>Aײ)뙤']oLKxa$kk֞U.9 !eACIWhFB92lA˵b;LifĚ9vũclhwae>~k:qT>T3Tj>bxP,#XУcM~Ҟr^ҕF!8)4ث1~""kdtC)Efu"!)H&n$a tMkDe۱q Y0ɱ9 s$(q;<ڈ+dfesW|f`ݹ/MSMud4 ʛ䘤W"|#Ts.Du9  }@ Y=@Q=h!'Zʱ2.f(m!qbKhI*IÕ>֘I$&O>YF`MQv=Iel]W kvd41'\CǙpj-LX' MX:* 姅"t?Km RacU窖}Ul);* ǣ-$@ <׮ Vc)~ rp?ļI,*Jqur, ,?:W{M|QTRj\9wėVsa'E戢8b3 URA۲rdU=lHs|J\:]CxwJv}S,p;|X稶n9n#{n bMj%%)m}%Dt-@ҧjSL j2G3GEnVYp:ۉ@22گZuI޳&l汏VʶwTYCA&`9R+ jsOm zLkI|4vm *&L[VqcUΐ">/)6*S[`" }gdى) `dtv@Xg (E0ļߊN9DRrZ`[s3`[ eT뵘  o De`qǎcru(:\t7)v+S)73%C,bZBRd#)v|>9 FJCF{׷Eh)Uiy$+ fX'rHL&$7FȈi@c+=s1Re#lO%H0A8qHqpح۝=[M$K\Ӣy z>m-7e"{4& b dXU2ј>%ZEZS7{=e-ZUq#;$v*nXTDqlfPc2x7n\CM }BGFu*\0HHs|.׻6f L.o)$#.v]ȹ }5f~7wBDP#Dpoc ސ~w]./ODՑ$Mu4NooyOjPc ݧzn"" r , Psm$8oii2s19'T3;jD)[#w9%rO^b8Im_ nmYt EvZ-t_y[B47#ݘM|,][ @bī}d.C4 \;ROc-Rm->} 2!}O]w1ѡ孼S+=)G1A 'GcĴd22' Bޤ/]H*+%f'dX eZn$ŷ=Bs iXNB>|B26t N5e2Zi^ (TM6%[`D03[WͱȿqowX=ƻ"?ū12{NmvZwR͹236j joVLc{.?>!,R:wqԀ&V"]z#s J88hcɇjЕȻ|s1S48@[ %hcP =Ӕϝ;OXM04n[jsI~Gk(} mƒw'°e8; #-CaPa+P.ȥUz)AO%#8baE`:,e I2dU%9Pn6![?\朧AډH숇}[0އP9VA]-;!e썅aeCNe W1DHCVPG!ʹ%UIkN)lYc{t[Jt7@cDgy)b1x( |1â& IJc~Ĝe Ua"dq+^G .I2M8ƴn Z pdAޮ]zuuXifI}#볚\峺_.ȞY}bCQql$$IS1,d7 1̋a1@9 q Udʨ?m+NnB Ԩ F(ݵkkk/J}+ăm @߅K8vؖ_/Z,p4t׋,K(u>4d> AV.Wr"G  "]ąLړ| Ь?"D]>O >@LaiE..o*heI`%I`W# d$mR{&d$b1q/qIz(k 0D zI5%+nX3I+` wۙkVmz n \k* EA:K]8dEp*`OcHt\n%cx.c/yu'c7Õސ.@wr/&y *RedXq{L1o$&}> Ɛ5a V+n'ixU/] a٘=1:%21ydhՏ-0RW˶mJoc?Gdtbr5[KtG&!LN92 иDnZ8{tw yқFa"VǤx mtp딌4$d <[M8 `DZ(f r.!чYPX}jq4veCU()A .Fo&p㩣-3-в*j3Ձ[]ٵ$fܐEehe6&gYolEHb{>go = B[לDb[5mm0!Sj2D1mi>9MQm 6̗  +.xQv5.:&6b)0wyhfi `sUȖ;x+5k.UZP(_u DM4B 뙲aK{CRt>0H&_SN ;6s rw|"_k|#>͚Sh9 HwۆcT 6!)olwI!;wLgs8Ud~̩<2z?5|!*ȉV2uM:03[M\CO]?Vyḳ/F.:vu˝ Ħyت.m2ȵ"%@'RjDNNp̙ T>U#D>3,F=diEWc4_/t}}v[GdJ ]ͫ=\|q)< 3Kp> cux#o;m&(&6Yn-yIկߺ4{ [$F= Y%ʞY?xnQZ+p"# >nfmHɠNW)bث2pyTً/ Vu@gj8LjyT9'Tp3;`4woS_T3|+aCK7$񒍢0O۝W$_[4!+LG< 4h/V`1[b1f71t0^ڀŷdi9߿m;=W \u")# 2ig LR 5 u>[Cq%K0 VkX d<~sk8ND9Z۴dѕmb\LQ# ^LâQ'TYSj2@vcs)馟{9 NZ{xGֽ3@-vK^8b>lKD6edfK@7l [p,dܜݹ)KlF+0H7C3iXg2-ljC1-D] CW$)$8wxB^b?zH{e]bˍ x9Lڈmya40$oK4(|bw)b`s1a\D~<%w,8s ;|kv LM^8!f dQNqAnbGLI&um:)>4_<p~%>qi9湘19Ob'f*")l7vg1񋄄_K# km@6o(^x,H(ä*DZ(`ˍ*Q=By}Ԅjow2C bp7eMK_AjDTDh0fp4 GkL? !#ŁV[1&s>1!;R@Uԧ}{+I 8&eWCfJEFPZfM'Avi :"qqD {~$ 3A3&#u(.1xo@Itczx(,%p|Wv/ ?lFGVꈈP6N(?2O/+΅D OL_k)pWS\ \[Cš'$&0 VZ1FhQ'ax0cA,-/"o"^CmKYX3$~aKM{+!%c%z#b~CZq/m`ìvZrLF"Y 3̋` 6meAdKEʏAڳ_ =O8@Uㆩql+0!oJ|/ p0TVޗ/e/}y쒓r>_abSNB*hC|y" A;S o}НqӹUCo,Tt*E9:<Iu:좛?A˱gb1 6?sssˉbO /$<rcP ag[Ë mZO!~G"vЧ]{;H&W#9/Wʝy"[[Luiatʹs%C+HǙ4[UC*Ȼ}ϗbE-\:0ѮAߕ!6vP֭ZK~F,a*0[Jgy(cC2Khh4 L&I6  .dU'ESxHj)K*~;t|ܪ?RҜAqY-gFQ){)*Wл!C>$="I/6l*dvݘk<9r{8|[6ļ`^$;OgyONwd!:ngQݑn~1xɷQ")NwA icLQTh`XJdr΂5.`\8?\ cF䗸H"Q3)S dҵZ  <~4eHGoQx}g4S0T^ҾΫdcO_ˬ 3;X5B]Ś0}%($D0瓏𺿡4ݲ\ngE!: 벊wɣN7g(lM6t_nʥA@ia Vb vy~tСc [wI'c9wg1; 7a<)`00''K7cI>Sؘ#D3emzWRW<`R]ZM7oЍ5as26MK{skZv@,u~m@(&*YuqY>AaسK@Xk0t'0}b4[Qzl,Y&QɒC66 ,dm~m89Kʴ3saxkAd(U@U09Dٜzakuk ZbOcZ>8>x1|,'$!:ඔ5XKr~F'5ur_tWRƉ|O>IԬ"`dP9 !3t>Y ,3ӡU۩N&~hF:Sf_l)\7 څVaӡtu(m= "`hZVB-imhv.` ȥ/j&Ӕ.esLg#Azpđ=֖aZ:fB%% N΄ؘ,h )1=.j= !O6xkSOdrB4%vF',Om'$#ր,F[[r%&C%W}֙<AdQiaK+77k7&mDF;TMs L:-En8 ˟Ӄ!pq$$,,y"7a/ 4!h|/E̵k/_+8XZ_XV>G4h &8}_&Zxya}ﶟL~@%W?&*VfGx!xF5[ALFyzY1c0a`Kd>dN~>~n#Go:Ȏ,4  F &AXS0­>! T/US'1Xo"V#liwk~ҝ0uquf =n;p.@BS|I >~du5mwZnGBXp!In@L.o+ ,*uAyB謚cΤp]|VG |&{9+^_}ٺR̗ͨp ~mP0$lrH{[9VQ40#ޟc0gv"3U5I 9~J\<^|g/޼q1{u4 Z|(iςZ֬%O>q# $m:{k|VPh%pS' w{yhVnv߀auIc@R_$k0%o(jQnM‡O]N߿yH(%Ғ=@NAt|C;QӾ]ۺqymyƠL㣔ޣj[fR5+| ;Oȉ{<۹-BY,2l"2R&9;jkk?^ybS0}"wb735PtLl;'r+gB\#g,+J堐7V^݇3A[z{Bsf1k?]q>7˄~䖋n×GDJGd,.[hAǖ]&rv5z./HÄ~bWf }jzۮG+fv8#iط%SIItʍF7\u^K/DNHHΝ;'=wc%>L8าJ#2z 5ǧ$$?P}d'◍|$~x{`Ѧ+6Wn[ AL<]u<ɠ1jӻC^f&TzFj /doR^;?q*lf|I48NHKXqqڥ]}b>[;\WvD`Q#dce'AmG;gBw^\8ӎZqqJ6ݵ۽qRKa$CzJΫICPY U]6j "+_;NRj0Ҳ_ 5<b14(Hqtmi]U5Od[41/_ܽa ;ʣcns̖.r8%6n'3]K &rQM& 5F&"6 7煇Au7.6n$l a^Ow$i-o " I$Uk$&LksCuBK, ^*fϾ⁎7;Fnd_[`w!XjBNMўͲf7l{rŽ="k+`]=g= 7b^lN"6 ]?۩1X6W v7K9',> X77*FQ_bҬGs*xu];wO2-1鉑Sl&b ͡m zzUQ!Ti>SCp XK8H{tHL0 彺lv_B>iD137BtQ\qWFupۙfA:Om}rIrPYf轹'B,n綅Mt1;X 4 e_)a._VK~E+su\ɀi)i[\{_m_:&3%Qq- #b!LhODaҊeyHo- xǃ^xٻ<+au{wKYYBcRLfWrizJ+moiI*`>g A^db  i>IDAT ?rR̈++ Dn'̱Oy6}v#?cM{$g *OU#뗗ꚨ-VR bϑv},-D'Qi=؎!GdPI&IR%ǯ,`мW_dN tvB$ ^/mhl"y3x]87]n_|&A_}dKUҩx6Wx\%b,. 0yKNe{i)ַ,8+sZ⣦1 &4\+~;P~!UYqw8rkB>v]3ɗc4_4ڧfPKHU4 Nk)0Hbx&ԵIujy/ @X</'d EΐO3G_t1H~v;ON>Ŕ{@$1@V ?ɐ$'Nh=]5_o<ݙ_h/1Xs)[w}NhAr(\Qo yֽ@$ɧfcxM -qfQo>8 ]-rma,Lz%'Dh>EYg#x B2谹ی >lk쭬Z$W-v!89w0`Y8kZM%XV?~`$rg~j ]`nP/Je9m-}n4P 㵎0p x$)5+E'ZDoiЖ}I!iA*D~'o]xs\{nI31ʭ'Fpx1[1'TpL]Gu]w Wn;@}h^d3݉z'ԙo]XA E}(22k&aܺ| XK'%Q5Ԇz䬭P"]WPH,ʉ!H^1џ7>c:y> @QXsPѿzR'Z7Ό10ʩ^{L~%.آ%Fm>O/7A`U]'}'nFX1 E(~߸A@c[G4^Tm^,j~.%#LHf8-Ͻضo8մB8>Io~Ȑ} ha䆼ĒGΝ^b^\ }Qrj|fzDwHY]c 4xaSĘ{ISrf\៿ v˕xDhQk {4 4a.4a9{RDhڠQBMR1{ .N!HLn%_{08]/P* A?= Yu4>Gm >1 }˺CII"/sۏA>GLZL.vtqS^4(>&P򓧩qf1a#ALBv},0JaY͑¨1\V/\oΗ8_AFFnߦS:l%u ٌ)KŜ(0*6z8l5 %Lّ#0_b ,s}c[|ތ _ <Џ'b. #|'Iq,dC1eY75z8f66kxdA #ێ5RJ:D?00{d/†'unƗ5Mľa鿕]? we jEg~`fZMMx8>G"/) aJ$UGNŶ؈S}K]r~L0paʓh @>R5Zɯ8"|8óгͬ]kܷn܉ݬIfNڷIl A2,RrZēghǠL\ZN.Vذpap;Ϟ-bWGEhvfU:uܚڰ"hul\qyRn'E*Ͻ*j't즴I^R C8 c:\s(w\N藍gx @4$r} Bo#ܑv|0%ycL?_i.edie` =lع}+%v=vG<o$[ ES)ṰJeiD+A-I_ Η R/W]~)d2"Gf5G)AM;:RKw? Ue/1- 6,T)L([!#Wy]ndķ?ЎsU V/fj]|5(#RRJǽo5w9˫4o_&]0d $E~}Νm&aՏx+ݡGG n@MB,?{Ptw9~֋~q\ ŜJ+xUFЄQN0"$QKM'ˎr*}&̅Hʎ7af@%[3l&9+Ph0S3L214%\ͭZ?l.[ydpww9Jş.`p'=(tM{kмh)W aA]RGrK$2Z‚O84[5$xM<Y 6-x$K+~Xx]JS(*MnRz* m=i0Ƌ>w;1&Tƌ%\ZllNcUthRp+<+#":vBCʪV++E/𛎼nԥg0X72k*It̯nAK\^>.:J&AX`HvJ_%|G0)n#sݏ7>ll0|ۃd:H$1úpVgNi@aŮLKsi:tC*,gG\M1so&Ye@}%nI*^JHP["AgNF$dbvz`I"dAXʍu/k?C 5;zql פ|"_|xlV;c$vYwnI5&%Y^қ~iOߢoHLs7{4 gpnޙh#K䓸-d"7h%+  6.H%o`WQKU:@=̪NaOgAæbPlL>eZA~s2%a1\'o>\i:4) HR4x:rU(%2՜'<@c(< #}Jdɓ9JEZ-J|5,H9^Rr&}vTujH[=q#4*N6!)&YxF%{K/EE~>ދd{>uV$O,;n4 CS^E:;Y-VJ%ϕn9os3yK]xnt/1w;ZGgg政i-(j<4cl^ʝkjS".JR#$?ox@'~zH{~3RBnR]+U%!o[ql0Ѻ!7MϳO?b#@y0NL檖 A(h5"Ҫ(4f$-raȤED )N.9R#A+OWN#`0K:q9to l9.eSBeo^vZr92< .59b׬kqtEĝ~t5" \d劁trE=EF:X]շҩKL+dwly`Eqx߰"jfRCVãftlJ r[GqXN7'Q험?9b@a5͸A[61?Sf ]oLG,K̫R7;&5g \G˘8&~q(ZCb#>X ֽ8վ8VUJT.Iw>Ӡν}$"QseoӒiq oiyЕ?rY <i,1+˴ozs,7󖁵2ft7z6"lge4-q^KḦn Kֻ 9XN_C-~*o*)K?eٌآfs% z} ڥX"9 VHDiް' FdW4OȚ8 Faap>>ǐ #x-=H ҡ#[ݮ1>=>^W%w ѡDCl*d4 97(=kǡ݉e 4r|>/s:6sc1wZ`^ygNAdv<;<3 -:Zb꽁d -9x3#e B!\É_zXZɌ_{2(eoӹ= \rr@s%/piwI(bwNY{K'R; `w'nlsbB8K/0\e/ yf(qE ilQ >zɱuvp3#BVOvjv0@E_oֆ:ns_B-"gV-eiZa1zd2I0N4F%P ϓ J-)a;#Fv~ocz>uAb߇Gptw:Rnߕ]K۟'+($f{ J+§?X̜_KIϻ~>Cʤ!Η*>q^0.}ΰ.srھb}K(9E&Kˮa#jXb \,=0>Fii' <u4G|(N.! Zj0D-b >xӸ(q/#2Uw楕?PH\cX*SzD+ Gq~oiT=z_!E0UЇl_5z%D$K0-R26bae0͖&[`i_irtx /1oU[a܃Nvue7W7;C-Ian!6`y]'Pk(-sCW/\Z42(~־C[-ZC~8T8d]_Po`{}?}ⳛ?_ ~>ud}la\/Bx}𕑮[\f@=ow<0[JvO$+c> Ak@=`}l~uBĭq,+_d?z1nO{Pqq׼ qm@]3f-c| o&q/w|^K;T0o5&zwtmֱ}O;ļKvL^#%C x}6kjW$3j.۳{Kw@D=TgʮsMxoʒȴQ{wHp|ꖤz85ovN~% 1V껿io5{w[0Ch-s;d;ޠ?zm[oޑ~= "O/px%֟2'@{Ӆ=`:CqSw;|OtrL# Xf/XmB%R6X52 n/|'V9m$FM ৈ%/<2@v&Z%|;%#a'cP;_ݨiO^%ӵ˱⇅2Wl!"^|#/bW)|P+1&kƶ!N9JMIp%g/Px: Ƙɨ8>[dnTp׶6x_ֶ:]k-\a>FMfc8ˏ-k>ٶay>jsTV!~mfjCQ>,< NVNC ]8E丑ʗse'9Ŕlf& tC[Y D<"nHp͔F9y>w"}~^H(\Wl['[ͷdoXK/!jqlUK>\@4K 9Qu"]qR;'bS2Z5t3{$C6-= ;|>zH)^n;C:LzZF:q: | G-::+&7O} d̤ &[Z.$`d@̡8f-59/88l zUZ<%O[]FNEbw9s/ LdL|{u/;>~X$S|i._CcHFi/6?t W5,O?iO}0m$Z@v=tyǜc7ܗ-z[yH1;33a?>k6GEu>3Cv:u(ٹ{ 8r¿choduyL~NfӃm7&;D*||5՗ü:RuQGȰ;3)Hpx4gaOP7,y`'rYhAY* #5@`ѳ Чo  m8~)c<9Ox>-`'g|/|gnfBo?? V/.<,YoȒt../?cy(yZ}ٵD缠.]w&r74xɷx;W9%A'O\,Zx3bPZcZGNyJݙeIs0prg=})xk/S+zs|\fJh \y/ ։o( ZU+~`}~<>k,5 .vB}@Я5L0AXu-?E GxkQ]O8D)AX؍z6#HyqoSޞ*?nX:K̀\AP .η4]7>YNӣ{~ ,(]CȲ]uesPa\ws5IRݟ6;l|ܞ9`!\~IZxHpXHe Hl %]WV0ϝK1OsPwcP ~.!h;g+|O=IrRԁڐ ݴMa؃fBXq{o$gO>s 9cSӋ#* BNhmé_ףCB2z? <ш7&RlgFlI,ft9LGrfȧUVR ؙ[!?!ܲe'>Շ4^?}G5]rqC!Sϑʦ#~sCB^(}V`fo:?b._.3䲌 R,'Φb_~[թy5Bm 5BR.$$L(ʟMVMR!HNq_rR*W}-$~fHa]|RcS'T;‡Mœ;!~-JT-$@[X_֧GlI'Ch<ԇo@$k>oH?'&p|c1;h `D{=5u-;0|. BX6 $f}EmBz+op>2?.3xȌ3:NҴ)>k1roI'jXX-ˑY_d˼4LU` tBt'H pվ0ɯ..>M[^e5JoQpڃ\DFce[ODqg MyX@| q6A\QBkY۳H unYH; 7Sv}ͫD !%zՀ2@4H$/"[ :>btgk>}Yex `jorq-C6ާgƱh9SHIeDo9# SJױD~HR_Q>va|Q+IG4r&]kZ = u"[=Zrnx'&;`N)I%;o;e-1g]ڕS!Lߤc&$"yo#_q=^{(DH`r-/B#0bt?9} G5X("|D4.=ro/v(4 db9;")Ni`غqb:_=ޭwXO$ ֡D #;=A/>;yqFap#$G\Xd_9|vv!y~Q ɓV(hqx#N־6^)GJ7R,$@Ҙ(%WmfP>rzYp} ϟțC01Y u >4awe~{ģ^:[q78, '֏&a-S7>}mwq g_-(`Rj<1nN|ʻCVGOukot[c'h>D̨v;l81Xb| +!|T C`=7X|c+ N|О'-&r> ^Cef O 'A MEt`A\>C ҋ~~>[Fcd'7Ͻ؉SRh{ۈk *ۨ+m"BCi\FHl> "+nLKGM~ "ue)ޛcvfg޼#J`)QNk>[G^j_|Ź4"8:^1}͵heya *o!/'RZV|* :rA ȗm钩0 C%V tOuE;61Zہ>Hw.d@}n@qeb Hk Iy tʃh3Yͦڼ$HN|,07tKLG()c;A =m~@[³тe4~Q XXq9ۭ8 蹶nW/A!ͽ~&Ÿ^:p}{-#H}Xv}vz< =g䱾Zwn2_LBq1K.NXx6v |pKӶBVj88 P,4ULhw'Ukm-r[^#XqxwAXށl%ʏ0rD4%z'یul%\1xfR\eF7lw=%t8ZBlӎ-P+[ N IB1B2bB]-"UZ&TM!Jᦱ5AP=Nl>eSlGL$5C?B^+ˁv IENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/bricks.png0000664000175000017500000004136612412501752020743 0ustar brunobrunoPNG  IHDR0ƾPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@?IDATx͎*=}!}[QLhsĠB7&">Y?`xa'xy]Sڶg!9m7'=s?1====ÁқoʹiczGs9r.^ƟVYܳ=Ѕ8[NmxvCdV$nl٠;bQyne;#====;Cz4<_8KWwz ҫ_93{Υ㊖ů韆$B呤1@Nqv?0!@o94lL 2+Ay7>ZVN1 :zv^PPB"m<ʓ˕9y5~ǡЇr'og^)㧋+lU9֟NHa"Z }ϵOka<`t\P Q?M %C nȵ$Cwj9L6~] ҫ~xʔP˟}W$>8LQ0?3"zV־@œ]‰e>ИrH4jPēr-bd|L\Z3\pVKAzj܂#Җ|,)!e8.D%;ˇ\Ԩﳏz@4a(x\h~Os7[7^`o~V&v{^-%fy-J|8֩>f8z >pNz3/3*CYڗzs ׯ7mkvj][35js0RfhnWW3FKx0FLF4^a>&>T`w4;f\z.=W'9wsԱ(9Q-ƪ-@΍R|1 ȬZ2ݳSm$xm`^Y _1GwL 5Nm,Lw,52& +v֕Gs5EY1ӺX|*XVZ--qo-B cR7'<,Df8_YƬpg;Gkvł#q3㈏7;KrrdV(l*KG1\>{.ʓ-dVG9P((bsGfWwn4t~*)cz8zfTb3~s,fW1#[f/f^Ϛ/;oRf䷆e[o Ow˓S;Pa"jF_Ԧ,ju46unC:r}^p&h8i SYM/fFf*WFŸrIRy=LPP1HEk}> %Q]ώsӑzH xΞ>+==!2f7V4;K\;1T!*{b*8]Z-lKePk\ sh|=jmŝR_w)q+r"oMCu6 bFG6|.U#;\N jc0%Y음p :vuZ }ހ_/4 L$8 p_j aM۱9\Ԇ*'>ʁkf-sP&um2O^t^pn5秖J8ۗdN+ >aPv;.TcjU LTd OXQQмoeFx&l@z\xEY/ Ǣm(0pb Z {߂1==Aq4S3vSG=Mb|lqy:R*fά- g{]wf]u57u_:~ч_;uڜ_~YQo_-qay.X03>=9l2j oT]v`}8VD>{Qk{a%X&K]N4L WM:2^d&5?hSJf!۰ÜRu5FM^4Lc.2(V2g*nhttG0103juT.[jT0İpgY}>ъتAmCjVnfX UZsaN̲]PQ[nJgDkRaA]1oE8Щ76]Vh >=m?[*M1/ўo.>R#Bl>"/ȵ\4hjyVgR8f<MfuxVG238naX 'b20ylfd%\?jj67f<eh &IZa59qORvxxe9q*ګo%N,U{e3v{văIҞPh0lVk8hլp1Rå z3"Fz2CebC 'mW6F>bxZ B~ӋȅG. gٮ- hR=CC򼐋Ne8$~ =$D^>LfZ1 ;M[ӛ,5~c8@fu.7z#Wu/G^0ċ `xsHBA8aFyXX@h8@<16$́Qz Cq1o c1o2JϚej@+A{3_eML_Zտ"ncV~ތS~}?Zxg3p7DܥypJ?{Ϟ{VWnϮqޱ:|5.W>BE-&yZjwǬ^p? c-Oh$/"M:!e3P?1+5\V_)\RS~aӛױ[(a׳<f׳>z?j5V)/UR&Y&ְk-SVTca)ȫ0 Yf:4V0`V#і[ʗ S߆ko.K0S33Jep%nzY&zGϸzuBev=zn@g^OFLb {0X qA%v=V2p'e7ݞ5hV'fi!l]LG3T١XÛY |#:ԞUsKqr2'ia&<2;#fD70';q&:1K28Ozϧ2]YOfV틷L7PqZPBmcTQ3Mj6f1ji}za.eOXT0PgL6S&ʷ2+R5Mfu\ayP<_Ű}>wÎ؍Q$G$M5Liz8)܊j2}Oz}g>%f)ojQz{P>׃?,?hvh8$nR:aύrS8;vN޲RۙlG3ƒkBf]e3Ůc8c=Z=cEml#_q-6qs i⢫kf`rdƮ1=.+ sfEicv奨K;v^=TsL-ҋ^MLkC,> Of0c<ӉIaTƨB#`K xFRZI0l \Ϩ? =hάI0Mha% 'sc7R#5(Vҥ]cU7N%22qYt~aj5tkQUV/9ⵂPc|ɓmMr㯐 '~RCzm 0SIM jy [`pbyqў7Lof :{ĬYڗz?߁ݐ*`fMduulEɤpsu&7; ZM-H[K-AY[Rm:`NDf4*I/.˖hVf5W2wqn_D}>1}vE&˵? T;헨\n]e~^_T=* ,cQlvYjz?U-ɻ㷻]!t;SI<=m;~7'VZⶶڰ8Ϊ:{!snj5J: }:Uw|vNV.؋5 Fٱz3dVɊL3Tsqy`5Qa9kcw3ᅹ0;d/6kcR҇Ab0En=cf 0넳̎;~dN&A}_ƊPueY9z= OˎqĝYOaB[u\ѳan8##P]c6 y岝JFj5 jHIF<v[["VNW]Ë,iC #Z|21h&YmD{.˪ X\j0,2T]ޱYWۃdZЈ>q$(I-{ki7e'egjp 5N!ڵE{8z:17Zp;HX0[ئe_Mʾjp+YF/t\[QI]p0G*qa1>0:*I'j2YnX$pyXZfZ`VnG2Bmśez&e;2]MLmRǤT1 -G$)frZKc> ,ZF> %sq.[~0/kjkg-*Zdۙ?Ymf?Rԏjj៶Yz`OOtvݟf$l ⡣ <1%iau6FM{z.;nHbuMWl8Cc|:}ĸ]7^5ٮGA,& 4W_+ԪqMV^` )mwC}oQoHZMQ zgo D2NDsp Zon`2+Uj]XN!Hz \,PZ#^%f#քo2Ԡjӓp׶+i+rPAV@:V^A5x]/OmrG5e" QyӢo[Mfyr:Xc-Ǫr`,'p<VJt~­ NS`ZzZeñ}1WGO+86f~_p.-f3 b0A 71 rj|d8k L ?G uHj _m~qfr x"x0m7,Z|7wD |2-je:dOO *O9B}uZroLӄ|c~zW'5wϷx] +{Umacr Rŕ*:ɢ.qpJFW қiS75>N,&neI3(=Ɲ Ǫf aPɄe.d$pP'v{vm3;0saO^*F.lp͌#iCO3~[eق ϸ %7sDvC5w&/KaRyebZaxpe'BLRӍzLw^8?S0hR{7Y&KڢAe?361Lb7U6Ђ`nf&+ ¤dtQ,-1 Ĉ =eӇ)kB.(,A ՘ei k uLZKy'Ռ|~%҅{ː6V.\+pR}s6ϓ}3hLnS8@^ZO#jv)o\C=Ąn)~m1,n>T(Sڐ*ɆW c/{5$gZY4WVUd!&ra?rY|%Mx+ӫw^I4Z L=ՐeR}1Ap>P^Iȣ4/SdCM7|WR Gt jAׄ7bi[t} Y=5gXrdz~ym3n\\ˤxhvL3)Tӳ uZQC.Ueƻ{޳0ۻpur>ZR:.;.' /4 e"cW;+3 fyW/:Cgn7N_3 .t6,K. 3`Vv1U9ҮS‘6ƵҴQߢdK1i\٥bf5y|bbm:X{ ^O<O sWޯ;fu)ܲSRvGv7zq( gu'Ճa7b,mǎGlɬVFù1"&nf52ȬƲy84OP%>deZ beRi:W[WϾN[.t)*G7򥶛00W$isy8ӋqMfr`˞ׂ^igg:~0 <%t|x62\[+ѬQfZ"&eHew̺L)#lhUj~d)!=27 &=Ǧ wp꽴ON40yz2I}fo|<c,]>T_ogn:rˆq3kb5+۵pDz=‘Y_Tue' 17ZEzjx+\c8\х=##pE{ER{[GѪ[XYʞ!1f/5WA?\ Kr1 x2!KjPY9s||BnGfu;mz*$XZ8ojVj7Z|=ݻZMN>Zc`s4+ 2!ٺJxluynxmREjVŬ}i,›Y>ϵ{j=:5gg՟%SqCZ/VV;~bhT[|Ryqh0,ăKu/qΠG-e Ʋ)l0V3*=pcVO<[2_?[} 8OaVYjZ+?lˤ}Pxyk<lcdV`/V3.O6A6j0o^"Gj5+MLiqjѢNZ}tO.M01/\fu)H30W'Y2Ζ 'yϒ)CЦ.,s(L߫Rmx_~r U?`Ů`5#ѺhXjpP'P]03M Po0,ml3&- 0OSaX@Falăp[DE57jVO.T=ُNiL فc ]~pxš<)SyaW#w9:Ca[+p٬ME+_^Վ >В'!*> !F 7taE:!=\VA4Ɛh(Tb A CR5ŝ"x̀sh` n0Ivœd\[QybuTi<2*e!לhr~š/XZjÈq7{Lcs/% [:MB&g4!Ehd?HP',+ٲ^i3I&0 U0lhf{$Kgnjάx'] sL6Tcl5ɖU iMj80q1 jfrV #6ZeU \A6/5pٞVw-1=,4σ\2opyG4TV[Uz 58s l` 0KA-Foap.+{}繽I44=Qu=S&}-Ow>SUfzbՓHf3k%)55Sprzzx6j3޺7c?ݧ-yz 79!)ݝ4PRA6rcUَVoϲxZDfjboO7ju 4VptQ{"5zV=H{5մZVp o"uo b 4 < 1i'Nj ȳx W=~ygN5SQ9> /j?2֒>a_fprG Mh=ZL2>mm3Z[ɍ6:n-Pz*vI_M!Z}78 0ӊv?C'paVmP0"^ Zf5xNfuAOdejxR²z"^dm53WBZID>VdkWVZZ}¤V_j,t&Z&&'ѫkV1#kåUϪ^+w΁Y ǽnZ Rx"oj5zVq*;MɬVÙ=GZ Z͞yG3pwV3 ء.[Ff{={ɨvjj5^Z|GՠVGZL- Bf&2z-Է0a?ۉgNYbeQXt|5jg`V'iI|^ Z̓em5NGOԢVj!pՌ^V~Z XFFeii\hvZz3R3jUᧈ<ʍbp i`5zQ;F.jX9ޫegsYY#jƺf.UݿjviV?S?H&ypakU?Z-ZAj7<UW=czyVoj0Z{g-^ijqz1?gj4\:Z|YV_im2 F'Z^V5j[E$p7>65FumDZ5p ϊ뾒z($j?Im.;vywlj9eYje4/`ZZeمF&+{hV;uŃor$$Zgbs%Mx0 1RcAT0DпAi4nZ=dVCY GY1k2p2qNSfzβ\9LY]JM2yxNS/v O]z@ 0hOd9xPa`: mu=ќ@4qhZr3T;pUilXح  @Qvw 4o`G~qjpCu",^:FZ&W1|>zL |Av۔PھԤFg.4Cz['~'ڼ̪\6\4d ^jCJ{O;[5"fug>Wtc7s_,f_o5Z[ݫ՟%Uժ`V6ڧWe Zwk|Lc~u=cϕqf=c}_Ǔ8o. kե_[-kVgkYT Fheo=<6;E Izw.wk5:_~m{2 \cn:Lz>zL/!e2FUNjbpӑ!\j7R]k y=l6k‘" f}hΤ,gޘV \t9 _Z0mHP68[I;a|~V*!I|˂)Յ&MfmVˏg*k{75oȹy$ùyak?\5`3p.ky=۝}i.|q= #昬Yd?bv7 jjnmP~UVe WWxT=~z}G~I?izXMN4qөSµ8LQ@keSɬpVem5s|_&3沌7V#kg\ ,\T3v|H{7dZ܀j0H+23&]x =ǓlN LF1ư\/ xݪՍɬVfXVsj5j晛›gnV[FeG$}Ap[|Hk>ГwF7iou6P x4D^aU;-gzp3`U}׿'|MVa^$pa*Lm&C{خ plHfoj531'+ :\ޖ=ewfɈQZ6rdcO9Y>eqK4޳,\tmˎlUh!W[ kV7;0F[ m4f54ÍZM'|`yt{ҜxVSp!Denazv}|'xm楈L-̋W5~[[ڗ\S=e97ynfamuI8y08E;f:c;ZFc66Z&e{Vgln8\0ϖ2L?K#zޥُxRw{6 ;=PZ},OUg?ay >oIbxsϙ?T")JpJgMX/ gB׿\>L~DU5! +lszɳKx_F^Z\+ cf->qc0K8w 3~;3k ճzЇ0b95O\ͨL.aY3<9Wc /td $ X"GTP-xb7|dz,%Ba'/O$(m9C ԇ2Cu>P\/fj !|6r-HIqKה 9x^~V="]/VᩩUH V}>Pxa"cSw~=T`8˞'L cGT!"|Itx 5lȁJ)&-=UFXê T f+\xvFzzkv t@.T>\_Qx0^5>l N(~ϳ'`8\߷QBwOy`?c?9c/gWpi<0`گY#q CaԚ"}Yӵ^ҍY; DSա|:ד{6f+f~Cژ Z=h70ĽRV(2NIX t'cxLY|J q*At& <ȾPI<.?S`/$n顛iMae5gr<&ឮJ+#U6˯7~簈䲬?տ79rc ^ ]IDpݏiIo-|i1v({c2o&C]9y"zMv8k""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@ jIDATxݑ* ;`)lNoG`.mAHTjvnsq~imRoҨ>E^T| Kc L1`U |7x֟^ H^-ݚ0*]p m8Reja ] ;FZC ̎Y;2mmHК`-kizR\=BU}kѨoɶʫ% yFa(ʱON T;s֬Ϸe.|a]`kWhg*ͦN͚  b0 taj&f˧WS  vͽ0aD}L 91L)tB_ 3 ?}o Hp}~臡P|~~wHEƴןY/hB<>aŊ;r*z^ULŵᓥE6-N'k((a| ޏH e $<,ae Eʛx=-H[p.dV0& J(rO}@h`LZ@_ hh~p}()]%PvTFRxÜSK~ rߥ@prLooBۮKry$=/}4'?S,T7RlF}A,զl;CK=9TnQ%PW_hhL8bB'<8IrPh(C`6ph8C۲<(P0 $3].pGyh7#zYAuŅ[EŒ{-gUy,|_ @x^wYJ͚iYTpHN8538*Lh?p(YVK%m')(Il ><5rd[ > M^^_3.aV2&t#Nj|Wḝq!^s/ΚL=`i" 0Fr4!:Fц_eҲNK ` g-Lth3ET4`=hHC J@G {V [ )xTA昢rTA^Z\,R  Ϧ*/6I.{ ) 34K#$ey`%K0Xwe XLJ>|`< $ (vI.,т^;3ĴP8%:KGY|c4}W7 (oy~ފeA 9qW"e\'X\ީ >6%D a:kO(<~oaНF/52CX -1Id}@ {3Pp um (l1hOGR-9}_tsQmuo+qS5c{_B G͠ ǃ@9rIDԓPQ F6?{$`(9x4c74 Ս}F'7eѫ. 7܋/ڼC&fdz>\<F9$~f ?oL>&4m:Snql-ฮ#],E-hFt"*Pl4|'RdH@z @#;8Z DCD2_ZL)UZL~( ՟(A9ړCY2-nrB0\˝ <@wԴ4 iQ@o=3}Q}`ׇUA|~$_'ljŐd)@E4V0ezwzðWGA! 9I.'@;Nǚn}e)Gmq?!E1"J:ڤ%]O0f.?*15קeBÝހRcjI2lQ:}nǃ(ѓs2 sMjHY~@ n VDT dz@H(>!RoɄ @o|[0ߖ</C0zv D(lMއ`^bDe(8Yvf;L5IaI0IWe@&!d3)<0lJc7Bu(>Ki %VJ%igP2';BGeܤna!d(m||ORLI\}E3}}ݳ(S]IENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/menu_fonts.png0000664000175000017500000000441212412501752021632 0ustar brunobrunoPNG  IHDRY7,PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@IDATHuV1: \p{7XO` ZAs)R"'؏ ~)]Mgd'=Ӕ( &ٹ"Ҙ67^8&wLJ߆e0qu?W>ڮg>ՏE_zk6q~2} ~?ޗIJnoY59#_t)x}*dR¡ :$x|g/xON~L^iL>{L? 5mTNd?=I#4y[&O#T޻1Nb{zgq HU{}۹aG>⺿:րB33)\gbNTbǎC&u4u4;lNیHI 7C=US1|W]>S@ 1vX2 諔$N棲.AjlGHhyyeҊ0a ^Ƌ_ @j}>a v<9Eb <hcՑq9%}!)56'8#Rd  : CctXr v2.kFl`N upX׈19`b%l6I('5CR1?w?8P Hu +^quEʼUo?bOO^_W.߅`D(R<@bu&vz!!ئ|!zSyPs%ܖi<죵 ɩ x*EQ8wRЛͧPk9Y.VYj z/WE."vУ~Ԏ(&-LS f j8o/\D¨HXs%sοͭ zš:}k5{LH_t=/qomIENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/paddles_1.png0000664000175000017500000001641212412501752021314 0ustar brunobrunoPNG  IHDR`RPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@IDATxڽ\A>痲ez-?6-y"zJwr<}Rdo '&1v}Ue(2>_ʷ}gC#i ɏHpH ]lOF3K 8ڗi/}c3 yK?m#pHiG !ct,r|plsN7p}Qswn/~3N1IӇL 9b~ɻk~y2zѷklgVE[4{%Y6}}$CvגIo3ʣwXےZh؏5S޾Yʲ?e '3 @K mv{tD% sI[: Oɫ o_DUviW=u.(b;N]U(=~yA$eU HG?/i!hH*€$7RGكhk>گ=~&1|i, sk6꠽S_sx`s7ԣDƌ 58y`p1yOHl;~Y~h WHp~Io+% \hOJ{-H9٣2}^VWw@Ur9gQ8$!Cq-翷hB߄W)&RԵd8JȗwӾf$ "-pZ$yySW6npU-O{)@ N/4??2ny 뙱CpDlg_ 0?y e\?.[# `~psJ*sHkځ=G-e1~A }?a+2 |{}eE&fWVVeD6}_&of,\B37y+g+`'`6}2ځwƆ"h}F6i^d;r"&+l@풗x^x~RikF#*)]Ӑw@ow.H`-8x(6ݵ3؁8x Ip$hD-o-(q C`#?vi)3(M{nnX6~-4 x-AazM,'r#+NJ D*"M|x`qd%o;vI[1<nR؍ n/E 0G[n`~)$ڻK C3/<(/BGC %*dگIlk.h(-@KL .Jb{ڒχVg퓅CG #۰I O6'&h B3賅O~oxaԐ=~΃=8SL:G'ζ_c ˋ"slyyvp$-| (3yxSfbM?3mA;b}[tF#郎z8& $Az:jt_=i{1VJB x,t| 'J"% maet@ jҟFZs}S8G47Zv̠eb{!Sf{`>)<ް1TmV@ei6I*[QI>8/~V>Lnc|۱j2N^ҵl!XwZM0#du[ըyT:;C/\}#K\⁵rttugXax1VyLِ{p2?5:'6R?2e`=,>ᴽQCc71H+}ٽ2y8\Q|SxlJS ē\:vg|O8F ~@{!!dsÐWT%K)ñK7,sZ'/s\I8bN&}OWːP.G#ΛmiHK hԉ7;{!:ԁڎ>woYdPT73~ӘC!= B/ĥR2V2o:?R p82<ܿ||/1I_M^.c>?J9Pi| N,kmwkV&?h#MQ>a>@yM1yI8xd W |3$Yx QvO"J| 1 G6~+oc>]A?[Z~x=9B%E][q+ YZ+kyk,&]"8~Gzc`nW2#DSo~Ώ B9ٟg" 0@P$dOW-bމxL P>^Y^3x {5vlQζ?3 󁧝Nq*N8Z^`8ICrRnɎy+p:_vV4cũGy}gG)sq:?`l%D9j-yhS j UiY::h]aFbϟ-4yٌƕ˒%7[Mgu{-}On3hO;bp* yaH}=#?\z}+^Y 3s"JY;ѿ1^A{E2^n9s=ZwCY:=_)\{z\mePF+ֿRTu7]g?sXȞd>׺:-woyHb<]~{p6Mƚ+,L2.B\. v-GMFW ?2z2 f[ :!s9S#pOȮw,b"[)䔯VY8JxWnZܱVV[4|LX3su©g$ r)+;WzX,gK=aNBm|F(/q8D`jG&C>#V.GG-%ŏaȵG2r$ g$_?; gA8*9Nѓ>Yu37TgUW"*}F\z^N3wl_3Y3 r&BP*=iJZe%Q.ܲ%Or5y^,H8vOGx<" Mg4+}^"j^VR[<ڃ=PulX{agZsnEaM~=[XԃNP^ť12Eԑ=g&6S<Ɨࡳ^¾pkphBkHutylQ:kiB:#q.Gl`1\E|*̉}] !s03O$bD)=scR] o)Gx+ԋ(z-Fto1G#eF$ǃ1.Ұ|3W.;3/eCbZY?]7r uxӜL ΅YDJAۿ)ϱFY}d6>F() ֝nBGzmIԞo8|QĮy@p6OuZW4R{oxa]_ၞ U8*tySg(خ":Qc_z|b'&.K+Њ"F(WX3h"z|,Dz>t"nuTg߉@!1@ʿ-?:!k8 \;˙=,[33fϫ\-JPʙE{9"⯞/_8mѷB?dy]@gCjy?,»@֪,gv4*:<t"}GX-I';d[/Q7+Ypy/3z/GUvyQxlra'_0q<"8lwym0ɣSwvyb]/mBg/X8Q4Qs3k ل1te;|bwc >{fN0&̖9&ɟ(7 7 ggj\'ںs" 6|kG\' nHqd<nu}8"91۾ Ui#Sw431|3ωQ(wv};_V6-p{.?--fyaxgҪs~b>nL^~bm.tmº⅛?dDo[fʹe'_֖@JSՙ4V-55 aD7dxTz-U_/Urq/@O:U> O|+28{|x}31#w1|NJ#xbHyZ}cfxVDY6{@?w{pj~2 nm[关q0_gnϙu^v]94/c_|D_Y'ڱW}&E,XGG'e6*w ]i3\i/['뼯رw7͍:?/_9][cyJ1~lM᥎>YlO[ }~g|l\ϕ>V| ÿ>o_wru 5OG52n5Ч= / υ>֑.4GM|o>7nr]_>; >?W|&&#G{hML;bhm'޿>ݳoz.ֽFoweU;=3#E3^7 :ӞʓYGZQB]sk:QZZ| y~3';V=]SߨWpm/d*8 GٿK#MysnDZgB mp>pmÌ\M91_ݙoߞ\O$ٺoߞ\ۺ.)~ ]go }{v>pПSxzr>pmYs7~}UOwͿ9'К[v:~;^ED?sA:XIENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/right_panel.png0000664000175000017500000000530612412501752021754 0ustar brunobrunoPNG  IHDR@44PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@ pHYslIDATx;(u4P!Bx:Nl`lxs$PzlvT < `ќ1&P9ݘWCP9e9sy!{xKShs:s2Rҹ(mf0>GiP@^=_ Jz0 UNfc,K8 3҇,/: 2 5Im>@,Q6s.E3s6Pw@30^R)-e+Djs)C xpc,<6A#&K)0pilKcQx`4)<\\u f $ Tcc(?ޗ)J::x;*q :?5f""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@ IDAThZn8G=&=69#"MI@N WU-nًs2=K"şb}?O5B,!KR5W`W ,y<.,z 5z5G 2XqQCTk:j?,W_M>Ͼ9|֍X |ރG d殳qeu;%a>[Ǫ𪜣G5AVj(G02r_db(kɳa 9*nΓ a[^SUb"lHJٻJuzpo?`<܁̻_F@H{bu|(;;\ƃ%?Sb\Ԯ܃^SGE+J^`8t5DÕ e +\KIp=(G JV-GVI?8 zvbQ&>i7~" brϨð0gpBaJD5X4q\Z.cz!GQD&/#Fû>d83)!)$xs|14\# 琳g yN>MxPц?Tv21XICȀFWpynı;T b+ l)ŅL-kh.~-ɽAw]LLs >ƥ5݄U;1OoyP*X—;nBY< b^AD;,w5L=E',v:+]cq.;˜HWVáYt׃}^(6,^ q"+a?Ev\}v&HDB^!H 6܀rC`n$#aV\ Ka"8W5iߍJGQq Ɲv:"r?JB!H2${y8=,XĜb@}N>~/y&8}?w*`Mq &K ND\Xѧf6DH.IԑrF_Dj2 nA*g}7~B}yFSSX=0rMl]i[3Z6HȜɇ*r"Q( -}: v ~_iߍjc)OE>!أJw- W`L1]JQMUj~y}Oڗf|o8oqߔ2O8e7$+96_X 6 9kACprswD#}?J*iW&}"&>0D )YÄ'% 8xo86 ?/N1c7& ѕȄ2M?T1HiF-6ru[Ӧ{;x.]_a3yȾ'M@ɋ&goa,blyLGIޑfNg%A ф)Cn[iluKPxwKƺɗg8>?5s 'w%˥LLx<}z„77 a`gA)kI^B duQ<1D,/0/+i}GaZ~ZvǃӘ'GӑO2[Ryae~ݦ~xW8"US\f\ډoK8f&z/Ѳ2to*TZꞹMhn=|ڟT&(h{XN+0o;i0»5i.~?qtӣɗYp6B(8. w|u ~\7UG rHa-τ92R>Rw]v WVHG @>i`\&m5i#_㊱x-A{|M6ߛ@Fri<3 >Nͳ1U]$ 8D̗P>[>n55H;'m.@m8yħ?t"ڌ1ev4<񟎐bpb!4/ L@W+J2^H05UXzh~xRUǥPZ0ompew7i*/?Q;&W t&e͒GéNC?c(X*xm^P>LPQyMxo]3yr,k~Z0~w )bi!x_K)mpA0W -88PZ_,neN8(tFyl-lqvYE򲂑Bby7f|TChT[B18C3ȾRq5AŸ咋6oLj?(x³7M^Uw ;<8F\#6mQ]\IENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/font_score.png0000664000175000017500000000223412412501752021616 0ustar brunobrunoPNG  IHDR`oPLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@WIDATHQ C}9J;X I;\~!D"zZܵ96C\Λ_~ Hq?rB7 I(u>'У-xFD(a33̋{_=.E!`Hd8hl.TGdp;7gr+[KBOӯރm,Uؕ1R Lc=g%z)Eʼ4~f8vnC{zW5 ,QbOQ&H6/}EI_/qU&4hAQhIENDB`tecnoballz-0.93.1/src/TecnoballZ/lores/all_sprites.png0000664000175000017500000014575012412501752022011 0ustar brunobrunoPNG  IHDR@&|PLTE~5b?M1B5)rR<9K2!u7+*>""o%ZR4$q_6b GʹvS:~R-6%|b2*:c2BN!8zL}J+BB`d]@R;h4HJe}xrⲱS)'ڪhsk*J""3arrqc~jrrs'` uB%" kI)q"J;/3ҒzRqrڢ^0/YZwRRRojjn@4R>""=::T`bbR22MrrjA<]ZݚFr:2Brr66FࢺbBJJ&"RR&&6qbR**:&&>>>N*ZZ"jZ~~zz2bbJJRBBR::J..F66N>>VbbjRRbRRrbBbnnbbrbb""BNNV:GTVVuBBb:jjbjjr**BZZj*22RRjzJJZJJj66VffZZz^^}ZJjsrr11ANNfrrr""2jZz>>^jjjjNNn²::ZvvFFeRRZ@ pHYs]EIDATxM$G._聨a UzViY)i%/Qq zwmnBp!*p?rĩʠaKΎ} w}2s˗͖-[l085M/.>b/ l!Vb>=ßm?,>O?}Xژl8=c Bͷ-_1??4 0Z ۖW+|2>O~?_\ Ž0> $>$Zj 5icL?mf%_&Ms |^ o$o<]. Iy΂ e2peƛftzwW ^.(?-ӻbOo^\yA|j m>I(,M`~DobW%UE-FTÊNd`rE5ͯ"plz6 mVM1" ů="`ukA ҹpq#'xG|a>3(@@6$GLAr?k|rן+j;ͷtbKb;gZt9[{a>'"UmQ,|5 h7񌥁uc._Xf2L-G<*s;H ?;0z6Gn:v?o ]*S St躤k5$`x_b$ d-o>'fbx~W^m%7)_ ,K1s{Ws6%_'Ntbl<[.vFO?@φVoΖLVKVX._z$QBc fH[,:w/emiE5\AHaH5M09sܸg-]3J")??Y.d|>wRA,gN1]x:eBN0E~Ў/h[2lghyS3*|qsj)p5'lԐ( -_qh!1$`?sT}ԟ!0R_ҹЗ3Ph ClvQl(0 $Qíصٽ^1jqBFAhSSI |$|I"cٜMEz*t!F&4ͮIQ7m@`n.2UU i# ׯ߯ƾ%e9DqC§hi1?f!2(<|UA00#B@Wz!F]J#4*%aAeo05LN߇y9SS$a$@uQ)_xiY!6I Lj=[%qF= ~<%O ofȟ% 񟺔g!$x@͵4 @cPl g4 4 q,q_ ^%))9?3OIiX@`зHOqFc5 4Zcݏ*I"rLW Qx:JH ? RՓAM(?MZtxh*QOdCtϖ5@íKjM } Bۜ`mP@jBYI/2LC/& ^XJ?7l0Qc:g[MF]Pї7KKo&>&XNϣaOTϷjGWܠ46$B+)H}Ih 4Ͽ`z/ #@\fåҋo@t#EERA}dAK#п Ӊ8+bZ^83>ps~hZEhk4ss"=ʇA`fh}H>hyF*Ll5bw:͑dZ,|v.vebh[VnRZX)"nm8Hh!}/Hs`QD#<2)[6\CNu4+$ RB1X~vůqYA :./SL!榨4!m6@R Y>{4#e/vh" XBv R2 WltWJZs `"dV } 7#0$iqhD`U9>@W)b 62Gnz]>?` 0@BepԘIJ 5+2x jʄЉaOIt3e0*12*PiƜ_ -~ @[Tx: *( j4oi,_ !zPQlǜ,MT3I3.Z o-j8dQ{d&c,ffgiVSh1|駞|f]/v;bFޭiJX}?G`"?J z+oDSs,_+1޼iüˣg-&'ڐh~ Ӥzzum:h,xAYrWh+@Ƽ|)7O--4#bFaiƼ3zXU/GZm ttV!MQUQa]O/?`xj <)&Ë˫=<5}ǰ!EBb$Қf_)1_+9~n qԜ[PM:T!ΙT*h?JQ|C#/?;0Rl!K Ax$41/f/_v9߿M-=u>'CX-~b?~sT$8|nGLj渄֣tAmm/Jʲ*?>p f%EH'dY{ON!-ui 9 7#F+XS]- OtzE2xK~ؠ#&Gx 9ǎ4cx/$e@tgЈv4CinqBk mYuYk@Z^tEP~ h鯊E@5/߀,Q~.[NeN/-Ѹ3A 1Hm2]3 i"lyq9j*cM,[L~b.ꛍ}sZ.igu=4kK޺0`pf4b(cX~fᎷ\~`UiRs00^^a>]>%PfDxz)L/]hR? \gJO_(ZSv>Z5( D@bᅦ'@4g'K 4YaaZĖ6biU|JQɱ8jxU@;#40ޢXiq|(9ҖzGѥ{ n/?ܐf' 7;6ZzE[5f?PloQcPaIrAkXd ݰĒ7H=Haq. s /O? !xөZm@1{;;-Xq<١ j ܠFS)1OpV5/SYڔ<*M U]l/sο Ơ20L=V?ANY#(DϜôWc@يQFe0o3GfɫL55Xg}=_{ʏˠM·8{P~ᢢ=pKG^Y"M)=&G%/5$o̭OgM>l|y5"A1-=(|;zrԘ2TkPQ4Z'ž1!=&:=}xs(fAD;Kt-&W^^!:]gJ+X5H瀮dDӤ):O0h< >XqޔLӢ/B@cGonLU`z.UiEp٥)W#tZ}ľ8\~JK;NUŮTg.BW2, ! i1a"7 Ӛ+#Y[i.iT[Pmn')A{[>!w aF/ql+'HC$6h5h0Nn|6iy//1z>>ze|zoa4"K+ ?Uxvx49 [&9Hg_;|~<#; H##\7sI#W0yGBů/[CH0}>AU; w}ʿ" <:}>(LZ( =w70ӟ)PL+ l6v_Ct8:3?aҩsP`?>s{om?c1Jۢ ;/8{%y- ^^4׵aS_8|bmW2UU'HrCᥳdsWl$ A7{auM 2|[ sW \c! dM'E v]XίG&ZJRLH4еԟ):F"Pwl-=\6&٥=/Pq~.iIS# ]%:V乻s_aС|@8겨Vu]+P%6;*KfeR #YS(,KjUE?buÏzt?hoA } " L&dݮ BYNWI,w5D\[Ѓ TO3?_RrNJtQW:l"GQ !AG̩}"qW]adJ|0-tLI2S?b5PF"l~2Ud 3}~wHL{RtQ>M&w% һ 1}RSv=0yns;Mѥ? | y<:@Jɝs;MBoh_bH+W9<%6[#@uM⪕>6ç8*i]&#Љ+F99T79PJS*֧!-0~a-ac\p>QwQpPU{Tqz%#q8m-Z9Ò1>$ԣ!+ŭɎU{:p#ﶎbZaڷWĬ({b#BcDx ݋"aE9wg?B#~,9 $O`'θ\.#)~L'x6 ԲG>2"r<~AFuX\?:Ĉq֕F?1b]oIw%Q$yX 1"O.,Uv}<{tzI~WK҅J|!$3SWB%B?蘋G >>Kڟ7O'5FR#`?ل5ŭm.{O.xń5DB`Yӈ#/eQ$"s[!/ ). W Е&B}Cj5VrXn{1_Yd^.h%X;!2jokjɓ8n 5cBmG5~ß~Q#FDQ灅;]5>Ix%[+%6H] ²w;H<=0䧺7:=v<ň ax֡."u!❦˫'rmm6Ňۣ2>!.r9bSy UG{&PvFpl݅V/+R\l3'hƟC "/.VJioم UUP M= Cll^eFt/#P teT naU+yƫʅ(ŸUl(|BM5dO<ݺ_oѥݙ[S]puXOY[Z0Wm\j,~_-^dD ?Sߑߖ>Ny@F0sP ɕuΰ:u?+ 1":Jq|:J*l]erȴ9*qKgؕIR` CWD//+zI`8_fFB*sC|OAVj1"RB;DU58◕b>L}|~ LwuL#*sFOA lE4# " F^ +zy_݃֌X @ $`ARAa*# ,VaSiA8OGѽʯbG]]{ ]HB>U:OQ.r<]G[ (%.$kV"9qN/-5ppw!?"0}T.C ~~ցȇb$2UBޓUG\~OYT }Oĕ>ǟ6w6j_ٖNENb4+7cT_rCD-֭^E.!78mqc+JPV3FVSMgoӲV?&#peDdDŽ"hj:8?A9OC9#ڕoh|R7oia&N <g9d -46w|b1ˆ Ok[4Wi`z@[%aj 1&F!>2|ȴv4#q(Ҿ3.9..g-sXa*`=O?`"qΤϫ[kHĬ4 [)ϖO'§t;a&xH=æmqGD scZ:xRKjb3d=ߏ e}O-] "^.mQ0J:\m4pFD>q@c:zap}/db+}NMv1PyQ :YE@F t~Νβu?쥺E wH2:q ęgL(x⻦Dvrs{\QTVwLk]iO`>:.i" jExtm#sUV"~@_m$ĻO(*Gc_~A\Z CG.Iڔ5nZOG_G#(nF$XyU+YG%v)R2BOR NnU{wt!Nօ,BT}u!8w=;QBgmD|ǣv/(m "b>a Q`!]PJԹ.8Ggqux16<נKjxTH•D+jUEWGDQiAvt Myuׅמ c8`"\QTʮ+|G1%80Pĥ 1!9 ^Pr] .GA˸QppKy-gW7WYQ~OjD=^Q(B4 6,sJXTA"մ˴[]ejh8$x&""ӑHd6"nW|Д\ [^6gӠ[i2ÅqVmzwbHypXJac~;\ N9~߭ztGzvq6*-PS|ݽ)XtҸțبQ72a4%_̀GG#?."-,ō 4Rϴyj=cYP}#l|s8 \;@к'cqЄ] c $44] y+ŕY+ 'd5Wa2"~ [YC`Q=9ЋG ]9 Yɣ,`{H>Cm}m?'8YE"!}b̦ ,x\ ['Y""y-f?uU]J"%E@Y焙El|x}h.G+/Y,1I<(C2tlLߗ ^ ^5}= tП~Ps:Ջt@`Phi@,6}~OJME#VUQlu@˒t}Zt~]򩝶.lU7bp+jjp JAmB.>(?f7(l[U쑨/n$^UUn<++RW8)ZUgtT^'DP F(o )Pxnʻ/2Ch@2ڡ@a%^( ^-Lc(cw}q.,QN1SAUi~hY`\=Ҹ1twDƵ?ULڙy֧,S#~]9 AB ν@#E}A[30? LoXM|cf" zU1e: ^`yT>5ҔBH 0aam'PS!sgo,]~nBC*"]|@A :fZ+f*Q>#̜dqA/]ƩJW>E6R[@y,ªa'\ˈCNVHD#C.bo MxK((P]1%pipqʼ,Y#m\|&X.+6z :@T+TW"5% :QeKU@ޕ+"J=0K4;drq]\}@~ j d&F`21Xl49_};70Z#D!EyTL1ѐ`ЅfH!:hn*)P.M^ h0z4^d0Q~<#ݕy,]eLӴo|೯4Cpд.p G.GЍ lBc۲O4`5Ƶ")N/eRJ%ȱx+76} 9 (#5)uyY`ZE3J={ut.c T_۲< ZQ$>?|X%K:R[15 !گt+hjٟ-8/䇋j; QvQ| 0M1-U[qLUI)\~k* m m ,26֮|.H-PB($FY$u(0|T>h S7P[ 0Qޑ4jV "4Fz+  >sshOqh ?z]ڂ3;dpeuU#!ޏИ, P(.ȷMarZ6 4ABFqW'@6yB01B!pr }"tjM3փZkfΗ%nKY 9q{ 0` ~||!iAЗbB2ChF {8CF.+al6<"b4X:f" @&CKj!<2XF nX4 _(Ђ0#%˅|#Ycն7~WHO!my~wj0X ~"_ ^ "שh*@1Kr%>CRLXA%MJP%ȭoKSb }j 2 [PcNbBPifϿv]Xmފe]IRg9_&D<.; F@1Aʛ}B>0( T=ۋЪa'cA)jJ,o=0=Kd2II{?H0BD2@:Sim~ NŢ~D:֑?.wXzwZ `n*}[sa @j!ڋ$[6 Pާ/c~~|VSR$RVSN-ՀLRm,##}Qh_yɺ+:Џ~4m#\^~ty9UK#Ֆn3-F҇CU/f>K<cQ?_G݉zC "C19c.)Z::}tT+R~bĩ)ls6!Κ6fßt(T4aR͏oE&Lyx`˯J?{'%-&tXj3Z3<A-hOh~/^iXaDŻWNeAPNf ՜ܮ̗lh&]H!]{]OthWsz=Hd$IPd01̷sѴlyi6o3-7w| H ~oW!\ &M=}LaUUj*KCE؛sAh]=jTn,60Vm+lEvĴQ|Ȱ0m%,*Bh<}a4U!0mK-Z`h wjRSww6,j MJ#uY7)y*6^+77u+mNuq}J=[SUyHo"ϧ5ٖ۰x z .RZj4Rsϫ1ma@@m(  UIp#GȲE ^ nzR_D_>§҈EtU󼞧AtG |EAҺ?O6ڦ1Ow@iPc9P91%v>[ @| Bnb¸:˚>o0q$ __I&wR cEs+w^4^" &TjkX[]+!kpėo532ꑳ˴A?`q Gg`0R@E4B ;9$7Mu!D$ qUƊMBO7|v@,?(9ԐZPc۰L(s@- Rcf| sDp*b߱UBe>V B  w_>CIuqH? -: qzı(xP؂ +VmaZm9`sEX /j%:v24X܋/Vv*xdhg v|hUw")P7Xt9Pi9v C&d6[=(Z0Nt-X^d+7N.ox/I@J`( DEjC>1U~/ Ƌ$AcGGn]^^f;kR+Eꜥ[ƫ p"D 6̣_~%|p\A΀N7#p)a^5˦շш0Dji'ɏ^%A =(4?ɅE` s_|6sPмY/zKp7Aٮ6@l tK,U]ZxNq4SQ@6Z>ѽqSnP4c/}q:φ||#p~%|[zUK7x]jnp8)rҬ@Ȑ <[?M)t3 dOR'Di䨟l%u@(&V[?a(z&҈/s_`2E+Y9*ds5 OE Vv0 s5 E̩1P~¨NV>G`Aday9>St!E]VWRm .ay1c ԠM1N M'Lj Q]0G\-= }&" TM7^Pmq6 t4ъ .`FPh˜gumOIy&ăy%sPzɂ>hpIL} NT@{XO1IoV3r%ZЮCko\;VkH˩ٜ[0A55CáqY,8y5 8->nځۍF1a͂Z֬Ƚeq`)\FU#OiRcI&0o- _*sULtF%|411Y.Ckɖ 1_fn}hu@}bIo(Pe1h%Y֋dΜ;S+Rc*AЕ(֤h#=!%Z3@R؟Dz P퍩1f8 џtYz?v:G|L-@EP6z(XJ>}%z#"ȫpO zm )۹zT.j=KvD]{- hnKZj5A>^n*k?)"|>rD [ A<^s@XmJ_qWݹĎnn=" TBO}< MuOGl/"7W6FnԒY5ANĊ6\E]rly.*m0{% +kw" ~e;;O+R?_=/H͕7N-۔WvBofzëpH/^Ѕb baq 9#?10H83c@,⼘W;DA?Hc,~¹]:);]"[q)Ն\hrހ9lU>ii4]t#>. yj6Q Z*OM(CFp*F *5ud/A]ĠQQA>BMթ%+ƪ~5sp-thW+vG첢kB"\Ս^ܢ^$73e 0m@ f4t Y#V+7Hpk˪ոmW7T׸xcm^"]BG[4—U=#\qmrYoB=Fɤܵ3*H7#z&2\A^H\k%I ^gjm&,غ2($0jL[WNkgr>U9ŧ [76 Ъirـ ,9C[r^>\ ILEY(cmCn\k\9vܪC OV\-Ŭ מ^JW`p9Iߐf*"f.U W uas|̝ij.%Xn;] zZh`s,peW7ٞT-hyMZ<~=>P[_pY5C<*jFԶr U^@`L&pP Xb=+蠠JjiXf9`y\¾Nze $Vݏlm!4=JBrYcRIsj!NIağ;s^ef(hUw?Cs}>S&orqyJ\+b?t̮ ?4< +PU'[ʯn(}Xé6>1p8~\4~x << @MSDV2aq ]$@tQA`suAܩs 2f.d~~^!xEN<#2_ { Q #p#B j@:k ?+NDVW@S^j&ܩc"[Y|V1OG>J8`Ҥ׬Tq3P:CL~_|gӑaBCp]|"7Hχ/<3`# H"6 z Y[leէ"~%66D>.08q1{x&]~aE~t Zk'FԴ]9Y1i1`u \SNJP'*B |x$7u!A,^UzA[)av$'N) pBxQ2(@cj;C·Mם [zq8RNGAN%Seb\ˑ ޾|bwo=!@`j*:a%j >_xFLm@Q3 {ِ"aj!GΛ'<S#,;bbП4/Ad9V 0* XԌ@@<*Z촙@^ T>d ^/\hx m9~7lww#s :Fu 0|m0 x;1x?6][Jrt;GNQZP/^^uFOzm-tB91:&OxD=YgVS7 *r6[ ѓ W2E1 85ZS@>qԯ]D@s?w,Q;n1/(,{7 w,gL{hVfw1͉}` {^~29 @B"c[6;X_<7yv콷+%ba`3a'_3I.Ba%a-PA_yD瀝3]bϽ)NOԉ{>!k~ikQ)`Bwp@Gてn4k=7:Rq@Suє'TZgm@gG D ygʇ$<)jm-e{Ͻn+4Q,& ~@B$xtDXlJ\?X-x%C0uŔOdO.=J Ȁʟ`8vF٣G!'ybViŪޙqr>܎p΋Qѽmގ8L% ּ#􄃄OMU4<3 !UR@@O_:`poՈ׃M K32lYKOA>kiE}>N{@w{kͰ:NMFM=E,#(/Y'h>IFeY6* W偌lG亓W甏̃#Q؀:2\ѣDr#MOBm ޡT[6.ИL}F+{ʢ~ˁ)G5lAlw(=g" P@٘rd`B gP5Պ8T5(@5%:F!i*ҡy+kI{Vv i{Ai=$( H axƨ} LYXcGC{7h&R#qM]^-P0qz@8l:f W@Nn>s.xubrT,PvȪ0`>r@vG%æMEEUPMEeA.!{#Aۄ0 !pڬ׻P<#}wFm5T}einU[z ƣhXEw-J΍ z=`᱊#c8MUT>0/K(b]i[T.׾%-C%Hj!Ouwa[Rkj0cAP,8X e-eXI?ejw"%) L'ܷ+OA[O|h`(޶{w~ۏB`8G@B&vz Xr"X;^p٣҉8[785oGW T恲Focόj)^ P7m!6\y˳Ȟ1Yp'wtwR\ƄcM#)NCR 8K+ATqpY:]#\ٗC&,HduD0vΛ:<C* P5:YȜu&N:v+A`Xaݛu" + 3zpjRe!#[qc,۹@VxrzV.+@@u8&(5!jM%ˊֻ̻eZt0_I[<E>5T9=v[sl+!D Z 8_M=feQ:W\?erKz]xyЁ&k{_0`L܁ Į&^sF^ o YChy][hmx۠џ' xyHZRRZDs!](ԉ.q:((*i."NtHlͶKכӳ|ޖYp@kUFυ&̴ρ) RπPVBԘgkm&[`L+VRvmA O"9mÓ^XŞHok˯̒+U^heWUdnrԽ#zya zZ)K? ՑsZ'4 S%qfIt g E_t%dT:&*k=B`=]]*}=Ԧ~"L&`\FXq)AloKW0j}lۋ@|G{ w m"Ja؄-Ak&~:G{ i^JՇ}\GsV^HZEd9vܮka{^0$T' `?qϺ5hv爆QZv8)KMGU^?FR9/+knB{ hGGk`ٚErFy=Ґ9 s[^V$7w6 C+_Bcvlgx{:Õ[IF`P-wJ}(pZ+ˊ0l ]V2@j'.#">#msm#Ec.].$d[ $/+G`ǤK-}4NSt[B\'-#Zk!W`rrLW~Kz8e+?Z2Vx0TWeRF, oaT5:y tA0bt-R urUbn[9zPq6q@ VtBF0˻u(\KCApcb693z8 X#\4ԙ[@z$hw|ɱOp3uS.[{{7W 5K~t8aJ-16˖;5 kQܖ~YD`D]苞? NIu'8'ѶlJ^"os s^g3x q֫-HjptfG"&E!`; wtp 64m(?׏za?Ԕn126~(o^iygu&U]Ж 締Q]XS@y#2kBXw_̟̄J?YYyиW#O! sa3 SVt!5NL"ciݳ=l$~ /d1v3g9saEf{!Fx r̴rZ:Zf9KeCE#qNXhTz`Se 촐/upZ>?O*A2T-^y_W}ǚT|Ij/ ڐ*Q.}!>)ȦN62uQ@p#}gnl=0ճd\9ȕhHOMýd츥d\/fs`iM)X bKK) Yx1=pD\ap9{Nr7o Y Vkp[bo {T3HaI-|ߎ;{Nc$,fb2ކ@ v$NCG$(;9() /m?(`'T\qO(K@mu.wVfOr8'k 8LVuaЈJe/ܡ{ʣ8'$, KGı5y7cT Muک(u9~AS{]b*QɈk2 rsR#E ΈN_[ 9B#03Ab_1sDQZҋoG:sX{4&K-4&}5zRjiR1V~:onb:ۧ5? t o3G HnvXul )uh)7UOi-d3I5b$1 Jҋ[xIY;JP4`0N-PwB?Zg+YMCnIm {+C\0SPԞvE2t1.6$sJ ]w}~f+B+<'H58ăg3u .t;8ӎrGj##/ >]lF{x(ת{#`:S~>bbG} '? rY&vc ux~ bIc;O)+ΞYJQjTh "#bfЇ1KEF [ p]*2X'?SpBWS ґ {[ԦP9FQ S.] ebG @3 `@WW:!¼hCSRW"Нh\=]@ể%*8M"(ZC9yIV$ kckMᴐ|Mf9;Xp40QQ)c{=]=:\ԓoKG`ɬ/?dӳ(1\zz6ejHB 2Q+B'8Ioχoވa.䒷L8%eq.@K2QL0fiwΩ%"p<>#Y1 乓Eşhb`ӻY!U| bgW0All"7!|<(" RDěEQerx4swXA:gI@p"zK")tE/*Y)@zePEfA1uE`@>3 4գ@1aO ?`mtBr10uAgS+@!|"@f9Wh݆օ ыr{=h# @SsĤ.Le#[e2־\(F vᢤl xp. R @JwQyShˁ!Z$>A`.kW$O<$ GYJ&&X; _;VrG /@t~cCRt7G>F,BIVk7%_/whSDh*(OF(;nwυ^" `Lj%w_Eѹ =cjUg ƖHA_0Iaϔz&kN>Q~T1\3rP34Wҫh2|GY-|HΠu1 MN_f '3@ZNE9ad^gv.(;8htoo V9Ph*vWع< Uͧu 30b(0C@L}%ԙj0RڙK#Xpk?̛V@PooETeˡC] NؽR&Qڠz C>f"otߗ33 ^{Y|L竳. S˝ Hk56- Rlgh-nAbсONP5#u0 BZ@qW6yy TC)mX`jk N ,sw' kj~(slL1 rvDMp$8`[ Zލ5SB#Lds v5lEm51괇O Sv.Hm/ >?8fp:hSWF;W@E v*3@}[UV]r:"p=V&$C=pK܍pH]BiC,*HBv 2^(3='>2  (lpֲ 2%`̓_5hۃu~> `YQ1݉l``ЬGZq&&.ߒN2A0]n VL;vS2rҀw?eV[ Wl_ @/`L<+Q`>wV,wVg Z#(=Im+er(aA_kj TQ@ 줲_<Ӊi*ÔS>iϼ}:>v1T݉8LH{a^"魲CK:_55%<^™^r<HSH{G0g)tl;E0Q&XE=AWPyHM @{LazqFag_idd0- "-Gmho~h1UmӼL'3,bi)518E)=K#pStF'ZH5qH] tX6xȥlʑ!m2DDt^B/Ox|VQX賟6ת1NjGaeQ, ,A۳(v:NttTߺYV EqO]Nq|r+EWȳ8s6E9+00m-0{l2#PCTbaAB䢹--Z m PsRb+DoҹYֻ@x*!~WZk o5i3a6Y :Eq*_Mi2`ܙ\O)cNX= I~x Q؛x/S2ݑR˸|=1aSkq(E!j >(܊޵5L:}@; !DƍV=P-yii&4utԺj%bڴЗV PXBwk+Aa񘿮? 0Sp|feC9ڎs'=pg`'v Iz -oEOXx̣ *YQBT*vޠəYON֕`b7`h@#0wGM:\?tfbko{ڰԞ4nQȍ 82QnA0^ XYX:2ɼS5k@N`&OVVCƜOqwruB2Yr+ :XhW(z:jNT Y! 8 SX~Ұ҂ݠƠ<5'fY>E5/ ewy8bSޠM.\;gѶVibD|EMk݉5FͅqFWݢ|sDֺکƄв_~Wb(} :7:JQbYEh>"?bTɎVԝ]uWcH(aQa8+޻@3ۓۢ|@Iɚ/j (%I`*ݻ9n޳7F P=#?1"A$XT@%hK-UkeE&G5D18~rH'F!ΜEĽ68L+\S@8(\_-]9AqYX#l]w֪DP3ٹ[c닌c=gEԺ#CHC-S#qru n FM;3|qR-7b}9Vc^Rm%/V\GP46^mw.)9v"AK51B`Q͞`@τynCĴWj۩_۩t@"˯s&Z|x%z(Ի:Wq[왻v1G1NmO<X}J}`]t5) ߪq pOhwlP%C6a Au[G?f=zZN0+hGu[Xx%NSx;H{h[GU0@@Rڢ OY>,d-Y ېxH kZĈ5+L UNjg}}AK\@ц`9\Ġ%!TȪk>!xS(fv- D"pXѢkeqQ8^ƭoOi395Ue~r*)gkSR]GaD1av* O~ܫ`zaN SSd~QwAk"_pq:^)8DJ:ZrPl3Yh .>\L{UgDU9PύVZG9*qWP`EZ?}89,؟H"= Ts]f"<9;o7Sr W ,!0~iMOSItˎE0^6ށa- P$bG!׵JtǴKp e/w8)edp)G9 j*.K,JHy+o,u`Yp;׊t~H~ 00>Wun9 X@`{~=(H@%xمՖo;wJŭ.(S^9U48)jQ1PJҫEwD4a<=O_X(LFO!ũbZ{AV*uMq6pJ0l ROߑhǻ:LN`=P?./P ^tll/ڊcw SHG:4c! V#Bs"EΙ 4"1,Rn?-hQe ֹQ_pGF(@!D<]Fv]J[#^O;1X`I`K^ aR:Ywa'~W#=ӖOsS}`X1MZ~}1׉8&9 0st4WqrwOQ=@۝izqq}u%zfƴh+.lLJl= (ٴG~^0իܟt{2k{zؕb(AO~(}`>4{xϽi~NiVb"?_<"xp|? „J0F1z/~"g?H#{)sL<ǩ}o~#Yd[_#'0oq70YOi|oJMT T?JgoT<Ņ(Lhi2S\_,6 Ӌ:h~rCQ ;GNR-̇Cyb|B2i M=#hڟá&`BG!p _H)B`>Bj,%%gN9^fe2K{ %xDαڭFM9ЇvEbk)A: Yb`eW,~1+NޟH, {t{7Ѣe)|xHC,ߔjz; ڊCHYL T2뢘foK%)~{_.?_1*I$hFo كxoFlA/NG t(r=uboex//ˎ&o V ˏexv&hYIM{U2HIDATmu)24OěbT:(-?cdH)U]`ӎN6I\mЭbj!w_0wqZpɠ7gjxlUcfݤ'!Y6yfU1S}`S_| ԩZ?bVA(Re1]gAݕa}@[ k 4QcP9_l`4 Ej6k=gc?2 |S1ƔB@ ´W@L_P KjL]WmkV "Sb-f]8$GE11>fݕ~T W1d?xZ8®r֙ҠUuۏYcܲ5txzwʿ;?PVUY5vGaiSDS!R)jHڵ5Y1+{|ji>BMaC"臈@Tb3>/A)uf8D?-i%;|:Q_G֝d(֘U1c3 sV{"k'=t|:kWCZt1ݡp`5VKj==k1(5&=fSYgHa*OStOtt8w0&55EK#f5:4"EQkgݡg'm[~&E]ݎǵ1LPt๢IkAmM|݋T?1ƬP@:/PmI ўEv?d}Wcj КO:L⇑qS=r??5DṚy0:q˧~eߧaw[j%[y! Z{S罗;-PC c0Dbs@#?6F9 Y5=}>~|0ίЁBv'V^7}}_0ʯ@X!襛N}݉]'X]B uwzwC[A;a]~"@`^oTh!p`?B~~O boX';@>Aԗo}@Xw_@ ]է@`ы@{|}wºr{WC@Xw_@]ؙtC~~ #H蟙s>\]9ĿC }{Ɂmpx8 E .\?WWOu9P: 3] (6,?Rsgy̞qa榼L^҄ǀR~[&r17c҄ǐ߿_?w)NIU]:fUc[£> u#nv!€ Rsy#+>0X_f譱s=p'VG?^'- X[*z{߳c0u ?c>>^^;_Sw(}:F$ )?=;2h`N0cL݇~ v䞋`/;zuTGX>,O[n㟊SGOHX"^@OSؾw<=>XEz]ts>h~_=zpņ=<nGoO{ȅ7B:lb{wraz>~ J-O~8+#-11HqDS|={]tg"Upq}pfޅ>Doߏpۅ=»g宙B ;vY_5\>{Rϩ]3X@cv'G{=^5S(;Ք~?a&r D HPa߻S{L*烽"L8y R_{nejݖ{rTWRzN'H%cG|*yS{i+~ {"i| N}sj#zxYzv ,<0^^N/zgzkoP~aν'lחTP]:dkqgApa:: S:j ]@)XL_Rҩ [ڌ ʏ)M)>h v8+r=_ZSMGf#.gGt9:Zr9:+)g~^pе&a%'lz6t4MLU;p@?i=^CX~k .W(S(=.?{]?)\|pݧͲ7Ϟנid ^xчESolqo_l.ԿЕ,Z7 ?~%>o7a~W7o20߼7=xHؼcg8g͟jj$@{^_yi)mipr gu@@PϾ'$߼Az~uh]?o/@{O!o =߷'ݾQW/S2CWϕq `i/Q?SL_@8^o7=c: _мo"j̇b|xU? Zݭ(OGKzі r?ڴ_oXˏ[]o(6[Ex7 싐/%+Hxޱ =O7? a(~oc܀? ' VFX=ov:( aϾW]|u> p*`O [$/|-/KQK҂>U wm \ XT Վ/>fau3;ht 0cWu*gmK3nUȗol,7^H{^w`P^,@VʄVfdxk@eN3S4#+g37Ǐr6˳>LikNT?wÛgaA_&&6/f8\205u;\FfVsUzҟ3}afyjojpݐEV% 4*ܛ 4KgG+/`o^+xD!yQ[s7ioy &N_נM]Tq_?sh_+睘,yV]?7o|3<,Jqq-P1<9?C/\օS ӫ&(yt>AO,=AKdz/N}\SKbSg s%<ػl\A6;CԿ ~HKW8?,?,VRxs5AAnꕹu53,КЂjMZpXOߺеFӆ [̮9hEMtQ jNy Tw‚5V Q$yRzT Vwe +1k7_Co[S ߮k>9욃ЭA S Fg"7քK7^nU~ZGS[[~13)ᪧ/p u?Vp*oZ3^R.GG3`([lOqebMA4#0|_D"XLEkM󇯔_IW-@nWoveDa_6^K.˳w)-z/S8xZ@MJ٘xҚ]k80(ܱ+Ώ$Z\ޡ5;* YQ^Mᚁ^so`BƬ ^cxEyDRkkMUGtMP^M-~TAbbY}JE]YLMY,''=BQ6`o„xe@ \ ydiZ >X2. 7l_@N݂{o,wDiϖ?oݝ!De Q(ww#p=]%55~$K7^ 4gH]#c Ώ||y|>x<@\X.vdS"{JHpI6z j-o>7p4B9oS?QěE&,B^ؼVTj1ol>JL#y1gH"ZʪűwP ￟ã,Dz_{0y@Չ0Ou ܕ=ϓ:o#ALv^VJ@ǎ\6fhs[|j<.m//hhN4/RsY47gx&s47v4g+Q_Rjc|}u>r[e<_叉ޟ/tR>V<. ` M,NB#tN-|*zmh7"ӗv7y&ƫJ=nY|@n]^,!Ƀܕga}֨IsTdd(4jѶ2%"F|ipKcj5ɕ7>K??.[p(4yAoھ|Yjn*Yʳ g`3"ו1ؕ3Q qGZ :.G>`)rJX>dg˗|{(#|{IrFGvVHq4}YO|- /;[d6dؼI|l!j`c3I^n,ñ1u>擗m٘\(^ȿjr'n,I [HXLr_/ٷ˗| _Cm ^6`fJ2?ΡXR'˱%~^Ct4 ݴʪ'$!c"}d[&k>}\sx=h[73&݌;7| 7z5yOp!؊]U%>UD 5hפv1 ? 9fD?9E}TK4UYT}-y^jFT35[GvOZ׋Ȯa,pOPu ލնO&OF#:y>_pv,._9'}~BkI&-!($|"]avRGd*l/_ۏǗ/y/.I1e(g8髗[,$,DKɬ ĥJ/4?ݡ a?aߍOhkY?|drߺ1[k ' 5-͆1DJƓf'o+Sϝ*[z<7EEo 1u9tܹ\#yA,:)ގ).SK?j矦5K7 Aϡ쓧~W뢨|{]ץH7Ƞٍ4뺖^Hzl6gvp+Կy4͑ G  oZ5A׮}zoP?z/u"Uf oNw||v#ፁB˺} y!x H% p&oTuP %嗹G:ʞVe>C?BnWrv>!]C%<@ [P9A/:q!|Nz7/qM9~)$޶C\Q%wz(_:mAʏ*ҽ!w;7;cV#{йlnrȺ!BA-5ei!v؅B|&cA 0\ۙr+>3,_oI\K>xAOa$ڇx@ClͰ0ц700(;^WMc~7's p6?vr<<S>~B}0x0EZsn!оɬѩ䀹3>hT$%~`m\nQ@@F !l(:v 9 0OeHoOIgo5|ϫD>"t"|*a:^J2,h_ h(|Jq Hȟ |2Y XbY"zLQK||?7P<%?⦓C8Lsׄ@OGm~,2K^ =(^\~`Njg E:n|߾x\(_~<sPsj\M{Bl㻹$oieK0 C ?š[],Sf~];ٙ= ,D80v.. Υ`3iʞ0a'47`zH&6fO?[LڲKTOQ&׊/&E+8y u& QNEy.?)~D@'1t ׃-D2 TMf ! ɿQ -$?>YPIixc|W]̤fM~7SN@r{$k.-4[dl5['-e'yGF'ɇ_!/C֮6BⓈLh^@}݇dgX9kҋ;ߗtr:l_,Ysz٧A ?Fa|@l Б%-~2a?^CUp_6MUL$ig4?H$,-à;λ7@5va#俄aR>It I&Լ[VFa\z  顽O}+"{`^ 8R=_O`dw n+}*{|-k=ž{<| בH|o OL̷Ez^2T 1׫î[wdD,D|EG_ǝ-tmnmo7{d\>O 2敜YG ׹Ui-E|oo K?iZVߖsR?p_Bߖhe1CL[+Pk12$k ˷O[[ߖD|U3E'[?5}_p*(.,_2io 7fW1F- ׾d=f$g>}[$oJ7m|v_姷OkE}y=E,||RY?i]zLY|kiϚukqWٷ埨yw^#/|8~'>.fN=?U9OAGHoPA/\oX@ρ<],Ҿ-(5S|c79b,q[ep2o -jY;3eM/Qޖ$WXĩAM{oB'-_-~;MkL\:aߜr)G߬о9|S?!}S[yu3ξ-- X*ߍd2(~R/H* &l=O3iV|_Y-r/VxKX{.g[p'/.^/o̮ImYN"|Ѿ-η>CV˷˹Fv3߲ s.Iۃ20u]떡o 6/s;ߖm }Woخ/mYZz͚(ˆ}WHf,Vb-O+Li--ַcog9Yߏ|[-C ;}[-hRݒP{M5W~Hw|`9--y)?k>vȋo~ۂם-5^w$ۂ"@w>):Ik+'yjή3I!&( gm~(9t$d˖٬Ƿ&EJ2vt Fcl|ѷ,˗Oe$y9eg#԰:|>:ᗶǷ2oҫIzapR:.lǍ`_-⇿w%U1;T|(=u?o[<+U[dnb{" M.rPO%ɻl8߻k QՏ2{De'|,TEcv@ ]%w9IŽֻKFC^iDCuW Td׀qY,4Sn*;ۆ&qwU;;?5>zMOytzwOz-k;ag!|F?LpAmGA@v(Ys;-rdj{!*6" {n?gjX]#)ބˎBzػ"/^M>KR})zW- ;>b9VMޚ wDN,;>a}9ٶۇNe~=6|=cmb|9=?:"%N<7oc'*h/Hlq.Ȃ{_7A=^2y?m'ݑ˲#2R?(M]"ҕxm[UWķUՇyݟ_"7Vj]}ˉ{;dތaЙq?fǧejW6,'{o.ޚM9z?S\,Dz]f"*oGj@z+#(FˋZA,a5: ڻj"+UIqxW |qu>Ϸ{,!wZжY>i#goC]|Y_cl|e9_F:hc:"Xtd tykA|{Z7[bπ]9`1 zxzg?eMUM1E8;V 9^ kP \-gA-rZ _Po,˷|SCt> E(8r~bb .g>D 8azGAg>rߠ=f_Abe>^󉊜:%].>) 6ihsY n-wTǬL(*Y ]>',A~jʑ]3vDﱛ99w@@ȺA#ER,}~Cr}Մhav ~v_0yFbA8@475|"%- ?7(=,3U pYmN&vYS{K+}潧@+G-Zptg rP4xDYoM~<I]-Cέk+ |Hwx_6!?V`0 _Q ~ wfQ[mwUb~]ESt >r^A7=C]3/9i O5P*d4t)X>m$O;_x.>g䜸:) O/;DG"ݗCeL@CY3h|\wz>rY]zGf4[fLj"a7H0tn/=%Z>yXh3y۟ DR3xg>r(@xeFA^"wb?))TmH F!Rj8ь+?>>69MO#LsԤN.[sֹG|#L fXs #WuECl9gCv &=S*Ll2$KZE" ݨJ^/gȮl dػ.=8=srD>,דuNG<,u Bc+c:BܳfD)y) `LJI).)j/w#nyWQ~aI$?=Y݉S>{bRw>ҁS88LY"zwی\k ,d#zt0:rZ% ?ld_N"HMp[Hλf.]彫Wl݇R?64+D%%;FRAp󜼓\&0r _[Epѕ/27yg"ݪRλ5_Wą]*ٻJEF>Qۿ|_)=Vuw֡gt;Q"E2ԁd d`3-T̴+"}k2c~-ug$kđ)[v˻u0<ґpifk^H]5MBPYбU VgsO:czs!`+]EP8?]@;SKF2qOC wU|t!|]v>]F@~n) Zݮ:s޷:jܦ>G]/ًAIvO]OݲwYҪ߫D=n6.Ҥ>Xw؎V2/=a9Kx9I22)pr[yTrf]|]=7e}hSJW{5}uP}%;qkotDe7ıo\x>} ɿ%)DE9dDEd$%՝'rP!v뉋 Hb %՟wwۢ$Vq ;-*_H,jt(D?B6ǥַZ^,@n<FuڇY$g >>}RY#~~luc&`n'o=}ʨ7eD-䵁+ߋr 3鄮fNE_gBɀJȷe J])r[/۷=)ڠ/G% mcz@1}j eLַe'|]OoL69I e]//|(%̏#lC0Ou.-k'@0ZhX|i-u|O82fcʒ}z3]KN]kj5@͆a):d)"PaT,w= ʩ^}k֓(|7) Ⱦ-epTUS no: >BEa Ϡr(jUu{ T&9;fX 2p&ȳ7&1DP"S&gʷ L,'V[KKv*@[Y:y.)>OM[ֻKo˰m*AKE(Id!"kwv[]Z*>L <:;dGox~L0z>tG~wp)TU@PB};VNg$g=aI E\.#ZGj?Ywgylg!8;ʧ^\aRwX(uS1 *n!~!ؾWPoi#yt\>!D pDEw؞!6+%!R/QhA~@t{'QO(x͏An,QxKB+./&/Wk_UP#$UL苹63@Ht#0 *_iQt _}N:DG Z \:=(WE{7!Lfڽ0_ = ODE{q O'x\vAԙmFX~"`y-q%2@Vú%n_}5'<ƉV[] $RѾ;nL1KKO0/% D%Pc=`: EafGA}yAaQX,W]3Qݨ}f4h= Z B -xqV@ݑf"jl"ֈ%崧X_\gEXj#5}K ΠGaȠ4h?*.^(nNu^QOJvuHXD߀t8:RCym#|hj0m?Dz-OŦ aҙuvf"Nc5 }T)lMGFOefU5 3~`yῪHo_T?Sc}T'Te!7PI ]~*)yTt<.PBKYQ7B<괫ehWb3i޿,RK⺂Dy2P>O=7PzzԥlF`=<}u>U.&:.W~:;OupPAVbejC4zHYM## 0_wS: z.} xgA]FPKc$3'ΖF/ 1ՊH 䏦Jk+.dEoh+@R#_!06Oc- EG`PcTۓ"gE4DD+@/`2OQ" ׳a0zy;>m0"%A*mJu$p*}A`ꢦZ/6p_+@5q+Π;MΦvZHO|&YDYh\-gX(OQ`; E6@rvl _9nʳu6A4{"Z .6M[#4)s_WeL2N aܫ״ђx*(awZ쫖,h%QƤ]T=sIz͏A ioګCևӁtЄcڟ9OvEilrM? NFd8(%Nt_~ ~vGz]y1Wt-bkwS~&nMґ|Zcsz.S[\{lz#wpIRC'lj!t,QWWU_!H=* =҂Uʰ=WWz+lۿ>k׍$p#(|]j9_4_a(F-@UU #Ws$DBoӾ9/IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/0000775000175000017500000000000012412501752017505 5ustar brunobrunotecnoballz-0.93.1/src/TecnoballZ/textures/map57.png0000664000175000017500000000602212412501752021144 0ustar brunobrunoPNG  IHDR@@ɳ-PLTEB!J1JBJJ![ IDAThݚ˒:@ Fk#kL5NɇU==ѢF(uJeҵԚ^,.·7ߍzc@49jDoVw[5T|0.t|IK@!tv%@Mwu0 k=y X^HEZ̈́ #/}!9Bаtj"Z+YijN/|TWhyI?;OᚮkQhѝY?H>)k(~5逯FS ~ sE}}("#ykߚ~lQCVYs?š@et:jM7rp?C_+ro6ז kbǂe]BzÉ 0.6Pʾeʹp[i[qhyE.l,*i*1N=Y5;>aaeNg]70p޶A@nȡ6 GH ;RX ^ >VJt7|'Ǎu?`뿀h_ HLp >h)`bI\h?`Jr>Πf"q;v 02*=ɃTd ,߫.B/JoAQ*8CxE!5z?, tuEbXn?rq}B,ڢ +}.#U5W9AB?o'0"\<53M]#@tB6YG P(Q+,1IdD>#7l%,|+,@ID)O]QeIؾ OD-t ;:to৉400SI jfAF<4lm*d3 LY#jH ᨬVyR*Km kr`GDy Q{k) [pǀ2._–p`h9e“,"wγ ҉Jgp$ |֊7]:(D,| HO%- H]@D4S sh7c fN7/&kk~Ss|+% LK]B#g$H%IV'M|g+ pue{ *$+{Хu,6xRJt(8ls9^ p0~Gž\8ȅ3 VIHgSU5`!Qo_e\ASgVlF&&U̴9شJ]Z\"Rof#z]oîp:ŀ_X. Tb_kFxFvy{i{e)c0W)}hyܡi 9QO*7Y&51|KNpIƣ0E@Wgq8̋5eHxV@ D/UU{76;mMvZpŌ ܟHL \]O5P9dx {2`q]zp(,f} Eޏh2ch9J-*nE@Wt}t?Qf}y <~`slIL(JJ@o$|}(1P+)K@Xi@LXSuA~b&Ƃ,6 yO%[w:l[瑬#a! E3-?0G;J?zXN_s9 9o:l}8ÁYq{|@oB# mTr @V%9qXlujG uWX4]g?k 8Ύ.d-Ge6CGE1Zk  vwe: ıPb,{ڌ(y3PŧED"H<dzL8ocN}WJ #Umm}]lccMAc SΩpJVB8'Q9XYQkzkϝU♺[L$+* 0Ǧj̡!@n[Rqyׯ]w"q̶ ??j|]6g_#k V`+P9lGX\hC7({\@f0f^|sÙdLZ)ڹIm[|"4 k ӹ=Z@}>ja`PX|Iٜ^hCas'cwddb] ] -KKo5u.oJ]t4Q  x~dAQOU9B@p `9ی7.}rp3@0 nl-F[OWqf:OC m X<|)ͫ ~i\D|ɟ7Rooso*GouIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map21.png0000664000175000017500000000740212412501752021136 0ustar brunobrunoPNG  IHDR@@\9^,PLTE""".""88..Dk 7dž<>?, l(X3gW lWW l(WPWYYYY;WYYYY7> leYIkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZoZ WZZW@ W l(WP@W@kY kW @YZBwBwY"YJYY#Y lkH \:cdni\swerut\ut\knhclabm\zb_pm\m75pagt#Y lk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m75pagtk*EYBwgW lyBwBwTlI5TDII6lI5TIAI @AIAADxI@Y2YEE@@FI5X@0c= IDATx\Y( L cvՉ-@ bJѵ}_},4$E!NK%'`i/qtTXgM"I#Y_$*j)g0{QtC>fI7U0#- fQ7 ȑ*'GoFc t=XpU09܀ܴJ^H7`UyZC={?o-] AB W $XJ]WkLU,~@E.UO_PـKSiY,*0guQ7[ypRB;_\˺[ )Cb 1vUF &G?"`-  / -Yܵtl[#@;'zQH_WuC#ק۵Zx\r68j1ZtBj`2츴 IjlsJ~]of\] ׍ΠvV03Iȷ.0 di&6 j~ܬwl]vu$m_AO}o;- t?b4# <0'qus:r[NO~bꝐV)f1gõ+nc48yY azk%M؃v>ǯ$3oήG8aq&_I |ʜ4z=p(`oa ĮU6UUG?umN{-!NQ w`աc+D ٝC=CAp5kh.)F)+~x)>]JC3<_pݔoOAA*nۓEnӢ V+*OKmG n)U^7űc㿏S| nEo!m͘$*ßO]Uo JrΏMXsv&Fr tn7( Yz=*[\B|VUTY}.L yݽA4&eB؞n>Pfx@΃pNomꌂ^mkSx4(&ح@lemnK<#v^Ig͘m[C1oZx?yNtp,K*Ǚ5C2$tlmk2Yr iLF `gJC& =,a1d|~!\R;ʩs3G:Q5F0)Q3 r6hSț^{yj~Ajů/Hږ_8x9 6G1Zy*þ%y{ ?O*< a.Y@]g0u `/!B{[g6 &һ?2@k%.>7]-| oVhhu;z`ۦ/WJ/ vȟX3EsB yybX{J?#='ɽvl=|=ǽf<BشM mP<1oCy]> ->?84,M r7Cuj@]~ `)z)).Zա><8'Ϋ4 H㘝">Nzؙ1`ujSD3>M$LGa `+Gtb;/`C}NePm{5>=.R4HTx@`v +$jq7 m;$t-^F bЩ:Wq~_F4^ 0xR_ok ׿؉/W  vBg[,_t7(v^suSz8ݚkyˏXWV| p# ĽoOCϸCz)t { ltV4EK7yž7*Xo̥lA&~1~J_=㼏D~7*X_X/fVpvY~<†[7o8j# pLO ctc=gvS=*~\AJ:}Lۡ*D.)Fci 2VWXI쾃 bNEjwn0NeɑO5: _o@®5=Cz]]H~=zvƛ/ 0v#!A?U4KƖiYg0'> =7W9o_8o;'3q^nNI?_xus$Mh/Yl;4U77>_NA9=Ocp{`v.j9ܓZ'^~G19y[pt)T79Hɇ0/lGjDz3}l`&B4i  8|%o ӛHC AVCnvߝۢV(4?-:&boO 'e׶u/rQrϞ0h?4sƜ|n&'Pެ:6';"o8KyQӦvr}$wV6(Pdqߞrq7#˧Ծ[o{تG|(HM~NF 꽎aZN"68KNC<_c;R'P_|aۀDMo ?&;'p[8~PkjȆnFX{|vKn>sBY(IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map67.png0000664000175000017500000000475512412501752021160 0ustar brunobrunoPNG  IHDR@@\9^,PLTE3s ;COW+c7o+kn1wIDATx[ ۻͧ0InO[f0nz}\1MS~#/3_d7<^T [O Y2J* j ~;/?(M뤟 xq?~^cw{x/f1o ̀U.nz>߆Qz&;0!A҉2<;W|a+9 /dWZ(֢³CRl|a 2LqVZtxF?|2_g;=_ }Zkxlf`Z}/<WF O-'9-X!{*4x;K470|D !{I&hƎb(ߩq]| O#y"'/*ν}h|DԀZf] D̗N j䳺 >&{kG ,'xxԨXkqˡIr'<y_PnWMv[WLgCxQk;ו'>ʟgcxQkaU*/RP5*FfeӄY^pyy6/%\k2;KN<|(>ި0E8k $>=¼_8ԛMiBBF)'"'oNߑ͇>˹;-dӀpԼ߉|]wvaF? R*m;K!㌾ Yyd}Aoeong#[N{͇f-Tӝ;xx]8z_70V4`ݣ܃ilfÀ3 ߂Ke<c˫߳`Nc˫}#tF 8 j1|iDNxed1l/. U:%T# U|fY(_< $Ҟ@h,^X'2W޳;vBc]YY"AU7;x3! sC`q#+^z #,[g%J<+Px3; p fX]"KJU@>N9(/j:9|M*0*=ૃcL` 4`CimӅ?S˧X9gO_X""N16Λсi'ǡ/nbooCX]N߶p_%k\>qŠ4}x]RVS _ &X_?̖exi)-ڽІe;M5ZԀ.|kPq0i*ܗO HP7rZScM@6f5 Vij@%nWl6-F 톷'&LM>km=G"\+#oY#YwuuҭC_uN4GFzɇ޸*gg]#k8|>{k؁Yr\[?Մkz=< q}];GO9S?O5AsyXp8,=lWU,id#a}Kc[Ԡ{G!][yXXïQcy!f5HUK&EBVx|6sq3 G,$0P]fXV4ͅ;g{k۬ı ޱʨ'e 2bm*!ă8!0z3h%>f%z.މ{jF+0t,Nl soh `R;UltzI9̴ bTHI`dLjG`n*ђtĞ+ZSo?I89m(h3(,S(cW_3 y Oa:*$ %ꚚB{Gj58lւ{q2 f> I?uy~)y'XR~DICBF$A?8)nk0QB_~Fݱok?K^SZy Ma>OIʆQGVe!g+J⣟M}c{pp${-夣0x JBʎ?#V\!021q>o.p-`]K?Ԥ'q}ٴ 'K ã@;g,E c8UۊJ;As3]XuJW˭UΊ(0 +卮@IZ~wِ,SaH)vϻ$z`"hbVpe!4p[%G01L(,P1 ~B&\ 5 l a ]#NEƏҝЩo_[2,h?hN:[p+u!3tm\8H q$p)m*&B$N3*Ğq# JN)ѳ.PJv >jc۴`S\ʣu qX&i=8ꓒ},$0&Fj/Ywxvr77%0s"͋7OiwR7̆|!3 ʝQ BP@&>'vVz@gdެWAV-- X^p$S'@¤Z_eGTJ^BˊpG{cDl/ `˭T(K>Nol (4Jd`rK0x; z$@d:TVʼ¦kP% 9ZД<\&$tnC.;|-G馟M`ȥYy!r ޣc?%wZC"UL+U *^R֪ňO &EӒa鐨؊LJx;=s>CSC~fp"BiJL~Ochv G)gMiZ*pk:6y  E8`4kF\cWAFi]ُR7\dnB%r[Y\81gzXQfyR, 8y$}NByHlR 0TRϼ)Z8 .[W2Dm*ў 6j_pNZD+*> lظ} ]k׆ئ_3YϊK80A0*4F1DLFWln6SYfos7]~]mhEg[weᲉ7p4v(^h7mLMRs>yd &~l1%bA{sHt9͎1 RȎ1{_=}&dPqSQSD&Z%,6`feZG6^C|>VLM>'@$hAcyC Tl\7u:ٞm3I üuP :¦hgV"(2Df 8V\/CQ˷6RŹŶ3H3(CVdžm̊$N,(FG`Rm~^v f\y>[y-dsYxcnP#Ҧl@n0@Y'\ֶ`^\ ď|O=V, ;ʧxHan ._r6OB\'_رo/`ByYER3O<[!+zR,hS%[nf߂|'H8fܞ |:Ljl%.}L`= .i-q)l<#YUkIK:+8TN5lhaD0`"?&ɍӳSW`MI~qD- j\TҴIKD>^8U:O`R/G}7&+an[TξáM{^#oYYK;&`YࢬN D M(فf J&]w!᝚?i63rҭ$p>܇'A=^e8Ōck֖"0淠B[@vBߪHp[50eLpIS|ZU[(;5aB/^sL0tSiDVɼw" H€?u uIHCEKaT&`iJILȔ(iVZ{YWXa97!N˻aZ@Vb+2OR6tpSY D'ȵdWD9*lUϚƞYy@t.%Mze؏eZ^I_XF_ mQ׫sj5XVRE7 #vncG}Vw z[Z_$q?X))e&` }03qBpæ4<]Z\hT *o@QAEd/x\Qѧ|ݦ-kOCȋ Lb<<)W\K*םpyItµlDPq}';Мӟn'ʻU8.#+S YG+ @@ -P_ɕo";+ Lu:ݜKz!j>,uި|Ï֒~R'$-1# is6:%ZJ ?$&T0QUfqܡOרkX` _6~iݟU9ƄOGۿT-üg'KvWĖTuѰ`aq'UKY^cD7; #nƐN"IБ4M`Iy q R1!N8ɮD@s[]>Tmc1tFiS`s[ uz'̤X>FdĶ=F&8PmkL@_0KЁt@57QP!, ?8REکא#FPྻ.No[Ͻ!Ց=NSMP)W uNh&KfOZ\tՠijs`M]J;y^-^jev8B/S"O}P/=xHe^:zUb1ZYW3&a08Gh"ud8dO561/ڶ7'YM.sX\҅Q/ w|Awh &|XޔZ,f3l?^(iq]|]sU+@bUդ;gQi|}"wvzT(Q_F\|T>EGucyq)Ű{KGb_*aI&_Om9v Bnԭ |VM)q'[/R|Y pZ?UN'U ?jNDk Ʀsf<"hwv6N"iYT7`|_N-=G{Q.+~OV>u;/-n'2{e|pv|ߦ5ܔM߭Mčj;oCo2-Wi>Bh<^O6D‡ڌwo> j¸rشGcBqIz+ѡ?9o~G5܃WĝLDa8^vP~REO 7N?-X{H$BDI?1+s֟G x |? VJ&׌&_wwngR%9e3sN),?5 O77eAw`!*-ܣgg!A0W,=^:\J?<1i;R f ?yT;[S$O V?Ktr`ԸS 5)vQB{Nj>}8kFَu:XͼOoV3bؒ[{C5. ` VL*xziA_~ m?Jo_Ҋ?yCB[%d[7p,2T{/s V'ŌE<2wpPOxg#g˝~ܤnO+oP T0l_X[#X&KLbT/h<0#dHCpIWXAR83}LxS~;{֊F٠ $`_a3dOXVe&6U۝.!UsD 8#BwEEa{|=uV@{ϗ!?m/ ?]k ^3V~bc%sP2t$0kzoߑJDi3L\x 󿘶пVҾo2Y_Y?;yy'|fo|CEl{;;/g5>G%}Jo:Pׂ~$g'pX ɡ{˳Ѓt0+~ F3>kqxWoJD@U,|?J0Pgp1\.|,+& A"鮝_K\C<|qLIJ|B>L5C)#zv#<ݰ7{ῼPꕃGiqB׸ b@*']P#|-|P-U]ȕO<@ v?_GgcIoIwPŊƲχ~G $33Hc#K~05/=W+Df6 Jt~»qXTZ/Q: ëJ}#X_Ha#V/>$Άvv4r u MD?0YPowo@3SlUg,C&BV#h7/%uA)'S:TNjQ%›eGaTQxC~_lSNѩ :Q [|үJ={#XL<7IhԨdݐdDa5ٜK>c0(.xȑQВx_,I;H2#~SZ&iXnACi7~񅘈&hT;L&a @젓d97o57X=5<2C9Ro:A,R30L CY8ez\au3A<ϐ}:|2v᥁?q`GlxUэKW1>p _B1>ϣ#}zQ.0d8+^̎N%*]#yҗ<CIGq7f?{Ub"F5ىK{EMrG}<>x ˶Þ&܏Zƺ,yRG>XXX"n7,~+%|Ke C#{d3I}SN '<: 737p\806-\VBI?:'hؾ19r.93 o#QߝG~'|Ejh2D׿@anבJHȘSЗVhM5H\hgOv7s6KP1RyƧ߲K} vaw>=Ua_WoyD'xJ ב>0ԸLNt:YVG3|9@1x<ԑt F #I)Ϟ,?ӿoG=+.|t D9` "] ef/.gXkol"Y3dJT&}6/O_Dҽ%.x6y&\NƙFL- D8ҩ vՊ22܌G̼0?Hh(v]xv?3fϽ%} 鼣v½? ^=k?u >dP_a~< ٟ$gG1s :@3~2rrL(: 4Eg<cu'Ȃۙ>}i~gf2_]M5FFSrt;H &3£?"{lK~x_sZ%[g-= w Cb:Ȝ2qVN)lXar:+[j) ݈E;_ђFO%0o!ȹ~a^gB < {ch1C'ָ؞zPCBWHx XXq3NL?%Yk@SiuOJc?%t { kaGkfM61s9jJ8(g<{U<^ GW<'Z$:.?%w[?eA՜0'lW̖CA-&yNiǭlY-,9pz7 gT @Wik'O:!YenUJp 5>Srm_[QzRj;b Ѱ ,E_[=$z.?>+A7yK F]y23P5M'_^l=`}?ϖ%v?^>'~ Ok.GXh"'BD)&QL+;s'uFQS?£=*TWOYo|Hr$Eeז~5Os򈉇9?2؏N/=:{xaxW{Mcت%WϪYHu6ԜXE/?7]WΆx4Y5B缾cu2d&>OɏIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/Makefile.am0000664000175000017500000000211012412501752021533 0ustar brunobrunoNULL = pkgdatadir = $(datadir)/tecnoballz/textures dist_pkgdata_DATA = \ map01.png \ map02.png \ map03.png \ map04.png \ map05.png \ map06.png \ map07.png \ map08.png \ map09.png \ map10.png \ map11.png \ map12.png \ map13.png \ map14.png \ map15.png \ map16.png \ map17.png \ map18.png \ map19.png \ map20.png \ map21.png \ map22.png \ map23.png \ map24.png \ map25.png \ map26.png \ map27.png \ map28.png \ map29.png \ map30.png \ map31.png \ map32.png \ map33.png \ map34.png \ map35.png \ map36.png \ map37.png \ map38.png \ map39.png \ map40.png \ map41.png \ map42.png \ map43.png \ map44.png \ map45.png \ map46.png \ map47.png \ map48.png \ map49.png \ map50.png \ map51.png \ map52.png \ map53.png \ map54.png \ map55.png \ map56.png \ map57.png \ map58.png \ map59.png \ map60.png \ map61.png \ map62.png \ map63.png \ map64.png \ map65.png \ map66.png \ map67.png \ map68.png \ map69.png \ map70.png \ map71.png \ map72.png \ map73.png \ map74.png \ map75.png \ map76.png \ map77.png \ map78.png \ $(NULL) tecnoballz-0.93.1/src/TecnoballZ/textures/map19.png0000664000175000017500000001107412412501752021145 0ustar brunobrunoPNG  IHDR@@\9^,PLTE)))9 1)19 Dk ?R<>/ TX(X3W,W TXW,W TX(WPWZ,Z*Z*Z*;WZ*Z*Z*Z*7> TXeZ*IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ+8oZ+ WZ+8Z+W@ W TX(WP@W@kZ*kW @Z,Z+BwBwZ*"Z,JZ,Z*#Z* TXkH \:cdni\swerut\ut\knhclabm\zb_pm\m56pagt#Z* TXk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m56pagtk*!9EZSBwW,W TXyBwBwTlI5TDII6lI5TIAI @AIAADxI@Z2ZEE@@FI5X@0MAIDATx\ܨ{O|m}$9ɹRMB Oy^s-?7> yw/T꿕tߔw"/(e}SW.3u>&hC3Id 6~>{{^^4=o+sE~TF_~y;ups#<$ ɟ]]'N!gO#vpB|Ӽu.by;Q@gލw?M?5$֯Ƈ {ԔbNS{8#O|̝; .ZKH B9QOv+LɄ}F丹§~ү&r ؆SL<1mvN.o>B,aTl #v;2 QN5Z># Sa 7߀Sw͵݀/xq~]4@Ϛm8Qu'hkUNEm\Ml Zn~wfd\]S`K;owxN;bS}sq 64֐yT@).`ӝ7~kO&~xЍG{0:[٩<}Fҗze͉k(&JP߷hu jm>TZFZ]OL[kbI`^d!D~]{7.l߃! A]Xpg |l h.(@L?zy| _#v\ xO/H +5n `OqmYy5}q4]A?q;1ʩ=[} uѿZcxx`]tzM5>fЂȷyFix#7&NQru=ׯ:-ۈ, 3WS@٨hCWloDh-?ax@e&G =g9=6v ~7:#}MGe0iwyV57 ΧɆ#/.CA}3Bjݸx=]}+^ fћ|F6 obx!Na)xfr6>^n⫓B#{J< yxVb,ђs#e{m)Svk3ǩ SFy C r-xk/V;ˇ-|INB6CG<8Sx\oXttbB"'j9'q1l`3#:%Qg<7䩉|:(~>0(^O;?,K%uKcLNtƅCj8ox`ԙg,o4*+mqS-+DNSȀ<;Ѭ8>bx}3+ވ_A>o~/v_ aD?'iހ<-m K㍏MCN>Ӣ 0Rˆjgx8m?!eyTdJئĬOp_X|}.~.z{)/_3&Em7p>dg")0@:9kF[7;Oshmԭb2ZU H@p$!99pt5דĺzzX@OO6国$  H@::Z_@ X:*LN7h |+jթZ X5 ]}*JX6$((.@y(@g\k0`bހJ>6U=N`l${FO7T2kI@[!RXpZ2@c!TtmO@$  H@3jS355p+f-i-MQb@T:zQ*ozn 0~ 7 x0qpc' `.5IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map58.png0000664000175000017500000001753012412501752021153 0ustar brunobrunoPNG  IHDR@@\9^,PLTEs>h7F|>s7h)FW)L>I>L))Eȃ9%-)14#"%0>)6Eȃ9%-)14#"%0)> .Eȃ9%-)14#"%0))*V"]JJHQNAVL ]L"HLMEAQNV"]@EAN1 OU>2$>JKNPHK)~%G#VIDATxڅ 24Mg=߾̴(`lY6ye13|}̈-{>Y_~_{ιbF^^Ybuu4}. ]eu΂0H}G:\ocAsԝuofj׵Fm\ȫe\G(h$p܋Q[[spc o5 cdZ4]/׵nb1< p@j/C?5ך;:: c S@ך\(5k .5QM׻gp!GCOȚdxe8ML.L^o ź[eX՛ @u`Ty@2nRC9X,2 *M\P8@&iXe4nŝcN>XY 4ZI9@&|Mޚ5p0e۶Э<_Gq%艒y:Dت|Sv{^+6)KjA2k2'H Ԛյ@Cu)_ YKpٕK&C.9=.>> Y! HF!Ch |}Nl-bd+BZmzI+>?A&HOoI 'Hi? /k뒏\PE#|~y',`Dq,`]:OD ֢1jaƈkd@۳Pd $.ro2k ' hY1lWdW_  F WbAF(xkp-HxMPb5{v!:`))C%St~U$W و@ $# @WH\u3 Y˗ojrA EpXBȄCJz.5ngM`?+XvaeAJydGAH{l= RAT~@yA6˵Ap7-+r S3 Sf|PZOwO-Gv:za&J_f% ؅X-0;&6^S1h1@:F%@걒}34Is[ñGeT~ṰDj>YCCIg') ^#W8^ P0"pXuITÞNY.Hr0܏9{7ECggCd'\KsR100Ȣ r5V_Lqi'CVlM rtQ(\E˙A 2v*/YN1HcN5𻈴.9*Hn&$hZRERn$k;n/zʤ9% tdæ&"j% TtgY8zqnM5m VzH sIn5ā4q-~9OP2H "ﯟi '{0ğΛW>s%1F24a\WȽINiZ qe#ί8uaDa@#ND 2l(',#6MaeD>=VK9jgJH4!Xg𰬴;䪟}>M:^Ȃ]o,@Q5 <ՐiYQH]Kב6rJ5;_h'S]T@^eS(E_q 5H(OO+Vteb"#{S`HbL˜mye|ƋRivVCTYq. ӕl^NL&Ğ&2"X8&j֥&f gd,#'5V $d"%h \-i-6HSg+s5^MyS^}{\*F:Azd>@ %mwh_Bh0rZЩ~lm\V~xi2q@.Ұr檲3y6CQh;Ľ]my$V{-A7nX%ec->݇bjR)ޤfL>ƮQ5st^:H\/*ҭ@i&!Mh0_uȾz;P(/ds?+|Kq*Y ؾug,mT A|.B. !MWP=85K.A H_ NhOcqJW36gIfn“[|cT9iux=oZܮ񛱕JK V[p W\q.$9Ĺ",^ ~)7}'lX pԬH 'vU! &,m[.)ktۭS Tc)u]kZQ5gh BRz='f˵F4]1nr!UQj%DaAS/h3IZd X @h'=?6d9Kd'5'tPdFE?A˧H/ ؙHYEqְ3\8jNHvfiZ'] ;-ѓڌ`RzڂD^aMqەd3A|@au r1wdW( VM  mN5rBh,J~%8qI,eag,4{\OL 8:@[ڏKy"NwǡtN dެ HYFu.Y~(4RdI# ,i]uLqÝ#t yr擶V8HA6\YZ_V@Bj n89j8H.gU샻j5#*<.\ EZpyd8r" _S:Y}hwwHw3 ̣mY2\\^`Q}#:c+V*#>9lP ݭne}̨l$e{H"˾;yW:J4S.a?9H='}pw95Lp>{U(6T<D } r.(wbT[3 d+ VT^ rS\8ongOj3OA:i }@VmTzh^zk*VUʽmӟ-i)+iDrVNֳB"ga$cX™<a !AV5gtoE_a9 yU^ze'kYN-E5vݪ:9I5_Y>IikHvyj"W>ÝRqk.Y`v& 'rLYͯ*JMjݹ8^7%G :sIA2ljowu{&^WwmLn~V0E#Q`v՚=e_(' v }^NnF-LO1oPjaK˿SRuW8Er<|qPݵ¶G)SfWfJ6 EQ 4~@r[A%< Oysm#)IgYqnx$+/|HW%tHjIo"9<}$E'Z:wʴSh퍭zi\֗[tL .g,^G^-En 0˴Xl놱Rͯ%+d[ ³-t_QӴFVMQY9^kmť?@ڹr }swHRTV($Cȧ6NfO6iw(F)Ts'%r݇5-Y_ wu8}X6PlK ;!@rGlqMZFu%0|v7qN3:]*6Mi>ڡU؄֟U3Ts~6$ Li#|hdS GC~ ; O#;.AYPdv_-.W̽DwVܻjΰb{ʗ$#ӗX*?tݑ V\'s,3onh#V co%qڢ,qD1Uunj[Z; 3$NB9;{g)\dg TO4*BNo˃, G~,AZ<{z.ӞtgXm[.u7~\Q<-g9vI##7rK5Z3\L*?WsS)y* Er;\ ɸΏ'JN=F);\#}hbjӻG,b`f$}z wUHn𞤶/d[>^"+*ͭ@֎/Bpj0@v=5~TթnÏg6h¼vek \~cwȸe=I5>_f{4`"Z r g9+Yn;N|@zg(lq>!DY/]hU\r79G*J|W9Kkɷk5d8q)Rpt%U akfjA]Fc;N*@B" yGPT~9zŽSU<-D*nl#c:H6ޚS{`C{4pȆAT*9$OQVO$'!yl~#@Eb:uKzeEo [nJP闸ŖVML{QڕXIKVX,QT IDAThޅZ͚,-h>> ={Op/N̄)-s(<ĺc:oֽj~>_{[[ڮh긺{/j^=X=t!)qi ¸_"fmU~C7DVE LCRAa|lc~M;@:xUV vCJA>}~ ?,f㕂`1>>-m v^BsKoƭP,$핯+IWy6˿DPp:i ¤Xn`/5_^ >pam}VP1! o],c M}6YIL1 ab+E ģq3C?:wmAt\W%CY t!-pG>Umx|UAY 'Fs WQ?g>OKD^ufe"j|cC۰ pS KXTWpt`X7(}g8V_l0$zRN·U5[HU "FV_: 9 ac:ya yD N5HF"4ɕl,킡UߥT^Zh k< `B^QNf8ٕ!4uWbW)\V`O @wԅ4<К !$wm¥!5eNگrǺXz ,7:0;ѹ]^э!gb D9u6˶ @CP ha%꒫5!^ nWFsJi7{YϬƗMG>(|} p:|g칅) &d2-zBC-s )xzs GF9d%Dq4YA%k5q,A_/s %b4|P/~x@aN~ؤ!`0{?fՠfN @b<#;ݍ>AЈWn>I:YLpT>^{,@RG>F>iYtOyNjr&(1 7lWVvM (Cjc`H(wlBpM&)A4n-eî@zI4&+$Θ䳓H-G$g%yE:?@r3ߦ8j)V"PdT"aXz1kpD͘/d>xb@ ;ATpn̵Ay&]ix \+ot0popendjzg^1Lm`$9f3=KT%xMqkty惈t7u!{x놆D cmF^rmк3)B?(? >l3yd3q?R&KX lS ƃ늣n e@'B-A_ZڈZ j D y-Sh'Y Z /F2`hs^p+A4^GII-`?[$-0 FMȏ~.x͍@M}!F|i!qGOǵLWu#'O>IJsV<uSu1s&oJ/mw;b Ay*U!DKqk&k˻yZ2sH> ]t/ kFyBPjX5T__Sa &Or},F 1x1s_\yL:ȅ@(d`#Zwyq c?_ ^# ;jtB}x ~Ayӳ< ȜiQQt QH{"ah X+ 0ܻaVAy3ZwL.䱨ŵSEے r^T  X"i3NłKwoN?ogD䴕 +A~;呉1É t_3{ qO.FQw. ?o_vQ 4{y 9ǽ' w v] VsZ7L.4IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map71.png0000664000175000017500000001061112412501752021137 0ustar brunobrunoPNG  IHDR@@\9^,PLTE)>+E-S~X WP ?(WPPWPYYYY;WPYYYY7> ?eYIkFE@t%kTkk@@LFEE@kT kTkNOkBTPLkTkTkjOk^TPLkTkk>BwkTkkTkT`X WPX,`X WP@ WP ?(WPP@WP@kYkWP @YXBwBwY"YJYY#Y ?kP \:cdni\sweruc\uevnm\t04pxcpJYY#Y ?k kTE@\:cdni\sweruc\uevnm\t04pxcpk k(k ]EXBwWP,WP ?X WP ?(WPPWPyBwBwTkT\*F 8YkEbopk|FF 8kTFDxopDݽFkkT,iDIDATxŜ*| l}?:M]J-uEu)>oNLKSЊW\ךVX/79W3 P _d7TSXwvߪg^{`y?>V/][SytPzx4HP㱥[tZ{d0΍qf7z~Ƌ@s$xKȝ?7Y[2js NlzsU.#3O 姕"[aPKuٟE SmRzq&@sGw-o谜P{O3#<Ώ5= ɾƲ.^:Gվv `CЇ.GC7C*,P0bJI*=?_<,DUvw ?[lDcb#+UGڇC~Bf(63 7^:>( Dfltś+:b8s#&#[1{rPs6s5z:_8V |Rj$aQ {Pm+* #K<\U Q'5# Q#~'Ei[229Ls+EKlg.2 HpS܇LV%2M"@S] Rnrr kV2jeتnNO%iIOu`Jn7F@/Y_y:zu wyrҋ%D((&mOY@I @)hUҩ!hT0ӪCP Cs?~4|Zz |r;(4H껩+@T-?VAuSX(lQW$;@:e`^S}p\+%nmwGu.II/6 & M]V_zV@=;ױ|[MX]7BSΛȡ,8h4@\I p_E~g"[f.Ec '0 Xk:JL k-`d/PgU`Z:bAڟpz>Qx(m[iB?hvrNd|,ddRZLNFp{3PxU4&4c]I8 Ex+5Ͱn~\c53gh+$O QZ(\ZShZ.w)ZX*k G~13 <- rjKٍHkSV=oe"_ܴ۶tsr`3>y$I6O[?pKuY"@0 ]~-;@qw_Ljn?xk+;4߁{~sWZ, w׀?TWާ3C տғ{r4? 3؛ostz0Z=sDn49|R7ܥ>Đ"-X2t}%>a%1Yվ&g0-nk@*P'>:(W- c$°E!B_$p$SeRN€Q| 4Ȕt _=o:,Y\ NwDw~ ࣩ'ٜu5ʳٛ8'*x@Q!}f*cQ_A7!O}4nQ)&yvf KW ҷMVU]$8ڞ`lj04r:e`;Sv4R%iNN}©%޳(gJfȅXFƷiIr8V|^IP*ȟULIֲ]*2H9kMQ*{NlϹFJxܬK p.I\5afis^V{F~'3FnybjöHvq)@tO8g< FQ-vlvLR8M&VylT:i7ǝE i*Z'5aMcm)gN9L4cѸN3ӤYx\`11+@gĶ `:gjw_59#7-3 7 'ݤ~Dq?9-h"t'+5 > RAAknGR l5f,bjU~Ε5znoX|`>A0Ҳ+@++6g,pq LKɒmnu]du׷|g]δN&sX"b~oZN }qٴ9 Fh䏦4j4$C l?΢aK2W?A6G$[6P3ݺo` BΡd~ٻb+qx۬aTm䖟9 SiWsߟ $CԶW]UDoɛ[>0SL|b z)9Dڡsק xٛDzl3M- 9GtP~ o9/| H(X3W,W HW,W H(WPWZWxZaZaZa;WZaZaZaZa7> HeZaIkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZboZa WZbZaW@ W H(WP@W@kZa+kW @ZWxZaBwBwZa"ZWxJZWxZa#Za HkH \:cdni\swerut\ut\knhclabm\zb_pm\m17pagt#Za Hk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m17pagtk*?n`EZfdBwW,W HyBwBwTlI5TDII6lI5TIAI @AIAADxI@Z2ZEE@@FI5X@0K !IDATx\[*4≀ _{t,Q돜wS%Ÿ6k[|Y^ɹ5ki6|WP?O)ֶh8J7C7@=^/mְO<:6ăC7@5V $! | }+@?|lŘ⯷e\z8նщ?w$>Gp5)h't2B܌os{y-d.WA{I1I]@77W?KIp§5^oN0xCROcB &-] : }+(wpS`j7zq./"?})W|>l#61Q㱏ԳWx>v=G["᱿c0o]x xf ZOLɬdmM=;Mc3u~P7Pfg9q̷ؙYvz}<ˏ?C*\aRk8]&Pj`;.=mo3> 6|pF9 d,S |`LW<س $ 0;}x".^w<'G^Wu|'ԴqXqZ1h &xMx9uDW>. n lC\Д|׿YGxQFKwxU< ȗ'u(|2Oxɮ'qޖU5g!AOJo{.E&?]ޒXğ~Y !TTyb$^_ ¾/Y8C5x9~z/KrKD+.j@339Ԏ$p)SaCN%csI`ۡs( uCdȨ9v &a}1%őeA#tyW=dq( Ft '@f}O.+N8=x=>gz0fbEg܍X=S1wgnfGvȽ( 071>S/bcd]q=WMǍ]e2qQ  y+}`chgFfN" ڞkَY^lԣ{c$ʊDj;&8?\z5p`qjễZO%}iAD`Ɗ߽9%Vwa[Cٍ3CP?_ =9$ϢɊfo𓪃N Xs^6/,6jG&4j ݊fF[ޝtWaDYbڍYGuCL޾!7H|V+&Ym9x)RN+ߌ0bkwsO찿ʍ?[П?mfm-56}  _ ެ<#:_d,[#'IϿaC{v l%QD;OxbmWfO+yM_~66h"9c%X6|#'n?w>xBr ;з@ <~E'jw&|wꄙ_MFl| g<+ dϢ:&?j8~Kc.~eaп}Ǘ`/}3߾J>0#)C<O%7*_1hIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map06.png0000664000175000017500000000537112412501752021144 0ustar brunobrunoPNG  IHDR@@\9^,PLTEYY79F>B>$,.-60#N$(PL/mMNvj08f4wO{/xeֱ%O:w2oUW/ɩL̰8=з ۰JkY~qҹ˭׋Aɉ{! W\h%(Rо`];+os=+e F]~A"x> h)V=I8IC$潍-BO/)yMLԣK[GI燲%4-⎻Cx&[}?5J0mlau*opoD%<$R#p> ȿ0༿I.ϣk_:>~>D͔z;mo> Уi~&c~sarW;my]nyb>?b_IC_oG[=u IzŜ *)G z`t?Or!S+!|~BPI!`dV#7|~?#?TR~^.DOLMdh.;߯Oj9k"N GCWj?~}zupr4IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map31.png0000664000175000017500000000556612412501752021150 0ustar brunobrunoPNG  IHDR@@\9^,PLTE3s ;COW+c7o+kn1w1IDATx\ٖ: do4=!%6Xii['z~/,:~~>uϯ('/K?惡߉~I_6~=S6dg|ms?_g|u _㼲Y|@g>H&3*,ޮY p6$mX>k_!q|7NTF#,1SWyyta@@󥴤#㵏:|t QhEaEŒt5ڤ ߯u۶u=n(,'0Ӈo 3).EU|6TK!@#` ?tͧ )]GJ ;=O9o\j}W)V<0|tv]ˈ='Y>].<EooTϬFa!P/xɴ@?Ȣb }ya=CQ%ON>>j@G"sx|Ɉ^g6%?sq[D  T=e .QC`œBdOOf ,y/=%2c@2 ?OpwT~lVU0G@nT~C9Ōn:QacJ>:J;("ub,F'{14o7#%qxFa-lD*G):aNʗDUFAzA7Ʈښ^m.rH |3^r&}{uYd?u-CslxMfP (~7A'nc=]ɯ=6qڊ v0wB8 gQنwgSIWP~iͥ;X]*$u S$ÑמI?2@.;q3]D̂e֟;e㧍qnQH`[lAF^,_T pHiEO[Y Cmdpu%D#R"mnLl~6 ~`}Pd Rg۬!^{hGQoHQ|%ҤdG=(sCioR}DjwVGuoHC%xpoE0 ؑ3b=7.} F ycE2|y`DJi!X׸?ERo n -b3~ëM~W?*YBv~VzAq"7 rM#YU ?_IwkvE/* 9Yy!ؕO͋LO[@B,26}jSv_HЌjwZ໣#kQ8~5}xj)տ}?4:?y`#Kh<X_Qi!P6Koduo g/희hjFQ}YރOS92~#5}Y5_^E;|'嗂(,)=?ۣO<@{Є{[˟\IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map09.png0000664000175000017500000001165412412501752021150 0ustar brunobrunoPNG  IHDR@@ɳ-PLTEJB1ZJ91!kRBB1)[OIDATh޽ZM۶_(kPfqM2p̵55ɫ,^][FG>LcP101BeGyygQۑ_q8RMncif *|4ۨO/7WSn/y z?U:g~֭Z5J-9c˿?feRGQ&+-G~+7?n| {dL(_O, kmof! wyjA|>vJ7r0GSX Fn|LJu KU+nxDS_3Og)Zج;JrBX&iږy*RVYn髺qh2O9D+l8uG+P1´J QӋ->>Hc4: ƽ;(c)W(._ؿ[=|x@rv%IraA g%i,6&zPiqa_g2kWb,"OQ-v֋tb#'8!G9ni )cMC(NǬa\f}YE K]6ktd~V9T~ϐةEJZLS)Wf`x zT;> E^u܎xNb/*WcJƸ.)'2ƈԁ^U?uYoi{;Ï#``^*zŕ^n41TZ9"LLbAچ C~}o@~XFފ TD5Qynڦ༽[[61i&ׯ7u  fΈAÒ`xB䎈jx,HNX懾% QG~KTvnp>lȜ^oUdǏc;YaY1 &k!"#|Q$~^J3%0qo׵\C^ȸlj^BDW ayC\f)Q+X4{q=#6ߜVtF7&[[ДM Mx*>4ͼ ?f#sI.KQ K24,5GETM`$66%*gd(2_nVq5kY]0r)d3Ͳخmp¥qn$?բd1g_f+h./rJe:,Tܹ"U}F?G[Vnm j #B~ ?"|,?Կg QGpQdp\f+ɂɈRp]f5䃋T$)150G}p `IVfr烛=v% '^ 1_gWozOH[uO ̭S); E] .7|vPjeBwwxl FȚıfؔwn.ᯍPnj%rw{nE85lhE'Ȃ,@]za6jz0FŒ-f*_0 橏8aTӇ؁zVȱG;bIuC½6T"7&I (%n{5pݲ/@3l"(^D5HYt g=P*U_P,=p("Yfz~VE69R zz?X$7'W/&[39PK(Nm8C`q :O=3C2ַqզpwqL f:*4@j=FqI3Sz$E[D9HҟGa%"5ܴ:?b; )$'"Գ?"j6ш;˞ ',낻`$x-(벴C)~ *cooBE丫?9v_)w$H!&YqӘ2fG7RIh&CcXʄ0X5?.|GK1-̛i=iJM/Ku?mܴXxvP0'ru8?df)'Ynco,>r 0_4cD7] da6e q}^Y?ME* <`.-q{eVb|>}3\b*@ҟ-2(wqf6#nLZ$|}6Y*uވ#!وW8vAb'2G4*H~EW݂Dp9֞Q8.vQKN_XӤ|sHSUQsz&A6˗7F)&أļ'UԗJslƣEIGkq ŸТ}T^6%2d}e|m~/iB'I#˯0NB$ JܑyA)>s|Խ=GĂ0s-ȗ/hgu#-`K/tj̺!pǭ2fp@ mAfcЀ$mAmq&a( 9Q5wAvȺ]N_ XΩ/cY҉{C.oA EB@x='6f\MnV,Xj{ۙhq.~܋|͐r@֥ g9 9)[3336KC܍ Z9Sj(眧Sr+27j/C 422ziws :t{o+3/ټ)4 ajЁ?@┤8T#/DuqWLzllE/Q7魵# "D9Mi?]"ؗgAi \Kǹ5<"Qre&C7x$^<`#*f_MsSxGyAJ% x|[imњH&et|oO G@@Wp|pi߸pUYŲԯ}ltm},uG(@-ȇi.R;Rduˌ{+*C}CȋZ+!hw}iRz΍cS\Dś|Rޞ?hA~t?) ł.dr28͸W"ꃜs R^#l/rxAProz)S "` J_$`Au#ؐgVcz| %̯rtC=}2aV+1t9yن\yZj CE6ŇQ+`nX>/'! ѫl |qS{;Z~% Z5$'LD[g?S>?zZQ"-M`T9Rz.&L-GXР@G_nzG}<1=+~|0N߾7/eտ?CҶmIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map56.png0000664000175000017500000001214212412501752021143 0ustar brunobrunoPNG  IHDR@@\9^,PLTE)A)0 )0(1Z)9@+>xx8>`ߊ>@*@@@ߦK>@ߦ@@@ G 6px]@YpߵSS-Pl5SNAS,SpzA(8\AS--PSNS|S_S@+P@+>P0>xx8>`P|>PS@zS,ߥ>0Pߦ,@*@+::@߯2@*߯Z@*A@3@AAxSD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[3@AAxSS|-PD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[SP:p-?|:><>x@+>xx8>`0ߎ:ߎ:ߏdST: .H@S-rAXS ..HSN.,ԈX,.S< SN 1OIDATx\ Mk@o6#5gudLW[ H]%]DJe~F{z1 7g ‹9L,+Ȓ 2~Ux__> p,9OԟWY!.@6b8tEşaxg1Gm [C(^|¿ӠLNyOgTto6.; !_kH2evʸ@ Hq-Aҟ^ Мw!4~)> .>.e$#ihSŐh 8ހ*bcAG4= |fRHn1 eU~ߩ\#ϕ@o=:YH{LW]wЌyX1\c1h/G+*kQՅj[l*jL/wT?mWc?qN6?03@2Б#y'}O<Ȯ*ZN:1fY쥓/d֑3'M0jǚpVݵv.O{Ӈ}_Mb` r7)_dO~ņ/GGzn9iȯMsb&;؅E(H~ cuNaTG uU:b N3 &k&pSG|cA9wO|=#`Z8hօ+U+RH6'ZN0f.j=Y[%V{ӳ)7&O/ZLN˼}ſI-(Ȉs%OfBUfxMmlnx{ f` 8p;ߺ1~C6=Vť1 U%I??/ze7TZ:{3~'_;g4CtAI)mRFaMŪ~ɝ n2''| _!~3c/~ŇM$r?d/ȟpA:,6e$77XXդ WsaeӍQgF#F e;Nh{*oӘ sj9o9(~m|?/yo Quf?LRk%D%3UXt„?LCd |_9Cn:GK{y#gדx<ι7rKPq܌t'UAw Γs? ï=_mXH֏C "(yHwňVTg#<8sU ;2oXGO´TYG[,9 g-oܜHbEúb[Hg#sL T l15ws ܎6IOqSXѸX&qJ1p4?h[vAF={A) dʀ *<5nP "}O|zּM w:2<QI:uD1uZ"IPRNO 8o%(zpqDRÜ~;h[KijddԱpA'7~0u/ug~_Noy,@{/A@2M^xXpF`?Ӕ ? 5zne7k l]aAQ7O0>oM~Kx# c>H '{~ſ3l?ùpk/'vg Q2#/JdUϗ>pdʋ/[ TH{ }~ F{bo<\PתYȊ-Mj:'Y`;@rta/W0G)s3S.DS~e>0FL iN{͂y~j7~ڏR} V,e0xR#vMyV('6x>c˗rT +x2%I@cU sڧ _ׯstǚm%dȧF}ԿB;/>i,GEԐ%KIo4i8HkOwȝIQhe+~A<2a<_xRA2K,UnGWN<Xœ%rV9b!Q֝;>!͙lWԆTCTg߼mV!\מ 쾵 e4o/?Hx^*3|}CݞF29y㵈 ?% Pxn??{V9>xf{}& uszW~7.}ΪRu|GEw?lH޽;-s_yY?҈lFK~xec?zVP@GI+oEi|e~/i E~_{{\biQ f%ǯ%_nfQ! 5hkSy'{d)8@6 fjVa"-z: )iEd..Q.k'Uƛ>(U/8T%+`.xLgLk"^%4+M>䘲93DϿbkEMtjM1)%MɲcݩC =$LEQd*u[4 n@Ok D5Iݪ=lr)J*tE3OiXVD Tfbk|.7Ȁ.Ӛ flѿRcC?:oEljFDǧ>:14 MQW*dR R7Ax&XT3Oym z\xL"-G~7D¬Fq#č~{%:,@^ũ%G/#r #XϦOhDJ&uD Z"VfI %d,SD>H"kD ",m3qVp~.,0vE02s)A}kKX/j* 7 zO%VTZ7T TL܄&Z*`ċSbuD`-(jPlª"@r*ND]˷l&w;Apmē/ҍx LPtmLw`ʪH AeIjޝ)ٹ/@ \U"Zi,\%;Ķ*r(KL)37?ʆ5I†7 W|K!%f0QQ7?FFB!~{(GYgq#$_MQW3x`gc?{ţ,j# [E7Jk` 4IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map38.png0000664000175000017500000000554512412501752021154 0ustar brunobrunoPNG  IHDR@@\9^,PLTE+""  5" Dk ?:<>/ F(X3Z|W FW,W F(WPWZg|Z)Z)Z);WZ)Z)Z)Z)7> FeZ)IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZxoZX WZxZXW@ W F(WP@W@kZ)kW @Zg|Z\BwBwZ)"Zg|JZg|Z)#Z) FkH \:cdni\swerut\ut\knhclabm\zb_pm\m36pagt#Z) Fk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m36pagtk*EZBwZ|W FyBwBwTlI5TDII6lI5TIAI @AIAADxI@ZT2ZTEE@@FI5X@0N_ IDATx뒤(ja$:۱bH!jNDu]=&r/A9 mw`VחKuCkwZ<"%fN[[{엔$qhknS6UeI:ڏ=[,!Pi/lq7 8oq >mGx>Ano /u"[G :g/ӾB{s!*nlQJ/PGuΞuniܳ?mj{#Q"NNًO}i/-{Yq*y}># qjv==xOY:hcssJi#{9|wS*~r8Ok~cc{ɫ4;NxǞ{> 5ec/Kȵ?_mwcZ@)>7j^j ;Ǿq G<0]u" -`vA¾ 8GcQl {ٛ<4.yo`i8Vi?xa!;ew\p_9|W\[=C\Ɏ{i㈿B\zWK{Rϣ }͌!vy̞"z!1i.1?mu|ۡ3?KF>@ |'27~GW=R"95~i~] =mqY2nFGI9;zXq'-]=2*&MX_o?ʍ3:! &U 3jb<9Y*o|sƈN@A=Q.[##녆)msIn\|ZC9n9c=}IxkO/KY.HWW~Л]s<YpOuY G\6HM_}ATˆN"^C;jޢ8+c G֙sHoPVX>9v;?}#|.`X[\~]>YI v6y.4_"=񜷄8kEmz^~Ƀ<f yqXG{9[A=Np`h}yr>qu%ǹo\v(x:Aˁ# ut?@?c׮Ps/ut.k.?}%u4P i]y+̇~x+o`W4uut9quޚCs_ˣP1N5)FUHC~B㥱6G~ S*3zt}=U񤓿'v*hϙV:־Y wke]J':J_8N}`tW+o N,y@tl{k*o}u[ߣ kyU ۟1Jm//1my'_~eTo{ 䠙z_lBN;IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map10.png0000664000175000017500000000432612412501752021136 0ustar brunobrunoPNG  IHDR@@\9^,PLTE1#=#'I')U(*a+(m1)y9)պAIDATxv09@Hh1Ʈ}Փ _ 9낽>cǔ/yG0is!b ߌGhnLQO[=Bw` dS1Aw`#bF(-GP#h;p\f}uy?+L'HU঎#J,Y]ɼkȯvf3lVy7?@J^$1r^˂tP悟7+X_ʏ<7 P9c;6?g noN@$ʯUO#~GgB7y@Q04DZ"3tAX)>%O.?'6wt`IAb~|&6A;' SģWEwtÊ_~|٩Y;0_&<89pJ}bw:UD݄=T_tXj}+c ;P~݄1GW\y;g_g~y#;k&<ySl2@}7Sd~ Gu'2` Kt0W 8Yr~ /gJ&!87%?i?Eח)87!?)%?Q9~C# g`zB4%9?i`_=±=aJ D~X0D A֏O<*G; Uiҏ]:!Ƃ4$ [;XqLψ ժ 3,.(\<ߢF'),3r^PmL(M :* ]'e.(iw]}?(/=? f?!/ vo5AOޘP=kj1]A v~ EP6&[;pDo#]~dDς_/滭m 6o#G~dVǜΡ?wY gWI1_ZMz~%W|HRĜlO_hU}>oռDGrK~7/f~QUگ?>o&_Y{/O%k"~~ V p~o>?,?U9'ukՎIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map33.png0000664000175000017500000001246512412501752021146 0ustar brunobrunoPNG  IHDR@@\9^,PLTE>44I4>4'S>I{tN{t7H{tt{t|ܪ~~~^{t~~~~,Z*b7~n иjidEx  ddq jiidx2xssfxtqxxsxtqxٍb5fxxx/~>{t~~{td>{t7H{ttd{td~ ׍{t>d 9|ܪ~ff~A|ܪo|ܪ ~C~ 7t]TWo|ܪ ~C~ 7xid]TW H 6]Ⱥi~9f{t`{t7{tN{t7H{tt{tffxxK'j [~i ǒ''jj [''xjhǒ'hj'x'XgIDATxڽ\8 D/^%'ofUDB: k& q<޷~e﷾<xY㥍!D1^bJg/r/ }=ݎ'I_M0`ގtiPI@Ī3g9c>w: l8_m J` 8@sr堤sl+4DpG" `Ig"BOn0EL8h8=,Ag,Ʊna,V0U4XЎ80yLX/:7Kƒ\?*f$_Mc+4BCc)t V%Fa%;ECȳcS2D8@E%ӷH𖄞16v&RTv9m-6t 3F!iG%N-҃1Ucec6Bh<.1!ۢvX@ '\o*赈P+dUWܰLM_TIߕ@ 5x~ҁSlGt9bo>!b6[:)ee:RQٸU:"<}Wih9O:+Ť8p#k ss>-,azh8R!Zn0sg'K;57)>_8hxy9b,gt?NPvd@@3"2%)tI>ZTXjEfI9{]" ` U*+I#eqQ/H"81H\HT)g8`zØF (tN v= _\جNЁ⫛gVtAyPC7$ mWVbC53k ͵M)+cڄbU]uQ|rLFRlkuKwl'سp6mVpG%ΌΡF+܏ECD&/^ޒ@d$}՛zS:$uDmU :C'" ?*A<@%jǠjExzJYAyjPyhLO щBˌJ~ l8Ug *: ffټdWc S5:^t 5 L ~-Ax {1%ٔ& Zl` gA(B/Ki\n/:Yj @e|I*l hfHEܥ4 0{5 %=rnvQ$MGftk?,q^q44?E"аuҿ}cu^0sşN%^TՇr.P:om?ht&*gZk }+i݀6y ,x3Z>A k[c./>]BPS4wFh9Q) Â/5ױ^G3,ΖWV25@Q+ǬGΆw=49mlJH°gĵEɭ 6[|/<c siN2}V̮}fuA= n,*3SHvi4^X$%]iG)iDZQ%ZJg [[/kFUK䑣EXK@oL$F7/v+\+y{ٴvjom#6f *gdp@bIU+俪"A,k^& ߭h5M(\ @zaF33a2O*X?*4#^?HҙpPqwU;%~~>>ƠSm8iM$ʁOUqgj+LW7RzUU33_.?H}.v3"/9H `OКq-34BGӧ=G 7d/#)yѯ1ȬL5pȋSޟؔ5:"-M`T ŭm(=pNYB8TӲ3ʁ|8s?9P.ԥ$΁m׮clZo[\#Ł&WI-/'qgS^yRWS~;&gɝ=xSs2N"E+o5!l ~ĥ94M Zl5r0%'^^= dBޖVqh1O4EЍÍ(wV?'^d0sXnL-]x'lhx @lm/gEyI~47G ܪyAN/ϥ{oFc1Li K=& MW#"c-./p9at8sۍ@_4=G:ˍ@x>)lD 힃)鬷=S>]6~7wOW~v#8~ e[*HI~kk E@t%k> kk~ @@L k E E@k> klkOkTPLklklkOkTPLklk k>)Bwklkklkl$Y WY$YW@ W (WP@W@k [*HkW @Y|YBwBw[*H"Y|JY| [*H#[*H k \:cdni\swerut\ut\knhclabm\zp_pm\x43pxcp#[*H k klE@\:cdni\swerut\ut\knhclabm\zp_pm\x43pxcpk@*-EY Bw[,W YW (WPHyBwBwTk\*F 8[*HkEb p4|kFF 8k>FDxp4|DݽFk,k>^IDATx\[* %ɽ3p[PKܯbXca6PE s*%Uª^!RՒBl"Z^Bm *b1u4Kr6x&-u݁WN'ԡ5'3>j KYAyPl'9֣YPs(""Ck1_Д#ouT.I_]jE4@^(.TL("4CDUNի;pkkV n_ ch ]+Oї7h8߷/#//rN:]^+[~ @V:!HfC%+,yNZ߼҃ժ 9`ϠFy5(=9(iP@S9-X'QY P*g> hOHDa)tZؖ_DIR@z˙ ӈ}/9;䘥@SsȅvSq2@ZwA@3}Hږ^)Za*)xc 4pњx\;X9P]r\tj%UBhcEkE׎Fpa$14m,B"LaR ³]o( ia BINԚrhm2L^;DL0Uʜ? ozi^b 휞[n: <Q%ð֭s&"D:_N&g)ZIܪ\바 eeLdLDK{5􃗌 Hs&vHd&Q\aINXn:XeL%TYRWA;?icIߦgqup =I@VuZ/& H} ] ,"]@ ݬv˸Weq?oE4t=ܾ˵&})V =Yrn:0v`* :w}:Y5tMR"h +2V2AAYF@z\6 AhQPifddo_%)KɲjE`,Ԣ.-7BJgLTZW^A*i*_iϘ\PUA R$Q'*z 3AiRz2E),eΕ]d Ā4-lbԐod [-7O|m =qH=Kot@n~纞U46OH_SNBNL,s3a(tA+BM;*bJB (Z+ǭ|{YѨ߸˴_#+_δt :#d7rZ$pPH{TD[;`Klk6k6*;QBZ]߀gQ9]t4+\TmظC}ܣr)nT[t E+/w";Oh(y@ڠr0+jVHrs_!8ϋ80לZ]ZS3XB$BДjթa"cDЭH1rF/fp=D܊`=0`m<{cuiwq!ZS!/=A2 *ߑu` I N$R!bsÆSL0%6|u<׺Pxzp>uE6CBdlsTK"@f"6t eEe_cF8Ba aC_d?ՎSaC?I4"} h~j&DOY'vR}&=q-ˁ4ŔYIi IIXڧԫEEꡱUx~# jW;(+j[.0) F3B=l H1EwQV3q]\ocYGމ }ltB%qP2詯v+';.F\zH=m)IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map59.png0000664000175000017500000000432112412501752021146 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE$ +c2BB$+   xqIDATh޵n8 TTWB7/\jNm9״쫼 X3$!DN &eFl6j9}pn'm՞85A?6=S e#L)W+}PXHWs8<ygS/~+ s9.S&kei]HYVp psa[{s{##oZ˩#N*as}Jj`bFN7XX _rf'.10seI%}#);mw]`Rpajg7j֋?kI;y%%!*ﷄgo+{3e㜄ܼT Jضf~~А^]I&k>w㤝)y.mktCe9ꀝLpwpIjM3#{}M8 h?1e$.hyoΝ_ `ͼk!ZoJB98`o9;grQ{Ԡ}pxyXkB3X;8RAR9ӀFv |8߄WgR]5"'] v&͠O;sNe?L.տG?辧jЙ̱M.( v':B^Rt$])#>ֿoQ;塼. `凖#é7Εq!k震up"$Oa`H-wlEG9`1@9ϣ;| GNv/ [Ce] 9ZX[ YnGa@LLIJٲ5 \~'`ʚ#{LZ b0̽b|B}hj XSfm'~jY1~+OJg}T<"ڪ̽v&! I}@?L5#܎60ʼSeOCR1K $JWRyz,cb{Gln_\8{!"_XsEڲWsIs3u6>۝M>0|fqnҟ)zueu m]^_.}+eyf0#W dpٻ=] m2g:!'lG hn7ձ^hS'Gs xu<ߋIϯlM.]wlWǏyfS'X׽Vy2 (r@x 뮾 Oƀl^1`O5`?k^4IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map48.png0000664000175000017500000000477312412501752021157 0ustar brunobrunoPNG  IHDR@@\9^,PLTE ZW (WPWYӰZ#Z#Z#;WZ#Z#Z#Z#7>z eZ#IzkFE@t%kTkkz@@LFE E@kT kTkNOkRTPLkTkTkjOknTPLkTkk>)BwkTkkTkTkOkTPLZ@ZW@ W (WP@W@kZ#kW @YӰZBwBwZ#"YӰJYӰZ##Z# kP \:cdni\swerut\ut\knhclabm\zb_pm\m95pxcp#Z# k kTE@\:cdni\swerut\ut\knhclabm\zb_pm\m95pxcpk *EZ4BwWW ZW (WPWyBwBwTkT\*F 8Z#kEbok|FF 8kTFDxoDݽFkkT \-IDATxv  qzfNt5ٜk~1_>w~~jx:qiyoxb6JÐG'_M1=E$9cC*{@ >ܣE |?q?` &w0FOn@2c4-L1rX j4H,ý|]/%4qoagnQW&yRL% EH@<3"o>`Z$akh>2o&PM6.P7R! QM5f/i[`^HxMv#):A)R?9Z3Ozn7fғ J0GR%7"Y4oϒev0OS$UaW)!gqk!"vYQJ2|MfvYp:JPC6-bF(ŧ-vɽD0(;nB(}gс&+c;B'}aEwU,>0β O ±}rv'Ur'.m 2up03z,)^R`B9ݯ!@x% \ OEҸ^{_)@X&(!TUE[$NA벍o焆0FsUcTkL` ['OrۃYq)>We'p")'i'/R)N ,}xD?1 ΍'Cv2%I6'2cF %W)-xgNQwen,函I[DiJ&'Xf ~F.3ai)eM̐^.#FvIs\2P[ܫQ-,u< ͖d+?Id\-ОZ|2l*/zc2pݗ,<3Bs巎k> niB04 3XM1!.kb[}J ̠ͩH=08@Q0n~ŗ)aWh_"\x`To{߉LLoZX ^Czi) ڏͮ996$~h>yY +`+O_ۍ蠾dMR|b됕_K ^JS[],!Pܿ_6w[ WFR>IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map42.png0000664000175000017500000000506412412501752021143 0ustar brunobrunoPNG  IHDR@@\9^,PLTEO ? y- 0 _ H :  YW (WPWY|[*H[*H[*D;W[*H[*H[*H[*H7>~ e[*HI~kk E@t%k> kk~ @@L k E E@k> klkOkTPLklklkOkTPLklk k>)Bwklkklkl$Y WY$YW@ W (WP@W@k [*HkW @Y|YBwBw[*H"Y|JY| [*H#[*H k \:cdni\swerut\ut\knhclabm\zp_pm\x43pxcp#[*H k klE@\:cdni\swerut\ut\knhclabm\zp_pm\x43pxcpk@*-EY Bw[,W YW (WPHyBwBwTk\*F 8[*HkEb p4|kFF 8k>FDxp4|DݽFk,k>7ďIDATx s* E_NBtu{;m:at)jv 9׶Z 7Fo/= ]_E?&@8ӟ1ЮwO{;$/4U=CnW]޼N  æ@pcs86ﱅVNZCMY'@m =4>5w;66ef`0/y4Хfzf=6E=GC/_5m m$ 6%}Zݨ> C/Ysz^h2ͲE |/K≣'MHbgCg@?*Q Pd P:D:ᣓGT4:ylcռnZuHBFHb\!Lq*D)mdM#;%hL$@M/ 3wxFFҌhP˞WH5@ϩ%2&$dk$)L2SND$bU^#!^5``ʹ=y-CH DJK\x&65@ŸpJ D -/g23 )lvbas@_(wLzq$"~0p㗛j29O$|nH150&睁R.Y?3H$W2@.ϮHo&O7P  $]Z鑁\4Y&nY|9v8||%K1{ZbœVC;&2.`hQBXi$`WQnԇL:">$2`7 ӍZbM`63AgC+ JE'~~"n@9oajHBlE|;P.ށir(d+*M 4x2'6TQ8l%FΎV0 -Dw{~(HY J,* T[G9rIy|sϝW#8Ս(ײC +(L0գOՉPdPV1a]HF٣W8(תV KCX# ʉNw_C]Fd؏@V>[2 F,wd5ulrBBuɜA9B۴> JM?)J e̿` TT2S(5~Y^&_쇪~X;aTTڇh=; fn Ȱj ?>d ؟rRA $Q g7_3f6}y"N&I݅=eZ7~)KO{R1AI{IFbvRjlHgΤoo5})k^){K `ߪYo 3{PRIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map66.png0000664000175000017500000001105212412501752021143 0ustar brunobrunoPNG  IHDR@@ɳ-PLTEk{9JcM. pHYs]EIDAThuZ˒.A6(̫~Y>Ɖӽת|?we/N1~pqlPsVa6)}X*tf6 O+sËr]6=ص.sw>wp+=@ 7a[n0!:6 (pH)Aqu-Qp4&]3 9~6vV܎c4< 8X-jm,o8P8Fm-*Ub(߻!9~C%.H8;wKj1AL~Cw+ݏ" Ea4m]A<ݰ˥X>O]A2kxp-&­pX&iY Mpְ~v B]ktY}'^Yc4.P`Z/u I|(0nw>(ݐ.+-a7@؍bQ k؝ *nqzg0H(wcSfb3lI_R#68۴j:=ԍ_.hiil׈Z;OuC-a 5c?@e4#cdڻȥ{}HwӆC-{l^_3چö<RUcD}>]#A꘮bSb܅,F~;6,b4^Doנ b+Q[\V`XU?[&8)ݐӠ0/u(Ⴡ{><MY,F <;z as΃md_ *wWƺ 6qѪdi7 {K1+i\~ZRUN{겥CC {wՐgw8nLa>}p]#җ𪔩'{OjA*wW\1t$A9yt*"o6<qG+'<1((-b( X-o(( "Vq1[1'{F@x^1mwof44֖#w\=Q Ikħpx B1|.=QnUU&:'/6v!-$+ثļm<-p.EdiF>URhbG^9U3H4/e|v8 j%UX~W|<)q^odT &ۛெT،NbjJՋg[`(ghh`zBCL-~M! rAg)bDP茎tj,릤ϗ3 _D::Byl 3t1-gWnjdO.ƍ MEq3un^"hc5 sҎ^_jl1 ۞ؐLb'+-`/<!#Hㆪߍws 0u:V<3\!3AޓDlj4C& X\,(N 8PB94 7K./w}]j |{<_,Mq\m R@ ĩlNXЉz`uD 72@fάqL o(X"Q(3Q̺V E`P a" BX^ e,N2=Lq>treI1]J jW-lII9#zaHFqn,, )SW D 5O>(dp׼і1z zQD= Ђ3aV2ҕVJ{y^=?ϳlQt6Ngᒑ$ #3eG ԙVl": /R2rNRȤt&|A,x%O 8#6rAԖ`(+* O/bR,ؽZXl9d4Jf8)BJm6FЪ jCh| $o.Cl3)P{V0Rb@FA=j[#ݮML$}C]n0})HLǺ>/j vA@Ŵ>,L=k| J^qPczxn=&r,ȺR*!aF?wl D Aˊ]-5/JTI @ NyJY&/5J siSiavCyB{a޿Pe- 5;7*hK gpOL acX [sU{g [`u*׈e6rdhu$)[aW7(ɇq2AS)+ ,_ޗN¿_&H->xsEr{CzJ󴫫P'%P VVgx [V4ilgJci^0@Di$ >l=2vYY+l FUwgReƽT+U@E֎[OXcq]'qMf_ Pv (X# &ڱXlīeݧTC+ȱlدп$E}x7چ=m^Vu$Wڠ"B]jĻ4Ы5kdHw3'SE w(xH864ق`|wO&&D4ZGq McNr8a\n?fy5L)fi9T,w7&d 4R7XnSW XSU#K:6Y.ړ~S-X\(!_,~#uVmC Vna1CQ {%R4Tib{B]S"cJW OJƟsvwU-Fǎo0R5^cÖQ SF }<Zw@: el;4Zʎ3#IQ&K|j"z7f#+>tK SWpEc =u7maXk9>oҀV [ zrYJr*xX?m'eheY#`r:ہֻF$),-o>V%}S%\;f!13؇eo3qF\@"(p*PkaU!0ȷTrtvo)?̸pqW3 w܆6a=Cl2ĪvtyA$eMԳ5L~\ۥ;+ǻRC +G}bP|rT:!JoyDEQѠa׍v&!>`4q[h3[7Jץ@d[A2ب FKRZn@~G':wMLj"|\)Ƿ7,dwHKɔJ Ԍ |Kdr6@ǁqT4ff(!#%hZ$;O^dO*[!+۟;}Ma̔}/pjQ1U݈b6$aK9|1^}7 ᅩVVl|?S3]Rҧ5o쁈61_I K+TRx1 OpH?;@?*ȭ U(X3W,W UWW U(WPWZ4Z Z Z ;WZ Z Z Z 7> UeZ IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ HoHZ WZ HZ W@ W U(WP@W@kZ kW @Z4Z BwBwZ "Z4JZ4Z #Z  UkH \:cdni\swerut\ut\knhclabm\zb_pm\m47pagt#Z  Uk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m47pagtk*@EZBwW,W UyBwBwTlI5TDII6lI5TIAI @AIAADxI@Z2ZEE@@FI5X@04eIDATx\r* Dl_rH-|IZƋZpM~Z~?(yLGoʯG5HK{xxxxx>*8 8@o0-6sOO'@_ TYOO x%_FY twtz)T+ޘ<' E+s|!0 ~^̣gC>vCo7<J`'{b2;iRY[؃mMҳgyIsOBkӱ@@Nu4x"m 0sWkw ?mx@S_㊽: @"MM_K 8kbx ߮'62(3%9e.?g:;ksʃyT5Ό:>:k 2{EZ1'2WN{ἽA CFxN@uq@l:mYt gw7 (7d/RZc9s4u̖Wx_ en ')}K"9z0MMA Pk /Fzt0%K{G‘Bqy-|9US< |$WJU} =&ԁ w2ǣѮF1rWBע<@`7 )o,fe-C+Ylcǝs؃[@b< AdN*kÀA Hk7cM倰 nyv.']\97 j&&o%LEYW"UOi#SV=#=;$WD-KĒ`D^0.BΧ@~oP%\ u id$p\FZ} 8} "m]Oix]O,%@G*{厶"n{Ѓ}~g];0]J&D q`;|/ooo;d,/?oJ#0?z5'۞'mݲuL@! @ E-G=x>`<-LI敘A?nUOnR$<2O<zpC +cʠuZmca_acaW~[.q.suU g~; ; *Gg @~:o@8ǍڲQhwxԁ*!aY>~a,'[xV.  `u{?9!wPEQTy?#p:w!n[5_#ʬWG~ܰc2} @P>%x}n{cͦhMlnw? B`/s@u2順t.~gzeۿ) eþDgY~ bxʝgz[#!~?K/~^ n_<Ӓ@їi;,_؂uy :h X%*0{E(.= G?~;<_-W=TIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map72.png0000664000175000017500000001222612412501752021144 0ustar brunobrunoPNG  IHDR@@ɳ-PLTESS#+{ss;;.4絟B/0zD6^E 1mй&kq ~׮bLZF S@/ i -ٕR~CW֏Z] C5}&,\RKFk]ÛEps>j,?ץ#c_cg[i`^򕓍~˾?ߊw.bio[pįSa@Q.v)~ko[ ^pfQzҥb=Cb{o!cFWf' 5[?_\y}~sGvʟ}&k%v̈́<ÁeϜP0&&=raQq?^#3zLE xvA'*~AL$;d[_e0#?a+?݁\WypF^~1Μpؕ%}/vI7*`^ȊNSe?"c,#N啰_][Pan[!g;nv D t^aa3ztYǞ8m̟umL_(6Pڦi'O 6+׏4iww8 "!6`rĺ9Jq𫚽 ;o9ѶQz˞_|BWon+IhOJoYa~bl`H&Qc!$4UqzO=U)IO$?!wb_l@..|؝pOh]&)fyt7JO~l+bIrVQU̕]#N5}W~hXcwg kRN29$hVyF.P&~ Z/U}/;y*sœj>26eD+`dyL~W'oƏ@fTRXoO E][6sȎxOt9@) RO:)6ā`'Z h> f#5 GmK'` z uAoSy4r:Sgi#FTz! JPVT[>> y ^,''n-A´{g( p I'G\^ Uȓ$_tj@2=Ʀr]AiNDS?[w`ym ɯ g:#Yy&M3Ec˙//0<tK(y8I|vyѫ|ɟ x oS~tN'!2+~:oP̞&%-; P>{gaWHvG'z烼$O_^=s)ٽl Ox/lw'ϊ.k"",~"6rw!\4ᙐq ڛS\'a@FlYT6zfHB?}B"A ]b T:zq CUF5k O>l%4i2C<@`<1;[c6.X,tmLKelX@og8 4۲@ChqJI-⢣_᏿.y_y!zrGb GM~8£uMz `gsጥE@j J %c ¯_Fǧ翨s>TBH6l;{)UꍨWV t0|`V^4q,5k|8GNM0_袱dXqkw6RӾ0"lؖ-uhs2e}^Y*zl8_@x󷓟 KO:e4ǹ{-]5…EݣaЈcCxrߑ1(f׃!~ 2w{:?QЭ|MVՓf Tm hW vVuu0z4M&eÓ𪈔srǎ7,-,ifΦl45'-8,/a1y;gʕ@//~ xȄe0t`Tuc8;qk>omrZ+p)EIn,>`B ^cZp1yL)`@Y7LVj|2.qvylP6ӕL:,pr8ih.~֐(U6oIGSQYI'b%N9 D9(; 3U-#J "8NWVR/kXШ41C]8uN~S7 /I]l4 K_SMj WOSU"AQ Iۋ_srI}@Ρ Nt{$mثE]pUlٯIJE**" Y::i<;PHE* M:7g!00' E`eFWp5aueH0 WrPs=,[egj-,4S0Hf8UHNQ2rl1p7< 3bF=mN_1ZmFDI&>ڬ8wFeMҨ4oC~H{4h IN/yi6<)/tE25 _!V`h8m>}$@ayRUxh3 /4 T(X3W,W TW,W T(WPWZ+$ZZZ;WZZZZ7> TeZIkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ (o(Z WZ (ZW@ W T(WP@W@kZkW @Z+$ZBwBwZ"Z+$JZ+$Z#Z TkH \:cdni\swerut\ut\knhclabm\zb_pm\m66pagt#Z Tk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m66pagtk* EZBwW,W TyBwBwTlI5TDII6lI5TIAI @AIAADxI@ZX2ZXEE@@FI5X@0[r IDATx\۶- ]!"~+;*f8/[9;ʟ|+ "Cpϡ?`dNrx7WO2@ր(AЧ'bFCv,ol<w`$2^V? @8wX?<y Q$}r\q ^$`b/  ̣CD zʀGIg}ISVBx1" >[_(8ʼnT\H.X Xy铤?:Ã`PjA{%.?l6yL):4Uߋ=t@IS Qd?/=I|fy ku}y5 e?IПVg pq8E8)a7mh z?8 6B>""Hye%?/^;D~poJ0IQPa$F4\PO.k)SdKG QP@(g{W{>Jؠ4to/,jT@DT' nO;G;F\À hoa$'<;U%˼?y+fr{A0W럝dv![#d@kA `w*04g)\sq#ŀU?`<', wO<h>0a5/Q@[3QEW {Wq?(BO-Ưio SAƸI@J_hbB fՌѐØ .v80A!{qߺlq=({H(1O`=]+e!Ü @7ɐ~8ƿ50,;Y\Ok#N"OYqM0k^6xj?mkSx_[SPk|ܺ] ?p3C3`knM{Ŵ yyM$B$yA6ռ8 YNL27cGxCa"~΃D>R8wЕWf~JwS 78ocq"]jlMK)/R§p71/LdD+ *^~4E[ts g: ycqpzZ8twz;Ǜ"K6M$px Qȕ >eׯ}yB.$ٵ3 r,[o.|hv0qC>ytӉ<[[?!k%gkOqz*|ڎ\]&ֿ>(j 8R>!5y|d>"co {)9*iE7+hX\$;'p/ťI@Mi )&G=8gwy'"8Ǎzx{UOdyO%."gK]5#Bڣ|  °}r{^y aqcu,_zs#.خ3%}vҦ=[/$ٯőu^WLm@1!O;0#g5@Qv]5``7߻:x$ /!=O2"Mo(GHrR_o4n.~.38a7=:Hr7S{ݞ %7_8٫ۯX[Vya+=oj9J{H>]j&>{'_]LEϫH~ о* y^@L+@W'8޹d.N >o|C*7c]a};>m L֟WJ.~eCT{h`<ؤIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map73.png0000664000175000017500000001170212412501752021143 0ustar brunobrunoPNG  IHDR@@ɳ-PLTEZRccJJkkehIDATh޽Z͚:0*h.%nD N;LILg9i']'|/xecr1u9uYς ~k͏^5|16\(/˿.uncZ^,fWۿݱ꺶:oZ9lm~tYۚ2偼Ր%:翭}e1+kU]W'.SY='!ŵ b7c؏M/Z٣[?ְ@xsdÏn~㕁*~|NZ #+~ph}?73-d ,0o?k!Rj~_(o 3 ߌE UW8&$?lp>鏯UiTJX7^QZAB_|F}Y8~DZ>:Agu;."~L3rִR~_xuݸ"3|&iM X]]`B'NZ_qntw,PÉW#%".RYѰ 7E(/8Al4}DAT{)uCN޻aP xՇZf?QS?m$9/+k~/ : X,^2CP1~+(0g5ݗt:~| _44$Oaj7x`DE'8iH,Xu⒅,2-~^+ %ܣ5UسV! $^\XU9z"+;Iiи(,8\nI|?CuK'J(5Vd:O+{\3ѢO%bc2$!a} \xl>` ͧsCC8\Zdȩ^A0Yop'\~ߙcA8`+X$  u ʾgs|۠ -;ɰ洭BAK?d}@p[ܽG76U2Bx vu> . <4lzڨf&DTnRhP ĕ GtacBweL-D7Aa>f7~.R{<檺x0+TW{ UumC]kI}^,qSb`O_e}fY@fB5$_EYlL\H6 WF״ʃk=/¢ۥ]'ȇg)cHT7mšU ĝP1 2zr}d-osݻgDm q[XUy?ub9V$0lUu]0{& !?SⅪt// unC4?E opЮ\~6QI=Ȳ;%D^&\R~'n䃃rx:9>bg|Uog`[< >(xDO_ljPm~i$76OrӪ1>ΥM3ܥoogJy_կߙߕmBTbVž$BPCHLW5#쨀LlIVƀϦpal-Ð}zlټ%a;bSOБn lp(.$VY7šGfT>3JO0nw5F#|\:|{ |~ IS˒ cG^7OQjL 1#Tʞ-Ȅ_ߞpxCS|,nXVDb3Y JDfJ/zvѦaJDfDyuUT=9VI]]>WAߘd!/Egt3Ï&333=x06l=3?݇pr?P?2psyw:rL1GsT~(8+*geGzhW,uGyr.eh1' n(|p Ms:o`PPsPY<4{U)(^l5|kHpM*nF'HK+bo$4t?'LjS%t25A.bcsN]|[0\eJ|fa>٢ǵgxryD$l1T|C\9:q~W),EךMO. r m= @[2*0Xũ%4A`4i“C p| ԋ͟$3G5݅n!o=?Q'áL, KJ#َq,ğ(sjCg JҒo unCw!)>#*|0haՑ⡤TV"_sg#qwR'k#ՔA[/ i~>;Ag~X~DG{ץ-C'|NG'#t.V%;;}>iŁDGKQ{KS<#2 Mѩ҄ 3l,)mbY$a*ShjaVc}h r;Cz4pPgCҁÑ\ Ix\oXN C,e\3^dL2„hl|sb ̄.^cɛՂ œZD4{S'unmvA_-Xad_Fk ^tԱK :X (Bu3H]k63V?$ui3RɱlB:_dTHk:8C*Z,MV݀BtdzLg=n'^Q] E.$P͵9b['7J~mnD?M&xp:G5CfDz{G\QlNZ԰@ 7dYC [/O14_@ - g4WB@A+q-գ#&k 9Ķ!>d|l}'a7t H% _B&XzL^md,Ú'9႑*g+}n$#~>pcX2a|#drNqԬ)%q-غFKeC&$R?ʅk!ڽ0b' 5A'vO`}31eHMY[:A=ǖ4 &Sw?UrDl&rKFH5#As7%g[Hjm3lx,wEW,ay/}a(102*? 8c |0 UJL2PebO|Iy|^el阔 \C"J'l@1_:ៜ*U@#D<nW$l}FO؂w,wWr(~ r5ZY`)`۔q"N[Y@RJEz7ݶX`se@AŚb(kqEX^MXFz>_N-phxeor#P`Ș^@?-&?$'u0++p7_V39ށ!lA| 3Ch@_ \s')Rq9H|Keb+<5N%ۦxs%Q {.iӁU_|N ]]sEf5;cҧ*pa:(3өV oˈݠ i3Q/v=WjHpQfpw_7GWq Q.?X-P\V>B| {:MYARAf?vܞĔ4{prŚ|&In}^OBD4d#لy61ˌCP]ɖPņ־P(Jۘͧ Bᄩ3+P 9ǁMD.28}?fpSYTi⩭)-Y8YA@| } y| Ld=%?N{ -֢|~Ls|S)@(ݳ􎷲BS\8:ځͤ$Ёg/\jdGX]tXTZ^{=biEs OKMd,p݅ނxtc4qp) X{'ҼPI$HCdT?lR҆?q`z~QSvUT Ɓz/ܖ7)#ً,.HkE +HRxJ:?`S ^1qv%Uǥ] f'5qҬ[ni'ڻ%@PU|R~ÓWe#Ro`-> fֺnځF\\.vï~Kw~5 .<֫,!h#+p_]ͩhyZ 3k% [mvH(L>s ǧ2eNkcJ2Jf@%Q*b TS.0TaxOPA$/ vt[e@΂D/'I;j)ǔ!#}-H0j*j5ſ+G% ,͆v.&8pPyepzAr^nI>wt(v^psgڣvX3p Gw8 7>1[=ޫ|Ø0?3HGA~}aT[o>i#9>Sz.ѱ),TihUIm˚SzD`cفJMׂ+ GktQ .}d[Ʉ Ui5~Zbϰs҅Y7z>eo2yc[8'#&& D/m!X o 곐=MK/ -wk9zT<"%hٕZӁ@0nV!ālj^&%oǧz .Ɓq`=X3)<#=uӪL# :׫U)_پpވ [*n< SlD~A/p` T)|τo ^o~Ce  GlB|\N[?~)OJ [>DE#ŗ6ÛFo&sƄb0ؗzhL6=}=K \m ,Ƙ|J{[K&qlxd?OOQ?p24~e!·N!5鿲_ z[b^}D}?:R*IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map51.png0000664000175000017500000001420112412501752021134 0ustar brunobrunoPNG  IHDR@@\9^,PLTEsJsJsJ b9j1bsA@+>xx8>`ߊ>@*@@@ߦK>@ߦ@@@ G 6px]@YpߵSS-Pl5SNAS,SpzA(8\AS--PSNS|S_S@+P@+>P0>xx8>`P|>PS@zS,ߥ>0Pߦ,@*@+::@߯2@*߯Z@*A@3@AAxSD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[3@AAxSS|-PD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[SP:p-?|:><>x@+>xx8>`0ߎ:ߎ:ߏdST: .H@S-rAXS ..HSN.,ԈX,.S< SN^v|OfSг!y;[bra:ڙ@z$o'z6)N1AlF*[y^u !F&Z`@nd8$AҿRwߒ~WH2,mGbsy렗&'=Cbҷ =Gq"Ttێ-]NA?)/Onۯg_L?ԯg вNQzkhMo\7K!UCރaCY^&QY#}G|"총MN~`[RR|R?n^T #-Bp5{ʲjԊbqWVJӆwoM?-G)ͨī=xGɄQS?')׈*G+^'FN_Pيv(`<Ơ8JS.RLσc L&̝q< 1k76gQ |oj1<.Р_W-?ďn/ַ2WÎ9()nZ爲L>  P8˥4]غaC/%ZQ⿔K7]{9"_8 0w F 4 .NqWӂEO pn?lfd`+SI΃^x5E;kN v/sS<KƳ%AUO Tl%e2F[.6j=N>6B`Fw~QQ_ CD]G ?]TBSϨٶYf+Ro+6xHk &pfw̫5QS\FRqJEU o>oU^}y[(Tzz<\ nD@+™%i{$ k Ay.q5e΋Ցp HLVD꽬tNjro!fr_5C2[i֡ ^S!(.UR^HɚԹ JFWX H pDF64UYiJ˧}Fum:~4eT5Gn/U(F/df銲Z3hv4@C"yT2y8]h['_]K,v>dZ+Hߪ]cCj 0nYK2HH,tTiL*Xd D]6g웨Dd6y^t8R#R%wkb-gVi/ST"TB o%L"=hV4`G?btkKp1M5$PDfKSDL?djZg aUԅ{rF[' /I,iU m :3Gw=Uѷ&lHX,a5pU\`*ӫ<Eʊ::Vp TlֳPU&yi:]~mOV#rDCƇҗYn:j4#j芒5E}u76&z[דK@.Y ѡ`+f!XR޲.{͔?傂d"^\.BT!ͳ;4]=?M7gN/JD+wBтb尮|`㣙D/}vE;s^ 컵RbaJJg^D?b|j(b]kJ俰TXID%WFPSKqf(CjmX\Bi(; {ς za^Mߩμ cq:u ewk|)RC>{LRaMs*~H'$r{5 кeWeqi/2J_M|`sUCH" rf(ڪ@2-0߰lL] x )n?'LGOdܠ/ ۽L]qtgZ!'wP'B-?Z Vݿ8^ #ַ٤2FqPFOܕs"yQߡU۾@w":\ ujj$tݱQ&J $4 Ûx&pL4`|畽yPv2_^=`k+ \P]b"YCReWghJ]EPX;U99Q#JQM DИy xeΠ0 . 2*U[r %n{r_-yExB]Vc UGPr)d:ne e -@R]B[|ǟ_UeZYR*\>u<#F, R#Ae%BN{u,hFqL0D2#?zC.]e~TȫQ>)Q1 Z^./fA#6fITo>qBk0Sy_*ЖI fAr 5JfW]Y%&_ȗI'j'ᢏ&R%̬'?9`uJRޢu\.j70QQx5H=gMڬM_:ե8ߣ.[ mg%.Gl{VRsCUzF1WanrLg.0+Ώ!j"@ɟ7 ĸ"p\o#+fe+Tnrj/P9Jӱy$$<ѶEQBF?~D\Φ[B!W0̊*|;9 k`zad)5 xEd \fMԖ~~ ~\رY_.XF,ryatͽ͊j,gepvUZ]]H19gfMMSm.äǍP3i7Ϊ8Cӥ!j8N~&_ Y%f+.EJSJrBf|5C0[ӉhS0^ m1ZR`iUS<3 Y׹D4SpcC,ȥ%G^wE4 NpGXnlRS ܿ`(걾^e TM~d2{)C:vHk>\T:ZPM%a n3zu0@o P4~Dl.)iB5K6l ܁X:&2A?&# HN@k%a.ța3՞CMaQ΋1f#4^2/ Up-}V,Ae qQ^ NMVM TR2ٻ5 MR %0 },Zl=ܿ`{#`B%}_)AVAPXh&s/^8zvgR{s&y.C*=~;y}~3QW_{P}XN}l/f+ 0Ӂ䥮V|V0覨gM' ?a1ŵ˗Ě< )U$ܶi,e?AVҠh9h9CLsRW\1 Dם=SRģmPPF N~SAJzړ%7/*}{),_Qci%J, 6 9uNK/~9L}D~\%ӎ?qOd$JBk"l`B*vZ 䯗v㇛XY/XSXf+ ԵcI8d)wzx^{uLh]ܿ#(LD#4AH[wj2>|p-H8zk>LX8H~_߷(MOC~gVin2^b03%|"UF$F4"_ g.wMXYF #_,ϊ :ErvUwON5]8ek&g.W!@U"ꓥC)2 0x?1鄎>kƅv-Qˎ燉ŪK zM7I<ۑ׿* t7Y>n|}_1^?M'X2IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map65.png0000664000175000017500000000333012412501752021142 0ustar brunobrunoPNG  IHDR@@\9^,PLTE/#;+G3W?cG'oS7_4 pHYsvb~IDATx훍r+!?&\<6:it{ېxGԾH9CXj_D}H~bbCXj_17Jxq $!Mտ`D#^4oQ\߹m#,$"^o݁փ,* p7b`8|RZpk+GSk+'[wď,<~7#u2@Qomݘ͠WeiOQ ~)"m7f.~WR7u'TnCE݁R7ށ N73,JM7,< &$5 hRG=/vҵ2@G/CbH 5uB^\*c:ޜrFf/ ч#pOY;[[3*HwlR4[WZ+/a7 1e7VD@>j)\&q+k~v?+kmz5@v`6l܁,l<o={ZՃ҉30vƥEI0v;@xtzT naoM{TZ? ,u? Psttfi ,D uGޘņ}Fexl?pc?}ݽ>nOk2nn 4FS/9icI' ^5OH7x:t({)cX6:>EFzh//7U|fCM}y-36IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map27.png0000664000175000017500000001024212412501752021140 0ustar brunobrunoPNG  IHDR@@\9^,PLTE9)1)1 111) j9R)*^&r;\* iު ]IDATx\ 2I+>QXfi7\" DU,Tk6wEIgg<|_bR o~P)ެKU~S·~"[|YYf <\O~2En>? r|f:wK 5LFhiקɒL#_iN/;[+./ܽo/A>|%0 cwo~4H9@} 3ʧ =pk _' iMj@%?=~!^WC.cbPx ʧ%\l[~ތ5X?2g}:ro8~(iBei_tGNvqk ƛT |z^-!J7=/)`_n׌?tm YΠG}=5!k_s8ا ˨)J^}[P^}W9;{INõ@fL 2tR\<6kgB콍|ħW?ʼlSQDRx^ἊWm= [sEfƍ/ZK>zuO !heKUU~{2y{ݚ>þ%HDZ<<(ϦM}H|,KwuQbD:'?ZD5*_F#v74ZXl#7|`fގ?=D~A ^f OKdw?,L K>/B0|'lU@jH#*rk ^q-v*OG]n y:UD"#sJ8 '6b=b'll$C,^Q^䑚I&)3Y-6U:@[ +x|oO_N[l.*^ۙk%*,#}8?  ݪ PR6}:2Sdݶsr$exa 7*샧 z{}&T;^rr> Dx:Ipz ͧ- ɬ._:m{/SBReAG9Υ{#mLf_W,N~[O88g"ם M@,Uy%2rRk%_=A[Eпm*Kmk쩽pc`t0x̴ѫ@AWD0Jxc΀׾ڷ>ͻx lSm!)Pl@ K|VE~ G YH<6X?w/ZT'wTe ScJ?16kjO]BgUVryu'o*".-8|}* L@óFת|+/[ [!n/t\' 4& s#[;|u߉@X^״J~[]Sgǘ@xwöG5v+s>(|ė _6T^BW7#+#~#4UkSIKܚʘY䁧H)vZ7N?/_x!0iK_U+go)3Ů]sF-/w;vJ l㶈es(f\IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map52.png0000664000175000017500000001652612412501752021151 0ustar brunobrunoPNG  IHDR@@\9^,PLTE1AARZRR )JRb9ARss)ZRJJcckkoIDATxu\(4`Cl:1=J%Os{?֚sokEﺘN۩|ٿ s+rc߻$}I1!ԥc>[PCc=oBCor΋5KޟܤxY6ujv_E 5gS:OA˱'u\~1e4y`#> S,J0onJ}x%Ll!i5k%~+Y6ud˃jJXyUo<4jOk?kR FN'7hcGƛۘ Z0۷{ cI )]*htb}m@%h2B;?-{?'JڬWm%m0 Ґ^>: "y}^fimKXl똩)*^ IġBҮEm^{/ydo;MBN7ndž{^8c29SƲ榉@ ,k$V ma^&1"FxCW>R',:mۘ><P>BqOA+KFKAAaq|~ ,mNٺ+LJ2Ve!!FztBij⅓O^> >}?}"Qр)" ӒncSr=s" r)2<E)%I6N 1R<40B A ߷.Bk_za/vݳ'aQ^mD.miĜa_{%mIvw੄ %wxHCSv$}VT&CwLZC=KYXs2^W[+Z>$0wBPҦJ`p1}Gc@z t4mҬ !V i *SQCRLZ_*xݰe@B=+J??fظ)wl1N Zžokȉ2v1z|W"ֱ~ \ _'4#қ^pl2y#]KլFd/wH׎iNhvjZˌUߢӉr#|zR9˖ Lj֚'Z3cm^ںXRA/}vkqFUkXiB{M JMJD;i?scA{T^/jw|-T%Ys^9&V|v[Wf֭~֟GA4QӁ^Z0k+q[W]b5rbSD Df=o+ܫ3^Z;z_b<_ClkAB PW  8_=4tXvo`1. :vFcoR1: PBwW% =ke@L¢HbŴ4=lea"4D}SL@7;pQठ{PqOX@醴O ߍЉvӃX)7Aԭ}&KXo1 |wƐw)wC.j'{_̊Cax*dAyH'$ TK;ɀM0b5Wg& ީs9Jn ڀ_ANK;o{f F@?b$ISs$J ཱOL4Aƪ2NS;Rh*E&"෧e9E},1 ]*KK7d= aʈ2[Af.[ٗ2N7c#Д%E N9gF~@5eӎ)5i9Jv*s8Wxh@i|7C|eGnp86@Ζ}dl _^"`@ r&YV&I=sj/6Pc) ]1 G B:LCˬ\Kp؁KL2eXZD맺@ t$ ls&^WUuɈТ>Fo@H(oE~jT+?S`zB2 cJz!yZɄ!$lz,\򴔟؞yGLASso xҔbV>fR*pJAEeO,m|`L;҈xeA32ecxFњ+BEC;V0܀xFA}=< M/[A>V@k+[PS@ e{M W巕G!D4~t2 l1x4(j.S#PÂl08* A䫝.!`ԩ\A8G9\@zG-*x$-.-W9;o-ּ]I=LuHpXŗdLkj+|EJhfK@[&^,h2Hը}QKֳ4o7% صlj%cK(ڍ{Wz58?TypQJTxL ۡAG'Nb|R3T}2/ xXR3IqpQ(dLT +WP:Eb_Tw}BHJ+9 a"]_Q`u@jbiP&"E}ӀG p1Iw:`QLFvV*-߾Ԓ8O:_TyW?R l*$# ;*:{P8D4< %`QC@x\9|0o{K,$RMTs421 9C= V oP6s9[t> @TYNZQ P?unѲJtcE{^;XyP? Є5L-ci^LU8n`{kHWw֩K ]Z8ծ& WRMvX}U8Vr!k(3 _wlnԣ iJ =4 A:}_R8#.",rStSp#UқҲĤ v'-lg@pYDQHTZ* ɱ}KI^C`G9Eb >d1xA?42|n rwble[UiT[Bg,TY?rR+d/ӕNXv 6Sg D,١-_-v~yjBPWg1luȴDL;}Dh8%B\II ŃTgG}TvJa"EJ^UfqHЛE vL)cQ;8aHShҝ$!N`tx4 v/ )E\x.t?ajы'TK?jG7AʏUZ (Xv|(I'AInJ)̝T}W4b xNe"}d n1]eIC%ںb1WXoT0"U %>ĹJ%bki[-5k+UϗQ;ʮ),]ebb"؏n|:d ov? Of:0`)q2/NЎÓY|MBCqSpSS 9(0ـT:Í84/ŰXe.O6?4,|@_YѫbTog5Eᅉ*PaZ(vAdʢ[y>AMdNx5=˷h֖wlXT D@¥ZQH5̨GjXz6l޷c=5Qmjjlvw=!/+?>H\d! 7yPBvvl f3LpzxVvrC"**P;HCFҖuȑT-`GfIEPx) )ɶ>CĚ/LPtV:`ߑ$v97h!mATu&m6 FP /H'V3bl)e1AZD -:'u a4>$X/GPuCP`VԼ="CBah 5@Bw{=KH%L*g#hl}zEtgۖPƸ;3yVq25CW]"qr4βf97 Q:qaY/Ep_#dIÝu܎MlRc`P: ,WU3Cٿ"cRIR8%Cs>;a+V.dpTG&PPnJS|?‡HCpfI-K1()zz3ctN` 6ٴ|YTԯԷ{tH<7,Wb?JBp2lE?^5-8Z 8qUTJcܧH^l))KѼ[~)!SZBtXOBIC/a5VO*2nsQ7|miS.s钓d %4 u8{y&W*] r,G8^#FZǙnj=Ou'Ox~/#96عe\GN؃ӧe^O4iZ2n]vi>v:ulV*//cn; 0 |VŸsTyQb߿f|7$ 3q7t^dSv ^Л[sT*_?9֑w#j`8[DGox P._On)becyWe'5Ĩ>)?GzU8_'"eBu|#0;TEw oxf^Y,>'\I _)3 ,F0c$7c70贶Mx\8l-G:DDq sTv݃\>sKX?uUvSܺB[~S$vA*LgK#bC趣:-3]U6 MۈiBǟSorFb 15]K50.md35KבK UL3]8=vˌ%}M\'(3 HO , .`=¨9*1ΓJmnުIgK>ks"}Rȳ; d\K~48<7̜U}\+ײLǧ|r[#mIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map22.png0000664000175000017500000000323512412501752021137 0ustar brunobrunoPNG  IHDR@@\9^,PLTE { o _OCGEXIDATx֪ Y5|X*efP5^KB $"~@_' uķ_.d&b5ܭ w`9 Bx@J広G j1߫+Sˊ^jiVæc=TjPM=tG8ѷU}15zW6?S` 0&v.@;kvԐD}QJdTB3#@ &էu i|-!f0|}@_CV'w _UP'!^u2gRgX,<"7<' ȋ u0:c|~Ao*Ehԃf  >Y=@B{@9[ |(_^GT-k$+װe2a/[{@ ,# Hm\&s)rnқ/|, P 6#?@ |,Ï9|@@ޠ0O$ `)$\@ ?SE0^m6_י/k`]ʸ0=>vaT?iµFu' `Tklc٬xxrSM=1O3 xix D^!Ԟ Wo <Oe4]C 3{p?A(E~ x?})n,y] O{Hcw|itkd!&y*Yפ7`iR:虂8htJ.. pv;Us:;-, dUcL齹2k hx+,%-xyG2O͍V2cXHL-==W0\rl|. I6a){x6)*.̚c^(KDՇ'ւGT%ZDa!fe]v!)B4j=l0ǯtO d%{ עM-\{)w钓9mv!`:Oۊ8h\JT_/f ygp.$ױWVnӥ3G60%wGkʯ~S1=@܉TNʮ =?yvlf[I?y_1_":@Ȃ@T^:ma5ғE*qZ@k}ZJSԺ,O /iUȈдd"r'W7n\+!TΓ^lܸ&. k"J`G;]^, ӤJo4ohst5 q,.B(Y*. )p @첒EL`PHG_xeDB 6E墫dU `U:mS")~[jնY2r:ռIR+U߭HP;O@rpo׃e)Oz^żqHjav9RQR7K(2j NjU)oL綘(ҢWRn 0,4NxϳňuwW4j@WŒHxmf/չ۞q%vd帀EȻ`Dxg.,AIw$Qޤ') ˯ tWXr8pbx>WJfMHRH$d1REFQ;\ @wpKnW@r:%@~E 0:oo{CCPt{^Ƶ}-oxLH۝X|X5$=u%x齧ߨ{czk)?jn:ػe/@.4m_5bDНYձe呜}B[%Ĉ~qQ3krt  ?'d{Hݏ-k`o$ w>6gt^c:zyԒc\rR::f _ :[%nٷ0wm=@uxjw9thCzɦ.ꉪtJ D|jp&\Ihi*Y0^A씈jp{[XI.,M:O}< =ȏ)" Luyj%yxt]9hs䉃q:T,#>OE|UM]um-* G7BՁ+h8E`%ŗjJ=@{=@M4-v?!vZ|\+0&Ƃl1@D*}G 9@s)y& (pEQEJ\_#$?eZE 3)-y/_<$!Kmv<1a/3F j)a0MQN^-zP#\TxM-Цhn-AqOʼn93@6~wԾ0֖TF! P @n?NCz/'Rm-/`ZR}5t<ϳWRT7lL-0ʢ~E8A>t@1gvWߞnJTnJ_ x_6K_C  <\L*r#@^V聋`` m+5h6h5N"mۀ˷$7Bf~7FvsU!n=@zȟȎ%#՟ʩt4G)#"_kȀfkؤ@7k)LjojQAӉO\WY =\ =\Ap p,WoNdY~;cվYK="I)I5UtjՖbvM%%/V%8"D94P9=|.PZ VP~x{: ~6{icnʱ2_o{mJ]^/dIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map14.png0000664000175000017500000001265712412501752021150 0ustar brunobrunoPNG  IHDR@@\9^,PLTE1 )9 )D ?<>/, J@(X3W W J@WW J@(WPWZZZZ4ZZ4ZZ0;WZZ4ZZ4ZZ4ZZ47>j J@eZZ4IjkE@t%okkjokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZu jlo jlZux WZu jlZuxW@ W J@(WP@W@kZZ4wkW @ZZZu|BwBwZZ4"ZZJZZZZ4#ZZ4 J@kH \:cdni\swerut\ut\knhclabm\zb_pm\m07pagt#ZZ4 J@k oE@\:cdni\swerut\ut\knhclabm\zb_pm\m07pagtk*J EZ`BwW W J@yBwBwTlI5TDII6lI5TIAI @AIAADxI@ZV,2ZV,EE@@FI5X@02jIDATx[ݺ* - FSgEMw6!*"? |kMY5_ ~ڊJj?|Lb`6R؟_ҟ;uj5\]Ck<YO794_/Xץ)ػDw/wzR-Wzhbo>~W/O??8 =hWL?+| z~dݠ?/A?;~?ݏl)@.UϾ}E@Op[z!VnVt,J\_/{~s W~\E,>Ce߰C|}Ǟ^[> ٿ|5thъ:t а[e 걃r |6?T|og~z-ho]tBloOb^f_Jpp6HS|/LCY?]U7(~{O!b-]]F J/8A {~l/ᅥբ}`,zMD]IAO]{hv7M*# Ov{~B|< HhE\u:>mkۆ> ~`OTRv|'TB]k y9ҝ:u8^G3m5Z[~EL+cw'~9 >=pp%2~_y]$z/ySsoZ|40tʹpzo^'__;Ig`jDo!vTPK)L~-}esbi[H-LggaO5nC~ߑU~7 @߆FJ$Hƞ.R2GZr}n!P8|/0R 9REBsڧ 43H p+gȈ2ZЇnW~O5fzW2,vĈ9=X0z;( EF0n }gLӈd, l @‚ _ F<񏃏 9;\%&)<1_iR {(qۊ| a0Jn]UsN'+:P0"'C ЈG .@ /n ة?=W+G  sR =$?De8<(0|A"WWgS`ȥsc\5 /l'SZZriNkh"!?kN#P~a3Cfk%aXx5h CN5IK= B C3&`+<(䇠ŏ( 9ܗscL7UE3bfckGҸO&d Ҩf) vO1#ô JǍB}Z{Fr1_''2}gȕ߷e 4ϡȊN~*z'?.0?8h22n$ES£/I;B8``dYw "-chֻ+h4a鿩9ʭ]CE$4xKDZf` ne M< -; QuQf1HZ9SǑ(jdOc+N>&< =PݐN$&#Pg+?PI:eSCgԎ&l6-Ošd'Feqq.9z3 &,"@$ !wta]W~ >!AjnTm/㋢˴$|s'~Y#P?Aq6B𿦼j!xeJNɠM M rf@j/T5`|Q.@BD˔ T' Ӥw,xO_PFVG{T9_VA%q-@ V-xe Ӊ; ѣ-K{'=j84t[|n 0B dv_@w ARBkS(֧#ãaR7bm6xQ &=#?=ґбoHA\eXHЭc?F&#g@c JP  @q/æɄQЋHAh\CeN r!P0L!Y}*0ʏS#KKH0q~j1rE(J`[R84J>3LK7x"pCJb<@m9/Fo< 24'< X °fÒT酕YၖeZD.tH#У Ew'%ՒJǡ-δt+hs?kˎ<00eI;"L-JMބل44D|hnE&+#g,x`Qr`$ryZYAIfUK?~0w7،@_ A =b"-fyL֍B%*W9!<;BN|(90sdf╯OِH$ 3r+6!+ή` \ي&8<*g<%,#Lx`Jۘa(;g %KX,Q)3*?.hky|hJ4`*,D3ЖϣыHlfq#x%bpxY$v},-mɽ~1U~O0Ƌ H`8֋t4R?'c<3TiD[ݽ_!Vpρ|9hm^U^ U+W,SRu7 Qhu}?W!P?T̓T6{q5/tfh6x 4Ӝh7_zW`{$IKE&X?Pȕ}( @*F_P)RVUex){~@h\𿘽$!@BGXny\?x[DӅ~pU6Pd$̈~ L6q+*HU,x3Ѩ}<ɔ UD 7sO[yeǗo=䞟hil( f4[;ۏƏ~Vؖ5}Ztt{ߖJ':إ[~xWY3hmV< /<8 #4\zZ?/<@O c_po o[脆7/LЪ'\WG~G<uL] 9ʿ&Rm|ާYi޷5 \7 47%95Fpb,/~ĉ. ',L߿Zں00vz- lH5o5U]=MaxdW/Oy[k;`sn &?Az_5/-nm-vC0}ݚ[ 8bo47-`>/Woܷ'}^Wg~P}~#/Hn.ȯw?7a~3}/L>-¬v>MP>x^IT!bIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map03.png0000664000175000017500000002074712412501752021145 0ustar brunobrunoPNG  IHDR@xۍPLTE*7EfLee_E/!IDATxڥ\M{_fffaib%(Ybp!9UR=}\T*UJ5M&7xo||_է,x>O&x7ܦߧ ^wi+ #fK6O.SOC/o~'[c8?h?|t$8k06Afܻ~z#㻇x3~^>GqhPH]rڬ/?ً&8ˌP@ibxobѣ7ixxm߆>({xq ]5n+Wzo|_4 g¾(ȟͲ/EUCmMJ9F y+}GZ/x{7<`M|=hyS3'h\wB|.)h}6{u7Ϸ3|!꺬K# *kcN1pW~Uq ,(}{[JOOߔ'p^w&x R"f?ӈuBT&<κaa^U ?#gx|E!H#W?IG#KY9U,􂻘xz}S/Í ؾ#%t\ġ={'ރp8Z͵×?"A,7c=۳ʿM0vtwjDGk&v2 ABF2) x4,xC [klM t[ u'gbے*ň9-8wM~*Hf/$\m0W=#Ǭvex3\5x 1 ~  +\bAwIvk[YO0ٺc.?e.>RF;XI:!ɏ{|}sE -)lRqGhc^U"6O@>\PȵM'8gXU~G$/@}g!Q/=[ ?6[Ld"nԦ)}_=T'hr>g?M4w&'=ާ Nq VmNp-{dΑwT~ c`!_m!6@QGCqϋ {Wd  >/_Lw2@&_Nk~N|.f/_ӧ vPm86*_wJÁ.^^Rf˯` Eyj\;C ]yfÀRIc$BCyӖ((>J߭ܥt3HquRyܿY]h?^UwYow9Zƻ*3qͰmgQA,oوWm"lp؝ќ0>j3vmم4XFݍuOk1SٶR<!5{oasݕUie*nؕoX>H?n/Q Hc@V FDV53t/X?zfpl/3H+KZ20”ݡ[)lE?宙< ;4'zJyu>ޠi0tV 3\RU8ùw ǧvEc:ïer`P nF6z+,0,2q5zf53";R48"67 ^{./1]~6+x `3^cҾL@<\W=;K#{5i1=f ܺ-/.̎o&ѧ_Yε" ߃ޏ;N`p`*|9?_ή ) UPn ;}^~̢x[fat:X kRT08وOYOpUG_p.SV3 ׉kImpN2hN\T>>sުI/> 5un Cd."("NO#R' ?nTWX^܈_1y7vV ItO1GwC=Q`hh-g}߆a.A־q~Ŀ6!3W E 1ytp'6@ 1p̩w(`gXAKЗs >yN1n{4BH_ /ml"5ŋbqX2pnW=E3T 81V޺kd9A?\7 h_,5b>Zo=.*OPK&3b p<p#*A7Fwx|篈_l~2A(ÇσYtג*72dn#g'%c$Mk6l"ܦ+PD cVTf~ _,85Kzrm}G,AW[p[pl*KqE/OuE7wo#Ac`fJM]:|3Apߌ1A eΡ@p81ݣ01 =ϙ6dH/8Fp!C^)4-b͛#/K {ѿ{5?C>i?tȘ}4>rEk33AA89 e_5SfGMj1B0qbB@*+8[s >ǖ1Y?6S,XplbX@꠷W*J8l лam~@GG7韟yG]nLZKkOb"ʉ#!Z\"PtOO_!Wq2o⸈u<2=fO,8WDYD{DzX  6uHwv]Gwb8=| 7䟼Ы@*1QBzς U?zIe}8,M3p&mo"ԉ*^wFF<%=N Fm`-[p_ïb??c$c ާ2>- Dz00Q羓%'gb5O*!,=`| ;Cx,!'/~B ;clHGk/3οҿƸ0[~×g.pd9. |DKH~ 7Xt40>|.%q '܍!=&y㒾`oPEX K9 n"gĨFT3dzl`牣lUpxK>zfI=JsbS+tQ^2X3boԑT AF`[9vƸ#Ȗ.\w$#>}z]~Q*([i؃Uo߹ ~9hj26 ZF:؊ٞQ~gjƬ<͑oi72_>9>i9ZO[Ώ_`d?䙓C%yq0ۦrM'EApz8M[aCs(?Ao>/4Չg>g ςY-=㤼.>)nbX?G_RD<נ7FeIoGaz\F<2VhWYTaҷ(5X_Z^g_pU۷2+h?H0¯'|<"gIZog1dp|ʅdY8HBc3_BT6xPz⯋FfkCHrB`# dzzrsL|_vfI Nr WYEcAV̒m ?G {zn&KŧfLdE|ATQ6\LK/%]a#.{ҳ0ZıN S1Vp7-cS)`IOYgXB󢂽|bO}=2, xZq.+~IWUϗ^U1  Q2oIHgYZN1'>&>+J2sfpOw5M<.s60=$݉gK{/Z8y xD'=}#'iNyi~*gzVÝ,Ijc"C8> ruD}yǥ[#@o=paxEB?UX-+]ʚSj NVzOW?2z%}_pU?X(qwn'!hX@#))`! qT>VF_p_SAց93n%WI6RL%Ӻ<݊'&a)R)1EC0pj' hFY{CSk%p$9-7+.Aa9 ]DE:uC@ć\JvNV/ZHؾ//85wھUDC0Rz= gQKRͺ?ƽ<]cmm2>1t/d},3,ޅxB|O\(V_*\$aLYMEoydU襁3#x g{|{:G!_AȀ;1A7b҃h]bf_k>p7IgA㷇'K$(FJU.&\C@'w745ex01Ȼ%,P3Qk5WLv.*co.̋ޥoGZhf=F7՝ +z|x-탔 );s- 8k<,mEDYk^DGPn^V " BkIʀWaxC/VWWH䱪;M]h9"Rj~|WY._3tr\ؗ\UĐG-O5 rOYJqMcu*)H3aІm]Iwt|)}ld<YgYyW}2k'g)OIM*nXw׈fQ@X@l7pTޔ6w|Dˍ}Tg2M/9=#Swa #h{xydD$ssӷ5 j'yPw!ުy#xpY ~]eB(ٞ^9BpbD lڗH-?Y 9}u|fL-%CY ? ~@4ݹZʄr`ϰdnmŒL$mw|:J0\b]њy+o3dee[_@,#Zn{e\jRp8κ2(|iF`,]Ȉm $Xa5Rj1?W)u;8Zr,\z.H莈8;s+k2>CDžL[?LK0 6%xև V/Vn1O6?+#xZ#e9[ ^C 2)C"KTA΂78vM%ǂ y} =pXG1MKP3Qwi S5XZ4 =wA3vˆNU7]񅢙P);84nD) ^/(xݯj~ɖv km(8_N 2q]_C E}wB߲n}RI_m{.IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map40.png0000664000175000017500000000772212412501752021144 0ustar brunobrunoPNG  IHDR@@\9^,PLTE2R+R:ZB:s2cBs2WW 8`(WPWZƈZ4Z4Z0;WZ4Z4Z4Z47> 8`eZ4IkFE@t%kTkk@@LFE E@kT kTkNOkRTPLkTkTkjOknTPLkTkk>)BwkTkkTkTZ( WZHZ(W@ W 8`(WP@W@kZ4kW @ZƈZ,BwBwZ4"ZƈJZƈZ4#Z4 8`kP \:cdni\swerut\ut\knhclabm\zb_pm\m55pxcp#Z4 8`k kTE@\:cdni\swerut\ut\knhclabm\zb_pm\m55pxcpk *bEZʨBwW@O ?`ho?&Hz/2=0Zn$~ EP1 Ljrs)7V[W )et l1*."QbC 5/)f?q=`W%<}?KuI]Ph! m'_]?`3?$,݀Emͷ>7Jn1ߎvVtk3?>\0ٝn#+m" h&- %?2 BP&,Js)EG0zP٦7+ I.fԝ$˛.ܟ&_W҇X.rkh uGu=Ԙ Ē!U+Q>R^By<#rUp DڇH | N2)7I\'Yw"%0ֱXr]ag-h-!"'tc8dr hʠ@=t<]8PԾXTSo`c8 ,\(ŕsC9[hTPTmj%:YS̊jiu:fs$)LEI$D%~?8TjIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map13.png0000664000175000017500000000435012412501752021136 0ustar brunobrunoPNG  IHDR@@\9^,PLTE[CCgKGsSKWK_KgKsK"DIDATxђ8 EUeyt,S5L&p,鄀jy)f7~Iȟ;C<6y4BO-ȣ@F3ģ <6~0M<2qӾfK 27xhMTզ'ݦ] ?u.`l ?3p~Am"laA%A x gS,qƼgp|`ȟ/﶑I3c/\?_^iq>ep·er18~຿\QR&i` {$O q2)^e3ug/mk~;tA73}'[q~*O[zRZsG=0{r0AvK:IJexU ~~i(:/&Q~9^d0Aǯ/w\r=>=rp*[is2s>>?I=>!=غ9\y/ss$ϓ9No ~(oS9ϗxA<5ȳ16%z6z/ }@ޮV{@³OwԠ {FRd!07müWӃ,7_ſFXd$inNdТ9?wLQOxB2H-'~_k R _/Z濍?OnOÃ4Цzhۿ[?/R2&8VƿE@췓pa9!8P1@~п `CnNo)~_ GɿAv j}U , {9Fڟ{H:?XP_N/9;vx/3UbOA3m"|9f ?ͻ-4QFq{j4,i8S$v;Hi0-˩kU9aͬ㗯(>o@R!<@N%Atj:-~%&x#x~qbC@!K|RHG)(K,]㩡`n 6#Ŵ5Xj,kY'4f~zڿdvԽM?{KbԮ HQl)[׷tc]_s 5~\P- KLjT xV϶'`':'fǯ-rW\ƛ˴?G{q^^8Y GgraPLb<ȿ2D-/~ZְSr5SX{)Aÿ>XHTYo{ #X?f өzc?i3#-z1j˥l?}=k3$LS5:4>.(ϭW'C? gj8ݔ2 aؿ BS|ڏh?`.񯣾肬k |H qf78X`?" {ׯ8-F`CV8@cNxȾF@j5я AE+t>>) Nųο'gbt11+ xoa_v2.'ss-~7cH`FÿC"ؾnLg:N1oOYiHD|y|@_{~zrMڿO01 3up=vPjĸvrSppC#`ظB.y Pj#fݯ^,zHANz A'_s֙$+tb7~ " VdJM M݂3Pd="LY},|}ABTѿh֓[RC3uɑg'JzGFxmhd _޼^A(Б˼4~l 7~Zޗ9Gr _Ězw9̂_,3J?|A\^|P)y cM#EMh 5/BZA_s[O Vo0auY܃UWD` -~5[* !H$ko6:k"j Yj.7yI ;̏VXw >=ؤ0GNlf.V_/~~O5GV`#!Xj橞O]<d(RYPh37?jҴ@]Ij2o|]nd ]OPōw-7=הSoӁTG[RrHohbgʭ p"pj~RZM߇^ؔ$n[9IZAz7 TTzK4Fro\jgoߗ[RH:֪Ze~_ teXׯZRh:lst%T _:IVR)˸ګ}Gբd|᱾Q.u[Ik|-8[!eVZj_3Wɚ+$FbQ{+sITG%QTD;7ot-j0?q^O}S{; *=.H؊e K7Jd.39]z9OkԼbE~&=U%KӵaeQ[X_T!Qiioyyr4,~S,zv(},`y% h&[m>Xd9:`ZND LSAB ~>MtWu?ϚCY^g@N>l/~.˝Y@ΏtEp#FY~E0g}ϻTKj|j^ڝ6dI^#`?U3&ak?g}ʙǁF CJYb8~_'}43<+M ?ͱ-!Sp{_&/'S1c؂{i$l}o pT2Ǐ (b/1a|/gp;?-;Hj-P˻}vS{Zoe TQGw",{lllb s j|#~O~fk~+X1/xJu>C{ Cc^&|Oe|{-uϛ/?-i|?vc}?u:xlEWG[|< IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map30.png0000664000175000017500000000723212412501752021137 0ustar brunobrunoPNG  IHDR@@\9^,PLTEZ9)Z91J9) b91A) jJ9ZA1@+>xx8>`ߊ>@*@@@ߦK>@ߦ@@@ G 6px]@YpߵSS-Pl5SNAS,SpzA(8\AS--PSNS|S_S@+P@+>P0>xx8>`P|>PS@zS,ߥ>0Pߦ,@*@+::@߯2@*߯Z@*A@3@AAxSD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[3@AAxSS|-PD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[SP:p-?|:><>x@+>xx8>`0ߎ:ߎ:ߏdST: .H@S-rAXS ..HSN.,ԈX,.S< SNd UIDATx\&M$;D͏[rל#琮l ҕ:zڦwK;zڣO;_ȷ0m-+zv|C s ёCl#>?>ڔ\L[oEOx僲b1w Lz~  LFB ߑ/rFoA1a0͟~#; ,3L0KYBH 9-> ]]3 u "0NX$OF@nFawBV6oB`u,%%oF_u'm Az佮Er c-ܖ kD=ApJˤOd  x9jT:('T%-+:N#Vބ_O! %-{%ۉ9* nVzn-yj-TET2&>1̸jpbb[ ;1\gYPNpATXiD1X\dkqL (B}-{/#)~ՋApFvvimY )knd|3V> ,?٧n1Y- ԩH;WE8Vָ ">Jyh! Hոt6TΓjߗ>+@N1HK@\U㵗>]7:~k8Or(n\M1C#{". 8AB"xvNZDCKɓ)mt/dE8cb\ڎ-NŻUQ,!ݺey`H#lspIa )*ڧ(7ClDܺpY%\0mp0;,IQY"4eeR(<TF ]4x5<8| Az` $^[JD=5 OKyZAw)f(:MC-8&4֌0[R80.TwqVHCQ^/-x +_C@sNDWCdv'oEpUlXmjW+%sK[/-f[_3GrVF̦ɪxA>i#yL <142FgJfB!&S)4]`JOsY;*sJI=^E"{xrKS6"_M0K;䪎ƥa$ ,4ajOU>'FbVG z}3嗕!d|)ƣ3s\a#sAgBh-RTd9ZѰ\mDLeL +8Q qô>l>zmv@W.j};-oЍ?)la^%sXmݦVۃ8rn$XCw?9-}9;K&_ > [3>\Ћ>J!2-}\|ɤδ2`8Vվ߽~W44 AW_*C0;":-Mxk?BK2DAVKvn3H2ASs./Z_}>t_DJbc:` -4ރ rV\>Q͏Z V0 r#fƗJDVZ3a biY30$lgP 2s&FA - ȡQ$T4hL_P1tyLWj:D_|hc9Հ\Ol?./S/ a~+;zho5#ZBNu+L?iQ~QKt29po.OsԨ3o{nyJl1|Jf|K Zq;>R5<'̷*2.ѷ*H zm‹?I0g7oQv[R%}SPo]@U?-} f/ӧaK(7s[P WIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map49.png0000664000175000017500000000420012412501752021141 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE!!BZX0 pHYs]EIDAThMs8#>|g+}`cZ&ajv[z-Y[W^ڲXn-|}5_X~p8ƘeagLҳ9A?JYmUն_/70J PC_Qϗm_ULqpIxTn +0QsNVH=tLM/KGOr9.WtY=8%+Ŗк0@{o$Tdbwt>H:wS ֭Df,?:0xZ"{ǺµV1a-4Va>γ=.\rlesz}'sF Oo]|7< `e'?R̊lDž`6pD@e)>",x*4G>8]W`?'_vg0/Ș{JGkDbm_vOtwBTWwνF#>ϐ-%F@qW\'[ 4 `X'ݟ>8pq ak^q,5)S'@~ U.ŐڇzSz֑!-x͑xI4?W>(c_qCe(4ϾTFD`Hd >PP !ƭ@re̟mfF{x$I(Kب64cjbs O|H{|dk^! pt(@*7Ӏqj'F@~e~&Kl@; dPǎҿaYI}a8NgE,7z@W7~%=Z+˒Oħ:h.f:bG>bvNY.Ɩ 2hK#V+$Rb6\5cp3ǑaJ{&sމLNYC98$!lwzco$9)1]#gst舀>?._ř}hSд3zuk̡}X\q$CT)߷_4r&)l}c#瀻Uݭ8S/>esc|GJH`+խ8S/<yDypgxq=򍩏\ŀ+߯1GNN}|"nm%>2Ғ|&,,Qˌ1<x|d]F>`|i@,I83-ߴc[׀n5:uY6>f0tk$ #7HLnf<~+_pJ/M6#8jqo7b_{|#֦tc>OřqriC{_vD}_S8E|$Rr{{D4[U䈱N9ݘkǀ+W Fz|s0ӹ5/Io;gʷn} m/2G6 }|px?3ۮ4Fo; lNIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map64.png0000664000175000017500000001226112412501752021144 0ustar brunobrunoPNG  IHDR@@\9^,PLTE1) Dk G.<>|/ H(X3W,W HWW H(WPWZ]Z.Z.Z.;WZ.Z.Z.Z.7> HeZ.IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ`PoZ`0 WZ`PZ`0W@ W H(WP@W@kZ.kW @Z]Z`4BwBwZ."Z]JZ]Z.#Z. HkH \:cdni\swerut\ut\knhclabm\zb_pm\m86pagt#Z. Hk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m86pagtk* EZ,BwW,W HyBwBwTlI5TDII6lI5TIAI @AIAADxI@Z2ZEE@@FI5X@0ƚlIDATxڵ\I`_.0̝rNҙX UOMxߣghQ^}޾g>=G۟Fy?o+(}o,t dڧW^G+ Xl'ʞܞ@j%T~<#&[?,TDZr+8Ƙ5q~vn>ޣ}L},Fs # &Aot OcP:98|xO3. JŃ%15b_MGoӝnدaVԪ.-XM8졜b#Cӧo6%C`N y9\:~!9t 쌾 S{z!nZ:0otv>lKfBa\eq: {+C i6&\Z-ia-3<5Wu*'˰J߃i8Wv_m2}V8$# -h4?Me?0Cpir38lu{# > n'*zaK$!CkK-߼.͈J6}nBSVuv\'Na犣W׈@4=(xDO6hv7uKv0F7JpB/%B:Ԟs4z!zmc-OWHH "#KBxb86!g!9@ٽ)f/c5p.;uWd#ހ>L9UK6}V&j|HS,Q/t߱þ Kf o1)FBO Id$»?և.l/Jϝ}\WL@H݈rov56htw Ky .I!90xʑzfR>F.A356n'^Jf%R+o%d J}p}gLj$#Zq.aHSF>u5%NBẗ@L!Jn7yj®VV2g3kD4$vxL(P&TA$i$.=TB)J}!xMשTH3x`,"4y V T) nX.rF b# r]r"{D?EBYaV0,}bgU4pp }￧[hXh:{nzӀOE7,^?ŵ``B˦ MO<x>z*qa9IfЛ{Po93]llGh)좼:gR|tW-_:qWָfNiyY}I<H<7",L5+:  kD_r^jg\^ۿ_ ^ ٘lBޣPFMW<vyd: П%\\Xo>IyML>Q ܁Z=-R(;bK i0;`I1`UA(1eQ`˵seX:$@)M|&5 XD cҾ;j| G{W$*b-P kqC1C.C46򡛬{r%ɑ%(;r(@]*w YQµ'saNV Ln"l벀EWd)$GWR}?OX=WGmO+?K BoSfjR^Df:>d(9ɾd7+?H)ʃ$3@#"5o- c_BogKiy (d=8vo?{hx38֫㏏u/ Q(X3W,W QWW Q(WPWZZpZpZl;WZpZpZpZp7> QeZpIkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ+hHoHZ+H WZ+hHZ+HW@ W Q(WP@W@kZpkW @ZZ+LBwBwZp"ZJZZp#Zp QkH \:cdni\swerut\ut\knhclabm\zb_pm\m76pagt#Zp Qk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m76pagtk*N EZ+/B8Q݈T6ݥy+rڃ 86piW$hO ~ [W Y}4]&1`c̡G[oה&Q%/5~4D\MC;'([cUyZ4o#zjH`(n~j.|⬊h8̯|$4bM`5d&oN]svOz@ p4 WUt 1o ΫaFG*twFʶ kO.@wh'%Tdc t}»넍ɫ}JK0~ v ;c7wM``3,y` ǁ*@bу3\R[|$`  ,N!YVnAbW4*OBѐqA P3IB#5mI> 9\@ W]SQswi-ܥstlG6YI=&}>䧓{?FOu9raҋ2JnkW3Q'n7"<#=;n ej pEcO{U9Ժi[=^v/wY4SPVEi_gv)]dֈ(>^p+"ܒұ[O[c/:ݾ~lkސA 80U$y8 .*P,>Ac:*EKO2#n:Y lY=p*Rf3~`oPȏufQYЛ 杅됡\*|XrPfl -@-.arZZeC *-ݼ$m;&d:='F ?|{-E U*@Н~U>ȯR J o 2R< |mИ@`HA%4pȉ^c:IhvO6#`??kYgM ,~l }z(@z!SK7@ |> %Ԧ9s髙&ՙ7)u)qBw!-儜_+(yA po2]fr \.AOBy7g@\+G zY$Eڞ֌%ܵYN{?-ldFjR_عydWI|=3Fu)Ixf> $FG3JbXnr/oTAb6]e(QN]&n7|n֑9-5GM&_O:: KD(l#$ a`uSQ&folONb˸[EW°]&eX|Wl[L涃ƄsCҰKmOSa[`GJCL 5h[У>scӏQJ~(Hƙo[`937<՜#ňGԁƕA.܆ຑy3*H{옊[:*|z@5ƨO3No4~J=arVA45y\嬒cD"nVҧd~I0 JM-&xkð%l @)[Ov쎷iԁ~{Z1RJJ.5o50mu.<ԐG>a&*m A4yfOP#{KmD|Ѵ<"̼J7{p[fw~nW~J3$ϭ[Y ^lcS WEJdwO|O?n9Ăx)@It;6cP8~QcBuP5(-S<q\'3_N-iP|Wz}"^̿EM>KǾ0G'u@KGT9Q! |?jV%'@Mnưݖҗ[Vid`ț!-o=a"zE͢=Z~FF$ t .Sߍ:4 ş}ρ_DNgn w ᅠ%DP~{#FoF^MУ`,s*lZvR)ViX"z ?qݯV#rMԤ곌wPCs ҳqXFa'W>17=JUGW8&\vG8쮹?3ؤjYR?DN_JUO[)q:%E\~$ |'~#hD|o.u!$7A*/T 7z 8ۺ=z,|QNbMYׅc~3}_߁f}zVn|!M5}E~ńuu\ 掿O6(yq:&#lUWp|.gcT,Q"m~o)]?"P <|±P|VGz?|ϞAT{J J/:{'r1Gw.'5x? 0N`y F&gJg 8ҧj BIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map76.png0000664000175000017500000000422012412501752021143 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE))  ^c0IDAThIo(_%RgRyٯHV8 fz).־iLiZHJ[W;zZ}{?0E^X~&(r'v{% HnpbJRu _|woVE@P$mX}pB*_:H5`Zky(GKBT.쮑jWԤ&puf0i,%K\noG[f< @|},<}aQ2[FFRgr] ax_>r_m"۔]k@%dGYfah?L&<3 P=l6p ` `~ Xյ\VpPREa06֍V- >`#+6 _ >yxP0+6^a=#33ǃ *@lto9$pz2!3(hop'] ȫqjGGgfȭH@Olv (cP'<γerza@ ^ГlVD/K<yp@n1eLDkvbvy/80p΅,i(4M #[)5$hKcy4 O ҚWpM]0i^gissi=S11CքYl +3 V>BЀ{v {=~> 5v,,_?m  <6CFs+<+zh7$>-@c-BK紜`aoS/>=#2`A6Oou{x";r|Z'~4*B[28{}͸8CX[NiBXJoUӑLquuw5lpvJ&M \~/3xvͿ$CYʺëpPZO|^}@)4I%1CBHkh,d̵@4[`BU d5 )E핀zVh_84JT3fb P'AB-y xVQ+8%^-X!:FYh>௤M"jB?  wkH̀t3Q] جQ}c+zjir^w뷺rHϩ%dg=I]!n'[_d]x&g%ÊAPߛSmZO%=NaRQMaj=m~ e[*HI~kk E@t%k> kk~ @@L k E E@k> klkOkTPLklklkOkTPLklk k>)Bwklkklkl$Y WY$YW@ W (WP@W@k [*HkW @Y|YBwBw[*H"Y|JY| [*H#[*H k \:cdni\swerut\ut\knhclabm\zp_pm\x43pxcp#[*H k klE@\:cdni\swerut\ut\knhclabm\zp_pm\x43pxcpk@*-EY Bw[,W YW (WPHyBwBwTk\*F 8[*HkEb p4|kFF 8k>FDxp4|DݽFk,k> pHYsIDATxђ E}-*hrIС ۬p9 VdIYCDaLHdW$$%H aA"k_IN%Io&J *ݟ8,=J(W7@;(VE(F \U ^.Xe9[Cj\]倝&X5ZQ.2(4iX:A9_H HAnl+ 0Pm pM(*Q Uʽ[+T,+xɩ2UPɣB7 &6H~B$CUvǐI]Y~r%h H_B9_*^ @e7D"|DR#+('r~QIK(~.! B5(4b]~4,bLL謻nx3ejIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map02.png0000664000175000017500000000770712412501752021145 0ustar brunobrunoPNG  IHDR@@\9^,PLTE &% '6&-uu'ut<|uwvҼvҼuҷ(uvҼvҼvҼvҼ$3 'Z~vҼ5";b,iA"wx^49;cb,A A:;?rE9AAV;\rE9Aʼnu37cAAA% wK1wuyJQwK1u-u'ut<-yu-vҼ*u- wxK57c7cvҼw6wvҼvҼ'ԉ<ny/ObVzhcfaQbQX\OUNQhT\QYN+\X\vҼ'ԈAb,y/ObVzhcfaQbQX\OUNQhT\QYN+\X\&lbv7cxu'uu'ut<|uf7c7cA@Qc%vҼxcNhdc%AdbdbҩdA IDATxڵb* xGr9v+I t{hs~a}X}d?GsUQǍǿ1vj@="ؠ*\J~)}Ua;Ux#&sS2>]gBC]Nߙ>oJ~e̿_ T ӨϕW⪁%cSNPŪQ1|9 b [fJ>|TYYP`1 `1c&||S\5S=]"@h;iEH~ĪaylM- k Y; _'B׳5:9 Tj 7}51ִf0_@yo{)x@* dPx,~Nag~ (x B RdƋk1[Hf݀U`,qb@1/7(چ_#XܙA*XкHp7@2S4}3S82eC4`z9>=|V~wu_BP f``.|^F|T =yIq؂ cLיÍ?@)  Ky[sZF5P9-v Vf)8hV] 8ީBhV&If{:M`8XsZa>9pY}xoG4:/A8N 7 (e0b1FZeNW9J+;h~ #|d6B\t hR^\ ?5ARepUEelRbTWIH  ?̠}x-y OfPS~SJ,[ ڎ]k'$g!$>6( ` mC6L@Dxƌ][fV<@/8ϻTMeCPs%7 .ZxC^Y-qM&ŋKKm-XxV `0Tͯc^JflF @z %|{]?d*xoOeى6>\O#Y# lv1]mh˔eG~rD[ydZWpkf<ƫ"?S ZCL"߇}4MٲxZNpڽc9a~:/:uBu*HO~zsr6X-xwH Pث)@,w G([w bR7Vmg7e~I<9~"@|.?H%YDV;x6;t56ݏG:S ,V r 9r%&U-z?P<[P75[*PUbGs?LA|}(|,fJ{_ w^F2nob@OoFNQ19¿=g _ K`DLJk49?Olm >oؘE'>0a,;^!BzӦRoeAq#;Ԇby{ԏ!>d¬TnjÒ&f~oBB{1<`% ,n|29f.كo rfǺdy׺@sP+7|>EկρZLݝc]yCx.AT #uH{ĉd|tt%;$Ǥ{8 Z5fPTdkv_BZ?|6^# Ah3 n(pr!S%_r  ` zSآGXD`zJ?Q,}rͦ}gC?1F!O[7TVP~Gd@/=68׻Xk 0 n:}}rQ !J,SZeGȄnL `-@fi=-+ܮ#wO}ٌ :@cS+[65y9' 7I nrcȠ~.LuT7C5{+l OTPMS⃜`̫|{sǓ:AN_%L y3 |wJ|[_*GGKn4J8}CQs?:aF`V[2fp+vHFv @>= nk#'{6O'}C\7*qGO0BnkEcb%] B}`k_|rEbOU/kqԪRFȡy)T.M;R_xVծ 0)ne底F0.@j 0;@l<*n<hW$H{,@ݰ;A9IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map04.png0000664000175000017500000000547012412501752021142 0ustar brunobrunoPNG  IHDR@@\9^,PLTE'1'E''E1'N1<1NYThQ+S C;;nGm,m;o;m;;mfmp6pwupwupwrPmpwupwupwupwu KSq;zpwu^qɮZU7 q݀/e4jfb&ф݀S݀[e`jfb݀we{jfb݀ejfb#U݀ejfbo;#Uo;mU1m;;mfUmUpwuxm1U,p6o?WWpwu4p6`p6pwu5pwu;]rOxy~rzrr}xvwrwtrFJv|5pwu;ZUrOxy~rzrr}xvwrwtrFJv| =' ZpWm,m;WWj Ӂ^IjY^^JӁ^Ij^V^ UV^VVY^Up Fp ZZUU[^InUD!AgIDATxv* A{W|* ;Yfg%!*>햯RBk~7~+2PT=ޏ>:7#%J{Q1v}t^Zێ){YRQ3׃. @ӛE3+.}&zY]}# m/@Hw"E[yM۔ ];PhTs\ >R]ڏol.ZDasMXHͰ@[p:%Oݶ?":#6~$*G{PO=GѻNnAr!c2HvH5>&v9i1LOb/I#a/jbۣpۏ9 ? |%Z:q4o$Gw+ӱMnxL <n""!~^Hp"+)GqMO8O zYj:,5A5hzk g)#ڥAGk|>~uo3 q틚wz | 7xSq8.iF] Rsz'#XhIxcx?dK,OtyNʛpܡRN߮ˡ ~'/yqiGqSQ!5L,O)ĮϡA8w»p͈@KwC7Qn c `d>~JPJ8i<qWG:*:ĥ;sfCsDa`0c^m<yO ُ́N0X?w+07v}t ~vymOWQf^;p/$JLsBx&qs4ں@._$tp;|;΁Úpl}~~&It<+ x <6@iOlLx0v:-3Q(w(A/9M?^LDw[@{Nv=1,v*JzȎK^A#-v^[{>Ѻ }Y+?S׋ &TmJ>0{ᅯci^1`~J2+w|xzC+Mo5(N}6]=>1}^Z4& n@|@w?@;3%׃ uO=@M]_|Å<\WNs\!G a~CUmo?uZsX'|ЋwP?-?h*뱀0jYP'֪Oa]ЎF \*iEԑ96lsup>?<Azl9  7{́w^5[:3ʡs cD?1l~omrA=7ޓ%}gB!;-?Ie}G(]ͻh@]BZ.?`pwiy =|G5\KG0/;?/P{҈oZ?jíGIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map53.png0000664000175000017500000001174312412501752021146 0ustar brunobrunoPNG  IHDR@@\9^,PLTEZRRZZRA9ARRRZRZRJJjbbJJJ,Gb5Y{,9;rSs0IDATxڵ\b( (/^ӝN Kޫ?Dۿ<辿g?=9_ʝ2?`m;9do %s̐bvjyכ. =K_ ۝ ̵ ߂2Ϗ<_8>eq^/O@?%1O@Km*)&̤4ϕ: /tv>W޷s8k<߷ʿGOߺ__h s}_x {gJU&ŸǓ;?iڿ/7={_ {¿g>1`nX,6=<[񏁝'PM-;wsb㍃ix*?/H *U5~wBØ7{ſa`5x'@V{͂gZL߃@3L恾&tĿݿٓV3O:+}Jth`V8,/~KZ㯅Y]\ jA#'񕁤6{"ꤖ6[j4@w)}z@<_%wQN,f2%TѢr{D{%<->}A釞po5 M?ƥ|S+f8Tet`ςL"(ݦ)*=,#|U)y.~9?RGn2e< {3ejNt>!n抆k}RI LWCwJ\7yN$0l 0P$3Pnڽbôeߪ੏,*9n4 cOx~ ;VÂsѫxe ַZ2p,6 "2 +Lp_0Pm{R\x+`%n/6>֢G)^̈́  (g͊ y@{ݷ`B 5]zuO V{"\]Ӷ1 dwG |V%53 \|ݷym^XeBc:{b'OA75_k] W0US40 +V[{~aQDcV]YrBrUR9T4095'O [\ȷz&n1TzC1YanZ{y8c+Հ&8$F4ePe/5Eti/4m@-\7nvE^ o*5wpi˓W3yvV"ލs̬&9q 4:[DW<7R^&|[@gG9R^X ye`!ͥew[q*ǟ`q }G33'R 㟶R̋ N~ß;8*A7Zɩ7އRC>e5wWÓWJ٥βاTJ5*:Kרճv_,'QħP }D^9ȫ?j0Ie ̥[;Va!b;jάl%Jd7@aZv2ugٹq^;GpVq.$fI|x5}COkt=T>N55|i)T%/K-s28M-$pgt:(Xݬ3&BU2$۳H{l*l"⪛ F1UZh~) 7BLG+,ARJ%qdOh7/\]?D;u\Ё RMBu e`Ս2Y?Sd{ U ^'ؘ61 :`mwDʂ1:o- rx[c.n7+<,NȘ*/Ipds!T|g2r (&H8XзpNᬔ|#uejDVhQ?Ar>rEENM<  lK\Mͦ T ڻl8M*5 E( #/<:O5roM ^.OS9Э[у20}>Q<0j֊i+Õس~?Jm0fT@l!u7[Ye?^$*ۯAnON2<(N[J~8(nŹ0^rHtJ8A-Xur@Z;*By #ݶ[qċ`xXa~:j- uh1|>~ሽ %UO / h="؟ݴ~oל.\O5uʹ$`2l8Kzֳ('m%Chg--|F>vW{SB 穒V15R*"c #嗶Oժ/Px +Xe _K}uO$ epO;>b l}$gQ? }ݰnJg3Z:@*$G_:xe0:ñVBBȝ^tm }zz$d4e E\s&x E"ΐr!` ihڨc#,mZ֢1__r{.JS{7U`6ة'?C#o{DFㅁ[.qƟo i|@|<Ֆ! x-Qjδ8aFo[O2A y@£Z s #r|i{ ugKX#7?ćWV񦽃C|BڃN2jŷ*ocyK˫]]nigOS_1FVz`k*D,CPG7rn3g;UP G9Io%}2!N Ϻxh)Tc CGTZ+t@CBudʻH>ɖWnC(錇8F#ZG|T+v>Wboiq+.UiqCd-9j?px!M0>EĶj{TQګLrT̆gf) D'|+~| Njxdmӿ\)w|`p7_Uշxd}^g&,6k&YN$A&oUw'xK2VZ/4뛴g|[+{_ U;.]IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map63.png0000664000175000017500000001452312412501752021146 0ustar brunobrunoPNG  IHDR@@ɳ-PLTEBZ1kZs1kJJb4jIDATh%v8yPKZ`c;fbƒ]}Y,bWR.9P)dR&26ϹZUO@t4l޸]pq\L ZݾnהsɔTJ֍/WsLꡰպb*X3HI&\5ϳ5leՐX1yz5>]xec+Ɇbun-K%Ǵ~[%̡0zxч¸c0g_ǹn`Dm;;c=uz'5 nc|K?\`q{\v4c5&Te-ɕ.dSB@Q1,</6%pdA$)ڶSt!q^j:mz Ef|[e؆hootؠwM?}Fz6$D /yhLԂ5;_I, XY޺:gUP]%$;Ko:}yO*<Fi⏷jq|rD=zb^RV,:YQ8L;Ft }T@z9L|jm|M0W@φ41\Qc j3o_ԸUJY$Od' X ;A 6ˤj@b&d?NK€.pJ_ӵJ"b ~_? r#|ڄv'E%bNB]%Y&j/A0/pEJV& _-8/GI tLbe0üc$m>@\N)% 'hT+o@wJ8=`og͔ lE?C~LN|_]}rz8O@ql/صj.]" &`)@NG]S_6-|R2Em@ DH ԟqc7mvH,|Tq ?_ ]Yf#qP\#]T!yw) /O ]7 Pԝ6`39k/|+ $1Sinn.k/%y^z݃GBOH_nZMULh_nf15'$sho穾婠>|h 7JX/:0MUP;s$k@P!5K׬6WadZ" EϔDaZLX7bEu磙doRiNmMGs5Iԙ0Y[QPh~њ7'yb淾rdHRxW->{d`!_i8 i;oCD-E?ׇ)X QoPW5?H}> .1TaF;_@b%(HSɯ_rӵ;W=` ]F;YU՝> ֯)=yTۡ-|" }o2rAeu>W9 ~\c$y < zڗ{ s[wr2lP }x7xmn`W֐~iCE;y4^]_wgo"S'4}CƆIE;QM΁ ͂2Ih7Lv~ 4ORh[Qp{Pw-U AySW=/ {5^xrF8xQnd# H @jZ SO#nCG0X # 'N4y0E v@(\;iVN=p/i)D`/a!R^V@n>~ikINF8h푌:g|帳Z$Y*."H r7fl{׳*ay<@۴jBvd)v1(H'-{8aD-$Xy9sfQcv/CBO9 گbPR)>lFb.MQ#\ U*vv=&]6gCr͖b^|fS޼-*>'I@[-wUAHۉ="FKn l<>0rD8!JNokĭ}q[ ِ&]Ɣ.n'tެ{" Mɇ]M:"Wҁ04<'xkDX72Jv |#2 ~9#/4PTuk+cGO=8~Jog5 W@f:ؾCb/M%(yD64q G$D ^_SW I.Ю @n0mpŹZ4dx|vu20n3B* abɒj@{Xo8H~\Mmz0= |$h잋wYL|OI3or2h+ YvDZ+8Am^f+]Q&V_%>/h6L^ ǔ>ü}=ﴈs=O&utC&:.Kf%izTϾ<6g*H\A V{mE}2mx 5BrvbI g '0(͙فK>?YŃԆ3Q\wMMn,_A8'(vѰ`$#MW&Tp^xH3Dl? C'kèѽN@R-%4Ct${]&^lo,!*\լhВ;G<6ŅVC5BM^"b@ B6˿dTQSb Qߠ1&[8_s6|?8N}v]`FrE0`֏_\`oki! 8[e㻽>k.Fg_M`V*D?Slz bB'zГvz=8fc%`vi> mo]#7y_J+`fI8ŵK@) ۬NR\{"nt #eP]<|R~}In ?w'/HBCj?KǞ!^k)ˁ"E L˧@^K|G̕}HU}O"StⱢԷS>fnBwpԕd4 JFˆ xkP[|{"87؟mvuUlAd;Epd 0<<ãjGqJ*}9xC՘gގB^1gEBQL D.`8}OyqгjFdca.h@ ![ɾ425J&ga, qDv'"$ZXwPE| IOnuu y\vo)aZoL[=}k8cq} &4ts/HĒhB;fA-D?kJ0k\ od-Wȏ4g 0Z |\&XǼ݈\KzXTmC8gНng\Tڛl/'Mi{c?X+ 1 tR(8v }OCdY/f ʵoqD{dr* f_>BZ//h>7pnMkg]3ʋ1eְ|(]SZW'%UT`4~n5g AIL/NI^0ߗ$Sšan\. Oqge4U1j[YxFJ(8rf!f$WXzpmODE(:Զ o z¹)Gݏ"%<^=T7m 5A5[6VPudw.uPb|lWkSZ??_' zQ{#شR0' pѬD-LWE~5(®}Y4xE(e" (̓ot0RVىWԫ$}T ]P4:՝4I%gϽs5;|#5֓k;6JT@@ub3"K?G]@ZuK~b4hK"MAucݦ~:4Ϙ^kޯkO/h;M!0P=}XY]B 㫨]ճ`qdzn\h6 =9 9m 5)dx!dqd6[~Ս60,MO4Y.q?ofuAIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map17.png0000664000175000017500000000606712412501752021151 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE)91B]G pHYs]E IDAThޝK @ BRC^*#1;-gtY)$AvQ<~_屫o{`m+,?kS>b 0g}l"[GSGxF_~y{\3pA9f_7|?c@8Q`g\m8ER\)س=?]N9fyow=8,UإD+9zLpuTFf,.fXN3 lsp|/c֢W9Fz4 k0 E 9(Y"ܖ&DHPw@6"e7UdE(7UQ.$H&D[2|Ax/}p;Z-3UP@y᾽ W2tDX>h }'$ M_IӿWibfБ@6ȧ87ݞ/1aRycǠ Zu-.>E K Jc7?{R8rͰXpRJաO'j]r JjԶX8ݺg@vS_[[0ݭ#_9=pmL0%LaYypic#\sX=|%^T>t2P 0u< 3E+ UM|C'`}{{K`\ݩw6:eP9_C@(3&A&RVe8HrRA yn:>sܶ W`K\jٝAL8y~z,\p.Clo߷i+-h/_Xhz. 1`IXm kN﮿H VhVac@QKjߣHH05fpO5[U@} ܀hp?&$G@ˀ2Q nK/hƝ=r.Ǵ4(,n#/f@@\`uO  8( ut[u g\fh]g!YMeV!tЁ#n s c0 wkmSnY( J13QMx~RsUmZ8!zv;wM)0qw ՀՀaf׸?v@C.ImPO"7Ę^T@Θ3@@π9|FDS2H̥T$TDXct 6{%[@Z~Y!)rZo?533-~@pCV@_;MI儗X4Հ*_0W!FrXT Gd4{FT>lC"%.ŃzMT}6My7YGY7ڒr_R)1|I.tkfF {dN0'vS* P#Č`灯>l7r\DM}qZYn cE·D(Q`. H7r),~ 0&fOKU.Ӑ>K|O7j#XF72{Y^G֝`o&c{vu9ș+! aA4[Tө0U(6p?]ŷÑP70=#4߃E+9Vحej~;(~ qJ?ɓꚐǾ?y:IJIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map68.png0000664000175000017500000000401112412501752021142 0ustar brunobrunoPNG  IHDR@@\9^,PLTE 99RRA11RA1) {sj))@+>xx8>`ߊ>@*@@@ߦK>@ߦ@@@ G 6px]@YpߵSS-Pl5SNAS,SpzA(8\AS--PSNS|S_S@+P@+>P0>xx8>`P|>PS@zS,ߥ>0Pߦ,@*@+::@߯2@*߯Z@*A@3@AAxSD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[3@AAxSS|-PD2sLfyDkMj\T\T{V`sTYrUTXWUT*`[SP:p-?|:><>x@+>xx8>`0ߎ:ߎ:ߏdST: .H@S-rAXS ..HSN.,ԈX,.S< SN5/IDATx\і m#GGml+O +˺Ktݶ=&e kf:)]~Qx pI{zJ@|'Zeח"%e3G;ZKJW'mhWvY~<$p8 |vMZ#p$m@UЎn(C|Trx-QdEZuYNuQ`7 ?V!ǎ@:tm/䧖K* aM#%\ l#e2lnOAJ\P#VL=;J7@ v!uxh+ j(߄:~{> ^0 ^>\:D7S` ԭMד]?Xb;&ѕe.ǿAq}L:DߠjFumQVNQcODi R,( Q|ͫOrkw-պ^\{Q| 'æRi{ nJP؎b_[YV{_灢|_qC%e˔.[R{8f*Se\-‘~ T ݗ]qVN#c^6I$3tk8\Z9D.5hTVi@Շ8B`Y@[J}g'/{aioFy!㟸T_ #R~lvO` :L ]Xe=?\tN'B`G'I%|]vgHDX]F|oƇbe^STZ7<*[5.kN$U[|#y臝C٩(| };e j,u|_@CwGUvoT|b[8+C Z x/&歋ء3(xS4&I$pX#0 Ç؜xJ`l/dPc3-^Z4ߧ62'%"7N#8h*}h~%]9|ֿi<Jv3_w  ҃O> _.i'%vyE >ҾO=;/HW_nI$x#0kړ_@Slq!4u3q4AaIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map55.png0000664000175000017500000001253112412501752021144 0ustar brunobrunoPNG  IHDR@@\9^,PLTE $j2 ; [duIDATxڵ\( L \@0^uLWE$(\ŝ\kit<ߣ_OKZ?V>NAmyhO=QSob;| QoVEj2 nѧǗ**\<<pSG=: O d| !r$C^BOeNг2ya"ϓB3B_dyzRL=aQU|/c:y|];DA1Wc>/iΏ )$vI"(fsGBw2!퇷$|B/tW(퇴7~9Xȷ}o`i& 4?ލS֐{]cT00t4`\}n)_ƀ-3h|CfҩT,"PQ:x#u&-RMtOV tGZ ˗-m&vuvOڋUBVWv?^AjYPev5 LdxnY&˷X8îM>Z0ł|SԿ]|\ӵh蛖)8s|(PӰH+}u"CS @#]SPT) z7h,Nd'CN%߼43VP?_DbM%3ߌn^#Y?^k/YčolI|@fM Pycj&s0=FЋ}ћ QO=,~BO>S4GWZ -{?ɧ!v8aq#} #h}p> x#()43H_H@0m3 |W+Rg"W]?T ̑P+f红R>N[]پ\U A/$ LHI퍿ض 5^92(7tRMjKjBn9T⠛˯)%_GZ!<}f+R) CYSdʝ~T⳽׭ RV`!/#&l,[>a*tiRX 4'"y?gIZ":g$ʥ>u clo?t 'p*JPfw ]=Jصgm2#/BD!.1 ıE!E`r"X ;ɪ,LOZc, '':R:_>1]X=[* LL\#YT8/(nه,!P|؞;Jz,6Pra3+M덅" ]״ʨanT=ML"`\q c^|nsx˴ P<j҆=[VU蘤 2Sr. SQ`ngf*FyH\=̀hyE,?N^UB"+(Y%UMz}&*_QnhcF"Iw l'hM&Қm?=74AsuUVe TL/6Vo$kZd'1sZ? #BQ~gfA iya?bB"+uɉX`"kRVÏFe{A~{Q/VMޮh%taѯ3$ogYc%-^ؘNV5vzA"S s D2<⪪}:wH$Ag$rȂ I%]۬[DҠׄXtga=OV#A5F"cD|\\늬yw(yK3j?EXD*;$-Ɓ浫|-;j}\s&fvQbZXfڟaV1Ȫ=3}T$Eu jZ.+ǫ|âFw)lU:x gzZmp 0 +O0ט.l  Ꮛ9KСlZQ!X)TH]w]2hºaUŷy?])B*uHABUd-x+lPb͜ǁy?С\ls ЦT#K}4P>3B/?ArBFLBo$bPSqRXz)9oR'9QE%k$(45(Lm,AkF,I4"m2xω ø35^*1hr!:̥꒰0,.c5 R,\\N[&V6U5K>pA[te}{W9: ׅ[GbMYA ~ ~(?!Gc:oh[6גsxU'4JKIJki=Z%BY Q#ܕ-@gDϩV(/>A^MdW$QD"^?>Dѹ\N)f՚I6Kde,㓗ч8)G~]$oE?^qT TZ虼J@ 5J4n98!r[\Q!Sww!zO%QXǦTN>EGsB@҃g/Dȥz'^U}NOljLkIO=i5Dߴ2+PVO$?8>/7'ցCp]bZ'?x6 /ik Q({1)h~tSf;?OhPv[>~^(([n bzԫż0ydMV);\/$,}>*pP[d̺RziU?:1xex3)|`.\>6<^XQjdै:n_ 0_<> ׳t!>>:L._OO͊;Hؙ_,_rF9v8^ٗ5eUZ, b~J SO1Piz}'KBUm&аf(pz&-kc? T(%_-Wf^J/>>; ku,SvVTge'2fR*0};'cwcNQv($ZU`vֻ}9?OMΚoQ)%'rS-9l_NaC"<_ZQjy/[s"5` ~O |?u 2RKroIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map70.png0000664000175000017500000000560312412501752021143 0ustar brunobrunoPNG  IHDR@@\9^,PLTE))  )  9)SnGt>IDATxۖ* RKA홵/^Rg(MNI ^+FYj2A YTsW^YZK6wyYq#O%ʻZwV/am<:ʲO_ bW1ƋNI/J;/ %+zvC?<Vy]Ηϡ N[.=~?@Sa<ϫ$ҳyh+(f[MVtA"4Ab M4 (zV9tm~4 @`'nR$So.@i~ J{*K}_Rl@\Ұh~7SHP˓Pχ|=)-+S L}kp og϶}>&][`SϠ)6@ˋ+wc2@"tvt&iW-<{{'E h/M'/_(yV?! y],x 8U:zwKi7IY7؉`ȗQ(g5c*O >jG9 )Vyڹ̍Q ~҂" Ry<f(U, pRa#Pr@7q[%Sb=  /ok<D00@r 3x\B7订Nuxy-_؍Q~?`A\ )gT|`݅mm A`}'D ~BY_,} ^IU}WMVq`m W}>@-\g@.:@+ڌ`6n1}\D\;MnHZ}#cA/m!*5!˫vDV /:`0EACy]H?{Zl(xЬc䮢?'W(`ƮrMs܀P¹bǩI-zolsޡ+~T(ԏ)/\ ,d$w`y^;V?RNU A{* デ__~4+tn!S u?z2 ~\` /ζ<xjA_|`J /Dm9 !SMA ^!"$;8o_@sx3co,Sx s l=C-hp"xxIu@f~kF*Biﺑ;a|" e`;R{r> x@TQ8@O/ Sΐ<n`BDX Џ6ږ6y=4cJތ͏ 9$@Jˤd="VJa-fl{UO IV PZ,W-fqƽ@g\B_.ZP7 WQ[ޡ /e>.ntW.T(t_."~E0E tP d'=$@/= 2@p= jgxW Uݵ;Il5SnZQF!n4Uf@֛Tn5ϜgdCmo65`9bQ= zm~+JmԠmPՓmm\H`Vm?tqs\KIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map18.png0000664000175000017500000000555112412501752021147 0ustar brunobrunoPNG  IHDR@@\9^,PLTE   ))D ?.<>|/, #(X3ZW #WW #(WPWZPZ0lZ0lZ0h;WZ0lZ0lZ0lZ0l7>L #eZ0lILkE@t%okkLokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLo@okOkTPLZU`@ZU`W@(W #(WP@W@kZ0lZkW(@ZPZUdBwBwZ0l"ZPJZPZ0l#Z0l #kH \:cdni\swerut\ut\knhclabm\zb_pm\m46pagt#Z0l #k oE@\:cdni\swerut\ut\knhclabm\zb_pm\m46pagtk* EZBwZW #yBwBwTlI5TDII6lI5TIAI @AIAADxI@ZH2ZHEE@@FI5X@0da^$IDATx\і mTQDMڙa4Foȼo-s^;up(搇|0xwC <4-N`p3?|pF+}} 4;ǐ )d#UN4׎|l_  *m: )CwO A~u q;Ooίn `dqI[?}XG`;ƾ4;Q u+ 밾4,\ εv:`3*N؇Aws҇&` 0D!,>xiۮ~nr+d I 4<ߌ@Ò;7L{){' DH40e<4c_݁cE$ 24$Fv].T_]~h )T~r2@dל<S`% <>!\;d\{? 58CF G]T DD7C2`)A8"zٓd#&00ͤvPMYI4M%J7Q; O֏!R$ҘK;i뢛t?E`d}p`ߡH<߲1Kg8KvY:М/MgꊋJ(zc1EL- jrNSsc e&r)o7k-(O1=&Ǡ^c&&io4۫ Áu,e#]=ı{pqVz#Pj/o{AΈ|%9Ukn7Mi%lS2@Ůb`owQ?u c?Xg9D_|] ˟g1%zI`0^>nJ/ =;@-JeQg5^緒| lpno_jJk)APE>n4BWnOTyBADž)YĻTepF]&/4z E@oӠatS_YD+|3ey `PTR~ :XI7j/߲"u6_wl҆*%/C\~P^'X'\@gK\!C|to0]y~" 3'eϿX]/vb˔NU2''P_NG/1ߖ^MɆs,_en(sքzB_O;(?]_]P̏o@?WǚS|k@7H 5AqN+S8:KsO>]  z}0L P9|fo ,p$xW*#ƛ3P K.Y%ytܙ V"o'%-ocA@^e>dnYI=*.J)F?2< =Y2uى" A7pPyNiG#0wؠnRߨNam%9 ` KL0F<-2wdܘJ#V < =WVy\xckܮqP`mzZ6 pQ/xl,?8eM]R9׻S_(nۧ,5¾qalPn 0^) /C`eRvrT0?T>m(fyؔSSݳ+6Dot*Ͼq)ߑ*J<2ʃ<[F`E0Ok-j"?IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map37.png0000664000175000017500000000706212412501752021147 0ustar brunobrunoPNG  IHDR@@\9^,PLTE91)AJW,W i(WPWX(XXX;WXXXX7> ieXIkFE@t%kTkk@@LFE E@kT kTkNOkRTPLkTkTkjOknTPLkTkk>)BwkTkkTkTYP WYpYPW@ W i(WP@W@kXkW @X(YTBwBwX"X(JX(X#X ikP \:cdni\swerut\ut\knhclabm\zb_pm\m06pxcp#X ik kTE@\:cdni\swerut\ut\knhclabm\zb_pm\m06pxcpk *EX(Bw[QW iW,W i(WPWyBwBwTkT\*F 8XkEbok|FF 8kTFDxoDݽFkkT} IDATx\r* \gʎi;tBˑg\z|ï.oxmAtN1h_xFȴy׿!|^|3#b iRXh/2&o:_B"\%/뇯X*z1$hS$_X ( Y]JC=XOi#! {/n)̉p``ڬ w;̃ mR{١2LB2YReͰЈ̷4͢rĈ$6zqD8@ba.B@r:tcN΢TVbG5RrK%;#ъ[ }HW{quVI4}(k/lq$m(7!JtFTfwhXcFrL@""\5`W*>D(f{s`.qQL!Ho;86T ܳfj%|*> -UNb@QzY~d>"V"#-C兰+NPQS,=ԀWOmFP`hf~,,zR`>v>Ptew3r@&."}C7iADתn,tvNl e [eDK s2ЛRuFGjL4/|'% >-=1L%ݘ.?-iɗ*Y+6KUihW>0S$XOs1h`َpw]?l `86 LY/?т  vQPP효5a"Yuo\p^Ȟb㳳g#= ?a*#ۋ"^c|'/:z- H:Y/8@l%^ Wft?x t . o>7&_aq~&1^A9Is,7(( cMDƭj#y$Gvt"$F6!QT~j/DK ـ̉2jZb96Qqڌu-Ui` `6!L<*~s>襓 à$Cxe@wsKմwz켑kD5H.!ٹ#E22^Q#Z,faĝ|`Htt+ ^Yu;Z}| Wՙ5TREjVb@*&f"nzhm6TmzL-':wR[lCH"B5mjJ۬- m_eb+(k!f'G[ ٘_z2."0Y\в5~u!|dPSGEXZ'Cl[>ņܭMd.\ 8 Qh"T?ft6slKvXz[`6f-V֧ Fp "d"Tؘᓰv]B'I,Z0(]U}ݤgj\ ]`&4ʳZQ2X|#gB4).EKj__nrIU|Fk}{r7{ aBJaI6FPftw7=A$-—M:WbŜ9w"Cȓ6ܤs1+hyj2~-SC ICm&q_O9)^LڸS|^P?E|~$cS][ݢjbI;*}೏?ךЫعNkmpRj4nS~{a/l:X6C59p2v:+llQUd7w|:JR5OW>VW&_r/8>BU?|h'֕X.3̂c% h?;9 -нZpI`)UGweWt!gK~y/gMs8w_c,8OoSi9i:y()[6Fワ [)SJW݀?mw;IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map11.png0000664000175000017500000000304712412501752021136 0ustar brunobrunoPNG  IHDR@@\9^,PLTE_wLc:O(;' &UIDATx\ lm*BbiyΒ,YqYy @‚¡\?=W8.#\O z?Gхj~kV+|O'*˧a ՗ U8y~+ f_+*pB;NntT ;*%~ob`/)B=?W̿/峣?X+m@[rg ,{ l꟡ {o l!kqgBD?+o! |4ԟOR{\~<>`g^J0gL_L?gL_N?g\_P;oI lL /=;rm@[(pi^ϸ"~b>3/7&2'W_lk[J;i~j>P:w[>1(/ݘOJn̷y1W#IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map54.png0000664000175000017500000000450412412501752021144 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE{BJJ!1R)kIDAThޝv ʲ999ya4M*ݯ ?%B>~i"YA{J}Vw`k/ [\|zz×<ksįo_Xu;q1sqH.ˉO&{F׿i㗑_77]gsqCjHzov,G~}?115n;_7&T\m߈`]/KNNU%S|!Q|tB- o /oMra%z& k6=o܀@T m'@zDOu39Xue {3Oΐ/G1b .,ᨧY@ZYDki.uݛzS@ZjDosIbۮz)Jp|9źqKW'^:'0[k2.e$֔;ӻ1A~]A>uFC?SGqnqd&etFFK~/f x4iVQRpZ(om_r)^1^ }9k SM8>:!䷽6ˋ} _j G\9t_g&Axc/jċ}.}C|eF|,糑N!/fG|{^̇OrSKA;E-# #[x^x8o CnqՊ`u 2Ans?jf/u~pY-7^ڏ,s3P\gǗ&~> u`.Ų)iA"D<D79IylGYa*/B#)Hc^L/+8"pKXqCj" ROgB"} i8{L̖^>bq ?ϕ:{ܧ+քC|/PK&?s5+,sqajan t?Ս 1֐ٍq aՔy~_)h~;.`SE# X}4TEej?<"eE#V?ֲ*"ZO^&7К5g' &0!Z޺='V&O>7GjsZ5a]Mg?4NX- Kd'ȨbӪ}t;|zO{f}20,9Q&}k{ʿ G[ `>bB0PGs~y4E_hbg4p,9p}]/f/gń J5rf)=c!^_IVݼQ<k>|}r c)^vhV;2 3xa|&tz4ڑa*3 J~, Q?3Wj܍#=?IϏWcaUWi܍#S=[%yqsPSι@n` c9c9 U˼x7 |TS~s i.s_}4+i%K$A8R<7 4j%K$,3Z%DYV.^qx:*X W?dC? 1^IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map61.png0000664000175000017500000000700112412501752021135 0ustar brunobrunoPNG  IHDR@@\9^,PLTE8 0 8 I&ԐDk ?R<>? Pd(X3W,W PdW,W Pd(WPWZTZZZ;WZZZZ7> PdeZIkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ<oZ WZ<ZW@ W Pd(WP@W@kZkW @ZTZ BwBwZ"ZTJZTZ#Z PdkH \:cdni\swerut\ut\knhclabm\zb_pm\m37pagt#Z Pdk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m37pagtk* EZBwW,W PdyBwBwTlI5TDII6lI5TIAI @AIAADxI@Z (2Z (EE@@FI5X@0٨ IDATx՜ҝ* o| wNδTLإ 8n۟}Ply4]~(9>߹ iG]nżo qaz/?88z/?<N@\OC:Fy }m8q0fWk`}SVHo?.`m,rP&܁Os\I@E0hj_8X-#c~՗G}qN)g|^?Yz>Z?-C67R޿ F]99D|qj~rG7_O9톂V9 :qs@;:Hq&Oy/Xݨ_Cr9/clKs|Tsjwx2⛀ڜx͌G]+ z/iN9r^ʂ'?Nj1T/ity`޿{:]V7'iZWg}8GS@=8)ȏC໕>nom-p%׮k:T X?/_ćri哷#~tW1C/Wo6+}}4cR@|U!z}~>O>xBry9QLَZJ(߽ Xݞs"zd-D@-ǁ89;YX _Gy/^?Q?pJ@Wv<ߠ|Hj/ !z< 8-mbG 0h8mCx ^/<WǓoÁQ|):Nʗ26@m.8~\ ȳ9+>QϏ5_פZW# 6_9Ǔ&9 Ke#k7Y֗R?ZDtm#nE˻7ϓVGxx{LۑOCwƋX}z\S58Y~0 hrۥG?gc?Iwga[4gaQ\ZSr'Uk`Ax 8y~#5fK tx+ak%^; mpȗ ;v0 ^5q%~F?cW7y$+OODqћx\ü3 uoB?=vԟK#t7g! ;|E>e[{q_/c&'E?skl woq̫5\u'|;qdl}v" .aN+a#oA2\QyDN a =&.(<6"eR@@UJf>w+'G%x=C^XDZԳZ7+{+9~DpSԿ!{>{׭w&636>I׺oQ?.oփ8eCmKznwU,컂.ݑ ͱD|~v~k>=]ٽFAaO*~ok+~p!=I]@E׬Ӈ;@A 9{[ 7S> x`J>jyD V=vI0wU*HP<*A[uWk< V 'hw3[JH͍ưYm^Ba*̺Yoq``ݹ^ST+,Ghdz5j\`iq{$\ M|+//Dk 9X+8b{ BԾuͻ4?b۔/ìΦ8P]:yBFRh̷ lqH%@\#0|Pes#8BMQO\\QV.cPȆ6`L"_ G n7P?X D`I@0+m~:):^f4Ui/68=u2oj" Įl^ٟ HG ?uT;i H٦I  I:zUxl}Y{4Jha1,[[[XXl 6H !:K,z_;'^Lh&D z hpNoWQWŅ]t`HE.&x'bsi#K]GxD]Q"ʹ3 #Hwf:&I̭F6B+Pl|IJR!젠c\ndGC ȼ4$h冊d[q;Lbĩ}`wtPLr2޲7XC7G$@h#^uD12_@r#`BLn-O9ht/8y+->ZggGv" =r@|W}'D&$V'ɡ@/"'fmo bsjZg;'IJxwD:'bW\}'> CD/u[d*VqhN.@Jun;޸l0 c5/rqVlCԱ +׷,Gi=C"ϺrR5%3JNIRlη">䪯^gT] )qeJj9ʆU'6 LjbS*O* oxLJ"KkyLvdАf:Y Jʮ\a*ˎG_ZJ'AY Ii8B.R KTjY1i tɬ@p`*y 2C==DFE\=oSIu|Y3d\O\J3M( Tp%w yy|\ӫdOq2KKC<˩6d>g'7Q{cfߦ`n`ҰyZ 0/ޠZGSi[ 2?տq=((kmа#BaQ㊫$ #C<͙IZX$[ n%^CnqtU$hiϹC}iOU1ǂн>ja"vf:Y|ſLJpZ`gNY&G>vQ{)b˜[F¶l=Lx6m&wo2lR~%[e1KpCg"r3ɠG{ĦO. Qfqqu}?@r{\QKM^0?k9C7޴ϺԔS# |ȚUꌒL *o}F^Oo0&i+<'3K`# `迺 ?I:’Lv(Hmx}ІXtٰI KPOBtXi.FKSΩolpRa6ISj+G(;3V= B# BuD埵삤paBOtG gFtK4T[6& NCe =S3 aUepa9Zxh̬UvZDbWҬ~'"1;O𲯴',coJm;nm0KhY>,Y*-zU,sΚMu;Տx!8AjnYXK̉"d|kʸD )>W+<]mKͪf;J_H-녘Y7s-ذ ,+j\t삧f$y;tcj y?*>=i Fp](n6ܲOOTqJ(b5mDfnpl/{ug^nj%@aw؀~?8NV~}?gDieus{Sĉ]%&F|ߥ5s(OUx#2 EtAMaLp__![9֖{IG?SrMSU!Ӊe+CkX$iT;by˒1r{RJ>8N7{/bMYxzmrvcn>&#wVruL]lJF^;;nFfTNv& +) ā#b^P']!dZ/3<ܚp="[_sU`ħ*l_@^ QL6tF TIm^r "r_x:DƼ&u*>0b?yEUiC=Mښ"лq, PHeZI,kFE@t%kTkk,@@LFEE@kT kTkNOkBTPLkTkTkjOk^TPLkTkk>BwkTkkTkTkOkTPLX@XWP@(WP PH(WPP@WP@kZkkWP(@XXBwBwZ"XJXZ#Z PHkP \:cdni\sweruc\uevnm\t53pxcpJXZ#Z PHk kTE@\:cdni\sweruc\uevnm\t53pxcpk k(k ]EXBwXtWP PHXWP PH(WPPWPyBwBwTkT\*F 8ZkEbopk|FF 8kTFDxopDݽFkkTix pHYsEIDATxڅ\6  ,J%Z,Gߏ̽e隆_|[am6oi ?oݜq7^s>xf7~쿆_&38ݠGQC%X:J_{>yK vc@-Y(8@ழV^ 9f?虇~ݵ.m3̃r y4 g!_:^♐?x73B#g>ag{Grth*p2 Z`VN]-z~ ?g|z }`\GP73W<?:2:("{:(?=gvczr\5R3ƭL )"?NՍX?WaD]?O>w,+9cy f\Q(2t?_m4U4S=`:] ow/T]G]d̟anhi}s}3H&  p˦.e OI5;wn#-Hl_QKm`x:۲HH>,*` ?}{%XpxߠS ßV)f:溔_aC`06N,ǥ Z,rHs  Nb{Eyk2j(?i1  !V " O]=ClVVyy͞Q` ^y`F{:Wz+\Gv: Xjݣx:>IldD0EGa 7%d=X$ 4r}vjeu+ۿy0{HK5@y|U*z’[PVb0{__8Nx5HD@0zff h<8/缾LJ>0X9=dx@F@(`%Ӹdy̗s4Mq}('(ѨIYyaCCY(e[fDV&s7\Wg.CQHSb> 2SzÔW sPj$Z6-\aOȀnS)8 ˰OH-J0J֏h$(4D$ib 9`[zpx6aݡG:(/|x9NܴD`So򭪱x#|נr*Lԡ0ԑ'dxrRy i*V+@9%R"8B, g&+W/`( N1=}Q}Hb}:IGԗZ7 x ͉#scaC/8xI~A@ "W>I 5fWVD G*=2[2բ#/4'pH0Q'yh\y՞H0B7E2ǗXwˬHlS4wԫO^ÈX29'$=E^8=7(]crh??3h12!YagX:jxe{ܘEXٰ#\QWpӛ[614Wlx5K1|<֖lP̴RRrOXauӃyE?w6!Eȳ)¯S*YQ/"@`|8,@#f|3 xNHHcP\P!%}QwIG7I%`6V쿨~]96QvG 05ǰ=w22jNdPծ /PYp=v 5ߏ uC\T EwQvQwQxʦ Ўɲ7@_V|gBxhwȦ?eU2)4X*u+SSV@LiQ}:OdgNm%4̘)|>AT*Ɓ"YZu+zuk|s6Gl{ (uaW': ݰD0ϨG.$~37ȚJ;-48 3c*/!jb=S;ǐ"BEr:4< ?UG)W 9yiT)Ái:n:0j_H54GJƋii@%<4Ijfn\Lkb㭻)n۽~I?D',! GٌJ\*zX*&iZA96oObvn[N9phB/"ݪEzz8O:9?0hHZ46 %AV\MrI\_.pNm.9RILp`7nMK2C:y_P @PzOP <ҽZ5 s}9Պl)Zs$IJEUz>%UuХ6BMICC9#Q14t \%9cE:Jlʢ+d3=K> @y#ЪWV3L" K5 w@'{7N9X,|jD&oz㹛L0)}eʳdPܴIjf;]\@V$7u0zz/(ĶKkBj? n +Dd^.gcX- RإN}r.,}k`!',U6VxA%QQH[$eaM] oPO$g)iAe*>\Yaw u/t7w{-`t4,-Jh,+un̈$NҘ᮶~zBnھX6#N|cc{ͦPAB%"{"=qglǪ2N)^^U}qOdQy i>*K"Mw1waG|!At݉Ľ0$\N[\ܼ̉"Y" hҵ|HR^c媣2-?@|(N@TxV_<]=Q^;|(|t5O+p,܁g%350͌!3ĭ*ZD^X*b=ƌ@Pc6|S-K9HTmM?0z#}xIAsn_9#o!-W8}B3J.׏u$KB:QlX%w5 "B}Y޴M: { ct_rLU8K.':4Jl\(f Z^sx|.!!gSzFsyNJp0LɴW|di{N?,T!RuH=} U/4-Ki !۶C9 fC 7G6#kIjRkjJs"^uOlAf.Q>^¬'7mc9U`"FŞ˅.~jm2D ON0-=HލE:ʻߍVـQ 5IuZۮ3;ЩrVN%{.9]Mu`vޫ7v83 s@aZLJ0(0XAeSTóe3.:lt=Oe":(g}>8L(Si&=+9*:wbtX(?P!m L#oD:Ud0:L"tQE%UpEDž?A_Kh> iN K7x)N^:y_B$\_n*mH[+.cr=FgI7ԋ`A|qh^vرc}"M79_MgSKM4-˵-Kxd/U&fN5A! Mh:㞻-~/*]5'&>C Mh_t,*;`A  Y dlÖ t`@B͌ܫݸ9ޒBxWv@{MC-2-*,ʿnF!"ȬBM"jOn~i.1;,9/lQs?xe/@(e;QCyw2$Q0SG Ӹv`sUxcN۟sCΩZ.u0L5U;[aKoqS6 V׮54S`M&X腼>:ye' ?Cr,,n{ Wӳ|Z]y>8_l2ܼ4 Ђ,#{|do.98ZT[};w#1c1W 2Xa ~# E^ gFGGE]IH+?S63zôo 4c?n<,[^z8sy8ޕB:]1%* YPqHv|#mU&pH8#R  &&:D[ʫ\O:$2Qg}cL#%˘r;*D#L8c qy¯Z lފcx)6bq 9_ܩP7qF_8U-  vĤ%t+;IJt-Wu~lTƠJMz^8R0@pQlĭByh.rA3硆)VXPF)fX1 |Ҏ=|+{ hCѻ suZCz1|;X?O_&"pz$,BWJy lp%Af8vĚH\x%:tʑ0 BqMρ sN|^eYLoO_@8sPKK~/ Ѐ x@չ#?  z9HD %"6Ъ `5Ɵ SP ~[R9B Y|2f"Yi ߴp~UAXD;+WDoՇRs)@NG],fTט5; 2;q B7ek,=@vgY//N6,6.*H  ؐKq׃22G>8ca1ٺN].|L(? wU $  Mj5@n3.v}|+ ) d >cF=Q.?]qLt\,$yԫEh׆x2J5.@ s(@cVBO5!Kp 8j lXJ8e ثC.~C@{mmA -^_XT/mӆҞˋO|#4,'CR $ Wc",<\{Eǡf$M ?FXPUUL@I^/C!bxa5 {yS gN 3(X\`jmOrPd9⪜nkcb eپ\-LPEgHU, !n_o U9SJ_{Y$Y@@Й0܌0&QίUepD-J} zTSO,q70j0eBQ9@z)rXT/܏$_Z$m`#*e4!D;%\S&&S P;G7j4C`9y.H XCgዟ P*{som™1 Ծ jO /- r2H(6Rfn`im܄tQB4k!&F!wA<ӖVgNk pDQKZf^ ёPJ- ioc;vpZ⚂ N$ j|f˰YTΞ 6@ ۺpg&̪C֙}ic, "JУ;#׹c Oy ?H~ fpnHޟwrwS@mL)>+zqdM/&^@ʬXU'1dfAC>sG?,Tͤ~P i!A>` Q/t+8vTJXZ2ˌ0,<q X4[Krl(L_g*;aeOK7xo'ݪ7}Fy| ?v]Z$is~Q` kއ9Jf[.2 6.)pP?c'@(s%08Y?Žh~r ty/d^`j; KS$*1c`]],|g'v?;^g3XOsSO PsP@pf!cH΄ r *v*%cPh"< R]f+7W{;NRMtj3(D;1~kx(=ݻ]YcG ]L]v0,Q͔~zUGx-eO4B!r<&ǣncV܄xo'~ =3~iǞy哏cK؃` oa}?PiAg! `N `3ʶ>@)"`5fS'B NК 6? 0-a)|u<٩ϴQ{1j5T]Cј o/]S[(fY0 RӂmH&M] NU~&y:)_`>1aWP`IT.ƿ,ـBr{]P@aA@ W͊ 7]K6޻˾~K֞cv4 XzswH@'Ȝ0nfRW%ްC:'qD3S @͞9HiO|Q. &V%uR;|uU ىcu;rY)~%D$B:!>_}H@ƾwY@eB8&c1:ғ; P c|+yK^̴"xäBM\٦/ِ>4C!Ȁ 9؞ߒm~Uz& %}L|> &tC OA] K'1"uWwX :^Y`~!L'v*x^@8q>B9Y${&C{xbǵU5N'?53gxNu.p!D{B۟YΣ<vJP%A6bҽ[;8}So?TJt2๓ 4*XZ=|j|׸%p>~-~YEpzc NZ=ONV a?:cGL;N E Wq~ =.ڡn>g8l?ҵ \N6$3t~<(R ]󇷙fJ5WӾA"V*BgGVZZ_wS=9]8heG`:ҕL~%T}b>I.RfhM>4෶; Ef u$G&ЛxTsf.?@t!dHߎՖ !SMI:Z|>Op~R3FkSq+l3A@g}kmKDtv:֗TP;׿۫Els e. TiU 6B/z;ׅ"XQlUu7_^q@EM4cD:n?1?K qa>+$ǻ4o`IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map47.png0000664000175000017500000001115612412501752021147 0ustar brunobrunoPNG  IHDR@@\9^,PLTEJb<b**<**u<<2ya͓͓w͓Bs@z2yǢ|]$|||I!/닢~닢zL~Ǣ닢Ǐ*E||f2ya|Œ|͢ᒋf|Q蔡~~Y׆[2y2vno׆[2y2|vno4a4Nꔦf~t2y2ya~~d<4t$Ӧ<<4t<<Ӧ<ڂ<<\)IDATxڝ\(-XO킘y3(rEVQ=Kj3Oa>։| gtHCtvf~z 9m@/RE$~Mȇq8B^TVt*~3o Q[3ac?Lv#b [.Jg=ϐ~9:AoiDj~MQjݞ!$v382j0SNǧo,L lalvΎO86Sϟm/m/ًq ;Tuuc|I.t"?ddxCiߪ+Fy /=9S!Np[VR(V'p܄QvF_e'023<:o}`h:HGc: aa bĝ m.gLb~ď#OolkUɝ+8!]T̍Igb<.Fp%a~Rl*[f N>H݂$\4#WeaQ1(!έ Ul wSۭ A(@oA;Q \ԡ<@JL%k('+ܻUԊG }-jβ7з V:=`)&?Idi z_f2" UoaO9E$1H;*xt:`?M b>uT`H _춅j[)ۻjWCdhd}j}Ӡ~'>wB`M/ܴ`Eg=|SKxB,k[Ê-ptdпu*ڟYy@.8J5Is͈F#wy8Ӱ0<vVt?%a3H|dl^X9Bz NjwC"itB EPoڹE8Ŋw%^~:M(MqLq ϶[@n&9S=%֖@[Եj43(SNB DWB8[)iEpęOWfXҵa7 ip@1Ρ`rz2R}?Q9XoZapl={°yP|ED牤4E"KR\B/)jYmf$+?DaDvt6.)"!-rbAz2[ZX:0oW5ݗkU@/`Mt5>H\wo._b&R7)Zp}@|h&>W3:O!a6NV1 lXvt|w)bqGQf^tNhv?M:`ĵSE5ʸ;{ԡ.^Bסi4 G9}s:3<9C6ʢkg%@߭1zRJ庿Cv2b] a3vkV?Ph) $֬R+$@w3pCImz?FKQ^6aOr7jmZ@f)M*ëVv+D$D @"fJ,ZI7tV)Ģt#rp F^nAu-7KJsC 6/^Պ%b' Gte.ΎO}[TR%|6۬`X;/FrOy":HHA,v{S :T2kV6d7y`}} ;M!Hm/.,Ko{$-7n*"a\)F)%oȍHRbu#RŜn%HR9$=DdB9A;r\s53w78~Rxի㺛t)|"[uK^`+E<;&)U9=5 tk]A0F~hUA(z`H5[7}""R?©Nyti\+x] GtiytcHg:˟z*Y*0l?=׃;o_!̒-[cgRYj]Bv"OFY1 ֧ ۟cF!>0#[ޭ Æ 0k A;J㋘-0ᰁx\R=Ɨ0#[N=żvz2|aR웵G:Q :1G 'M/fTS geNWT ˄B\d$u9ڒSJt|8=w;Q8Bxk0{ؼNKxr!ǔc<^Tt'.NFt_9Yk W<>r?ށl_M祢u`j; /Yb0\X)>>k k_ jEt* YsL(5D:/*t!ǔB%a5ׯ{ wqV۠6S2RuoM*׳rgmtX-ƣP8]2Fׅdz_CYtXAsݐnrk߸nRt5E֯T%HaY ݢc?V_ֻ.t`ť?TuX.pRhc?{Uf0n=?`yuTWBBs*WO[L6Js*]oYA22r9P)z~_Ucڧ9W57EHş&m 4O_1B̯d]KXm@aoSX{:6Bx=Jb˲+^ύaB-HsdJ/`8V,G64O)//]j&Aeh3^sۗ>a9BߍBLeZ8~}MaW_GT_F?dzuY@B^c[|_㷜)d9ewՑ<.]K˔ <BwkTkkTkTZ0 WPZPZ0WP@ WP <<(WPP@WP@kZkWP @XZ4BwBwZ"XJXZ#Z <'.='x 8$s S~E/[duʰ+TAx|Jу8K@Hpnv2ms~>S@# {*Z. 4`,ENǾk l3WUyF s? x1~+q/0I? @P j9sOS@EurmnJۢl2J8M*v >G\#sr?IZn[f0M1EK\7=B%Q%d:Lcjyxxoۦ\6Y'5{k)^Aɣ3Fs\Χ8[J1^;tTX]֎ȘtlRG$ TCeH2,+6QkOԮJ*ܥY_ !`Mɒ"yk؏ے Q7ImgN:&+6Gt+Mmm3xRn "Ph?CfhnTp &X;Ȉbr4 %Vh~:G3ՁWxax!NH`/m(DvJmSް/j:Œlq)ҩR+YYׯ1ti=V.1;OD`jބE\Dŧ.Jo/BE w0IӔQLFONZE!=:aOlI FNAU#1ax/}ڰCU@ 3!q p(Sa VBCa i%\b>(ȨRp@ǣoDLmr8_.w@/|F(wѦ)+y Atw6D{<I@!1^Ut<ٙ\BW> 03cđpN*kpu߷+[J9oWAØR~mB9ŋE{V,htz-+ya>^qjB`]Qd?c3 ~]g!5>(Yn1OB8=~Awut&LPdVGEp٪Æ 3B)URB:3byZ1ڹk~^&>%H`)j"x@TaIm:9~VIJ&`w~HЍVZ a{Ĩ`lˢ.u% 3OEbHwU&~3Ai-Z;ew?+Mgzm|{C Rd kU!h]"}_; AAV.O%PDpy>7YPX5Zr$ +ZgI"x z*dhP0 YY҈hn5I-1Lr.l pk(JVY눈a|T62zf ʬȸRq{J֑hkJYM0!-F(,Xg1/)߭5Q)CC؃ś?b2*+# 4LyOPE R-YLlgKlt.DlT߄!qY=}LOjla}xԈNߩN5_jnZZ2e$hu>c7a Fn/?j5S!'5r]S]T|v_0*vՏhh +`ܮM#;K[v9.-[~E,^|fJ`qϘ#9Re̓7Ló?{cp ]ATRfZ`cc?GAo@ؼчdyfj\qp1_|2MZ])EACRE,BI"VN@)XhMms?6*7,Bpv|&RZ"4uӌ0/6d*xp1iceu$Q9S-)rWbIӔ +,˲aW8[$/ 0ol9$Ϳ@#"]jeuSleA鮙eȃƒLeTnU_PaDt -odqN/t&j/SS]+UCO޲gӚt"{6Qb΄2!ZYխ\v1#)j'KUwUx D7Ilhc#VS0Vs8~̉VЕ(mMdžτ#"5/Qܧ%ډ 1ѹgx`,B6}0pz\}|Hψlu2S"ڕ:PW܇& GɟE ߙÌɣW@gvPYJ@9ڎt|gVjj`f)mӳsrT:lewb3qt(ͮsG?E4lCLv0 u k#t|aj;ƻ72)mp#Z黨5rcwISa8Ӿrg j_yߪTӒ&c 1yRW}c@-ٶ,֙DC=[ Xmq2}ytʎ]xӵ?PCl*y^!yEL`V Cd^]jSR71ʊ:_.Q~ߢk@'yŢwc@wb8Bnؕգֈ ?mDYQ~| b<|GǶ;SMSm++ YUHTPd)a;ѕWLKXF(ǘIDl kXM 6dW+%"Y2<{ zQ1S(C:̮JPw஫J*OYB+-ZmyS׬4-UElOwխ~J 4`mɌ}}i <{QW{T4Qd@PTW5wUzo(n#~AF8#͵ \JT)K1fvϒ`}޿2.ϮHx$7rJz=\fVЍ-wBH+(|;iډ` rK[% NzA]JUd-ޘU ccJEq"˿(`R-Qa.Hp^')+m 5Y@r=@b\A0NЄ86$ڲfYȕZ^Vc+*ҪR#}4#fP[U0ַF^؀:1ejœH0TX'yytEL¦\)Ȧ=/j^"s՞95BUPOdI-&8A Qgƺy)~DUʹ&.D[Kwﹾ̈́8"x؁ Z KOC-ֿ30^|lniT'X'.>È\;=h=Q{w Ja{$`M :6tʾŢb=ڋ ]?aUG۱Ah׷jy{Edڱy>.m7}`\ԛЗj|?O ={vIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map34.png0000664000175000017500000000765312412501752021152 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE{Rsc9kZ1JB)skB+b pHYs]E9IDAThލZMw:/X?>k,63SJɼI喾JUW$Bu.TT*<^/]yJWk~n=T7x+-?QzCuv_cӦ]I+#zuPBߜrzCmy;LPK =˝1o|M OE1?1u(<EMB N^NKԈf/)ƛ/|w~_ꁫ|0?86j?Ͱd0Y U-oso%;Eo">:Ɨ|cN~ZB\b.g5}f/gE}pngS疌|OxUP>uie _4n^H~lC& Qvīq b|g8u^R`4"L2,8k!5ΰ!pn[/|0?yf jSid& δpv1,+<]r^mo NTfVݬo?at}.46$¤}.<06R!vOOqe?ۧtByi-gik/+ vusx13@orʯݏi>췂G旎۟d.t{g5#2I h7Yp+WW} ~66mڧ>ۧ8aAo"ivolR料qn,Zi 0L@>' #fxЅh~d~p(/!gw)=ok=Ύp<;f@< yXڞs楇:';d?tmO=mIo-,ˑw/^Rpə?_{{4L6ew}Jk5qhyu?R^sPx$L^лԘTC? ^BQޑt8NDpsF\P2/A"OffX"(T6q'>&BT{N>>%`NO+nGUdS|у%:X:XRQԷdxɩ!|W!ṀUgBf" ¹ xYjDy:O*Oj8Ua Q4 m}A771Ѓb2u=sdos=F"J'{WфWCGi=X/tS]V[~qcDk8Z 'f^p`)=Ն8`M>xnoXb蘟&G&:m-PPL5-e -hYOS^ zlb9AAP8x]||]kq5w9B_87%mm[~ՖΏTP~^ i}$$7^7g&R,yt:iHjmu?}A>&mXq?b]AĜ"uXr;/lHsBoOGNnRAQ^,˰ửΆ!vϬ;VO_~PTRӋ GÌƺ.%̔ݞ1zuC]ʒ}|QC@G鋎6K= [>H)zq-I׉7쩁K>_HAE^J`g4(,YRuny9&1~b,3DpH%>@V k>ycrq`G}Ϛviohkd:%q~fu:P\(r[PwP|}$qp'JC,ܿ'.qw!1k+P1GJ{뇼Ĥ~b`]qxAUx i 㿝3gqݲׇ}$KIlCȱ'Pę93 .8 *ЋĸQ̀_!q t$)ߢf'"a6G91&hAc}q7Oa2ɝַQqM_'V$BK$$PIZqޕS$x =8X?-?ke#փO'ԧ( 3Zl{|e |Ëփ-?=gSI+Sׇb3XJr&sZuk@1^{sՍc<+_s c|Z? B+|~[gɆmeVz= g\52J7pk>6uz'~>#A7d#pƫv$<ƠxtIvZ)Mn-0 ξpizݖvO|O|(w>3 3&lq%7I".`z>_7TE]C8s}RP7yĔRB hm=(,PCuUb1J_ey;éiY7ljr>|7=i˿eO8)eO3HQ 1/puY޺8a{' iŹ7&p#2B.+OHu?oO: _; ׎s{EJoZPN*/7—S#dz}\,}f5O o_a #;opNw+Er<|Q}f.z Ҥ;qq_<$L9/('\j-Fa)R.>f0A_\|/TjcR!g8Tfp.=^>ɫפ*=i?gA3-BWk0.,b\0?2P6]{OzqOpBw8Cߡi{ħcڽe,naԷ/杂? Xwl? DG=`#N t9Q ꁰ3M鈊}/R'ٗKC'#n"A͖LS־rYqwxsc:IIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map32.png0000664000175000017500000001360012412501752021135 0ustar brunobrunoPNG  IHDR@@\9^,PLTEG+G" O"G5a+" XWP ?(WPPWPYYPYPYL;WPYPYPYPYP7>h ?eYPIhkFE@t%kT kkh @@L FEE@kT kTkNOkBTPLkTkTkjOk^TPLkTkk>BwkTkkTkTX WPXXWP@ WP ?(WPP@WP@kYPqkWP @YXBwBwYP"YJY YP#YP ?kP \:cdni\sweruc\uevnm\t14pxcpJY YP#YP ?k kTE@\:cdni\sweruc\uevnm\t14pxcpk k(k ]EXBwWP,WP ?XWP ?(WPPyBwBwTkT\*F 8YPkEb ok|FF 8kTFDxoDݽFkkTl4;IDATx\v#+4X@/RsO&8] TzW/oa_=^~%zGcIA?wx~3?ޡW ExU~_߆/}{jC}<`YcBkE>@G" </"st@on%d Uc}p2G[u{ 4oأܳ1č _\OkKlcvۣڪo0im;ǔp؆}cvv@aQfHq]6hO|߁6э>9IgZ v"s#ڶZo{A?6fA 74wp/Oԑ~;]t֟XM~}K]ГGŶInө`e]H&m]tWZz`0G ;tv7|3!w|, }W<&MWJPBʈ܈XXmHjG!"ifN U~l̞=זQ}Afmq o!lK^0)q _^F*H*{1i~]I7Z/Uފ=_7MHq-D7|FqY7|8oӸ'(U~ L RXPf0c.9 lkJ_g;m3jJsf %ߜy4oH[ w'[F ~usV]f!&mыlTiX(; &Ju{JY;UpBbԧov0d<Ukݪ 5Zj[yURS)q9皥H2 1̃v97ofh rXtI On(NPX_ 3eV4 " }zOoej$Ag|!:~ӖkFS+)w f7ۃPu=.K\c-x u>eHRn6Kyk?7|~_|uXwG>Uu-l"9tXvY_/;V2H}iy>42|iD򔉮B=|K :cW)=.aDgX%{N :P:}kS0?S& n4MrS/ "D,g 7qڰOy -B~#zF:D^-ӚB, /|&6}"8Y7 a^y5OhJă:~Uiy1 jn갱 0TH[ob#sКN~5bJc|~jfvJ'M2c3wN/))%TG]$2re ?^4̼';!29,kD'ˈ{Aʅ29d 彡F__u:Lҳr__+nS/dJu!q.dg rBvݹoW5 q8J<߼0 3H |{ݠ?} BרQe5NsCiCTҕv"BʁPvw4 _XN+]W +:#"gr;iֽ/Am E>SO pgpI{!m-ej%b~2Y@'MzGqцZ+1_R !O|qGDyT/(}fYI5Wk;0A]8Q9$o s}I(3[$.~!1NeF bY3dD̢恀F(IvVjȁIx$"W29}_ov(G9TC2G@2nl(6|J_O:Y-g]ABWSCVVm Ogmh>} 1Rrn! N+(֊>"Ѓ8+QA/ˈYLj,N:"emDM__o:<`vhqp8-9p] 4+"m.auQ%YGg'A~YqOfY~I;п?! 0`h_cŷârua"@rx+r@weh3Se$a@K[FebydS(p_2@zfyƨ+L>HATY+I|ւqɈN=êo̽pnkt5'W I&eI1;Hn5tq}PqD/K~BR?m;S\mE dx;'dB1R73QP/gx5s *UqjĬ*;r1يxn^eKG^dݷQ ]y ͆8*J ;* ()4VקalV }!7|%Z[.Ъch3HmI lLHܻpI wȖ]cLO)H]KgVgr4j0zz֬ 1;a?# mZǢ̷W:m(6_^"!ʢ?~;hHũgF5ĸ S}pMi=yuM] r^! ,} ϖG[& (w3~m-k~3<)WJ=BI-b >lːB)}yn/*xl![W_5 KWWVtyk&m"}l>|2k]Yl!LвhX=N<ФF;=1Unn ~Fm2~߷5?RI'9cXY, _yNìfi^RM ?EE%۳UpeQzz`L YM]r GRtO5A!ˮ{U{mE͘~1y%hGZU!B;xh%󞞧^DM$PŦ=aQ2#6=HÃZ6 jOW:,OHJF;LrDaŋz!A?I&h/!J7:(RVT*9wMnfK1mlkx밙ִAM,;_i^%g=W1{K 6^K9یz8LL>ዉr$^>aD;PJr<3x{Qt7>Pg4.oz&+\8T[kEév߅R?2hiq{B"c͌ї,Fc(Dڳ̒G3_zV|CE3H %eFFo4bʐ쏷]z N<A̾ 48B7ggRUVyV̦1o=XZn߀R0ݦeL *>_I1tu,P=&؀PM)٧dyLv&~1ٴ씫0Y| s&c^.!-]yl+F.r٬UXRuf"͌LȾrȱ~d$ۄh9yt[Sډ4D$˪q] ʬPyb}dUV|ka }w"?yX BVp9Jߨ`a 𝻖tT$NMkZhK v,8Sb9cX)H' /} u?/*+@"R:5ǮԎicW1?8_ut^%e=BЖ'l (pL㸨6 {Zء{8_~+:ihZ^š{!kӝSA̹^D6˪zNa|yOX7s'P#g!,֍yf6 &, dQQC:?bf *(x ݊%9&`Uj9Q&@8`_?doFb*fIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map39.png0000664000175000017500000000222012412501752021140 0ustar brunobrunoPNG  IHDR@@ɳ-PLTE) ) j1J R 9R 10IDAThR0 6=aflI8kiǮej_6EfeI^TUlSG9LCwNw'0m^[݈9-gM3iÆ4Cɑa(`nQ:/S|Կ6`f'޲~ÌOcoab@YŘƎM`aݫɎ.81`hLIK',JcjVӃ.֢h%EH8&@+U"b#ŬjEn 3b ϵ c-c~{:Hs iplo1hP6!O|&j /n:>ح0f9  ^I̿x9t{&l7q@4" l\&w)/BT_>]ђPðw Uhxk&zo7~+Y`humLX^}l&o8)移KYTV|ʈ stSzCm3x'J;> & l{d)՞p.|w9۩#?@\[R|,P^P}p9{_l7y'x#|V?# pt"'ڬU=qYm8`bsyۑ rݐW=Z#ϱ2llHl<3o =@W7nIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map24.png0000664000175000017500000000475712412501752021153 0ustar brunobrunoPNG  IHDR@@\9^,PLTEJb[;NI,:7&%YvlyIDATxv8 DB(LfW. W|||eɵ|} |`F"D[0Yxֹ _~l<(/u_g D|e~O_d #booc|AXtWe? x꫼YOw *0usH~ϲrCοab| ҕ]<3 ޟߐ!{%c]<,8`_PS^ݐﺡpLt|7/8`PS-7JCsXNZ ?.p|[O7G+<쯑kX iQG7}z4?oOa7~;HzݍcC/a}Ok@]Os@z>/cz"ۇiM#?;r ֿA?툵1azʴ A?툵qlw'/B|KΗsnW퍹; |D+@c4XvE'p?'2_ ۏkf׵ jm'no?;=_ۏ&i"= ۛ.?9AoQt9]<ݞ9I>$>翣o}vD/]Յ! {o7Z<秽AUyuO#[[ws?TU?dv}{}-?*o=9a3PL,*?\2"oڠXۿP>I鷿{;?hU=1Z?$'}żM؎ jΡgZSS@ ]<ճ#| nxjWs;Ο  Q%xZX~7|PX|$(GZ =nOfy^W?1?(M244a>Cw_G9Wϴ|??xe?J@޽' !/CTG._x>iW=%_[|¯?l~'uv~_$?[}>X|^}0frTIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map74.png0000664000175000017500000000232412412501752021144 0ustar brunobrunoPNG  IHDR@@ɳ-PLTEr;^&\* * 7wIDATh޵mn0 C/0TA !~o>q $d'rIl]M)[귄!ikfGf|jo33u23G>:[wXmﶝ8L}&X!p`8Loi|V=ƛ.VN 5gz| =&ϑ{{ MdةLO@*Ph|S7f}B,T!@@͖YƙEFmzSQT~Cr>y6I~w g*|0xO: ?*x雦~Pm 5?YM4GE͌7?X8{nS{8sq.'2( KF~.:[5\_p.Ax9( |K9Op?tAe{8^rNA4x 9r0`냷&fa!C}YXA\< _xn`XD` iTA}"iTA}:ꀧ88P~$,,'Gs<ꅘ!+I!dur",b'_ !O `8 A"i+pH@68?I 8"aJQ0P dE }P0P dE }P0s d5~1]Y؄@A5Ey'q&,/FH98"V $}co,qгB}73pP|o4,|OdEc,I7felO fO f1GF`Kg!IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map78.png0000664000175000017500000000624612412501752021157 0ustar brunobrunoPNG  IHDR@@\9^,PLTEH2H*9*H*2bAKLTHCEABOZL0MP_px2am.45pmɡI IA֧1)'],S @W=3O X<_LrnBy?TgWv ,^J@|jt>~o?Z'g8 |wz8 8~k籮F2ꃘs̏?U!NӟL`NXW# Aȉy삺!;Zt[G!$=uNӟJ [$y:ڦ>beGس¯N3e8UEIzj19ѨQڋgc>$G%`3o!H`(o3rvtGe4.un<z}dZXv8o' peOT|Ǿa;D :)pޓ|h1!wlzDHb<tٚjm7S7m>JC9`BHa/k8TԹ n׹]ƱtӤ˯.^*}Ca7kU>yxun:c4k/`}aLJtb|Eun#r]r>}gfHO%Qd0|C9Gbqmt2}WvQݓ0(9O w+hnmz0{fZ'6뗸=BB1Ţ$K :qߐX"_y;%>6VV%E^e8iup?[\g|ۿ{]͝!r\B.DW-;k} 8c_Zdw5C+xlƍ]~laU1pw}`s?b03r|g]VgPۨnOK|ez^ת˂N]6qGG[7 ٢@]KK}{=qm. cI}jb"Fac,.cD\3B3XGy&h?FUa CΘB?~}C.k2@I)=M3.*ay/yq ۗ__"OIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map28.png0000664000175000017500000001556612412501752021157 0ustar brunobrunoPNG  IHDR@@\9^,PLTEJ) { j A9C91IDATxڕ\3) }'>^T\bVSc-e"&_2=znko2mjM?@/'A l=c?(78YߊI%~`hN` FL߿`|Ou8Ho7 z~sK1z(?kSN~lJ p@ڟ>P[;HzA?}|7,`z:`7v<)? 7y L&o@ 9|HGz ` zO#|Y=|ICF9@w}Jν_ʣwY!St˧!G n6=vkу|۟؀/)XAA-Ր&h&ol4aKf("8gnģ@q#SkXkNұ ӨYy]sG3zNzKzWaW\+PW&=^9h S\,?߀u[pgX9YRxh?G.Zn$w?6PB~_?7KzR9 S^b>r= wK9/ay\0 I&d.?c? A$Q 47zD?$*Цo[' Ñ- p?q|},# Pn#U ]܁1⓽c @o/n\@c.?ǛO)5+MsĶ;QFCyphD)F^n48q`UH^a2vqoB{=ŭ g=3ú>WDEA??1tz n{qMCנ惠[` E1ccZk89j"k\,-AX\ t]^e]k{ (~Z&6EAgdwA?//þj @ :.kGsƼ,$!xI`%! "i@|0s=(EF0 X[~lͭ# qzǢ'z/n;7c$߯\[mxTndOEٮLd#n\a6( {n3~_oqq!{-mnϥVџo\Qq޶ 'NP>,Hmz$?:'ĩm {PqeY5;ʸ@SEE{~]a+&@<xە{ _O%qd7Ϡ>}1͗F\'Jsps#xftu0A}(WCKϦg?1l?|zޛE"ІU,E''}; $*c94/߯'!2STK葡Ȍ֫oy4ZG:q~ư-kIWY!IlԽBQSk=0 STw|ߗ؂uUlk+E$/2'}$t &W88R%?&AoAq&\>5@C,$$K 1Y%RK/V/Dž F%$^`w@?Vճ~ S]o.`Fyu{z7[RO5 k!v^13fD8V r4p>4oiN5o3Eٟ X#(IC-2;!<޾ ν 65j ub"O؝ iȯ2譙cՓqbg$4En9D GiI'#VP*} gq~8U=UM^ 4b/"h  T\@=҂@SE'Ah}Dk L53evW)-LZGSjr: 9Bhg5*#$0-yb_!n1z5,ٜ͡e@I=fVD͆q"h Wwy[Jqȅ4,)⟍\9MD1F4gmI}e.:$E'6c8vlQhesmʊtySJLu*kٓ N`z6I'd}x ݈y_:* &NyYp(p2y>pUbV#j[W\@,<\Q@h[8jo#a{~蟼7mdedz$B?uݫYAT]dG GZ^LUb@Mɔat?x ̙=G~2|R{y7$pod / ůwy0nh/8 VE+l'ֵg M?4r%|&W[O,'d[^8Pl[F`|Xb]tZKa3ۓ# fKs@9f*aϯ.@at$YMڃ?Ē ә}*sQK8"w>/FTw>NifLWxUpd )#;РXx;5jh{ ?1<(`o/.&:hw_`jY ~8f?l_TDm+ aZyO"np+/K@.!?$T6 g7jEg^L2v揰1,\e\o:6^TRop_EvSXphQN_'b_=t(gd"Z* L ͋W`-rq^vB)tDeMpQ.2و#țz& Y;[.Dw.*0fs B"h޶LM |{l5T )F^:&$_Q* 5+vwb+a˒g@a#ԧx֒G:7Z# oGs]86i;N$n۷uk*u`R"=˹>88pGѪnBV Pkկ#?濚Y١JjӖnM9gV7bx<[*[y8 XEo#T*]4z-z]dg h*HA[5/+XlP;je݃𩏴K#VVQ .yq,Ɗk_yp &,ݠ7.)Kg{#}cL/a2CP?ߒJ}[@Е\3I]Y4tHm;b;vhoˢ俫D=ޠO ;ܬ_6 ^[kJ%#/|Ƿ8˙g \&>8ZYX6\O{7aJv#Ӣ ?yhoF?A/ѦnV2GcӌY~wU~瀥Ti΍8%K75l8gxѧB80k^[?d`?):şG\Wb/_տt}VgfNr"6&}xv/zֱ~9ىuU&nZ /zcN~?_!;)He_0y՞srHTe'SAēwN#sdOvaZ[joƀRE<P,uIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map45.png0000664000175000017500000001410212412501752021137 0ustar brunobrunoPNG  IHDR@@\9^,PLTE ) ) ))))Dk ?ҏ<> /̭ )(X3W,W )W,W )(WPWZPZ[Z[Z[;WZ[Z[Z[Z[7> )eZ[IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ[PoZ[0 WZ[PZ[0W@ W )(WP@W@kZ[kW @ZPZ[4BwBwZ["ZPJZPZ[#Z[ )kH \:cdni\swerut\ut\knhclabm\zb_pm\m96pagt#Z[ )k oE@\:cdni\swerut\ut\knhclabm\zb_pm\m96pagtk* EZBwW,W )yBwBwTlI5TDII6lI5TIAI @AIAADxI@Z2ZEE@@FI5X@0?)8IDATxڵ|:lPlc!ۙkfw{eBH ?cL5P1R=QC^_uB[^&)* *o Ig#'/Fw%_]woF \^mٓ% 5InL\. &A#O/ WL?yG?IsA%,Nȶ k0褆Ө\,8Y ڟ`P$`'Axw_[Z.y_Xq mlm,+0W Aן{{[I05l(^#\J\&Յb(Gֱ0v>I*f8\o;/t"6^V@R/$}HuH:oiQȾo{^Ö-mqH%*#Ֆ,o.? ;4؝:z?߁-h͓-BG_O?- ͪcV k8lwz[@ yq`f}xm%ȧ>MZ_X$ݠ9 `[lFBw#mœQFFfr%8?ST jGyVųːO#2TʈpzVwCfnaZ;Zj -s0isؒ<P_ƇwXYBBb#V.?k_+JF܆8 ݍH2 *r_5 7FS}ҏ n[_9Uu>Ms{Y$t܈E8R/hLX ఱ[bѫbwW@Y[.7S3`E}o먦ΰ)iӓ=Vp5_}o Xi_|fȯ_/":yS3qi &l)ϥ@xo3V!Q]ߛ׹PF&wHK%y^NtkT>mcJ_Q %t1 Z}>- ]K}w"%D A4-5#|rcY+з#nc\|8c Ot*;J.n> Ҽ uˍɍϻ. [2L+ ;.@a ،7$2Sۏ>ݵ.'m#@(7(JZ~M zl8 " t^p6W$>#rysiBu{$t 택^)i ??)7fyiN8k3Ǒ㝿7#gl|?}*d.F`RO3~3-aY&] 0NeS3H'dhWAl5%JTIS9oҞN~}D4-\D:YU5st  ]Ȅ66 4eZG! ݟN92b/HΏO7#%7at໸.ӵB>wFHݕ̴="z<` ,(bJÇ ω63\⦐ѥeCpeK:AiNEu #EO[1`+K>iwf@hH$zXt5Cf$iŇ-/J [1G#)ߨp_+<|Gb" hKi'y1"7+Cᕝ3P 0xW<\v\J Id##)+CWg[څ,9ճ PJD"6I!αƍr38o0ȳrZ# M^g!>+`F&ftbR2FoksE.!9e:d6ʉD\'+sFccwc)R~d半_" 0(@EGIZ-f@"JC#c͊@D$ψAodXA8˃]_*{֟4"cOJ::h3"J]XsG޽A{dq^qiDNV=0 Șw:.j^^"+d )22ZL|R>}C *Sv R(`#aoF)'14$ `VcޜnDX+|yQThnDuT +N>GyU8! 5+2̞ApJKJuۈ 8aھ9ݘb&+rj&%/+g&Z(RV$`-zR9sĶ{]ҙVRs!KNRg lbSmD\#/EH8 :T6 ֧$(qYsWGL7Ʌr6 jytG;R2ذ `wKȉJ1W^ k˜<\]C%ZH4e 6[wOnHt]ẖ3o0gQ?"{Ί޼!ڪֈ{Ɉ™[ "4Q7?H&K`Er%aIUdfX 4ҳ%qTDž^ҧ'Y\-=!)G)FQ}3Z5"NЯEd%jk;EeWzyUh6@9a@4,q)8C!~HVVJDCyJ-`hA D:W!@၆乖@bE`UeqzRD2 .rpq\DC+A-ќQA͌)_FI~A=@۰XslK"%VT2B$`@#< "{QVw+$V5&[0Gf0!}V:kWoJf/#eYC@-Kt?{ _|I9{U&`E t|QX:}7^F5υC¨Q>e YCvd6NƬt~d J? 9_/bԃ*\#{䬟͒ ~tbɯ,.#D)6DdH8G~wTrccqȤ @$/5jʆ mQhUY%ֽV K0,%W+(>ݎ T8+<'xx'~hldaA 1Y?b%aHw}|Ud:ω|kqp-U2& ?l:W ™ B _@05zW`9|n7Wdm%+,TvZqqYg,s,HőnfWJ/L}yk-u PICVj6|wx0&i} ԉu=~cHl!U+ 7c؇DX6fw? TVDvO|8밡޼$3ˑrFġ d; N1> F)F -gA)W,W (WPWY|YYY;WYYYY7> eYIkFE@t%kTkk@@LFE E@kT kTkNOkRTPLkTkTkjOknTPLkTkk>)BwkTkkTkTY WY8YW@ W (WP@W@kYkW @Y|YBwBwY"Y|JY|Y#Y kP \:cdni\swerut\ut\knhclabm\zb_pm\m25pxcp#Y k kTE@\:cdni\swerut\ut\knhclabm\zb_pm\m25pxcpk *-EY BwW> x@ >[&0_V|<sx:wp*P¼y}$d;qBϿW"wJz]cA_O.)v}y5IT4樀!VPg_oށJ'  xv:@+< <8,Î?b?STX1k񣘠EGWaK5}8~l"mS$vX{a7{6ܨ?$F0 v/ RK(Pߝmi?ߤTB8τ9x0t k.̛Px/~ǢX<o4 _ܢExopTFM^!zZ˓\CJjPǟ/Nd$!5~*/ J$8ĕXE[Cj9-*Q?[  h6#ۓ@Wgp~ڰWpEim}M; mpf x"a?|QVH?D|8)%`dwL@r;Q@eZƲE5.I(FI,Ur~e\:?Qɉ Ew %02&gڸ8 ixY[e~|sF?qBr>_#l5t7ό jt^Rng46%8}t$wMi/~?n:ON7*sy/Uy  av|l@=}a  QdVEKs Z{d[mpT!M‹G_` *lޏwnǻnzeNw z=}L@CuՉ:*`mJ@ߛ?}o .pc8ox S;b C-'Pzs3Cu9CqAZwӨ_6e* +_F&㳂gx<1o=$' skse~> M>VצY~_5>F ]}[}au >"o!:mSajOo_Pi@ #I@ѯtx^~X柵lo:|\~A |zop%O&eRoݧLzU~tZS9; 'cC]zv;s_}A: f-IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map41.png0000664000175000017500000001140712412501752021140 0ustar brunobrunoPNG  IHDR@@\9^,PLTE"+-"+@++6 "- #+5@"+6D ?R<>? Q(X3W,W QW,W Q(WPWZZ@Z@Z<;WZ@Z@Z@Z@7> QeZ@IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZ|oZ\ WZ|Z\W@ W Q(WP@W@kZ@kW @ZZ`BwBwZ@"ZJZZ@#Z@ QkH \:cdni\swerut\ut\knhclabm\zb_pm\m27pagt#Z@ Qk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m27pagtk*EZXBwW,W QyBwBwTlI5TDII6lI5TIAI @AIAADxI@Z2ZEE@@FI5X@0IDATxڝ\b( xݙ a8(Po?6*t4S5n?`oY~~V-=@y*8>VvƔ޿|&}Od De_=z껮teoV`/8ݒ7O7Q(Pn/t(Kҟ<껷}<4@dysyuq_Le1ԓޡ]=9fKv_CC\f h1Bk/2Vaky.u*چ^8w}6U Pӧ}S9P7 hK鮇;Uk3_G/>OWm E{I{>Ƙܐ6zb=!r+ԗx le5]F'2lI@>e#Y_VOљWSfUU26ޞce2+0m Ed۴p'/й8sߥwW5,dvm[{tƺmgEC͎/Q+G }֮_aGI44WY?Dzz5cTǏ;|Uš=/FUőDf l[=1[w7qKwCXt_5SSW6C>E%1<ov:@Ǐ^?Cz*jo6e6SxRWP9&i,Ub{};zU~à c W _h~ #'zOUJl_"NQ;7ǃ',~|.o|k('ݧ>៪Gkȁ #Fҿ)xhɥ}#?x|Ů+ Y9@>(PAd1hͺ.?`cX{s멺 ⥰=or~ceJ.pc}ԋJ?pY-eܡ)K0T!Vޛ!07!yugn~OE^'7 )pKa/ W+_t!&t7;}Op} sKfuƩ6T+Qw^‡|ozU8J_E9x ş$.xL1?v]-o3^щE^ uM 5L1Wص7s(ll`x3`W`†&=LJ$8do` l@_y3 |H͜yUYi0~*otx [༂=f*wpmזU^T"U{dy†S܆qjk@Y}W>88бMK?Dw؏m+wenCJ9U'q6$Cѩ\b >-a&@UM{T`#4a+n|(7H2tw^<񇩽Rjy tе EbzMoqe)\m**}.1>@~.+p&Q/2q`AҢ]{w ZpY <];|HW bhe+*0a5y=0S) Wm8iUTTl.ػ] 9?-ַCM}kG|uui]jun\l\Ch/ԭ? ?mx+?+.x{^Wp<Оi6SKqU`}GV( }מBF 4&<\y!,e Co.8:V9CZ?Jǡ毑ox߀<0i_$WSi'] >*'dsߙ(#0gƯZp#'ą#]y^ٟ ~q&ay)w[Xyr ) !g|Sa7>= N8{th%4qlGR꫻m藹/}񲮺٬|3Ņ'D4$X0x/d! fl,.5+*\3S*>o eƩlq'qׇ7_yyXxK] nn',|ࠪ;>˹ +6Dz[m<s 5sλhG0:~cts´y#^e-yh/NnGsj;%FY̱6Σ"iqa2'@ nqg\,seQS/Cg.{dWn}wVp+.␆~vb\$FeLiMywr$c7(M bG֯=wh2S,Qn;V;>W* CMh#a1 ~b@~ao%qԂPC+kVkd;8 0uZr؍#ӐA6h>WMENa{1p/Pzsjs|] 6e&f%&sV}R"1>~U*3KφqdL H'aI u/=n,GR- o)V^wrt*Jŗa9`/w φ\_ۋ=1)k9{m,kOJ`-)_ldW%C y,}~|W*m6<&_x nL_B<6Ť`HumMtXfuW/$%pbffɅC\~ds %<]sz|KZ$M-?6y8vŠ<~C#\8QW_ԏMY"'kBRN63\9HO-IB<}68ʓ;w/p=nk ^ElP"e@?u>o;h^'˨朡$߉pZ̕ .{ +.xY$A>7ӏ2?8ÉG,ß07=s3-o'z/md~/)9:!b}3 Sdx2s%q|8K1^9L}-w W>9U7tv1g%2wSy#.b[qa^!kЦj7+^K,}F3zDUy_6M9l~~5x/bͭ"& oFŗS{e=ָq8{5pgC|6sJܞ$6P{/v \f{ޞqQkNIs =Z ` r>}O8Z?ǯoÃ@H)ߓ˨@㭏㴵^6cM~p`p r\=k%ߍq^K_,gӷ$_–lXnC%:W=}fA`-_ڤN'z}ݵɑ5y%E$w?bIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map43.png0000664000175000017500000001350112412501752021137 0ustar brunobrunoPNG  IHDR@@\9^,PLTE*H*H2P*P99b$D ?dž<>?< TH(X4W,W THWW TH(WPWZ$ZD THeZD<IkE@t%okkokOk"TPLook>okFOkJTPLookbOkfTPLokvOkzTPLoWZHoHZ WZHZW@ W TH(WP@W@kZD<kW @Z$ZBwBwZD<"Z$JZ$ZD<#ZD< THkH \:cdni\swerut\ut\knhclabm\zb_pm\m00pgt.ZD< THk oE@\:cdni\swerut\ut\knhclabm\zb_pm\m00pgt.k*uEZ`BwW,W THyBwBwTlI5TDII6lI5TIAI @AIAADxI@ZC`2ZC`EE@@FI5X@0@lIDATx՜r:E$O"d;ɞݭͭ9-5az1̽43>맯v_'|1c}׷>_?׿jEmw|lm}nqKl'|ɮs5zHhuRد?֯0U??}?lM8[uն֔]Sp+l_gwH,l\@% u!0 jhZoibSnо>6C)svd|Q[skos')Wg6\O.?S6K_Wk c\>na ÷a<۱Z&u NZCzc<@v czOG 56016 IIt9i`m< us5юmʺaK׏]Nº>}~{}] ߞb^q%~Vb/6$54nv쵫skC2}|֏OIW}Gfn5cڭ=pƭ][Wg~pnzӿ~?YE7w}m84<⎾ mټ\SZ])Feu}i{ar_f~8_pI7O]hmMx NCh,g;p[¦\ة.\<)w +Qo/g+rbУtR`\a&ƚh" p;@ ЇUD3{# XOȠ'z~76/(zlӈcZ Td':Tg8(4ҿ2>8èa!f3k3 >_6>,TXaSPbtrC1%@ ݜ;}\Pho8'u=1\Ω82c kmÀ:'G39q}vַpqDLr f,d&d3m 5z!Bxק̨oACc[ \3fb̠Ϛ> ⬘u GF#C3Bs.(xS| yZ_On" rMVl7^'0Vu$%oDlU`#{2 P_>Iپs[`u[☖<Y9Br c`yM03_b&묩e> w DLj.8: .|.t =9d_e:.@@&oC;R?8 o夕  fr,4]k;aL9$0!kbW<=-A_gju֕AmE?/b;i!U3ϛly\2TB|_\M?椩O DH<,mZcD*Q3X% ":e3Mw}z!P}ӟv⹰1&#w}!X I ׶%k\}𼈕D:x}k3Cu1F^#\U4ѷ&"3#M/u+Da7Ϩ⤤EiBڰY78'{ Jz_ FUy6"7Qf s'}1 U ~VdCD.[e*΀_9YENHD҅+ nj"{$RG6g}nx?H!?^h3E*\1}{#sK([mi%}Ut'*WBk}s"9R@yu-17HspE;{ē*Aku}뚐caaOj D J;vM0SKUhsڽ܅L*pauv.#-8r ذb1sMS }nMs!%<"DJWGHn8Z)7i'.A@RV5; $`|g κ睛.xx "~<ϻ!5c W :zS8•XDܳ芪}ϓIDzg $z`vݡt6*hY`fԏIlm^ɺ+}lV߹۽84p0V5L6:vx8NyL0% }ɀFi}zwx,W|ꛊ`u)އ݇kT MqGsio",aRldnU_hYSҼqqO1"K|M`O*,6nxG%I6|!$!/&p ١cobs;f"!&ؕi##M+C<<$N2\}^o”%K CP%]`Be"AQ\V0y1]{}>.ss:S1[g \_^?Hjo_= ~vbGg=Byq}Ѻt6^6<&q?S|I} ^mG' GPl,PidSQP2UGП>G?\ro:rFArG=酤+,d>p_s?o?ҡP1BQ$pVlxj5E╊U*)^arv?@r_+2/Jm+#򪿎mf;v^Q~/"IENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map07.png0000664000175000017500000001575112412501752021150 0ustar brunobrunoPNG  IHDR@@\9^,PLTE " 0)"" >0")ZWP a(WPPWP[+DXlXlXh;WPXlXlXlXl7>" aeXlI"kFE@t%kTkk"@@LFEE@kT kTkNOkBTPLkTkTkjOk^TPLkTkk>BwkTkkTkTZ WPZ<ZWP@ WP a(WPP@WP@kXl'kWP @[+DZ BwBwXl"[+DJ[+DXl#Xl akP \:cdni\sweruc\uevnm\t73pxcpJ[+DXl#Xl ak kTE@\:cdni\sweruc\uevnm\t73pxcpk k(k ]EYiBwZPWP aZWP a(WPPWPyBwBwTkT\*F 8XlkEbopk|FF 8kTFDxopDݽFkkTvIDATxڅ\('3n]m "3`.u_?Z?G6|֯㯱o>{w|f<1{n,.\죵E߿P^f]}P5ar`ОdųX͂4pp '(M9ĭʋ֚(ߜ1L'Io'eH 0탲__s 0 ,ٲ_HR(c[mP9A96zb8?(cd 0Pz>(oB@K7NcScw]N%؂ڈA 1 2,Ba62Z?M?X[*hP-PQ^`PPlIٸk/<S67vH6p+h#!f@w|@ v Q.6n =Cwl LTy(o40hP]AiicBޱh!1Mb/Vuغyp:wp wPn xkw] &a´u|@1>! 4!\” / B+N} ^'J&x3pqoaCac|xC\" 6$z?G06ޯeNOM¤F\oADLBlFؿahĨ3j:/A6Ni&C!Bnr㝖f .2iHjiC"tyЄ(ߨĕ; ^e›g!fiDY<1A/F 0lx4Ye`,.F@Ã``G Y`zpz1q0d"M#lch-d,i1Dx ! 7`\ ~iƂaDO7Ҡa>KzXH.8hni#R8yޏ)ɉ3H *ݍ㨂RO*a9I'l4 q<o\$C׵K>t N.ʆ,}?_fH& 60 *j1?&GOCZ!斚H3Z C/4ZP `ƑNk՟9UgKE9V`P dj2tKcÿP]zACz3hMZv|\F^4 ? .R4%@Μu3$;IfAPIg[#)-ۗn= y_Dޤk`$o|lɀ Ff* V $@c г5 o] (z`8`3HChw5/GmOlQv+EaZ.SV1Ź>d֟yp kEKrxwx]RpIV7@^#ub> 2zLx!ݥ-'e-\L*u;xsKJFyzpĀa{6Ap0&sOI4~ma!-]JX*R{ՉB+E#U& 7Z2\w;4SX[\j)C"NM['8 iƚ`X^WvAaIаU?db-?`&ebRŶySXLټϴ:x&h@ VٲGUNGŒZqI 6f&8!bXgHo]{S>"2pzxPEv:al pܕQ`|VV4Z 80Ix&Mԓ>AS$UL8k KitA)ª;`q](DR@p|/P)O~;m&`i?/Cb{9\:nvDp> A B$Қ7Yy1wW5(+e4PIeڮԸL؉Ƃh^fQ{YC,ʄG\a*^ 5IGR7˖fO'PtNd>ET\E*q <'pÀpPx$.'RSzpeXgWA>Pem3.#늃8(7\+G0 xpA{RfkAvp'܂  c% H/p2 iT.+(8 sF2슔d=+Y>FLtPZ7e( tIlJ4 PVH_Y{Kv:QfaǕtTv 9}J4aSpmx6X=;jd ",(;&E3:"'׺k\+g`W"m,^!پ m8Wb^g^I\ [p EK"cE8sP%t"±}3>w"@?SAr≪h2\k%/ }wcX˾8YgkVԭD?1IV 6E:Xi/,nnYNQ>60w ŷ46e_{—ɣ{)Ț4PaL⍎JT{L=đS2$A<D>r f`g w@Xc^HvI=Z J^#^陬wE5BHg&$L92%#q6DkB67f*_jW39aDhà+٩+~2 鹀[pD5wu$);LO"UwVj.z* n%* >C߉u\0Dn Lٕ0c~ ŷܥgdaΡȋ2}ߩlHN1d46S BAyd[؋k:6K n B Wr œ1sYm`mba4V&lR;`pLDyzK)>(C#pOmQCZ^tGC<(emFۇ?UKvf,'ֳBdQ(<ϫ+/LTh#(W԰F$g"ۄ?(i[M' /Cc3M˥>VJp~M*6bGn.`#b_&iek;]? Oti!`A}~l">7Iąxr~pÒTy1Ġ9v)-{&]9R̞ZE~R>wP99qfw/ʟY8kBqd3x޽3ƍPqmܔ#f`q#~ԉ슄^G.-q 4 WLʻL!*Xv7խuZ.fcPf*|;RuG$<֐̓Gogz$"\G-m=rؒ4fWAY I']X7l-,3Ձ֛n΋h k[1ؙVO-cv <"F(gYu!b.;GK/UvBM)xrvWk<Tnſ723DxBG XxvaP|vaȄK}PNP\v>Cg*LY>BYƝoO%idKqZaPeSIENDB`tecnoballz-0.93.1/src/TecnoballZ/textures/map77.png0000664000175000017500000001145612412501752021155 0ustar brunobrunoPNG  IHDR@@\9^,PLTE'?\?D'6'P'\'6.Zg'Z\'''''''WPWP it(WPPWP["[-L[-L[-H;WP[-L[-L[-L[-L7>, ite[-LI,kFE@t%kTkk,@@LFEE@kT kTkNOkBTPLkTkTkjOk^TPLkTkk>BwkTkkTkTkOkTPLZ @Z WP@$WP it(WPP@WP@k[-LkkWP$@["Z BwBw[-L"["J["[-L#[-L itkP \:cdni\sweruc\uevnm\t83pxcpJ["[-L#[-L itk kTE@\:cdni\sweruc\uevnm\t83pxcpk k(k R E[4BwZWP itWPWP it(WPPWPyBwBwTkT\*F 8[-LkEbopk|FF 8kTFDxopDݽFkkT2IDATxڵ\*/~63]!z/i|^pǮ:7->n?|?lۥ]ڳ޷z5Ufsu̗|~ Y,T[74`1a=,IKTG jzdЩ`מn2܁Vr!Xs5s+f?,3$@s_Qk~h>y/LtE)J2~}cC3Uo~#X2ut>㽳aI ɴhE] Ѓrutװ!:fk7ݾjVJQ4 R ~^=oKpT`ԦWe]q)LP=g'75~k 큎o )ò hj"|0.zWkM}œe7gn]#С?}g'ޟ7 P;U^VoZbmj?cé_ߡMnako_`W\ KֶQw#8 zWy@=tċ 3cZ6/5=MÄg:a i8NkZE {(9Fsyb0WT)>юƇUM\]/JJ3/Aidʆ{70R Jt]fNIOl:`>~TVS7Z$'w**NaŒ Cv9Bˠ~ů] TP.L 6'fh hs-:xT7y“p"4[7$ZYtj5tt]C\`d xv*b&'q[ի`הGsioMu0]&(%P{eKknX":T>D#HՠP4e;Cu^8:6t4a ,[AV,l8s"` *>B=SQзNI

HE3k(Z2L@j2М~~)c.X U"3 9%5H rœiEtӞyҾAy I{OىyabTS"~ }[PGupȰfyͫWu:3%B7lis4櫓dEGv׻U)8#v, ܜ0+bID1qfZ%/iGmQ/䇍'mc5vDhE#څljp&s`'+9Tef$~yOypߣl{e6f^T}-dDH:YΨmS!f>>%>gǝkJ`e2? ,gJ|lz{ ICg,R )Y\\64w?Zk)wشjk˼&iD]łͅl->3jz'Ca'-X*R(Kk43Moa^)TCҜj8|NCSrqOXC$[, Dyʿ9H l8c VQW@hji+h=(iz,OJ&S /qھZ3t͗Cjr F=ݫWoOrPNVkomR 8$a|@yp)_sʾd'V$Zݱ NQA$B r2UR,l9T&}S !(&Swa~hGm^y5j#oľ}b8dSpE I/Y~5}L+`K'ʬZUNf!N.`h&橯E!w kQ!]3Udz]R_ T4dϱf[ 9z*3eeO6wnRh=C&|qN׊dnH+HJaIڸ饧L| apĬ\8~J99PP/k"vY3EW($sTfG߫yEDIlc(Fj% Y; /2s_yI`gyG8K{^UfC!2M3]u7^BqYiRCk[if(ý̡Mo27mGrIENDB`tecnoballz-0.93.1/src/TecnoballZ/tilemap-congratulation_20.data0000664000175000017500000002525012412501752023444 0ustar brunobruno < L < ,  8 ( 8 H @ < ( 8 < < D @ X\  <  L < , < 8   D L @D ` \ l t x T t ` \ p D L ( 0 < <  < 0 8 @ D   , p t d p X T  H < x t ` x t      X\ @ X\ d l X | ` t l ` @ @ T p p | ` x p T T l H @ < ( 8 <  ` \ | ` T | ` t l < < 8 l ` X d \ p 8 PT L < , L < , 4 L < , 4 \(\(\(\(\(\(\(  ( T p t x \\  H \ X ` t l \ l( < D(\(\(\(\(\(\(\ < 8 < L < , < 8 \ p T X \ x < \ t l @ x T | l X t D ( D ( \ p p \  @ < ( 8 <   8 ( , 8 < <     x |   8 X\  8 t p ` p 8 | \ p T p p | H @ X d T X \ t p <  l p l | p x 8 p < < < \ ` X p < < 8PPPPPPPPPPPPPPPPPP H ` X X \ x \ d l t PPPPPPPPPPPPPPPPPP H @ < ( 8 < < x \ ` p \ p T < X p \       t t l 8 T x l p x l p ` x l p < t ` x t < D x < D < D T l \   <X\ < D X\PT \ p x t l d d x T p h x t l t ` x p  <   <  PT  8<  t x l \ 8 | ` T T , t l \ l ,8 p t t , , 8 , , , , , , , , \ p 4 T x x t T p p X x T t \ X \ t T p t ` x p @ t l T l ` t < p t < l ` t d T x p x \ p 8 h x t ` l ( @ d l X l p < t ` x p < , T ( x X ( < l \ < ( | ` t l 8 X\ T | l @ ` x T p < t ` x p l t <@ <@ x ` d  ` d ` d ` d ` d ` d $ $ $ $ $  T , d l X l t \ ` T T x t, | T ` d d \ p X ` p( t, T p ` l t t \,(,(,,,,  (, \ | l hlhl < , , , HL D t \ ` T T p ` l t t < x \ ( \ d T x p t l  t l ` p \ \ p < d l p x \ | l p ` \ L t t p d ` \ T \ p   d l t h x X \ t \ \ p p ` \ t d p p p t t t | l p ` \ T \ x p ` l t \ \ H | p , ` X X \ x \ d ` l t p x l X ` p < \ X p t l X \ h x l d l p p x l T \ x \            0 4 $04hlhl04         `d  P T H L  `dPT D @   P   P P P \ ` T TP P P P  ( 4 8@ @ `d < ( 8@ <  t @ d l ` l X X p x l x \ X 8 x X ` t t p x T t x l p @ t X p t l p P @ @ @ @ PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPHLPPPPPPPP \ ` T TPPPPPP`d PPPPPPP t P d l ` l X X PPP p x lP x \PP X P PPP \ hP X P ` t t pPPPP x \P P P `P X PPPPPPPP | d P PPPPPP D < P  HL P P P \ ` T TP P @ DP  P @ D (  0 4`d < ( 8 < 0 4  t d l ` l X X < p x l x \ X ` ` h x t l X ` t t p x \ X | d P t l ` p tp T \ x ` \ | l t ` \ 8 8 T \ x ` \ | l t ` \ \ ( , d l ` l X X t ` \       8< l x \ ` PT t | \ ` t (  8  T x t x l 8 t t  tptpt$( ( tptpptpp$ ( , d l ` l X X t ` \ ( (,    x| l ` X 8< ` T ` t  tptptptppptp$( tpp$ ,|   (,  ( ,`d l d p X p   @(, D<  ( Dx| \ T  <   l t \<HL  \ t l ` <  < <      ptptptppptpt$ tpp$ <<   @  < <<   @ < 8  ( , x p h x p (,     <|| LL p ` d l l t (, H @  $$$  8 < < <x| tptptptppp$< ptpp$ (  ( < 8   ( ,8< l x t p(<<<<(  (    <<  ( ,`d l d p X p (|    4  x < P T x l \ t`d x ` \ tptptpp$< ptpptpp$(  (    <  ( ,`d l d p X p ,(,  4 <   ` ` T d < 8< ` \ `  D @ <  < tp$<< tppptptpp$< `d  | l p ` \  t l  @ @ H t ` x l p @ @ @  H ( , p l \ p <    ( (   < ( ` d l l HL \ p 8 D D D D D D D D D D D D  tp$< ptp$ tpp$ < (   8    (  8 <  8 <   T  | l p ` \ T \ x  < t d l ` l X X p x l x \ d \ t x X < t X ` p ` x p x \  X \ l P | T p T ` T p \ x t ( ( ( | X X d       (  8 < <    < < 4       t@Dptptppptp$<<<< \ d d \ d   L < ,  D  D    8   L < ,   d   < < D ,   , 8 `d  , d   `d `d `d ( `d  , `d H @ < ( <  D  `d  < <  L <  ,  `d       `d  (   `d H @  8 <  <    @  P <  L < ,  < 8   P <  @D   `dHL  8<PT  \\ \ <<  <  \\   <    \  P     8   X\  <    < < P D  @    t  <  < \ \ T<PH 8 \ \      8  t<       P H  < $ < t   ttt$$ Pt <   < <   <  $0   0< 00 t  ( 4 HL < \ ` T T  < t  t    , 0 < P0  P T H L X p   0 P 0 ( 0 8  H @0 < ( 8 < 0P D    < < L < , <  8      X\ ( 4  8 H @ <  8 <  D  @  < <  < , < 8 X\     ( 4  8  H @   (   < < D  @   <tecnoballz-0.93.1/src/controller_gems.cc0000664000175000017500000001046212412501752017275 0ustar brunobruno/** * @file controller_gems.cc * @brief The gems controller * @created 2004-04-12 * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_gems.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_gems.h" /** * Create the gems controller */ controller_gems::controller_gems () { littleInit (); max_of_sprites = MAX_OF_GEMS; sprites_have_shades = true; sprite_type_id = sprite_object::GEM; } /** * Release the gems controller */ controller_gems::~controller_gems () { release_sprites_list (); } /** * Initialize the gemstones sprites */ void controller_gems::initialize () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_gem *gem = sprites_list[i]; if (current_player->is_collected_gem (i)) { gem->collect (i); } } } /** * Send a gem stone * @param ball a pointer to the ball sprite which destroyed the enemy ship */ void controller_gems::send (sprite_ball * ball) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_gem *gem = sprites_list[i]; if (gem->enable_if_available (ball)) { return; } } } /** * Send a gem stone * @param blast a pointer to the projectile sprite which * destroyed the enemy ship */ void controller_gems::send (sprite_projectile * blast) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_gem *gem = sprites_list[i]; if (gem->enable_if_available (blast)) { return; } } } /** * Move gems and collision with the paddles */ void controller_gems::move () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_gem *gem = sprites_list[i]; Sint32 gem_id = gem->move (); if (gem_id < 0) { /* this gem is disabled or was not collected by a paddle */ continue; } if (current_player->is_collected_gem (gem_id)) { /* this gem was already collected */ continue; } current_player->add_score (500); gem->collect (gem_id); if (!current_player->are_collected_all_gems (gem_id)) { /* the six gems were not collected yet */ continue; } /* * the six gems were collected! */ for (Uint32 k = 0; k < max_of_sprites; k++) { sprite_gem *gem = sprites_list[k]; gem->enable_blink (); } current_player->add_score (2500); controller_indicators* indicators = controller_indicators::get_instance (); indicators->increase_money_amount (500); current_player->add_life (3); /* jump to the next level */ right_panel_score* panel = right_panel_score::get_instance (); panel->set_bricks_counter (0); /* enable right paddle */ current_player->set_paddle_alive_counter (controller_paddles::RIGHT_PADDLE, 3); /* enable top paddle */ current_player->set_paddle_alive_counter (controller_paddles::TOP_PADDLE, 3); /* enable left paddle */ current_player->set_paddle_alive_counter (controller_paddles::LEFT_PADDLE, 3); sprite_paddle *paddle; controller_paddles* paddles = controller_paddles::get_instance (); paddle = paddles->get_paddle (controller_paddles::RIGHT_PADDLE); paddle->enable (); paddle = paddles->get_paddle (controller_paddles::TOP_PADDLE); paddle->enable (); paddle = paddles->get_paddle (controller_paddles::LEFT_PADDLE); paddle->enable (); return; } } tecnoballz-0.93.1/src/controller_font_menu.cc0000664000175000017500000002327512412501752020342 0ustar brunobruno/** * @file controller_font_menu.cc * @brief Controller of the menu scroll text * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_font_menu.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_font_menu.h" #include "../include/handler_resources.h" /** * Create the scroll text controller */ controller_font_menu::controller_font_menu () { littleInit (); max_of_sprites = MAX_OF_FONTS + 2; sprites_have_shades = true; sprite_type_id = sprite_object::FONT_MENU; offset_xx1 = 0; offset_yy1 = 0; } /** * Release the scroll text controller */ controller_font_menu::~controller_font_menu () { if (NULL != scrolltexts) { delete[](char *)scrolltexts; scrolltexts = NULL; } release_sprites_list (); } /** * Perform some initializations */ void controller_font_menu::create_fontes_list () { create_sprites_list (); Uint32 i; /* fisrt element of the list is NULL */ characters_list[0] = NULL; Uint32 j = 0; for (i = 0; i < MAX_OF_FONTS; i++, j = (j + 18) & SINUS_MASK) { sprite_font_menu *sprite = sprites_list[i]; characters_list[i + 1] = sprite; sprite->zeCosValue = j; sprite->set_x_coord (100); sprite->set_y_coord (300); sprite->set_image (26); } characters_list[i + 1] = NULL; objectLeft = sprites_list[i++]; objectRigh = sprites_list[i]; objectLeft->set_image (42); objectRigh->set_image (42); enable_sprites (); object_ptr = &characters_list[MAX_OF_FONTS]; scrolltexts = resources->load_texts (handler_resources::TEXTS_SCROLL_MENU, 1, 0, 0); scrollText = scrolltexts[0]; scroll_ptr = scrollText; } /** * Moving of the fonts */ void controller_font_menu::move_chars () { Sint32 a, b, width; Sint16 *table, *sinPT, *cosPT; sprite_font_menu *sprite; sprite_font_menu *zzBOB; /* convert unsigned to signed */ Sint32 res = (Sint32) resolution; sinPT = table_sinL; cosPT = table_cosL; /* * vertical moving of the characters */ /* determine the width of scrolling text */ a = (offset_xx1 + 3) & SINUS_MASK; offset_xx1 = a; table = sinPT + a; width = ((*table * 10 * res) >> SINUS_DECA) + 132 * res; Sint32 depla = 1; if (birth_flag) { depla *= 2; } sprite_font_menu **sprite_fonts = object_ptr; for (Uint32 i = 0; i < MAX_OF_FONTS; i++) { if (NULL == *sprite_fonts) { sprite_fonts = &characters_list[MAX_OF_FONTS]; } sprite = *(sprite_fonts--); a = sprite->zeCosValue + depla; /* read a new character */ if (a >= 256) { char *sText = scroll_ptr; Uint32 c = (Uint32) * sText; /* end of text, restart it! */ if (0 == c) { sText = scrollText; scroll_ptr = sText; c = *sText; } scroll_ptr++; c -= 32; b = 127; c = c & b; b = asciiToBob[c]; sprite->set_image (b); /* fisrt element of the list? */ if (NULL == *(object_ptr - 1)) { object_ptr = &characters_list[MAX_OF_FONTS + 1]; } object_ptr--; } /* radius only varies on 180 degree */ a = a & 255; sprite->zeCosValue = a; table = cosPT + a; a = ((*table * width) >> SINUS_DECA) + 152 * res; sprite->set_x_coord (a); } /* * vertical moving of the characters */ /* and 0x1ff => value 0 to 511 */ a = (offset_yy1 + 2) & SINUS_MASK; offset_yy1 = a; depla = 4; if (birth_flag) { depla *= 2; } sprite_fonts = object_ptr; Sint32 zerad = 25 * res; Sint32 zeoff = 200 * res; for (Uint32 i = 0; i < MAX_OF_FONTS; i++) { if (*sprite_fonts == NULL) { sprite_fonts = &characters_list[MAX_OF_FONTS]; } sprite = *(sprite_fonts--); a = (a + depla) & SINUS_MASK; table = sinPT + a; b = ((*table * zerad) >> SINUS_DECA) + zeoff; sprite->set_y_coord (b); } /* move the left mask */ sprite = objectRigh; table = cosPT; a = ((*table * width) >> SINUS_DECA) + 152 * res; sprite->set_x_coord (a); zzBOB = *(++sprite_fonts); a = zzBOB->get_y_coord (); sprite->set_y_coord (a); /* move the right mask */ sprite = objectLeft; table = cosPT + 255; a = ((*table * width) >> SINUS_DECA) + 152 * res; sprite->set_x_coord (a); zzBOB = *object_ptr; a = zzBOB->get_y_coord (); sprite->set_y_coord (a); } char controller_font_menu::asciiToBob[128] = { 26, // 32 ' ' space 37, // 33 '!' 39, // 34 ''' 26, // 35 '#' (space) 26, // 36 '$' (space) 26, // 37 '%' (space) 26, // 38 '&' (space) 39, // 39 "'" 26, // 40 '(' (space) 26, // 41 ')' (space) 26, // 42 '*' (space) 26, // 43 '+' (space) 40, // 44 ',' 41, // 45 '-' 38, // 46 '.' 26, // 47 '/' (space) 27, // 48 '0' 28, // 49 '1' 29, // 50 '2' 30, // 51 '3' 31, // 52 '4' 32, // 53 '5' 33, // 54 '6' 34, // 55 '7' 35, // 56 '8' 36, // 57 '9' 26, // 58 ':' (space) 26, // 59 ';' (space) 26, // 60 '<' (space) 26, // 61 '=' (space) 26, // 62 '>' (space) 26, // 63 '?' (space) 26, // 64 '@' (space) 00, // 65 'A' 01, // 66 'B' 02, // 67 'C' 03, // 68 'D' 04, // 69 'E' 05, // 70 'F' 06, // 71 'G' 7, // 72 'H' 8, // 73 'I' 9, // 74 'J' 10, // 75 'K' 11, // 76 'L' 12, // 77 'M' 13, // 78 'N' 14, // 79 'O' 15, // 80 'P' 16, // 81 'Q' 17, // 82 'R' 18, // 83 'S' 19, // 84 'T' 20, // 85 'U' 21, // 86 'V' 22, // 87 'W' 23, // 88 'X' 24, // 89 'Y' 25, // 90 'Z' 26, // 91 '[' (space) 26, // 92 '\' (space) 26, // 93 ']' (space) 26, // 94 '^' (space) 26, // 95 '_' (space) 26, // 96 '`' (space) 26, // 97 'a' (space) 26, // 98 'b' (space) 26, // 99 'c' (space) 26, // 100 'd' (space) 26, // 101 'e' (space) 26, // 102 'f' (space) 26, // 103 'g' (space) 26, // 104 'h' (space) 26, // 105 'i' (space) 26, // 106 'j' (space) 26, // 107 'k' (space) 26, // 108 'l' (space) 26, // 109 'm' (space) 26, // 110 'n' (space) 26, // 111 'o' (space) 26, // 112 'p' (space) 26, // 113 'q' (space) 26, // 114 'r' (space) 26, // 115 's' (space) 26, // 116 't' (space) 26, // 117 'u' (space) 26, // 118 'v' (space) 26, // 119 'w' (space) 26, // 120 'x' (space) 26, // 121 'y' (space) 26, // 122 'z' (space) 26, // 123 '{' (space) 26, // 124 '|' (space) 26, // 125 '}' (space) 26, // 126 '~' (space) 26 // 127 ' ' (space) }; tecnoballz-0.93.1/src/controller_viewfinders.cc0000664000175000017500000000570412412501752020672 0ustar brunobruno/** * @file controller_viewfinders.cc * @brief Paddles viewfinders controller * @date 2007-10-21 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_viewfinders.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_viewfinders.h" #include "../include/sprite_ball.h" /* * Create the viewfinders controller */ controller_viewfinders::controller_viewfinders () { littleInit (); max_of_sprites = 4; sprites_have_shades = false; sprite_type_id = sprite_object::VIEWFINDER; num_of_paddles = 0; } /* * Release the viewfinders controller */ controller_viewfinders::~controller_viewfinders () { if (NULL != paddles_list) { delete[]paddles_list; paddles_list = (sprite_paddle **) NULL; } release_sprites_list (); } /** * Perform some initializations */ void controller_viewfinders::initialize () { controller_paddles *paddles = controller_paddles::get_instance (); num_of_paddles = paddles->get_max_of_sprites (); if (num_of_paddles > 1) { /* the robot paddle does not have a viewfinder */ num_of_paddles--; } if (num_of_paddles == 0) { throw std::runtime_error ("(!)controller_viewfinders::initialize() " "failed! Number of paddles must be higher than 0!"); } try { paddles_list = new sprite_paddle *[num_of_paddles]; } catch (std::bad_alloc &) { std:: cerr << "(!)controller_viewfinders::initialize() " "not enough memory to allocate " << num_of_paddles << " list elements!" << std::endl; throw; } for (Uint32 i = 0; i < num_of_paddles; i++) { paddles_list[i] = paddles->get_paddle (i + 1); } } /** * Enable, move, anim and disable the wiewfinders */ void controller_viewfinders::run () { for (Uint32 i = 0; i < num_of_paddles; i++) { sprite_ball *ball = paddles_list[i]->stuck_ball; if (NULL != ball && ball->is_enabled) { sprites_list[i]->attract (ball); sprites_list[i]->enable (); sprites_list[i]->set_image (ball->direction / 4); } else { sprites_list[i]->disable (); } } } tecnoballz-0.93.1/src/sprite_paddle.cc0000664000175000017500000001466512412501752016727 0ustar brunobruno/** * @file sprite_paddle.cc * @brief A paddle sprite * @date 2007-10-23 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_paddle.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_paddle.h" /** * Create a paddle sprite object * @param has_projectiles true if the paddle can fire */ //sprite_paddle::sprite_paddle (controller_projectiles * fBump) sprite_paddle::sprite_paddle (bool has_projectiles) { clear_sprite_members (); length = 32 * resolution; is_vertical = false; fire_state = NOT_OWN_GUN; sticky_state = NOT_STICKY_PADDLE; enable_counter = 0; is_hit_ball = false; paddle_number = 0; stuck_ball = (sprite_ball *) NULL; if (has_projectiles) { projectiles = new controller_projectiles (); } else { projectiles = NULL; } invincible_counter = 0; blink_counter = 0; width_mini = 0; width_maxi = 0; shift_width = 0; if (resolution == 1) { shift_width = 3; } else { shift_width = 4; } } /** * Release a paddle sprite object */ sprite_paddle::~sprite_paddle () { /* Paddle had projectiles */ if (NULL != projectiles) { delete projectiles; projectiles = NULL; } } /** * Create and initializes the list of the projectiles for this paddle */ void sprite_paddle::create_projectiles_list () { projectiles->create_projectiles_list (this); } /** * Paddle fires projectiles */ void sprite_paddle::fire_projectiles () { if (fire_state != NOT_OWN_GUN) { projectiles->disponible (); } } /** * Move the paddle's projectiles */ void sprite_paddle::move_projectiles () { projectiles->fire (); projectiles->move (); } /** * Determine if the paddle must to be enabled and enable it if ok * @param is_team True if mode team enabled * @param size Paddle's width (8,16,24,32,40,48,56 or 64) * @param counter Counter which enable paddle if it * is greater than zero */ void sprite_paddle::enable_if_ok (bool is_team, Sint32 size, Uint32 counter) { length = size; is_enabled = false; enable_counter = counter; if (enable_counter > 0) { enable_counter--; is_enabled = true; } if (paddle_number == controller_paddles::BOTTOM_PADDLE || (paddle_number == controller_paddles::LEFT_PADDLE && is_team)) { enable_counter = 1; is_enabled = true; } select_image (size); } /** * Set the width and image of a horizontal paddle * @param size width of the paddle in pixels */ void sprite_paddle::set_width (Uint32 size) { length = size; collision_width = length; select_image (length); projectiles->disable_sprites (); } /** * Set the height and image of a vertical paddle * @param h Height of the paddle in pixels */ void sprite_paddle::set_height (Uint32 h) { length = h; collision_height = length; select_image (length); projectiles->disable_sprites (); } /** * Select the sprite image of the paddle * @param size Length of the paddle */ void sprite_paddle::select_image (Uint32 size) { Sint32 i = (size >> shift_width) - 2; if (fire_state != NOT_OWN_GUN) { i += 7; } if (sticky_state != NOT_STICKY_PADDLE) { i += 14; } set_image (i); } /** * Select the sprite image of the paddle */ void sprite_paddle::select_image () { select_image (length); } /** * Return the paddle number * @return 1 1 (bottom), 2 (right), 3 (top), 4 (left) or 5 (robot) */ Uint32 sprite_paddle::get_paddle_number () { return paddle_number; } /** * Transform into paddle glue in the bricks levels */ void sprite_paddle::set_glue () { sticky_state = FREE_STICKY_PADDLE; select_image (); } /** * Transform into paddle fire 1 in the bricks levels */ void sprite_paddle::set_fire_1 () { fire_state = OWN_GUN; select_image (); projectiles->set_fire_1 (); } /** * Transform into paddle fire 2 in the bricks levels */ void sprite_paddle::set_fire_2 () { fire_state = OWN_GUN; select_image (); projectiles->set_fire_2 (); } /** * Release ball if glued in the bricks levels */ void sprite_paddle::release_ball () { /* is the ball glued on the paddle? */ if (sticky_state == BUSY_STICKY_PADDLE) { /* paddle is free */ sticky_state = FREE_STICKY_PADDLE; } sprite_ball *ball = stuck_ball; if (NULL != ball) { stuck_ball = (sprite_ball *) NULL; ball->disable_stick (); } } /* * Glue a ball to the paddle into the bricks level * @param ball pointer to sprite_ball object */ void sprite_paddle::stick_ball (sprite_ball * ball) { if (stuck_ball != NULL) { stuck_ball->disable_stick (); } stuck_ball = ball; if (sticky_state == FREE_STICKY_PADDLE) { sticky_state = BUSY_STICKY_PADDLE; } } /** * Return paddle's length * @return length of the paddle in pixels */ Uint32 sprite_paddle::get_length () { return length; } /** * Check if the paddle is invincible (into guards levels) * @return True the paddle is invincible, false otherwise */ bool sprite_paddle::is_invincible () { return invincible_counter > 0 ? true : false; } /** * Set the temporary invincibility of the paddle * @param delay time delay of the invincibility */ void sprite_paddle::set_invincibility (Sint32 delay) { invincible_counter = delay; } /** * Handle invincible paddle in the guardians level */ void sprite_paddle::blink () { if (invincible_counter > 0) { invincible_counter--; if (blink_counter > 0) { is_enabled = false; blink_counter = 0; } else { is_enabled = true; blink_counter = 1; } } else { is_enabled = true; } } tecnoballz-0.93.1/src/right_panel_score.cc0000664000175000017500000002165512412501752017574 0ustar brunobruno/** * @file right_panel_score.cc * @brief The right panel score in the bricks levels * @date 2012-10-07 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: right_panel_score.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/right_panel_score.h" #include "../include/handler_resources.h" #include "../include/handler_high_score.h" right_panel_score * right_panel_score::panel_score_singleton = NULL; /** * Create the right panel score */ right_panel_score::right_panel_score () { initial_me (); gauge_height = GAUGE_HEIGHT * resolution; gigablitz_countdown = gauge_height; delay_gigablitz_countdown = 0; flip_white = false; gauge_height = 0; panel_width = 0; } /** * Release the right panel score */ right_panel_score::~right_panel_score () { destroy_me (); panel_score_singleton = NULL; } /** * Get the object instance * right_panel_score is a singleton * @return the right_panel_score object */ right_panel_score * right_panel_score::get_instance () { if (NULL == panel_score_singleton) { panel_score_singleton = new right_panel_score (); } return panel_score_singleton; } /** * First initialization * @param balls */ void right_panel_score::first_init () { initialize (); gauge_pixel = game_screen->get_pixel_data (GAUGE_XCOORD * resolution, GAUGE_YCOORD * resolution); draw_background (); } /** * Draw the background of the panel score */ void right_panel_score::draw_background () { bitmap_data *bmp = new bitmap_data (); bmp->load (handler_resources::BITMAP_RIGHT_PANEL); /* drawn panel score */ offscreen_surface* screen; if (has_background) { screen = background_screen; } else { screen = game_screen; } panel_width = bmp->get_width (); screen->blit_surface (bmp, 0, 0, 256 * resolution, 0, bmp->get_width (), 240 * resolution); delete bmp; bmp = (bitmap_data *) NULL; draw (screen, AREA_NUM_XCOORD * resolution, AREA_NUM_YCOORD * resolution, current_player->area_number, 2); draw (screen, LEVEL_NUM_XCOORD * resolution, LEVEL_NUM_YCOORD * resolution, current_player->level_number, 2); draw (screen, PLAYERNAME_XCOORD * resolution, PLAYERNAME_YCOORD * resolution, current_player->player_name); draw (screen, BEST_SCORE_XCOORD * resolution, BEST_SCORE_YCOORD * resolution, high_score->get_best_score (), 6); draw (screen, BEST_PLAYER_XCOORD * resolution, BEST_PLAYER_YCOORD * resolution, high_score->get_best_playername (), 0); } /** * Display score, number of lifes and number of bricks */ void right_panel_score::text_refresh () { draw (game_screen, SCORE_XCOORD * resolution, SCORE_YCOORD * resolution, current_player->score_value, 6); draw (game_screen, LIFES_XCOORD * resolution, LIFES_YCOORD * resolution, bricks_counter, 3); draw (game_screen, BRICKS_XCOORD * resolution, BRICKS_YCOORD * resolution, current_player->number_of_lifes, 2); } /** * Decrease the number of bricks * @param dec number to substract */ void right_panel_score::decrease_bricks_counter (Uint32 dec) { if (dec >= bricks_counter) { bricks_counter = 0; } else { bricks_counter -= dec; } } /** * Return the number of bricks * @return the number of bricks */ Uint32 right_panel_score::get_bricks_counter () { return bricks_counter; } /** * Intialize the bricks counter * @param counter the number of bricks */ void right_panel_score::set_bricks_counter (Uint32 counter) { bricks_counter = counter; } /** * Draw the gauge of the Gigablitz */ void right_panel_score::draw_gigablizt_gauge () { controller_gigablitz *gigablitz = controller_gigablitz::get_instance (); controller_balls *balls = controller_balls::get_instance (); if (keyboard->is_gigablitz_or_tilt () && !gigablitz->is_enable () && !balls->is_sticky_balls_remains ()) { if (++delay_gigablitz_countdown >= DELAY_GIGABLITZ_COUNTDOWN) { if (gigablitz_countdown > 0) { delay_gigablitz_countdown = 0; gigablitz_countdown = gigablitz_countdown - resolution; /* gauge maximum height reached? */ if (gigablitz_countdown == 0) { /* yes, launch the gigablitz!*/ gigablitz->shoot_paddle (); } } } } else { if (gigablitz_countdown < gauge_height) { delay_gigablitz_countdown = 0; gigablitz_countdown = gigablitz_countdown + resolution; } } /* draw the vertical gauge */ unsigned char *dest = (unsigned char *)gauge_pixel; Sint32 next = game_screen->get_width (); unsigned char pixel = 0; if (resolution == 1) { for (Uint32 i = 0; i < gigablitz_countdown; i++) { dest[0] = pixel; dest[1] = pixel; dest[2] = pixel; dest[3] = pixel; dest[4] = pixel; dest += next; } } else { for (Uint32 i = 0; i < gigablitz_countdown; i++) { dest[0] = pixel; dest[1] = pixel; dest[2] = pixel; dest[3] = pixel; dest[4] = pixel; dest[5] = pixel; dest[6] = pixel; dest[7] = pixel; dest[8] = pixel; dest[9] = pixel; dest += next; } } Sint32 h = (gauge_height) - gigablitz_countdown; flip_white = flip_white ? false : true; if (flip_white) { unsigned char pixel = 130; if (resolution == 1) { for (Sint32 i = 0; i < h; i++) { dest[0] = pixel; dest[1] = pixel; dest[2] = pixel; dest[3] = pixel; dest[4] = pixel; dest += next; } } else { for (Sint32 i = 0; i < h; i++) { dest[0] = pixel; dest[1] = pixel; dest[2] = pixel; dest[3] = pixel; dest[4] = pixel; dest[5] = pixel; dest[6] = pixel; dest[7] = pixel; dest[8] = pixel; dest[9] = pixel; dest += next; } } } else { if (resolution == 1) { unsigned char *e = temoinCol1; for (Sint32 i = 0; i < h; i++) { char pixel = (char) e[i]; dest[0] = pixel; dest[1] = pixel; dest[2] = pixel; dest[3] = pixel; dest[4] = pixel; dest += next; } } else { unsigned char *e = temoinCol2; for (Sint32 i = 0; i < h; i++) { unsigned char pixel = e[i]; dest[0] = pixel; dest[1] = pixel; dest[2] = pixel; dest[3] = pixel; dest[4] = pixel; dest[5] = pixel; dest[6] = pixel; dest[7] = pixel; dest[8] = pixel; dest[9] = pixel; dest += next; } } } } /** * Reset the countdown of the Gigablitz */ void right_panel_score::reset_gigablitz_countdown () { gigablitz_countdown = gauge_height; } /** * Return the width of the panel * @return Width panel scores in pixels */ Uint32 right_panel_score::get_width () { return panel_width; } /** List of 54 couleurs from gigablitz */ unsigned char right_panel_score::temoinCol1[GAUGE_HEIGHT] = { 255, 255, 254, 254, 253, 253, 252, 252, 251, 250, 250, 249, 248, 248, 247, 246, 246, 245, 244, 244, 243, 242, 242, 241, 240, 240, 239 }; unsigned char right_panel_score::temoinCol2[GAUGE_HEIGHT * 2] = { 255, 255, 255, 255, 254, 254, 254, 254, 253, 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 250, 249, 249, 249, 248, 248, 248, 247, 247, 247, 246, 246, 246, 245, 245, 245, 244, 244, 244, 243, 243, 243, 242, 242, 242, 241, 241, 241, 240, 240, 240, 239, 239, 239 }; tecnoballz-0.93.1/src/sprite_ship.cc0000664000175000017500000002617412412501752016437 0ustar brunobruno/** * @file sprite_ship.cc * @brief A flying enemy ships sprite * @date 2007-11-03 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_ship.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_ship.h" /** * Create the flying enemy ships sprite */ sprite_ship::sprite_ship () { atom_xmini = ATOM_XMINI * resolution; atom_xmaxi = ATOM_XMAXI * resolution; atom_ymini = ATOM_YMINI * resolution; atom_ymaxi = ATOM_YMAXI * resolution; clear_sprite_members (); littleInit (0, 0, 0, 0, 0, 0, 0); } /** * Release the flying enemy ships sprite */ sprite_ship::~sprite_ship () {} /** * Displacement of the ship */ void sprite_ship::move () { /* explosion of the ship */ if (is_exploding) { is_exploding = play_animation_once (); return; } /* * the ship is not currently enable */ if (enable_counter > 0) { /* the ship appears ? */ if (--enable_counter == 0) { if (!is_collisions_with_bricks (x_coord, y_coord)) { is_enabled = true; Sint32 *monPT = ghost_bobs + (random_counter & 31); #if __WORDSIZE == 64 random_counter += (long) this; #else random_counter += (Sint32) this; #endif Sint32 k = *monPT; frame_index_min = k; frame_index = k; frame_index_max = k + ATOM_ANIMA - 1; sprite_has_shadow = 1; set_image (k); #ifndef SOUNDISOFF audio->play_sound (handler_audio::SHIP_APPEAR); #endif } else { enable_counter = 1; } } } /* * the ship change its trajectory */ if (!(--atom_count)) { atom_ghost++; /* 16 values possible of standby */ atom_ghost &= 15; Sint32 *depla = tableGhost + atom_ghost; atom_count = *depla; atom_traje += 2; /* 16 values possible of trajectory */ atom_traje &= 30; depla = ghost_traj + atom_traje; x_offset = *(depla++) * resolution; y_offset = *depla * resolution; if (object_pos > 3) { x_offset = -x_offset; y_offset = -y_offset; } } play_animation_loop (); /* initialize the coordinates of the ship */ Sint32 x = x_coord + x_offset; if (x < atom_xmini) { x = atom_xmini; } else if (x > atom_xmaxi) { x = atom_xmaxi; } Sint32 y = y_coord + y_offset; if (y < atom_ymini) { y = atom_ymini; } else if (y > atom_ymaxi) { y = atom_ymaxi; } if (!is_collisions_with_bricks (x, y) || enable_counter) { x_coord = x; y_coord = y; } } /** * Check collisions between a ship and bricks * @param xcoord x coordinate of the ship * @param ycoord y coordinate of the ship * @return true if collision detected, otherwise false */ bool sprite_ship::is_collisions_with_bricks (Uint32 xcoord, Uint32 ycoord) { controller_bricks* bricks = controller_bricks::get_instance (); Sint32 brick_width = bricks->get_brick_width (); Sint32 y_space = bricks->getYOffset (); brick_info *bricks_map = bricks->get_bricks_map (); Sint32 c = 0; for (Sint32 i = 0; i < 4; i++) { Sint32 x = xcoord + collisionT[c++]; Sint32 y = ycoord + collisionT[c++]; /* width of brick: 32 pixels */ x /= brick_width; /* y-offset between 2 bricks: 16 lines */ y /= y_space; y *= controller_bricks::MAX_OF_BRICKS_HORIZONTALLY; x += y; brick_info *map = (bricks_map + x); /* collision between the ship and a brick? */ if (map->source_offset != 0) { return true; } } return false; } /** * Perform some initializations * @param time0 * @param appar Time before the first activation * @param index Number of the table of standby values (0 to 3) * @param power Strength * @param pos_x X-coordinate * @param pos_y Y-coordinate * @param offst Number of the image's explosion */ void sprite_ship::littleInit (Sint32 time0, Sint32 appar, Sint32 index, Sint32 power, Sint32 pos_x, Sint32 pos_y, Sint32 offst) { enable_counter = appar; apparition = time0; tableGhost = ghost_wait[index]; //table of the 16 standby values strength = power; strength_initial = power; x_coord = pos_x; y_coord = pos_y; atom_oexpl = offst; //number of the image's explosion is_exploding = false; atom_ghost = 0; //pointer on "tableGhost" x_offset = 0; y_offset = 0; Sint32 i = random_counter & 15; i++; i *= object_pos; atom_count = i; //trajectory change counter frame_period = 3; //rate animation frame_delay = 1; //rate animation counter i *= 2; i &= 31; atom_traje = i; #if __WORDSIZE == 64 random_counter += (long) this; #else random_counter += (Sint32) this; #endif i = 4 * resolution; collisionT[0] = i; collisionT[1] = i; collisionT[2] = collision_width - i; collisionT[3] = i; collisionT[4] = collision_width - i; collisionT[5] = collision_height - i; collisionT[6] = i; collisionT[7] = collision_height - i; } /** * Ship destroyed by a projectile: send gem, money or malus * @param blast a pointer to a prjectile sprite */ void sprite_ship::destroy (sprite_projectile * blast) { if (enable_counter > 0) { return; } explode (); Sint32 h = bonus_or_penalty[random_counter & 0xF]; //h = CODE_GEMME; //test only switch (h) { case CODE_GEMME: { controller_gems* gems = controller_gems::get_instance (); gems->send (blast); } break; case CODE_MALUS: { controller_capsules* capsules = controller_capsules::get_instance (); capsules->send_penalty_or_bonus (blast); } break; case CODE_MONEY: { controller_moneys* moneys = controller_moneys::get_instance (); moneys->send_money (blast); } break; } } /** * Ship destroyed by a ball: send gem, money or malus * @param ball a pointer to a balll sprite */ void sprite_ship::destroy (sprite_ball * ball) { if (enable_counter > 0) { return; } explode (); Uint32 h = bonus_or_penalty[random_counter & 0xF]; //h = CODE_GEMME; //test only switch (h) { case CODE_GEMME: { controller_gems* gems = controller_gems::get_instance (); gems->send (ball); } break; case CODE_MALUS: { controller_capsules* capsules = controller_capsules::get_instance (); capsules->send_penalty_or_bonus (ball); } break; case CODE_MONEY: { controller_moneys* moneys = controller_moneys::get_instance (); moneys->send_money (ball); } break; } } /** * Explode the ship */ void sprite_ship::explode () { sprite_has_shadow = false; random_counter = random_counter + frame_index; is_exploding = true; strength = strength_initial; /* time before activation */ enable_counter = apparition + (random_counter & 63); frame_index = atom_oexpl; frame_index_min = atom_oexpl; frame_index_max = atom_oexpl + ATOM_ANIMA - 1; set_image (frame_index); frame_delay = frame_period; #ifndef SOUNDISOFF audio->play_sound (handler_audio::SHIP_EXPLODE); #endif } /** Values of possible time during which a BouiBoui keep the same * trajectory */ Sint32 sprite_ship::ghostWait1[16] = { 50, 50, 30, 50, 20, 12, 8, 50, 45, 32, 12, 56, 33, 22, 22, 20 }; Sint32 sprite_ship::ghostWait2[16] = { 40, 20, 30, 47, 22, 33, 50, 50, 55, 52, 42, 32, 42, 32, 42, 32 }; Sint32 sprite_ship::ghostWait3[16] = { 10, 10, 20, 27, 12, 13, 20, 10, 10, 20, 10, 25, 26, 12, 32, 33 }; Sint32 sprite_ship::ghostWait4[16] = { 60, 20, 50, 37, 42, 33, 33, 20, 20, 22, 33, 70, 20, 22, 32, 32 }; Sint32 * sprite_ship::ghost_wait[4] = { ghostWait1, ghostWait2, ghostWait3, ghostWait4 }; //----------------------------------------------------------------------------- // offsets x, y //----------------------------------------------------------------------------- Sint32 sprite_ship::ghost_traj[32] = { 0, 1, 0, 0, -1, 0, 0, 0, 0, -1, -1, 1, -1, -1, -1, 0, -1, 1, 1, -1, 1, -1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1 }; //----------------------------------------------------------------------------- // index animations images of sprites (20 BouiBouis differents) //----------------------------------------------------------------------------- Sint32 sprite_ship::ghost_bobs[32] = { 0 * ATOM_ANIMA, 1 * ATOM_ANIMA, 2 * ATOM_ANIMA, 3 * ATOM_ANIMA, 4 * ATOM_ANIMA, 5 * ATOM_ANIMA, 6 * ATOM_ANIMA, 7 * ATOM_ANIMA, 8 * ATOM_ANIMA, 9 * ATOM_ANIMA, 10 * ATOM_ANIMA, 11 * ATOM_ANIMA, 12 * ATOM_ANIMA, 13 * ATOM_ANIMA, 14 * ATOM_ANIMA, 15 * ATOM_ANIMA, 16 * ATOM_ANIMA, 17 * ATOM_ANIMA, 18 * ATOM_ANIMA, 19 * ATOM_ANIMA, 0 * ATOM_ANIMA, 1 * ATOM_ANIMA, 2 * ATOM_ANIMA, 3 * ATOM_ANIMA, 4 * ATOM_ANIMA, 5 * ATOM_ANIMA, 6 * ATOM_ANIMA, 7 * ATOM_ANIMA, 8 * ATOM_ANIMA, 9 * ATOM_ANIMA, 10 * ATOM_ANIMA, 11 * ATOM_ANIMA }; /** * Bonus or penalty code when a ship is destroyed */ Sint32 sprite_ship::bonus_or_penalty[16] = { CODE_GEMME, CODE_MONEY, CODE_MALUS, CODE_MONEY, CODE_MALUS, CODE_MALUS, CODE_MONEY, CODE_MALUS, CODE_MALUS, CODE_MALUS, CODE_MONEY, CODE_MALUS, CODE_MALUS, CODE_MALUS, CODE_MALUS, CODE_MONEY }; tecnoballz-0.93.1/src/supervisor_guards_level.cc0000664000175000017500000003124212412501752021053 0ustar brunobruno/** * @file supervisor_guards_level.cc * @brief Guardians level supervisor * @created 2003-01-09 * @date 2007-11-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor_guards_level.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/supervisor_guards_level.h" #include "../include/handler_resources.h" /** * Create the guards level supervisor */ supervisor_guards_level::supervisor_guards_level () { initialize (); tiles_map = new tilesmap_scrolling (); guards = controller_guardians::get_instance (); paddles = controller_paddles::get_instance (); font_game = controller_font_game::get_instance (); explosions = controller_explosions::get_instance (); bullets = controller_bullets::get_instance (); money_capsules = controller_moneys::get_instance (); power_up_capsules = controller_capsules::get_instance (); balls = controller_balls::get_instance (); viewfinders_paddles = controller_viewfinders::get_instance (); player_indicators = controller_indicators::get_instance (); gigablitz = controller_gigablitz::get_instance (); game_over = controller_game_over::get_instance (); metallic_spheres = new controller_spheres (); popup_menu = new handler_popup_menu (); sprite_playername = NULL; } /** * Release the guards level supervisor */ supervisor_guards_level::~supervisor_guards_level () { if (NULL != sprite_playername) { delete sprite_playername; sprite_playername = NULL; } delete popup_menu; delete metallic_spheres; delete game_over; delete gigablitz; delete player_indicators; delete viewfinders_paddles; delete balls; delete power_up_capsules; delete money_capsules; delete bullets; delete explosions; delete font_game; delete paddles; delete guards; delete tiles_map; release (); } /** * Initializations of the guardian's level */ void supervisor_guards_level::first_init () { game_screen->clear (); #ifndef SOUNDISOFF audio->play_music (handler_audio::MUSICGUARD); audio->enable_sound (); #endif sprites->reset (); next_phase = 0; gameover_counter = 0; count_next = 0; is_victory_initialized = false; is_victory = false; area_number = current_player->get_area_number (); level_number = current_player->get_level_number (); Sint32 grdP = current_player->getGuardPt (); if (is_verbose) { std::cout << ">supervisor_guards_level::first_init() " << "area_number: " << area_number << "; level_number: " << level_number << "; grdP: " << grdP << std::endl; } /* gigablitz sprites are contained separately and in its own bitmap */ gigablitz->create_gigablitz_sprites (); /* * sprites who are contained into the large bitmap */ resources->load_sprites_bitmap (); bullets->create_sprites_list (); guards->create_guardians_list (grdP); paddles->create_paddles_sprites (); balls->create_sprites_list (); money_capsules->create_sprites_list (); power_up_capsules->create_sprites_list (6); player_indicators->create_indicators_sprites (); explosions->create_explosions_list (); viewfinders_paddles->create_sprites_list (); /* mobile characters at the end of the level */ font_game->create_sprites_list (); game_over->create_sprites_list (); metallic_spheres->create_sprites_list (); /* initialize escape menu */ popup_menu->first_init (sprites_bitmap); resources->release_sprites_bitmap (); /* initialize controller of the big letters animated composing the word * "game over" */ game_over->first_init (32 * resolution); init_level (); /* initialize background vertical scrolling */ tiles_map->initialize (); display->lock_surfaces (); /* * initialize the balls controller * */ balls->init ( /* time delay before ball leaves paddle */ level_desc->ball_release_time, 0, /* time delay before ball accelerates */ 50 * 99, /* time delay before titl available */ level_desc->tilt_delay, /* ball speed 3 or 4 */ level_desc->starting_speed); /* in the guardians levels, the balls are always forced to power 2 */ balls->set_power_2 (); money_capsules->initialize (3 + difficulty_level, player_indicators); /* initialize le capsules controller */ power_up_capsules->initialize ( /* delay of appearance of a penalty capsule */ level_desc->capsules_frequency * difficulty_level, /* list of penalties capsules */ level_desc->capsules_list); /* initialize mobile characters at the end of the level */ font_game->initialize (level_number, 32 * resolution); viewfinders_paddles->initialize (); display->unlock_surfaces (); keyboard->clear_command_keys (); keyboard->set_grab_input (true); sprite_display_scores *pOver = game_over->get_sprite_high_score (); sprite_playername = pOver->string2bob (current_player->get_name ()); sprites->add (sprite_playername); sprite_playername->enable (); sprite_playername-> set_coordinates ((display->get_width () - sprite_playername->get_sprite_width ()) / 2, resolution); sprite_playername->set_draw_method (sprite_object::COPY_FROM_BITMAP); if (is_verbose) { std::cout << ">supervisor_guards_level::first_init() End!" << std::endl; } } /** * The main loop of the guardians phase */ Uint32 supervisor_guards_level::main_loop () { Sint32 popup_event = -1; /* * gameover: the player has no more lives */ if (current_player->get_num_of_lifes () <= 0) { if (gameover_counter > 0) { #ifndef SOUNDISOFF audio->disable_sound (); #endif paddles->disable_all_paddles (); power_up_capsules->disable_sprites (); money_capsules->disable_sprites (); guards->disable_sprites (); explosions->disable_sprites (); font_game->disable_sprites (); gigablitz->disable_sprites (); balls->disable_sprites (); bullets->disable_sprites (); if (is_victory && !is_victory_initialized) { metallic_spheres->initialize (); tiles_map->switch_map (tilesmap_scrolling::TILES_COLOR_CONGRATULATIONS, tilesmap_scrolling::MAP_CONGRATULATIONS); scroll_speed = 1; scroll_start_delay = 300; is_victory_initialized = true; } } gameover_counter++; display->wait_frame (); if (scroll_start_delay > 0) { scroll_start_delay--; tiles_map->scroll (0); } else { tiles_map->scroll (scroll_speed); } display->lock_surfaces (); viewfinders_paddles->run (); player_indicators->display_money_and_lifes (); font_game->move (); sprites->draw (); if (gameover_counter >= 1) { game_over->run (is_victory); if (is_victory) { /* animate the metal spheres */ metallic_spheres->run (); } } display->unlock_surfaces (); display->window_update (); if (keyboard->wait_key () && gameover_counter > 150) { current_player = handler_players::get_next_player (current_player, &next_phase, guards-> get_max_of_sprites () + 1); } } else { /* * game running ! */ display->wait_frame (); if (!keyboard->command_is_pressed (handler_keyboard::COMMAND_KEY_PAUSE)) { run_scroll (); tiles_map->scroll (scroll_speed); display->lock_surfaces (); paddles->move_paddle (); paddles->check_if_release_ball (); balls->run_in_guardians_level (); viewfinders_paddles->run (); /* moving guards, and fire bullets and gigablitz */ guards->run (); bullets->move (); bullets->check_paddle_collisions (); money_capsules->move_bottom (); power_up_capsules->move_in_guardians_level (); font_game->move (); player_indicators->display_money_and_lifes (); /* move Gigablitz and check collision with paddle */ gigablitz->run_in_guardians_level (); explosions->play_animation (); bullets->play_animation_loop (); } else { bullets->play_animation_loop (); tiles_map->scroll (0); display->lock_surfaces (); } /* display all sprites in the game offscreen */ sprites->draw (); popup_event = popup_menu->run (); display->unlock_surfaces (); display->window_update (); } /* next level */ if (guards->is_guardians_destroyed () && !is_victory) { if (count_next > 0) { count_next++; gigablitz->disable_sprites (); balls->disable_sprites (); bullets->disable_sprites (); if (count_next > 500 || keyboard->wait_key()) { is_victory = current_player->zlastlevel (); if (is_victory) { current_player->remove_all_lifes (); count_next = 0; } else { current_player = handler_players::get_next_player (current_player, &next_phase, guards->get_max_of_sprites () + 1); } } } else { font_game->enable (); gigablitz->disable_sprites (); balls->disable_sprites (); bullets->disable_sprites (); count_next = 1; } } /* cheat mode: F2=destroyed the two guards / F3=guard 1 / F4=guard 2 */ cheat_keys (); /* escape key to quit the game! */ if (keyboard->command_is_pressed (handler_keyboard::QUIT_TECNOBALLZ) || popup_event == handler_popup_menu::QUIT_TECNOBALLZ) { next_phase = LEAVE_TECNOBALLZ; } if (keyboard->command_is_pressed (handler_keyboard::CAUSE_GAME_OVER) || popup_event == handler_popup_menu::CAUSE_GAME_OVER) { current_player->remove_all_lifes (); } if (keyboard->command_is_pressed (handler_keyboard::QUIT_TO_MAIN_MENU) || popup_event == handler_popup_menu::QUIT_TO_MAIN_MENU) { next_phase = MAIN_MENU; } return next_phase; } /** * Determine the pointer on the guardians difficulty level */ void supervisor_guards_level::init_level () { level_desc = ptLev_data->get_guardians_levels_params (area_number, level_number); scroll_type = level_desc->scroll_id; scroll_start_delay = level_desc->scroll_delay; scroll_speed = 0; } /** * Handle speed et behavior of the background scrolling */ void supervisor_guards_level::run_scroll () { if (scroll_start_delay > 0) { scroll_start_delay--; scroll_speed = 0; return; } sprite_bullet *bullet = bullets->get_last_bullet (); sprite_ball *ball = balls->get_first_ball (); scroll_speed = guards->get_scrolling_speed (scroll_type, scroll_speed, ball, bullet); } /** * Cheat mode: F2=destroyed the two guards / F3=guard 1 / F4=guard 2 */ void supervisor_guards_level::cheat_keys () { if (!is_enabled_cheat_mode) { return; } if (!keyboard->key_is_pressed (SDLK_RSHIFT) || keyboard->key_is_pressed (SDLK_LSHIFT) || !keyboard->key_is_pressed (SDLK_RCTRL) || keyboard->key_is_pressed (SDLK_LCTRL) || keyboard->key_is_pressed (SDLK_RALT) || keyboard->key_is_pressed (SDLK_LALT)) { return; } if (keyboard->key_is_pressed (SDLK_F2)) { guards->killguards (); } if (keyboard->key_is_pressed (SDLK_F3)) { guards->killguards (1); } if (keyboard->key_is_pressed (SDLK_F4)) { guards->killguards (2); } } tecnoballz-0.93.1/src/controller_capsules.cc0000664000175000017500000006166012412501752020167 0ustar brunobruno/** * @file controller_capsules.cc * @brief Capsules controller * @date 2007-10-31 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: controller_capsules.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/controller_capsules.h" #include "../include/handler_display.h" #include "../include/handler_keyboard.h" #include "../include/handler_players.h" #include "../include/sprite_projectile.h" #include "../include/handler_players.h" /** * Create the capsules controller */ controller_capsules::controller_capsules () { littleInit (); frame_delay = 0; frame_period = 5; frame_index = 0; capsule_delay_counter = 0; capsule_delay = 0; bricks_breaked_count = 0; num_of_caspules_bought = 0; capsules_released_count = 0; bonus_delay = 0; shopping_cart_index = 0; max_of_sprites = 0; sprites_have_shades = true; /* additional table to drawing pixel by pixel is required * for color cycling of the chance capsule */ is_draw_pixel_by_pixel = true; sprite_type_id = sprite_object::CAPSULES; shopping_cart = NULL; } /** * Release capsules controller */ controller_capsules::~controller_capsules () { release_sprites_list (); } /** * Perform some initializations * @param delay Time interval between two penalty/bonus capsules * @param random Pointer to the list of penalties/bonuses capsules */ void controller_capsules::initialize (Uint32 delay, const Uint32 * random) { controller_paddles *paddles = controller_paddles::get_instance (); paddle_selected = paddles->get_paddle (controller_paddles::BOTTOM_PADDLE); capsule_delay = delay; bonus_delay = 0; random_list = random; capsule_delay_counter = 0; bricks_breaked_count = 0; capsules_released_count = 0; sprite_capsule *capsule = sprites_list[0]; for (Uint32 i = 0; i < max_of_sprites; i++) { capsule = sprites_list[i]; capsule->init_members (); } frame_period = capsule->frame_period; if (current_phase == BRICKS_LEVEL) { controller_bricks *bricks = controller_bricks::get_instance (); Uint32 numof_bricks = bricks->get_num_of_bricks (); shopping_cart = current_player->get_shopping_cart (); num_of_caspules_bought = current_player->get_numof_items_in_shopping_cart (); /* at least a bought bonus? */ if (num_of_caspules_bought > 0) { bonus_delay = (numof_bricks - numof_bricks / 2) / num_of_caspules_bought; } else { /* no bonus bought in the shop, * initialize with the maximum value */ bonus_delay = numof_bricks + 1; } } } /** * Check if send a bonus or penalty capsule from brick * @param brick Pointer to the brick touched by a ball */ void controller_capsules::send_capsule_from_brick (brick_redraw * brick) { bricks_breaked_count++; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *caspule = sprites_list[i]; if (caspule->is_enabled) { continue; } /* * Send a random penalty or bonus capsule */ capsule_delay_counter++; if (capsule_delay_counter > capsule_delay) { capsule_delay_counter = 0; caspule->enable_capsule (brick, random_list[random_counter & 0x3F]); return; } /* * Send a bonus capsule bought in th shop */ if (num_of_caspules_bought > capsules_released_count && bricks_breaked_count > bonus_delay) { bricks_breaked_count = 0; capsules_released_count++; Sint32 id = shopping_cart[shopping_cart_index]; if (id == 0) { id = shopping_cart[0]; shopping_cart_index = 0; } shopping_cart_index++; caspule->enable_capsule (brick, id); } } return; } /** * Send a penalty from a ship in bricks level * @param ball Pointer to the ball sprite which touched the ship */ void controller_capsules::send_penalty_or_bonus (sprite_ball * ball) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *capsule = sprites_list[i]; if (capsule->is_enabled) { continue; } capsule->enable_capsule (ball, random_list[random_counter & 0x3F]); return; } } /** * Send a penalty from a ship in bricks level * @param ball Pointer to the projectile sprite which touched the ship */ void controller_capsules::send_penalty_or_bonus (sprite_projectile * blast) { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *capsule = sprites_list[i]; if (capsule->is_enabled) { continue; } capsule->enable_capsule (blast, random_list[random_counter & 0x3F]); return; } } /** * Check if send a bonus capsule in the guards level * @param ball Pointer to a ball sprite which touched the guardian */ void controller_capsules::check_if_send_capsule (sprite_ball * ball) { capsule_delay_counter++; if (capsule_delay_counter <= capsule_delay) { return; } for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *capsule = sprites_list[i]; if (capsule->is_enabled) { continue; } capsule_delay_counter = 0; capsule->enable_guardian_capsule (ball, random_list[random_counter & 0x3F]); return; } } /** * Initialize the coordinattes of the bonus capsules in the shop */ void controller_capsules::create_shop_sprites_list () { create_sprites_list (supervisor_shop::MAX_OF_CAPSULES_BOUGHT + 2, false); Uint32 maxof = supervisor_shop::MAX_OF_CAPSULES_BOUGHT; sprite_capsule **caspules = sprites_list; sprite_capsule *caspule = caspules[0]; Uint32 h = caspule->sprite_height + 1; Sint32 x = SHOP_XCOORD_CAPSULE * resolution; Sint32 y = SHOP_YCOORD_CAPSULE * resolution; for (Uint32 i = 0; i < maxof; i++) { caspule = *(caspules++); caspule->set_coordinates (x, y); caspule->disable (); y += h; } /* initialize caspule sprite object for the drag and drop */ caspule = *(caspules++); caspule->set_coordinates (0, 0); caspule->disable (); /* initialize caspule sprite object that display indicator */ caspule = *caspules; caspule->set_coordinates (SHIP_XCOORD_INDICATOR * resolution, SHIP_YCOORD_INDICATOR * resolution); caspule->disable (); overview_capsule = caspule; } /** * Set the overview capsule in the shop * @id id capsule identifier */ void controller_capsules::set_overview_capsule (Uint32 id) { overview_capsule->set_in_shop (id); } /** * Move and collision with paddles in bricks levels */ void controller_capsules::move_in_bricks_level () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *capsule = sprites_list[i]; capsule->play_animation_loop (); sprite_paddle *paddle = capsule->move (); if (NULL != paddle) { Uint32 id = capsule->get_id (); run_in_bricks_level (paddle, id); } } } /** * Move and collision with paddle in guardians levels */ void controller_capsules::move_in_guardians_level () { for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *capsule = sprites_list[i]; capsule->play_animation_loop (); sprite_paddle *paddle = capsule->move (); if (NULL != paddle) { Uint32 id = capsule->get_id (); run_in_guards_level (paddle, id); } } } /** * Play capsules animation in shop * @param speed speed of the animation 1 or 2 */ void controller_capsules::play_animation_in_shop (Uint32 speed) { if (--frame_delay <= 0) { frame_delay = frame_period / speed; if (++frame_index >= sprite_capsule::NUM_OF_IMAGES) { frame_index = 0; } } Uint32 offset = frame_index; sprite_capsule **caspules = sprites_list; for (Uint32 i = 0; i < max_of_sprites; i++) { sprite_capsule *caspule = *(caspules++); caspule->set_image (caspule->frame_index_min + offset); } } /** * Enable a bonus or a penalty with the keyboard */ void controller_capsules::check_cheat_keys () { if (!is_enabled_cheat_mode) { return; } if (keyboard->key_is_pressed (SDLK_LSHIFT) || keyboard->key_is_pressed (SDLK_LCTRL) || keyboard->key_is_pressed (SDLK_RALT) || #ifndef UNDER_DEVELOPMENT !keyboard->key_is_pressed (SDLK_RSHIFT) || !keyboard->key_is_pressed (SDLK_RCTRL) || #else keyboard->key_is_pressed (SDLK_RSHIFT) || keyboard->key_is_pressed (SDLK_RCTRL) || #endif keyboard->key_is_pressed (SDLK_LALT)) { return; } Sint16 *keys = cheat_keys; /* read SDL key code */ while (Sint16 key = *(keys++)) { Sint16 capsule_id = *(keys++); if (keyboard->key_is_pressed (key)) { *(keys++) = 1; } else { if (*keys == 1) { run_in_bricks_level (paddle_selected, capsule_id); } *(keys++) = 0; } } } /** * Enable an option, bonus or penalty, which can possibly come from * a capsule collected by a paddle in the bricks levels * @param paddle Paddle which collected the caspule * @param capsule_id Option identifier */ void controller_capsules::run_in_bricks_level (sprite_paddle * paddle, Uint32 capsule_id) { paddle_selected = paddle; controller_paddles *paddles = controller_paddles::get_instance (); short_info_messages *messages = short_info_messages::get_instance (); controller_balls *balls = controller_balls::get_instance (); sprite_wall *wall = sprite_wall::get_instance (); if (capsule_id == sprite_capsule::CHANCE) { capsule_id = randomlist[random_counter & 127]; } switch (capsule_id) { case sprite_capsule::GLUE: #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_TRANSFORMATION); #endif messages->send_message_request (short_info_messages::GLUE_OPTION); paddle->set_glue (); break; case sprite_capsule::NEXT_LEVEL: { messages->send_message_request (short_info_messages::NEXT_LEVEL); right_panel_score *panel = right_panel_score::get_instance (); panel->set_bricks_counter (0); } break; case sprite_capsule::FIRE_POWER_1: #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_TRANSFORMATION); #endif messages->send_message_request (short_info_messages::SIMPLE_FIRE); paddle->set_fire_1 (); break; case sprite_capsule::FIRE_POWER_2: #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_TRANSFORMATION); #endif messages->send_message_request (short_info_messages::COOL_FIRE); paddle->set_fire_2 (); break; case sprite_capsule::SHRINK_PADDLE: #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_TRANSFORMATION); #endif messages->send_message_request (short_info_messages::SMALL_PADDLE); paddles->shrink_paddles (); break; case sprite_capsule::EXPAND_PADDLE: #ifndef SOUNDISOFF audio->play_sound (handler_audio::PADDLE_TRANSFORMATION); #endif messages->send_message_request (short_info_messages::BIG_PADDLE); paddles->expand_paddles (); break; case sprite_capsule::LOSE_A_LIFE: #ifndef SOUNDISOFF audio->play_sound (handler_audio::LOST_LIFE); #endif messages->send_message_request (short_info_messages::LOST_FILE); current_player->remove_life (1); break; case sprite_capsule::EXTRA_LIFE: #ifndef SOUNDISOFF audio->play_sound (handler_audio::EXTRA_LIFE); #endif messages->send_message_request (short_info_messages::WIN_LIFE); current_player->add_life (1); break; case sprite_capsule::EXTRA_BALLS: #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif messages->send_message_request (short_info_messages::EXTRA_BALLS); balls->extra_balls (); break; case sprite_capsule::MULTI_BALLS: #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif messages->send_message_request (short_info_messages::MULTI_BALLS); balls->multi_balls (); break; case sprite_capsule::POWER_BALL_1: messages->send_message_request (short_info_messages::POWERBALLS); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->set_power_1 (); break; case sprite_capsule::POWER_BALL_2: messages->send_message_request (short_info_messages::MEGA_POWERBALLS); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->set_power_2 (); break; case sprite_capsule::INVERSE_CONTROL: messages->send_message_request (short_info_messages::INVERSE_COMMANDS); paddles->set_reverse_counter (50 * 4); break; /* increase the speed of the balls to the maximum * this option is only available as a part of chance capsule */ case sprite_capsule::MAXIMUM_SPEED_OF_BALLS: messages-> send_message_request (short_info_messages::MAXIMUM_ACCELERATION); balls->set_maximum_speed (); break; /* this option is never used */ case sprite_capsule::ENABLE_BOTTOM_PADDLE: paddle_selected = paddles->get_paddle (controller_paddles::BOTTOM_PADDLE); break; /* the option which enables the right paddle is only * available as a part of chance capsule */ case sprite_capsule::ENABLE_RIGHT_PADDLE: messages->send_message_request (short_info_messages::RIGHT_PADDLE); paddle_selected = paddles->get_paddle (controller_paddles::RIGHT_PADDLE); paddle_selected->enable (); break; /* the option which enables the top paddle is only * available as a part of chance capsule */ case sprite_capsule::ENABLE_TOP_PADDLE: messages->send_message_request (short_info_messages::TOP_PADDLE); paddle_selected = paddles->get_paddle (controller_paddles::TOP_PADDLE); paddle_selected->enable (); break; /* the option which enables the left paddle is only * available as a part of chance capsule */ case sprite_capsule::ENABLE_LEFT_PADDLE: messages->send_message_request (short_info_messages::LEFT_PADDLE); paddle_selected = paddles->get_paddle (controller_paddles::LEFT_PADDLE); paddle_selected->enable (); break; case sprite_capsule::BALL_SIZE_2: messages->send_message_request (short_info_messages::BIG_BALLS); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->set_size_2 (); break; case sprite_capsule::BALL_SIZE_3: messages->send_message_request (short_info_messages::HUGE_BALLS); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->set_size_3 (); break; case sprite_capsule::CHANCE: break; case sprite_capsule::ENABLE_HUGELY_OPTIONS: messages->send_message_request (short_info_messages::MAXIMUM_OPTIONS); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif paddles->set_maximum_paddles_size (); balls->add_balls (); balls->set_power_2 (); balls->set_size_3 (); paddle->set_glue (); paddle->set_fire_2 (); paddle_selected = paddles->get_paddle (2); paddle_selected->enable (); paddle_selected->set_glue (); paddle_selected->set_fire_2 (); paddle_selected = paddles->get_paddle (3); paddle_selected->enable (); paddle_selected->set_glue (); paddle_selected->set_fire_2 (); paddle_selected = paddles->get_paddle (4); paddle_selected->enable (); paddle_selected->set_glue (); paddle_selected->set_fire_2 (); break; /* options prices will be to 1 in the next shop * this bonus is only available as a part of chance capsule */ case sprite_capsule::SET_THE_PRICES_TO_1: messages->send_message_request (short_info_messages::BUDGET_PRICES); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif current_player->set_budget_prices (true); break; /* enable the bottom wall */ case sprite_capsule::BOTTOM_WALL: messages->send_message_request (short_info_messages::WALL_ENABLE); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif wall->enable (500); paddles->disable_robot (); break; /* enable the paddle robot */ case sprite_capsule::ROBOT_PADDLE: messages->send_message_request (short_info_messages::ROBOT_ENABLE); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif paddles->enable_robot (); wall->disable (); break; /* enable the balls control */ case sprite_capsule::BALLS_CONTROL: balls->enable_balls_control (); messages->send_message_request (short_info_messages::CONTROL_BALLS); #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif break; /* enable the magnetic eye, no capsule exists to activate it * this bonus is only available as a part of chance capsule */ case sprite_capsule::MAGNETIC_EYE: { controller_magnetic_eyes *eyes = controller_magnetic_eyes::get_instance (); eyes->create_eye (); } break; } } /** * Enable the capsule option in guardians level * @param paddle Paddle which collected the caspule * @param capsule_id Option identifier */ void controller_capsules::run_in_guards_level (sprite_paddle * paddle, Uint32 capsule_id) { paddle_selected = paddle; controller_balls *balls = controller_balls::get_instance (); switch (capsule_id) { case sprite_capsule::PADDLE_INVINCIBILITY: paddle->set_invincibility (200); break; case sprite_capsule::EXTRA_LIFE: #ifndef SOUNDISOFF audio->play_sound (handler_audio::EXTRA_LIFE); #endif current_player->add_life (1); break; case sprite_capsule::MULTI_BALLS: #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->multi_balls (); break; /* power ball 1 (ball size 2) */ case sprite_capsule::POWER_BALL_1: #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->set_size_2 (); break; /* power ball 2 (ball size 3) */ case sprite_capsule::POWER_BALL_2: #ifndef SOUNDISOFF audio->play_sound (handler_audio::COLLECT_CAPSULE); #endif balls->set_size_3 (); break; } } /** * List of the options which can be enabled by a chance capsule */ const Uint16 controller_capsules::randomlist[128] = { sprite_capsule::BOTTOM_WALL, sprite_capsule::MAGNETIC_EYE, sprite_capsule::FIRE_POWER_2, sprite_capsule::SHRINK_PADDLE, sprite_capsule::ROBOT_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::BALLS_CONTROL, sprite_capsule::BALL_SIZE_2, sprite_capsule::BALL_SIZE_3, sprite_capsule::MAGNETIC_EYE, sprite_capsule::ENABLE_LEFT_PADDLE, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::LOSE_A_LIFE, sprite_capsule::BALLS_CONTROL, sprite_capsule::GLUE, sprite_capsule::FIRE_POWER_1, sprite_capsule::FIRE_POWER_2, sprite_capsule::SHRINK_PADDLE, sprite_capsule::EXPAND_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::BALL_SIZE_2, sprite_capsule::BALL_SIZE_3, sprite_capsule::BALL_SIZE_3, sprite_capsule::ENABLE_LEFT_PADDLE, sprite_capsule::MAGNETIC_EYE, sprite_capsule::NEXT_LEVEL, sprite_capsule::BALLS_CONTROL, sprite_capsule::LOSE_A_LIFE, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::ROBOT_PADDLE, sprite_capsule::FIRE_POWER_1, sprite_capsule::FIRE_POWER_2, sprite_capsule::SHRINK_PADDLE, sprite_capsule::BOTTOM_WALL, sprite_capsule::EXTRA_BALLS, sprite_capsule::ROBOT_PADDLE, sprite_capsule::ROBOT_PADDLE, sprite_capsule::ROBOT_PADDLE, sprite_capsule::BALL_SIZE_2, sprite_capsule::BALL_SIZE_3, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::ENABLE_RIGHT_PADDLE, sprite_capsule::ENABLE_RIGHT_PADDLE, sprite_capsule::ENABLE_TOP_PADDLE, sprite_capsule::INVERSE_CONTROL, sprite_capsule::EXTRA_LIFE, sprite_capsule::EXTRA_LIFE, sprite_capsule::BOTTOM_WALL, sprite_capsule::MAGNETIC_EYE, sprite_capsule::SET_THE_PRICES_TO_1, sprite_capsule::SHRINK_PADDLE, sprite_capsule::ROBOT_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::BALL_SIZE_2, sprite_capsule::BOTTOM_WALL, sprite_capsule::FIRE_POWER_1, sprite_capsule::ROBOT_PADDLE, sprite_capsule::MAGNETIC_EYE, sprite_capsule::ROBOT_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::BOTTOM_WALL, sprite_capsule::BALL_SIZE_2, sprite_capsule::BALL_SIZE_3, sprite_capsule::ENABLE_TOP_PADDLE, sprite_capsule::ENABLE_LEFT_PADDLE, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::MAGNETIC_EYE, sprite_capsule::LOSE_A_LIFE, sprite_capsule::INVERSE_CONTROL, sprite_capsule::GLUE, sprite_capsule::FIRE_POWER_1, sprite_capsule::FIRE_POWER_2, sprite_capsule::SHRINK_PADDLE, sprite_capsule::EXPAND_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::BALL_SIZE_2, sprite_capsule::BALL_SIZE_3, sprite_capsule::BALL_SIZE_3, sprite_capsule::ENABLE_LEFT_PADDLE, sprite_capsule::BOTTOM_WALL, sprite_capsule::NEXT_LEVEL, sprite_capsule::INVERSE_CONTROL, sprite_capsule::LOSE_A_LIFE, sprite_capsule::BOTTOM_WALL, sprite_capsule::ROBOT_PADDLE, sprite_capsule::FIRE_POWER_1, sprite_capsule::FIRE_POWER_2, sprite_capsule::SHRINK_PADDLE, sprite_capsule::EXPAND_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, sprite_capsule::BALL_SIZE_2, sprite_capsule::BOTTOM_WALL, sprite_capsule::BOTTOM_WALL, sprite_capsule::ENABLE_RIGHT_PADDLE, sprite_capsule::ENABLE_RIGHT_PADDLE, sprite_capsule::ENABLE_TOP_PADDLE, sprite_capsule::INVERSE_CONTROL, sprite_capsule::BOTTOM_WALL, sprite_capsule::BOTTOM_WALL, sprite_capsule::GLUE, sprite_capsule::FIRE_POWER_1, sprite_capsule::SET_THE_PRICES_TO_1, sprite_capsule::SHRINK_PADDLE, sprite_capsule::EXPAND_PADDLE, sprite_capsule::EXTRA_BALLS, sprite_capsule::MULTI_BALLS, sprite_capsule::POWER_BALL_1, sprite_capsule::BOTTOM_WALL, sprite_capsule::BOTTOM_WALL }; /** * Cheat keys to enable options in bricks levels, only under development */ Sint16 controller_capsules::cheat_keys[] = { SDLK_F1, sprite_capsule::GLUE, 0, SDLK_F2, sprite_capsule::NEXT_LEVEL, 0, SDLK_F3, sprite_capsule::FIRE_POWER_1, 0, SDLK_F4, sprite_capsule::FIRE_POWER_2, 0, SDLK_F5, sprite_capsule::SHRINK_PADDLE, 0, SDLK_F6, sprite_capsule::EXPAND_PADDLE, 0, SDLK_F7, sprite_capsule::LOSE_A_LIFE, 0, SDLK_F8, sprite_capsule::EXTRA_LIFE, 0, SDLK_F9, sprite_capsule::EXTRA_BALLS, 0, SDLK_F10, sprite_capsule::MULTI_BALLS, 0, SDLK_F11, sprite_capsule::POWER_BALL_1, 0, SDLK_F12, sprite_capsule::POWER_BALL_2, 0, SDLK_a, sprite_capsule::INVERSE_CONTROL, 0, SDLK_z, sprite_capsule::MAXIMUM_SPEED_OF_BALLS, 0, SDLK_e, sprite_capsule::ENABLE_BOTTOM_PADDLE, 0, SDLK_r, sprite_capsule::ENABLE_RIGHT_PADDLE, 0, SDLK_t, sprite_capsule::ENABLE_TOP_PADDLE, 0, SDLK_y, sprite_capsule::ENABLE_LEFT_PADDLE, 0, SDLK_u, sprite_capsule::BALL_SIZE_2, 0, SDLK_i, sprite_capsule::BALL_SIZE_3, 0, SDLK_o, sprite_capsule::CHANCE, 0, SDLK_q, sprite_capsule::ENABLE_HUGELY_OPTIONS, 0, SDLK_s, sprite_capsule::SET_THE_PRICES_TO_1, 0, SDLK_d, sprite_capsule::BOTTOM_WALL, 0, SDLK_g, sprite_capsule::BALLS_CONTROL, 0, SDLK_h, sprite_capsule::MAGNETIC_EYE, 0, SDLK_j, sprite_capsule::MAGNETIC_EYE, 0, SDLK_k, sprite_capsule::ROBOT_PADDLE, 0, 0, 0, 0 }; tecnoballz-0.93.1/src/supervisor.cc0000664000175000017500000000267012412501752016322 0ustar brunobruno/** * @file supervisor.cc * @brief Virtual class for all supervisors * @date 2007-10-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: supervisor.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/supervisor.h" /** * Create supervisor object */ supervisor::supervisor () { initialize (); } /** * Release supervisor object */ supervisor::~supervisor () { release (); } void supervisor::initialize () { object_init (); next_phase = 0; } void supervisor::release () { object_free (); } void supervisor::first_init () { } Uint32 supervisor::main_loop () { return MAIN_MENU; } tecnoballz-0.93.1/src/sprite_guardian.cc0000664000175000017500000001472512412501752017265 0ustar brunobruno/** * @file sprite_guardian.cc * @brief The guardian sprite * @created 2003-01-09 * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_guardian.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_guardian.h" /** * Create a guardian sprite */ sprite_guardian::sprite_guardian () { energy_level = 0; canon_xcoord = 0; gigablitz_delay_counter = 0; gigablitz_frequency = 0; speed_of_guardian = 0; gard_colx1 = 0; gard_coly1 = 0; gard_colx2 = 0; gard_coly2 = 0; gard_ycent = 0; shot_delay_counter = 0; shoot_frequency = 0; gard_lissa = 0; gardptfire = 0; recently_touched = 0; is_blinking = false; hasardval2 = random_counter; if (hasardval2 < 0) { hasardval2 = -hasardval2; } } /** * Release a guardian sprite */ sprite_guardian::~sprite_guardian () { } /** * perform some initializations */ void sprite_guardian::initialize (gardlevel * guard, unsigned char *ptLis) { energy_level = guard->para_power * difficulty_level; //strength canon_xcoord = (guard->para_xcent * resolution) - (11 * resolution / 2); //middle x from where weapons starts gigablitz_delay_counter = guard->para_waitf / difficulty_level; gigablitz_frequency = gigablitz_delay_counter / difficulty_level; speed_of_guardian = guard->para_speed; if (difficulty_level == 4) { speed_of_guardian *= 2; } gard_colx1 = guard->para_colx1 * resolution; gard_coly1 = guard->para_coly1 * resolution; gard_colx2 = guard->para_colx2 * resolution; gard_coly2 = guard->para_coly2 * resolution; gard_ycent = (guard->para_ycent * resolution) - (11 * resolution / 2); shot_delay_counter = guard->para_wait2 / difficulty_level; shoot_frequency = guard->para_wait2 / difficulty_level; gard_tfire = &guard->para_tfire[0]; ptr_lissa1 = ptLis; ptr_lissa2 = ptLis; x_minimum = 6 * resolution; y_minimum = 2 * resolution; x_maximum = screen_width - sprite_width; y_maximum = screen_height - sprite_height; y_maximum = (232 - 8 - 1 - 16) * resolution; if (sprite_width == resolution * 32) { explode_frequency = 7; } else { explode_frequency = 3; } } /** * Move the guardian, fire the bullets and gigablitz * @param voffset vertical offset */ void sprite_guardian::run (Uint32 /* voffset */) { controller_explosions *explosions = controller_explosions::get_instance (); /** * guards is alive */ if (energy_level > 0) { Sint32 x = (ptr_lissa1[0]); x = x * (screen_width - sprite_width) / 192; Sint32 y = ptr_lissa1[1] * resolution; x_coord = x; y_coord = y; //y_coord = y + voffset; ptr_lissa1 = ptr_lissa1 + speed_of_guardian; Sint16 *ptest = (Sint16 *) ptr_lissa1; if (ptest[0] == -1) { ptr_lissa1 = ptr_lissa2; } is_blinking = is_blinking ? false : true; if (recently_touched > 0 && is_blinking) { is_enabled = false; recently_touched--; } else { is_enabled = true; } fire_bullets (); startBlitz (); } else { /* * the guard explodes */ if (explode_delay_counter > 0) { explode_delay_counter--; if (!(explode_delay_counter & explode_frequency)) { Sint32 xcoord = x_coord; Sint32 ycoord = y_coord; random_counter += xcoord; Sint32 vrand = random_counter; if (vrand < 0) { vrand = -vrand; } Sint32 val_1 = (vrand + explode_delay_counter - y_coord) % sprite_width; Sint32 val_2 = (hasardval2 - explode_delay_counter + y_coord) % sprite_height; xcoord += val_1; ycoord += val_2; explosions->add (xcoord, ycoord); hasardval2 = vrand; } is_blinking = is_blinking ? false : true; if (is_blinking) { is_enabled = false; } else { is_enabled = true; } } /* * the guard is dead */ else { is_enabled = false; } } } /** * Fire new bullets */ void sprite_guardian::fire_bullets () { if (shot_delay_counter-- > 0) { return; } if (y_coord > Sint32(80 * resolution)) { return; } shot_delay_counter = shoot_frequency; #ifndef SOUNDISOFF audio->play_sound (handler_audio::GUARDIAN_FIRE); #endif Sint32 nfire = gard_tfire[gardptfire]; if (nfire < 0) { nfire = gard_tfire[0]; gardptfire = 0; } /** Index of the next weapons */ gardptfire++; controller_bullets* bullets = controller_bullets::get_instance (); bullets->fire (nfire, this); } /** * Fire a new GigaBlitz */ void sprite_guardian::startBlitz () { if (gigablitz_delay_counter-- > 0) { return; } Uint32 v = random_counter & 7; if (sprite_width > 32 * resolution) { v = table_gga1[v]; } else { v = table_gga2[v]; } controller_gigablitz* gigablitz = controller_gigablitz::get_instance (); if (gigablitz->shoot_guardian (v, x_coord, y_coord, sprite_width)) { gigablitz_delay_counter = gigablitz_frequency; } } //----------------------------------------------------------------------------- // list of differents gigablitz //----------------------------------------------------------------------------- // Guard of 64/128 pixels const Sint32 sprite_guardian::table_gga1[8] = { 0, 1, 2, 3, 4, 5, 6, 5 }; // Guard of 32/64 pixels const Sint32 sprite_guardian::table_gga2[8] = { 6, 5, 4, 6, 5, 4, 6, 5 }; tecnoballz-0.93.1/src/handler_display.cc0000664000175000017500000004410512412501752017242 0ustar brunobruno/** * @file handler_display.cc * @briefi Handle displaying and updating with SDL * @created 2002-08-17 * @date 2014-08-15 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_display.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_display.h" #include "../include/handler_keyboard.h" #include "../include/handler_audio.h" #include "../include/handler_resources.h" char handler_display::window_title[25] = "TecnoballZ by TLK Games\0"; bool handler_display::optionfull = false; bool handler_display::optionsync = true; /** * Create the object */ handler_display::handler_display () { sdl_screen = (SDL_Surface *) NULL; game_surface = (SDL_Surface *) NULL; sdl_ticks_amount = 0; frames_counter_modulo = 0; tilt_offset = 0; /* 1000 / 50 = 20 */ game_speed = 20; delay_change_counter = 0; delay_ticks_amount = 0; delay_change_counter = DELAY_CHANGE_MAX; } /** * Release the display handler object */ handler_display::~handler_display () { if (NULL != game_screen) { delete game_screen; game_screen = NULL; } if (NULL != background_screen) { delete background_screen; background_screen = NULL; } if (SDL_WasInit (SDL_INIT_VIDEO) != 0) { if (is_verbose) { std:: cout << ">handler_display::~handler_display() SDL_VideoQuit()" << std::endl; } SDL_VideoQuit (); } SDL_Quit (); } /** * Initialize the SDL display and allocate surfaces */ void handler_display::initialize () { set_video_mode (); Uint32 height = window_height + offsetplus * 2; /** Create the main game offscreen */ game_screen = new offscreen_surface (window_width, height, bitspixels, offsetplus); game_surface = game_screen->get_surface (); game_screen_pitch = game_surface->pitch; game_screen_pixels = (char *) game_surface->pixels + game_screen_pitch * offsetplus; /** Create the background offscreen */ background_screen = new offscreen_surface (window_width, height, bitspixels, offsetplus); SDL_Surface *surface = background_screen->get_surface (); background_pixels = (char *) surface->pixels + surface->pitch * offsetplus; previous_sdl_ticks = SDL_GetTicks (); delay_value = 0; } /** * Initializes the video with SDL */ void handler_display::set_video_mode () { window_width = 320 * resolution; window_height = 240 * resolution; offsetplus = 64 * resolution; if (is_verbose) { std::cout << ">handler_display::set_video_mode() " << window_width << "x" << window_height << std::endl; } /* initializes SDL */ if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE | SDL_INIT_JOYSTICK) < 0) { std::cerr << "!handler_display::set_video_mode() " << "SDL_Init() return " << SDL_GetError () << std::endl; throw std::runtime_error ("!handler_display::set_video_mode() " "SDL_Init() failed!"); } /* test if the video mode is available */ Uint32 flag = SDL_ANYFORMAT; #ifdef TECNOBALLZ_HANDHELD_CONSOLE flag = SDL_SWSURFACE | SDL_FULLSCREEN; #endif if (optionfull) { flag = flag | SDL_FULLSCREEN; } Uint32 bpp = SDL_VideoModeOK (window_width, window_height, bitspixels, flag); if (0 == bpp) { std::cerr << "!handler_display::set_video_mode() " << "SDL_VideoModeOK() " << "return " << SDL_GetError () << std::endl; throw std::runtime_error ("!handler_display::set_video_mode() " "SDL_VideoModeOK() failed!"); } /* initialize the video mode */ sdl_screen = SDL_SetVideoMode (window_width, window_height, bitspixels, flag); if (NULL == sdl_screen) { std::cerr << "!handler_display::set_video_mode() " << "SDL_SetVideoMode() " << "return " << SDL_GetError () << std::endl; throw std::runtime_error ("!handler_display::set_video_mode() " "SDL_SetVideoMode() failed!"); } SDL_WM_SetCaption (window_title, window_title); #ifdef UNDER_DEVELOPMENT SDL_ShowCursor (SDL_ENABLE); #else SDL_ShowCursor (SDL_DISABLE); #endif SDL_EnableUNICODE (1); } /** * Return the screen's width * @return the width of the screen in pixels */ Uint32 handler_display::get_width () { return sdl_screen->w; } /** * Return the screen's height * @return the height of the screen in lines */ Uint32 handler_display::get_height () { return sdl_screen->h; } /** * Lock surfaces of the game offscreen and the background offscreen */ void handler_display::lock_surfaces () { game_screen->lock_surface (); background_screen->lock_surface (); } /** * Unlock surfaces of the game offscreen and background offscreen */ void handler_display::unlock_surfaces () { game_screen->unlock_surface (); background_screen->unlock_surface (); } /** * Return the number of bits per pixel * @return then number of bits per pixel, 8 for 256 colors */ Uint32 handler_display::get_bits_per_pixel () { return bitspixels; } /** * Display some SDL infos */ void handler_display::get_info () { const SDL_VideoInfo *vi; char namebuf[32] = { "123456789012345678901234567890\0" }; SDL_Rect **modes; Sint32 i; modes = SDL_ListModes (NULL, SDL_FULLSCREEN | SDL_HWSURFACE); if (modes == (SDL_Rect **) 0) { printf ("No modes available!\n"); return; } if (modes == (SDL_Rect **) - 1) printf ("All resolutions available.\n"); else { printf ("Available Modes\n"); for (i = 0; modes[i]; ++i) printf (" %d x %d\n", modes[i]->w, modes[i]->h); } SDL_WM_SetCaption ("TecnoballZ", 0); vi = SDL_GetVideoInfo (); printf ("The number of bits used to represent each pixel in a surface.Usually 8, 16, 24 or 32. BitsPerPixel=%d \n", vi->vfmt->BitsPerPixel); printf ("The number of bytes used to represent each pixel in a surface. Usually one to four BytesPerPixel=%d\n", vi->vfmt->BytesPerPixel); printf ("Rmask=%i Gmask=%i Bmask=%i Amask=%i \n", vi->vfmt->Rmask, vi->vfmt->Gmask, vi->vfmt->Bmask, vi->vfmt->Amask); printf ("Rshift=%i Gshift=%i Bshift=%i Ashift=%i \n", vi->vfmt->Rshift, vi->vfmt->Gshift, vi->vfmt->Bshift, vi->vfmt->Ashift); printf ("Rloss=%i Gloss=%i Bloss=%i Aloss=%i \n", vi->vfmt->Rloss, vi->vfmt->Gloss, vi->vfmt->Bloss, vi->vfmt->Aloss); printf ("Pixel value of transparent pixels. colorkey=%i \n", vi->vfmt->colorkey); printf ("Overall surface alpha value. alpha=%i \n", vi->vfmt->alpha); printf ("Is it possible to create hardware surfaces? hw_available=%i \n", vi->hw_available); printf ("Is there a window manager available wm_available=%i \n", vi->wm_available); printf ("Are hardware to hardware blits accelerated? blit_hw=%i \n", vi->blit_hw); printf ("Are hardware to hardware colorkey blits accelerated? blit_hw_CC=%i \n", vi->blit_hw_CC); printf ("Are hardware to hardware alpha blits accelerated? blit_hw_A=%i\n", vi->blit_hw_A); printf ("Are software to hardware blits accelerated? blit_sw=%i \n", vi->blit_sw); printf ("Are software to hardware colorkey blits accelerated? blit_sw_CC=%i \n", vi->blit_sw_CC); printf ("Are software to hardware alpha blits accelerated? blit_sw_A=%i \n", vi->blit_sw_A); printf ("Are color fills accelerated? blit_fill=%i \n", vi->blit_fill); printf ("Total amount of video memory in Kilobytes. video_mem=%i\n", vi->video_mem); char *c = SDL_VideoDriverName (namebuf, 32); printf ("the name of the video driver=%s\n", c); } /** * Switch to fullscreen or windows mode */ void handler_display::check_if_toggle_fullscreen () { if (keyboard->command_is_pressed (handler_keyboard::TOGGLE_FULLSCREEN) && keyboard->get_input_cursor_pos () < 0) { if (optionfull) { optionfull = false; } else { optionfull = true; } display->set_video_mode (); display->enable_palette (sdl_palette); } } /** * Synchronize the game's speed to the machine it's running on */ void handler_display::wait_frame () { frame_counter++; /* Get the number of milliseconds since the SDL library initialization */ Uint32 sdl_ticks = SDL_GetTicks () - previous_sdl_ticks; optionsync = true; if (optionsync) { delay_ticks_amount += sdl_ticks; if (--delay_change_counter <= 0) { delay_value = ((game_speed * DELAY_CHANGE_MAX) - delay_ticks_amount) / DELAY_CHANGE_MAX; delay_change_counter = DELAY_CHANGE_MAX; delay_ticks_amount = 0; if (delay_value <= 0) { delay_value = 1; } } if (delay_value > 0) { SDL_Delay (delay_value); } } previous_sdl_ticks = SDL_GetTicks (); /** Calculate the number of frames per second */ sdl_ticks_amount += sdl_ticks; if (++frames_counter_modulo >= 100) { if (0 != sdl_ticks_amount) { frames_per_second = 1000 * frames_counter_modulo / sdl_ticks_amount; } frames_counter_modulo = 0; sdl_ticks_amount = 0; } keyboard->read_events (); check_if_toggle_fullscreen (); #ifndef SOUNDISOFF audio->run (); #endif return; } /** * Return tne number of frames per second * @return the frame frequency */ Uint32 handler_display::get_frames_per_second () { return frames_per_second; } //------------------------------------------------------------------------------ // buffer & tampon: convert (x,y) to offset // input => zbase: start offset // => offsx: x coordinate // => offsy: y coordinate //------------------------------------------------------------------------------ Sint32 handler_display::ecran_next (Sint32 zbase, Sint32 offsx, Sint32 offsy) { return (zbase + offsy * game_screen_pitch + offsx); } /** * Initialize color palette for the current screen * @param pal pointer to color components */ void handler_display::enable_palette (unsigned char *pal) { if (is_verbose) { std::cout << "handler_display::enable_palette() " << std::endl; } unsigned char *p = pal; SDL_Color *color = &sdl_palette[0]; Uint32 k = 0; for (Uint32 i = 0; i < 256; i++) { color->r = p[k++]; color->g = p[k++]; color->b = p[k++]; color++; } game_screen->set_palette (sdl_palette); background_screen->set_palette (sdl_palette); SDL_SetPalette (sdl_screen, SDL_LOGPAL | SDL_PHYSPAL, sdl_palette, 0, 256); } /** * Initialize color palette for the current screen * @param pal pointer to color components of a SDL_Color structure */ void handler_display::enable_palette (SDL_Color * pal) { if (is_verbose) { std::cout << "handler_display::enable_palette(SDL) " << std::endl; } game_screen->set_palette (pal); background_screen->set_palette (pal); SDL_SetPalette (sdl_screen, SDL_LOGPAL | SDL_PHYSPAL, pal, 0, 256); } /** * Return the current SDL palette * @return a pointer to a SDL_Color structure */ SDL_Color * handler_display::get_palette () { return sdl_palette; } /** * Recopy the game offscreen in the main window */ void handler_display::window_update () { SDL_Rect source = { 0, (Sint16) (offsetplus + tilt_offset), (Uint16) window_width, (Uint16) (window_height + offsetplus + tilt_offset) }; SDL_Rect destination = { 0, 0, (Uint16) window_width, (Uint16) window_height }; if (SDL_BlitSurface (game_surface, &source, sdl_screen, &destination) < 0) { std::cerr << "(!)handler_display::window_update():" << "BlitSurface() return " << SDL_GetError () << std::endl; } SDL_UpdateRect (sdl_screen, 0, 0, sdl_screen->w, sdl_screen->h); if (tilt_offset > 0) { tilt_offset--; } } //------------------------------------------------------------------------------- // buffer & tampon: clear shadow box // input => offst: offset adresse ecran // large: width box in pixels // haute: height box en pixels //------------------------------------------------------------------------------- void handler_display::clr_shadow (Sint32 offst, Sint32 large, Sint32 haute) { char zmask = 0x7F; char *bffer = game_screen_pixels + offst; char *tmpon = background_pixels + offst; Sint32 a = large; Sint32 b = haute; Sint32 n = game_screen_pitch - a; for (Sint32 j = 0; j < b; j++, bffer += n, tmpon += n) { for (Sint32 i = 0; i < a; i++) { char pixel = *bffer; pixel &= zmask; *(bffer++) = pixel; pixel = *tmpon; pixel &= zmask; *(tmpon++) = pixel; } } } /** * Clear a shadow region * @param xcoord * @param ycoord * @param width * @param height */ void handler_display::clr_shadow (Sint32 xcoord, Sint32 ycoord, Sint32 width, Sint32 height) { char zmask = 0x7F; char *screen = background_screen->get_pixel_data (xcoord, ycoord); char *bkgd = game_screen->get_pixel_data (xcoord, ycoord); Sint32 h = width; Sint32 v = height; Sint32 n = game_screen_pitch - h; for (Sint32 j = 0; j < v; j++, screen += n, bkgd += n) { for (Sint32 i = 0; i < h; i++) { char pixel = *screen; pixel &= zmask; *(screen++) = pixel; pixel = *bkgd; pixel &= zmask; *(bkgd++) = pixel; } } } //------------------------------------------------------------------------------ // buffer & tampon: display shadow box // input => offst: buffer offset in bytes // => large: width box in pixels // => haute: height box en pixels //------------------------------------------------------------------------------ void handler_display::set_shadow (Sint32 offst, Sint32 large, Sint32 haute) { char zmask = (char) (0x80); char *bffer = game_screen_pixels + offst; char *tmpon = background_pixels + offst; Sint32 a = large; Sint32 b = haute; Sint32 n = game_screen_pitch - a; for (Sint32 j = 0; j < b; j++, bffer += n, tmpon += n) { for (Sint32 i = 0; i < a; i++) { char pixel = *bffer; pixel |= zmask; *(bffer++) = pixel; pixel = *tmpon; pixel |= zmask; *(tmpon++) = pixel; } } } //------------------------------------------------------------------------------ // buffer: copy an image of 32 width pixels into buffer memory //------------------------------------------------------------------------------ void handler_display::buf_affx32 (char *srcPT, char *desPT, Sint32 width, Sint32 heigh) { Sint32 *d = (Sint32 *) desPT; Sint32 *s = (Sint32 *) srcPT; Sint32 j = heigh; Sint32 ms = width; Sint32 md = game_screen_pitch; for (Sint32 i = 0; i < j; i++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; d[4] = s[4]; d[5] = s[5]; d[6] = s[6]; d[7] = s[7]; s = (Sint32 *) ((char *) s + ms); d = (Sint32 *) ((char *) d + md); } } //------------------------------------------------------------------------------ // buffer: copy an image of 64 width pixels into buffer memory //------------------------------------------------------------------------------ void handler_display::buf_affx64 (char *srcPT, char *desPT, Sint32 width, Sint32 heigh) { double *d = (double *) desPT; double *s = (double *) srcPT; Sint32 j = heigh; Sint32 ms = width; Sint32 md = game_screen_pitch; for (Sint32 i = 0; i < j; i++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; d[4] = s[4]; d[5] = s[5]; d[6] = s[6]; d[7] = s[7]; s = (double *) ((char *) s + ms); d = (double *) ((char *) d + md); } } //------------------------------------------------------------------------------ // copy an image //------------------------------------------------------------------------------ /* void handler_display::genericGFX (char *sAdre, Sint32 sLarg, Sint32 sHaut, Sint32 sNext, char *dAdre, Sint32 dLarg, Sint32 dHaut, Sint32 dNext) { Sint32 h, l; Sint32 a = sNext; Sint32 b = dNext; if (sLarg > dLarg) l = sLarg; else l = dLarg; if (sHaut > dHaut) h = dHaut; else h = sHaut; char *d = dAdre; char *s = sAdre; for (Sint32 i = 0; i < h; i++, s += a, d += b) { for (Sint32 j = 0; j < l; j++) d[j] = s[j]; } } */ /** * Tilt the screen 10 or 20 pixels upwards */ void handler_display::tilt_screen () { tilt_offset = 10 * resolution; } /** * Select colour gradation */ void handler_display::set_color_gradation () { SDL_Color *palette = display->get_palette (); SDL_Color *pal = palette + 239; Sint32 i = random_counter & 0x0F; if (i >= 10) { i = i - 10; } const Uint32 *color_scale = (handler_resources::color_gradations + i * 18); for (i = 0; i < 17; i++) { Uint32 vacol = color_scale[i]; Uint32 vablu = vacol & 0x000000ff; Uint32 vagre = vacol & 0x0000ff00; vagre = vagre >> 8; Uint32 vared = vacol & 0x00ff0000; vared = vared >> 16; pal->r = vared; pal->g = vagre; pal->b = vablu; pal++; } display->enable_palette (palette); } tecnoballz-0.93.1/src/sprite_font_menu.cc0000664000175000017500000000242312412501752017455 0ustar brunobruno/** * @file sprite_font_menu.cc * @brief The fonte sprite used in the main menu * @date 2007-02-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_font_menu.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_font_menu.h" /** * Create the fonte menu sprite */ sprite_font_menu::sprite_font_menu () { clear_sprite_members (); } /** * Release the fonte menu sprite */ sprite_font_menu::~sprite_font_menu () { } tecnoballz-0.93.1/src/handler_keyboard.cc0000664000175000017500000011702212412501752017374 0ustar brunobruno/** * @file handler_keyboard.cc * @brief Handler of the keyboard and mouse * @date 2012-09-04 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_keyboard.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_keyboard.h" #include "../include/handler_display.h" bool handler_keyboard::command_keys[NUMOF_COMMAND_KEYS]; bool handler_keyboard::last_command_keys[NUMOF_COMMAND_KEYS]; Uint32 handler_keyboard::key_codes[K_MAXOF] = { SDLK_LEFT, SDLK_RIGHT, SDLK_UP, SDLK_DOWN, SDLK_SPACE, SDLK_LCTRL, SDLK_LALT, SDLK_PAGEUP, SDLK_PAGEDOWN }; handler_keyboard * handler_keyboard::keyboard_singleton = NULL; #ifdef TECNOBALLZ_GP2X bool handler_keyboard::gp2x_buttons[GP2X_NUM_BUTTONS]; #endif #ifdef TECNOBALLZ_PSP bool handler_keyboard::psp_buttons[PSP_NUM_BUTTONS]; #endif /** * Create the handler_keyboard singleton object, and clear members */ handler_keyboard::handler_keyboard () { object_init (); is_grab_input = false; mouse_x_offset = 0; mouse_y_offset = 0; /* x and y coordinates of the mouse */ mouse_x_coord = 0; mouse_y_coord = 0; is_left_button_down = false; is_right_button_down = false; is_middle_button_down = false; is_left_button_released = 0; is_right_button_released = 0; key_delay = 0; key_code_down = 0; previous_key_code_down = 0; string_cursor_pos = 0; string_input_size = 0; code_keyup = 0; current_input_string = NULL; for (Uint32 i = 0; i < NUMOF_COMMAND_KEYS; i++) { command_keys[i] = false; last_command_keys[i] = false; } init_joysticks (); is_key_waiting = true; wait_key_pressed = false; joy_code_down = 0; joy_code_down_prev = 0; joy_up = 0; input_joy_tempo = 0; #ifdef TECNOBALLZ_GP2X for (Uint32 i = 0; i < GP2X_NUM_BUTTONS; i++) { gp2x_buttons[i] = false; } #endif #ifdef TECNOBALLZ_PSP for (Uint32 i = 0; i < PSP_NUM_BUTTONS; i++) { psp_buttons[i] = false; } #endif } /** * Release the handler_keyboard singleton object */ handler_keyboard::~handler_keyboard () { object_free (); keyboard_singleton = NULL; if (numof_joysticks > 0) { for (Uint32 i = 0; i < numof_joysticks; i++) { if (sdl_joysticks[i] != NULL) { SDL_JoystickClose (sdl_joysticks[i]); sdl_joysticks[i] = NULL; } } delete[]sdl_joysticks; numof_joysticks = 0; } } /** * Open joystick(s) if available */ void handler_keyboard::init_joysticks () { joy_fire = false; joy_release = false; joy_gigablitz = false; joy_option = false; joy_left = false; joy_right = false; joy_top = false; joy_down = false; numof_joysticks = SDL_NumJoysticks (); if (is_verbose) { std::cout << "handler_keyboard::init_joysticks()" << " number of joysticks available: " << numof_joysticks << std::endl; } if (numof_joysticks > 0) { sdl_joysticks = new SDL_Joystick *[numof_joysticks]; for (Uint32 i = 0; i < numof_joysticks; i++) { sdl_joysticks[i] = SDL_JoystickOpen (i); if (sdl_joysticks[i] == NULL) { std::cerr << "(!)handler_keyboard::init_joysticks()" << " couldn't open joystick " << i << ": " << SDL_GetError () << std::endl; } else { if (is_verbose) { std:: cout << "- joystick : " << SDL_JoystickName (i) << std:: endl; std:: cout << "- axes : " << SDL_JoystickNumAxes (sdl_joysticks[i]) << std::endl; std:: cout << "- buttons : " << SDL_JoystickNumButtons (sdl_joysticks[i]) << std::endl; std:: cout << "- trackballs: " << SDL_JoystickNumButtons (sdl_joysticks[i]) << std::endl; std:: cout << "- hats : " << SDL_JoystickNumHats (sdl_joysticks[i]) << std::endl; } } } } } /** * Get the object instance * handler_keyboard is a singleton * @return the handler_keyboard object */ handler_keyboard * handler_keyboard::get_instance () { if (NULL == keyboard_singleton) { keyboard_singleton = new handler_keyboard (); } return keyboard_singleton; } /** * Grabs mouse and keyboard input, the mouse is confined to the * application window, and nearly all keyboard input is passed * directly to the application * @param mode true to enable grab input, false to disable it */ #ifdef UNDER_DEVELOPMENT void handler_keyboard::set_grab_input (bool) { return; } #else void handler_keyboard::set_grab_input (bool mode) { if (mode) { is_grab_input = true; SDL_WM_GrabInput (SDL_GRAB_ON); SDL_EventState (SDL_MOUSEMOTION, SDL_IGNORE); SDL_WarpMouse (display->get_width () >> 1, display->get_height () >> 1); SDL_EventState (SDL_MOUSEMOTION, SDL_ENABLE); } else { is_grab_input = false; SDL_WM_GrabInput (SDL_GRAB_OFF); } } #endif /** * Handle buttons of handheld video game console * @param event Pointer to a SDL_Event structure */ #ifdef TECNOBALLZ_HANDHELD_CONSOLE void handler_keyboard::handle_console_buttons (SDL_Event * event) { #ifdef TECNOBALLZ_GP2X if (event->jbutton.button >= GP2X_NUM_BUTTONS) { return; } if (event->type == SDL_JOYBUTTONDOWN) { gp2x_buttons[event->jbutton.button] = true; if (event->jbutton.button == GP2X_BUTTON_UP || event->jbutton.button == GP2X_BUTTON_UPRIGHT || event->jbutton.button == GP2X_BUTTON_UPRIGHT) { set_joy (IJOY_TOP); } if (event->jbutton.button == GP2X_BUTTON_DOWN || event->jbutton.button == GP2X_BUTTON_DOWNLEFT || event->jbutton.button == GP2X_BUTTON_DOWNRIGHT) { set_joy (IJOY_DOWN); } if (event->jbutton.button == GP2X_BUTTON_LEFT || event->jbutton.button == GP2X_BUTTON_UPLEFT || event->jbutton.button == GP2X_BUTTON_DOWNLEFT || event->jbutton.button == GP2X_BUTTON_L) { set_joy (IJOY_LEFT); } if (event->jbutton.button == GP2X_BUTTON_RIGHT || event->jbutton.button == GP2X_BUTTON_UPRIGHT || event->jbutton.button == GP2X_BUTTON_DOWNRIGHT || event->jbutton.button == GP2X_BUTTON_R) { set_joy (IJOY_RIGHT); } if (event->jbutton.button == GP2X_BUTTON_A || event->jbutton.button == GP2X_BUTTON_B || event->jbutton.button == GP2X_BUTTON_CLICK) { set_joy (IJOY_FIRE); } if (event->jbutton.button == GP2X_BUTTON_X || event->jbutton.button == GP2X_BUTTON_Y) { set_joy (IJOY_OPTION); } if (event->jbutton.button == GP2X_BUTTON_SELECT) { last_command_keys[TOGGLE_POPUP_MENU] = true; } if (event->jbutton.button == GP2X_BUTTON_START) { last_command_keys[COMMAND_KEY_PAUSE] = true; } if (event->jbutton.button == GP2X_BUTTON_VOLUP) { last_command_keys[VOLUME_UP] = true; } if (event->jbutton.button == GP2X_BUTTON_VOLDOWN) { last_command_keys[VOLUME_DOWN] = true; } } else { gp2x_buttons[event->jbutton.button] = false; if (event->jbutton.button == GP2X_BUTTON_UP || event->jbutton.button == GP2X_BUTTON_UPRIGHT || event->jbutton.button == GP2X_BUTTON_UPRIGHT) { clr_joy (IJOY_TOP); } if (event->jbutton.button == GP2X_BUTTON_DOWN || event->jbutton.button == GP2X_BUTTON_DOWNLEFT || event->jbutton.button == GP2X_BUTTON_DOWNRIGHT) { clr_joy (IJOY_DOWN); } if (event->jbutton.button == GP2X_BUTTON_LEFT || event->jbutton.button == GP2X_BUTTON_UPLEFT || event->jbutton.button == GP2X_BUTTON_DOWNLEFT || event->jbutton.button == GP2X_BUTTON_L) { clr_joy (IJOY_LEFT); } if (event->jbutton.button == GP2X_BUTTON_RIGHT || event->jbutton.button == GP2X_BUTTON_UPRIGHT || event->jbutton.button == GP2X_BUTTON_DOWNRIGHT || event->jbutton.button == GP2X_BUTTON_R) { clr_joy (IJOY_RIGHT); } if (event->jbutton.button == GP2X_BUTTON_A || event->jbutton.button == GP2X_BUTTON_B || event->jbutton.button == GP2X_BUTTON_CLICK) { clr_joy (IJOY_FIRE); } if (event->jbutton.button == GP2X_BUTTON_X || event->jbutton.button == GP2X_BUTTON_Y) { clr_joy (IJOY_OPTION); } if (event->jbutton.button == GP2X_BUTTON_SELECT && last_command_keys[TOGGLE_POPUP_MENU]) { toggle_popup_menu (); } if (event->jbutton.button == GP2X_BUTTON_START && last_command_keys[COMMAND_KEY_PAUSE]) { toggle_pause (); } if (event->jbutton.button == GP2X_BUTTON_VOLUP && last_command_keys[VOLUME_UP]) { last_command_keys[VOLUME_UP] = false; command_keys[VOLUME_UP] = true; } if (event->jbutton.button == GP2X_BUTTON_VOLDOWN && last_command_keys[VOLUME_DOWN]) { last_command_keys[VOLUME_DOWN] = false; command_keys[VOLUME_DOWN] = true; } } /* This button mapping conforms to the GP2X Common User Interface Recommendations, as of 2006-07-29, available from http://wiki.gp2x.org/wiki/Common_User_Interface_Recommendations */ /* Directions (UDLR) */ joy_top = gp2x_buttons[GP2X_BUTTON_UP] | gp2x_buttons[GP2X_BUTTON_UPLEFT] | gp2x_buttons[GP2X_BUTTON_UPRIGHT]; joy_down = gp2x_buttons[GP2X_BUTTON_DOWN] | gp2x_buttons[GP2X_BUTTON_DOWNLEFT] | gp2x_buttons[GP2X_BUTTON_DOWNRIGHT]; joy_left = gp2x_buttons[GP2X_BUTTON_LEFT] | gp2x_buttons[GP2X_BUTTON_UPLEFT] | gp2x_buttons[GP2X_BUTTON_DOWNLEFT] | gp2x_buttons[GP2X_BUTTON_L]; joy_right = gp2x_buttons[GP2X_BUTTON_RIGHT] | gp2x_buttons[GP2X_BUTTON_UPRIGHT] | gp2x_buttons[GP2X_BUTTON_DOWNRIGHT] | gp2x_buttons[GP2X_BUTTON_R]; /* volume ctrl */ joy_fire = gp2x_buttons[GP2X_BUTTON_A] | gp2x_buttons[GP2X_BUTTON_CLICK]; joy_release = gp2x_buttons[GP2X_BUTTON_B]; joy_gigablitz = gp2x_buttons[GP2X_BUTTON_X]; joy_option = gp2x_buttons[GP2X_BUTTON_Y]; /* Quit */ command_keys[QUIT_TECNOBALLZ] = gp2x_buttons[GP2X_BUTTON_CLICK] & gp2x_buttons[GP2X_BUTTON_START]; #endif #ifdef TECNOBALLZ_PSP if (event->jbutton.button >= PSP_NUM_BUTTONS) { return; } if (event->type == SDL_JOYBUTTONDOWN) { psp_buttons[event->jbutton.button] = true; if (event->jbutton.button == PSP_BUTTON_UP) { set_joy (IJOY_TOP); } if (event->jbutton.button == PSP_BUTTON_DOWN) { set_joy (IJOY_DOWN); } if (event->jbutton.button == PSP_BUTTON_LEFT) { set_joy (IJOY_LEFT); } if (event->jbutton.button == PSP_BUTTON_RIGHT) { set_joy (IJOY_RIGHT); } if (event->jbutton.button == PSP_BUTTON_A) { set_joy (IJOY_FIRE); } if (event->jbutton.button == PSP_BUTTON_X) { set_joy (IJOY_OPTION); } if (event->jbutton.button == PSP_BUTTON_SELECT) { last_command_keys[TOGGLE_POPUP_MENU] = true; } if (event->jbutton.button == PSP_BUTTON_START) { last_command_keys[COMMAND_KEY_PAUSE] = true; } } else { psp_buttons[event->jbutton.button] = false; if (event->jbutton.button == PSP_BUTTON_UP) { clr_joy (IJOY_TOP); } if (event->jbutton.button == PSP_BUTTON_DOWN) { clr_joy (IJOY_DOWN); } if (event->jbutton.button == PSP_BUTTON_LEFT) { clr_joy (IJOY_LEFT); } if (event->jbutton.button == PSP_BUTTON_RIGHT) { clr_joy (IJOY_RIGHT); } if (event->jbutton.button == PSP_BUTTON_A) { clr_joy (IJOY_FIRE); } if (event->jbutton.button == PSP_BUTTON_X) { clr_joy (IJOY_OPTION); } if (event->jbutton.button == PSP_BUTTON_SELECT && last_command_keys[TOGGLE_POPUP_MENU]) { toggle_popup_menu (); } if (event->jbutton.button == PSP_BUTTON_START && last_command_keys[COMMAND_KEY_PAUSE]) { toggle_pause (); } } /* Directions (UDLR) */ joy_top = psp_buttons[PSP_BUTTON_UP]; joy_down = psp_buttons[PSP_BUTTON_DOWN]; joy_left = psp_buttons[PSP_BUTTON_LEFT]; joy_right = psp_buttons[PSP_BUTTON_RIGHT]; joy_fire = psp_buttons[PSP_BUTTON_A]; joy_release = psp_buttons[PSP_BUTTON_B]; joy_gigablitz = psp_buttons[PSP_BUTTON_X]; joy_option = psp_buttons[PSP_BUTTON_Y]; #endif } #endif /** * Request to enable or disable popup menu */ void handler_keyboard::toggle_popup_menu () { last_command_keys[TOGGLE_POPUP_MENU] = false; command_keys[TOGGLE_POPUP_MENU] = command_keys[TOGGLE_POPUP_MENU] ? false : true; command_keys[COMMAND_KEY_PAUSE] = command_keys[TOGGLE_POPUP_MENU]; if (is_grab_input && command_keys[COMMAND_KEY_PAUSE]) { SDL_WM_GrabInput (SDL_GRAB_OFF); } if (is_grab_input && !command_keys[COMMAND_KEY_PAUSE]) { SDL_WM_GrabInput (SDL_GRAB_ON); } if (!command_keys[TOGGLE_POPUP_MENU]) { SDL_ShowCursor (SDL_DISABLE); } if (command_keys[TOGGLE_POPUP_MENU]) { SDL_ShowCursor (SDL_ENABLE); } } /** * Request to enable or disable pause mode */ void handler_keyboard::toggle_pause () { last_command_keys[COMMAND_KEY_PAUSE] = false; if (!command_keys[TOGGLE_POPUP_MENU]) { command_keys[COMMAND_KEY_PAUSE] = command_keys[COMMAND_KEY_PAUSE] ? false : true; if (is_grab_input && command_keys[COMMAND_KEY_PAUSE]) { SDL_WM_GrabInput (SDL_GRAB_OFF); } if (is_grab_input && !command_keys[COMMAND_KEY_PAUSE]) { SDL_WM_GrabInput (SDL_GRAB_ON); } } } /** * Read keyboard mouse and exit events */ void handler_keyboard::read_events () { command_keys[TOGGLE_FULLSCREEN] = false; command_keys[DISABLE_TIMER] = false; command_keys[VOLUME_DOWN] = false; command_keys[VOLUME_UP] = false; is_left_button_released = 0; is_right_button_released = 0; SDL_Event event; SDL_KeyboardEvent *kbEvt; while (SDL_PollEvent (&event) > 0) { switch (event.type) { /* mouse motion event */ case SDL_MOUSEMOTION: { /* read the x and y coordinates of the mouse */ mouse_x_coord = event.motion.x; mouse_y_coord = event.motion.y; mouse_x_offset += event.motion.xrel; mouse_y_offset += event.motion.yrel; } break; /* a key is pressed */ case SDL_KEYDOWN: { kbEvt = (SDL_KeyboardEvent *) & event; Uint8 *keys = SDL_GetKeyState (NULL); if (keys[SDLK_RALT] == SDL_RELEASED && keys[SDLK_LALT] == SDL_RELEASED && keys[SDLK_LSHIFT] == SDL_RELEASED && keys[SDLK_RSHIFT] == SDL_RELEASED) { if (keys[SDLK_RCTRL] == SDL_RELEASED && keys[SDLK_LCTRL] == SDL_RELEASED) { if (keys[SDLK_p] == SDL_PRESSED) { last_command_keys[COMMAND_KEY_PAUSE] = true; } if (keys[SDLK_f] == SDL_PRESSED) { last_command_keys[TOGGLE_FULLSCREEN] = true; } if (keys[SDLK_ESCAPE] == SDL_PRESSED) { last_command_keys[TOGGLE_POPUP_MENU] = true; } if (keys[SDLK_l] == SDL_PRESSED) { last_command_keys[DISABLE_TIMER] = true; } if (keys[SDLK_PAGEDOWN] == SDL_PRESSED) { last_command_keys[VOLUME_DOWN] = true; } if (keys[SDLK_PAGEUP] == SDL_PRESSED) { last_command_keys[VOLUME_UP] = true; } } else { if (keys[SDLK_ESCAPE] == SDL_PRESSED) { last_command_keys[QUIT_TECNOBALLZ] = true; } if (keys[SDLK_x] == SDL_PRESSED) { last_command_keys[CAUSE_GAME_OVER] = true; } if (keys[SDLK_q] == SDL_PRESSED) { last_command_keys[QUIT_TO_MAIN_MENU] = true; } if (keys[SDLK_f] == SDL_PRESSED) { last_command_keys[TOGGLE_SOUND] = true; } if (keys[SDLK_s] == SDL_PRESSED) { last_command_keys[TOGGLE_AUDIO] = true; } if (keys[SDLK_d] == SDL_PRESSED) { last_command_keys[TOGGLE_MUSIC] = true; } } } if (kbEvt->keysym.unicode > 0) { set_key_code_down (kbEvt->keysym.unicode); } else { set_key_code_down (kbEvt->keysym.sym); } } break; /* a key is released */ case SDL_KEYUP: { kbEvt = (SDL_KeyboardEvent *) & event; Uint8 *keys = SDL_GetKeyState (NULL); /* enable pause [P] key */ if (keys[SDLK_p] == SDL_RELEASED && last_command_keys[COMMAND_KEY_PAUSE]) { toggle_pause (); } /* enable context menu [ESC] key */ if (keys[TOGGLE_POPUP_MENU] == SDL_RELEASED && last_command_keys[TOGGLE_POPUP_MENU]) { toggle_popup_menu (); } if (keys[SDLK_f] == SDL_RELEASED && last_command_keys[TOGGLE_FULLSCREEN]) { last_command_keys[TOGGLE_FULLSCREEN] = false; command_keys[TOGGLE_FULLSCREEN] = true; } { if (keys[SDLK_ESCAPE] == SDL_RELEASED && last_command_keys[QUIT_TECNOBALLZ]) { last_command_keys[QUIT_TECNOBALLZ] = false; command_keys[QUIT_TECNOBALLZ] = true; } if (keys[SDLK_x] == SDL_RELEASED && last_command_keys[CAUSE_GAME_OVER]) { last_command_keys[CAUSE_GAME_OVER] = false; command_keys[CAUSE_GAME_OVER] = true; } if (keys[SDLK_q] == SDL_RELEASED && last_command_keys[QUIT_TO_MAIN_MENU]) { last_command_keys[QUIT_TO_MAIN_MENU] = false; command_keys[QUIT_TO_MAIN_MENU] = true; } if (keys[SDLK_f] == SDL_RELEASED && last_command_keys[TOGGLE_SOUND]) { last_command_keys[TOGGLE_SOUND] = false; command_keys[TOGGLE_SOUND] = true; } if (keys[SDLK_s] == SDL_RELEASED && last_command_keys[TOGGLE_AUDIO]) { last_command_keys[TOGGLE_AUDIO] = false; command_keys[TOGGLE_AUDIO] = true; } if (keys[SDLK_d] == SDL_RELEASED && last_command_keys[TOGGLE_MUSIC]) { last_command_keys[TOGGLE_MUSIC] = false; command_keys[TOGGLE_MUSIC] = true; } if (keys[SDLK_l] == SDL_RELEASED && last_command_keys[DISABLE_TIMER]) { last_command_keys[DISABLE_TIMER] = false; command_keys[DISABLE_TIMER] = true; } if (keys[SDLK_PAGEDOWN] == SDL_RELEASED && last_command_keys[VOLUME_DOWN]) { last_command_keys[VOLUME_DOWN] = false; command_keys[VOLUME_DOWN] = true; } if (keys[SDLK_PAGEUP] == SDL_RELEASED && last_command_keys[VOLUME_UP]) { last_command_keys[VOLUME_UP] = false; command_keys[VOLUME_UP] = true; } } if (kbEvt->keysym.unicode > 0) { set_keycode_up (kbEvt->keysym.unicode); } else { set_keycode_up (kbEvt->keysym.sym); } } break; /* a mouse button is pressed */ case SDL_MOUSEBUTTONDOWN: { switch (event.button.button) { case SDL_BUTTON_LEFT: is_left_button_down = true; break; case SDL_BUTTON_RIGHT: is_right_button_down = true; break; case SDL_BUTTON_MIDDLE: is_middle_button_down = true; break; } } break; /* a mouse button is relased */ case SDL_MOUSEBUTTONUP: { switch (event.button.button) { case SDL_BUTTON_LEFT: if (is_left_button_down) { is_left_button_released = true; } is_left_button_down = false; break; case SDL_BUTTON_RIGHT: if (is_right_button_down) { is_right_button_released = true; } is_right_button_down = false; break; case SDL_BUTTON_MIDDLE: is_middle_button_down = false; break; } } break; case SDL_JOYAXISMOTION: { Sint32 deadzone = 4096; /* x axis */ if (event.jaxis.axis == 0) { if (event.jaxis.value < -deadzone) { joy_left = true; set_joy (IJOY_LEFT); joy_right = false; } else if (event.jaxis.value > deadzone) { joy_left = false; joy_right = true; set_joy (IJOY_RIGHT); } else { joy_left = false; joy_right = false; clr_joy (IJOY_RIGHT); clr_joy (IJOY_LEFT); } } /* y axis */ else if (event.jaxis.axis == 1) { if (event.jaxis.value < -deadzone) { joy_down = false; joy_top = true; set_joy (IJOY_TOP); } else if (event.jaxis.value > deadzone) { joy_down = true; joy_top = false; set_joy (IJOY_DOWN); } else { joy_down = false; joy_top = false; clr_joy (IJOY_TOP); clr_joy (IJOY_DOWN); } } } break; case SDL_JOYBUTTONDOWN: #ifdef TECNOBALLZ_HANDHELD_CONSOLE handle_console_buttons (&event); #else if (event.jbutton.button == 2) { joy_gigablitz = true; set_joy (IJOY_GIGABLITZ); } else if (event.jbutton.button == 0) { joy_fire = true; set_joy (IJOY_FIRE); } else if (event.jbutton.button == 1) { joy_release = true; set_joy (IJOY_RELEASE); } else if (event.jbutton.button > 2) { joy_option = true; last_command_keys[TOGGLE_POPUP_MENU] = true; set_joy (IJOY_OPTION); } break; #endif case SDL_JOYBUTTONUP: #ifdef TECNOBALLZ_HANDHELD_CONSOLE handle_console_buttons (&event); #else if (event.jbutton.button == 2) { joy_gigablitz = false; clr_joy (IJOY_GIGABLITZ); } else if (event.jbutton.button == 0) { joy_fire = false; clr_joy (IJOY_FIRE); } else if (event.jbutton.button == 1) { joy_release = false; clr_joy (IJOY_RELEASE); } else if (event.jbutton.button > 2) { joy_option = false; clr_joy (IJOY_OPTION); if (last_command_keys[TOGGLE_POPUP_MENU]) { last_command_keys[TOGGLE_POPUP_MENU] = false; command_keys[TOGGLE_POPUP_MENU] = command_keys[TOGGLE_POPUP_MENU] ? false : true; command_keys[COMMAND_KEY_PAUSE] = command_keys[TOGGLE_POPUP_MENU]; } } #endif break; /* quit the game */ case SDL_QUIT: { command_keys[QUIT_TECNOBALLZ] = true; } break; } } random_counter += mouse_x_coord; random_counter += mouse_y_coord; input_string (); } /** * Check if a key is pressed * @param code a SDL Keysym definition * @return true if the key is pressed */ bool handler_keyboard::key_is_pressed (Sint32 code) { Uint8 *keys; keys = SDL_GetKeyState (NULL); if (keys[code] == SDL_PRESSED) { return true; } else { return false; } } /** * Check if a key is released * @param code a SDL Keysym definition * @return true if the key is released */ bool handler_keyboard::key_is_released (Sint32 code) { Uint8 *keys; keys = SDL_GetKeyState (NULL); if (keys[code] == SDL_RELEASED) { return true; } else { return false; } } /** * Check if a control key is pressed * @param code A code of key * @return true if the key is pressed */ bool handler_keyboard::control_is_pressed (Uint32 code) { /* if(code >= K_MAXOF) { std::cerr << "(!)handler_keyboard::control_is_pressed() " << code << " is greated or equal to " << K_MAXOF << std::endl; return false; } */ Uint8 * keys; keys = SDL_GetKeyState (NULL); if (keys[key_codes[code]] == SDL_PRESSED) { return true; } else { switch (code) { case K_LEFT: return joy_left ? true : false; break; case K_RIGHT: return joy_right ? true : false; break; case K_UP: return joy_top ? true : false; break; case K_DOWN: return joy_down ? true : false; break; case K_FIRE: return joy_fire ? true : false; break; case K_RELEASE_BALL: return joy_release ? true : false; break; case K_GIGABLITZ: return joy_gigablitz ? true : false; break; } return false; } } /** * Clear some command keys and set grab input */ void handler_keyboard::clear_command_keys () { command_keys[COMMAND_KEY_PAUSE] = false; command_keys[QUIT_TO_MAIN_MENU] = false; command_keys[CAUSE_GAME_OVER] = false; command_keys[TOGGLE_AUDIO] = false; command_keys[TOGGLE_SOUND] = false; command_keys[TOGGLE_MUSIC] = false; command_keys[TOGGLE_POPUP_MENU] = false; last_command_keys[COMMAND_KEY_PAUSE] = false; last_command_keys[QUIT_TO_MAIN_MENU] = false; last_command_keys[CAUSE_GAME_OVER] = false; last_command_keys[TOGGLE_AUDIO] = false; last_command_keys[TOGGLE_SOUND] = false; last_command_keys[TOGGLE_MUSIC] = false; last_command_keys[TOGGLE_POPUP_MENU] = false; if (is_grab_input) { SDL_WM_GrabInput (SDL_GRAB_ON); } mouse_x_offset = 0; mouse_y_offset = 0; is_key_waiting = true; wait_key_pressed = false; } /** * Check if a command key is pressed * @param code of the command key * @param clear true if clear flag after read * @return true if the command key is pressed */ bool handler_keyboard::command_is_pressed (Uint32 code, bool clear) { bool is_pressed = command_keys[code]; if (clear) { command_keys[code] = false; } return is_pressed; } /** * Test if mouse left button is pressed * @return true if mouse left button is down */ bool handler_keyboard::is_left_button () { return is_left_button_down; } /** * Test if mouse right button is pressed * @return true if mouse right button is down */ bool handler_keyboard::is_right_button () { return is_right_button_down; } /** * Check if player want send a gigablitz or enable tilt * @return true if want send a gigablitz or enable tilt */ bool handler_keyboard::is_gigablitz_or_tilt () { if (is_middle_button_down || control_is_pressed (K_GIGABLITZ)) { return true; } else { return false; } } /** * Test if mouse right and left button are pressed (start gigablitz) * @return true if mouse right and left buttons are down */ /* bool handler_keyboard::is_right_left_buttons () { if (is_right_button_down && is_left_button_down) { return true; } else { return false; } } */ /** * Test if the left mouse button were released * @param x_coord pointer to integer in which to return x mouse * @param y_coord pointer to integer in which to return y mouse * @return true if the left mouse button is released */ bool handler_keyboard::is_left_button_up (Sint32 * x_coord, Sint32 * y_coord) { *x_coord = mouse_x_coord; *y_coord = mouse_y_coord; return is_left_button_released; } /** * Test if the right mouse button were released * @param x_coord pointer to integer in which to return x mouse * @param y_coord pointer to integer in which to return y mouse * @return true if the right mouse button is released */ bool handler_keyboard::is_right_button_up (Sint32 * x_coord, Sint32 * y_coord) { *x_coord = mouse_x_coord; *y_coord = mouse_y_coord; return is_right_button_released; } /** * Caculate and return offset of horizontal displacement of the mouse * @return the mouse horizonal offset */ Sint32 handler_keyboard::get_mouse_x_offset () { Sint32 retval = mouse_x_offset; random_counter += mouse_x_coord + mouse_x_offset; mouse_x_offset = 0; return retval; } /** * Caculate and return offset of vertical displacement of the mouse * @return the mouse vertical offset */ Sint32 handler_keyboard::get_mouse_y_offset () { Sint32 retval = mouse_y_offset; random_counter += mouse_y_coord + mouse_y_offset; mouse_y_offset = 0; return retval; } /** * Return absolute mouse y coordinate * @return the mouse pointer y coordinate */ Sint32 handler_keyboard::get_mouse_y () { return mouse_y_coord; } /** * Return absolute mouse x coordinate * @return the mouse pointer x coordinate */ Sint32 handler_keyboard::get_mouse_x () { return mouse_x_coord; } /** * Set new pressed key for handle string input * @param kcode key code of the pressed key */ void handler_keyboard::set_key_code_down (Uint32 kcode) { if (kcode != SDLK_LSHIFT && kcode != SDLK_RSHIFT && kcode != SDLK_LCTRL && kcode != SDLK_RCTRL) key_code_down = kcode; } /** * Set new relased key for handle string input * @param kcode key code of the pressed key */ void handler_keyboard::set_keycode_up (Uint32 kcode) { if (kcode != SDLK_LSHIFT && kcode != SDLK_RSHIFT && kcode != SDLK_LCTRL && kcode != SDLK_RCTRL) { code_keyup = kcode; if (code_keyup == key_code_down) { key_code_down = 0; } key_delay = 0; previous_key_code_down = 0; } } /** * Set a joystick code * @param code A joystick code, a buttom is down */ void handler_keyboard::set_joy (Uint32 code) { joy_code_down = code; input_joy_tempo = 0; } /** * Clear a joystick code, a button is up * @param code A joystick code */ void handler_keyboard::clr_joy (Uint32 code) { joy_up = code; if (joy_up == joy_code_down) { joy_code_down = 0; input_joy_tempo = 0; key_delay = 0; joy_code_down_prev = 0; } } /** * Handle string input */ void handler_keyboard::input_string () { Sint32 kcode = 0; if (key_delay < 1) { kcode = key_code_down; if (key_code_down > 0) { /* it is key pressed for the first time? */ if (previous_key_code_down != key_code_down) { previous_key_code_down = key_code_down; key_delay = 30; } else { /* repeat key press delay */ key_delay = 10; } } } else { kcode = 0; key_delay--; } if (current_input_string == NULL) { return; } input_string (kcode); /* input string with the joystick */ Sint32 joycode = 0; if (input_joy_tempo < 1) { joycode = joy_code_down; if (joy_code_down > 0) { /* button pressed for the first time? */ if (joy_code_down_prev != joy_code_down) { joy_code_down_prev = joy_code_down; input_joy_tempo = 40; } else { input_joy_tempo = 5; } } } else { joycode = 0; input_joy_tempo--; } if (joycode > 0) { switch (joycode) { case IJOY_FIRE: case IJOY_RELEASE: current_input_string[string_cursor_pos] = ' '; break; case IJOY_OPTION: case IJOY_GIGABLITZ: input_string (SDLK_RETURN); break; case IJOY_LEFT: input_string (SDLK_LEFT); break; case IJOY_RIGHT: input_string (SDLK_RIGHT); break; case IJOY_TOP: { char c = current_input_string[string_cursor_pos] + 1; /* space (32) / ! (33) * , (44) / - (45) / . (46) / * 0-9 (48-57) : (58) * A-Z (65 to 90) */ if (c > 90) { c = 32; } else if (c > 58 && c < 65) { c = 65; } else if (c > 46 && c < 48) { c = 48; } else if (c > 33 && c < 44) { c = 44; } current_input_string[string_cursor_pos] = c; } break; case IJOY_DOWN: char c = current_input_string[string_cursor_pos] - 1; if (c < 32) { c = 90; } else if (c < 44 && c > 33) { c = 33; } else if (c < 48 && c > 46) { c = 46; } else if (c < 65 && c > 58) { c = 58; } current_input_string[string_cursor_pos] = c; break; } } } /** * Handle input string * @param kcode Key code enter */ void handler_keyboard::input_string (Uint32 kcode) { Sint32 j, i; if (0 == kcode) { return; } /* check pressed key */ switch (kcode) { case SDLK_LEFT: string_cursor_pos--; break; case SDLK_RIGHT: string_cursor_pos++; break; /* backspace key pressed */ case SDLK_BACKSPACE: if (string_cursor_pos > 0) { j = string_cursor_pos; } else { j = 1; } for (i = j; i < string_input_size; i++) { current_input_string[i - 1] = current_input_string[i]; } current_input_string[string_input_size - 1] = ' '; string_cursor_pos--; break; /* [Suppr] key pressed? */ case SDLK_DELETE: for (i = string_cursor_pos; i < string_input_size - 1; i++) { current_input_string[i] = current_input_string[i + 1]; } current_input_string[string_input_size - 1] = ' '; break; /* [Return] or [Enter] pressed, stop string input */ case SDLK_RETURN: stop_string_input (); return; break; default: kcode = kcode & 127; if (kcode >= 'a' && kcode <= 'z') { kcode = kcode - 32; } /* space (32) / ! (33) * , (44) / - (45) / . (46) / * : (58) / 0-9 (48-57) * A-Z (65 to 90) */ if ((kcode >= ' ' && kcode <= '!') || (kcode >= '-' && kcode <= '.') || (kcode >= '0' && kcode <= ':') || (kcode >= 'A' && kcode <= 'Z') || kcode == '\'') { for (i = string_input_size - 1; i > string_cursor_pos; i--) { current_input_string[i] = current_input_string[i - 1]; } current_input_string[string_cursor_pos] = kcode; string_cursor_pos++; } } /* verify overflow position cursor */ if (string_cursor_pos < 0) { string_cursor_pos = 0; } if (string_cursor_pos > string_input_size - 1) { string_cursor_pos = string_input_size - 1; } } /** * Initializes a string input * @param strng pointer to a string * @param ssize size of the string */ void handler_keyboard::set_input_string (char *strng, Uint32 ssize) { string_cursor_pos = 0; string_input_size = ssize; current_input_string = strng; } /** * Return the current cursor position in the input string * @return current cursor position 0 to n */ Sint32 handler_keyboard::get_input_cursor_pos () { if (NULL == current_input_string) { /* not current input string */ return -1; } return string_cursor_pos; } /** * Stop using string input */ void handler_keyboard::stop_string_input () { string_cursor_pos = 0; string_input_size = 0; current_input_string = NULL; } /** * Set the code of the last key down * @return last pressed key code */ Uint32 handler_keyboard::get_key_down_code () { return key_code_down; } /** * Wait a key (used for press an key to continue) * @return true if a key is pressed and released */ bool handler_keyboard::wait_key () { if (is_key_waiting) { if (!control_is_pressed (K_FIRE) && !control_is_pressed (K_RELEASE_BALL) && !control_is_pressed (K_GIGABLITZ) && !is_left_button_down) { is_key_waiting = false; } wait_key_pressed = false; return false; } if (control_is_pressed (K_FIRE) || control_is_pressed (K_RELEASE_BALL) || control_is_pressed (K_GIGABLITZ) || is_left_button_down) { wait_key_pressed = true; return false; } if (wait_key_pressed) { return true; } return false; } tecnoballz-0.93.1/src/handler_players.cc0000664000175000017500000004172212412501752017256 0ustar brunobruno/** * @file handler_players.cc * @brief players handler * @date 2012-09-05 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: handler_players.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/handler_players.h" #include "../include/controller_gems.h" #include "../include/controller_sides_bricks.h" #include "../include/controller_gems.h" Uint32 handler_players::max_of_players = 0; handler_players *handler_players::first_player = NULL; handler_players **handler_players::players_list = NULL; /* * Create a player object */ handler_players::handler_players () { object_init (); /* * add a new player */ /* first player */ if (0 == max_of_players) { first_player = this; next_player = this; previous_player = this; } else { next_player = first_player; handler_players *prev = first_player->get_previous_player (); previous_player = prev; first_player->set_previous_player (this); prev->set_next_player (this); } max_of_players++; /* * clear members members */ player_num = max_of_players; reset_members (); /* clear name of the player */ Uint32 i; for (i = 0; i < 6; i++) { player_name[i] = ' '; } player_name[i] = 0; } /* * Release a player object */ handler_players::~handler_players () { max_of_players--; if (max_of_players > 0) { next_player->set_previous_player (previous_player); previous_player->set_next_player (next_player); if (first_player == this) { first_player = next_player; } } else { first_player = NULL; } object_free (); } /** * Initialize a player object before a new game * @param lifes number of lifes * @param area area number (1 to 5) * @param level level number in current area (1 to 12) * @param money amount of money * @param grdPt level_list of the guards */ void handler_players::initialize (Uint32 lifes, Uint32 area, Uint32 level, Uint32 money, Uint32 grdPt) { reset_members (); number_of_lifes = lifes; area_number = area; level_number = level; amount_of_money = money; guardianPt = grdPt; } /** * Reset some members values */ void handler_players::reset_members () { /* clear the score value of the player */ score_value = 0; bonus_life_counter = 0; area_number = 1; //area_number = 5; /*TEST*/ /* level number into the current area */ level_number = 1; number_of_lifes = initial_num_of_lifes; clear_shopping_cart (); amount_of_money = 500; for (Uint32 i = 0; i < controller_sides_bricks::MAX_OF_SIDES_BRICKS; i++) { map_left_wall[i] = true; map_right_wall[i] = true; map_top_wall[i] = true; } /* disable right, top and left paddles */ right_paddle_alive_counter = 0; top_paddle_alive_counter = 0; left_paddle_alive_counter = 0; must_rebuild_walls = false; less_bricks_count = 0; /* width of the horizontal paddles * and height of the vertical paddles */ paddle_length = 32 * resolution; budget_prices = false; guardianPt = 0; clear_collected_gems (); } /** * Set the player name * @param name the name of the player */ void handler_players::set_name (const char *name) { for (Uint32 i = 0; i < PLAYER_NAME_LENGTH; i++) { player_name[i] = ' '; } for (Uint32 i = 0; i < PLAYER_NAME_LENGTH; i++) { char c = name[i]; if (0 == c) { return; } if (c >= 'a' && c <= 'z') { c = c - ('a' - 'A'); } if ((c >= ' ' && c <= '!') || (c >= '-' && c <= '.') || (c >= '0' && c <= ':') || (c >= 'A' && c <= 'Z') || c == '\'') { player_name[i] = c; } else { player_name[i] = ' '; } } } /** * Return the current player name * @return the current name the player */ char * handler_players::get_name () { return &player_name[0]; } /** * Return the area number * @raturn area number, from 1 to 5 */ Uint32 handler_players::get_area_number () { return area_number; } /** * Return the level number * @return level number, from 1 to 13 */ Uint32 handler_players::get_level_number () { return level_number; } /** * Return the number of life(s) * @return the number of life(s) */ Sint32 handler_players::get_num_of_lifes () { return number_of_lifes; } /** * return the paddle's length * @return the length of the paddle in pixels */ Uint32 handler_players::get_paddle_length () { return paddle_length; } /** * Initialize paddle's length * @param length the length of the paddle in pixels */ void handler_players::set_paddle_length (Uint32 length) { paddle_length = length; } /** * Return the current amount of money * @return the amount of money */ Uint32 handler_players::get_money_amount () { return amount_of_money; } /** * Decrease the amount of money * @param value money amount * @return true if the money amount could be descreased */ bool handler_players::decrease_money_amount (Uint32 value) { if (value > amount_of_money) { return false; } amount_of_money -= value; return true; } /** * Increase the amount of money * @param value money amount */ void handler_players::increase_money_amount (Uint32 value) { amount_of_money += value; } /** * Increase the score * @param value is the number of points to increase the score by */ void handler_players::add_score (Uint32 value) { score_value += value; bonus_life_counter += value; if (bonus_life_counter > 25000) { add_life (1); bonus_life_counter -= 25000; } } /** * Clear the shopping cart */ void handler_players::clear_shopping_cart () { Sint32 *cart = shopping_cart; for (Uint32 i = 0; i < supervisor_shop::MAX_OF_CAPSULES_BOUGHT; i++) { *(cart++) = 0; } /* clear the number of items bought */ shopping_cart_items = 0; /* end of the shopping cart */ *cart = -1; } /** * Return the list of items bought in th shop * @return a pointer to the list of itemps bought in th shop */ Sint32 * handler_players::get_shopping_cart () { return shopping_cart; } /** * Return the number of itemp bought in th shop * @return the number of items bought in th shop */ Uint32 handler_players::get_numof_items_in_shopping_cart () { return shopping_cart_items; } /** * Set the number of items bought * @param count Number of items */ void handler_players::set_numof_items_in_shopping_cart (Uint32 count) { shopping_cart_items = count; } /** * Clear the list of gems collected */ void handler_players::clear_collected_gems () { for (Uint32 i = 0; i < controller_gems::MAX_OF_GEMS; i++) { /* states of the 6 gems */ gems_state_list[i] = false; } } /** * Verify if the 6 gemstones are collected * @param gem_id last gem identifier collected * @return true if all gems are collected, otherwise false */ bool handler_players::are_collected_all_gems (Uint32 gemNu) { gems_state_list[gemNu] = true; for (Uint32 i = 0; i < controller_gems::MAX_OF_GEMS; i++) { if (!gems_state_list[i]) { return false; } } clear_collected_gems (); return true; } /** * Return state of one of six gemstones * @param gem_id gem identifier 0 to 5 * @return true if the gem is enabled, otherwise false */ bool handler_players::is_collected_gem (Uint32 gem_id) { return gems_state_list[gem_id]; } /** * Get the alive counter of a paddle * @param paddle_num paddle number RIGHT_PADDLE, TOP_PADDLE, or LEFT_PADDLE * @return alive counter value, if 0 then the paddle is disabled */ Uint32 handler_players::get_paddle_alive_counter (Uint32 paddle_num) { switch (paddle_num) { case controller_paddles::RIGHT_PADDLE: return right_paddle_alive_counter; break; case controller_paddles::TOP_PADDLE: return top_paddle_alive_counter; break; default: return left_paddle_alive_counter; break; } } /** * Set the alive counter of a paddle * @param paddle_num paddle number RIGHT_PADDLE, TOP_PADDLE, or LEFT_PADDLE * @param count value of the counter, if 0 then the paddle is disabled */ void handler_players::set_paddle_alive_counter (Uint32 paddle_num, Uint32 counter) { switch (paddle_num) { case controller_paddles::RIGHT_PADDLE: right_paddle_alive_counter = counter; break; case controller_paddles::TOP_PADDLE: top_paddle_alive_counter = counter; break; case controller_paddles::LEFT_PADDLE: left_paddle_alive_counter = counter; break; } } /** * Initialize less bricks option * @param count number of bricks in less */ void handler_players::set_less_bricks (Uint32 count) { less_bricks_count = count; } /** * Return number of bricks in less * @return number of bricks in less */ Uint32 handler_players::get_less_bricks () { return less_bricks_count; } /** * Set the budget prices option * @param enable true if enable the budget prices option, false otherwise */ void handler_players::set_budget_prices (bool enable) { budget_prices = enable; } /** * Check if the budget prices option is enable */ bool handler_players::is_budget_prices () { return budget_prices; } /** * Enable or disable the option which will rebuild the walls bricks * on the next levels * @param enable true if rebuilt the walls, false otherwise */ void handler_players::set_rebuild_walls (bool enable) { must_rebuild_walls = enable; } /** * Check if the walls must be rebuilt. * @return true if rebuilt the walls, false otherwise */ bool handler_players::is_rebuild_walls () { return must_rebuild_walls; } /** * Return state of the left wall bricks * @return a pointer to the map of the left wall */ bool * handler_players::get_map_left () { return map_left_wall; } /** * Return state of the right wall bricks * @return a pointer to the map of the right wall */ bool * handler_players::get_map_right () { return map_right_wall; } /** * Return state of the top wall bricks * @return a pointer to the map of the top wall */ bool * handler_players::get_map_top () { return map_top_wall; } //----------------------------------------------------------------------------- // is the lastest level of tecnoballz? // output <= 1: end of game :-) //----------------------------------------------------------------------------- Sint32 handler_players::zlastlevel () { if (area_number >= 5 && level_number >= 13) return 1; else return 0; } //----------------------------------------------------------------------------- // next level // output <= 1: end of game :-) //----------------------------------------------------------------------------- Sint32 handler_players::next_level (Sint32 grdNx) { Sint32 r = 0; if (is_verbose) printf ("handler_players::next_level() area_number=%i, level_number=%i grdNx=%i guardianPt =%i\n", area_number, level_number, grdNx, guardianPt); if (area_number == 5 && level_number == 13) { area_number = 1; level_number = 1; r = 1; //end of game guardianPt = 0; } else { if (area_number == 5 && level_number == 12) { level_number++; guardianPt += grdNx; } else { level_number++; if (level_number == 13) { area_number++; level_number = 1; guardianPt += grdNx; } if (level_number == 7) guardianPt += grdNx; } } if (is_verbose) printf ("handler_players::next_level() area_number=%i, level_number=%i, guardianPt=%i\n", area_number, level_number, guardianPt); return r; } /** * Return the phase code * @return the next phase code GUARDS_LEVEL or SHOP */ Uint32 handler_players::get_next_phase () { /* MAIN_MENU is a very improbable case */ Uint32 phase = MAIN_MENU; /* levels 6, 12 and the level 13 of the area 5 are guardians levels */ if (level_number == 6 || level_number == 12 || level_number == 13) { phase = GUARDS_LEVEL; } else { /* before a level, there is always the shop, * except for the first level of the first area */ if (level_number > 0 && level_number < 12) { phase = SHOP; } } return phase; } /** * Return previous player * @return a pointer to the previous player object */ handler_players * handler_players::get_previous_player () { return previous_player; } /** * Set the next player * @param player pointer to a object player */ void handler_players::set_next_player (handler_players * player) { next_player = player; } /** * Get the previous player * @param player pointer to a object player */ void handler_players::set_previous_player (handler_players * player) { previous_player = player; } //----------------------------------------------------------------------------- // get pointer to "level_list" of the guards //----------------------------------------------------------------------------- Sint32 handler_players::getGuardPt () { return guardianPt; } //----------------------------------------------------------------------------- // set pointer to "level_list" of the guards //----------------------------------------------------------------------------- void handler_players::setGuardPt (Sint32 grdPt) { guardianPt = grdPt; } /** * Add one or more lifes * @param add number of lifes to add */ void handler_players::add_life (Uint32 add) { number_of_lifes += add; } /** * Remove one or more lifes * @param add number of lifes to remove */ void handler_players::remove_life (Uint32 remove) { number_of_lifes -= remove; if (number_of_lifes < 0) { number_of_lifes = 0; } } /** * Remove all lifes, when the game over is forced */ void handler_players::remove_all_lifes () { number_of_lifes = 0; } /* * Statics methods */ /** * Static method which return next player and determine the next phase * @param player the current "handler_players" object * @param next_phase pointer to "end_return" * @param grdNx pointer to "level_list" of the guards (NULL by default) * @return the new player object */ handler_players * handler_players::get_next_player (handler_players * player, Uint32 * next_phase, Sint32 grdNx) { Uint32 start = player->player_num; Uint32 index = start; if (current_phase != SHOP) { /* jump to the next level */ player->next_level (grdNx); } /* process each player object */ for (Uint32 i = 0; i < max_of_players; i++) { if (++index > max_of_players) { index = 1; } handler_players *player = players_list[index - 1]; if (player->number_of_lifes <= 0) { continue; } /* get next phase: GUARDS_LEVEL or SHOP */ *next_phase = player->get_next_phase (); /* this player already went to the shop, * he jump to the bricks level */ if (player->player_num <= start && *next_phase == SHOP && current_phase == SHOP) { *next_phase = BRICKS_LEVEL; } /* multiplayers case: all players play the same level */ if (player->player_num > start && current_phase != SHOP && *next_phase == SHOP) { *next_phase = BRICKS_LEVEL; } return player; } /* unlikely case */ *next_phase = MAIN_MENU; return players_list[0]; } /** * Static method which initializes the maximum number of players * @param numof maximum number of players, always 6 */ handler_players * handler_players::create_all_players (Uint32 numof) { try { players_list = new handler_players *[numof]; } catch (std::bad_alloc &) { std:: cerr << "(!)handler_players::joueursADD() " "not enough memory to allocate " << numof << " list elements!" << std::endl; throw; } /* create the players objects */ for (Uint32 i = 0; i < numof; i++) { players_list[i] = new handler_players (); } return first_player; } /** * Static method which releases all objects players */ void handler_players::release_all_players () { for (Uint32 i = 0; i < max_of_players; i++) { delete first_player; } if (NULL != players_list) { delete[]players_list; players_list = NULL; } } tecnoballz-0.93.1/src/sprite_display_menu.cc0000664000175000017500000006152212412501752020161 0ustar brunobruno/** * @file sprite_display_menu.cc * @brief Sprite wich display text of the menu in the menu principal * @date 2012-09-02 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_display_menu.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_display_menu.h" #include "../include/handler_resources.h" #include "../include/handler_keyboard.h" #include "../include/handler_players.h" #include "../include/handler_high_score.h" #include "../include/supervisor_main_menu.h" /** * Create the sprite displaying text */ sprite_display_menu::sprite_display_menu () { clear_sprite_members (); text_offscreen = NULL; y_coord_left_down = handler_keyboard::NULL_YCOORD; y_coord_right_down = handler_keyboard::NULL_YCOORD; font_width = 8 * resolution; font_height = 8 * resolution; if (resolution == 2) { line_spacing = 17; } else { line_spacing = 8; } menu_first_color_index = 0; is_clean_zone = false; clear_zone_height = 0; clear_zone_width = 0; clear_zone_xcoord = 0; clear_zone_ycoord = 0; blink_cursor_delay = 0; texts_of_menus = NULL; menu_events = new handler_menu_events(); } /** * Release the sprite displaying text */ sprite_display_menu::~sprite_display_menu () { if (NULL != text_offscreen) { delete text_offscreen; text_offscreen = NULL; } if (NULL != bitmap_fonts) { delete bitmap_fonts; bitmap_fonts = NULL; } if (texts_of_menus != NULL) { delete[](char *) texts_of_menus; texts_of_menus = NULL; } if (menu_events != NULL) { delete menu_events; menu_events = NULL; } } /** * Read the texts file */ void sprite_display_menu::load_text_file () { if (texts_of_menus != NULL) { return; } texts_of_menus = resources->load_texts (handler_resources::TEXTS_MAIN_MENU, MAX_OF_LINES, NUM_OF_COLUMNS, 0, false); } /** * Create offscreen and perform some initializations */ void sprite_display_menu::first_init () { load_text_file (); load_bitmap_fonts (handler_resources::BITMAP_MENU_FONTS); /* allocate 512 * 323 pixels buffer for text menu */ text_offscreen = new bitmap_data (); text_offscreen->create_surface (NUM_OF_COLUMNS * font_width, NUM_OF_ROWS * line_spacing); /* initialize sprite object */ make_sprite (text_offscreen); enable (); set_coordinates (32 * resolution, 80 * resolution); set_current_menu_section(MAIN_SECTION); /* initialize palette color chars */ SDL_Color *palette = display->get_palette (); Sint32 i = random_counter & 0x0F; if (i >= 10) { i = i - 10; } const Uint32 *degrade = (handler_resources::color_gradations + i * 18); SDL_Color *pal = palette + 239; for (i = 0; i < 17; i++) { Uint32 color = degrade[i]; Uint32 blue = color & 0x000000ff; Uint32 green = color & 0x0000ff00; green = green >> 8; Uint32 red = color & 0x00ff0000; red = red >> 16; pal->r = red; pal->g = green; pal->b = blue; pal++; } display->enable_palette (palette); } /** * Check events and draw menu text * @return exit code DO_NO_EXIT, PROGRAM_EXIT, or START_GAME */ Uint32 sprite_display_menu::check_and_display () { clear_input_zone (); update_strings (); Sint32 y = (keyboard->get_mouse_y () - y_coord) / line_spacing; Uint32 exit_code = check_events (); /* read color table offset (color line over the mouse ) */ if (menu_first_color_index++ > 32) { menu_first_color_index = 0; } Uint32 color = menu_first_color_index; /* display menu text */ char * dest = pixel_data; Sint32 s_offset = off_source; Sint32 d_offset1 = row_size; Sint32 d_offset2 = row_size * (line_spacing - 1); Sint32 * font = (Sint32 *) caract_adr; char * c = ascii_to_index; Sint32 a, b, j; /* * mode low-res (320 x 200) */ if (resolution == 1) { for (Sint32 k = 0; k < NUM_OF_ROWS; k++, dest += d_offset2) { char *p = texts_of_menus[current_menu_section + k]; if (y != k) { /* display normal line of 32 characters */ for (j = 0; j < NUM_OF_COLUMNS; j++) { a = *(p++) - 32; if (a != 0) { b = c[a]; b = b << 3; #ifndef BYTES_COPY Sint32 * s = (Sint32 *) font; Sint32 * d = (Sint32 *) dest; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 8; b++) { d[0] = s[0]; d[1] = s[1]; s = (Sint32 *) ((char *) s + s_offset); d = (Sint32 *) ((char *) d + d_offset1); } #else char * s = (char *) font; char * d = dest; s += b; for (b = 0; b < 8; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; d[4] = s[4]; d[5] = s[5]; d[6] = s[6]; d[7] = s[7]; s += s_offset; d += d_offset1; } #endif } dest = dest + 8; } } else { /* display selected line of 32 characters */ for (j = 0; j < NUM_OF_COLUMNS; j++) { unsigned char pixel = color_cycling[color]; a = *(p++) - 32; if (a != 0) { b = c[a]; unsigned char * s = (unsigned char *) font; unsigned char * d = (unsigned char *) dest; b = b << 3; s = s + b; for (b = 0; b < 8; b++) { for (Sint32 z = 0; z < 8; z++) { a = s[z]; if (a != 0) { a = pixel; d[z] = pixel; } } s = s + s_offset; d = d + d_offset1; } } dest = dest + 8; if (color++ > 32) { color = 0; } } } } } /* * mode hi-res (640 x 400) */ else { for (Sint32 k = 0; k < NUM_OF_ROWS; k++, dest += d_offset2) { char* p = texts_of_menus[current_menu_section + k]; if (y != k) { /* display normal line of 32 characters */ for (j = 0; j < NUM_OF_COLUMNS; j++) { a = *(p++) - 32; if (a != 0) { b = c[a]; b = b << 4; #ifndef BYTES_COPY Sint32 * s = (Sint32 *) font; Sint32 * d = (Sint32 *) dest; s = (Sint32 *) ((char *) s + b); for (b = 0; b < 16; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; s = (Sint32 *) ((char *) s + s_offset); d = (Sint32 *) ((char *) d + d_offset1); } #else char * s = (char *) font; char * d = dest; s += b; for (b = 0; b < 16; b++) { d[0] = s[0]; d[1] = s[1]; d[2] = s[2]; d[3] = s[3]; d[4] = s[4]; d[5] = s[5]; d[6] = s[6]; d[7] = s[7]; d[8] = s[8]; d[9] = s[9]; d[10] = s[10]; d[11] = s[11]; d[12] = s[12]; d[13] = s[13]; d[14] = s[14]; d[15] = s[15]; s += s_offset; d += d_offset1; } #endif } dest = dest + 16; } } else { /* display selected line of 32 characters */ for (j = 0; j < NUM_OF_COLUMNS; j++) { unsigned char pixel = color_cycling[color]; a = *(p++) - 32; if (a != 0) { b = c[a]; unsigned char * s = (unsigned char *) font; unsigned char * d = (unsigned char *) dest; b = b << 4; s = s + b; for (b = 0; b < 16; b++) { for (Sint32 z = 0; z < 16; z++) { a = s[z]; if (a) { a = pixel; d[z] = pixel; } } s = s + s_offset; d = d + d_offset1; } } dest = dest + 16; if (color++ > 32) { color = 0; } } } } } draw_input_cursor (); return exit_code; } /** * Set a new menu */ void sprite_display_menu::set_current_menu_section(Uint32 current) { current_menu_section = current; Sint32 y = y_coord; Uint32 min = 0; Uint32 max = NUM_OF_ROWS; for(Sint32 i = 0; i < NUM_OF_ROWS; i++) { bool found = false; char *p = texts_of_menus[current + i]; for(Sint32 j = 0; j < NUM_OF_COLUMNS; j++) { if(p[j] == ' ' ) { continue; } found = true; break; } if (found) { break; } min++; } for(Uint32 i = NUM_OF_ROWS - 1; i > 0; i--) { bool found = false; char *p = texts_of_menus[current + i]; for(Sint32 j = 0; j < NUM_OF_COLUMNS; j++) { if(p[j] == ' ' ) { continue; } found = true; break; } if (found) { break; } max--; } menu_events->start(line_spacing, min, max - 1, display->get_width() >> 1, y); } /** * Check mouse events * @return exit code DO_NO_EXIT, PROGRAM_EXIT, or START_GAME */ Uint32 sprite_display_menu::check_events () { Uint32 exit_code = DO_NO_EXIT; Sint32 pos_y = 0; Sint32 incre = 0; if (menu_events->check(&pos_y, &incre)) { pos_y = (pos_y - y_coord) / line_spacing; switch (current_menu_section) { /* main menu */ case MAIN_SECTION: switch (pos_y) { case LINE_START: menu_events->stop(); clear_text_offscreen (); clear_zone_stop (); exit_code = START_GAME; break; case LINE_PARAM: clear_text_offscreen (); clear_zone_stop (); set_current_menu_section(OPTIONS_SECTION); break; case LINE_ABOUT: #ifndef WIN32 audio->play_music (handler_audio::FRIDGE_IN_SPACE_MUSIC); #endif clear_text_offscreen (); clear_zone_stop (); set_current_menu_section(ABOUT_SECTION); break; case LINE_SALUT: audio->play_music (handler_audio::MON_LAPIN_MUSIC); clear_text_offscreen (); clear_zone_stop (); set_current_menu_section(GREETINGS_SECTION); break; case LINE_INFOS: audio->play_music (handler_audio::IN_GAME_MUSIC); clear_text_offscreen (); clear_zone_stop (); set_current_menu_section(INFOS_SECTION); break; case LINE_SCORE: audio->play_music (handler_audio::TERMIGATOR_MUSIC); clear_text_offscreen (); clear_zone_stop (); copy_high_score_in_menu (); set_current_menu_section(SCORE_SECTIONS); break; /* input the code area */ case LINE_CODE1: case LINE_CODE2: { char * area_code = supervisor_main_menu::get_current_area_code (); start_input_string (10, LINE_CODE2, supervisor_main_menu::AREA_CODE_LENGTH, area_code); } break; case LINE_SORTI: exit_code = PROGRAM_EXIT; break; } break; /* * options */ case OPTIONS_SECTION: switch (pos_y) { case 5: clear_zone_start (24, 5, 1, 1); if (++number_of_players > (Sint32) handler_players::MAX_OF_PLAYERS) { number_of_players = 1; } break; // input players names case 6: start_input_string (24, 6, 6, handler_players::players_list[0]->get_name ()); break; case 7: start_input_string (24, 7, 6, handler_players::players_list[1]->get_name ()); break; case 8: start_input_string (24, 8, 6, handler_players::players_list[2]->get_name ()); break; case 9: start_input_string (24, 9, 6, handler_players::players_list[3]->get_name ()); break; case 10: start_input_string (24, 10, 6, handler_players::players_list[4]->get_name ()); break; case 11: start_input_string (24, 11, 6, handler_players::players_list[5]->get_name ()); break; // case 12: clear_zone_start (24, 12, 4, 1); difficulty_level += incre; if (difficulty_level > DIFFICULTY_HARD) { difficulty_level = DIFFICULTY_EASY; } if (difficulty_level < DIFFICULTY_EASY) { difficulty_level = DIFFICULTY_HARD; } update_strings (); break; case 13: clear_zone_start (24, 13, 2, 1); initial_num_of_lifes += incre; if (initial_num_of_lifes > 9) { initial_num_of_lifes = 1; } if (initial_num_of_lifes < 1) { initial_num_of_lifes = 9; } update_strings (); break; /* return to main menu */ case 14: clear_text_offscreen (); set_current_menu_section(MAIN_SECTION); clear_zone_stop (); break; } break; case ABOUT_SECTION: clear_text_offscreen (); set_current_menu_section(MAIN_SECTION); break; case INFOS_SECTION: clear_text_offscreen (); set_current_menu_section(MAIN_SECTION); break; case GREETINGS_SECTION: clear_text_offscreen (); set_current_menu_section(MAIN_SECTION); break; case SCORE_SECTIONS: clear_text_offscreen (); set_current_menu_section(MAIN_SECTION); break; } } return exit_code; } /** * Update strings menu: area code, player names, current difficulty, and * the number of lifes */ void sprite_display_menu::update_strings () { const char *source; char *dest; /* copy current area code */ dest = texts_of_menus[MAIN_SECTION + LINE_CODE2] + 10; supervisor_main_menu::copy_current_area_code (dest); /* copy number of players */ dest = texts_of_menus[OPTIONS_SECTION + 5] + 24; integer_to_ascii (number_of_players, 1, dest); /* copy player names */ for (Uint32 i = 0; i < handler_players::MAX_OF_PLAYERS; i++) { dest = texts_of_menus[OPTIONS_SECTION + 6 + i] + 24; source = handler_players::players_list[i]->get_name (); for (Uint32 j = 0; j < handler_players::PLAYER_NAME_LENGTH; j++) { dest[j] = source[j]; } } /* copy current difficulty level */ source = &difficulte[(difficulty_level - 1) * 4]; dest = texts_of_menus[OPTIONS_SECTION + 12] + 24; for (Sint32 i = 0; i < 4; i++) { dest[i] = source[i]; } dest = texts_of_menus[OPTIONS_SECTION + 13] + 24; integer_to_ascii (initial_num_of_lifes, 2, dest); /* check if the first part of the cheat code is enabled */ birth_flag = true; for (Uint32 i = 0; i < handler_players::MAX_OF_PLAYERS; i++) { source = handler_players::players_list[i]->get_name (); if (source[0] != '0' || source[1] != '4' || source[2] != '0' || source[3] != '6' || source[4] != '7' || source[5] != '0') { birth_flag = false; } } } /** * Erase the entirety of the offscreen before drawing a new menu section */ void sprite_display_menu::clear_text_offscreen () { text_offscreen->clear (); } /** * Clear a zone of the menu (used to modify a string of the menu) */ void sprite_display_menu::clear_input_zone () { if (!is_clean_zone) { return; } text_offscreen->clear (0, clear_zone_xcoord, clear_zone_ycoord, clear_zone_width, clear_zone_height); } /** * Draw the input string cursor */ void sprite_display_menu::draw_input_cursor () { if (!is_clean_zone) { return; } Sint32 xcurs = keyboard->get_input_cursor_pos (); if (xcurs < 0) { return; } if (--blink_cursor_delay == 0) { blink_cursor_delay = 50; } if (blink_cursor_delay > 30) { return; } unsigned char z = 0xEE; unsigned char *d = (unsigned char *) text_offscreen->get_pixel_data (clear_zone_xcoord + xcurs * font_width, clear_zone_ycoord); Uint32 n = row_size; for (Uint32 h = 0; h < font_height; h++) { for (Uint32 w = 0; w < font_width; w++) { if (0 == d[w]) { d[w] = z; } } d += n; } } /** * Initialize a string to input * @param xcoord X-coordinate in the offscreen menu * @param ycoord Y-coordinate in the offscreen menu * @param width Number of columns * @parm str Pointer to the string to input */ void sprite_display_menu::start_input_string (Uint32 xcoord, Uint32 ycoord, Uint32 width, char *str) { clear_zone_start (xcoord, ycoord, width, 1); if (str == NULL) { return; } blink_cursor_delay = 50; keyboard->set_input_string (str, width); } /** * Initialize a zone to clear; used to modify a string of the menu * @param xcoord X-coordinate in the offscreen menu * @param ycoord Y-coordinate in the offscreen menu * @param width Number of columns * @param height Number of lines */ void sprite_display_menu::clear_zone_start (Uint32 xcoord, Uint32 ycoord, Uint32 width, Uint32 height) { clear_zone_stop (); is_clean_zone = true; clear_zone_width = (width * font_width); clear_zone_height = height * font_height; clear_zone_xcoord = xcoord * font_width; clear_zone_ycoord = ycoord * line_spacing; } /** * Disable the cleaning of a zone" */ void sprite_display_menu::clear_zone_stop () { is_clean_zone = false; keyboard->stop_string_input (); } /** * Copy high score table into the menu */ void sprite_display_menu::copy_high_score_in_menu () { player_score *score = high_score->get_high_score_table (); if (NULL == score) { return; } for (Uint32 i = 0; i < handler_high_score::MAX_OF_HIGH_SCORES; i++) { char *dest = texts_of_menus[SCORE_SECTIONS + 6 + i]; char *name = score[i].player_name; for (Uint32 j = 0; j < handler_players::PLAYER_NAME_LENGTH; j++) { dest[6 + j] = name[j]; } integer_to_ascii (score[i].value, 6, &dest[24]); integer_to_ascii (score[i].area_number, 1, &dest[19]); integer_to_ascii (score[i].level_number, 2, &dest[13]); } } //------------------------------------------------------------------------------ // strings of the main menu //------------------------------------------------------------------------------ char const sprite_display_menu::difficulte[] = "EASY" "HARD" "MAD " "DEAD"; /** * Offsets of the first 128 ASCII characters */ char sprite_display_menu::ascii_to_index[128] = { 26, // 32 ' ' 37, // 33 '!' 40, // 34 '"' 26, // 35 '#' space 26, // 36 '$' space 26, // 37 '%' space 26, // 38 '&' space 40, // 39 "'" 48, // 40 '(' 49, // 41 ')' 47, // 42 '*' 26, // 43 '+' space 26, // 44 ',' 41, // 45 '-' 42, // 46 '.' 26, // 47 '/' space 27, // 48 '0' 28, // 49 '1' 29, // 50 '2' 30, // 51 '3' 31, // 52 '4' 32, // 53 '5' 33, // 54 '6' 34, // 55 '7' 35, // 56 '8' 36, // 57 '9' 39, // 58 ':' 38, // 59 ';' 44, // 60 '<' 26, // 61 '=' space 45, // 62 '>' 43, // 63 '?' 26, // 64 '@' space 0, // 65 'A' 1, // 66 'B' 2, // 67 'C' 3, // 68 'D' 4, // 69 'E' 5, // 70 'F' 6, // 71 'G' 7, // 72 'H' 8, // 73 'I' 9, // 74 'J' 10, // 75 'K' 11, // 76 'L' 12, // 77 'M' 13, // 78 'N' 14, // 79 'O' 15, // 80 'P' 16, // 81 'Q' 17, // 82 'R' 18, // 83 'S' 19, // 84 'T' 20, // 85 'U' 21, // 86 'V' 22, // 87 'W' 23, // 88 'X' 24, // 89 'Y' 25, // 90 'Z' 48, // 91 '[' 26, // 92 '\' space 49, // 93 ']' 26, // 94 '^' space 26, // 95 '_' space 26, // 96 '`' space 26, // 97 'a' space 47, // 98 'b' gray star 52, // 99 'c' horizontal lines 26, // 100 'd' space 50, // 101 'e' full square 26, // 102 'f' space 46, // 103 'g' gray heart 26, // 104 'h' space 26, // 105 'i' space 26, // 106 'j' space 26, // 107 'k' space 26, // 108 'l' space 26, // 109 'm' space 26, // 110 'n' space 26, // 111 'o' space 26, // 112 'p' space 55, // 113 'q' ! white 26, // 114 'r' space 26, // 115 's' space 53, // 116 't' < white 54, // 117 'u' > white 26, // 118 'v' space 51, // 119 'w' pink ellipsis 26, // 120 'x' space 26, // 121 'y' space 26, // 122 'z' space 26, // 123 '{' space 26, // 124 '|' space 26, // 125 '}' space 26, // 126 '~' space 26 // 127 ' ' space }; const unsigned char sprite_display_menu::color_cycling[] = { 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; tecnoballz-0.93.1/src/sprite_projectile.cc0000664000175000017500000002232612412501752017627 0ustar brunobruno/** * @file sprite_projectile.cc * @brief The fire sprite of the paddle into the bricks level * @date 2007-11-16 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_projectile.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_projectile.h" /** * Create the fire sprite object */ sprite_projectile::sprite_projectile () { if (total_fire < MAXI_TOTAL_OF_PROJECTILES) { projectiles_list[total_fire] = this; total_fire++; } set_draw_method (DRAW_COLOR_CYCLING_MASK); on_paddle = false; } /** * Release the fire sprite object */ sprite_projectile::~sprite_projectile () { } /** * Enable the power 1 of the projectiles */ void sprite_projectile::set_power1 () { frame_index_min = 4; frame_index_max = 7; frame_index = 4; can_destroy_indestructible = false; power = 1; current_cycling = &sprite_object::cycling_02[0]; } /** * Enable the power 2 of the projectiles */ void sprite_projectile::set_power2 () { frame_index_min = 0; frame_index_max = 3; frame_index = 0; can_destroy_indestructible = true; power = 2; current_cycling = &sprite_object::cycling_01[0]; } /** * Clear member a simple */ void sprite_projectile::init_members (sprite_paddle * pad) { paddle = pad; indexSinus = 0; fire_Xscie = 0; fire_Yscie = 0; frame_index = 0; frame_index_max = 3; frame_index_min = 0; frame_delay = 10; frame_period = 10; can_destroy_indestructible = false; power = 0; } /** * Static method which initialize all projectiles before a bricks level */ void sprite_projectile::start_list () { total_fire = 0; for (Uint32 i = 0; i < MAXI_TOTAL_OF_PROJECTILES; i++) { projectiles_list[i] = NULL; } } /** * Static method which manage all projectiles */ void sprite_projectile::gestionTir () { check_outside (); play_projectiles_animations (); check_collisions_with_bricks (); check_collisions_with_ships (); } /** * Static method which check if all projectiles go out of the screen of game */ void sprite_projectile::check_outside () { sprite_projectile **projectiles = projectiles_list; Sint32 y1 = 15 * resolution; Sint32 y2 = 232 * resolution; Sint32 x1 = 15 * resolution; Sint32 x2 = 228 * resolution; for (Uint32 i = 0; i < total_fire; i++) { sprite_projectile *blast = *(projectiles++); Sint32 a = blast->y_coord; if (a < y1 || a > y2) { blast->is_enabled = false; continue; } a = blast->x_coord; if (a < x1 || a > x2) { blast->is_enabled = false; } } } /** * Static method which manages the animation played in loop-mode */ void sprite_projectile::play_projectiles_animations () { sprite_projectile **projectiles = projectiles_list; sprite_projectile *blast = projectiles[0]; blast->play_animation_loop (); Sint32 index = blast->get_frame_index (); Sint32 cycle = index & 0X1; if (0 == cycle) { cycle = sprite_object::DRAW_WITH_TABLES; } else { cycle = sprite_object::DRAW_COLOR_CYCLING_MASK; } blast->draw_method = cycle; for (Uint32 i = 1; i < total_fire; i++) { blast = projectiles[i]; blast->set_image (index); blast->draw_method = cycle; } } /** * Static method which check collision projectiles between bricks */ void sprite_projectile::check_collisions_with_bricks () { controller_bricks *bricks = controller_bricks::get_instance (); /* brick's width in pixels */ Uint32 brick_width = bricks->get_brick_width (); /* y-offset between 2 bricks */ /* first indestructible brick */ Sint32 indestructible = bricks->get_indestructible_offset (); sprite_projectile **projectiles = projectiles_list; for (Uint32 i = 0; i < total_fire; i++) { sprite_projectile *blast = *(projectiles++); if (!blast->is_enabled) { continue; } Sint32 x = blast->x_coord + 2; Sint32 y = blast->y_coord + 2; brick_redraw *redraw = bricks->get_bricks_redraw (); redraw->xcoord_collision = x; redraw->ycoord_collision = y; brick_info *map = bricks->get_bricks_map(x, y); /* collision between a blast and a brick? */ if (map->source_offset == 0) { /* no collision */ continue; } if (!blast->on_paddle) { blast->is_enabled = false; } redraw->paddle = blast->paddle; redraw->is_gigablitz_destroyed = false; if (!has_background) { map->sprite->touch (); } if (map->source_offset >= indestructible) { /* * indestructible brick touched! */ /* indestructible-destructible bricks? */ if (map->source_offset > (Sint32)(indestructible + brick_width)) { /* fire destroys the indestructibles-destructibles bricks? */ if (blast->can_destroy_indestructible) { redraw->is_indestructible = true; redraw->pixel_offset = map->pixel_offset; redraw->brick_map = map; map->source_offset = 0; redraw->number = map->number; /* restore background under brick */ redraw->is_background = true; bricks->bricks_redraw_next (); } else { #ifndef SOUNDISOFF audio-> play_sound (handler_audio::HIT_INDESTRUCTIBLE_BRICK2); #endif } } else { /* the brick is really indestructible */ #ifndef SOUNDISOFF audio->play_sound (handler_audio::HIT_INDESTRUCTIBLE_BRICK1); #endif } } /* * Normal brick touched */ else { redraw->is_indestructible = false; redraw->pixel_offset = map->pixel_offset; redraw->brick_map = map; /* fire power: 1 or 2 */ x = blast->power; map->h_pos = map->h_pos - (x * 2); if (map->h_pos <= 0) { map->h_pos = 0; map->source_offset = 0; redraw->number = map->number; /* restore background under brick */ redraw->is_background = true; } else { map->source_offset = map->source_offset - (x * brick_width); redraw->number = map->source_offset; /* redraw a new brick */ redraw->is_background = false; } bricks->bricks_redraw_next (); } } } /** * Static method which check collisions between projectiles and ships */ void sprite_projectile::check_collisions_with_ships () { sprite_projectile **projectiles = projectiles_list; controller_ships *ships = controller_ships::get_instance (); Sint32 t = ships->get_max_of_sprites (); sprite_ship **ships_list = ships->get_sprites_list (); for (Uint32 i = 0; i < total_fire; i++) { sprite_projectile *blast = *(projectiles++); if (!blast->is_enabled) { continue; } sprite_ship **ships = ships_list; Sint32 y1 = blast->y_coord; Sint32 y2 = y1 + 3; y1 -= 26; Sint32 x1 = blast->x_coord; Sint32 x2 = x1 + 3; x1 -= 20; for (Sint32 j = 0; j < t; j++) { sprite_ship *ship = *(ships++); if (ship->enable_counter > 0) { continue; } Sint32 k = ship->y_coord; if (k >= y2 || k <= y1) { continue; } k = ship->x_coord; if (k >= x2 || k <= x1) { continue; } if (!blast->on_paddle) { blast->is_enabled = false; } current_player->add_score (100); k = blast->power; ship->strength -= k; if (ship->strength < 1) { ship->destroy (blast); } } } } /** * Static method which disables all projectiles */ void sprite_projectile::disable_sprites () { sprite_projectile **projectiles = projectiles_list; for (Uint32 i = 0; i < total_fire; i++) { sprite_projectile *blast = *(projectiles++); blast->is_enabled = false; } } Uint32 sprite_projectile::total_fire = 0; sprite_projectile * sprite_projectile::projectiles_list[MAXI_TOTAL_OF_PROJECTILES]; tecnoballz-0.93.1/src/sprite_bullet.cc0000664000175000017500000002444412412501752016761 0ustar brunobruno/** * @file sprite_bullet.cc * @brief The bullet sprite from a guardian * @date 2007-02-18 * @copyright 1991-2014 TLK Games * @author Bruno Ethvignot * @version $Revision: 24 $ */ /* * copyright (c) 1991-2014 TLK Games all rights reserved * $Id: sprite_bullet.cc 24 2014-09-28 15:30:04Z bruno.ethvignot@gmail.com $ * * TecnoballZ 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. * * TecnoballZ 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include "../include/sprite_bullet.h" /** * Create a bullet sprite */ sprite_bullet::sprite_bullet () { clear_sprite_members (); displacement = 0; flagDepla1 = 0; flagDepla2 = 0; flagDepla3 = 0; flagDepla4 = 0; flagDepla5 = 0; flagDepla6 = 0; flagDepla7 = 0; tir_maxi_x = 303 * resolution; tir_maxi_y = 240 * resolution; tir_minixy = 2 * resolution; } /** * Release a bullet sprite */ sprite_bullet::~sprite_bullet () { } /** * Move the bullet */ void sprite_bullet::move () { if (!is_enabled) { return; } switch (displacement) { case 1: trajectory_01 (); break; case 2: trajectory_02 (); break; case 3: trajectory_03 (); break; case 4: trajectory_04 (); break; case 5: trajectory_05 (); break; case 6: trajectory_06 (); break; case 7: trajectory_07 (); break; case 8: trajectory_08 (); break; case 9: trajectory_09 (); break; case 10: trajectory_10 (); break; case 11: trajectory_11 (); break; case 12: trajectory_12 (); break; } } //------------------------------------------------------------------------------ // weapons: trajectory number 1 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_01 () { y_coord = y_coord + (4 * resolution); Sint32 v = tablesinus[++flagDepla1]; if (v == 99) { flagDepla1 = 0; v = 32; } x_coord = flagDepla2 + (v * resolution); screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 2 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_02 () { flagDepla3 = flagDepla3 + 2; if (tablesinus[flagDepla3] == 99) //end of the table? flagDepla3 = 0; flagDepla2 = flagDepla2 + (4 * resolution); //new position y y_coord = flagDepla2 + (tablesinus[flagDepla3 + 1] * resolution); x_coord = flagDepla1 + (tablesinus[flagDepla3] * resolution); screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 3 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_03 () { y_coord = y_coord + (4 * resolution); screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 4 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_04 () { if (flagDepla5) { if (--flagDepla4 <= 0) { flagDepla4 = flagDepla5; flagDepla5--; flagDepla3 = flagDepla3 + 2; if (tablesinus[flagDepla3] == 99) //end of the table? flagDepla3 = 0; y_coord = flagDepla2 + (tablesinus[flagDepla3 + 1] * resolution); x_coord = flagDepla1 + (tablesinus[flagDepla3] * resolution); } } else { x_coord -= flagDepla6; y_coord += flagDepla7; } screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 5 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_05 () { if (flagDepla1 > 0) { flagDepla1--; y_coord += resolution; } else { x_coord -= flagDepla2; y_coord += flagDepla3; } screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 6 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_06 () { flagDepla3 = flagDepla3 + 2; /* end of the table */ if (tablesinus[flagDepla3] == 99) { flagDepla3 = 0; } /* update y-coordinate */ flagDepla2 = flagDepla2 + (3 * resolution); y_coord = flagDepla2 + (tablesinus[flagDepla3 + 1] * resolution); if (flagDepla2 < (Sint32)(150 * resolution)) { flagDepla1 = flagDepla1 + 2 * resolution; if (paddle_target->x_coord < (Sint32)flagDepla1) { flagDepla1 = flagDepla1 - 4 * resolution; } } x_coord = flagDepla1 + (tablesinus[flagDepla3] * resolution); screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 7 //------------------------------------------------------------------------------ void sprite_bullet::trajectory_07 () { /* update y-coordinate */ y_coord = y_coord + (3 * resolution); if (y_coord < Sint32(150 * resolution)) { x_coord = x_coord + 2 * resolution; if (paddle_target->x_coord < x_coord) { x_coord = x_coord - 4 * resolution; } } screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 8 - infernal circle (circle which grows) //------------------------------------------------------------------------------ void sprite_bullet::trajectory_08 () { flagDepla3 = flagDepla3 + 2; if (flagDepla3 >= 360) flagDepla3 = 0; Sint32 x = tablesinus[flagDepla3] * flagDepla4; Sint32 y = tablecosin[flagDepla3] * flagDepla4; x = x >> 7; y = y >> 7; x_coord = ptguardian->x_coord + ptguardian->canon_xcoord + x; y_coord = ptguardian->y_coord + ptguardian->gard_ycent + y; flagDepla4 += resolution; screenOver (tir_minixy); } /** * Weapon trajectory number 9 - sucker circle (circle which rebounds ) */ void sprite_bullet::trajectory_09 () { flagDepla3 = flagDepla3 + 4; if (flagDepla3 >= 360) { flagDepla3 = 0; } Sint32 r = (16 * resolution); Sint32 x = tablesinus[flagDepla3] * r; Sint32 y = tablecosin[flagDepla3] * r; x = x >> 7; y = y >> 7; x_coord = flagDepla1 + x; y_coord = flagDepla2 + y; flagDepla2 += resolution; if (flagDepla4 > 0) { flagDepla1 += (5 * resolution); if (flagDepla1 > (Sint32)(284 * resolution)) { flagDepla4 = 0; } } else { flagDepla1 -= (5 * resolution); if (flagDepla1 < (Sint32)(-80 * resolution)) { flagDepla4 = 1; } } screenStop (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 10 - elipse //------------------------------------------------------------------------------ void sprite_bullet::trajectory_10 () { flagDepla3 = flagDepla3 + 6; if (flagDepla3 >= 360) flagDepla3 -= 360; Sint32 ray_x = flagDepla4; Sint32 ray_y = ray_x - (3 * resolution); if (--flagDepla5 <= 0) { flagDepla5 = 3; flagDepla4 += resolution; } Sint32 x = tablesinus[flagDepla3] * ray_x; Sint32 y = tablecosin[flagDepla3] * ray_y; x = x >> 7; y = y >> 7; x_coord = flagDepla1 + x; y_coord = flagDepla2 + y; flagDepla2 += 3 * resolution; screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 11 - triangle I //------------------------------------------------------------------------------ void sprite_bullet::trajectory_11 () { flagDepla3 = flagDepla3 + 4; if (flagDepla3 >= 360) flagDepla3 -= 360; Sint32 r = (11 * resolution); Sint32 x = tablesinus[flagDepla3] * r; Sint32 y = tablecosin[flagDepla3] * r; x = x >> 7; y = y >> 7; x_coord = flagDepla1 + x; y_coord = flagDepla2 + y; flagDepla2 += (resolution * 3); screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: trajectory number 12 - triangle II //------------------------------------------------------------------------------ void sprite_bullet::trajectory_12 () { flagDepla3 = flagDepla3 + 4; if (flagDepla3 >= 360) flagDepla3 -= 360; Sint32 r = (sprite_width * resolution); Sint32 x = tablesinus[flagDepla3] * r; Sint32 y = tablecosin[flagDepla3] * r; x = x >> 7; y = y >> 7; x_coord = flagDepla1 + x; y_coord = flagDepla2 + y; flagDepla1 += flagDepla4; flagDepla2 += flagDepla5; screenOver (tir_minixy); } //------------------------------------------------------------------------------ // weapons: overflow test //------------------------------------------------------------------------------ void sprite_bullet::screenOver (Sint32 vmini) { if (x_coord > tir_maxi_x || x_coord < vmini || y_coord < vmini || y_coord > tir_maxi_y) is_enabled = false; } //------------------------------------------------------------------------------ // weapons: overflow test //------------------------------------------------------------------------------ void sprite_bullet::screenStop (Sint32 vmini) { if (y_coord > tir_maxi_y) { is_enabled = false; } else { if (y_coord < vmini) y_coord = vmini; if (x_coord > tir_maxi_x) x_coord = tir_maxi_x; else { if (x_coord < vmini) x_coord = vmini; } } } tecnoballz-0.93.1/tecnoballz.60000664000175000017500000000314212412501752015222 0ustar brunobruno.TH TecnoballZ 6 "TecnoballZ" "2014" "TLK Games" .SH NAME tecnoballz - A Breakout like game. .SH SYNOPSIS tecnoballz [options] .SH DESCRIPTION TecnoballZ is a "breaking blocks" game that was first written for the Amiga platform. .P You'll need to break all the blocks in each level. The game is divided into Areas which are divided into Levels. Between some levels, you have to defeat a guardian to pass to the next level. When passing an Area, a new edge is open. You can buy weapons and bonus between levels with the money earned during the game. .SH KEYBINDINGS .B [Space] Release ball(s) .TP .B Left [Ctrl] Fire .TP .B Left [Alt] Fire Gigablitz or activate the tilt .TP .B [Ctrl] + [S] Toggle sound activation. .TP .B [Ctrl] + [X] Causes a game over. .TP .B [ESC] Go to the menu. .TP .B [P] Toggle pause. .TP .B [PAGE UP] Volume up .TP .B [PAGE DOWN] Volume down .SH OPTIONS .P .B \--help Display a short help message. .TP .B \--version Display version number. .TP .B \--full Start the game in fullscreen mode. .TP .B \--window windowed mode (full screen by default) .TP .B \--320|--640 Force the game resolution to 320x200 or 640x480. .TP .B \--verbose Print a lot of debuging information to stdout. .TP .B \--nosound|--sound Disable or enable the sound .TP .B \--bg4 Force using a four-color background .SH COPYRIGHT .if n TecnoballZ is Copyright (C) 1992-2014 by the TLK Games Company. .SH AUTHOR TLK Games, http://linux.tlk.fr/games/TecnoballZ/ .P Bruno Ethvignot, development and GNU/Linux port .P This man-page was written by Alexis Sukrieh for the Debian system (but may be used by others). tecnoballz-0.93.1/tecnoballz.conf0000664000175000017500000000100612412501751015776 0ustar brunobruno(tecnoballz-config ;; the following options can be set to #t or #f: (fullscreen #f) (sound #t) (verbose #f) ;; window size 1 (low-res) or 2 (high-res): (resolution 2) ;; difficulty 1 (easy), 2 (hard), 3 (madness) or 4 (suicidal) (difficulty 1) ;; number of lifes (1 to 9) (lifes 8) ;; number of players (1 to 6) (players 1) ;; players names (player1 "BUBUX1") (player2 "BUBUX2") (player3 "BUBUX4") (player4 "BUBUX5") (player5 "BUBUX6") (player6 "BUBUX7") ) tecnoballz-0.93.1/tecnoballz.hi0000775000175000017500000000144412412501752015463 0ustar brunobruno_}_^BUXBUXT L K T L K  T L K T L K XT L K T L K T L K ,T L K T L K T L K T L K  T L K T L K XT L K T L K T L K ,T L K T L K dT L K T L K T L K  T L K T L K XT L K T L K T L K ,T L K T L K dT L K T L K T L K  T L K T L K XT L K T L K T L K ,T L K T L K dT L K