From ad6429dcc7e08a1430fd05fd3db59a55b38522e9 Mon Sep 17 00:00:00 2001 From: Richard Schneider Date: Mon, 22 Dec 2014 22:56:57 -0500 Subject: [PATCH] initial import; Maelstrom 3.0.6 --- COPYING | 11 + COPYING.GPL | 280 ++ CREDITS | 12 + Changelog | 279 ++ Docs/Ambrosia_Software,_Inc._FAQ | 324 +++ Docs/Maelstrom-Announce | 76 + Docs/Maelstrom.FAQ | 602 +++++ Docs/MaelstromGPL_press_release | 52 + Docs/Makefile | 9 + Docs/Makefile.in | 9 + Docs/Networking.Paper | 202 ++ Docs/Porting.Paper | 390 +++ Docs/Quotes | 25 + Docs/RSA.README | 17 + Docs/Technical_Notes-v1.0 | 260 ++ Docs/Technical_Notes-v1.1 | 26 + Docs/Technical_Notes-v2.0 | 158 ++ INSTALL | 9 + Images/Maelstrom_Icon#100.cicn | Bin 0 -> 1156 bytes Images/Maelstrom_Icon#101.cicn | Bin 0 -> 1156 bytes Images/Maelstrom_Icon#102.cicn | Bin 0 -> 1156 bytes Images/Maelstrom_Icon#103.cicn | Bin 0 -> 1156 bytes Images/Maelstrom_Icon#104.cicn | Bin 0 -> 1156 bytes Images/Maelstrom_Icon#110.cicn | Bin 0 -> 1156 bytes Images/Maelstrom_Icon#128.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#129.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#130.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#131.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#132.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#133.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#134.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#135.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#136.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Icon#137.cicn | Bin 0 -> 76 bytes Images/Maelstrom_Titles#100.bmp | Bin 0 -> 24478 bytes Images/Maelstrom_Titles#101.bmp | Bin 0 -> 22278 bytes Images/Maelstrom_Titles#102.bmp | Bin 0 -> 14478 bytes Images/Maelstrom_Titles#128.bmp | Bin 0 -> 17654 bytes Images/Maelstrom_Titles#129.bmp | Bin 0 -> 42262 bytes Images/Maelstrom_Titles#130.bmp | Bin 0 -> 197686 bytes Images/Maelstrom_Titles#133.bmp | Bin 0 -> 197686 bytes Images/Maelstrom_Titles#134.bmp | Bin 0 -> 197686 bytes Images/Maelstrom_Titles#135.bmp | Bin 0 -> 197686 bytes Images/Maelstrom_Titles#999.bmp | Bin 0 -> 92598 bytes Images/Makefile | 9 + Images/Makefile.in | 9 + MPWmake.sea.bin | Bin 0 -> 20224 bytes Maelstrom-Scores | Bin 0 -> 280 bytes Maelstrom-netd.c | 376 +++ Maelstrom.h | 86 + Maelstrom.spec | 103 + Maelstrom.spec.in | 103 + Maelstrom_Fonts | Bin 0 -> 153211 bytes Maelstrom_Globals.h | 129 + Maelstrom_Sounds | Bin 0 -> 413235 bytes Maelstrom_Sprites | Bin 0 -> 729966 bytes Makefile.am | 89 + Makefile.in | 459 ++++ PBProjects.tar.gz | Bin 0 -> 22789 bytes README | 31 + README.joystick | 11 + README.network | 36 + README.options | 67 + VisualC.zip | Bin 0 -> 5380 bytes acinclude.m4 | 175 ++ aclocal.m4 | 280 ++ autogen.sh | 8 + buttonlist.h | 64 + checksum.cpp | 267 ++ checksum.h | 11 + colortable.h | 2346 +++++++++++++++++ config.guess | 1368 ++++++++++ config.sub | 1357 ++++++++++ configure | 4097 ++++++++++++++++++++++++++++++ configure.in | 126 + controls.cpp | 558 ++++ controls.h | 33 + dialog.cpp | 310 +++ dialog.h | 938 +++++++ fastrand.cpp | 93 + fastrand.h | 7 + ico_o | Bin 0 -> 2518 bytes icon.bmp | Bin 0 -> 2732 bytes icon.xpm | 147 ++ init.cpp | 1263 +++++++++ install-sh | 251 ++ load.cpp | 139 + load.h | 126 + logic.h | 28 + maclib/COPYING | 280 ++ maclib/Mac_Compat.h | 37 + maclib/Mac_FontServ.cpp | 418 +++ maclib/Mac_FontServ.h | 146 ++ maclib/Mac_Resource.cpp | 531 ++++ maclib/Mac_Resource.h | 107 + maclib/Mac_Sound.cpp | 287 +++ maclib/Mac_Sound.h | 208 ++ maclib/Mac_Wave.cpp | 571 +++++ maclib/Mac_Wave.h | 117 + maclib/Makefile.am | 27 + maclib/Makefile.in | 321 +++ maclib/README | 35 + maclib/applefile.h | 342 +++ maclib/bitesex.h | 19 + maclib/macbinary.h | 62 + maclib/macres.cpp | 77 + maclib/playwave.cpp | 176 ++ maclib/snd2wav.cpp | 90 + main.cpp | 682 +++++ missing | 190 ++ mkinstalldirs | 40 + myerror.cpp | 47 + myerror.h | 12 + netlogic/Makefile.am | 22 + netlogic/Makefile.in | 273 ++ netlogic/about.cpp | 204 ++ netlogic/blit.cpp | 165 ++ netlogic/game.cpp | 1048 ++++++++ netlogic/globals.h | 29 + netlogic/logic.cpp | 118 + netlogic/make.cpp | 372 +++ netlogic/make.h | 13 + netlogic/netlogic.h | 48 + netlogic/netplay.cpp | 820 ++++++ netlogic/netplay.h | 18 + netlogic/object.cpp | 117 + netlogic/object.h | 289 +++ netlogic/objects.cpp | 144 ++ netlogic/objects.h | 539 ++++ netlogic/player.cpp | 702 +++++ netlogic/player.h | 160 ++ netlogic/protocol.h | 23 + netlogic/shinobi.h | 273 ++ netscore.cpp | 210 ++ netscore.h | 10 + public_key.h | 8 + rect.cpp | 26 + rect.h | 23 + scores.cpp | 271 ++ scores.h | 15 + screenlib/COPYING | 280 ++ screenlib/Makefile.am | 8 + screenlib/Makefile.in | 272 ++ screenlib/README | 5 + screenlib/SDL_FrameBuf.cpp | 877 +++++++ screenlib/SDL_FrameBuf.h | 218 ++ screenlib/pixel.cpp | 47 + screenlib/pixel.h | 33 + 148 files changed, 30743 insertions(+) create mode 100644 COPYING create mode 100644 COPYING.GPL create mode 100644 CREDITS create mode 100644 Changelog create mode 100644 Docs/Ambrosia_Software,_Inc._FAQ create mode 100644 Docs/Maelstrom-Announce create mode 100644 Docs/Maelstrom.FAQ create mode 100644 Docs/MaelstromGPL_press_release create mode 100644 Docs/Makefile create mode 100644 Docs/Makefile.in create mode 100644 Docs/Networking.Paper create mode 100644 Docs/Porting.Paper create mode 100644 Docs/Quotes create mode 100644 Docs/RSA.README create mode 100644 Docs/Technical_Notes-v1.0 create mode 100644 Docs/Technical_Notes-v1.1 create mode 100644 Docs/Technical_Notes-v2.0 create mode 100644 INSTALL create mode 100644 Images/Maelstrom_Icon#100.cicn create mode 100644 Images/Maelstrom_Icon#101.cicn create mode 100644 Images/Maelstrom_Icon#102.cicn create mode 100644 Images/Maelstrom_Icon#103.cicn create mode 100644 Images/Maelstrom_Icon#104.cicn create mode 100644 Images/Maelstrom_Icon#110.cicn create mode 100644 Images/Maelstrom_Icon#128.cicn create mode 100644 Images/Maelstrom_Icon#129.cicn create mode 100644 Images/Maelstrom_Icon#130.cicn create mode 100644 Images/Maelstrom_Icon#131.cicn create mode 100644 Images/Maelstrom_Icon#132.cicn create mode 100644 Images/Maelstrom_Icon#133.cicn create mode 100644 Images/Maelstrom_Icon#134.cicn create mode 100644 Images/Maelstrom_Icon#135.cicn create mode 100644 Images/Maelstrom_Icon#136.cicn create mode 100644 Images/Maelstrom_Icon#137.cicn create mode 100644 Images/Maelstrom_Titles#100.bmp create mode 100644 Images/Maelstrom_Titles#101.bmp create mode 100644 Images/Maelstrom_Titles#102.bmp create mode 100644 Images/Maelstrom_Titles#128.bmp create mode 100644 Images/Maelstrom_Titles#129.bmp create mode 100644 Images/Maelstrom_Titles#130.bmp create mode 100644 Images/Maelstrom_Titles#133.bmp create mode 100644 Images/Maelstrom_Titles#134.bmp create mode 100644 Images/Maelstrom_Titles#135.bmp create mode 100644 Images/Maelstrom_Titles#999.bmp create mode 100644 Images/Makefile create mode 100644 Images/Makefile.in create mode 100644 MPWmake.sea.bin create mode 100644 Maelstrom-Scores create mode 100644 Maelstrom-netd.c create mode 100644 Maelstrom.h create mode 100644 Maelstrom.spec create mode 100644 Maelstrom.spec.in create mode 100644 Maelstrom_Fonts create mode 100644 Maelstrom_Globals.h create mode 100644 Maelstrom_Sounds create mode 100644 Maelstrom_Sprites create mode 100644 Makefile.am create mode 100644 Makefile.in create mode 100644 PBProjects.tar.gz create mode 100644 README create mode 100644 README.joystick create mode 100644 README.network create mode 100644 README.options create mode 100644 VisualC.zip create mode 100644 acinclude.m4 create mode 100644 aclocal.m4 create mode 100755 autogen.sh create mode 100644 buttonlist.h create mode 100644 checksum.cpp create mode 100644 checksum.h create mode 100644 colortable.h create mode 100755 config.guess create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.in create mode 100644 controls.cpp create mode 100644 controls.h create mode 100644 dialog.cpp create mode 100644 dialog.h create mode 100644 fastrand.cpp create mode 100644 fastrand.h create mode 100644 ico_o create mode 100644 icon.bmp create mode 100644 icon.xpm create mode 100644 init.cpp create mode 100755 install-sh create mode 100644 load.cpp create mode 100644 load.h create mode 100644 logic.h create mode 100644 maclib/COPYING create mode 100644 maclib/Mac_Compat.h create mode 100644 maclib/Mac_FontServ.cpp create mode 100644 maclib/Mac_FontServ.h create mode 100644 maclib/Mac_Resource.cpp create mode 100644 maclib/Mac_Resource.h create mode 100644 maclib/Mac_Sound.cpp create mode 100644 maclib/Mac_Sound.h create mode 100644 maclib/Mac_Wave.cpp create mode 100644 maclib/Mac_Wave.h create mode 100644 maclib/Makefile.am create mode 100644 maclib/Makefile.in create mode 100644 maclib/README create mode 100644 maclib/applefile.h create mode 100644 maclib/bitesex.h create mode 100644 maclib/macbinary.h create mode 100644 maclib/macres.cpp create mode 100644 maclib/playwave.cpp create mode 100644 maclib/snd2wav.cpp create mode 100644 main.cpp create mode 100755 missing create mode 100755 mkinstalldirs create mode 100644 myerror.cpp create mode 100644 myerror.h create mode 100644 netlogic/Makefile.am create mode 100644 netlogic/Makefile.in create mode 100644 netlogic/about.cpp create mode 100644 netlogic/blit.cpp create mode 100644 netlogic/game.cpp create mode 100644 netlogic/globals.h create mode 100644 netlogic/logic.cpp create mode 100644 netlogic/make.cpp create mode 100644 netlogic/make.h create mode 100644 netlogic/netlogic.h create mode 100644 netlogic/netplay.cpp create mode 100644 netlogic/netplay.h create mode 100644 netlogic/object.cpp create mode 100644 netlogic/object.h create mode 100644 netlogic/objects.cpp create mode 100644 netlogic/objects.h create mode 100644 netlogic/player.cpp create mode 100644 netlogic/player.h create mode 100644 netlogic/protocol.h create mode 100644 netlogic/shinobi.h create mode 100644 netscore.cpp create mode 100644 netscore.h create mode 100644 public_key.h create mode 100644 rect.cpp create mode 100644 rect.h create mode 100644 scores.cpp create mode 100644 scores.h create mode 100644 screenlib/COPYING create mode 100644 screenlib/Makefile.am create mode 100644 screenlib/Makefile.in create mode 100644 screenlib/README create mode 100644 screenlib/SDL_FrameBuf.cpp create mode 100644 screenlib/SDL_FrameBuf.h create mode 100644 screenlib/pixel.cpp create mode 100644 screenlib/pixel.h diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..3879f69 --- /dev/null +++ b/COPYING @@ -0,0 +1,11 @@ +The source code to Maelstrom 3.0 and higher has been released under +the GNU General Public License which can be found in COPYING.GPL. + +The artwork and animations in Maelstrom may be used under the terms +of the Creative Commons Attribution 3.0 license (unported): +http://creativecommons.org/licenses/by/3.0/legalcode + +The following files must accompany any distribution of Maeltrom 3.0: + Ambrosia_Software,_Inc._FAQ + MaelstromGPL_press_release +They can be found in the Docs directory. diff --git a/COPYING.GPL b/COPYING.GPL new file mode 100644 index 0000000..960fe74 --- /dev/null +++ b/COPYING.GPL @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + END OF TERMS AND CONDITIONS diff --git a/CREDITS b/CREDITS new file mode 100644 index 0000000..15c7b30 --- /dev/null +++ b/CREDITS @@ -0,0 +1,12 @@ + +The original version of this game was written for the Macintosh by +Andrew Welch, of Ambrosia Software. It was ported to Linux and then +to the Simple DirectMedia Layer library by Sam Lantinga. + +This would have never come about without the help and encouragement +of many people, too numerous to mention here. + +Thank you everybody, you know who you are! :) + +11/18/1999 +Sam Lantinga diff --git a/Changelog b/Changelog new file mode 100644 index 0000000..80c955d --- /dev/null +++ b/Changelog @@ -0,0 +1,279 @@ + +Maelstrom 3.0.6 -- Public GPL version + +Version 3.0.6: + Sam Lantinga - Sat Oct 19 19:09:57 PDT 2002 + * Added support for MacBinary resource files + * Updated README.joystick to reflect joystick support + * Fixed volume lockup bug on MacOS X + Dean Larman-Moore - May 2002 00:20:43 +0100 + * Fixed network bug with more than one player + +Version 3.0.5: + Sam Lantinga - Fri Jul 20 08:09:14 PDT 2001 + * Fixed some bugs in the mac dialog entry widgets + +Version 3.0.4: + Sam Lantinga - Sat Mar 24 09:45:41 PST 2001 + * Ported to MacOS X + * Added gamma fading algorithm + +Version 3.0.3: + Sam Lantinga - Sat Mar 24 09:45:41 PST 2001 + * Updated for SDL 1.2 + +Version 3.0.2: + Sam Lantinga - Sat Feb 19 01:31:20 PST 2000 + * Fixed the multiplayer color dot blitting + * Ported to the SDL_net network library + * Added ALT-ENTER fullscreen toggle (X11) + * Pressing a key escapes the splash screen + Sam Lantinga - Sat Feb 12 02:16:32 PST 2000 + * Added joystick support, using SDL 1.1 + Michael Vanece - Tue, 25 Jan 2000 13:54:04 -0600 + * Fixed a desktop menu installation bug in the RPM + Torbjörn Andersson - Thu, 13 Jan 2000 11:03:19 +0100 + * Fixed a crash in the font class when using + international characters + +Version 3.0.1: + * Source code released under the GPL 11/18/1999 + * Added full autoconf support and made RPM package + +Version 3.0.0: + * Ported to Simple DirectMedia Layer library + (http://www.libsdl.org/) + +Version 2.0.7: + * Added a netscore environment variable: MAELSTROM_SCORESERVER + * Fixed long-standing 24/32 bpp X display detection problem + * Fixed minor compilation problems with modern Linux systems + * Moved error routines into separate file - fixed PPC Linux + +Version 2.0.6: + * Maelstrom no longer eats CPU while paused -- Oops. :) + * Added interlaced pixel doubling for faster doubled display + * Added pixel doubling to Win95 framebuffer code + * Ported to SunOS and Sparc Linux + * Fixed infinite recursion on sound callbacks. + +Version 2.0.5b: + * Fixed silly 16 bpp blit code bug + * Fixed 'make install' -- uses "install" by default + * Fixed segmentation fault in the SVGAlib framebuf driver + * Enhanced the DGA code for HiColor and TrueColor depths + * GREATLY increased DGA speed for linear video cards! + +Version 2.0.5: + * Added PIXEL_DOUBLING back in the X11 display driver + * The DISPLAY environment variable overrides Linux console + * Steel asteroids really aren't supposed to last forever. :) + * Saucer shots don't kill when saucer is destroyed (netlogic) + * Optimized framebuffer blitting code + * Fixed completely white screen on big-endian systems (Sun/SGI) + * Fixed bug in right edge clipping + * GIF format screendumps from high bit-depths okay (slow!) + * Linux sound defaults to 8 bit again -- sounds better. + +Version 2.0.4: + * Added 32 bit TrueColor X11 display support + * FrameBuf now supports video memory locking and pitch + * FrameBuf::ReColor() maps image pixels to screen pixels + * Optimized the compiled sprite engine + * Speeded up truecolor video, slightly slowed 256 color video + * Removed pixel doubling support + * Removed background pixmap shared memory support (not needed) + * Stars!! Lots and lots of Stars!!! + * Ported to Windows 95 (unreleased) + +Version 2.0.3b: + * Fixed bug in which VGA keys must be pressed twice to start. + * Added crappy VGA 16 color mode - yuck. LOW_RES is better. + +Version 2.0.3a: + * Fixed segmentation fault in mixer-dma.cc + * Added error checking to X_image creation. + * Added native support for FreeBSD and SVR4.2 + (Thanks to Stephen Hocking ) + +Version 2.0.3: + * Fixed silly full-screen window bug + * Bonuses, comets and gravity don't shake and shimmy no mo' + * Very slightly improved NAS support .. yech, don't use it. + * Added experimental DMA audio support for Linux - nice. :) + * New life accounting during bonus screen works now. + * Cleaned up the Makefile logic + +Version 2.0.2: + * Kjetil Torgrim Homme added compiler-specific cleanup. + * Multiplayer scores are now updated properly. + * Fixed asteroid counting problem after an explosion. + * Set default fading to pixellated, added -realfade option. + +Version 2.0.0: Beta! + * Added a network address server for multi-player games + * Cleaned up my code some, gcc -Wall is a bit cleaner. :-) + * Fixed problem on SGI where make would always recompile. + * Ported to AIX 3.2 with gcc 2.7.2 (No sound) + (Thanks to C. Chan ) + * Updated some documentation. :) + * Added slower smoother double-buffering for SVGA graphics + * Added cheap, slow, low resolution SVGA mode (320x240x256) + (Inspired by Scott Stone ) + * Added experimental 8-bit XFree86 3.1.2E DGA support. + * Added "-displaytype" option to query current display. + +Version 2.0.0: Alpha! + * New!! Multi-player mode! Up to 3 players! Has Bugs!! :) + * Added some basic joystick support for Linux. + * Added a network-based score registration server. + * Added a '-printscores' command line option. + * Added a '-netscores' command line option. + * Added the ability to display on remote X terminals. + * Added a '-display ' command line option. + * Fixed a minor high score name entering bug. + * Fixed endian compile problems on HPUX. + * More robust data file searching (files can contain '_') + * Time bug fix -- by Warwick Allinson (warwick@cs.uq.oz.au) + * Added better fading code for the -nofade option + This is slow on 16-24 bit displays. Comments? + * Maelstrom now understands AppleDouble resource forks + * Finally fixed "press Enter after switching consoles" bug + Inspired by Tessa Lau (tlau@cs.washington.edu) + * Finally fixed "stuck keys between levels" SVGA problem. + * Hopefully sped up SVGAlib refresh (removed a mem copy) + * A few code cleanups. + * Never seeded random number generator in prior versions. + * NEW! Now using the original FastRandom() function, + for more Macintosh fidelity. :-) + * Finally fixed SGI sound! + Thanks to great work by Tom Anderson (tom@proximity.com.au) + and original code boost by Alain Schmidt (alainrd@trix.be) + * Sound server enhancements by Tom Anderson: + Mellowed out sound volume for less clipping. + Added 16 bit sound for SGI's + Added POSIX signal support to the sound server. + Created a portable usleep() function (select() based) + * Added Screen capture during game - triggered by hitting F3 + Saves to XPM or GIF format (compile time option) + * Added the pixel fade feature to SVGA mode. + * Added a Configure script that autodetects your system. + * Fixed some timing bugs in Delay() + * Optimized some of the sprite blitting. + +Version 1.1.4: + * Fixed a time related bug in "long" v.s. "unsigned long" !!?? + * Removed an offending "#include " from main.cc + * Improved SVGA refresh algorithm (Thanks ARDI!) + (too slow on my machine -- #ifdef'd out) + * Fixed a bug in shots not wrapping vertically + (Thanks to Dave Ljung for finding that) + +Version 1.1.3: + * Fourth Public Release: 12/10/95 + * Fixed asynchronous I/O problem on Solaris. + * Finished port of Maelstrom to Solaris 2.4 + * Finished port of Maelstrom to SGI (IRIX 5.3 + * Ported Maelstrom to ULTRIX 4.4 (No sound) + * Ported Maelstrom to HPUX 9.01 (No sound) + * Added a '-version' command line option. + * Added a '-fullscreen' command line option for X11. + * Added a '-nofade' command line option. + * If just '-gamma' is given, we print the current gamma level. + * Fixed a problem with '-privatecmap' where the mouse had + to leave and re-enter the window to update the colormap. + * Added pixel doubling support -- compile-time option. + * Maelstrom pauses while iconified under X11. + * If Maelstrom is on a Linux console, it will run in SVGA mode. + * Oops, fixing Trident SVGA broke Mach32 SVGA. Fixed. + * Added /dev/audio sound support. + Thanks to 'rockndiamonds' and 'snd2au.c' - Thanks! :) +Copyright for snd2au.c: +/************************************************************************/ +/* Copyright 1989 by Rich Gopstein and Harris Corporation */ +/* */ +/* Permission to use, copy, modify, and distribute this software */ +/* and its documentation for any purpose and without fee is */ +/* hereby granted, provided that the above copyright notice */ +/* appears in all copies and that both that copyright notice and */ +/* this permission notice appear in supporting documentation, and */ +/* that the name of Rich Gopstein and Harris Corporation not be */ +/* used in advertising or publicity pertaining to distribution */ +/* of the software without specific, written prior permission. */ +/* Rich Gopstein and Harris Corporation make no representations */ +/* about the suitability of this software for any purpose. It */ +/* provided "as is" without express or implied warranty. */ +/************************************************************************/ + +Version 1.1.2: + * Third Public Release: 10/17/95 + * Fixed a compiler warning on vga_frambuf.cc + * Changed installation directory to /usr/local/bin + * Beautified the 'install' target in the Makefile + * Added 'uninstall' target to Makefile + + * Bugs known in Linux X11 version: + Iconifying Maelstrom doesn't put it in pause mode. + + * Bugs known in Linux SVGA version: (unknown causes) + Keys can get "stuck" between levels. + Console switching doesn't always pause the game + After switching consoles, keystrokes cause SIGQUIT ?? + + * Sort-of ported Maelstrom to Solaris 2.4 + Known bugs: (unknown causes) + Setting asynchronous I/O in Sound Server returns EINVAL + Sound support not tested + + * Sort-of ported Maelstrom to the SGI + Known bugs: (unknown causes) + Fading doesn't work, and neither does -privatecmap + Some scores are reported as low negative numbers + No sound support + + * Sort-of ported Maelstrom to HPUX 10.0 + Known bugs: + Not tested with X11 + No sound support + +Version 1.1.1: + * Fixed a slight slowdown bug in mixer.cc + (Thanks to John Seng for catching it.) + * Fixed the "white border" problem on some vga cards (trident) + (Thanks to Antti J Tanskanen ) + * Fixed a bug in the cheat code, when you enter zero lives. + * Fixed a problem with Maelstrom_sound exiting with signal 11. + * Added Makefile variable toggling compiling SVGA support. + * Added "all-time high" Maelstrom-Scores file. + +Version 1.1.0: + * Second Public Release: 9/1/95 + * Made Maelstrom code more portable, using bytecopy macros + and using shared memory XImages instead of BG pixmaps. + * Discovered that shared memory XImages are truly faster + than shared background pixmaps. Default to use XImage. + (Thanks to Peter Mattis ) + * Added -speedtest option to test the speed of Maelstrom + graphics blitting. SVGA is about 30% faster than shared + memory XImages in X11, on my system. + * Added -gamma N option, allowing gamma correction levels + from 0 through 8. + * Fixed a sound race condition on slow machines. + * Added 24 bit color support. + +Version 1.0.1: + * Added the "NewSounds" directory, filled with sound patches + for Maelstrom collected from the Internet. + * Fixed Maelstrom so it would play the Simpsons sound patch. + * BUG: Bonus stage sound can break up during the screen fade + on slow systems. The fix is to use a larger sound fragment + size, but this negatively impacts synchronization of the + Maelstrom process and the sound server. Not fixed. + * Fixed a coding issue so Maelstrom could be compiled with + g++ 2.7.0 + * Defined true and false for compiling with X11R5. + * Added 15/16-bit color support. (Thanks to Peter Mattis) + * Fixed problem with Maelstrom leaving shared memory around. + +Version 1.0: + * First Public Release: 8/1/95 diff --git a/Docs/Ambrosia_Software,_Inc._FAQ b/Docs/Ambrosia_Software,_Inc._FAQ new file mode 100644 index 0000000..a45c82c --- /dev/null +++ b/Docs/Ambrosia_Software,_Inc._FAQ @@ -0,0 +1,324 @@ +-Ambrosia FAQ---------------------------------------------------------- + +[display this document using the typeface Monaco 9 for best results] + + +-PURPOSE------------------------------------------------------------------ + + FAQ is an acronym for Frequently Asked Questions. This FAQ is an attempt to provide a comprehensive source of information about Ambrosia Software, Inc., and was created in response to questions that are frequently raised by our customers. We hope you find it useful. + + If there are any questions you have about Ambrosia that are not answered in this FAQ, please get in touch with us so we can include them in future revisions. + + +-CREDITS------------------------------------------------------------------ + + Author: Andrew Welch +Contributors: David Dunham, Ed "DAMAGE" Ota, Jason Whong + Thanks to: David Freitas + +Copyright (C)1995-9 by Ambrosia Software, Inc. + + +-FAQ HISTORY-------------------------------------------------------------- + + FAQ Version: 1.3.6 + Created: 6/5/95 +Last Revised: 9/23/99 + + +-DISCLAIMER--------------------------------------------------------------- + + This document is provided as is, without any expressed or implied warranties. While every effort has been taken to ensure the accuracy of the information contained in this document, the author assumes no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. + + +-CONTENTS----------------------------------------------------------------- + +This FAQ answers the following questions: + +GENERAL + - Who is Ambrosia Software, Inc.? + - What kind of products does Ambrosia create? + - Does Ambrosia have a product catalog? + - How can I obtain Ambrosia's products? + - Does Ambrosia have a forum on America Online? + - Does Ambrosia have products for any platforms other than the Mac? + +REGISTRATION + - How do I pay for one of Ambrosia's products? + - My license code is invalid; what's wrong? + - I have lost my license code, how can I have it replaced? + - Why should I register (pay for) an Ambrosia product? + - Does Ambrosia offer site licenses? + +SUPPORT + - How can I get in touch with Ambrosia? + - What is The Ambrosia Times? + - How do I subscribe to The Ambrosia Times? + - How do I use Ambrosia's mailing lists? + +SHAREWARE + - What is shareware? + - Why are you distributing your products as shareware? + - Do you ever plan to "go commercial?" + - Do you actually make any money? + - Is Ambrosia a full-time job? + +HISTORY + - When was Ambrosia founded? + - Who works at Ambrosia? + - What development environment do you use at Ambrosia? + + +-GENERAL------------------------------------------------------------------ + +[Q] - Who is Ambrosia Software, Inc.? + +[A] - Ambrosia Software, Inc. is a small company dedicated to bringing you quality software, excellent support, and innovative ideas all at a reasonable cost. We give you commercial-quality software at a fraction of the price, with the added convenience of being able to try out the software before you pay for it. + + Ambrosia distributes software on numerous electronic information services, as well as via user groups, and approved public domain distributors. Of course, you can always obtain our products directly from us as well. You are given a 30 day free license to evaluate any of our software; after the 30 days have passed, you are expected to send the appropriate registration fee to us for processing. + +..... + +[Q] - What kind of products does Ambrosia create? + +[A] - Ambrosia creates personal productivity tools that make using your Macintosh a more enjoyable experience, as well as anti-productivity tools (games) that are just plain fun. For brief capsule descriptions of our products, please visit our Web site, or see the document Ambrosia Products FAQ.text that comes with our products. + +..... + +[Q] - Does Ambrosia have a product catalog? + +[A] - Not in the traditional sense, no. We did have a nice glossy, color catalog at one time, but we decided that since we distribute our software electronically, it only makes sense that our product catalog is electronic as well. + + The latest versions of all of our software -- and of course descriptions of them as well -- can be found in our support forums on several information services. Please see the [Q] - How can I obtain Ambrosia's products? question for directions to our forums. + +..... + +[Q] - How can I obtain Ambrosia's products? + +[A] - The latest versions of all our products are always available in the Ambrosia Software forums on the following services: + + o America Online: While you are signed on AOL, choose Keyword... from the GO TO menu, type FILESEARCH, and hit the return key. + + o CompuServe: While you are signed on CompuServe, use GO word AMBROSIA to reach the Mac Vendor D area, where Ambrosia Software, maintains a forum. + + o Internet: Visit our web site at http://www.AmbrosiaSW.com/ or our ftp site at ftp://ftp.AmbrosiaSW.com/ + + o Hotline: Visit our Hotline server at hotline://hotline.AmbrosiaSW.com/ + + You can now get all of our products on one CD. This CD contains unregistered versions of all of our games and utilities, plus lots of extra goodies. You can order this CD from our web site at http://www.AmbrosiaSW.com/Ware/ or you can call our toll free number 1-800-231-1816. This number is available from 9AM - 5PM EST, Monday through Friday. + + We've also made arrangements with the PD/Shareware distributor Arizona Mac Users Group so that they carry the full line of up-to-date Ambrosia products. To order an Ambrosia Software, Inc. product and have it sent to you on disk, please call AMUG at 602.553.8966. You can also fax your order, or any questions about ordering, to 602.553.8771. + +..... + +[Q] - Does Ambrosia have a forum on America Online? + +[A] - In early 1997, AOL changed their policy regarding participation in the Company Connection. The Company Connection is now an advertising area rather than a content area. We evaluated AOL's new pricing strategy for Company Connection forums, found the fees to be excessive, and decided our customers would be better served by closing the forum down. + + Although our forum on AOL no longer exists, you can still find our products on the service. from the GO TO menu, type FILESEARCH, and hit the return key. + +..... + +[Q] - Does Ambrosia have products for any platforms other than the Mac? + +[A] - No. We firmly believe in doing what we do best and not spreading ourselves too thin. We're all familiar with the Macintosh -- both in terms of using the machines and programming them -- and don't foresee working on any other platforms in the near future. + +..... + + +-REGISTRATION------------------------------------------------------------------ + +[Q] - How do I pay for one of Ambrosia's products? + +[A] - Each Ambrosia Software product has an integrated registration system that allows you to easily register the product a number of ways: cash/check/money order/credit card via US mail, credit card via fax, or credit card via eMail. Simply launch the Ambrosia Software product you are interested in registering, and click on the Register... button in the splash screen that appears. You'll be painlessly led through the registration system. + + If you have access to the World Wide Web, you can register electronically via our web site. Please have your Visa, Mastercard, Discover, or American Express credit card handy. Simply fire up your Web browser and point it at Ambrosia's Web site: http://www.AmbrosiaSW.com/. Once our home page has loaded in, click on the Online Registration icon, and follow the easy, step-by-step registration instructions from there. + + Ambrosia Software, Inc. also has a toll free order line that is available from 9AM - 5PM Monday through Friday EST. Please have your Visa, Mastercard, Discover, or American Express credit card handy. Please note that this is an order-only line. They will not be able to answer any technical support questions. Inside the US and Canada, please call: 800.231.1816. Outside of the US and Canada, or for technical support, please call 716.325.1910. + + After we have processed your registration, you will receive a license code that you enter to complete the registration process. This code removes the shareware notices and personalizes your copy of the product. + + To enter your license code, simply double-click on the product you registered and follow the instructions that are presented to you. To enter your license code, click on the Enter Code button, and make sure you enter all of the license information exactly as it is shown. That's all there is to it. + +..... + +[Q] - My license code is invalid; what's wrong? + +[A] - The license code you were sent is based on your name as you gave it to us when you registered. Make sure that you are entering your name exactly as it appears on your registration confirmation. If you still have a problem with your license code not working, please get in contact with us and we will take care of the situation for you. + +..... + +[Q] - I have lost my license code, how can I have it replaced? + +[A] - Ambrosia Software keeps records for all of our registered users. In order to get your code in the event it has been misplaced, please send eMail to 'Lostcode@AmbrosiaSW.com' with your name and address so we can look you up in the database and send you your code. + +..... + +[Q] - Why should I register (pay for) an Ambrosia product? + +[A] - We're attempting to offer high quality products at a low price, on a "try before you buy basis." Supporting us by registering our products -- assuming you like them -- is the only way you can ensure that we will continue to produce more high quality software distributed as shareware. + + Beyond that, you will receive a license code that removes the shareware notices and personalizes the Ambrosia product you've purchased with your name, giving you a legal copy on your Macintosh. + +..... + +[Q] - Does Ambrosia offer site licenses? + +[A] - We do offer site licenses and discounts for quantity purchases. This discount is calculated during the registration process. Simply click on the Register... button and select your payment method. Then enter the number of copies you need and press the tab key. Your discount will be calculated and the total displayed. Here is a breakdown of the discounts. + + 10 - 20 copies: 10% discount + 20 - 50 copies: 20% discount + 50 - 100 copies: 30% discount +100 - 200 copies: 40% discount + over 200 copies: 50% discount + + There is also an option to request a purchase order, if your company/institution requires them. We are also willing to work with institutions to come up with a mutually agreeable site license; these figures are not set in stone. + +..... + + +-SUPPORT------------------------------------------------------------------ + +[Q] - How can I get in touch with Ambrosia? + +[A] - Please feel free to get in touch with us using any of the following methods: + + Ambrosia Software, Inc. + PO Box 23140 + Rochester, NY 14692 + + Tel: 716.325.1910 (technical support) + 800.231.1816 (orders only) + + Fax: 716.325.3665 + + America Online: AmbrosiaSW + CompuServe: 74777,1147 + GEnie: AmbrosiaSW + Internet: help@AmbrosiaSW.com (technical support) + register@AmbrosiaSW.com (orders only) + +..... + +[Q] - What is The Ambrosia Times? + +[A] - Ambrosia Software publishes an electronic newsletter entitled The Ambrosia Times every odd month.The Ambrosia Times is an interactive electronic company newsletter. Designed to offer insight into the company itself, the newsletter will also serve as an online crossroads for Ambrosia's shareware users. + + In each issue of The Ambrosia Times, you'll find out about the projects Ambrosia is currently working on, hints and tips for using Ambrosia's products, bug reports, questions & answers, and a splash of entertainment as well. + + Current and back issues of The Ambrosia Times are available in Ambrosia's forums on the various information services. Please see the question, [Q] - How can I obtain Ambrosia's products? for a complete listing of how get to our digital watering holes to obtain The Ambrosia Times. + +..... + +[Q] - How do I subscribe to The Ambrosia Times? + +[A] - If you'd like to have each issue of The Ambrosia Times automatically sent to your mailbox when it is released, you can sign up for the at_list mailing list. Please note that The Ambrosia Times consists of 6 issues per year, which average approximately 500K in size. + + To sign up for the at_list mailing list, please point your web browser at http://www.AmbrosiaSW.com/Lists.html and follow the instructions there to sign up for the at_list mailing list. If you do not have access to the web, please see the [Q] - How do I use Ambrosia's mailing lists? question for details on how you can sign up for the at_list mailing list via eMail. + + You can also read any or all of the issues of The Ambrosia Times by visiting our web site at http://www.AmbrosiaSW.com/ -- we've made every issue available in html format so you can read them via the WWW should you chose to do so. + +..... + +[Q] - How do I use Ambrosia's mailing lists? + +[A] - Mailing lists allow us to send a message that is broadcast to everyone who subscribes to the list, thus making it easy for us to keep you apprised of happenings here at the Ambrosia home office. + + announce_list -- This is a general Ambrosia announcement list -- any time we release a new product or have other Ambrosia-related news to pass along, everyone who subscribes to this list will instantly get the info. + + + at_list -- If you would like each issue of our company newsletter, The Ambrosia Times, delivered to your eMailbox as soon as it is released, this is the mailing list for you. Please note that The Ambrosia Times averages approximately 500K, and is released every odd month (6 issues a year) + + If you're interested in signing up for one of our mailing lists, we've made that simple to do: simply point your Web browser at http://www.AmbrosiaSW.com/Lists.html and follow the instructions there to join one of our mailing lists. + + If you do not have access to the Web, simply send eMail to: + +majordomo@AmbrosiaSW.com + + and include in the body of your message: + +subscribe (list) + + ...where (list) is any of the aforementioned mailing lists (announce_list or at_list) + + You can place anything in the Subject field, but nothing else should be in the message body other than the above. + +..... + + +-SHAREWARE------------------------------------------------------------------ + +[Q] - What is shareware? + +[A] - Shareware is a method of distributing software that allows users to try the full version of a product for a period of time (Ambrosia allows for a 30 day evaluation period) before they are required to pay for it. + + Shareware publishers encourage users to copy their products and give them to their friends; asking that they pay only if they decide to keep the product past the evaluation period. + + Most people realize that it is in their best interest to support a company that is offering quality software at a fraction of the price of commercial software, and thus send in their shareware registration fee. + + Ultimately, you decide whether shareware authors will continue to distribute low cost, high quality software as shareware. + +..... + +[Q] - Why are you distributing your products as shareware? + +[A] - Because we firmly believe in the future of electronic software distribution. By eliminating the middlemen, it becomes feasible to offer quality products at a reduced price, with the added benefit to consumers that they can try the product to see if it suits their needs before they buy it. + + We're reaching a critical mass of people hooked up to some form of electronic information service or another. It's time that there was a viable software distribution paradigm that suits the digital nature of computer software. + +..... + +[Q] - Do you ever plan to "go commercial?" + +[A] - No. We've had numerous offers to "go commercial" with our products, but while Ambrosia is a business, it is a business with a vision. We're committed (or perhaps should be committed, but I digress...) to distributing quality software electronically at a price point substantially less than commercial software. + +..... + +[Q] - Do you actually make any money? + +[A] - "If it's not a personal question..." right? To answer the question, we're still in business. We're not getting rich by any means, but we haven't had to sell off the office mascot (Hector the African Grey Parrot) yet either. + + Whether we succeed at what we're doing or not is entirely in your hands, assuming we take care of our end of the bargain by putting forth a quality product. Don't forget that. + +..... + +[Q] - Is Ambrosia a full-time job? + +[A] - And then some. But seriously, yes, everyone who works for Ambrosia does so full-time, and depends on Ambrosia for their primary income. In actuality we all spend quite a bit more than 8 hours a day wearing our Ambrosia hats, but at least they are stylish and comfortable. + +..... + + +-HISTORY------------------------------------------------------------------ + +[Q] - When was Ambrosia founded? + +[A] - Ambrosia Software, Inc. is a New York State S-Corp, incorporated on August 18th, 1993 (Federal ID#: 16-1443420). The name "Ambrosia" was used as a dba by Andrew Welch for 3 years prior to the incorporation of Ambrosia Software, Inc. + +..... + +[Q] - Who works at Ambrosia? + +[A] - Currently, Ambrosia employs the following people: + + Andrew Welch -- President & Thaumaturgist + Ed Ota -- Operations / Combat + David Dunham -- Technical Support + Bernard Cochern -- Accountant & Office Manager + Jason Whong -- Marketing + John Champlin -- Operations + Matt Slot -- Bitwise Operator + Jennifer Tontarski -- Front Desk + +..... + +[Q] - What development environment do you use at Ambrosia? + +[A] - We had previously been using Symantec's THINK C for development, but we have since switched to MetroWerk's excellent CodeWarrior development environment. + + Ambrosia's programs are written in a mixture of Pascal, C, and a smattering of 68K assembler for special cases. We're investigating moving to C++, but haven't found the benefits to be convincing enough for our particular focus at this time. + +..... + + +-END---------------------------------------------------------------------- \ No newline at end of file diff --git a/Docs/Maelstrom-Announce b/Docs/Maelstrom-Announce new file mode 100644 index 0000000..c427b31 --- /dev/null +++ b/Docs/Maelstrom-Announce @@ -0,0 +1,76 @@ + +Hey folks, Check it out! + + M A E L S T R O M + (Mac version 1.4.3 -- Linux version 2.0.5N) + + NETWORK PLAY!! :) + + You pilot your ship through the dreaded "Maelstrom" asteroid +belt -- suddenly your best friend thrusts towards you and fires, directly +at your cockpit. You raise your shields just in time, and the battle is +joined. The deadliest stretch of space known to mankind has just gotten +deadlier. Everywhere massive asteroids jostle for a chance to crush your +ship, and deadly shinobi fighter patrols persue you across the asteroid belt. +But the deadliest of them all is your sister ship, assigned to you on patrol. +The pilot, trained by your own Navy, battle hardened by months in the +Maelstrom, is equipped with a twin of your own ship and intimate knowledge +of your tactics. The lovely Stratocaster R&R facility never sounded so good, +but as you fire full thrusters to dodge the latest barrage you begin to think +you'll never get home... + + This is a port of the high resolution "asteriods" style arcade +game written by Andrew Welch for the Macintosh. It is now freely supported +with additional network play on the Linux platform, courtesy of Sam Lantinga +(slouken@devolution.com). + + +Available NOW! +ftp://ftp.devolution.com/pub/maelstrom/ +ftp://sunsite.unc.edu/pub/Linux/Incoming/ + +The files are: + 1471kB Maelstrom-1.4.3-L2.0.5-src.tar.gz (Source) + 1706kB Maelstrom-Sounds-L2.0.0.tgz (Extra Sounds) + + +Version 2.0.5: + * Added PIXEL_DOUBLING back in the X11 display driver + * The DISPLAY environment variable overrides Linux console + * Steel asteroids really aren't supposed to last forever. :) + * Saucer shots don't kill when saucer is destroyed (netlogic) + * Optimized framebuffer blitting code + * Fixed completely white screen on big-endian systems (Sun/SGI) + * Fixed bug in right edge clipping + * GIF format screendumps from high bit-depths okay (slow!) + * Linux sound defaults to 8 bit again -- sounds better. + + * Added 32 bit TrueColor X11 display support + * Optimized the compiled sprite engine + * Speeded up truecolor video, slightly slowed 256 color video + * Stars!! Lots and lots of Stars!!! + + * Added experimental DMA audio support for Linux - nice. :) + * New life accounting during bonus screen works now. + * Kjetil Torgrim Homme added compiler-specific cleanup. + * Multiplayer scores are now updated properly. + * Fixed asteroid counting problem after an explosion. + * Set default fading to pixellated, added -realfade option. + +Note: Networking is not available in the original Mac version. + + +Linux Maelstrom has an official web page! +The Linux Maelstrom URL is: http://www.devolution.com/~slouken/Maelstrom/ + +New on the web site: + Star Wars Sprites/Sounds !! + Star Trek Sprites/Sounds !! +These are the Macintosh originals, packaged for your pleasure. :-) + +See ya there! + + -Sam Lantinga (slouken@devolution.com) +-- +http://www.devolution.com/~slouken/ +-- diff --git a/Docs/Maelstrom.FAQ b/Docs/Maelstrom.FAQ new file mode 100644 index 0000000..49b41e5 --- /dev/null +++ b/Docs/Maelstrom.FAQ @@ -0,0 +1,602 @@ + +-MAELSTROM FAQ------------------------------------------------------------ + +[display this document using the typeface Monaco 9 for best results] + + +-PURPOSE------------------------------------------------------------------ + + FAQ is an acronym for Frequently Asked Questions. This FAQ is an +attempt to provide a comprehensive source of information about the game +Maelstrom, and was created in response to questions that are frequently +raised by our customers. We hope you find it useful. + + If there are any questions you have about Maelstrom that are not +answered in this FAQ, please get in touch with us so we can include them in +future revisions. + + +-CREDITS------------------------------------------------------------------ + + Author: Andrew Welch + Linux Port: Sam Lantinga +Contributors: "Cajun" David Richard, John Haley, Ed "DAMAGE" Ota, + Gayle Haarr + Thanks to: David Freitas + +Copyright (C) 1995 by Ambrosia Software, Inc. + + +-FAQ HISTORY-------------------------------------------------------------- + + Version: 2.0.4L + Created: 5/24/95 +Last Revised: 12/16/96 + + +-DISCLAIMER--------------------------------------------------------------- + + This document is provided as is, without any express or implied +warranties. While every effort has been taken to ensure the accuracy of the +information contained in this document, the author assumes no responsibility +for errors or omissions, or for damages resulting from the use of the +information contained herein. + + +-CONTENTS----------------------------------------------------------------- + +This FAQ answers the following questions: + +(* Indicates an updated or new question since the last version of this FAQ) + +GENERAL + - What is Maelstrom? +* - What computer do I need in order to play Maelstrom? + - Who makes Maelstrom and how can I get in touch with them? +* - Where can I obtain Maelstrom? + - What is the latest version of Maelstrom? + - How much does Maelstrom cost, and how do I pay for it? + - Why should I register (pay for) Maelstrom? + - My license code is invalid; what's wrong? +* - Will Maelstrom ever be ported to DOS? + - Will there be future versions of Maelstrom? + +GAME PLAY + - What are the point values for the various baddies in Maelstrom? + - What does the "luck" yummy do? + - How can I pause or abort a game? + - What is the optimal control configuration for playing Maelstrom? + - When do comets/multipliers/supply canisters appear? + - Is there such a thing as an "empty" supply canister? + - Is there any kind of an end to the game? + - How can I cheat while playing Maelstrom? + - Do you have any hints or tips for playing Maelstrom? + +COMPATIBILITY (Linux) + - What version of kernel and X11 do I need? + - Do I need a mouse? + - Do I need a sound card? + - Where is the console version of Maelstrom? +* - Will Maelstrom run in more than 256 colors? +* - Will Linux Maelstrom use the alternate sound patches out there? + - Will Maelstrom be ported to other UNIX operating systems? + - How do I get rid of the "Can't open soundcard" warnings? + - I have problems with stuck keys in the Linux console. + - Can I play networked with other UNIX systems? + - Can I play networked with other Macintosh systems? + +HISTORY + - What does "Maelstrom" mean? + - What language is Maelstrom written in? + - Who did the artwork for Maelstrom? + - When was Maelstrom first released? + - How long did it take to create Maelstrom? + + +-GENERAL------------------------------------------------------------------ + +[Q] - What is Maelstrom? + +[A] - Maelstrom is a fast action arcade-style game for the Macintosh that +uses rendered 3D graphics, high speed animation, and four channel digitized +sound effects. The end result is a nerve-wracking arcade game that is sure +to leave blisters on your fingers. + + Maelstrom has been given a 4.27 out of 5.0 in Inside Mac Games's player +satisfaction poll. This puts Ambrosia's feisty $15 shareware program among +the top ten ranked games, with expensive retail titles such as Hellcats Over +The Pacific, Myst, Sim City 2000, and F/A-18 Hornet. Maelstrom also received +a four star rating from Macworld, won the Shareware Industry Award for Best +Mac Program, MacUser's Shareware/Entertainment Software award, and MacUser +UK's Best Entertainment Software Award. + +..... + +[Q] - What computer do I need in order to play Maelstrom? + +[A] - Maelstrom works on any Macintosh with a 256 color display and at least +2.3mb of free memory. Unlike many arcade-style games, Maelstrom DOES work on +12" monitors. + - Maelstrom also runs on Linux machines, running in X11 or at the +console. If your machine runs X11 smoothly, you should have no problems +playing Maelstrom. If you run the console version, make sure that your +video card is one supported by SVGAlib; e.g. Cirrus Logic 5426. + - Maelstrom also runs on Windows 95, using DirectX technology. + +..... + +[Q] - Who makes Maelstrom and how can I get in touch with them? + +[A] - Maelstrom is published as shareware by Ambrosia Software, Inc., a +Macintosh-only, shareware-only company. The game itself was written by +Andrew Welch, the founder of Ambrosia. To get in touch with Ambrosia, you +can use any of the following methods: + +US Mail: + Ambrosia Software, Inc. + PO Box 23140 + Rochester, NY 14692 + +Voice: + 716.325.1910 (technical support) + 800.231.1816 (orders only) + +Fax: + 716.325.3665 + +eMail: + America Online: AmbrosiaSW + Compuserve: 74777,1147 + eWorld: AmbrosiaSW + GEnie: AmbrosiaSW + Internet: AmbrosiaSW@AOL.com + + - The Linux port was written as freeware, and authored with permission +by Sam Lantinga. The Linux version is not supported by Ambrosia software. +If you have questions about the Linux version of Maelstrom, or just want to +say hello, Sam can be reached at: + +eMail: + Internet: slouken@devolution.com + +..... + +[Q] - Where can I obtain Maelstrom? + +[A] - The latest version of Maelstrom is always available in the Ambrosia +Software, Inc. forums on the following services: + + o America Online: While you are signed on AOL, choose Keyword... + from the GO TO menu, type AMBROSIA and hit the return key. + + o eWorld: While you are signed on eWorld, choose Go to Shortcut... + from the PLACES menu, type AMBROSIA and hit the return key. + + o CompuServe: While you are signed on CompuServe, use GO word + AMBROSIA to reach the Mac Vender D area, where Ambrosia Software, + Inc. maintains a forum. + + o Internet: Maelstrom can be found at the following sites: + mac.archive.umich.edu: /mac/space/maelstrom1.41.sea.hqx + sumex-aim.stanford.edu: /info-mac/game/arc/maelstrom-141.hqx + + And last but not least, you can obtain Maelstrom from us for $5.00 to +cover shipping & handling. You place your order by sending us a check via US +mail, faxing us your credit card number & expiration date, sending us your +credit card number & expiration date via electronic mail, or calling our 800 +number order line: 800.231.1816. + + If you'd like a full color brochure featuring each of Ambrosia's +products sent to you *free of charge*, simply drop us an eMail or call us at +716.325.1910 and we'll get it right off to you. Make sure you include your +full name, address, and country when requesting a brochure. + + - The Linux version of Maelstrom is available on the internet via +ftp from the following sites: + ftp://ftp.devolution.com/pub/maelstrom/ + +..... + +[Q] - What is the latest version of Maelstrom? + +[A] - The current version of Maelstrom is 1.4.1, dated 8/10/94. + - The current version of Linux Maelstrom is 2.0.4, dated 12/16/96. + +..... + +[Q] - How much does Maelstrom cost, and how do I pay for it? + +[A] - Maelstrom costs $15 US funds. Maelstrom has an integrated registration +system that allows you to easily register it a number of ways: +cash/check/money order/credit card via US mail, credit card via fax, or +credit card via eMail. Simply launch Maelstrom, and click on the Register... +button in the splash screen that appears. You'll be painlessly lead through +the registration system. + + Ambrosia Software, Inc. also has a toll free order line. If you wish to +purchase Maelstrom, you can use your Visa or Mastercard and call +800.231.1816. If you are calling outside the US/Canada region, or need +technical assistance, please call 716.325.1910. + + We will process your order right over the phone, and give you a license +code immediately. We will also take orders for sending disks with the +Ambrosia Software products you are interested in, so that you can try them +out and decide if you would like to purchase them (see below for more +information). + + After we have processed your registration, you will receive a license +code that you enter to complete the registration process. This code removes +the shareware notices and personalizes your copy of the product. + + To enter your license code, simply double-click on the Ambrosia +Software product for which you have purchased a license. A shareware notice +will come up on the screen, with a few buttons along the bottom. To enter +your license code, click on the Enter Code... button, and make sure you enter +all of the license information exactly as it is shown. That's all there is +to it. + + - The Linux version of Maelstrom is free, but if you want to send +money or donate equipment, send e-mail to Sam Lantinga (slouken@devolution.com) +If you have a Macintosh, I also recommend that you get the Macintosh version +and register it with Ambrosia Software. They did an excellent job. :-) + +..... + +[Q] - Why should I register (pay for) Maelstrom? + +[A] - We're attempting to offer high quality products at a low price, on a +"try before you buy basis." Supporting us by registering Maelstrom -- +assuming you like the game -- is the only way you can ensure that we will +continue to produce more high quality software distributed as shareware. + + Beyond that, you will receive a license code that removes the shareware +notices and personalizes Maelstrom with your name, giving you a legal copy of +Maelstrom on your Macintosh. + +..... + +[Q] - My license code is invalid; what's wrong? + +[A] - The license code you were sent is based on your name as you gave it to +us when you registered. Make sure that you are entering your name EXACTLY as +it appears on your registration confirmation. If you still have a problem +with your license code not working, please get in contact with us and we will +take care of the situation for you. + +..... + +[Q] - Will Maelstrom ever be ported to DOS? + +[A] - Despite a number of requests, we have no plans to port Maelstrom over +to DOS/Windows. We lack the know-how, time, and inclination to undertake +such a project, so it doesn't look like it is going to happen. Sure is nice +for the shoe to be on the other foot for once, no? :) + + - Linux, however, is a different story. *grin* + I've also done an unofficial Win95 port so I could learn how to program + DirectX/Win95 games, but I can't release it right now for copyright + reasons. + -- Sam Lantinga + +..... + +[Q] - Will there be future versions of Maelstrom? + +[A] - We consider Maelstrom a "done" work. We will of course continue to +maintain the game by fixing bugs and adding ancillary features, but short of +a sequel, we will not be making changes to the basic game itself. + + Note: we are not announcing that there will be a sequel to Maelstrom, +just that it is a possibility. + +..... + + +-GAME PLAY---------------------------------------------------------------- + +[Q] - What are the point values for the various baddies in Maelstrom? + +[A] - Maelstrom Scores Breakdown: + + Small Asteroid 300 points + Medium Asteroid 100 points + Big Asteroid 50 points + Vortex 500 points + Shenobi Autonominous Mine 700 points + Star going Nova 1000 points + Shooting a Steel Asteroid 100 points + Destroying a Steel Asteroid 5000 points + Large Enemy 1000 points + Small Shenobi Fighter 2000 points + + [yes, the Steel Asteroids can be destroyed if you are persistent enough] + +..... + +[Q] - What does the "luck" yummy do? + +[A] - Luck gives you a 1 in 3 chance of saving your ship when you should have +died (you'll hear "Sweet!" if that happens) and a 1 in 3 chance of keeping +your special weapons when you do die. Remember, lady luck is a fickle +mistress. + +..... + +[Q] - How can I pause or abort a game of Maelstrom? + +[A] - The Caps Lock key pauses Maelstrom while you are in the middle of a +game, allowing you to take a breather or switch out to another application if +you desire. To resume a game after you've paused it, simply depress the Caps +Lock key. + - In the Linux version, the PC keyboard 'Pause' key performs the same +function as the Caps Lock key in the Macintosh version. This can also be +configured in the Configure control panel of the Linux version. + + The ESC (escape) key aborts the game you're playing. This is not a +"quit" key, but an "end the game because the pizza's here" key. It is only +operational when you are playing the game. + +..... + +[Q] - What is the optimal control configuration for playing Maelstrom? + +[A] - You should usually keep the Maelstrom controls set to the "factory +default." Some new Apple keyboards don't allow for more than two keys to be +down simultaneously, which can inhibit good game play. However the Shift, +Option, Control, and Command keys don't count as real keys, so if you have a +few of Maelstrom's controls set to these keys (as in the "factory default" +controls), you'll have much better control over your ship. + +..... + +[Q] - When do comets/multipliers/supply canisters appear? + +[A] - When a new level is started, Maelstrom determines ahead of time if a +comet, multiplier, or supply canister will appear. These items will appear +within 30 seconds after starting a wave, or they won't appear at all. + +..... + +[Q] - Is there such a thing as an "empty" supply canister? + +[A] - There are no "dud" supply canisters. You may however get a present +that you already have, or you may get a canister that gives you more shield +power. + +..... + +[Q] - Is there any kind of an end to the game? + +[A] - No. Maelstrom just continues to get harder and harder as you proceed +through the game. There are as many waves in Maelstrom as you can handle. + +..... + +[Q] - How can I cheat while playing Maelstrom? + +[A] - To access the "cheat mode," hit the 'L' key at the main screen. A +dialog box will appear that allows you to choose the starting wave, number of +lives, and turbofunk option. You won't be able to get a high score if you +use this "cheat mode," but it is a good way to practice. + +..... + +[Q] - Do you have any hints or tips for playing Maelstrom? + +[A] - I'm glad you asked, here's the official Ed "DAMAGE" Ota guide to total +Maelstrom destruction: + + o Learn how to fly the ship so you do not become shield dependent. + + o Stay away from the borders, visibility is limited and you could + get a nasty surprise. + + o Concentrate on one asteroid at a time, this will limit the amount + of debris floating around. + + o Better to shoot at a distance, large asteroids shatter into small + ones that could take you out. + + o Spread your shots out when shooting a large asteroid. This will + take out some of the smaller ones. + + o Configure the ship control keys the way you feel most comfortable. + + o Shoot vortex's to get rid of them. + + o Shoot floating autonominous mines (6 hits Approx.), if you run + away it will only track you down. + + o Keep moving when a Shenobi ship appears. Staying put makes you + easy prey. + + o Move quickly to get canisters and bonus points. They do not stick + around for long. Canisters make about three passes. + + o It is better to stop or turn around a steel asteroid with shots + then it is to throw on the shields and get bounced across the + screen. + + o A fast moving steel asteroid is like a derailed freight train, + stay out of their way and try to slow them down with shots from + the opposite direction. + + o Multiple shots will destroy a steel asteroid, but between the + first shot and last shot is a very pissed off asteroid. + + o After eliminating the last asteroid you have a small amount of + grace time. Bonus points will continue to add up, but if you lose + a ship it is not counted against you. Move quickly and + aggressively to attack Shenobi ships or pick up bonus items + during this time. + + o Use a sweeping motion to get maximum effect from machine guns. + + o Spare the last asteroid for a while to rack up bonus points and + benefits. Beware of the Shenobi ships though, don't get too + greedy. + + o When using the spray gun to go after large asteroids, close in for + the kill. This will allow you to eliminate all of the little + asteroids after the first hit. + + o A circular motion will allow you to wipe out almost everything + when using the long range shots. But there may be a few stubborn + rocks you have to concentrate on. + + o The smaller Shenobi ships are smaller, "smarter" and more + aggressive. It may be wise to avoid these mighty midgets. + + o As in life, always try to stay a step ahead of the game. Try to + predict your next move, if you can do this, you will do well in + Maelstrom. + +..... + + +-COMPATIBILITY-(LINUX)---------------------------------------------------- + +[Q] - What version of kernel and X11 do I need? + +[A] - Linux Maelstrom was developed using the 1.2 series kernel, SVGAlib +version 1.2.6 and XFree86 version 3.1. It should run with any stable series +Linux kernel that includes the VoxWare sound driver. + +..... + +[Q] - Do I need a mouse? + +[A] - You don't have a mouse? Well, the only thing you _need_ a mouse +for is the keyboard configuration control panel. If you never use the +"configure controls" control panel, you'll be okay. + +..... + +[Q] - Do I need a sound card? + +[A] - You don't need a sound card to play Maelstrom for Linux, however +it is highly recommended that you have one. The sounds of Maelstrom +are almost necessary for the full appreciation of the game. + +..... + +[Q] - Where is the console version of Maelstrom? + +[A] - The same Linux binary will run in both X Windows and the Linux +console. If you want to run the full-screen console version of Maelstrom, +just run 'Maelstrom' from a console window. Beware, if your video card +is not supported by SVGAlib, your screen might freeze, and you'll have +to reboot with CTRL-ALT-DEL or the reset button (depending on your system +configuration.) + +..... + +[Q] - Will Maelstrom run in more than 256 colors? + +[A] - Yes, Maelstrom will run on displays supporting up to millions +of colors. + +..... + +[Q] - Will Linux Maelstrom use the alternate sound patches out there? + +[A] - Yes, it will play most patches that work with the Macintosh version. +The trick is that you must get the _resource fork_ of the sound patch and +name it "Maelstrom Sounds" in the Maelstrom library directory (by default +/usr/local/lib/Maelstrom) + Maelstrom fully understands the resource forks produced by the +Macintosh emulator "Executor" available at www.ardi.com. You can use +Executor to extract Macintosh archives and use the resulting resource +forks -- the files beginning with "%". + +..... + +[Q] - Will Maelstrom be ported to other UNIX operating systems? + +[A] - Yes!! + * The port to Solaris 2.4 is complete. + * The port to HPUX 9.03 is complete, except for the sound, which + is not synchronous. + * The port to the SGI (IRIX 5.3) is complete. + * The port to ULTRIX 4.2 is complete except for sound. + * The port to OSF 3.2A is on hold. +(All ports are the work of Sam Lantinga, except for the SGI sound server, + which was done in collaboration with Tom Mander and Alain Schmit) + +..... + +[Q] - How do I get rid of the "Can't open soundcard" warnings? + +[A] - Turn the sound volume off by typing "0" on the main menu. + +..... + +[Q] - I have problems with stuck keys in the Linux console. + +[A] - Try running Maelstrom with the '-nofade' option. The problem +seems to be missed keyboard interrupts during the "fading" operation. + +..... + +[Q] - Can I play networked with other UNIX systems? + +[A] - Yes!! Currently besides Linux, only the Solaris, SGI, and +DEC versions of Maelstrom have been tested with networking, but they +all should be able to play networked with each other. +In my opinion some of the best net play is SGI v.s. SGI. :-) + +..... + +[Q] - Can I play networked with other Macintosh systems? + +[A] - Unfortunately, no. Networked play is a UNIX-specific feature, +and is not available for the original Macintosh Maelstrom. + + +-HISTORY------------------------------------------------------------------ + +[Q] - What does "Maelstrom" mean? + +[A] - Maelstrom - 1. any large or violent whirlpool 2. a violently confused +or dangerously agitated state of mind, emotion, affairs, etc. + +..... + +[Q] - What language is Maelstrom written in? + +[A] - Maelstrom was written in THINK C 5.04. The main portion of the game is +in approximately 9,000 lines of assembler. The non-critical and supporting +portions of the game are in approximately 18,000 lines of plain old C. + Maelstrom uses custom blitting routines for optimal animation performance. + - The Linux version of Maelstrom was written completely in C++. + +..... + +[Q] - Who did the artwork for Maelstrom? + +[A] - Ian Gilman did the animation and sprite artwork. Mark W. Lewis did the +title screen artwork. Both are quite talented, in addition to being very +nice guys. + +..... + +[Q] - When was Maelstrom first released? + +[A] - Maelstrom was first released in November of 1992. + - The Linux version of Maelstrom was first released in July of 1995. + +..... + +[Q] - How long did it take to create Maelstrom? + +[A] - The initial (1.0.0) version of Maelstrom took approximately 4 months of +sleepless days and nights to create. Subsequent versions (bug fixes, +enhancements, etc.) have been done over the course of 2 years. + - The initial port of Maelstrom to Linux took about 3 months of +breaking dawns and bowls of Granola. :-) + +..... + + +-END---------------------------------------------------------------------- + diff --git a/Docs/MaelstromGPL_press_release b/Docs/MaelstromGPL_press_release new file mode 100644 index 0000000..dfdaaff --- /dev/null +++ b/Docs/MaelstromGPL_press_release @@ -0,0 +1,52 @@ +FOR IMMEDIATE RELEASE + +Ambrosia Goes Open Source: Maelstrom 3.0 released under GNU GPL + +Contact: + +Jason Whong +Ambrosia Software, Inc. +PO Box 23140 +Rochester, NY 14692 + +Tel: 716.325.1910 +Fax: 716.325.3665 + +Rochester, NY -- December 7, 1999 --Ambrosia Software, Inc. embraced the burgeoning open source movement with an early Christmas present when it released the source code for its first arcade smash hit, Maelstrom, under the GNU General Public License. For the first time, users can peek at the programming which makes an Ambrosia game tick. + +Maelstrom, the classic rock-smashing game that launched Ambrosia to fame, was called 1993's Best Shareware Game by MacUser and ZiffNet/Mac. It received 4 stars in MacWorld, and the ShareWare Industry Awards Association pick for Best New Macintosh Product. It also took first place in the 1994 Mac Home Journal Reader's Choice Awards, and MacUser UK's Best Entertainment Software Award. + +In the heart of the Maelstrom, you must pilot your United Planet Border Patrol recon craft. It's a trusty ship that has earned medals for few and deaths for most others. If the storm of asteroids doesn't faze you, enemy Shenobi ships and autonominous mines are waiting to blast you into space dust. Additionally, there are other natural space disasters such as vortexes and supernovas that have a habit of ruining even the best space pilot's day. + +Maelstrom, which was originally written by Ambrosia's el Presidente Andrew Welch, was ported to Linux by Sam Lantinga in 1995. The 17,000 lines of C++ code can be freely edited, modified, and compiled on any platform, from Red Hat Linux to Windows NT. + +Version 3.0 of the game contains additions and improvements by Sam, such as networked multiplayer deathmatches, screenshot capability, gamma correction, and a worldwide high score reporting mechanism. Of course, once the code is in the hands of developers everywhere, there's no limit to the number of modifications possible in the future. The software also contains no registration or payment mechanisms, making it a totally free version of Maelstrom. + +"I'm hoping to see a version for Palm OS" said Jason Whong, Ambrosia Marketing Director, upon hearing of the new development. "Heck, I'd like to see Maelstrom ship in the ROMs of new hardware, like cell phones, cars, and wearable computers. After all, it's free." + +The General Public License, or GPL, was created by GNU in 1989 "to guarantee freedom to share and change free software". By encouraging open development standards, developers share code for the betterment of all free software. While the GPL was used mainly for application, utility, and operating system development, the release of Maelstrom's source code should remedy the relative dearth of action software code available to the free software community. + +"I am very happy to be able to place Maelstrom 3.0 under the GPL," said Sam, who is now lead programmer at Loki Entertainment Software, a prominent Linux software developer. "Ambrosia Software gave me the opportunity to start my successful career in Linux game programming, and hopefully this source will inspire others to do the same." Sam is also the developer of the Simple DirectMedia Layer, or SDL, a cross-platform graphics and sound engine which powers version 3.0 of Maelstrom. + +"I hope this code generates more programming talent," said David Dunham, Technical Support Manager at Ambrosia. "If someone can take a lesson or two from this code and become a better game programmer, then we all win as a result." + +The GPL version of Maelstrom is available for download at . The Simple DirectMedia Layer is available at . Info on the GNU General Public License can be found at . + +Ambrosia Software, Inc. - publisher of award winning programs for the Macintosh - distributes a full line of utility, productivity, and anti-productivity (game) software through the Internet, America Online, and CompuServe as shareware. Unregistered versions of Ambrosia's products on CD can be obtained by calling Ambrosia's order center at 800.231.1816. + +Ambrosia Software, Inc. maintains support forums on several major electronic information services. In these forums, you can always find the latest versions of our software products, ask technical support questions, and get our free electronic newsletter, The Ambrosia Times. If you subscribe to any of the following information services, please feel free to drop by and visit us: + + o America Online: While you are signed on AOL, choose Keyword... + from the GO TO menu, type FILESEARCH, and hit the return key. + + o CompuServe: While you are signed on CompuServe, use GO word + AMBROSIA to reach the Mac Vendor D area, where Ambrosia Software, + maintains a forum. + + o Internet: Visit our web site at http://www.AmbrosiaSW.com/ or our + ftp site at ftp://ftp.AmbrosiaSW.com/ + + o Hotline: Visit our hotline server at + hotline://hotline.AmbrosiaSW.com/ + +-30- diff --git a/Docs/Makefile b/Docs/Makefile new file mode 100644 index 0000000..d1458d5 --- /dev/null +++ b/Docs/Makefile @@ -0,0 +1,9 @@ +# This is the minimum Makefile necessary to include this directory +# in the package distribution build process + +# Succeed at the default target +all: + +# Copy this directory to the distribution build directory +distdir: + cp -rp . $(distdir) diff --git a/Docs/Makefile.in b/Docs/Makefile.in new file mode 100644 index 0000000..d1458d5 --- /dev/null +++ b/Docs/Makefile.in @@ -0,0 +1,9 @@ +# This is the minimum Makefile necessary to include this directory +# in the package distribution build process + +# Succeed at the default target +all: + +# Copy this directory to the distribution build directory +distdir: + cp -rp . $(distdir) diff --git a/Docs/Networking.Paper b/Docs/Networking.Paper new file mode 100644 index 0000000..794a3ef --- /dev/null +++ b/Docs/Networking.Paper @@ -0,0 +1,202 @@ + + Networking Maelstrom + + Sam Lantinga +June 2, 1996 + + +Design Goals: + + I originally envisioned being able to play Maelstrom +one-on-one against other people over Linux SLIP lines. We could log +into a central server and play one another, similar to the way Quake (tm) +is planned to be. + +Design Process: + + The first idea was to create one central server that did +all calculation of player movement, collision detection, etc, and then +broadcast updates, every frame time, to each player. The disadvantages +of this approach are that it places a great computation load on a single +machine, and requires high bandwidth to transmit the entire game state +thirty times per second. I started coding the client to duplicate some +of the state calculation of the game and reduce the bandwidth requirement, +but it was a great deal of work, and subtle differences in the client +and server code could result in synchronization bugs. + + The next design paradigm was to have N independent games +running, and have each independent game control a player. To reduce +bandwidth, each game would run its game computations independently, and +the only traffic would be synchronization packets every frame, and keystrokes +to update player actions. Actually, the only traffic really needed is +the keystroke information, but in a shoot'em up game such as Maelstrom, +the frame on which keystrokes are delivered is critical. If a game runs +really fast on one machine, and a keystroke arrives from a slower player, +then a player can die on one machine and still be alive on another machine. +This fragments game consistency and must be avoided. The way to avoid this +is to have each game instance (player) checkpoint at every frame, and +deliver keystrokes destined for that frame. + + Creating multiple players had the unexpected side effect +of requiring the game logic to be rewritten using C++ objects. The +original game logic assumed that all game objects were generic +structures fit into an array, and the object at array position 0 was +the player. With multiple players there had to be a way to allow +them to shoot at eachother, and for objects to interact in general +ways, and in then sometimes in particular ways depending on the type +of objects interacting. This lent itself well to C++ object inheritance +design, and took about three days of coding to get mostly working. + + Synchronization between running games was assured by the +use of the original random number generator used in Macintosh Maelstrom, +and the translation of time-based events to frame-based events. +The original random number generator uses a very specific algorithm to +take the random seed, translate it into a pseudo-random number and then +update the random seed. Event translation works because frames are +supposed to occur exactly 30 times per second and the original event timings +were always some multiple of frame times apart. The only completely +random event in the game is the completion of sound events, and the only +time they are ever noticed is during thrust, and no calculation affecting +the game is done at that time. Combined, this allows multiple games, +given the same seed and input, to run exactly the same over multiple +instances. + + The only problem now was how to guarantee the delivery of the same +input to each instance of the game. TCP was my first choice, as it has the +advantage of reliable delivery and would guarantee that my frame packets +would arrive in the correct order. However, TCP has the disadvantages of +high overhead and buffered data. In the course of ECS152B, I learned about +the slow start algorithm, congestion avoidance, and other features of TCP +that makes it very suited for reliable stream data, but a poor choice for +timely high speed packet transmission. + + UDP is the perfect choice of the IP protocol suite for high-speed, +low overhead packet based transmissions. It has zero connection establishment +overhead, packets are sent as soon as they are queued, and if packets are lost, +with careful packet management and caching, your application can recover +almost immediately. In my final design, I use a modified stop-wait protocol +that uses packet caching to do very little waiting. + + To synchronize the game we need to make sure all keystrokes arrive +on the interval in which they were pressed. The original game polls for +keystrokes on every frame, and testing shows that while for most purposes +polling every other frame is acceptable, but for pitched battles, the 30'th +of a second resolution is critical. This means that we need synchronization +every frame. Keystroke information can ride piggy-back on synchronization +packets, so the only overhead that is important is that of the sync packets +themselves. If any player gets more than one partial frame ahead of another, +we may lose synchronization, so some sort of stop and wait protocol is +suggested. + + Using stop and wait protocol, the total overhead of synchronization +packets, assuming a two-player game, is: + + 30*(sizeof(IP header)+sizeof(UDP header)+sizeof(packet)) + 30*(20+20+1) = 1230 bytes per player + +If we ack each frame packet, we effectively double the bandwidth to +nearly 2500 bytes per second for each player. This is far beyond the +current modem IP bandwidth for 14.4Kbps modems. + +If we somehow eliminate ack packets, and compress the IP header, we +can reach a low bandwidth requirement of 30*(4+20+1) 750 bytes per +second for each player. At an average 200 ms round trip time, our game +could reach a maximum of 10-15 frames per second -- much too low for +high speed interactive games. Thus, the solution seems to be that +high speed modem play is infeasible over IP. Note that without the +overhead of UDP/IP communications, i.e. direct modem or null-modem +connection, our bandwidth requirement goes down to 30*(1+1) bytes +per second, or 60 bytes per second for each player. You could play +this over a 2400 baud modem! + + In practice, it seems that an ethernet-speed network is +required to run networked Maelstrom over UDP/IP. So, the challenge +becomes reducing the overhead of the network to levels that allow the +other parts of the game to proceed at thirty frames per second. + + +The Algorithm: + + Already mentioned was a modified stop and wait with little +waiting. Here's how it works. Each frame, every player sends its +current frame packet to each other player and waits for frame information +from every other player. Since this happens simultaneously, each player +sends and receives the current frame packet almost instantaneously, and +they continue processing the game. + + * A player will never advance the frame if it doesn't receive + frame updates from all other players. + * If it doesn't receive a frame packet within 1 second it will + rebroadcast the current frame packet. + * If a player receives a frame packet for the last frame, it will + send its previous frame packet which it has cached. + * Packets from frames farther back than the previous frame are + ignored. + +In this situation, if a packet is lost, then the player waiting for it +will time out, the other players will be one frame ahead, the player +waiting for the packet will resend it's packet, and the player who lost +the packet will resend. The waiting player will continue, and all will +be well. It is guaranteed that no player will be more than one frame +ahead in this case. + +Unfortunately there is a real possibility of a lock-step problem here: + + Player 1 (frame 10) Player 2 (frame 10) + 10 --> <-- 10 + dropped packet + Player 1 (frame 10) Player 2 (frame 11) + wait for 10 <-- 11 + get 11, timeout + Player 1 (frame 10) Player 2 (frame 11) + 10 --> <-- 10 (cached) +Here player 2 has already sent the packet for 11 + Player 1 (frame 11) Player 2 (frame 11) + 11 --> wait for 11 + Player 1 (frame 11) Player 2 (frame 12) + wait for 11 <-- 12 + get 12, timeout + +This goes on, repeating, as the two players advance frames in lock-step, +one frame per timeout. + +The solution is for Player 1 to immediately resend its current frame packet +if it receives a packet for the next frame. At that point it knows that +the other player has already advanced to the next frame and has already +sent the packet for the current frame. If it caches the packet for the +next frame, the next time around, it just sends the packet for the next +frame, and advances immediately. The two players are now back in sync. + +This assumes that few packets will be dropped or otherwise lost. +This seems to be a valid assumption. It was tested over a 32.6K link to +Australia and though the game was unplayably slow because of round trip +times, dropped, lost, and timed out packets were few and far between. + +The new senario: + + Player 1 (frame 10) Player 2 (frame 10) + 10 --> <-- 10 + dropped packet + Player 1 (frame 10) Player 2 (frame 11) + get 11, cache 11, 10 --> <-- 11 + Player 1 (frame 10) Player 2 (frame 11) + get 10 <-- 10 (cached) + Player 1 (frame 11) Player 2 (frame 11) + 11 --> get 11 + Player 1 (frame 12) Player 2 (frame 12) + 12 --> <-- 12 + +The players are now synchronized again. + + This run-wait scheme works very well when you have a set +of hosts that are broadcasting synchronization packets to each other at +high rates. It prevents the stop-wait syndrome, and reduces the necessity +of timeouts, the main disadvantages of using UDP for small packet based +communications. It has been shown, through extensive testing, to be highly +effective for frame-based network games such as Maelstrom. + + IT WORKS!! + + Anybody wanna play? :-) + +(slouken@devolution.com) diff --git a/Docs/Porting.Paper b/Docs/Porting.Paper new file mode 100644 index 0000000..5419dc9 --- /dev/null +++ b/Docs/Porting.Paper @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + ON PORTING MAELSTROM TO LINUX + + + by + Sam Lantinga + + + + + +Graphics: + + X11 was originally designed as a well defined client-server +protocol, device independent, network capable windowing system. It was +fully capable of supporting the applications of the time: menus, text +editors, simple bitmap graphics, etc. However, many applications today +require a faster, more responsive graphics interface. Any real-time video +application requires much faster video access and updates than the X11 +system was originally designed to provide. Examples of these types of +applications include teleconferencing systems, MPEG video players, real-time +modeling object modeling, etc. The pioneers in real-time audio/visual +techniques have been (and probably will be) fast-action video games. Arcade +games stress hardware more than almost any other application, requiring +real-time video, real-time audio, and good response time to user input. +More advanced games run networked as well, requiring fast, well designed +transmission control protocol and routing of network packets (not discussed +in this paper.) + + These real-time services are easy to provide in a simple, +single-user system such as the DOS PC, making it one of the most popular +platforms for video games. It is slightly more complex to provide these in +a well designed single-user windowing system such as the Macintosh. +However, even there, it is possible to give full access to the hardware to +any applications that require it. This performance is much harder to +provide in a multi-user time-sharing environment such as UNIX X11. + + + The objective of this project was to show that fast-action games, +and hence, other high-speed interactive applications, can be written for the +X11 environment. The target application for this project was the Macintosh +shareware game "Maelstrom". From the press release: + + "Maelstrom 1.4 is a marriage of the venerable Asteroids concept + with new digitized sound effects, 3D graphics and high resolution + 256 color animation. 'With fantastic art and graphics by Ian + Gilman and Mark Lewis, Maelstrom does for the tired old Asteroids- + style games what the Mazda Miata did for sporty roadsters...'" + +As such, Maelstrom seemed the perfect target for the X11 environment. +The operating system chosen for the port was Linux version 1.2.9, a free +UNIX-like operating system for the PC. The development hardware was a +DX2/66 VLB PC with a Cirrus Logic 5426 video board and a Sound-Blaster Pro +8-bit sound-card. The X11 environment used was XFree86 version 3.1, using +the SVGA X server with the built in MITSHM extension. + + After obtaining the source code through a non-disclosure agreement +with the author, Andrew Welch, I began the port. The most immediate +problems I ran into had nothing to do with graphics speed, or hardware +access. How was I going to be able to get the icons, sprites and sounds out +of the Macintosh resource fork files? Throughout the port, whenever I would +run into these problems, there would be some resource, some paper or program +written that would help me solve the problem. A (nearly) complete list of +these and credits are in an appendix to this paper. For the specs on the +Macintosh resource files, I went to the well done series "Inside Macintosh", +published by Addison and Wesley. With the specs in hand, I coded C++ +classes that could parse Macintosh resource forks (e.g. dialog box +specifications, custom fonts, sprites, icons, sound clips, etc.) directly +from the UNIX file-system. How was I able to get the resource forks there +in the first place? That was made possible by the new HFS file-system +driver for Linux, written by Paul Hargrove. Once I had routines that could +extract sprites, color icons, and color-maps, I went to work on the graphics +interface. + + I had a game for X11, called "Xboing" written by an Australian +Justin Kibell, which used the Xpm library for full color animation in a +well designed blockout-style game. (For more information, his WWW page is +http://144.110.160.105:9000/~jck/xboing/xboing.html) However, using the +Xpm library, copying pixmap sprites from application to X server, his +animation has a great deal of "flicker" where the animation seems to flash +as it goes along. His method of dealing with sounds (designed for the +sun /dev/audio interface) is not tightly synchronized, leading to sounds +and animation for a single event occurring several seconds apart. The effect +is similar to that of a high flying jet -- the sight of the jet precedes +the sound of the jet by several seconds. + + Another game, recently ported to the Linux X11 environment, is +the popular "DOOM!" game, by ID Software. DOOM! uses frame-buffer based +animation, where multiple frames are blitted to the screen per second, +giving the appearance of smoothly flowing graphics. The X11 port takes +advantage of an extension to the X11 protocol known as "MITSHM", or +"MIT Shared Memory Extension" in which the client application and the X +server share a segment of memory that corresponds to an off-screen "image". +Graphics are drawn to this off-screen image and a single call to the X11 +server tells it to copy the image to a window on the physical screen. +This is much faster than sending each frame through the client-server +communications connection. For a 320x200 resolution window, this results +in reasonable performance. The game can be played smoothly and in this +game, sound is tightly coupled to the actions in the game, for realistic +play. + + In all but the fastest systems, the MITSHM off-screen image +technique is limited to 320x200 resolution. Any larger, and the X server +cannot copy the image to the window fast enough for smoothly flowing +graphic frames. Most X systems run in higher resolution, turning the +full-screen virtual reality game "DOOM!" into a tiny window on the desktop. +Maelstrom was designed for 640x480 resolution, and uses moving sprite +animation, so the MITSHM off-screen image technique is not suitable for the +Maelstrom port. The Xpm method of erasing and drawing sprite images would +be perfect for Maelstrom, if the images could be copied fast enough to +provide smoothly moving animation. With sometimes upwards of 30 moving +objects on the screen at once, the copying would have to be fast indeed. + + I combined both approaches. Using a technique I haven't heard of +before, I used the feature that a pixmap can be used as a window background, +in combination with the fact that a shared memory segment can be associated +with a pixmap, to create a shared memory pixmap that was the background of +a window! I can then directly manipulate the pixels in the background and +simply call XClearArea() to refresh the changed area of the screen. This +technique gives an incredible speedup over the shared memory image method, +because the window is not modified by copying an entire frame, but by merely +refreshing the existing one. All graphics drawing is done on the background +of the window and then placed on the display by calling XClearArea(). This +technique completely breaks down the client-server network relationship of +the X11 environment, but for certain high-speed graphics applications, the +speed increase is definitely worthwhile. + + Even with the speedy technique of shared background pixmaps, there +needs to be some way of copying the original sprite pixel data into the +shared background (hereafter referred to as the frame-buffer.) A technique +suggested by Andrew Welch, was to compile the sprites into streams of pixels +and opcodes. Instead of running a loop, copying each pixel independently +after checking to see if it needs to be put on the screen, compiled sprites +are streamed onto the frame-buffer using the largest copy possible, switching +on the next opcode to see how big a skip to make, streaming a next copy, +skipping, etc. Copying compiled sprites was 50 percent faster than using +the old sprite/mask technique. An additional advantage was that compiled +sprites took an average of 50 percent less storage space than the old +sprites and masks. Compiled sprites ran into problems however, when +clipping them on the edge of the screen. sprite pixel-maps and masks have +the advantage that each row of pixels is a fixed width, and all you have to +do is skip a certain amount into each row to clip an edge of the sprite. +Each row of a compiled sprite is variable width, and the checking required +to clip them would take longer than the pixel/mask method. I wrote a +routine to dynamically recompile a compiled sprite, based on clipping +conditions, but it too was slightly slower than the pixel/mask method. For +sprites with absolute coordinate positions, I use the pixel/mask image +updating during clipping and for small sprites with relative coordinate +positions (thrust sprites, etc) I use compiled sprite recompiling during +clipping. This combination of techniques resulted in a good graphics speed +for high-speed play of the game Maelstrom. + + Color mapping is a big issue in the X11 environment. Since the +screen is shared with other applications, and there are limited color +entries in the color table, you need some way of getting the colors you +need, without depriving other applications of the colors they need. There +are several ways to approach this. "Netscape", a world wide web browser, +just grabs all the free color cells and allocates the colors it wants. +"xv", an image viewer, allocates an orthogonal spectrum of color cells and +maps the colors it wants to this spectrum of colors. "DOOM!" allocates a +private color-map, fills it with it's own colors and uses that. This has the +side-effect of turning all other windows on the X display into psychedelic +color friezes. Since Maelstrom uses a full 256 color table, it needs more +colors than are generally free in a shared color-map. The approach I took +was similar to that of xv -- I allocated a spectrum of colors, and then +mapped the colors I wanted to this spectrum, plus the colors already in +the colormap. A command-line option can be used to tell Maelstrom to +allocate a private color-map for "true" colors, the same way "DOOM!" does. + + Color mapping is only an issue in 8-bit displays. Truecolor +displays can display thousands or millions of colors simultaneously and +require different color techniques. My hardware will only support 8-bit +color, and so Maelstrom doesn't currently support Truecolor displays. + + The VGA port posed an interesting problem, compared to X11 +graphics. In the X11 paradigm, graphic updates are queued until explicitly +flushed, or until the next call for input. Under SVGAlib, as soon as a +graphics request is made, the screen is updated. This results in "flicker", +as all of the sprites are erased, then moved, and then they are updated. +My solution was to create an expandable stack of refresh updates, and then +only update the screen when explicitly told to, or when asked for input. +This gets rid of the flicker quite nicely. The SVGAlib version of Maelstrom +is much smoother than the X11 version. + + +Sound: + + The next component was sound. Dave Taylor, author of the Linux port +of DOOM!, worked with the author of the VoxWare sound driver for Linux, +enhancing the real-time sound capabilities of the sound driver. Recently, +Terry Evans (tevans@cs.utah.edu) wrote a sound effects server for Linux that +can mix multiple sounds. I adapted the algorithm for sound mixing for my +own sound server for Maelstrom. Each loop of the mixer combines multiple +channels of the sound mixer into a single chunk of sampled data which is +sent to the audio device. The original idea was to have a continuous loop, +first checking for input, and then writing a chunk of sound (or silence) to +the sound device. This resulted in slow response time, because the a sound +event had to wait the entire cycle of combining the sound channels until it +could be acted upon. I modified the original concept to support +asynchronous input. Now, the loop has been simplified to a simple +continuous play of the sound channels, but at any time during the +compilation of a sound chunk, new sound data can be placed into channels, or +removed from the mixing channels. This allows nearly instantaneous mixing +of sound effects, in response to sound events. + + I decided to run the sound server as a separate process from +Maelstrom. The sound server has to continuously play sampled data (sound or +silence) and respond instantly to sound events. Maelstrom has to +continuously update animated graphics. I thought the best way to perform +both of these functions simultaneously was to do them in separately running +processes, communicating through a private UNIX domain socket. The socket +is set up for asynchronous I/O, and when one process sends a message to the +other, they are interrupted by a SIGIO signal. A handler is set up for each +process, handling requests. The sound server handles sound requests, and +sends a "sound done playing" message when it finishes playing a sound. + + This scheme works remarkably well, however there are still some +problems with it. If the sound fragment size is too large, the write to the +sound device returns too soon, and the time the sound is played doesn't sync +with the time the program thinks the sound is played. On slow systems, +sound requests can interrupt the write() system call, and if the requests +come too quickly, a single write will never complete. The current +implementation tests the write() return value for EINTR, signaling it was +interrupted, and performs a goto to restart the write. It also has to +re-set the signal handler at each interrupt, and can be interrupted during +request processing. This can result in infinite recursion on the signal +handler on slow systems (this has not been observed on my system). + + Regarding the accuracy of Maelstrom sound, there is a trade-off +between the accuracy of the synchronization between Maelstrom and the sound +server, and the smoothness of sound play. The fragment size needs to be +large enough so that the audio device continues playing while the Maelstrom +process runs, and small enough so that the sound write returns soon after a +sound is finished playing, i.e. not too much extra sound being played in a +chunk after then end of a sound clip. I've found that 1024 bytes is a fair +number for the fragment size, weighing timing accuracy and smoothness of play. +The only time the timing accuracy is really noticeable is at the end of the +level in the bonus count-down screen. + + +The Game: + + The main body of the game, all of the hit detection, sprite +updating, movement, etc was originally written as approximately five +thousand lines of 68K assembler. I rewrote and translated it all to +fourteen hundred lines of in-lined C++. I did not change any of the logic of +the game, intending this port to be as faithful a representation of the +original as possible. The structure of the game was preserved as much as +possible, changed only where the differences between the Macintosh and Linux +environment required them. These changes were primarily in the graphics +interface. Andrew Welch included the header file to his sound server, and +I emulated his entry point functions (the API) in my C++ sound-client class. + + The Maelstrom dialog boxes were captured from the screen of a +Macintosh using the System 7.5 screen capture facility (Command-Shift-3) and +then analyzed at the pixel level using 'xv', and recreated with custom +written Mac-like Dialog classes and a Font handling class that can translate +text strings, with Macintosh 'NFNT' resources, directly into blittable +bitmaps. They work almost 100% exactly like the originals. + + I thought about evolving some of the simple data structures used by +Maelstrom, (e.g. arrays, sprite structs) into some of the more advanced data +types, such as objects, supported by the C++ language. This would improve +the _look_ of the code quite a bit, but would slow it down as well. If I +were to do major redesigning of the way the game works, it might be +worthwhile, but since it works well, and works fast, I would not want to add +unnecessary data complexity. One concession I made to the C++ +object-oriented paradigm was implementing the graphics display driver +as a "FrameBuf" framebuffer graphics class. I plugged in graphics modules +for both X11 and SVGAlib so that the same executable program can run in +both X Windows and Linux console environments. + + At this point, the Linux version of Maelstrom is Freeware, by +permission of Andrew Welch, the author of the original Macintosh version. +It includes source code for the Linux version, and boldly displays the +Ambrosia Software logo at startup. + + +Problems: + + When Maelstrom dies unexpectedly, it leaves shreds of shared memory +lying around the system. These need to be removed by hand, or reclaimed by +Maelstrom itself. + + +Future Enhancements: + + I would like to find a way to reclaim shared memory that +has been orphaned, possibly by using a Maelstrom-specific shared memory +identifier. I will look at the source to "ipcs" to find out how to +search out shared memory on a system. + + I would like to port Maelstrom to the SGI. A port to the SGI +would be fairly simple, except for one thing. I know nothing about +the SGI sound interface. All of the SGI systems I have access to do +not have the sound interface documentation installed. + + I would like to eventually write an enhanced version of Maelstrom, +with additional bonuses, "rubber" asteroids, etc. Maelstrom+? This would +be in collaboration with Andrew Welch, and would require that I first... + + It would be nice to extend my Macintosh Resource class to be able +to write the Macintosh resource forks as well as read them. I also want +to expand my sound class to be able to understand other sound formats +besides Macintosh sampled sound bites. + + +Conclusion: + + Ya HOO!!! It can be done!! My friends have played it and +pronounced it a very good job. As far as I can tell, the Linux version of +Maelstrom is an authentic Maelstrom version, complete in every detail. The +timing is accurate, response time is accurate, animation is smooth, sound is +clear and timely. + + I feel that I have demonstrated that games of good quality, +and real-time audio-visual applications of all kinds can be well written +and well used in the Linux/X11 environment. + +Excuse me, I have to go play. :-) + + + + + + + +APPENDIX A: CREDITS + + +Thanks to all the people who helped this project be fulfilled..... + +(a partial list follows) + +Emily, who reminds me to take care of myself, without whom, I would +eat only chips and salsa, stay up until 5 A.M. every night, and sleep +through all my classes. :) + +Ron Olsson, who's giving me credit for having fun. :) + +Andrew Welch, the author of Maelstrom + +Larry, for being picky, and praising perfection. + +Dave, for letting me use your Mac all the time. + +Whoever that C++ teacher was... ;-) + +Paul Hargrove, author of the HFS file-system for Linux +(hargrove@sccm.stanford.edu) + +Justin Kibell for inspiring me to write a good game for Linux. +(jck@citri.edu.au) + +Terry Evans, author of that great mixer, "sfxserver" + +The combined authors of "Inside Macintosh" -- invaluable! + +The author of ResEdit + +The author of GraphicsConverter for the Mac + +John Bradley, author of "xv" + +Dave Taylor, author of the "DOOM!" for Linux port, who first turned +me on to MITSHM + +Guido van Rossum, a man named Guido who wrote "mac2bdf". + +The XFree86 Team, for a great X11 windowing system! :) + +Cliff at ARDI -- I still say mine is faster! ;-) + +Manuel, who first showed me Maelstrom -- I'm addicted! :) + + +Of course, Linus and Linux-heads everywhere, I wouldn't have Linux +without you.... diff --git a/Docs/Quotes b/Docs/Quotes new file mode 100644 index 0000000..dbc8296 --- /dev/null +++ b/Docs/Quotes @@ -0,0 +1,25 @@ + +(Quotes taken from "Linux Game Tome Comments" 3/13/96) + http://www.cs.washington.edu/homes/tlau/vote/vcomments.html + +* * * * * +Maelstrom (5 stars) +Best asteroids implementation around; it has OS/2's Roids beat by a wide margin. +-- layers@vax2.rain.gen.mo.us (Larry Ayers), 1/9/96 + +* * * * * +Maelstrom (5 stars) +Kicks butt. Take that, you smug Mac users! Hey, wait a second... I *am* a Mac user. And I'm smug, too! +-- kylef@umich.edu (Kyle Ferrio), 12/20/95 + +* * * * +Maelstrom (4 stars) +Very well done,grat graphics grat sounds. One of first really good games for linux! +-- hubicka@limax.paru.cas.cz (Jan Hubicka), 12/07/95 + +* * * +Maelstrom (3 stars) +Just like the mac, ick. +-- peterh@prognet.com (Peter Haight), 11/16/95 + + diff --git a/Docs/RSA.README b/Docs/RSA.README new file mode 100644 index 0000000..d80c2e9 --- /dev/null +++ b/Docs/RSA.README @@ -0,0 +1,17 @@ + +I cannot legally include the RSA reference encryption package and +still allow this package to be exported outside of the US. You don't +need it to play Maelstrom, only to recompile the network encryption +support. + +If you have rsaref, create a subdirectory "RSA", unpack it and then +make it as per the directions. If you re-run "configure" in the +main Maelstrom source directory, the script will automatically detect +the new RSA subdirectory and include it in your next compilation of +Maelstrom. +Like I said, rsaref is only useful if you want to recompile the checksum +routines for network score authentication. :-) + + + -Sam Lantinga (slouken@devolution.com) + diff --git a/Docs/Technical_Notes-v1.0 b/Docs/Technical_Notes-v1.0 new file mode 100644 index 0000000..f1b1dfb --- /dev/null +++ b/Docs/Technical_Notes-v1.0 @@ -0,0 +1,260 @@ + +The first challenge was figuring out how to get the Macintosh resources +into a form that could be dissected from within UNIX. First, I tried +copying files over from "Executor", a Linux based X11 Macintosh emulator. +Unfortunately, Executor wraps the resource fork in a special header, +rendering it difficult to decipher. The solution was to BinHex the files +on a Macintosh, and then use the Linux utility 'mcvert' to extract the +resource fork from the archive. I also used the ALPHA 'hfs' filesystem +for Linux, but got a file that was different than the one 'mcvert' unwrapped, +so I didn't trust it. + +The second problem was finding out the format of the Macintosh resource +fork, so that the resources could be extracted. This was solved by going +to the bookstore and looking it up in the "Inside Macintosh" series +published by Addison and Wesley. This series has detailed specifications +on the internals of the Macintosh operating system. This was pointed out +by Andrew Welch, the author of Maelstrom. + +The next tricky part was after I had written code to look at the various +parts of the resource fork of the Maelstrom game, the values seemed way +too large to be correct. The offset for the Resource Map was 4 MegaBytes +into the file, when the file was only .5 Megabyte large. This was caused +by the fact that Linux is little-endian, while Macintoshes are big-endian. +This was solved by running ntohl() and ntohs() on the offset/value fields +of the resource fork. + +I wrote a utility to list and extract all resources from a Macintosh binary +resource fork. + +I extracted the sprites from the Maelstrom resources, and attempted to view +them in a VGA console, using custom-crafted bitmap viewing utilities. +The sprites appeared, but appeared in psychedelic colors. Evidently, +the colormap was wrong. I played with the colormap, setting it to the +standard colormap, which didn't help. I used ResEdit on the Macintosh +to look into the ColorMap resources of Maelstrom. ResEdit has a colormap +editor that can display and set the colormap of a Macintosh application. +I used it to find out the proper colormap for displaying Maelstrom sprites. + +Next was the sounds. I used the resource parsing code to extract the +sound resources, and then used "Inside Macintosh: Sounds" to look at +the format of the sounds used in Maelstrom. It turns out they are all +either format 1 or format 2 sampled sound bites which can be directly +played on /dev/dsp under Linux. + +Then, I worked with the colormap resources. I found the format for the +colormap resources in "Inside Macintosh: Imaging with QuickDraw" +I used this description to write a utility that converts a binary clut +resource into a C header file describing the colormap. + +Next was the PICT resources: the title screen, credits, and info screens. +I looked at the "Inside Macintosh: Imaging with QuickDraw" for the PICT +resource format, and freaked when I saw it was a collection of opcodes +for the QuickDraw routines. Then I found that the first part of the +Maelstrom PICTs seemed to be a colormap. + +The solution to the problem of understanding PICT resources was going +to ftp.sunet.se:/pub/mac/mirror-umich/graphics/graphicsutil +and retrieving the programs "GraphicConverter" and "pictmanagementutils" +I used these programs to extract the PICT resources and save them +as raw PPM files. Then I wrote a simple program to display raw PPM +files on the VGA console. + +I copied the raw PPM files from the macintosh disk to the Linux system +by mounting it with the 'hfs' module loaded, and then doing a straight +copy of the data portions of the files. The 'hfs' module for Linux +was written by Paul H. Hargrove, hargrove@sccm.stanford.edu + +I then translated PPM files to XPM format with xv, performing image +enhancement. I then wrote a utility to merge the colormaps of the +pixmaps and perform a check to see if all the colors are in the +standard colormap of Maelstrom. They are, so I can convert them all +into raw pixel data -- a form more suitable for blitting to the screen. +This form also takes less disk-storage than either the raw PPM data +or the textual XPM data. + +When loading up Maelstrom, I thought it might be nice to create a color +icon for the window manager to use. I created it by resizing and +simplifying the main title image of Maelstrom with xv and then turning +it into a standard colormap xpm icon. The program 'xboing', written by +Justin C. Kibell, jck@citri.edu.au, creates its own color icon. I looked +at the code for this, and used the technique with Maelstrom. +The technique is basically to create a pixmap on the X server and then +tell the window manager to use it for an icon. This must be done before +the window is mapped on the screen, otherwise the window manager ignores +its hint. + +Then, I tried allocating a private colormap for displaying Maelstrom +graphics. Well, that works, and the code is still in place to support +that, but the Maelstrom colormap turns the rest of the screen flourescent +colors. I looked at the code for 'xv', written by John Bradley, and +found a good algorithm for mapping the colors needed to the existing +color palette. I have ideas for more advanced algorithms of color +allocation, but the direct mapping method seems to work well enough for +me. One problem with this approach is that once Maelstrom is started, +it locks all the colors in the colormap, preventing applications from +allocating new shared color cells. + +One of the primary factors affecting game playability is the speed of +real-time animation. One of the best ways to achieve high-speed animation +in the X11 environment is to use the MITSHM extension. The standard +method of working with X shared memory is to create a small (300x200) +shared image, manipulate the image and then "put" it on the server +with XShmPutImage(). Reasonable speed can be achieved with this method, +however this is not fast enough for the needs of Maelstrom. Maelstrom +is played in a 640x480 window, and copying a 2.5 megabyte image into +the screen contents would take way too long. I get around this problem +by creating a shared Pixmap, and making it the background of the window. +Background pixmaps are tiled, so the background Pixmap has to be exactly +the same size as the window. Now, the background of the window can be +directly manipulated, and refreshed with XClearArea(). This approach seems +to be much faster than working with an XImage, and blitting it to the window. +One side-advantage of this approach is that graphics can be drawn in +the foreground of the window, without affecting the animated background. +Another benefit of this approach is that a redraw on an expose event +simply consists of an XClearWindow() call, without having to redraw +the entire contents of the graphics window. + +Next was sound mixing. I used a simplified version of the sound mixing +code in 'sfxserver', written by Terry Evans, tevans@cs.utah.edu, for +sound mixing. Each loop of the mixer compiles multiple channels of +the sound mixer into a single chunk of sampled data which is sent to +the audio device. The original idea was to have a continuous loop, +first checking for input, and then writing a chunk of sound (or silence) +to the sound device. This resulted in slow response time, because the +a sound event had to wait the entire cycle of compiling the sound channels +until it could be acted upon. I modified the original concept to support +asynchronous input. Now, the loop has been simplified to a simple continuous +play of the sound channels, but at any time during the compilation of a +sound chunk, new sound data can be placed into channels, or removed from +the mixing channels. This allows nearly instantaneous mixing of sound effects, +in response to sound events. + +I decided to run the sound server as a separate process from Maelstrom. +The sound server has to continuously play sampled data (sound or silence) +and respond instantly to sound events. Maelstrom has to continuously +update animated graphics. I thought the best way to perform both of these +functions simultaneously was to do them in separately running processes, +communicating through a private UNIX domain socket. + +PROBLEM: After we allocate a full colormap, Maelstrom wants to allocate +other colors. We have completely filled the colormap, yet... what can +we do? We can completely take over the root window colormap... +That's not polite, but what else can we do? + +PROBLEM: After we allocate a full colormap, Maelstrom wants to allocate +other colors. We have completely filled the colormap, yet... what can +we do? We can completely take over the root window colormap... +That's not polite, but what else can we do? +... Try to allocate the closest color in the colormap and see what we +come up with... + +The best thing might be to grab a copy of the current screen and see +what colors are actually in use, and reserve all the rest. Hmmm?? + +Mapping to the closest color already in the colormap seems like it +works. It's not perfect, but it is polite, and prevents lots of +gyrations trying to blend a private and public colormap. + +I tried to allocate all the colors, and then map the ones that were +left. That didn't work. The colormap was left full, and the colors +that needed to be mapped didn't have any colors to map to. + +I wrote a routine to convert the Macintosh color icon resource into +both XPM and Linux-Maelstrom sprite format. + +The next challenge is the fonts... + +I found a program called 'mac2bdf' that converts Macintosh FONT resources +into UNIX bdf fonts. I'm using the information here to learn about the +Macintosh font format. My plan is to write a "Font Server" that can +translate text, given font and pointsize, into a blittable Sprite. + +The font server works nicely. :) + +Next challenge is how to blit the sprites. The best way is probably to +keep an off-screen buffer and save the area behind the sprites to this +buffer. When the sprite is removed, the screen is restored from this +off-screen buffer. If this "back-buffer" is too big, we can possibly +save a shred of the background in the Sprite data structure and use that +to restore the background. The off-screen buffer is a more robust +implementation in that it allows graphics pen styles, such as XOR, OR, +etc. + +Saving the back-buffer in the sprites is a bad idea because two or +three sprites may go over single point, and each would have a different +idea of what the background looks like. + +The standard way of blitting sprites is to cycle through the sprite, +checking against the mask, and put the pixel if it is "live". This +requires a loop iteration for each pixel in each scanline. This can +be fairly time consuming. A much faster method was outlined by Andrew +Welch, and that is to compile the sprite into a continuous stream of +pixels, arranged by a series of opcodes describing where the next pixel +should go. + + By compiling the sprites, I achieved a speed up of 45% +over the old sprite/mask method. An additional advantage is that +the compiled sprites take much less storage space -- an average of +50% less space. + +Sound: Under certain conditions, Maelstrom wants to wait until a +sound is completed. In the original code, Maelstrom looped, polling +the server, waiting for the sound to finish playing. Unfortunately, +polling the server interrupts the write() which must be restarted. +In continuous polling, the write keeps having to be restarted and +the sound never finishes playing. If the sound status is kept by +the Maelstrom process, with the sound server sending periodic updates, +then the sound server can be greatly simplified and will not be +continuously polled. This is the new approach I will take. + +This approach works well enough. The sound server takes very little +CPU time, as most of it's time is spent waiting for device writes to +complete. One of the challenges I ran into, in writing interactive +sound code, is you need quick response time to user events. For example, +if the player presses the "Thrust" key, you need to be able to start the +thrust sound, and stop it almost immediately. One of the parameters +you can tune to get this is the fragment size of the sound-card writes. +If you have a large fragment size, then large amounts of sound are +quickly processed and sent to the sound device. Once it is in the +sound device buffer, the sound cannot be cancelled. However, as the +size of the audio-fragment decreases, you begin to have better control +over the timing, starts and stops of the interractive sound. + + For Maelstrom, I found that a fragment size of 1024 (2^10) +was about right for good response time without instantaneous response. + + Instantaneous response is not, in general, a good way to +program an interactive game, such as Asteroids or Maelstrom. The +player expects to see an organic, analog universe, not one that +reacts instantly to conditions. In the real world, cause and effect +relationships are not instantaneous or even immediately obvious. +For example, when a jet passes overhead, the sound of the jet trails +the sight of the jet by a good distance. Another example is acceleration. +When gravity takes hold of a body, the body gradually accelerates to a +maximum velocity -- it doesn't immediately reach its terminal velocity. +These organic and semi-random natural conditions can be simulated in +the computer using random vectors and calculated delays to produce an +environment more suitable for interactive play. + + Timing is a crucial part of interactive games. In Maelstrom, +large portions of code are devoted to boundary condition detection and +timing conventions. At each frame update, all sorts of time-dependent +conditions are checked -- how much time has it been since the last +screen update, is it time for a keyboard check, has the shield ran out, +etc, etc, all these are crucial components to a well-rounded game. +If things are handled too quickly, the player no longer enjoys playing +the game -- there is no time to repond. If things are handled too +slowly, the game appears sluggish and is no longer fast-action fun. + + I'm working on clipping. Right now, clipping is handled by +dynamically recompiling the compiled sprite when it's near the edge of +the clipping rectangle. This is okay when there are only a few sprites +on the screen, but when there are more than about ten or twenty, this +becomes too slow. + I'm going to try to add code that will detect if the sprite +is near the edge of the clipping rectangle. If it is, it will call +the Blit_Sprite() function, instead of the Blit_CSprite() function. +It is faster to clip a pixmap than it is to recompile a compiled +sprite, I think. + diff --git a/Docs/Technical_Notes-v1.1 b/Docs/Technical_Notes-v1.1 new file mode 100644 index 0000000..2d6783a --- /dev/null +++ b/Docs/Technical_Notes-v1.1 @@ -0,0 +1,26 @@ + + To get gamma correction, I just filled a 'xcmap' style XPM image +with the Maelstrom colormap, and displayed it with 'xv'. I used 'xv' to +perform gamma correction on the colors, and then saved the gamma corrected +XPM, and extracted the colors to a new colormap. + + It turns out that shared memory XImage manipulation is actually +faster than shared background pixmaps. This is because the contents of +the window can be directly manipulated via the XImage, instead of having +to be copied from the XImage. XShmPutImage() acts as XClearArea(), +rather than XCopyArea(), and has corresponding speed. XShmPutImage() +is faster than using shared background pixmaps, because the server +no longer has to deal with tiling and such issues. + + Asynchronous I/O works reliably under Linux, but seems to lead +to race conditions on other versions of UNIX, when used for communication +between Maelstrom and the sound server.. + +Actually, with the use of POSIX signal handling and select() to check +for I/O in the I/O handler, asynchronous I/O seems to work well in every +other system on which Maelstrom runs. + + The port to other UNIXes besides Linux is beyond the scope +of the rest of this document. Let's just say it involved quite a bit of +work with byte order and sound driver development. + diff --git a/Docs/Technical_Notes-v2.0 b/Docs/Technical_Notes-v2.0 new file mode 100644 index 0000000..2e52ed2 --- /dev/null +++ b/Docs/Technical_Notes-v2.0 @@ -0,0 +1,158 @@ + +--- +Note: +A great deal of technical development between the Technical_Notes-v1.1 +and v2.0 is not documented. This document starts at the beginning of +the addition of networking to Maelstrom, and finishes with the final +networking algorithm used. +(See Networking.Paper for a more organized description) +--- + +The hardest thing about this networking project is synchronization. + +My initial feeling was to go with TCP for sending synchronization packets, +but running a real-time game at 30 frames per second, I can't have the +slow-start algorithm after a packet loss and the other overhead of TCP +would be wasteful. + +My thought was to take advantage of the guaranteed delivery that TCP +offers, since on a 640x480 screen, even one missed frame could have +significant reprocussions in terms of game state. + +I also need the speed of UDP. Ideally, this game would be able to run +over 14,400 bps modem speeds. Using PPP, this averages between 600 +and 900 cps, so including IP headers, we would want no more than 600 +bytes of traffic every second. Using 1 byte synchronization packets, +30 frames per second would require in (1+U+20)*30 bytes throughput +every second. (Where U = #bytes in a UDP header) That's at least +630 bytes per second, just going one way. Guaranteed delivery of +synchronization packets requires at least an ack, nearly doubling +the necessary throughput. + +The only reason we want such tight synchronization is so that +keypresses arrive on the frame that they need to, and that frame +is the same on every machine in the game. Since key-presses +average about 10 per second, we can probably get away with only +10 sync packets every second (1 every 3 frames). We still want +a granularity of a keyboard poll every frame, but we can now do +lazy acks and do guaranteed delivery on 1 sync per second and +each keystroke. + +Well, the problem is not if a keystroke is sent to a machine +that is slow, but if a keystroke is sent to a machine that is +fast. If a fast machine zips through the frames, then a keystroke +at a particular frame will get missed or late, both of which resulting +in corrupt games. Imagine pressing the turn key on your machine, +pivoting round, and pressing the fire key. On your machine you +hit the asteroid next to you, and on another fast machine, you +crashed before you were able to hit the fire key. Instability: +You are dead on one machine, and live on another. :-) + +We need synchronization on each frame (actually on each key poll,) +to prevent keystrokes coming in a frame or two too late. + +Keystrokes can ride piggyback on sync frames, so there is little +overhead for that... + +The alternative is to poll the keyboard every other frame, and only +send sync signals every other frame as well. +... That doesn't work very well... you need the every frame key poll +to respond quickly while firing. + + +Stop and wait? -- not exactly. :) + +The conclusion? Networked Maelstrom won't run over the modem (200 ms +ping times are too slow) and we will use UDP with stop-go protocol +for real-time speed. + +The next phase is designing a good handshake protocol. +The plan: + When a new game starts... The checksum server (player 1) + will send a checksum to all other players. Each other player + will, when it receives it, send back the same message. + How do we guarantee delivery? We don't, but if the reply + doesn't make it, the first player will keep sending the NEW_GAME + packet to that player, and that player will respond, even though + it's waiting for the first frame packet. + + +Another possible dropped packet condition is as follows: + + Player 1 sends a frame packet to itself and Player 2. + Player 2 sends a frame packet to itself and Player 1. + Player 2 receives the frame packet from Player 1, and itself. + Player 1 only receives the packet from itself. + Player 2 continues to the next frame + Player 1 retransmits the packet from its current frame. + +Player 2 is now deadlocked waiting for the packet for frame +1 +while Player 1 is still asking for the packet for frame +0. +The solution is for each player to keep the it's last frame +packet cached, so that if it receives a request for the last +frame, it can resend the previous frame's packet, and the game +can continue. + +The players can only be one frame off, because each player does +not continue to the next frame until all players have sent the +frame packet for the current frame. If one player is one frame +behind, all other players will wait for it. + +If packets arrive out of order, then an older retransmission can +arrive after a frame has been successfully negotiated. In this +case, the receiver will send a response if the packet is from +the previous frame, and it will be ignored by the sender, who is +a frame ahead. Thus consistency is preserved without initiating +packet storms of retransmissions and acks. + +Note that this configuration really is peer-to-peer, and the only +time one player is a "server" is when the first player sends the +initial level, number of lives, and random seed to all other players. + +I had a great problem with lock-stepping using the above method. +Imagine both players furiously sending frame packets at each other, +and advancing to the next frame. Then: + + Player 1 (frame 10) Player 2 (frame 10) + 10 --> <-- 10 + dropped packet + Player 1 (frame 10) Player 2 (frame 11) + wait <-- 11 + get 11, timeout + Player 1 (frame 10) Player 2 (frame 11) + 10 --> <-- 10 (cached) + Player 1 (frame 11) Player 2 (frame 11) + 11 --> wait + Player 1 (frame 11) Player 2 (frame 12) + wait <-- 12 + get 12, timeout + +This goes on, repeating, as the two players advance frames in lock-step, +one frame per timeout. + +The solution is for Player 1 to immediately resend the sync packet for +it's frame if it receives a packet for the next frame. That way it doesn't +have to time out. If it caches the packet for the next frame, the next +time around, it just sends the packet for the next frame, and advances +immediately. The two players are now back in sync. +This assumes that few packets will be dropped or otherwise lost. +This seems to be a valid assumption. Even over a 32.6K link to +Australia, very few packets were lost and though the game was unplayably +slow, dropped, lost, and timed out packets were few and far between. + +The new senario: + + Player 1 (frame 10) Player 2 (frame 10) + 10 --> <-- 10 + dropped packet + Player 1 (frame 10) Player 2 (frame 11) + get 11, cache, 10 --> <-- 11 + Player 1 (frame 10) Player 2 (frame 11) + get 10 <-- 10 (cached) + Player 1 (frame 11) Player 2 (frame 11) + 11 --> get 11 + Player 1 (frame 12) Player 2 (frame 12) + 12 --> <-- 12 + +The players are now synchronized again. + diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..f17ab8c --- /dev/null +++ b/INSTALL @@ -0,0 +1,9 @@ + +To build and install the game, get the Simple DirectMedia Layer +library from http://www.devolution.com/~slouken/SDL/ and install +it. Then run: + ./configure; make; make install + +If you are building with Visual C++, unpack VisualC.zip and open +the VC++ project file found in the new "VisualC" directory. + diff --git a/Images/Maelstrom_Icon#100.cicn b/Images/Maelstrom_Icon#100.cicn new file mode 100644 index 0000000000000000000000000000000000000000..61587ff737380228b4895b246c75cb81ebf7a7d3 GIT binary patch literal 1156 zcmeH`yA8lF2t?T+BgDP;-zyC^hJq-vW8q(!6j7c;bx0>p2RLx>0=l4BE7BC!yr6_} z0!!5+h5@#Ez#dMm?mOt$O}+uUc>LG$=^NPg1Ji(*{vc0~njgxX(qCA-$1T6`q1j?n NJ$6-kaxM>h&E{_nL5TIqp7X-r$8OSa4}(H=g^FA2f|3)}z))M&=!LTm+` zaCe}5`W?3m)cOra=;-}AkiPLYXX)hK7Y!gUE$}^vu>#MpP`w~m9lXi(h?qxn3z z3b3R6WaZf*8|Zm0k$wY@$OcO1SNMaQ@Yn=!LX4o}k%9oqMn&GvBJE37t;tJk?_BHF V_FS9R^x3*c#H5Jl;z5LB^EB?(CFG-MOFa6tmPf*P@LvxF}ZxUmZD9wSv6P3J0Zat0X? zAUcp8Ae{laNTHqapCuhjj^)bm01HukfByVgM#E?rya5k(G7{82ksF<|_nw(w z(ugNtfoVbX%te@pxhB7YswRTq_RrHGQi{GpYswIl|F!<-!IrqHE8uZZ6jKPkJ#pAI zSOsYk_YxvEchnB>I=ZU0b^Iks;uPGHwU&cGfGb2kE5=Ehq;ZUXXM-RlU}9f0`66v- z-0O4#g+>jSFdPHZL$vp_y)%J1%9Ls#o^dziU6Fk5g*pt>md1vDzy9H|5YcoJ@P`xS zr8Nzgn~RIzim}o8$@!!>)9i46`N0(d|O94sW2* zV57w%-@*|L8agXAm&wfzhDYG#Oq(?rX1CVu&vg@7X*S6E{cIQOKdBKq&vIi8_W7UV z4L;)@@}m6BUw(w+(Pb1JZxC0aj>vUauZA NuQ>3<>B4`j9sok0ie~@- literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#104.cicn b/Images/Maelstrom_Icon#104.cicn new file mode 100644 index 0000000000000000000000000000000000000000..a3dd541a0947d4e4ab9b8d1bc67732a5ad62dc2e GIT binary patch literal 1156 zcmd6kKT?H248~U-M!MJ0YAq!Pc$c8$E_s(pl}mUGN{?XmU?JJ~Ee}z_+A&Oqo&3K1 z+YQg*IsB=42>oim^mR7hc;7qJKg`tJkzQ3xjRR*(H(dNKAn}ybi?X;C*;Qa&d4U22 zH2u#BP~Qa60vxu-E@HFh22};g9tT!dnr8_9DVuAPFGC3A~+$W<|?;$UoZS6|sx zd1@k(bImVH;x=5#W|2Jh%MJ%mW;5$TbL+3n_2eeD(nv=f!1Ij=aoe&V(lKd5XQJ5B z?YfQr`6A%&S&7W UzrkN2zbt-AAv}y&_wBgy2Zv&C2mk;8 literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#110.cicn b/Images/Maelstrom_Icon#110.cicn new file mode 100644 index 0000000000000000000000000000000000000000..aea90b519c34dcd442016d47c0ff12df163f2ab3 GIT binary patch literal 1156 zcmd6lS(1Y=5JPj6T-B!zy?UM?5J;+$-!W7fTfInXZui@L{#uW(YtF~F0)TILU&24| zuIjF=XVew%%&N#@%Pru*m6RSMGedaf+Gxkg91#J~F~IrCAY#W=SV>;$5$1F`;bbVH zMtal9qlPN%`H<$+lbr%ObOhUuL#eWRrBsuL*Rv71^)E4-iinI6&J#B0$ekaJ8((6$ zFSeMwTb5hz_=HpytOMK}G7@{#$1CvVv2ZEgvdCNx?)t$sW*abN0yWc2GkD_F(|{Mr zm{b1H-4FkYdJeCG2XhdE8XiYJ35LDIOQK_Lx1Z`4f@B}BlMGk+bK=*sO#TYSi0+~4 z2R|smhS{QC0wV1V*B^sJhHr3Hzf1mPW{1Prv>E91d)D literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#128.cicn b/Images/Maelstrom_Icon#128.cicn new file mode 100644 index 0000000000000000000000000000000000000000..b2c79a946450e95007487448e0ef342d645f68b1 GIT binary patch literal 76 xcmZSJVBq-we>D*N2U7Jwuo^^#ga8?<>q8i{Lcp{ZPyon>h{M#u^#Qel002LVE{y;H literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#129.cicn b/Images/Maelstrom_Icon#129.cicn new file mode 100644 index 0000000000000000000000000000000000000000..48429a15c56d8224d2dbfd212a5dbfb4287dc3b3 GIT binary patch literal 76 zcmXZT!3_W)2t!f0bpv*A|6$k!jV84i|K;^kgMm!NCZb0M5G~x1tk+zpMwQ^!SX+ly F{4T6xIbr|+ literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#130.cicn b/Images/Maelstrom_Icon#130.cicn new file mode 100644 index 0000000000000000000000000000000000000000..269387ece59f55bc98ec4fc20295f674c3a97d06 GIT binary patch literal 76 ecmZSJVBq+V1w4NI7%KYsKNy1e5QN~P=>q@+E=CCe literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#131.cicn b/Images/Maelstrom_Icon#131.cicn new file mode 100644 index 0000000000000000000000000000000000000000..2b447b969202ad900ae168097941ce8a6581d124 GIT binary patch literal 76 ecmZSJVBq+V1%!lzKt)6TgCU3y7DD2q=>q`Q!aW%P literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#132.cicn b/Images/Maelstrom_Icon#132.cicn new file mode 100644 index 0000000000000000000000000000000000000000..db25087507ac57a447c906904e79d6cec75e8679 GIT binary patch literal 76 gcmZSJVBq+V1>E?511t)n!SDu<4;F&(p&S&Q0Q5UWrvLx| literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#133.cicn b/Images/Maelstrom_Icon#133.cicn new file mode 100644 index 0000000000000000000000000000000000000000..55bcb964ef611d273f9e6f814ff460b627191d7b GIT binary patch literal 76 ycmX|%!3h8`3?%u3;sV3JRy5I%UynWME=<0@|AJ=yS^51^c(nB%Urz074f4 literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#134.cicn b/Images/Maelstrom_Icon#134.cicn new file mode 100644 index 0000000000000000000000000000000000000000..3946a92e046ceeb9249f1cf228e1b5ff58053371 GIT binary patch literal 76 gcmZSJVBq+V1<1+Cfki>290-E=U?DIM!bj5w0Az$Yxc~qF literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Icon#135.cicn b/Images/Maelstrom_Icon#135.cicn new file mode 100644 index 0000000000000000000000000000000000000000..7264a5615638b0e5b81f70c4da728aec8a1d52b8 GIT binary patch literal 76 wcmZSJVBq+0=FA5WJ~Qpu88AKuq=6VF{{KIS^&bd8vS1o03!-7-Aol0cEWzYmD)T1?m90g1oZn>;dG`)D_xXhh+Ub zfxI5|w2YeH_eEw^)+1k&ul3$^&w|;CVpUdTL}WxpW>#c8{nvm0?_W1AfBv`4=0CXm zzdvm@|H<#4HvjJW|M`o5;=((XX__|gfIYASwg8oz=^gdJ9@qg}0L0C-ryke?J75dY zcr)#&2ll`Y*a8sTOk3)KJ+K3|08BRe_YT+tJ75dI7}oD#^A3{lX#Nh=cT|JVZA51GWGSk%xL<5A1*~05LdI&%Zse1GWGRkcS#z5A1*~ z08`|l9@qmrU<)7!uc!z1zz)~~JRlGCz#iBETL1*)p&r-+J75dY2zjUn^lt}j0SF-v z(gAy52W$a|BMZ49{3jc=C#o_zyA8`rt7-R zFTeb<`T6IcH$VOK)8@w?f86}=!w;M9zyE&o?YG}2d!?8tAI#jVMEQJRa+IA>UM|)37`~?%qfPV|9Kb%8(t7 z!_+PG&)hzY`gZD`DW6XB?c3a(Rue&Ydeh1NZMyKUM)h31v69dMgJs%0ry5sh z8ZeuNs`Fc2nsGXNUKqOEPPB#@V~|`yS@^w)o88zCS?rQ0D3-o&<{r_`MAdfeQvJ;~ zBeKnkO0?YB=&kf&b)d!>F|@JLK~ii;)zAGxl-DSSsyZDeOg2sDsvajj*UW>5ifv0% z9g{6w-AXTwU1&Ulb{2Zwv~Cu^AyQLSygOF|E2Hjsu20#j=jy<=hy^;+Fw%6ab9egc zICLNhp>1oos}QHDG78LxNmWs5ulDeyiEt2mSn~u~J!z{`BdJqKM8~Ngg%!V7$zTqWV+^NwFc7FkiI{7_z}j5U8p8h6{HGj9TF-eN|^~ zP&ay1B`YGpL9a)Ys*beOTX_;xT~@CtjbJ!;jUW<8{H4DmfB-z_ZT9Y$ht7n!vx^ zrm5P#Pl}RZF;;Xou@{A23R(~o!isiJ7a6o6)#3pTTuq-#yhCMI+@}swMp)^pCy_VPIqUw_>W*WSohLddIB02D=EK4n>!k9&q zE~axkFY%4Zx4yFQGZLY*;;Hr&#)1ZF8W{^wb%MctM;nc`)|1FAO>`EC)kkwZdpu^u zq>Z&aq4khzDwG3>PnY+5j5L{=hh>&wqqI_a@;oWOIyNz5^!2e4R{k}5 zh%6PRfpWGh1gYw14=rd&hO?Z~MM@e)Gro!&4P#sbtz``92S?1h@XC>F#XNKN=-{T{ z8D`g5NP|*03(@g>ii!AE8_(_Mm_#&gRid*oRIH`}*%!owu$CvZ9#RFBJFg$!f4owD z|9#aw#+RquaLwb?ordH^3)5Z-wdb{-Do)jS&=Sc4!UVni2JJjhutv<`=jklxabfwh zALFe-1Lb0)WloTiq#U`9D8o7IocG3Q`Op5AzMhSJsLq~Y-E83*8rOuP)qAiU1yL+| zVj2~z8*NSu3sw#$D6JTm~w`JY%1e|{ZyS3WdiY=jgtf_te#HBy6@lkub zzK0I$V`hcQY)R<_8Dv>qyy+5-?e77mC#?y-h8Nae&seNVo?-UT;o{&k(MlcWzuRr( z+qPG9OhMD=Y*bE-R;$_zM@CEtE7~X#yw3>beE98e?>{^#AOHTura_nS)w5}leU36^ z)A#Hp+95knhtKpKGvah+Qm)wDic9$SaDK%^uh_PmI>8FDhpW5mbvrc<7z9H11denzUTYCvS)NEOC;rt7(S0@%kMGk1ADe_Ra zF(v9=lWA>UL1Q?XfT~qmGqvW2y6gfyK$jKYFAsJQ)%c zG~S#UWC-sgddLaNj~AS ze#6CG=DUeP*uhuaZaSEpZW!v*7++C2N?`VWaUOWfYlf2WRJ;*G{DFJBJ0D7_FL>JQ zR1sdtt@J>RiPEDKLAce1R!x__qEe&itl2l+fkP$>QXnRTQl1E)WT_kmbUi2`VaP0R^>nMGjGs)(QAkf{lqKdgv5UxhRK5N2H%$axA}Z>LIA~&B<#qk7M7~^TPf4JU*)>?C&ox zLSD!gHvKL;>g9U6;6LuZehsW`8av-FV$*>S*gMPc(#hy~x?fdZ(;*#IJ}>TlZ%Uiu zs5a^su<39-wj6QYCo{39`w(wpeNA~yeA74WeA;+Z^iLqHY?_Sv1#C)WhjQ;8vg=;S zs9#ZDQyfM(aWIZ(knJ4%9g`rK5)#r zGEwOWT~2mDupC-*RfN^7Tc_3x{lM3RgKTrI5pTzHTRV4TNzxgW9~875sw)$L9H562 z7!qi7q%F=uQy4O(7tNAJSg%C1Otgs^f0jB@ka7$X+74KDIV>nqbYD_RnM^@&(9c56 zl_ArxW_vrYiSsdnXpo7sKaMCkchFf- zK`C;EOfV9Q79F@U$+UEx(1*#aBu9^;yJRt`?V^rFo75?RXx6KF6qnhiDb}l>r#8i; z9<~GXf{)k;m?~GM(u7Hzea;>--6ccFkxDkH;XgUGM!{;RbmNk1q;{NOxOtJJBg`S} z1eaB^&g40YZnm8NFpT49 zamk#shlEvR2-yr0B}$xlJKMqS=X@o-CNMi{n@}X_SToKgksj8`I*~mFZKk;)>A~CP zS*UcrZca;*krlS=uVsQy=QYLfC547H2Js{g$F&GtP@0eO)ejBSLI*r)Ah;}DzeYx% z-JQ}dOT858n6(+4l`L?*kh}7?i}G=u=diM=#~NcBpR&3|cFrEs!{ADz(6wr zpM6P+aKnXCnKKlbM+G(bWSPLr`CC`W*iUqNRO%(vm&j#p`lP>*FuF2dFOrcWH|gVy zz)j?^r<&NbL=sY~nIilvWe*8y&Jbz_Y}yqIYNXbjP9yn5GET}@QX{*ZCzUZL=_tR6 zF9u~nIX$~f)(HnYTUm_Sv2DnL8a+d1p(4E~W%YOihQ3NfnBLB7VknU3r~gTuSV? zWHQ$TxB2lcZ%S4%=C5;movtU^&t!64=X_b~<$-FQp2U7*t@~d@SR1fhHw_@szyg>92|(p+drdvC0Omjf zfH>POs0S9n97q5<&$e^wfdw!J5&(j;Z9+Y;0Omjfz+|SsYhVG)fdqgttgm5n4asY| zUxRv0HJI1b0}EgdBmfo2Lp`tn=0E~~ggn#(3t$c;03DHsdSC&}fdqgUoT=w;0nC8} zfC2JQ11x|!kN_}69_oPwFb5I~LSO9Y%0r-JD)B_7(4kQ2w$U{A_0Omjf&yHNHfej$Hlnct;Kt>+w0l9}VAxNi|Y~hOFUfC=y#DN*u8k80`swV&ix;zxKmK_3!3Q7A&d$ze@4ffl?A>?aOJV+>%1Hw!4V*M^ z(!farCk>o5@YQIbcmy_Wcm$$fbCT=T!&|CJ%l2!o)(0Pc-jok+sJ3d#w-GeF4bllG zYM@;`g7a7TTj+Pyyamz;rPIK=?w%g*Ua#JQR`VDh@)msmM^VbP1TW0FgW1flHk@3O ztyXAkhWJqYQ{-OdL~Z!nMySXTZxN%d1C@r+ zJc6r><4&nlNs*=N0N2q~NJW|w!7^c_X{H(qmFr?#rwCW38BJN51-h1bSvkgbyOIf- zbXAo!iLM30TIO4)RHWK#WNB1jnX;W(r}Q3JQP+qv$dny!k`y7b&T}%PY_}`saGOf1 zEL~;BmX0B(u|rJ7TJ2CM#4Z<;F|7iTGaE%EBx^=k3(|OwW~}KW0l(c_uERuGk4Ecj)Bx`dB+2ku%z5dM+!$`d3-Ut8h$1Z zEQG<}tcHs#eZ^=T-}@rIM&u>8(U@8cJM{%ieWJ=uW9mZ@?Xucsh4Qz#+0;<>xkVwY z4V7|__U9>18*7tsY%c3p?)r3jHFaAVs~eD>Y9ZTH(Jb+${*unB-}lfKcW9dXIXspl@Y zD1@~VopskDXZB}$w(H)j>OpX(kIi6{*VJrw9n+GZ_-`SVHUV7;Q5WufYZ*|>^sd91 zIQO|MFDcJIaZ{Z=d-m+&kctNvcMJ>i9_k&@21&dKRCZmPD18-|u5MgRnHb23fEe8M zXMW3U40LCjX$^wf;KHJ+UmbSG%Jv)D99V(C4mU^*YeHsN>oseuOePbXqgYRt`lhrt z_Aveu5~DUUV*-~R7E3BEbKuaq_ymdj7P?2Q>$-xVZ+x;#}vy%+RPVuK|WsjnFmetvSE8s*sj3D=%QoQ)T6$(ZxjtHW`{)uB@tkR-vp=tgUMx?Q!dbprtToYrLy~fk{wjY@Z`#HaDW7 zZGXT{%q5q%kP9+)go^`G2LhoKLJwQl6y+LIQ0X@uF)s_O&ak1@G3ihnImgH`|Qb?`6Bg+FQ@uqRQ_vn>4GF1D0%ZB~k%Wg(pescBCvSjObxJKn&aDkDB ziy>%C^6oamCjBG^aob}0Esbwq?S2D(r=-5C3*kQmQT#!ZSQCYrb6Xi`jY8mn z95)N`Hq<}N(?)i>Vn)5R8MVBjLYu#{XZ!C`tgeBeF17mx$gdKkwUdQCfqXX=hLzm= z?qD^zZ`i51*N@&~4!DiBbi7P!_LSYGW0w<$EL3m^F;wr%JEAp4>pS?_+BV+$>W6vQ z++ZhJ%FJ}N*}T5IywHB)z)rkmu7d4BS>Fi_el;oD_=dVC5^8Dr&eYZV{h%Oou6MePp8<6r>Ilq*;;Dij{LcYCM!T(rRHiBHNSen)`|ee7O1Jm%q0O z#inn0x%}s5`TX*^wi9Rj^GVaFv6t#1FHx>vU6gi8Y&EqQqL+3m0*2u=tjD|S1Csdq z_C{`!I&<7zCUy{86k(@!N?t=~^8VOxr^6%u`0Hn%{aq94<<;^xzxvHb=fCz%I)=J@ zM6M^&chtb<=F2~L!MB_701dmg$k-K`$GkLbULX*)bkV@}oXPnRj2 zudeQJ1V?ps!ve+M)p_zGv(uCJWhcE$J%pWjXBxuZgbwbQdEsYFqBA^AP@Sx*SL;02 z*}#8EIT*oFU2T@(H3#KaPv1|TCQsgZ=bb0t`p6A+@%#Y>wC2;sXa{vb@s61n!+v;p zI-ogS5p3T*+OkcfeRZ`5BRHz7&2n?|db7MafBH0eikYy}x7bgp9PT6THwf)HZZCJs zycjke!_)1w$1U;n#NXD(4gay{sS(_+tL0`BZf-WeKL3yjB}+X?IGK>89%=v_#vLQ& zhn~kUMs0pZr;6ce)O_r*)G2s5`Qme|+vBxOjo@}&-C(HK;q^J?!=EO}J5Qe^Y|k;% zW=BGfMks+g9ocL><-zh7>{!Ip2-L%J7h?7RKXnGi{u;E0^syRA}ny~Y!-NcXa2>f_#(3SPxyKn-*5_MySI)9ol zpZs-d4^1zEO`vi}LI`$lqbRWGBSGxWNoQ;4VnZ4PPs(Y~VVjC)UaZqB zCqPq1CpYPuGuD7A`yNnUXO&*ohNpqDeQBVLBT*Cs1_bSB+|xE{OH-g-Wwok{qQd8< z#uJ6$6e(M4B(NZrg5zXMd4NuBhsCh4T~e27;b$5~UKd{Ro1&J9Ton5>WPw+T8;t;V z8hWp*p2GNHbGeL$`cSqyKYzj7)Nj8Wqu4XN>~3FMc;nS)nJnld1UwW@JdHrJnU8sX zhN(c))OId5PJ<|$2HTlcBrclpF9$a9y3=%+$so!LP2$mHuxpM;>ifyTc`$!k500692C zlE+)o8KBJ_AG!G-mwNOi+I>q3u*#U8px&Zl+t;CoeeAO@-u=^TP&g{$`AbjQkqO$1RKaD8I1PlK-4~F{oxfJG0JDV)dWD#X*JT8P-*zu%& zpLeP&CY1cMw$NZgpyrrrQQ&gBrL9?cC9DsF&b>Ut2p}f^>UFhCV&~UYnqeV6YTRNZ zknQs%_aOGwz>_c2c=V`;7%@j^ z?Vd)IV}ixjQz1MM_h}n8%|}tyKJX&yZu@q|yUYh+DS8YSU%PJbyl!>O? z4SbD#14dvMWk2zw8v)JoTCl+nB+o^(g^r&5W3T3 z{!@m$$>Ld`29evQVfegYM(~3IIK=b>7edZUlplK31jwe=93GyK0PTztEEJTeIY`@( z*1IjCaP-kXNQW`0Vl*Dlk$|$MoAv`bkT+j4^XM>4zjB6`ugf9TVuS?B!B~tir*&14oSHOs2-u2~lLc zbG2mGWO$?kZ2XXzmsk>EC4@!6m}()xhN6ULpJ3p@Y%lR+Gy;qLBV7$N?(x)Z_(n+x zNSgcNiO`-#V3TJ^!1vckd)*t}WwnRscJ3bTspwu;yYvK;FlJ7u&U@ICy}S-jeC66r zu<%p}k~Ks_62!C(Sn#%PgzZ(rpQgss3(@H1Hs@W7n?$aIb!zk4#w|SUHDaoTZKa$l z*SPQ0Zx_YJEDE0ZF^oV9uuIy#q^r|Ciu7b2w5{>0IMhix9*QTMZmAq+UfhCm*J@kj zk9YF#mm#3~qvJVFWv_L#jin_xVXXV65_hO?LVI(&!dPXiU3sv%-Rs?j$Gz$!KP~g( zNc-KJJQZRxZKER=Y`3HT?X$mG?=bFhcNO&=D~tYG`HzZ1^IJGpPxaVCRr2wMH8HQ& z<0OQ`E-g#dvFUc$gBoRCOg7xR(w2o=(l#Q|pi>=OX?kyL9d r$4pv?;>vkcl(wnX;mx#97$*&!G;q?uNdqShoHTIKz)1uDR~q;i4T*F% literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Titles#102.bmp b/Images/Maelstrom_Titles#102.bmp new file mode 100644 index 0000000000000000000000000000000000000000..63a9a7ec434533ac40bd8efef616bf74584aeeef GIT binary patch literal 14478 zcmeI2ziu4K5ytmm3AnR@10zOE#KeFc-2jH28UiNr!GS4f4kwuhkf=mtrpOa-zDl&4 zO{iBOaEy+c|MLV2e1vooxg7t#>Y1I{<&fr`gtP9zCTe!Jy1Kgh>+0(6TK@HK|NisD z%Af8`CV$}V_g_pV-|+dxi)cLYtL0P-L@rt2fRIYQ+T&5sa0f{o-6 zd}s;4^5!}@*rNY2R<}~0?31?#2)x&34H!M zhz8gLQqU9%AP+(b_P~dxPyl%lim?YiG=&1lgXj!<;6qa=fIJ8TPz4{FLILDKJg^78 zp#q;z{ZWBEbOXsP<$`iIgs}%cB=?XjXxdSrsnoP-iZmU9o-gnjo*)!lf<`cC$Qqu8 zBC}`@qGC@bZ=eEt1-*oxLyw_7=pl3;+WORDlQ(bPOp2nIyn6L&^77@& z$@AyWCyyULp6u=IO&&gcIJtlS{$y*5ekrW~+hPdZV$nOoEf%*}^a%8CpPOIQaoijC z3%`9{Sk$4PM_E|?!XUKWeO_2(zPzGH>i-KEpBokeq4c9$ESf3-g);HWUlkTbRLS0| z(6f&0qbcz4y1>Efau5M4ahjsi!<@fu%lD>?;W#C+bktFn`F_4uA-SrET-&()tRiQC z)1Yo6(=FkqG%U>q_^x5o$`@DT{4>``>Zf7Icq5-c7yEvgGNG04XE=CTHI46^QT7OZ zA3Ku-gMFU?hkg=v;js`S_d~{!NmbJ%erhqJuaFWy%_CKpbQPkl^po7h*vKs?nx&Z} zRYE^QA=cDQm}F6?;YapWw)U8raR2yuSj4`Asrb!rs zDQP2Sou#2Q?JJ~%5ot6lj2+engO9_th)7a}8RD7isfLy0VzUcI1!ugBVR5<~m+iS4 zwUydj!Ve>L-lPmQPge8fMB1U+%$bpypZ7q8g2=Qvof>2YK8(7nFg09!@>}(e(^#qg=w`Vm^Oyu>bTQ2iH1>^Lw1Z!hjwbtJ(a}T(e2j!Q9J> z;jngPo`zbt9?RtA7IhG?hKvb6p~0YnIu{kF($Z;!xW;LSuqZ3H1k2WG=*xO^;3~2S zi@XgKE5zWfmrX2|^ZEJw#r$CQ=urJERm72fyL?Z{CJLM%nlBo?(dJtuUJtUDt1@qv~|dGmWP%hC}{2zKXwk% z#91N-$Cem86wg>tx!PJ`3K6=ZXEn!XGwdge{v+zh4tW=6v@#rtYbZK)0dBV`?nW_Esl_Ws@5M~lCF{qLV;6~u< zygE`guxLIUF3#Tn`1YOmHRWFi`}n!qFEe#I9nXPfAHYT=g0GNzyJ*pA(CEu-q;vA4}VA1?=@W=NAjYsc3%$FC- z^ki%2`{l(??`&`*`RR@O7WLTn(^r4Ow=pc5X0D)d_Wse{>z$q5-FsUneXPHE-?^PC zZZ3b7n^#;?Wz~i!Ps3J z*~45MwY;bDOjcHjNS)Lz;~AHg)eO?1oX%tJ4{B4d_QH}yV_8*`*3p}nvQ=!F>@aUP z0C%i+8CNInj{Chf$F=7bSTytb@@x^l-r3&TzIXTTPCnfF>E6%8;7FsRqDyX)Pz)`z zXnILGHg*Bv78Zq;K;W(7I^Hh-RU%TE7CRNYdpU=pJ{>CErMv#6B#e~7&}k{;!htSV zP@C~Rag~`YN_7FUBR4i#3uRobC^w7Ay*9_T=T%s|IKDWZrzbo2?%mto-rCyjM`_L4 z1D3m5x`dl0qE=bvgk+=L)p@}#C3ner?%8&*Up6Xcjts?p{66wyJRdb~gCBdOet* zUL+?wTX%nVXXo|yc9IW+0aB4&^%A>`SSphav(6Ez*X1aaHHi)060}Th-Cq$bqkw=6 z%_Yg3o7q7+)J#{t!e9dtsHW67C-OxyQvQ=cm zbZ8VCh!#lnvzYv+Cc~*U!&eoSL|V!5co!h{ldQhcT^x}p&~kAZS6&QoeRSIN-j%ET z!s=81(m5Bw^d~?Dt}hBW>W-#y0rJn=TP4QQPxsY_#~>r$g;`KUd3k z)BT=YF#&D%lSFH*R~`P^2+5(Z65w)X_hY5YxXLV{<~~>2+*h6-fd!dr3;ZixpYe-@ z6KCIWgI%}yW3b?)+0Mke&d>0h%eb0hb*PEN%s+Uq!L~uC;XdJ~aNLu&A{v pe>>%)u=wr3U?aK3qMy)PEN-#r5$NA;{o)pj9)bSt)-Q%w{1*|QaWnt` literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Titles#128.bmp b/Images/Maelstrom_Titles#128.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4d14c74c76976cd16a47f3368ac4a82196724725 GIT binary patch literal 17654 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 IgRWNp1(ezqS^xk5 literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Titles#129.bmp b/Images/Maelstrom_Titles#129.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0e80599a0755dfc27597720da9d4416bd6762fc6 GIT binary patch literal 42262 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 ny?I%tnjy#kDkOu~A6&q_1jXDi2Vk2AA}} ze1JmxPE2`_s#MiYwy_czy9z4=^y^ErQtvQ!`9aSsF^Rfw%&ZPwe`i;11&MccF(e2!` zhxJVFnO-urnYbAD!+NIoOfQ+*OxyscVm;G)rk6}@CjN0htaqufo?ne@;C{Falhjfw zD0O3J?uYeEQV*$u#LfvMN{LM(k~mcKEU=!(QxU4TR5U6EJ+dB8kD}YwE$Vi3XTS#}B??=^Ms0eDNTS zU-G+o`tpk}*s?Ngv8*W#9Q)-1#)n@%{KKO^JbLu?qp!by@->C?WcQ>qySu&WbWS?E zOedq!Rim6z`P@|Hq*A1GZf|F!lanXUo;>^d>qn3N@bC{0bp>57UAJ~kUza@|a_xs{ zeB|LD;^)bu?d>PqyW6`vyE}V3dr#B2xBqm%n)aCA>vqPYtJy90b9Zw)yBf_#qfTe9 zv%9xp++|%F5PuAz2y4o)Q57~Q0xA%Sz)he6qZvwI6&OeXP=V*DK)a}bl;AK;Qio88 z`+h@NtR&w&I1CMNp{ihid;E%hzWCy+mC46t;Xg$D4~zIwfZZp%y9j(F(K9lP$1J;i zR3+!i}h5Ak1Ju@6Uu0z7*pp`u*A&$tJ!o3HxiL$1q|Mb8~n1FHDw$)hJ0|B1xE zivlo6*y|(WA72TazQ^0EtI^eHi~^Klm$?n9pa)tLy3qf57Jy3%{j(L`?7G)s)0HJDnP$op{d43Ao3+lgOWf6QB^^B;``mOQ4_P6Eua-IK;|L_4Ifn5|p zqex(Ug{WuZ*Q^LJC(&zUfOjSR5I_81%zx7psac-l0~9MDPXu2?$^iat0d}@`P=K8k zA0Vj$O3_{8|AhaIWEhlf7||JwtI>-*Xpe1LU7K;l0#0qkTKP(Hv0E0FkK@`8VY z|K$LdVWT4KA%7dN)&DC3*W!xFXSw43q0D~6dLXc}yVtpf-W> zKzj8n+{@%AvmfYJasIy@LIEoDTLIwR#QzN?NccY)fqz*5L_D&qbt`|H!RVLqNBkF~ z3yB{EF#jX|6alPSfSMbad;nVjDWawr6aKfiYZf5K0r&u!3=n_#|CXjzvEu&?Zr^79 zUsHvm-G0j2zZw;6K);NCO#uq}h5Uoy@~i^-{q6C=SK@qBMAH`spjVUlbkii3Z;tZ3 zV~qVn_!5B8{~(!OY;F<1VnBuy`vKttj5@*q%zuTd*Z4n`i!A`Q!3uC8{6Bm4=m-n& zJr>~mgn!+IuU`28vOe0!gMEPT1MCYNVg6+Sj!^&wft^GFLbk)cI zwgBdS_}{-MMD_tbSL9jXJUrTdb(`b;DN%pneFDCQ;KloCD9A5}&uIS4-%8XW$a`>~ zIbOf3Q|*v1BWgehvH(^Baqh!Mn=JsYAR`{Y?Etxt$Ziaz00|z7x@`d@{F?Z|{}C)M z{6G9sQA)a}bRXP9x_-KYumXw(xED=f1GXP-KW4NAzy&}7o;Lgd(LwjA{r@YR&lLY- zqGbNpuph{8#{V0*--b@cZgt3tz_0vG89l|C#r10_KtX;xOn9SL4Hke*Ko-A}KqQ422D1VGZ39vPWfcel zxVU&`3-CkWzls3zebuc1>Oq8%41j-<@izq^{)Y+zApo2}yMRFe$pVBGSm*z7CV+4O zKA->ZG5T5XwgAXJTY!vy1TXZH>pLzUe>i-J_Y>a-k0&8isLo>j)NftnH8B6~*_1O# zCOG5Yh)W8P+`!5alnO)^Q1iUn}?ugU*FGP!>n1;5Jw8!W&^H4p(N|DQ;=fqr}ZMFBzuZ2S)+&X+wJtB`?JK`RUB&+@ev2USE(-7uasuzS0Arhd zO3A^W6v606{5Op90RsOQM~FWHKrBGue}fM|dE_W0sX{1(@5d&9e~%fPO3?HHx*hYs zl23P$|1bQ%(FZ6QfbbWyCRe}rp#SQ&*V;lGoaxg4x(bBpFX9*YleeFEUrb*^b0GP^ z9`RS8yGaJI9O|-43hQcQgAB0={ z_Wv;ex*hxfR9Xc0>;Fa?Q2wtmZWMbJ`_FLvTYVIO3rv&fVg1p7q454u`$(d<$NxS5 z6YuAuH~Lq_RA1g?3F_Oc`4wP)axv5(*A?hDD?mY=d~U_wi2|Ay017BRz_^%xN>3R8 z@xOflTY$Hf_>=j6_^=`V`i*Y%MZyB;KSzcl$O15i3Rns17J%Gj=KmD_)%brc29Wok zA^_uGNgz#)af2$z1)QAqdw=>)CIANz6&TH|0H}Z!K0{4i*yAXw*ePQ_c|qNCBQC0(eFaK$FE!UYCmCs0vOb z5M?IFg#t7!z@Lw70lo+S*$42`ef34lFi3Y;?gmvv?eZXY20ya?2eRwh|6B9_JsCcoJLlZ=n>e5Quoa-tH^txJUlySF0JZ|k1St&E z=qO;MWY3hcQTfOMlpFvA@Rl)rfDpfhFGWM?xVE3E=A+c^E8SBlXHiWlM2xlo$p$1E zceN_`fJXh5il54<(Qy^m`2a`>x+p)NkW2{sZw z#^(o&NB$Jz!!63yH+8Q551khZHz6%Y0FecB7`WL75CueK5J7N^*#n3uAX|W+E-C_$ zMJ(m9UJ7BAWFhK`AXTtBtXP1@HAheupwsD|PA8Ms69z>j694DM|DVJCLcVF>%J`QB znDkx@Mi+_qLBHI-I{Gv32Zv|g57bxxKZ$%5hQ=tA|DInJ{MuMh7W|)c0L}ttCs4J4 z;R8G?J^ab^4lV87KnYqj|Q;>CZl;kVgG z^ac43#rnn6$@6aTc#Zq&IH+@UjT2FT{}A*C>V^D*{)oG!7)cef1qdIY!~vBLkd@%# z1l1qS6aX{1e3bqvQ9$tlumCjzct8qB*N?|uDTn&=`yNwXpr*LC0*@a&_K-<{Y~a(5 zk)ITRJHa=*C;um+=duL{We)}RD|4@Kr{DuC=cr~+j z74Lt-J01di|1qdHNwE;!=8T};;yukwC1N?OH z(@$9i>=aWj$pX~NVx=55Jh?z6HxTh#0V?tD?O^)LK)W;)as&TwNCY+F|KG9zJSFKAyP( zgAFSR@QqABsKC?yo>hXWg1}p$ZB8oKz$DpCElgjcfvX=fV6k z|BQObb@VH~ua9fIUw_D&_J??ifzDX{%-?+6>TiSj<6H^-O15l@0-mi{0K{)6&}Aa= zXa3i($D#s*i=PIlz)wU0Nd=M*pfZU(K$MIWzcEIctO)->u>jvX3K&d+`RBu{@l}65 z2mi?d{GIWC-Qx2IG9!xn83XxF_6(8#A=39cd;kqCiygr$agh+}2a)!sA#+{+O{-Tp zkNt)8)v0a?B+8hyHqYnZb&HWL$L8NSuAvUu0@w$5^bcx=E&NxJfQi5s;DV+eas=fA z+^D3o=x>w*lYt zu*6{hPu2ey4jYtll1g^GiGvQz6pXv5$$`ZrjQ9(W#t5VaIby?b7=eiu= zjQ-NC3<@SA^t)E_5!l;&q~l#fn)(p0rHI!(l?cj ze1R2zAnk3ZntxgR&y(~g)2YxuzQPfx@qhOG6$ES`0j*2Me@*NXe6au)ex!OY`e*R} z_-esA4bBH*^goUMg!a{+8rNa!GD0h5`2Rr-jQ(hW0}ZGh{zeO+_I>gJDhn`cSb*EQ z1-N*N1%LuR+Xq-Lrv_xyDpD%&&Evxl6H-2tBz#n0$}(1{?*45Q{Jr>B^ymmu*w^6H zZ$bZs@ZSghyc%_d8ejt^y`DY)&}^e$4q(>U!uqlR8+fjU{59-G9z55EIX+Ja6-|F? zxgeSSbbK{MMlCEuo{#P2eCGdJT|hSe_yFVrHdufh1SaH@fUVg8g@SJfr~o;VnhFpK zMtcC2RJH=u@4Xg4Ho#9_0Ve zTxhXe+`i*iaX_!FTB;iN2k$rdO)9;@aS8ni`I+-Gr#F;AE$9j|KYLEc#PoZJpj^i_ z0jd&Ko50WT0h$)zrm_G7i~pxVyC#0Ay&+P=dM=;*TicXpr65T)umIm2iu|Wz2_NYT z|Kk6t@DKY-{GUcY?f+}ue;~hx{#EXmyK^4?|8jA+yj#c!pb!V&KRiD;Kj`JLuva3vu7|cz;hiurUf)^8qC6Z2J8x7tnD) zvH%dkPdNxI7C?63^MoFg{~Gt( z`>(j47aIl_;J=Tp5&F3#DhK}`eBXOxx#xe8^9x?fnq5Oa51f&|=HgYTZz9@Atlo{w z@5ud6_pDFbAL{+P^-(dt2U!RWnftxIwtqT%n19y=6dz#40<8G}cQJgyli(biGMNy{~wf$8QcLfn7#Ds1tR`v2g6AUjm_zlr}#<}X5kb^cFo z;0pKa0i^&ZZTtVT5dRWOApFbt50n&=3QGP55wKMJrRCa~cz;Fg#nT6Y5}cB-DHk7t zwHZd>w9ZK_bR>*2d41j|ev3lnnK)-<6Ow{dzCyb8+Vy1vs#ZZM4p{L4EdEdV09b%k zA0Rt|Q93H8jQllUU`xTCL{5($vIOVncz+Z*=rgyYTwLPTfc8ZQ;-wXJj>RVOGX==w_gFYM;Z90m*;@V`a`R)VAe z3H=vGC+7e0_}7n%k6e~4An|}CPEx?UlMFyF#rm1M3ik6O^IP1#TKsL)2l6F#1`1sx zgW~VP!OS@x|BYWERvocaV~|Ch+y7TBLS-8o_u)IyZKUgNumH0EB7kB6iVqMfpgcgR zKtutK16)h0Qjt$ow~@945$wq#P?C3&zal+=Hk2v2W)k~b0X~we5&oV2k^kRK`M(qe zY_9)b6MM<})zKf^e{^)Tjr1{vx1{T55)bLpH6TzjJrAPXSSXEh)f zSXqEgnLrC)=+9HtZn05{Tk~^_zmh$Kd!Yb`8^A%v!13es*0jL8N%gmXHkkdA{acOy zYbl@&=s!6+p(69O{eR>C;{r`I`dh%?Jmgw|GZcWDEseopMX&X!X)K~o9)HB@>wKR% zH;bCqIH^TWw9AXuIcxLU$JV0yUsR%D4QiG^vz0Z-^R*qULLqvr0HbOHKIsD#3t&eu zX99~4U<;s<$fdH$3Z&B8x)bD;=Nn^b$5&cnpxm*@%oe>CpnY;68-_0GAW83Ca(0#_3h;NXi^O9~(Y&``2{ z)uUztC_cB*SabLiViBX!mc=Q-e%_Fe@bUc1Ls*2Q1~vK0-)Q;=;fOj15c_2dkkm>R zKt6y{K`N;Wl06c2A%U<0H4Cuj1JuMH?H+Pj)qYieTaq@om%$eai0fGa>q`>IgBPIfXx9pWqA1@C!Wt`D;pdOgTICt{7mB z{lAqjwpaIX*G_5iuoG+Ti1iCjj-7a)_e zb@0XC=7xXN@?&KeLp%WEe*)`=EX@Dp2X5eh8sv|@h4{$|N<+2oKutt#1(?TtWri#0m*CC)$>+}?6Y>-Kv*7C- z?*>@Hy#!sx+)b1F?9v-LDS&)|a<`)&uodkrKv1l}~`- zFGJ7x59I6Nk_u$x2gk1PK3yLc%raL7A=;g?80nqT1oKK=HL91cnABO*&Bf*2P3Ot% z=C*^PV}ga2WOpO?ITPyC;Bp>RJc5bv^| zSOG)K6#n1Ckt&*1(Q^ly_83H)dOAF(I=BY$EL1tJu_DFMM#O_>$o z&A~z8em~?r=wCDb4R1doKg@rP0)V?Zp}}fN{X+DZ-MhQDGdW-}%y^!Y8W|KzPy)lS z1lbCJ{IBaiL2W*%f%i8NBpa~i12pphA^y}J!0!bZ{~)1=J*)slb@1i&ucUZ+r$^)D z{L5<$0H{ydKExgY0KYQ+0CKLk|0a`}@Gt(~Xz*q9YlE=S7*^1)&dd_}?fyNYsz>o( z^8blNgZ~ja!dD*p4*MT5fpUVRB+uei0jetwZ0PRs`px+X{n%=G>=dddx44tYW6bD3 z!KkN+{&thumo-pu1orhJwEo}tWlha7kQ$lc5qzFckQJf$1O@$C!%+7D5&;kfeufWl z@s?(xWC8NKfuROP3I6c?`S~)M^?sm&XFC0GeSQx9iTjo8!2&=4x3{VTP;+1NKmPyi zo%tUaH7QQ-e@+#R8DGC35su}(^Gq%0J- z=A0nV=l!68%r)3Z>IF zyl`d2J0}*%Iyj|Kqi#)wo}E{!R3QeX;+eKbZeJng5Z$v;94cuJuwj zf%++%{1#P$uriN8k9m4$JPmZWL=BtHrqM$({$D4rAG}w?eVkuM{^~s4G#p>3i#GhN z*_1eZGMDwg9UZmF@NFL*O;HcMv_WUBzZn_SX(0Io^be5NRu&-AK`9qlsX!wSfbjiZ z02aUm@B=QOg`Zj{*$SjrIbX}&V}wt^fBU+pSYN@uL+`-<>nW&D`9I+wPhmEI|BtbP z8~J}F{?EYoZ=L%a=(p!D^gm4ekN+NGb=G3$`HewlIgr1R z?`zH<43NoTW%}&SxkBX{YLP**^SKr= zqdxz}dJ{!T2%`e4Q9xD!|JE&lUJ9Xus3QJ|i5?>9iEH_Ued2q`f3B841bqqXAD70z z9l*Iu{+EyQyYT<%oD%V$IOThf*h>UZ!+#U~BUNUE0%Y!&`zQQQK)uip6VdCe>;I8I z{4c}Af96BX^aoC^dO@9l96@D;r*0j@%&jaM`rk|Eu67{?ii;5~h~`{D0b}DO4<2TBQ(g5wz_{}^tkq-#zth!9ww zjVgEWJ}VHy&*<0hx&?5Jpu)h41nNG3q5}B<@&MdB0G-5|T60F^5Ay2G{O@SkxuCCQ z8G2lRD;QpaHr{WN|9^WI_{aYj{^#(&T58|N|10so@h?XxDM97=gMK{!lj8Xs{SO~1 z{->|WsQ>?UZ2s@{z?kiUEdcm`ZV{XRqopv_LSv_i(PmUYoZ|9J-CpPa4Izo`O9 zHeh2KSZSa=@L$G+ejGn#{$%=H>*ug9xL-c1{eR-psu7JFOp=sc-&iN|z3iVZWjxe1NTnThl;Pqv>eKNNht&|~VSw~JEB*a8`aIjB$Tg8%!*Kd+~6_WxJnei2>FSHb_wjDMOWDJY2%{EGk-|BtVf5mdW?a0*p_6$4?zIVBvZ zPd#kc%r|(CF^g7$tR`kX)Ylo|(tC?IFb$&dZ&5mThr}T$YV?#3&o zwE`P_f$S6L_w#*#VgW<}Sb$5vzn>%i>+7G4f9^TTZK*7#%sSF$PWAjAS%0Us2wnKs zdY%J)xJ>xxVS#?l2e2!cl_GxOfAwA=PV|7+pW^v> zRSIXjtUa~ ziQ8zgC94-$Z~kA6|C9MoDj?&pO5e@gulUsX?Lg!)dlekw5eTY3!zV;upF4OKw8#P}aVp|dN-$6+XAP7ZJT&-wl z1N`qu4)RBuKq=zS^##HbBp)CVKrIhIldyWbU|9fr0GG+Hw;Zc~=ipkVp2$gMSLgrR zY-JYk z2J$V#J~6&p^u%i&r2poqXOtV&Ix{DFSc%JLQCkTRe1wc&~Nj<#{Gf+vwpYR2^Ly_e*}GY3afGxSRt(^D{#tM_`hTY7wE*0n1AkQV2K4# zKN8$U!_Z4;x%S?_IFezoYyTxyvHbm`kKuTkc@0K8z^}`=Hh2LL>?KlH;L3Nejadz1`>L@ItPAf(yi}zKA5*W9LFOJ6 zSQj>kB>G=pZw*myxRDmBc>*%}n}%WmA`g&LL5T#g0GCK9zsIL09cs-l@$0`Bp=A03 z*QkQ>e`b1%KH`5VKrhxN*qQ&Y`&e(`{~rDi!(U1sqhFbR@xJT(Q`~R!ued+urqyys z{J+1#|7VClwFuTNFFNx7sqxFT0$LaRKMw-nk#QT^h}{MsV~^reS*`)Eun zKKuv#aa3WP?ZEx$ucMyhE7VKqd91;{HXB=OD{8aO35W!%)y~D&x1q8DtXbT6C2|9^}}AWma?MT!vq4=&<8RbhA7d%<|-sn-I-isRj!3q-FB z_i%o)0Go`yIKA@q??HP_?Dg4O=LD*Fpl1F<^s82&Sb*>WvIVdL$dIQ&@9q0d9&m40 zk4#@`)FrNulH>n8kp=jcpgk_+|I7Zb#{VDs$WWEy23OPfkEKQgket4(0;;{vS-(Jk z`hZF5hyKfr{(rB+zjX7KXut`8!MJ<%Ytq-q30#}gmgqeAe|@a)(S^acde~|3zq8k8 z7(}C9$`MmG^sB#ldlJ8SpQFRz7eU@)+CuKBWkA{T88gKhyx$5)=)dg)AoBz#Mcery}sFo9GSb=*jK=uKMs<5+{YRRV|)$T!x(WDQkKAb^KGZtU)9CaywNgy4nA4pudv8j0OijQ)92HwNH)v|DX<@7%TplCU(2~ z5~Kxf&9n;O6`m>p?1O*lCR?tkGk_ATB6>;8&4!;_P;%B7=~=pECwQvY$HEHqpPxSl z?Uiuvn~Th#3`2-tUcZ^u3UD)fYY~TVZ=k!Q!3mbHE^<^wpKdS1oK#p@h?!ej5D~G| zlfyM7sIq~{3RLX@s7j|<1_~g_B3m`;P}Qy!R2h+&tOh86T)hdQp2{=$KLUN_FoOTt z68z7OS{us?<~a0Hk~9G%(a;Uds8W?omqHv^U}4F8FGf93yTzZCzUt6xIl|71nnS@;bLVB8z|o6w(f{`UXC zzAV52?f=97mwrb45BxFo)pzLB^p`w zTSWGPuWr@RJj3hfI5JJtSIY_Y82pO!(H?+Yjg;tyu!1ucLw@^5ZW zI(67nM^qb>E4`C5m=aeT)u84BJhSj8BziOqX8v)j9#q`OSItO9zvkfji1wu#sYJoG zEJ7gNqIMZB{vPYu(^jFx|L&E{;E)1J840t)USF?j6GaG#J4s zDm{!9n5fC%+4B`WmR{Qu$irp8l3+z^LRz2QxRuCW&7`q)Pqv@%)^0lNW_EJ2eQ{Y1 zAyr>HA@vEP>78l^>LgHXK*It&de%m0Ij=7Py0ccquVfFc_%rGq5lPq@`FcxYbyB@5 zPp>m2$PQ4NPy$L|_m9q=r4_=zN}lb!Ep(1V6aIzt)v(ZrNaNu_f!5){-5|?3E_zUt(i*_K<58Q6nmX>f@eJ&G$I7>s^b)-fPMYnRmUO- zpC%88KMXf2@Vbrm_6F@fpOs`f$7PgD7~>w-y{d_)n&ri>YT<6SVJFPKJpk$nN7O<- z6ViPQO~d%e6R(bK9BwZf(&9ub- zzv_a-{|W#5t`N=lhgB|s&1qUp7&_UkGk;ga}1IsR$j zv@Cf(eb>`%0&ZvrL_=}c4(kQ7VhnW9-K@j=B>dm#2RI*a)IdF5HjIbktOCmOs}VQC zuZfJ2Nlrj@0>iXd@P9A6 zbm0G(t$JUG)@eFXLqdWe0Sc4*=C+wWIy#V>*#ETS+zBYu7P#D1Xh7i0g z$_p>Db}LCl0>gx>-9ks+xF#|B_AcYL{$pWa>+Q$SJH^XO$5uZCcD5$8e8G-L18!!= zZbLV_{rla~(Q(y6$Ooy7z|CE1HZJi)nnL|HLEt0j?-l2h${wGBeP#KgqjqQb^`e|O zKbX8;Zp=gJ8UL~6qx}DZf7SEnBf>5S|7nf+e{!z0vl`E8ShoNT^yB}*_lVz0kc>b5 z-lVpEa{eOjr$_J9M-2ji|GNptng93g=ZA4x5bSlkY5};;|7s;9y>8%NR^Wtwg}^^A zk+U6ikR!?{OAcUtME!0gVc)` zLTJ_W_QK-Z@DDHG#BKs4Fbk)jFi{;Tp$)T(M=Sn->;l6Tx^;4VvVDSp#P_sh{+e)) zdA^W@*e!bF-xBoe+qdsz-=qR6iBujc6I)N5II8u)fARk_{|o<({Zm}P{!yld|Lp+s z%r)`L2Ur`m-PnIdOZ+3=!}$&L8~^72y>7a7^Z(g!Km2?>5VyEk{@Cr3-;cCVc(J&I zU1EBviBd%HzcK_n5=~6UXM9)0?S;cL2LJKK01Ag;riq%Wf*7ZB&P=ATKWRJ!@V)>qX8Xy}h3rCoP&MwfbBt);a5tKcxQ@Jjy&>C8!dHh)euGbqdUXHk`JyB!3+GLu z@^4^RKM`Qx?D&@=KkoGWtIDl{s;8x1OL1JUpL*|hyS(wW6@03{`#uB{~Wd_ zFYrnY6YyH86M+AF#y`vQ5D{%#8Y)!oK1PPTSH$}QDhdkZ9cFU~&Mkh0g)#bb6mt1y zas{{S9&lcUKHuP}i&Ej-+nb-L**GTiM%j2kF<8$wox^L0_%F_9Rk+7Hf+tn{A4lmw z`_Wu7#~D*#r>snl?<23@e)2W)cZQE=d8c4@Ij89xwYu#5dg6EW1FeEdJZZ%FX;})O z^VW<#sP?50v`Z%C1-vJCXaA3!i!uxR57J9CF4`IeB=f(@{}6zTzX_lqKN5a8f06T7 z+#l$Fp!nbZzqL60f0p+N?2=yd`|CLH|D5&WbH;@Kup2Z0G5&k6cM|${kI!)MfQ+?U zN6oIRxe}7%wZCnT_{| z6d(#_O9KwG{cz|IZ}3EM|9rxO=)F97`Agk#s@2yAqg@(2p9IEOp0_M>or?c$B@AqEzw5$p`T*vCy@Th$=uaJ^r?!6exL>}%#>D^VuEy>j z`9I?EE;s7Yzsn!@_D{k8@xJl`UjGhHfi<~30O(!f7<1qP43`TtHSB95T5 zIdX!fm==oKl^rA%D=&O{dwFvyf1o$z@sZ2yEe1XFw^x1Uze@a@50GJ=llU3kPI zlm9RLYyWb5;N5%rcrRaz|NZJ*7=Wh8wbZZx#q}$^A5}hZzdz~XxF6ovhul3;O+)_w z$E3mb|6L!DHClQs{C5!^{Gajy%f){1zx@REfdFK*w=@2=AjS;iC}dzjSx3KujP6-b z79iqgn#AS-oHBdIo^x3Q9ib@?DU{wUQLVk*kQ&^uw;ix4e*JthhPEc zZk?sU6GZ}U)1w$)lj`)-`#anyx%yOcDURon>LnMb7XCA;^~`eXWa#n#%l;hCJ}?9S zRpxp5ntPB1umf1*{1gFH+#jkS=>Hb)%lHTSzY6>l|0ivA{4e~I4+x~|KmLEt3*Z-M z%kmvQg7BY~7k{MG#M|=8HENz_BjfAXAN-HUQ~}Yk*yu{{5ZF+L6)>(?1Dc4{umSkt zDBIEQqa(DuF5Y`Ch4L8f@^}aTit45ly`%GV zp8>n3;qFen>o%ZT@43qK*Q$G?(ns7ck3YCyADxl~pomlcUnVT@&+}Kfl|GM& z3rN>ICoYg~vWArKDbiG)K+CE)5&;~x+ii(|SAIU`UwMVtpLYldA$xsQ2)U|6>qGQ5 ztIiUFcv{B>?vI{Cc93c$DO0fl*T`RkrK%z_mK57}jQapoQR;y(Xy>!K0(s=7Cn(wMj&)u!di6=pPe$v%nv$*gd z@xS*A{^y=5TM_Gd8WDx~U*};Do(}v|f06ND7yatI`TtYsFWnMHSELUf@a4J8|Dm0U z|M!&-_{hXVNo&RShb`p=0`GG8_V$VYohQ)ks^C<|kFd@U&ks+??VWbVo!~{zqxJ$r zwkwH3qfw24e$DBDlM*OjeseoV*^c`!B(R>ueL0`r;1}HRg2g3;c}=gV%lY5_7KoO| z%)mRgGO81Gt2p`FhrjhEmz;$bwIO`|_d?(a{rwBxs%2LyXlTANWG$SJ=I`@XE}dSD zPoaZjC4bySbKEcGftBJq9L9~&rpM(&2?erUUM?|}pGq$AzwXg{v0isABgVQ^zUg>9 z2kX73j*sQ@{1Sa2J@~#Z`Ud}3=D&OsN9Z^A%lilP75Dp-W9EPP@zTZ)@qZ6dvaC3t zN74V~68s;Y!T*sLQ2l@K|5Nin`>?D!LL(I=(4a=-a)5LSwINg^;uhj3gkW8qU*`_w z>wk>2kGaf{|FcShl-TEfD}MimqO(F|C#u|IDis-lk@A#ySw84^4|GczCVn= zxL@C#Wcua-{-5&yp}!0BJgxNdvTqO}2LB(E|F@=-&F2{Mc4he;%cuS4yaf_UAm5KL!MEd8B?Ja)2XQwy*^dSULsXwD+|@o>Z`7Y&zDEA4b2w$Mr`@ME z^Rh+QDfnOS@4Qwke(qN$Ssd;59JT<6kn#~ov?aDTmc8EA9#oU;@v`wRJ6~CZbi7oe zwjQd%(%}CG|C?5211jtX@^hU_@PBgt9PvlkXWmcTFVauLA;NDzczpPVcH6?cG08V3 z`aQ(ImzJ|ounV|k;{RB)g#Vu+pQpk9;3c?ofB5|LIVzw4?i7*d^l30pMK33~e z)}+F}_K*6130p_jj%QEd-#Gusvy#r=cv z^ZgR3rs!P^4*v7=8T}F(_v-b2N(q-GD@*wQ61dM$@qAStTPpAK<4(o-zTE@xub>>y#3Cj{DmW4j;6?VT|}c`{}~D@V|mi@`8KB_saj9 zyYaA7{NEk(h~n)lB%Hiw=BN(Re|34lc1Gi$_5%E_o_lS%;9qaZMEim48&tnquV_In zMczUTV_GDu!ssNjWoj=cX6)?w!#Z{X5yRl^#f^@0ERV&2-)$QB>@jH`?u{*SN3lU# zBX^8fH>)gPLNg9&9EbZ7&!_(gUPJuP>vbjJKjMGRjQHi|YcD-{*^hZHG*|zhX+7mI zoh$y=m@0q@_umu$2luZdKVp8x{WbLS#p!R5|2KQY`^G6ePrJRn{k^2UU^nIv|5NgR zqyf{G;r?Dn_*Xy}7J!1o9G?G%|! zb2cV8pEb(;gTmZ)e|fF?e4Xu?97m8{?*A9zygueFYQ@KSyl*@&duau0>d&wJxe_ji z`v3J7?tz*b%Nwo&rc^f3ONjM`DaKul=g{Nd`;$ zJpyctKMO2h$Mz;)Q@^${{;lkT=7zQbdmVZGh?)PqOmm|x_}F(#o+;UXmf0xZB*=_= zs5)r~JjVS>#O!%}L>u5haDEPL5%w94?G)rXt5@TH&L8s~!#dcy!H$LBcRTXbp!gqi?}z$$g(?8ir{;eiQ%D!4C|LcEITdn@at5$8iV5E7N^zFj z`F++D2U9($eU+KhC#bZ45_Ih4b84-w>1(IGV%htr`&l6Vz3y=k0Ft2#%+w7Ndts9r z_{VbPJ1dHTGIXLC{!lnKRur!$PdaRre*dF zu%Y;KwJ(fiy;VT~nE5|METk77Akjdzyt`}WPf6Yi^^xrt_cIv%-w6BPKHm8j`A7Wk zM^~J$mp81ty!ro5T%_XP>zMzAe?KtsKm6b8?4=H2Ld+6Ih@{Nv=#m~j6aJ&X`0q2< z{->f`yh{A9w`YB{3P@8qGUioivCh~`N>WUCT=|_EnD08Xj8BCRjb80W!&T5n72hBRqSUL%hSvR z@yGIf!RULXqfL5JQy)uFGRi?rHB}?e`A%VCH<#C2Q0tB9rSxZCWhdDqYM8y@DHEs)+Lw~3y|zUJQ(qV>JNl}YL;W2 zG5c$UZeQQq;Jtq)RirPFx?o~UwcW>8wk4D!&RY8)_p_YRw0v(!5O^cv9?(80@8iY} zb_|i7HrCXQxI(D4-%dJ?@gvu_kXegKCJn8llKL6tnECnSeCw;NmU0RqQc6bWmKv4o zQiI5zWEFK@JSo+O#xpQCruzs-NKgt9&F|!Y|1rjY=iB3NcXkj< zn{LIV_a7J69piuRsWg?Zf%3Ld`1i(t?|5&|4Zdjsr2IeWT=thg&!N`tT(tZqZVp!G z1v1P({y!$yF@ewj%lJo)vNh>=-2)$?b$4^EDeVF%pFm`spRI9c@jvmTiZLufbGz#?ikSsV>}6&b7Kn(av({1*_I(+nH+`o zpY#Xktu365zl;A}Ch$B>O61l18PxxmLd&aZikzmjE_nB=x2bh8_*aaT?r%7`#{d76 z_rFsA-*EXrKBzDG{=*dWKNs^O{NtU|oeu4KsqYW}|9a8I|9{%qqgy%^9{6_(hk53n zz83#i_z(YIu3~L0R=}P>+Om{0nDD=!aKL%w6gZEkN&y;JN@a9BW>B_5Z`M?2j_Yn( zmdYeAp>`)}|GUL25<|)X7~-d$PIZ0a{T%;$WAeOxjX-UH+-K!{Lba{J?(P%SGO%2( z8~e{MNi6qWXAxF|?RYWZpZ{_1OIkt+|2P|QUhuA76?MP7XFHyf-%QWLTrK_&+h1{g zP(X8ech_H>%-@|&wfsVV;r>9sn4b{^K>oavMZSNrB(A~!9|HR1fsWx$^ZUoeQ`{)t z@86UEk8Uof*bMVO_}6l*)s1T|{#SE9?z{bf@`ZVSWF0l_p#@e1{{6W41^JJtN6;4t z-w8u;exWDkYRjz2du-g!F^g-ZhEYEA|7b5>Y<2DCkCe9Z{~Cl|N8W)wdF`yJI9|1( ztc$h0nIMH?Nw&oI!@Lfle&OU&HG@XGwoqZD`a-$|iapg5g0~0Mnmmp~;A6_$7LcUc zG_}2C`N!@)ABr&lr?hsB|AY5yo_}mZ&`R>;1|Ct>^HrVu8|dHRHLczt#sAlD7K;Dj zf4e5&e?Ryifg=8=jrxCB6@$+HwiSWFcp!;iW;#Z#Q!prN@uEi_q3o}mVq^@h0u+P# z@^lw(?u6DKM$PKfJf96~zCtKQUh?%C+egatDbJ65XximB5`4b^Pa?Mbg==Fpj=v71 zOEK(scz^B4{Xb@>Z|kQ)kSX68}4!!4`a)Tpl3*>Vxc^pGiF_(5s5) z)u?{T#GYEFbcV(MuTt8{>ks_r|5+Unct-zMnf(*@JLb3FfBbldHuXF7(Xsb5@ZT{~ z7W2SAc{?pHt^)sh#38QWivjsRZDD%Hp635#E4+UaR(en#AqvOshlYGTP%Vg^6Vx7h z*KqIoVL!&_-P7)=6`)JCk$RhH$^B)&ICDBb<&p>Pk3s*5C}OT$FCXRWk9fh*x@bdNgxCja02vxN;G2I?dd*HBf)x(e6V zmpwUTe0BQH%P0ga|3L|I9|_5xhE3ubfCKp7kNd+veTx4N|F5Gzi(S8s2%wmJgnxk9 zX9E2PV*Upu=12Ia;{KQhLTYJP0|BvY%n{#V_KKYfeQWcnrWCgTwT1jRd%@9c$Dh`%*ZyaGc`f@Yd$`a0 zKnR<7LH@tDjQ93=N7y6c*1#(uQizz;+X%d<;}Il13^PX4@ese-3agoxDt#2=ce*I9 zNA)DIW6SWf{|}M>8^i_vDco}X#c-?~U&a3b+E3y8%UL_15ceR4xBU6e%*}{aMxh+K zKl}8Y>e5X$Ne$_(U{p`OiC&cFA|$@N%#)9wc28N}$871zc(($h=rUaF?>`;x@BcBL zdHKhE_+R+nWC60lZ=ip7S0c|-2tT-=n!d>RDdrdU1O0oQ=d{yL{LjrIPZi;<(IfMp z`JH+ApK#DymcL>Tu>U=RD|@RhvQ$tj%7Aqsj@U=fw14J*6eijfv;dUQ-Xd|b<Ec0g|3-YriKqaVBrq>bq4JZSaCVZk3DcLp6SQiWViEW-|N$VMn|D6B(4gSwW0RF=Q)X}ec{)qX%O<|wV zFY`~jNB;jV_5Z%41fKA}SpKZp&d*`^c~X3*y+=-uR!A#St&q zxA5ap*8td6tW=rIc?USguarVzKvrd6i5U~$*E_hpm)DnpRUS=_7L`Oa{89C<8i0_O zw5i2tSI5mtT-D|wNY~&1|exR*!VE$I}#};TC`1fEdw6OiB`|yJP znhFT@d2CpKRzkmdpOjCI`JL_0F~5Wlo+Z34_#bBcgGsGRm>1_WTD;`@s7ZfLb+5Qd zQLXF$CS(Mlj^7w>B^bls_>aAp&I!JVSQ!B9wFg~@01qW;XTM~uTkXt*4mjyd@qg-HK;qYH;tXH-Klb7)s)^xSv9Skq2WX-Id%IxD=6`ui zP^&nf9fzmx*hY6tI~;vpG09*499QOu#p36mspprh5&tz5A}4aLI9`by_Co%8|6d<+ zP4D`Bd__gL_+Q@&!4VklKjjSyU*#R4FXzTlw*OC@KSusj;XiFBH-as2DJtN`2Z$r# zeb}?Vwc1q{7(gPpld;MJa<5Xtf|VS zOG&6=%Ov3!MiDtEMqCVhsGOw%D$O+lySRoK|76!I{BtEKKwL2Re@@X$ZBjEXq2Ft8 zcwu`ba+Ty>1ry?b0Y9huH{2V@2lNVM>jPMKtd`CRZ>tC5tSlUZ z^*&hP*DSU$bMLR>hU1ee?_>QGvrTufxV2GC9wd`r<6#clnOis z&l3g;|LM%wiY`6SX7OvkWVh2XwI3Ww&dF2IF9+Dgfa80Ef2584?X)GU;~$AHdys^hq?6N82p9Kvx41^0L-D@?K>UBnpHj)3p79^oC9ON;Ol|UO->>6_CW*Fz;5Kotf5<IPH+i&z!&;K}L{*>_(!Wo5rM)*JH|G6YGVO{V) zIe!)d|0ICn{|f)h+uiOSOnk0=e6zaY`Vf!c|GEyUBA_?;AGb_h#LEKYL8_1yBIgQp zj%Ytn$A3faYzPY?IygVzTAjU-uf4ebKi`lUK>mU_M&s|5mEsh(`aTr`1@DtR1d=7^7DiV(#rsPVs zQHzDli~V)BEXTWh&*|SU;r~~~0}_?+pZ))Lom0kR#?vT#pVQ~rWmmn-o$>#X^E0oz zB8p2djOiD3kUh}f)4gb1s*{^8~Vf^zwsLA#GPUsi^>pFgmDya@D*pYKJ`M=5eNNdFh&`o_wFS0A3Nr!h#m7|v@`$j@KQczo%TO|^f+AHZ_fd+(|JnR&z2D>y`D+IdpK=)s;&p~syi6KrK@@oa=P@8S z_`htYmGMCRl8OIM$wEe{Q1=1<^KRk(zJt;0>pABlZAQboYw$nk$v`~uzxEgZ?>Yak z^KwkT_vWYH75_hch~OW#5&n_Tzb)o(qTlE=Mm4wBp1dCHR`q`pVCH|)!YtYU7yoO^ zZbFsw0dK%RzC*ShTDN=reDM5K=gr6AQ*a&0UoTGZg^?k$-ZOU2*&Tb>@FMxktR|>Ij%XS<3vM-^9~!770DY4&a}qD*opJ8BiVa zf0Xcj*+0o6`vS!^IC{t@o&x*!`kn9zhp)-|fwR5N01Zp=Key+%<}z~z;?-9VTZUGK z%>Rqq-Mt;*zmK?P!I91voa%MU*QY2>!MU!)o|J!Y!Y!BeQ9$sV&(AM|R6>rS)MzKS zLtr~LWF!8!1bz`Wjm3CZ@P?`$p?^k8BK(ZFufp?So%av9e!5?9*J%G&;m~z&`-%JA z{y+zDZzC%}xR{vdcoz2KP@WwA2mj|*4YjDybprpqQ?=hGwji;rW?hJ1H7RVrYvMoN zoJu9beu~b1SN%WY-^TcFGv=7z_52O=gAnn*P`djZ4I_1sv{iLy!nllN@c(Yc>#5oO zSR!IOSU(Z|&treD760$NX6@@8&ZFGD3mP@z9em`EP_tdI5l-9VjQKx>iB%F`6x)Lj zz`SyW4abiK#R+Hs47M2<#|P;0w$UmkcnwtMca# z{?y-BB!l?VU9X?dJj$^cZ5*@8{!rA!C5ivJZ(x~CKJNzZ@2{Up!jpjXpe1A8#iGu)lA#>Hgq<_b@q8h1uXedHA)aS1K%kBR%Z1t(w*OQrwR+wqJs-F+o9ZX<|6@B=A@EQ9fBu3V^-32SivR2QCs%01 zcfb^|Zg`FH&P z-BtfTjx7HdKfigymDH@~IP*W}rXzS1HBoiV{*EAQI)NFc&kbhn(t5Qbf=7+ z@)>8u|Gq!1#Z)K$2mkW_OZWPTt^*lWM6~x?8$Xp{B!RONhg9H ztn=^TfAU}IgExf#DekxT&z_3^Q7q{qQ(!zEmibEpwiC0SaE!G8{|=Gnh)ma&)Gt^OPV;<$WIXmgK1O5ww|3P2AYTvAniqUR8k`3H<9;Om?3JheqlElg zmOhdr)Fw}f!ah0zJGwF(JvdUNn`U@@RXTA0fheDT;-D}0OX7Jg?`8Vi8-F2VdtDGi9)BW`TrQ~ zj@r>`>#1x*=lJ@~&(x92|F@|pr0Zl~|Kp6kkK=sVPxv^EbwU|5*g0`tAYCoQ6}5y3 zXR!VJ_@qPr?**wG*$TgZLv>D@j^QiOYi_=^MJEw6TH&cMeNO++9Byvr9floOKPCQ$ zv-5V!qf{!qy%K5Jz5)Edn7nx-{-@DP#y`T1L6Qpv$VNYJ;aB-@ zjTq02etxsx-;DjOQ3IRsq^)=U%0$HfcX00XT>Ni6HvYl&n-?#*ZTbHvpqefflbE#E z5ae>cKDGrv0d41@W~`GpkG%L_!++YYy^M=$8DXO;z2PY35ZJlLF+oR5qH7D`{Oo)59PGhE|8`4a3u z-j|IzP^#vH4`Gu3J=I+?MbAf=c-2Q}o$CL^@v)ut&wE@cw%u_aZ9^5z{~{H~|B@_I z9rd9C`F~ag1q+ye#73y)I(~~^Dv-Fp@IU9nTFC!LT`U6C|1%$1ZTP>_@3Sl|W(4P0 zhtum9ZzimnvLx|SrGv1;dtEH>5jbBTLzL?Y=7?WDfkelD$iV!sVr`7|<&)8n=3lMh zX!P@ZaZ4Q;RW-92?Rr-5f7hD4)(c=dQ~mgAd8#* zqQW`u%RV|5pp)7{mb*oz*#>X?Dg1xoR{X#J?ODsO>O5(;djCTe|C|3?XZ9_$C%vTU z+&Q_#e80tVI=}h97XKIgBdi#*z~eWIJ#R%^E9hT|`;!HbePB;ih0hzw|JP$Mf%(qK zSnuwuE&%x>K5rq8_cuCczp6?UCyOPE|22D@L_dFbOKbtczT`-2x9kM{Y>uQR#y?*W zbpIRbCCJx{t8%rxtSjTu8~<0MX)2aG+T!)Is463X{7L=OkcOj(^8-=wB=pS9N9lMP z2E@+*U(BiEb>r69AM72z&ZL5ez%sVP$15%mtJ&psRNgOAKS#0UPK{A`aqUI&CA^lH zp6>0yKVKd_P}9}2zv}-X3;x^x=lo-i-{;jPoln>4)8XbmT@q?p9c9Qi_<2wUdS@a3 zZ<&hUgY#E^r3&JH5rfdrk2oF+u+IH9Av(bOCj3)O=6I@Jq!=ljV-Ebo{}zI`olrLr zSRd}%NmEJ}1qe*bN5I(kP>5_1uoI{R(v#p+ZU|^Rn>$4v&W_Wf8qGw_@5;!nK|Ci z%5|O#|7BavHxU1~&hFv=5Vz$hS>_?3UyqG>tKxoXv(|WIYp4mTV*XeBFU^PZ6Lwh^ z|6|IP$+M2zHkAAy`>Fnq%HETa-w|Lh*@(_%PoHen`7{atO6Ci+aOO}xy|(1-GTgMu zr2}V=ewhnne~JIg3!iyU`oz5EzK zNOkn7h;i+}pU?MkMgx%9l#!LA(bWZJUtPQF{|Lou&1P58`2zd%supWfs>brtKk$z$ z6`1Av&rbf#7sHHy&UuWlu`}z_@{c2}IoJUdBKTi%KGsofIea?a8<7}FC<$DU@mJ5k z;RU*H4!=bduA{R;5|^{>yB+YaC(%fd`MA|OH2(1^!^5jA``OXdlz|&LY;sVhh->MIkH2icc5uKih>; zgdIXh@ZgO$JU$Slb z08$366A?(J{?V#p?32-t*gte9_Oo6+Y0F;je z&O(U42ij@u8OJk!2qD;=)G1Mjk??QHwOTI_x%pQQNT=-z8vWe4qQ?4P*625+Z`-+mqnKx1uQ(vS$ZQF+9k7n z;`Xx4yZ2W(bCJ0<|AYTHKkxLDjQu~vCW!yNKfHa~Y8~i3y_19XpNRkMQE?UeKI!m0wd3XghlzLI zpmTU8&x8BnOo{(}f7mC*8SUi#2eGfCKSMgXf=vY|Vo#1=9B%we_>5F#q#%!*oy)|h zT;QN{GI-HD7niHBmf#r0~+wbE?;{%q-62~#bawFl$@*-v)hEMOU zSbM0FjekPewBgr#|6lmc-Y-xA*q-kIAy#|F$iH&clJw=X5q&{V^&|ndq~h-a)Yh%Z2~z4bG&DR2=%5q&SH0u+>vt!cc0b5lo*Rwhx_AIe2(L zjovu!ik`EC{}%ScZG6~Y3F-agXsyINRS<{b|8yS38agA(!T;g^CzD-Ae;ECh2w)BU zCH_x@VEl_w!U7Qg_ojGlGHgsEuuJT&an>0P$Uf)gv<>fBdoFKBBxwTwJ!Blc^lKjv ze7G~tw}9VOd@f{S<^eu^+QNq)iRsx!=@{?%zwpngjsNA{r1dk`Bg-m^R;nMNkOp3~vtV!{|dP7z$ z;d43uKWrW8bJYij`2VW^_m*4E)H)#lulS#Je4mar+=X%`cf|X+c!#XfHwnDVyyi$~ zNI7~h0{^wR4haHdHIpseulYg-X?3E2><6rS{+a)KhgH0;pef-U{1dnxg7e7#8~@?| zqo3i|x9%h>I6mVY($J8iS#kVqNUXf&QU?ExZL=$S=1)UXkucu;M+4w|&NFEV-}ngY z_{TE8=BwZZ|Cf9TNZm5(VkUu=|0Ju)jHdXXXL#D#nMOB`?2mGg4+uX-+aUMsaB`h9 z-kFSNSy?F#r|wKhLlD zzfw4&9G2n#xE~OTZ=k+RD*jg(C$6Sc4_fel_f%&=HO&9LgNPq|eBys^hwt$Y*c$xr z_+S3NrNLU1D)WCL_9Vkf31Y5>{yGIT(J#x8hQ$86PukQlfpOg`UcFqrQ3wb(Zg6J) zk7a^G1dVd27K=UQ*SDxsX-WPnREgo1*d1-KNmdclXV(y4DTIu#fcPaY_QW%u-Ih&B z2-Oco&awXPkFMwLUn);7?T1uJxboVU&$qnfy6)0NN{|K=fw!!r4(vRiNaT7_dEz9v z;eYMP>9o7}pKA$yG=$rmzV0XGBz<)Fl63`z!z7 zYPYN7W!9ZcvfbG0e!Is1b{)At=NX9q%djf+um)wbX6nL6f6|!MKwC@ZkGK+TCCUZk zCtOZNA|HPg+BX`F(el1TE^VYxi0dtAEoc1C!M{X~Kp8Rkw8ptorb{9rh`5@a(?~Nw zhOt+6&iipbUbn5`UtjvE4cK1eU)SY4d^~ys{s~>-TW1NiA1{FDV{S$GcM|*uMj3a) zL9zjEQ^cK3D10hA#Q!l!0dD4_6#vs^kaw2mh5v4yKYb~DBAze_lJMq?!9;} z{>Numk9xXqw$f2nw{@tFvh(rAe>#qCH9H4W@qavL#Q*s^`silDzth>0uG(#AYH)v$ zf#d(=7MT4N^J~o9pU_{hFA4zvhsa!CvY}!JNfNvn9i(c>jtkr=0Zb}a^V}%gA%hu) z{f@kOYk<&o`4WKnK7IThivYy<%){))(x(@&@CQ`2r2c<( zPLypypIdIiThkCQ%O^f*a3KJ)-*PVRAIn774f>Y&Xhdi4j%RjGcF6-?@&CbiC^SMWY4(-yL!_Rl2dAxoH2-b}oSZ5B^UeZ(4w2^wZYBe-b*H#mNfy zYi&V4JBCw{@js&SY?K3na;RsKk4%^c4OMP{Zq-%@rbo;}$(5V-M!9An@^V$Z5ptIor^WF~j+w!RF zMDKb+yzQnFTwe&*$Kw2*K+?)iC7aNc)FP41NT$x2*o~gD;jyYa`z6Xw+X?~Y17o( z?hXm;^@#=9hF<@G+I}nnqX#K~@lS^DG31Jfh!%(J}fnEVcc_|LX0BLH&tMK2TSH z*@%%6Rr_RKbIsWh&X6(b8C_N@rq44PL(>M2{?pv_y)2>meGVGJcZ6RiZE{BMbwU7hxhmYugu)JHvp1Fl{Ax^#Qx5m znd^Jy%FNM_6%|GQdX_S+(F{!g<$cq?>O~pp?K^sTE&D(D3#9*_{01dZC6MFzIQ0El{zkvUn zqwvdVB<4RP!3h?oQQfEQ%o(g0YW~h|ll<3vqJPaLivG{EdCm{21^#$aMgJ_6@%@#* zLQS~?YHR*amoe;rbQbP2!S?sxD>e~(A)b%8gO4A7`so^HpgNUa1^p+o&Tjqv_P-ee zNFdpt{!RJ2sUP_t^v@`p55)DzCl7EawmN4Bx%dmnkr^yk(69wOFdJmRQG-(*sB#RC z(47ry_W>ed_uD(3V$I(F$m+j*1<+@_kI)7=?*2h&L}0+h+uOIa>IG7t!JMZ51plUdY8CTGez64; z{qq*Gcj@JXf3f1Iwlr5$eu^6~{liPH6%EPr*!RHyZ>E3Z{}U6Z1!CnS4Q9?YXAJ`6 zzsslj{!kZQ{uMFc_Pggfe1UiW{OJQ7@N_COjgLgNIKUIA-}--t16Tl9_6s#ivJz-% zW%^IeBdCM@$R@OSR$*in9_U}^{L8qLf~5N#-*T5hy)x=e|Hf#mUZIiesijo>Y~zbx zs87%NYn5-37IeQwIb#4fWM7i#iy3(0yF3s4HTzOh|FQ-EgFYYp{SF{#o&cCF&kJQ# zUjLT8kiaEx-v?dO27Lj4%YVN~t04l|Bt{%YhE$f4jEV_xnd3oopJM;}tJz<00sV`k zGAjc8|1QTZPv`yva_0Ne|C62p{UaPi|0jB$``nZKcdi`$k2BN1VztZx0=9+vg}$*> z@?TV6Z=Cy~1p2J_g%vP5#ry>7G>|Zoqf7P_h5qdqF=0)>T^xTv`Oa8w${j*Ld z`nKLz<3jx*40H~-!J!O)a-&bjPf=CTzb19}KY*9wXxe8w_XW+XrJ{=;A?QEDKU)FU zKi!?5pT+uF7<+0oa(4+ia(Sr9*16)BF#ydmbYIA=V3)hQvC!Mk(}HeCcIk*&(LTJr z7NUU|z+YVg`2W)v0UPws$fpVM|37-6%*dZfaacJ`u?6A(zrRcRzrK(BfAc?SpyqkI z>jeq&75%?_o#cNJ07iricI{iK2E62d+5&rcQjDbe$E%FBD*2!EY&iVVK^M~8wPeG~ z3&5gSHPd|X0>#$hy=#n3fEF7h5iftS%~%g?_hs$bCki+>a@J;mZ z7+vK@?4V{9&+W$^lkNKLe|(T$&U~WCo~-}7KG3Ro7XAhGsLas+)A#ZJY4S^8kz)%N z7yuzgiB4wp4zX{r_+D|K$hk&!+!> zT%*zuac%bh@&+@CB~yiucNlkJ3$PF(avq&s@*n97&~+aqlI^X1P!SLYNid_FcrvZ$ z`vKiR+(9%?p0RX8lCK0o1pKl2Q`e6B%#i=d9?#$h26tz35WvW*96wzDKg`5FER_H42cFQmz+dk2g>M@Z&fLO?X*#-=VjV>L%4}#Di z1_F!-i-G>XVNfhM1__A%?JP3Nfr!kc>W(AIfxG7ots?sW){zzWqJQ=O3t?d}^qm}J za!qKExOq^1hx!T1tT475@1cHig2`Wl{-vx@b@}W60giwCZM|HW{@(#0#o^G5$b8H< z2?sVn4#UH027g8W?(w7G=;reN86;Z27f)GsqwpmDKi>cUP&Ji{p7ku7DbL86$$qsi z53_m@|9|%r(6-IY_}UKqnXU8s9Fy?98cXl~_Ag#@UcU+%#6~HR-WNB>CHIs0Jm05r zi3LFakEinU+Q;+p3vyZi7cDv7`-X`pOJy3|A4kx5aA<# z3HO;9^$p1J@&Y|D`6Un(mH!{7d*=N$Qe4PU2N0*TnMD*fC2dbLEshdH6$+n(o|z^r@Ph}e}rAMiKL=R0Yyrr|n3 z&t%JyeEOZ|w$G*b;SKcsn*dtR6EnAq{_j4pp!fW}c#1YPaLFBQq#T!{k8i7M*E){; ze?#6gZ#VRx&dVD+&Use-2F!@M`ZYhV#V4e-va&M?8pd|WGM&e|vfH^51Z}R5S}!r~4bR2OuH`5PUu;PYgZo)7YYa zDgBB5Z(xk%3J1}%|3sV5&jzLV>?55`IC}-zH&@^0XBD@%WBmV5aEY7u^Y`;*;!q!@ z`lavRy`^I~jsdj4$r;U`?&m8mg=RNEr?>sT^L~C>?*m+Hg%nF1^%k4Q1mq4gs$HsA z&;9@8ZTnwwip|&}=jHaH+eq?1=$}v*l-IETT?RNuivKhCp?+B<{)RbvTmB0Niu{j< zzRzo8nS~T2DF@OlPyg-ZJGpg)m*KwE-VPqA?$Ea6e^Q`SSwCm%{ofqdC;F$~UGiV= zrTgA%WgaRQWIJP|!P~Xx-^S@2nNeC%XuodYy}Wa^soB5ek1=UeTmFYN>emZ9+*IeM=-8F~M@ZoHUI5eF|4)8;>fV4c>ba@)K6g<3GX49UC-JLYXbHDE z;ROT%KEMIqFK?Fg-ZKNJdiphPfYC&^XfEmsTF!0=F2}L;#(s;$0pk1dJ)s62M52Fn zI7j*Uvg@LPl{J+E$eg?(=GdfcpSEQ>&TI|m7tYv=~gVOC9?H^S^FHk7q&0Y?0 z`afU3M(O)N1olt#*L&eYr~qA`-Wkz9CfiblO`Gsq_leF2{=fqRP(w9>{w34F>xAVP zcXEmWHhPm5lea&;h5s);qWtrekSy{x>JbJPFtharglU&RFv-0>dzp*SKTn00g)X*2cfBU+nQKgruNfBM03_nCv@`XKpxg34+y9}20DSts z0|8{z6%LTSNr42D(dp5vv6MbbNhs1Rkzask`~T%%-~{1G1JmLD`qlmQ2JR5_|JDki z@8tVbRCxe@)IWoNIHaP$pS9C?|F@5Dn<_s)pU$V>zmXG#>dV{6>Ya-jrDmXd;s0y( z{wdPO^bZHPW8{wlxDWv_Tb{hb^0-)Q!6teYS&#L0t!N;PW@6x46Av(9q%hvk%Z(IF z!oxxjqGWY>s7ZYe4=MDY2D7y8tLEi-(ZAOJK$o}vF9ay}ea{Gh{7=Hft-=dXB9m1} z{#*J3^#p#ww}8IO0fZ;WAE+NEie7==?CwE9@qEAL<|Wsg>8k=Fav8AIVoy{NzhVo>BuNF375B)eHQs z20-m%`H>XICzL=1yng#i2yp$iqdtXz+|&K_-7TWQ7c5=M% z5>YO{%OrYC^+|ipDPpuk)l)QM_kR0a{r{AMr4vF!s-Kr`AOVR0z&{Y}Qr(CCiNMtA ztlFkmS|mfj-%I^eLe#JIuu=UmJfMCBbQbpCP=7KhCR5-)llMNbw)q9k1FBPOHnyZiqy8;KCsL_rqiX!U-W-cN}unieX1Wdl>RSgaiZ_~ewP1Q zn10871R&}&F$GEbTl+86UrYb&1O_$82yI8Q!pa{UU_mTw!Xa~jEcpWk(Em=Ma0+V7 zv-}oVh_eCsq9yLC(Du|BaK`u||2?nA8de|gJ0JY;Owaqd;d)RH+bB5hD4-{7QENW zr(b)8P*y=@G@%y6eD(U>>vyLY?^u~PgC3pW`j=nnK!PjGZfAs`fM34^Du~)9SC@`; zHj1Y5sZPJ$YatAlWi|YdPuv!*`@W*~(ng4<<^SEu_s7|)@EzU%ZF9`ppr(K9gYEm6 zk(!;!A_`oSH7AsNhyzR{`(gT5be>A~L;s4b@r#lp!Ae{~Rg&%XSn@y1JylSf`sQrk zi~eD^x~@5?n)@re_5=~p|68dLeot?^M+}#c25rLnCcXaQ5VdQAQg^F`oKv@HY6yRC z^S$X_w6CPj-U~M7(kBNZlf^q4`11us0Q7IlpS}Cx^z^$xfLC9C&C0+mAgx8DzyA7* zmtVgEE%<+RddlE(6h-L?NfgAMD`d^ePT2oR*1DxM+MRI`Y^slHuKmyW;5DI?;m>-= z`TD;7&k!UZ0BGu4X!6nX8?I6uQv7L!~TT>$+nL$%eZU%pZn(j8mo0}ClUUQi&O=k z1NFrIuO}~h{o#NqCTQkst<|u&G6MYem$w1>JC;ip&>1vImET;wVbwbUoNNvDpb$|i zEkw%HZ{~k<0rdlXf%yP{i~92@Vn!6R4DKs&fUjS@dUyH`4uH6@ouCzitrOh+qIm+? zlt6=v34=u0nD3D7m?Ja-fCT}7{EB2x^>3T{QIA>)`p0`No1fuZsD6&Gk-=(e-===(|0VJJ zSkA7Xe>tKW*6&|R#w$=;cR#$Ndm=sYQ8RJ@cSA%f3|uBgu&M%7jeqeT0q~&L?+=iv zX!ua`1-i-A)z6ZzKV5HrUi~c48tOI08sxItbp#Jv51 z;uuq%ex8o7O5UhQB%w*5M$|ahyxv3qQ{2-0hOH3oBTDBTu2NlkJCOga`_51FPb^VL zf3yFB0!jOCbbv4ffwI*<(LV9+NPg&&#ucMC@Fnx}zpqW9|F@R^`lJixz5RQlf5+_D zVe=d0V$hlg@Q&kuM330m5;e{Heh%=-P+PGk||;VMWZ-)&D^|5a<)+*)bEu zkBA6Rj<{okU4SVbgqT4xyKWM073s)G?|(7#g|Eh zvNN492tbm+VI~rzfW;=p)(L(Hx_oIz_5M38K>&x#22h*&=XL}Up#Kxl7bLR&AFZ73 zhi+i{cYHwA{(6pgh%=5-Wa%$t1cn*#TlPQH|2>V1!7r;H@N;CW(Zmiyg7_Cs1%9Ld zY2ix%8y0K+4gFrSz0v~df7Kgg1CSQq*dcjG=pO-|A$?p}d1 zG8`zQ%6a|E&D{laBW$JObMQ?#nc74t*T31rsVx8LEJ*&ncq-oc2rq%RLI1xU;F|6Znl)4VxD z9MS(@x^{#l#QmE=#$5>pkJ%?0=Cs$JOj(>siAE)j0lLbmU*xRhz35&W#EGYaH=Xn`Q89)%X!0RJ*E|Dbl^ zZ{CCeW-LUQ{R0g@Ob;<96#)FReg8Jm|1yFpT|tzY-=J>thCS46W&}@U!pW1gixErBm&_p;K#GEtcqCP9*mr>V0V- zS2r*J<5j-`KhLT)JBgOeLqyEnQ9If1MF4$KzJF=|GX8`B+K}_2`9%5JC!t{ae+B)M z1b+1zWRN4E2a_b7D4X(bC(0^aKndpLV|6%g7z|*rVjz0uu`BgRnyrQI3%DuKs_~zpQ`LKflO+OaCPQP5q4mNOp@U zGt9|(qvFSZ;IRg3$iCU?I&y|9F6|-*J8`r?2Fo_JCglhzMW4 zD%@Xnmh*)qs!FugYIQ+9uz}}zT4R0d_ml5G*uQQ6S7`TG{<8fg@0-+;|JeURfGhy4 z0tN?Ip7rraI<-m?m-Ooro9PGb-&~9VCZdsR^2sy*d9CFK|fdy-JP`~b7F~e-4 ze`76e9f+{9Ur+L1=AkQ;swdySjkpJ%$PT+0!f4?~$ zOcRRkfxkXmr{!odp;B*A7c`+HU?FZOYOR{bQEmwU2Ka>r(vMpAwK5U1|IX3Q^xGs$ zBEK*6pwrXz-@q}bf3N)y^+W%1{UZCJe{^h;fS)z~Km;gX7PhbuO=>{=Qfn%QoRSWtXi6(pOim& z|1OgDZ}tznPsE?OK*IqL52T$4umt|c3Mm5dw$QQucsXWCi*p9d;~RZP6u5kZqm$gL zDdN!-qfPn`KMFC{g zKHp7G!694@l;{hDrROa&T!>ycUB5P^?*#g*W{|EJp1F!*JNsX}oTXNs5UkES_ z`bQcC+s`q%DJZs=c<{6~8BVWa7Nx}UDDX3+oZtXol`rzW&4 zKYB}8cbx#bx_s#KSG143e^&p#J2-&;k^dd-KlFco!vYZfli*b00!~!6o}TqaeFnXf zo(TUn%PgMpI4hFiFZ|`wJp~h#GRP!kKYMf~+H0*DMnwO}^67_buVvzv*8R{8&>^G% zN>9)ogzSf({Ml+p^C zEQ-+-g6STcQxK2Lfg{OFm;dJ!ReCSICrb0_4B%fI86J zwNyytKc?ZWdUF#TYwuqz2Acl=MEL+;K_CtI3j$c`2kSQiB>ETT31d}s(JS8s^@k|qC)WcGJ6xoN#BwJ&^rfdH2Ov(tCq zeRrTu?w>9P*pmNmt1h670Lw{#)JKCSWqqdg-R+b0WHgAk5pXgI(L~h2rk+8T%h2p+ z1|k|0RBQ1s1(29vy%p`N_Lgq|-as#{`VwXThu$Eafc8fItEb^Y`kdIm5R9#3|F?O- zM0A-_(7#bY5?{t1z!zxBKWKuB#`?bsmZ=*Fh5To@My7va)74$4FfCy<8*j>h%Z&s5 zGi{F$U~`|oEAW5K@_f%oYNq96)_E7NA94PgHhNU zEM&6Z-Y}qp(C!7{9=LB(tiL*cMgONz|0z0v`~R>28tuR30o-f0f96u9<0ViE)51h;n=zkK*vM-eNeDP&~e1%(Ht-<`aXZjkBUL&mV2415XP z>B%?H|E=j?@U!%XPZSQ&rhP?rPVDm!22jy|Qum;K(88WM_OU6#O#Z)&lfeZ(;z2Zf zmuUw&gS&TQ zlTCj(oL{>~06*T{FSp}`;|J+5I$2!0cVM&xH%M|7dr%13i^fG{fRxB&$VKv>`vQ8j zv^fFvkNjVXtJ;xQ_5KwU$jFfU|K;UJGh(o&Th*qYl1W-{TWRt)-BJO zErDAFe;EAGe+Iv(KmJ4dC;va%|0(L<1*?n5da(a5J}?^&k^gc0H2NpBBH`w&*B`vQ zU!LDMju1ZZLH+=-XTYhL0jO5mzYkpXW=7(HMfiT?M=|E&6n z7l{7ToH_=w=rK}~`-;-3ID`-(RAwoW&Z)Ob&j4MQ8x?iCLlV&HCly%w`hY2lFvP`P6TN}b{W z`p1y9{MUV^fNdrE{~2dMN1FToZU2i)unD!c`~N|^5w?2a0HQ?w7n2V-YC^>57&eDk zT|xi%s7}Jh5CHjiFf1P4|F5djS>v8KIxV0I*J1@c|^gKlS|+{U`rmGXJ{$|7)cG zaFBG3ry;;`V*l&S+3{em4x|trAinxGK!jfyTcGg;avE{<)g(qmL0YxFk3c=D%0_uc<%Ne?#F7{euPK`)*WNK*a+@|FZ8Z>K29b zFaV}r#P&#BwC_vO-(J7tz7x}jXed^bKG4BC8$84H$CTjz$sb?7% zCy+%z@-TtBUuTLjls2F-zP!t?9BQzLkpBywlK_zXkNXw_+=u_eYm@h{^!}Urv*eF` zsDikl=(m^eUeJcZn*_)(pqL<89H2sg>;J_5llwz>sgDPpTmIvR6J0BiGgOmwfAfD< zSB&h-VH#`LA!I-$g#U_|AtZCs_hc$hY0&O7^WmT|{WpWbF;hG@Nq{pakUD4s@DwMo z*?-ajWCThPG$LdKkopJv*I2=j{)yJ-(0~7U66o+G`nR&|@+^<=18R zcG?_|&(4o}Uk*p=B70U^PLewAx98-Pw6iKVM*ung9}8ecHxMZB*HbOl7;ym710wd% ztUvqy0{j*rIWs9uJxOt=Cm}$7bu%CKIi94(*`T5+x8ndiXkb)e*5cvhf@>Pj7(Jx- z|6BaA z{ObUJjUYI2(f?E2Iv{{y@LwGEhy7u%Hypls zru1K54X2qo-`~&C&c_M2+%o)F{!9I1TrUEEbpy9KKoSC(`Xl&*m|nF1ME@bPmrR5< zI2tApeiHcamqWXO7s(lKu*Px8OZ;Kc_3u-dR`$3*{JN6O>53;nvnKHkBAv;5bf z&FCNx-xR~SL8}X#yP@B2MoU;=%KL=M4*>s2VIR%+GU%SLUlr?GC6;!+Q;%pY0H$1; z{cW2AC>|(ef2e-){YCUI24pGO3K@Q!6}mu)CzLTBSq$ewRR5q)tVDm%f0|x%ay}WT z^aB5gSrBaju==3i{nu}I^bMqW1g@q_$$v=)iP=c-0hm4bvDu;hcV&ML1VjFl1zSk? zqy=Q~r<~cP`$7%TKe2)t>yn)3P3-$*|7*}z<`BC7Gy3S|b#d;khnt=>KxMzeAu{X_ zfIm@RD#@p(1%2x|-OZt-tX}1d>}w7n@P`0+T?9Z#{(=Av^_R|{qyRE9a&UY!I!X-Z z)961Cb$O<@Xi*lwmN+)R;aaWjO#K8NOp<7v_QoR!{WH^w)ja9{$;}oTnB)H?|E2wB z=1(U=NB-9q0LT~MuTem>pQ*DnVL|}z$!!CIxKW$x3p2w0mr}3J-U^f!Dhkt#=O^>q z^Q<3CPZ;Uj7xiMzYxNQUI>ru%FXcCN4NLCdq6R9=1F+&B z6z%($-dNCO$#C^h{seZvpXk3E`774b(0_nfR8Dd|HVg&TQQ*EV2YQ73*ByKirN%-G z%YSu>hi5;sNs&E^|Df|1;hac z2PlA+@x%+8+erF*95L%GTK?+-9}N9pmOvx_x3vGZ{MT8eBL9;B5b#q0nd5C~;0pl~ z{R;&gyN~$R6bUFLVS>o~lVeEdpaHQx8ni9EL>o~T&jnug1po8Ncrviu4!sctSSFJJ!F!(j^rg*^LPD2D(`TP3yD-1tJ{UqhD zrhfG&PT>B7#KzlSc>L^65{`02dDlhzZ^`|P4#NYDEM)mv^$to2+`tJ=m~tAkkZbY} z%uY0xFxp>ApydBIS^f)Iw2?aUKSAC*(SMWFNTpe!+X*YDWI-1QARa(Bj~3kVhmCd0 zKx21s{JhmMv75T$Ts-_)@B}!v0bJ z8u>54TNeN@+Mj++wD8@X=4VBjTYOw${7v!u{R;ax{mVZXt0*d0k=i|iA>_a5pZI}< z0+RpQvMN|~07{@nv5zk`P_Dw=l8WB_E%~kj{1yO!8T+0QERy}}bv`kDIO`NNycZ_oTc_$sn9H)a0lE*EG< zRFsg=X}QLl7Y&;F+p^!+1_z22BxD`1D@q77n5tJmGGSu+mwzzazoGx%C;tHQ|7p}8 z@_$eHZwA9T%{5(yXH~*k)Xx%JcJPMIl|HPs|Db>Pl{16>HD(vecZX8+{FTX=v7d*> zIH-Aah21Cl5B-b%^S7rk+n3L`FG>DQ24YNmlaU~ndt-*TOCdqF1m3-V3-H75C%3OG z|K#{lsn$$QCwd(Y_gNSFKAP*Kl?+S5quOie?k3vuPp-NOzNOSOJHPGv{c5~Xb91>5T?6QME?Rm8#8Tb z&8;i|LIgnWnz<{(KM(*8ptK++6)%6>!v`i+m*{l9GZ}nm@DC>ww11fl+vP~b>Fm}! z;eQOJ?9U-{0I&9^rMfcs!yEAKwZM-6Am&d90Q;A;wbpQdyJl(^%r$&<`#;brqfW(L zBQ=VZ&d=6p^I7}PGQYF$_gJoy0$ii%8~hsj;lOYZ5jbnj2vLz_zy9yTKOp@dK@jp^ zGmCcQe^&j(d?tg@`P7%AGczq$L>NFabwjENp7AcUuI~M~=8nBP%YDm!Zsc3g zJopZk%Gtl391%-FV&Vzd|LUx!kR4^JFYTg2d^3%;Tt8eL%g{v#FkhEu`js*0shr>f z?=Ic~`nPEQIDIqqQ%ehvB`T}pA*W{iVtI&8f+$J3sqzp37`-@1S`f^uyf{ekE! zLRvvzJ^`g$7T00d;&!Tj@(;9Ze{%rI{H=e=5ZZl_OVkCl$74$`3IH06Z(Z;<{YwD^ z0j+dc1OVo#X5a(##~Q`3&Ps;z?0It z^7xk*ne~0RmFi1XuF_R6cN05!~A$S2W258X#2ge6!R8i8yev^MtcEN-4 zzovf4|BeSqWn@vKd$dhB>4srT32y@dg8l(*hyE2Ba>LXOxsrx?^^*hxnZrRR!~Xb6 zeCKM^m-;9ASF{1E_q2#aW!aZDyNvt|mhs~`gbrXHU`rtU0Spbhq4NbqNRz`R(5nE; zasLbrg--9sbKh6s`a0`kXX&4jz!VQdW^csEI>BhR`~^3Q8NaAMk-z2tuiyfGCahxT z%vmQ$^pE^c+P@^fJ%5ORw&tJDL;lxA)3Jcagn(%NbgU+XZ@}+aoaEm(_3L?Td_?yZ zlRw-1(lOk0gcs7sE4o|4@FZ$kl4_1mNXtX1n0eLWvL2r+}A$FFPRA zK=lZwO?0ndG%J2m{b2sI#b!L{oiQ^~2!dRI$M+VHJADzWiRM=nsQ1x+To13{STr37 zz^vr(e2>k9{kngUKxPy|KR;4@;^Y|k^NZ{2v49m0SK_CB1Ux~YPw$`0Kg^0 zz&DcbNj*-h>sR$0Jak`_RM3LF)_CZK=a$o`7y>@Y;J<>`7Gg{m zSoP@plKV=Ui-9aqBrToz?^mIG=_ z&N|Rcp${b$CG>fIr3Qu`ptt~U()b~)6z!|~Z-^PhHGHCPNE1U$0a*19!2S*PPS0Pae(f^{*hl{xrao6w zHsnO@Z34;waQ{AQd?}gn5d49Im+%f>dhkbRj=Co^ZG|KVHOKTnJ$sn`Ta7v2iMIrq zJ^1l*Q?(IACo~9D5IX3{C_?D?ay}WHD>Oq6KgzqAm-in%XhOcW9%Xe*O|D;4f06r% z3p73ffnQGoD9^x>5CHC>fDq1dC>ft&Z9w%8*!-((|3(Mc;sE5D=Q3*-Q%1UAU#d}o z-vJ;1JPq-d2*A!?{wG7HTcqC3F`YsGbf8(eykCq&`-k)ZGPybi#KYmAOfO#LINM48 zS63-4uX=L(F#G_iKR^Jl!7mg*Exf_tI}`XZP37-nK*>CZ!fof+y%HYP?$tP_9y>k% z(gpHAt>4;=EG_DX{uxO)1Ay5B0R2Pt@({}UZ{+_T9U!>D9{LCT5#ZW1xe-7d;GPZu zCU3#IFZI*d{Y#DAD_8a((BlpJ_Y6N*K!1b?=rIBYH__MuAba23ysr_UgiyAgUw!`+ z_?K5wo!|s1L_GHR=9bGjelMoNU1x?eH$N<|K623T&F+J1M9BhB8l*5oQ@1F*y#)u5 zuz*9vK+x=6?|3HS$uN+E{;cogr8=f!KOVt9uY(FRL{4{ny znEyxl_^#ByC;H!CbrqA5u&{h#Ejo~BpP7CSm{A{@H6B0c|6Q-otWhhM`}^6>PMF1X z*c3S)-1-e2K-BO40Ot=EVWhCgJFf zi%9?&@PJL*u|^UbhyjJ)m>ZaRg)kN$(f(^afcJB$t3AHX9p%r|g8p~?qx`x++WNo8 zn_SYr_XP2e+r#?4)W0iee?$jBU-Un{asWtGitgbJv|WI(+)3zksbzZYzPh9RF1jLLNM7O>D!AqbG!g3MZuU`5#)B z{Ff!r{?~o?DeR>GorN#-@0qXV-4Aei<{p9qG#%rk>F?P^|$ zqbF*H-qYY*=NXDK7a4I9=eYcn?Kn+K~n2I{VO}6 zOZL<2JpXf8p_|U0k~W($gHO8U%5SnpVwiq=sJ|uu6Mx{*BK>1Vwj}>gi4Pz;KuR1& zAY%m-AAp}w*8dLbPuBto;=Ye_*&f{&B)Eszuir`okWa*&yz1oHCH=Q3VGf%cs^6OE z=dtLY!47#rCFi%l7`OjkiKX>U|L=yT`Y)yb&2ln%Kmrk}*rNU{^BdX^c^{z9I>Aor zpG=Qme}Mp)(dA9rXi6!^2P~8OXPesd6>*37m!7b{!RtE>@HvVuV9~us8i4?prSG?m z`Rn8)YH||&_Xk$>R!1lTpa64eK>fnwtHz{k-Y7@6UshUas95c?8OH)NU4T}3-Cy>%DXaVZBHUK> zYk%VLay}UC)JviaSP?927P7yg`0hFAAg$kae@FI<(4{Je{AVV1mQ#-yVcl`xAA`e^ z{I7KYQ@gB!{14rG(s$%cslRvselXBHd(TNlwRq0UerLt9RpY(Xzh2LA{J`g0 zRIalo1ja~@nS24@esh&$B3OZE%cw1?URq)4C_;DhQj<;OYAHGci}om4(n z8Ms``e&vX%VRy>^LiyqVt?j8*ZNM*z6T|;ep;I@p7(@8Hl#Oq%{@I{6Tqu z9RC8dQr-tal;4a3!SEXnATD5^$pZQp)e8yyi}Vlqzb*5F>f6Bo6#8%2J5Z9j7mG4z z4W7GQxHnjV`~bV=?P#)IpEB+?e>`8F6G~OCi4|-XUp_>J`MuA&Coq0B@9HM4FW~KT z_;{lGEZc(%1f}cOf}qHLUoX_&qJA@fsb93Cg7WFaig|ye{YwCZ#^0g-@8JVM{jq4S ze_Q2z@MN39L+<34;(nY76z4nOzfAPc;tyB-gGB#SbZ{&~;Nb|szwyL8e=O~ZQom|U zSUH83=g$t&?&ST{Q@V>iAJRk5mo8smEZI*Icmw3IuP9$!z;{jULV>*1)GzjL1ONqY zK?2R;x~={N^Uq?S;Q_(^PoB*GAFADsdysyaBd5B(84V8(S=*B$FGeq@WypWJC(aoH z-ZJp2x8iW2XFJ5bIbmEzVKW|6c$w#B+{)k&x!|ba!h-gEg1{8B?F4iIJf8HctUq_7?$Te>6>&j;N zuls2iSh_yx9ehRn516|cp!6q9hyBwNF#4)1-*e{PFC-+YIev9jrC6zaL}_LH$G= zhOhf1=O5skmqCWHS}-V=Z*m0Y|Xj6u0j1m0S}#R$$uGuT?Ej1W%dQ|zyJ1g z%KuJNREAm8ER#WB^bg_^tZ`1I)iBWii=ih0>SWQpr=!jJ2>)K&+Sn`x(?K)e-+STQ zdNY|nm{B|1XPv?N&z~|A0D7)LSW!9kO}&7Ly{CJ%>`%bw!75qn*SQV9p#E$D1pTWs z4&*Sy=U2yC&xwDwl3E<#Q)-{7zuUMC_3OxqT{A6D^No!t{g4Kr^N4x$jPs%l;s9|6 z47^HG^K|z}Q{xQ^vyZ#C%*W9$md1vOWrP3=El~Q0rSR2lNHxMEyzj z=PQBwbBnhv_1 z3L6ZEVGjg|S7{jz{-`Jb)LIO_POsxuG2;R*ZiBxKUKZRA@CSwKm!wum|A8h+05sA+ z9~t}w0ptNh1ZZA{r2oSKg8dg1h;`Eg_$}7|E#Ut|`0uG|sxZx-;RpP8j?rcQB$js% z15kkX2K^rl4*M?%1$&r!rAiOFTz7uRoPRwiAiga{_`zcSNjEe2#kxy9rxS*`n>Y3PO(mG_AJ7Mw zu`chcLitc?X?+g|w;8-aFA_JhR{>yv*@(f7+zv@UFbV_`G;%*7g=N1$FF=d>BwMzoL9`ix30S{*`LkkNE$5^q){5+GWYSqKxP7=xW@X_l{2J>tV1D0>CoQ7Qp17 ze|U%uFo}7CBa>afAi$P!x0D~DKV{HjARk}eVS4V$?Q>phj}j30JJb!h8TkoqhujY? zkT^r=L75x!gzh$}92?|j`G6e^(67O-AJM;&LQnahom0^P0tcQi|93T5;Q*%o0Ku4v zIHuF>_%F=0!7&1W6_h0hGyP8n1OxXE7!33n{As}Bt*An;$iu9RQS#iM|80LUra1bOewoKY0aA{YCaCF3})JmikEngqBGLdI7W$AUS`; z6=VVES6e)j%)i9`ljbiJaQaMbk*Pnx&omzlN8A;QPng8?h3q~GH_b8+`8YuNdw~n! z(K$dsfNd|~7#m>798#yrIpFcjsVJYRf)8ZV?fb*#55+HNJySI(>0UrnH%wV~a|<;4 z4&@gf(5%H+D7~V7D}bhdaRsG75_1Hd)*PUv1U^u&ty{T8^FBXd;7b83^8f67P51AH z*{VBT)SsaD!|-1Ha$A7Hg#U7S1esd_j3zMd58?gH1AF+G z0*J!tsUthUS<-tzAo40jb;)n(@;L9q@aI z`V+Vd>H7f1PwJkfeWB`#17xnCd)-Y8phAI4`~Ot?e^Ko+DQM*15Ei9_3Md1grxk5`T=Y(`7GNTlyEPgtpRg^ z8U+IQZ4O}DUo7C6b??4bkia(>h@t6&yAN@`yy{Pm4+dxfRseG|X;y&Y;l*gsf5Zcz zEUDX8&Z{LFfH^>p30@4CSLhE!faPLxK5nU*X8oq@Y_^G+1H{EGj7XZl0gATfcz~wv z3G6Mc-@|#KeC<23zsPw58H|whw+d(`(E3Tdpv3`ND&SU2K60T;dOEMh{W3_5f%mu(RW%et!pWtM_%dLB4e^acw~_0y@B(MMi)bC^g*< zLGQl#taFx_JnoHaPlRaSQaxmRqxDZFD;5xqfnVIiC|Xh0mh89O-z)pg{tNYI*`HQU zU1_Fup@8P(mJi_4en3`Z;oQ$Ah0qEhIzR#bA0YpW0XSbwm^*X}NNVb<;n_+51@zw0 zfJbNNM23Ig>pd<25Tx4(K;s*km`XB>huNghOk>+YsLz6U^%9mo(Y|%QX!bO-z%QHM z7QWOtQ@_T#Mkg@Tk7t6V_L{jrYaWpJL$UP@cYcuk+3XXf3-ybpg98Np*Ic0D27ZP| zGXh8tOh_OhP}S?1hl%xv^bZSQc?%SGMsqPl^NVAx_knbl4lK3JB5-)#XCZ)Z5C9Jk z16Ltw&X(NOHD*dDHw`BqCj?*~gZWpi)HnVeT43gOnj&VszIi{N&sk1-xt`}6DvkKQ zY2Sbs*z*Q5U<9!syXCz)Zka+AldtY0)YTQ=K+3!zSjN?dejQ7LI#EB@DTDu$CeZK$ zu?zDEAxsMaf(QJ5_;;vZNC5ormbaVTo%y%Z{!#yhhJKj-O$FfrkO1hPyg2maP!GX` zdpJ^v1ZorZOd||jOags7#al)TD~RM(l2yN~`Db8e?O&7ZEBeRLzW_b&5ixw(oFKq2 z=y$>Y+2y}lL&d)WDgT*MxHo+9hDH!u3pxnZ=bWjad&h$weE@9=Yd3nFp-oR{ z&ekoae@Gkv9+I+HZsv?LoaEEi^S|!|#5eF|$7Ey8l$`+S7-yb|yF@(kISm8p(7yBp zwg9}r-l2X0J5)S@KT)%kx{&?i3eoPJ-^2^@JIZAj3jDrC(A(w!>EkYnFJ7)ki(j32 z8<_a!`+d6li~tGz;RDoMfG-9ZhYwE#=R7sl%V_w%)4?zwGmKOsU`QVE94Nxr97Yzj zQKem`^ynw-RNc(>L$e^vlLyZrBnfM~|mY)>bgLcn@3WlSMAPHGUE1GpU?PtXmY zLajmo#BrOmug98NS_se^H;&}Z5_5CX9vAj|5I_xWP)O=Str>Ko`5TCQT$%!sU)1cm z((ac;M4Qsvs3Osj0Pkn5?_1?-0Uxkd)E_ck7c%ur4OPl}pBOpzp+Iy2eFD<&e6&sd zE{>nOLj{!gFOZ{pm3jaA{V&gO*wQjm*#LZOasl-RM_*_u(2kN-y`K&@%VT;G+p~hg zU}vl)L_Yn)uf#_3v+FToXJ@T|M7NKc%bUviaPo7!lz?D`uTVZ9OlYh<&R*sW<59sA zSstvP_0;@KP<_?_lKNL6K~R360xVmUo|9OefPmKU)5$j}_42jf!TbXmwgo z`u!IS0tNvB{N@1W0;~mwa(IAgP;#l?Y#*=3T8OotsL}UX15}gD9BXlrDj0Obbk2Q( z2c^ZsoKXj8FsCSYZb@H_#!Q!dpZ3mF1aJ)cVD|!GvzgZYp4GxDBZGoPEv^#q8@XSo zKWY3zD*d+*fKO+x6J-N~EH zWWwa@F57xD_p>Uo8_B;quK#oMg|vr&1Q?e(P#`!!P_P)iXx$!y@CaD$%LK$@8PqRS zQR(#07INRfPljHAK7uzAok#f+!8ep2z<1jRx^{mPFmfHpt<3@C{rmm?zXtfZ8Tqco zDRI&?u}k5mEe`seRNO6dfOViwe!qa< zfENb<0rocT({FT9K#&t40)pEJu$gMocjEqB<+^F40e}FfAl$} z&S3&3=<;on%SV}8LvdpJ-t#GQ%>n%M~5P(cu7J$J2;FODXyFPHN##0Ib zz(Mt_Z?vv(bA^e76%az;!}Psu zOmYAP!if4MHsZfc`T9;ufZmjzTGSxVKfb0m&RhO=?A2!Zj_RjW5WuKeR6xK_YQO&J zXZ~385w(CpBLN`2Hz7qUV`c%t1jOr4L#Qcg9{>WNKRD=*SPdwHxb<#6(dy(%T1TKe zCMfQ$e>j7;&>O&*<30``Ex@{7F<#$cVWJpT5!lSg$10l}ORXFnpqBXpbxrwk3{n96 ztbeMp<88_0Ii9GqSm~oi?-un35|DL^`6ndkP`~W`Na5qRy-##iBlBw=Krq1{;2P}$ zf3Sa1|7W28i~t$bW=$DNY819ECA0Jks+p)En${w~4pGDcdixQ`aV+(zWAT)m~ zXm-m~^)jKkrgZUWi@m;pFWg7V(PB}o<3bQlw$%HHuTh8W6BB*AfjNy1k`k3Z^WQ?*H2Ykj>}YU z%kh`}Sf;u>o*aX8xG>JR*Z=GB(clOka7l)DOqM)Z{*b(Z=mSg154!mHwc47Ss~~_y zfW&||fnNPfb=lkwrnm)>NT(BgjUMP_kT+DXql5oeCGaBv1b!iaXkTZg#h!nVKNGCJ2EW*|&szw90$?A#GypY%g+Oj3b>K=m za8D{=-N>C1uEu4)&CQ~JCeYUDHaYwS2)Y$d4@QGiSdM3<&@}B+=In}B4ERn7)ozqL zs3!P907f9FKhrvv@i#xal)<0mzUvko0Kiw2FW4LO3Cpzecle~+Ed8noN~Il*Y7ezb zDN%aTC{XH>5Fk5K=SQJt7pK zBM9G}7KPsne3f)VjCV$W6@J8SP}us0l0}s?@+wttNb z?MvxQnMd}RVdxf$3skP6{lwJ@<%{iC)L%fK0N>#-r7Z*SZc{h1$!%w0c3xEZR3atv z)K?PNGs68&`@fZaru8T;1!69If0SBeIH;JL+5O#FLI6$vu7)uO$o+r`0SFNb1R$H8 z)zb>%xw9CWo6~XBW&uz}*3T6+Jf-J>q;!H(qRD<+?rzo4B!-?U}ACJ-iYstHq3cI|a7{?qfk=v>Ju zaR87YBSKTBXCKuVCM?s(^l9nTLV$cFe?ZZbz#kwaAHWU{5ZpmAG_J&61Q?%{UcSv@ zc{ZIFc;~N`Jevsf(GpwI)Wv+rY$tZ9KRha1{ zl*sR5ovo4nN>%|y7e)T7FMwnsRcESOd%4m|W4qGrAUp*s%k5@{k=OACrI&P{9y7=3 z4hDznAZGqCFP?&%Xu=py_t~QdgnvMIkYJ;7IR$hA{8{#EUsdIKht&rf1Q7Ts4JJyi zT#JH<4rcWaKy2{0EPxaWk`RD-g3JL}W3ZJ$Rn#S83G+?L0?X;hfa+O5q<~4OXGSvc z3^fxUA0T4+iTTW7p4AIaKNO-nDj)<}0K1X-iTW+~r73l?Rm-X zl0}06@%i-oyiD_3RptfwrPoRb;AT-(Gl=}=a(oZn3IXf`NE$%401{|?HxPj0FRpH} zxp$@I;&>r{d%i3EcW+V@&e$lxa1o45j7^P32MLz5@qh^^-t0l2hX7zMS1EnwXNl@{ zoKYf6{Q`hY90mLazRn^A@DuoR{r1+ab3@M?K8Xh?%TNHb?AN~Y(x;#9LIJ*{qLW#$ ze}lgOh|7%2W6}m}wnsPs##(xJGX@p*G{I`rL4XHqvA&&*&a~L&|9;STZuo0mA3aKALyuC$h-KZdB1SsgI zgVvLucoKzEu`_$g;La2;mCH%US2gMnNPu4S0wxa7wE#i~IK&1B1X!*5i#Lki*pVD$ zT~KaYZg*c|y7Y1HyTRfTo&6R^(5=SJF)ojhd6V-wmVlc*J|w-qnb|`ejrDzrBbamB z{TpKY+DO6fv%F7SAY^{h_)}{X=C5XHgWOljRX1&-;-=!cKAF$ueSRX}Pw?qz0JZf0 zJoLW<0bC85F<4GUhg?7=hiAz`I(aMrLN;b2(BpWEbY={1L4d(xJZlZOZL-7P2AZfT zt7{J*;-x=7Lmm^J0lcHha>MD(XuNhFTw9|j+(^md2?@8@O#5xEKe#|g<4@1Kb)vkP z#pgDxY2RpAmq{P(0^3D--fz(*R0UQUI!LLc769SMIQ@!>k+2ONQ5`D>E-BqJqz$Aywdi}$4v6$V?Jf&lk zr=HK6y{@YH6vZRKAOPsxKy(d5?=RFZYo?L;!T|V#(@yY9!Ha(bNcm=@*h0efVz+hE zl)QbUwy0oKz#sO%>n4WF7% z)R<-9D{oa&R2Ye~_?)r7g8(pq`!huWiN>`Aj5ZAd$s2bV5Z2-VS47YgIKJ1#qpyh; zr6wrSr%rBAwSk*fRMAd)I@r49x@5bbk-V=tLEME4AT{`wRlbJuRgd_ud-vR9Xzt`j zD&X%>zHX*_xtvi3zR6l@NKA+(##FV-zUwUDlc-;HA?X7GO=tiCq+RcR(zVFCg#sB3 z3Ih03qTwdzHOsch354%8*8Z~yNJ1bXfv^J~0Zo~jM*cfEK%GyMBS(}%pPCMk>T6Q# zrtZ5L0tKqFbRXM&j-H?l)w4`Kd`Q60)E?44xR@#5Og|7`V#%oh*A#9T$4>@(xvno% zrO@J$>*aJ>E27oyM-P>ozQlLjKmiYn%SYdR@PR7hz^(wj^XDg^Vf|QVEd-FK=5Jp@ z?KlDw)xZH7A3zoWRuMx9TwzTxQxF5h_7}blqFfy=zhel;Xu!PwK{-hYY{Y=* z9~BUx-*A8-vwGBR(_?Y_kRS4B5C|}gClvsV7*tr|k zkG9~I3|7NdZID{cKoLU36VX1p*G-rz|32(^KO)Mp`{cg!sB@G*my7-HgMX?JGE&W@V?9tK02O66AUJ>qg9*r?0kkauA%OjJ@jgW+o@a3U00(eSpYx)FXZ3~& zqqAJkjUza?(N&@*B|ucb&=pdH$kf9C584lk&wRk}S8Y{SCEjz&VBgxi4CSlocB1_T z2{udolEXR5XNAg}v-Wt_T(zye@+ol2b%}Bb{8t(VvGvkZFF51OT3St|tRqE(2>c-c znu_Twp1BjZYl{P*5LRlS!7m*^?~DE>gpTBC-gcK%!5vKe0ul%mxb?OkOZ2b{4N4E=0^(Bh1yEU;&;?`!p9E@k} z2kV!19;?Rn_tcUkhR1KW&dvlo~I1*Sr3(8Yl8AS?#F!j~ZJ|=Ai?_L1j#Pfio{}j(&_Lx)Db*p@rL#{Dnd(zE z1@z@J?l-9*K>bD5ffNTADB#mNKobchODM3Iem^+7b)^4} zhbvBCM2Ol%WxBtrqwhBq-++EQZ(T_QQ=vdQ^quW@=JPXUj-vqrIWJL8+YdhJioRYU zqx7hN)05ub`A}UUis_Ww$-qxCGuXP>w>f~YuujZ~B@SQ>pvwUi1(Z^U1AqXBhs>z| zaH6*#e}UqOiTrh6!W7wgwpZmfjZna-jTfglyCK^LLd8EKNZtxfmN4S#v?&l|>V6k3%IC%HfcBvkq z*r>8Vw-fAp@)4lh$)N9+BA*Kh(VyUokFmM@#?$vIhLD@|^q1OCCTwzrOb6uEV*N>9 z&epNnujn5XAhj~nV10pD+Pb&w0OBHSJ}2`Cnj=`R)H_0XAGQPZnf1b>jhS2IE7l$* zKZye7%gK(NR21}UxXSBgD1Lj2D=APtXFW*L;qKNjCl7m%W3t!SS&W4M?Q`?o#vI zP-~)sKTXG$N~QqQc6&yHr&h|;zlUp-LTKnFY@dD(wFb*5baQQsY z&314wIAA0Y!%s=W$^88j9ck?nS7+T{prP-Tmh_s_~SRnax;%6}BVM)n&Cf&&Qr+X4U^Agq3nWm^XrFp)#i z0n8)95QGb$-+SWthw5P&O$9eMa1zZt!q{V(n=Co)siKJdoxRT{6^wBeV~3y8Bb4f{D)L^o;;fnUhawf~MORb@Z$3m_%M;ve8L z;KIV9BY1A5W%M`JrkwQp4;WyEq$&}l(T#Hndek=KLWHAKv6YG zE|pLKI|zWCX8AARCmkSk0-?a5Ab`&NToM7+kZG_XlRQ6A2i9wz944c0%_t$>0Pt+1 z(KpN!CM|*yL5Js=8gaSp%xwlDY1o*SaCo!4y~|vqez*XC8y$=!@$B7l(2QPQsq9!P zV)%?`a~<_N&cj>l{QsLAr)mQJuJV_9{1O-&>K9<81cnGe2-G#%jHxh5iW$$D2dD|O z;T-IF(4Luqu4Ew~RS*-2w|M5^#(IwvZSsEZk8U=XASW~i?e~xZz21x73ynI54@el? zfGVoreTlZwaRzp9ng|AoRuJX;e{+f55RpUs(7?~Fe;CXv>q2}*vlBw^S_M6fUDge8 zVckI&M|Fe!H#l|`GyU6TV!b?oQaOIJOb-r_>A#}_ZVY?_Hb3uPz%T{1JYXb)U(O<) zk_fQUsos9Xc_+(m6Rnr?>G?b>iyihqx zlRGt60V|!&Gt__(9c}Q}&+#NtC6(i9tyxM&n5Q5i;5T{`l%6uDefvu0|&@BAWRUDoEx8niDWzTe-&x<)-WO+{&7+yk9UJln6t`AP5B{b6p1eB12qBUy+Wks>&O8eAYkfpKG9q zv;BkHn1j@3@vNT8oWvT*`2bfovz{G%As(cvQJz@3juDMS{XAT!sF{B? z-u}VV!q*3%e8SCCwH6A5N|ww&kRVfXWdfRNZ34Ch!2KE(Fm!EHlD3~cvC2@GpM z2oP$Z5lD0eQwIq|FGhT-`3|HE?-V>j31g@8o-Vzx_+>IXfZt;N_Wjd#0%LH1R-+~j zKzc)~F_^Pa)ejU%?}-DXM$w$H75xh#SoBq^2<0SrLB>yRu&Pxyv*m2|ZZ@CK<{A+0 zf4qU>2JnRgr1II>{KoViZ{?C_K-YBM9PdXIfW>M68ikBOI`{?yS2l@K|B&F-RJ0gt zP?dAPWfqvzCoZ;ns6K}9q5O9>=p`EToA@aS*=pBD=ti@5x$<+;Icq{*B^HgFyf zu!R6f@8P(y1cV5nKxw|5@ALK^0|3?E-riv1Wq>~~ulg-OrFjRKpHf_{$1LTP8IOd4 zKR7&}KkHM{ZkfrX{?H$D92nowf7br9_b+Sz0(Fb}3u`SF0Ft#`#u<~sH5>r?vw9Z# zu$o6ony4fw1sh)Lhz%IS58$IW3j|nW0S<^Gxcv9fR_JT)E~$o zp%4flb*ilb5)Jsj zz~^Yb^>WOJ7ooNKBl|3ahs-~E0ocRlf4ZW-T^b?bpOo|=<9u-cE&G43{4an70YY$W zA;2lrk%d5`1E3uV{0M?GG~|W@z!8p^)sH64mO#=4K!xAm9GXM(Rtvu^Z?+!yC% zm*`y-&Vt^mNw5Fn;4d%abpZHO02J0dG*3vZW3VHZ@d+<}-bWJCYvg}h`pf&DI6$G~ zBG(iBqdja%fEDmH2Z*(|}%Hl38);a&Pb^SIbZBc(q`_Cv4 z)GJEPvOnZH*a47?Oxqk_sqS7OO2apJe}r>XjTb0j;0qa)4u=H+Dm_5p|Fd~OV;^Q} z1;M8SrW&ONLI9UvvruB`Yx*ezU%n8v=fi2GSVl}my1EVzndvYzCxvn7?LRFQ4xrDH z8tp&p|H=9D7zdCBK&kasyZD<0I=whRg)}k(#V7;(0(rA>2Rq;k^M`QRWHIn(qQK3~ zEdUzKi6$^e#GYv#JHhc%2u}e%zypFzK{>*50mUr{F$Kqu$o|cW?ko5P>Mq<)_Jig{ zTdow=ay%Y=PIKoem{e1LLIT>lg8)VTCmCLG0hBcf0DnqA>U?uDlqayze|rC%ng<6+ zJV0%lQ$Jj%YSN+yC}(kiZuXt8Ri{sUk}Aj2R{2$;^BI!}Yd#-?_AJX7gpsC$V}?;| zbBQtS-FrD1jmM#_5X43u_J*VKh0UFoi{~NtP9Xe1BM=83I~g2Gc^sSv{QqD!pvFmn z-;(_u;2Y~3wr>d@(m#HoY{db%xe)+eV{Hw+*b0#B&l@VB*`|Tt<^bXamZ|E>BW%Lr zMg9PIi;#enA@#_f`Yq|#aXr$bMZ#N=c!`>6?fI{^6>=>#?1ASe~`X`!T4CjL`ztKWW{um(%tNMcQ#GY zKhMzv)So(lYVTi`{RNN!RHy;#3$RFY=oEazT79rf(M;h2(Qs;79cf9o17_~bDeC~y zGsqcnT`yj|P%oZQAeve%;AtwBim+KRN=W=i-N9zB9BB)yB>E>+57D7`k?eWuBfcNt zrT(PC{ZvX&^U(Haz-AJry7~$JXLyguTmy~6+|n^=cfK-@#{(5H5ytYQL{Y&EKegl zK1#0c>f1skZGlo@O_&=}{XJ_fcboN@=fbQm;8lx8`wy0;deQ(=w2@%c?A^XkENhqeNdpK3_jfK-KL>z#PYCw%=tj; zhoAN=b-_e4ae-NKzUg;Jb)SymAIBq0b|H>RP=ns}e27vNS_XGXbu#h=#pmCkd`)Ce zQqT(ZAJXSBe<;^(?Vfp_kU+3^G6IDD z(@xBP62$ndVCyHk6NmQWGeO(Oi(`+_e(w6RP*LM=A~wkXM^% zODWTTW`6;$1o(`(t$iRs%+Z7_+<^erc)L2lWJJinQD4KW|y z&(12xFh!-rq$h%++cJ93TWSHCEXUTcO35;y_kM76s(0Ifu; z#GnaYG$&{kXJY|O#Ur1bm)t254c=-bFiD6S-~l*3hot?@iSFyqx_+1E4m#%J$ zga{^u2yYK0dm7N2Txn5SPW2sozE2~5{(TguxE$MhLT`BwtF97SS`~j)PcvZH>db591e_H`eSSvP` z8Cal$8CxvQy_~aj8^UCtyO;N-E2%tHILkRST2Yvex0_pAPEkd+OYB=fCBOzN+05%Jp_Qy69r*(G8(=(_!1Ma z58|km$Dfh-OUV=PD-O_r-@sSnk}UtbY`@I`z+sB14KFtNF5jHpkT2Twwg|YF=aZ^h z2oz+}yXFDG0rVRn7vmQT@EM9={{ShfL87etWicXkuq_Intqqi>`P~PJm=GTUesj^T z6~$;Z)CJM4eq`k6x#M?T)sj=#H*%An=|wepjsznWGItcZY) z{NLgL2mo?r>fQGm{3M6KHa#-^fnp;q55*Y^OGGxLn1F-@0d&NGbmu?_tAf2VW((@Q z2)|%42#ZCa*8eQ6^Sn$%`AW2>z@Jbc5mLngv|_TS$_frZ{rUuq(-rjnx1%o)zHtZ) zTtehB+4815uV~F%JE`C5P7V4eQ@=QXcmP6RMIgg+aZ7y7dKGTW=BsgZiBN-*%>gPM zpu+(Y{Y&tp4AHNSHo!HXVGc6(_eBqdn%)7BGPpp+2eMV5dj46-Z5n{L71e;g27VHG z)K(r1Fx^cjjMs>P7wQsYIO_{tkhL%wf#`kaxA+5Uk&qx`t1&j=K*8Du1%grw%kIj5 zvwy&e37{d6YIY&OE)FnbzQ2C|2n2{!IDoL-O`_U2I)K1V<1{?L=kNqY*c*+=$F3VS zImw!gt7T#EXP`jSmj1e%af|vZRWP-qNXEiX;O`;Tz5oH}^g_WwN`l(hMm?ef9-S5C zlhLCouo@~c{{;O8b1nTJ^8Oin(~nUA2H;UES}AUMwKEcCEd&twME!Xa?~oP%-1YAi zJV0?ZLV#ZXE0KTV0=hthIbvAv1{cWMz-~17BM>1|eQCul&?gd-7$tQ?Xac{&VU7qO z!_V>J2$e^j!a{8nK;-{W%US;sX{+#NTw8K0A;1m}AduIas)zhnL+fWPx5(z413|@Un?_h<+Ca&B-Fh%v)iPTX6zhWOzc0z_o(OmK=;9+I$ zKl6d44^V!ifq6j^3epR#8;D$!a42n&)#1nX@veUxX0OI;gFUsMfF4^x^#Huenz$bQ z3wS_|kFDQ)#mHD>or!=c_3!WgAm?AMW>b-U)DIN5*j6yEn)c(Ee!%7Z1mgGl8-!5p z<^VMML~c$ZUrMtCBAA~P4uIY-hEJdrN}uRoNw9CYKoS)o3pR6zl-#8Q?bRqC7-dmc z0nvvdh1?>s*X4XgM^~8L|g^CLVdeB}%2&M3`tHe&J@e44z=peY&DYr!i zYd+UA`I?{4h*kFG6VZd%0lG}+{4W7uAy9x1+N$M(-?q#i&y9Y&JF3J(Yr$0(nEMy8t$`_5FK2yEEyV z$}RrYn)asXOWMo@qCNeK64*N=Oh)x!{X(c?m-4i;DW7q%1N?^hr>eM!CL)2P0gFMd zW^Pfwfn`p>&C_*h7eo2Iga2{z z&G8H30Tgdvae;&i6%r&g2yvjsZ6}@U>Nx5}JiyVB#vb~M`nJ$pGZ0LO9l}wospn&5 z;RHGZaErBPzy_rUh@0c)Za%VL<#QHWGW7=dIpAejJj3bW;Na2OPR*$ zD4^ylh|o}b90fWEC3Fr45WESxp&LLQN4p%sQOqUp97zOJ)DYisP5}_$3T4nag2VLW zWO@wvi3!q>i>wPIeV{@BmqS2QZo$236!16bchpEDHV}=x)HTJI=xDY$5uOC<_r8JSU%(7h6f~dCYYSd z_`NDo$*GDu-DGOEEc-L{Yp({41)Y{FCPA}gdjJ6x8>8y0Sq-S_JI+720Khpu@^mVM zUu%4T#@Zc-4+sggWtGrKAjDDeR8o*25FxmjKwl79YM1LlpMt_ndIzUR3|XWXF5wb8 zm4bZYorDA`s@mq^|4{Tg9H5N=B6@Z9s;wiy>=-`OX9&PXz3G2^${Zl6fv5nDR5St@ z1seIEM1h)BjhnY<>U;(VP{}nPCoA@#67ENUdySUIYDltC4VwUz^EPq~56_uE@mO&n zc+HvL=f%MnL9if0yn+rtmS^|FtUc(K7;xaO*HVoVrs~1J`7Bh;LcjMU(7imBr zVAgMddI#9I^pC7fTusgfqaNT_;(azyvCJ3pJK&$OC+~M>)dGKLwh2L9nF5T8D%CJ4 znKn#o22wf_O-((=4olIj{4^HfzH+b%UdUEe{{OG-{MF+|jxBCd_xsF0-{+YLmXm0r zP3^tGk_jgfBff#{n}~@N@hR4uh!I~zjQD`MzjLapyMX~oX>B)10E58*-BqVfS64S0 z?S2U_*`5{>HokrT;erq;j^Jj`>zxUfDh6l}$R~gg%mpw3P#~DX;!(X^A#!1r26P4A z@xP#}vU%SCsB;z=B%m{2m!YU6Ed?~J+-Myj;s$^ZH>baT&?k~&7N72z@!~~kEo<@L zJQ^SvssKa4008A>DX&<*2vSz*t;I*PFNQEP6R5<@*yxu4;5dlLA_JtB;Fo{dV%X%2d`x@@-X|5Jp#n#U}e9Sta8-EX+sv8rmlii~@Du z8w|iy>ji+W{!)Frmz4+YYkPXcfSIWA<@$+rQ1HpoF~|Q55Y$3Yw1~ufJoKyqnMiaR zX*@r`(bDp-yEqku-)4sL58}*%spr4@1^`=OA-w@%wEndG1t63N@nqD-)k0ACH3qN+_};KjK%fBFVE~Yn&IJI?x*^JE zv~2P~Focc*0D}OIP``mwx{CUaC?ZFhs8QYQ@fbJFKTX+G`BsiYjaH@9*_S4ZI+ikV zJV6Y|=gtIH|BL}r{S(7{zNZhUPx!?Q5v7$sunh(%`~Ut6BmgEP+zM_rQn*Y9)-OvM z7yyeD1Ms?|00><}uL2-RaHxDFXcpbqP)ne36Z!Z2(+p&B*HCZ&YaTIT7~ zdFc9oCII|;=vP$8HJf-8~@f)jv+`~rc)$7TPnPTXuv zCJ?Ap-ub`5miOX!7b~#}*F9PBNnkJsOjsbBxl#WM08?oU#`?I~fBoYVUrs^rUFdnZ zo&&(vH?jV(g1~){pDg>eC9TK|0SCP011P654D6$-fzb&qYt$W`hzRUIUYhPbV@RsL z>b4gkPvGqAf6wmz@5#V?(3M&BW4eK zs0V?;n`&};Oj1+<;R%=p$_Z2j0MpIYKkA9uWXF#`vLBZn*9es-a~ryzFBgUsF$;$4 zn`Zw>zC#@>@n;Ha7)1061GKXm1H4`ua()ParuxVL*CeT<22;B{L8(?PR+y1{tA%r| zARemFyuWw_W&+v`VezUKS_pD`LrN3RjVQffWXO2z@9=%_zqlDtplZk zK=>YJ0$aYyl~K>WRfkrozPAGG1hzo1Vtw)f!VCBwdAu#LI3r0#Hk8SAjMyONssH-* z%L9)iZufN3F9D#b-*xXx)<38`#1n#AUME@m%l(~PpEpZ$$N{K6fENU8XbAw!udVli zDj<}#yzE)P;9062e?M!DM#TZF2@PFI-8@H#is@Jm_dxLi{U6h_h#R=Z3s7u;hw;>x zkUfl9yn;i)d$#p`%1FY0$(BGc0fL1E1cCGeIy1j1m)B4Ds?mZ{buI~p{-b|=dH8&K zMJ2^^cz1c25X}q+dVarq-wT$f!i5z~i(Zy8ZpSlp{0A7IbAaLjnU9GNBFj`W@I-E# zx`G4(*|*&|)Ft)P#QXV{W?n(zW_Po@RXA9`kmG0W;CF2aKfwUuN|Y6d32L1Ws#MMT z0T|~cL__&jy$oo^0(J#7UB-U_0AGJ=svqoM^}o{7H4hjuuFR8Sys>}>)c1Zb zj?U3w(_nxQxxLrIGQU+CY(Fd^)V*x`hew%_e`J7{xqy<){D8&*A?nDBJOCPVShQ;R zf`Dv0SOC2z2-MaOHV9rI_dp=31mXng8`MTH!t!|(_XZZh8=_}{BZ?V1P37QEY55%r z(O?{aV0r5EX01rKsy9jFI~Y;=dp+?6vai4WR<^GSApVD6J)-U%^VjV^eBieFf_D?r zTYt|q1A55l%Wq#r28ccEzv_Q7T=W}Ya1kd!2yu*-zr0V+9YMjNz+YZQfbt&@2tUA8 z5;hiMZLm~h4aM-}G_Qh`MPtdDRuOK1#^HclAaMKhtzM6g$l2cD8BifGHo=`p;*MYs z!9eYVSk#xGxFFNe(GaDCJb5a}E0y|_2`84XoDE73`!w5DAR~$Pt4mRF9f-A}?A?5m5P>=j52Cg`kcieyYchj!x++ zQr%6Lk?fwNFwE^e52ptc2o{otD-p&Q@C*Snd4?zPr^W*b4K*BLfOql-da0b71_tNH zc^fN(fdv>?LbK)Me6xc`1V<(F;bGZ-1OcAg{PEM{r%zJ$G+F(s0vA6bM;Mf4bm1)TU0o>R=@jv52V(!&SHExFfJPgE_J|2YO|W|9-}OJ;6d zxNcEJU|2Anr6y_}MF07Eb#t+L2glJv{>YnAQsjcAm_k`^)RxxP(EdifUkq@#6#&Lu z{A-`V4!>=0j(eA731`72_GjM$zs4Z!tg^ zysGTm`w#b3?;8SbW%a8s9srC?1Jm!%j*+Gx$9$?T$KC_rDqsWw1;}V#6+B?@z1A<0 z5eS|#z(WB5j=G!cpU({fRSoPtPJXnu$QQs^U!!2c!bJRn1soa3R)OMH)camj9mL{F zC5W8N$!C!7m^}qJk*FAY(I65tgh~*pB#^CuW++pYPZJ?1^}8H;g}hpch^gEW!=4wfzSJ zkl%*&P>`WSs?lX=?xSQ$Q$6TLOy@TXd;!%Ws7nUCkPI}>H$HvBKVGKLCwm; z2%&!0Wups6n!>X_@$Q3n2wbqzGX?U=NCJQohWcYkzX*NF`afvasGdUop?n>E`23G? zR@rAJIOdj`x%BSN0ph2B`tEVTssdUiFt7Uq20vo?A>v|yp|E#Xn=CmK#@{UoLHU=V zsL>RDz}bpb5iqDs%dM z+P?sx!>Lg{q+MWcXP4@O1u7raN)dOCiyrf`kvQkfkl+#p16ch_Wq$(_Hdk3cEgXw! zX8oN7W*2`(>m<+G_dIqtb^xUE=MBDA`svQ0^@q6TYr;T&2~*F{(_Kw?`24W+;xnOq z3V=N`0cnbGO&{oZdn(Ba-JCH;2)?`+Kp`Q8c>@CS>zQH;+qQG){5J?k{*_yEfP4VE zee10ok=v8z2TaSIS22@hHaZZ-J-&=z3SvMPvu^-^1O7-g5V{KW)3}KwIw`fsmIH&m zO%Ziya3&Ql5o8Mpq7ch<|AH*$ha^~~+7bnDoj2s8zwVT$2C79cd{6FOrsM##6E9Gq z4^ZQPMw_Y$cGng}?P#b6jgYP-lR#LyA|l&NIYkK|2KH$eH~B z>`8*8vqm}WiBBe47+eFzv!h3Y#DM^SahH*}05)Je;O;#^B7RM~9LrbPOzU{-XAnrT zhdYX5U}=`OmHS-d4^*cQxtKu`K#+Wfrk1iS)2p<`S}=35aYrNb0pkYMUxP$)swvCW3L^5+aNW@&L0 zyb8Ps0Rl4;ezU$}E0ZlAzo%P*0n)2~ce;9ifi65MAS@iW5am<0wHu4NnxX@ov_}1M z10$vTH!U~*2KOgU$nPh42o?xmAoJuAOqR#?M!{tRS|%#b#_EqsU^I+TFylV505e7X z@+0L?)H1jJnYE1<`u2@Cnq7ayL+r%+gmZAWzkK2$&Jnq-t}GFB<-TR})9;A_7yvI7 zloi;@j;7oWP@I z#|#n+&wq#k6sQgCa~|DYU%(y6LU~Y{TE9Ly+5Rm<;?+#@B=v{=OM6iG1Of{puuNpi zG6c>J_1pTjU&=q&VmJrl91cA33?9*eVVDR3V!heEjo=^a{?h&8wp)H#{Z#SsY2%l! z3+peX`evH*5dy0D@B_&C_7cNY7*m1{e|utee1m;TjUM9RFb`~?>VPG;ZY8L#5X;FW z4-IVAt0TsB`hk)peU)#P&VIQg;GmaTl;T_c@BEBl03gcEhL;5MoUcqc78PX#z$=nb zG`I1ff91Mgd$#_pPbM2Nr+&5|?Wp}VQuk~hErK}d>4E3?R1i{TdQ$FC^pbM(n8@;_ z|IN9at~VGU^85AvL;4CXfl4BH2W3)dMJiFRqH4Ck9DS1(mw6AN+b0kP)RIpoP;}3W z!4PeQc0>b4h#dxSTH9aci>gcl(Wgs13^hm7`Xw^mKNPP|B+D@Kp))x*8i16+cAQph z4v=J0V{^U5XUib!|E&AR`hO&U?X!e1=Kx?bru6=pZR+8!ea+c8f2iN?ADNGszp{Oh zN*Jm3W+$(HzS`WqH5f#BP==mA6V|26%KHK_sempDbSni>Giw$i=Ru$1fU1A3iVoq- zmq8HKdbIc5T1ZB4=tp1rtOnzW;zvQ~L2j$GY`yLs^3zeVQwM>+hp(M~t3Rk*#i>d_ z1yy+$j8=yv3H`oVzw7^r*|!e~fVf!q_n+?8E9!mUV7!ekt2ohzoltLq zKu-v$g+K?Q+Wo0~ozqf+dsMylIhQ_^iS^gLt$Hh7Ck6m?X7t9S`V#!$*`-N;#zYkHsC%O%lXpB9yj=1as&ft%cn;BmKflBpeRj|Yf z?g@O!19<*;9nLIyN7?tZ^MFeVLINQT93Z$Fu+iH-?RB$9kQP`VNC>DQhHeuEbpAMO zbb5NpWUNyE0M`z6l{iyVC!a;=rS$MY8YFG~uJu!nI!_b)$$qso1vYCI2c+I?1TO%f z;U`!?zZsJ*68%vbz1U(fOy=HVrw#FYrBvOzPo-=E^ znOXlL5W>iL4GoqlCUPnQ`jT2d;g33kB%+J+1_ zzkUe^(ZADx^o>RUM9yO!Dy+3sOAS7kx99lpD|A`Co_0!G%z2QQ4F zO@DLEnEo{#<$|OfJ26Hqqx!SFI?F5&02q{COb`P?D2rUaX#VNRz_jbk9G~z6JRzHo z6olD5+wyo1!Jdiz4=|9#tnh+@WEgVXsNXM=wsa@%wxQnpYoej9!7=}qT(1iZPN_?) zcZ9va56I{W{{EGfa1#>N`dP0hLKNGb3Z#iUGc^Fn`d{$;RfxelYQHR|iEXGuL%bzU zX7#zE8wf<#ZTnW)e7;sl_2%MN#`jV^2>@_`NwYYhpupA%m^&E+R0hEWBN(KdP=cP* zVeIG%cTX_@AYfJZa+n9^CDfx`7oo`F#oCt2!}61PxL;#{xUWY4DDeh>n_K61xAr&y za*iU03ZN-J3f0WH>$l1qCurSHTH2Gi!jqJwpCA3;BmA!rC&5VbKXw1r-@ZQHLYpMu zVZyAe&&6Spg<2|9*4S{FO zKnyTX0SCdNEh^nK4c|2@00vbBXdC~b{%&NNhkJ9wa2ZIE4w<(9Y@Em8O(22K@NMp#Gr4&Hyq2rzIB1 z5lvzN0>Uc){^tD!W5kLBMs>ISUgonsZ>%euDCuY$L?0Yr29V$3MaO_d{3zKF^e~2r z(WpwC2H(v9&=lU(n~g(#7E{E(e&155e9888%)XQT#{>ZbKSCgkoJ8j$;-?21rf`EY zE#WtuE6e^LI3O&gDO@`fW#cX_q&$an)dW_56&% zUdm7Prvy?W0Dwv(Qj{~55-Qm;mDFa7i+OQzeDtSi^OLusd<_8o*fmD8Z2gj!jYd}w z7ck%;BDEZ`{k29B#nmWKebN~@o|I5mkV61<;cwOL+*x9GDLHEHw z{Qf&=%x>Qo>;5i~+?$YQ0|5ojMFEmZ(XJL++yYnxz~l8V*c4)HAk?SOWj;Wq@=O+e zc1jsoyh|(qkWdXZG4(zzpxyS031vLkBZhbn3Lcd$FkZFq!aQOfijK9dzFHjyoQ~U+ z&Q{D`b;YaCRo%*`5m$+=BG*!APu&;j$Hu)S_3Kjkufiu0<}uv_)ha#liVmfx&mTX3 z`S$hlSB6|X-0d9;X5LQTTRFA<1z^7N?$#1pMb##eHMIa18Q}RD zcDC;FL=E0BHSuxxZucz|?c9hnTcO^wmB8R@PEP6UMUD%X1!6alps` z0UfmfY{i|Clp&`(hjG;hFX1T<>gR_AZ~-Mc2`@C?S>Oc*@I1YG{?;jd0Lr-5oZ^hd z*BoIA{2rbB8PtvLT>wAtKggj}-nPiAtNsP+*8?PKJ5ULnpZ;a5_Zge^ZOQ5VmsWpp z>uLkokJc{{Db+EnvHF{Usd!& zp%fH40Lt)-@KvJC`IV67|0)(nmPb&og&Uo=#zBVGD9ULIl zk1QYrkPHHgxK#x~0jv`Q_T0IAJmpJ26O#;E`M&AWD%3e$Ppm(bFP73hG&U%D{&w&S zFZcR+$3RkI0C3nf&7WrXW8Ghxer+4|e?PZvArxNc&eF zfda30^5{fqsFe ztADVy+9fYSY>K4(?g0jaFeViMw%<~>dg?mdYg0ZdCy48m)~|sWN}KaL-nt>J&2lBd zz*36&Ax=fhR&>euNq@bn0fHsb4$!2@=>?1oATDr95TpR?4(gYbGpw_eO)Hpr? zqLNszrBM6S`t>OoAbfxTXWauyN~SOv;6J|P#B;yvccZ5-n*AsJcWu707uG*n+nFd` zx3B>RYTw^U)DvNo3FEK@eS6`u)Dzmb-eNV9K5yu-h1&Lq@iT@%=w6mzONND**qv}g z0)SjalI33$=~q;osK4^#d38?p1{iK_LJc9SDL67fR0M)TCIi3)&nm#`pD5pu*E5i+ zza0$o9i#9a^a~J(%5eq>8<2AsAoFLdpV0+Jf4`I;tC323I=JO=jh0-NAJ#rXp!);C z3Z>J&6|*<8>q_q@xRH?+KpA~_{9=r-3R#<%0zoUacDgWZyK>;Pv=k0rTE47b_8-=d z8w3i(0-i)c4{>s}D|-Oy1{N&KE8#QYxl4`uAzxx5g7u1;Ga!E@=gg6T2>?>t-3O>W ze=)MaOYs23K&$Ln>i~g41SOUDzFJ7J)iL=hx{8Du^ZgiZss$x&BjPtbQlHYO^}9@x;0+)B&uKUO@ACB8@)2tp89+oE%2y_{E)=3$8k8QS zEerI2we@BBEY0epUoF;x1oW?2u}I$YRxY3x0pM-|03KDpTGJ=;?vy9w)E+_Tgl82F z*kABSm-;Mogpa*!R{~=-AUlZvuKdmbGasP)0j6mQfF#D5z}?VqA_({~IGqpXx z_M3^7d+ugOb5B@djrULgf$~q}L6w4^|4S9w{VV$~YtQeznSUq!k{S?1C;1`13Fjg9 z+gf-D0GMt={lq}YrUCGR^$#Fub^qM*anM}n>!ImTz8;>o{Y(A9073x)7x~y;!~jtN zC|A&uSb*$Yt}pE8%L5Pu)<^3N($p&;yitA@-RL*|RpeLeeo7>-{J{Fvr5eMi z0f6d!6xP)*2tfZ@5C;q(51{z~R^0P5-X1{NQok!0A6I z0HcHiflQ_P*h<7&G8q69#Y;H`f0SPaAO?V;{}TBVOKFeAsjI#-KzxHc%R`4as126f zl^F&?wp??14PN~t^|#dZr23yEj&}zO#ekw zDT4Nle-=xd6v1fyt>(wdZTWu2u35i&)@A>$@ln4*Av{U1wL-40{kf_tfY2NY6LTwP zya5X#Qja160f0%KRx34~G+2eXJ{%fCRhy08*@LBp{ZCZS#To=U2n+zqTPawevq6~w z_J8Rza12Fl0BE{PjoY%# z4&IwW!Qg1*Zy!L?YnIQXXH0$8|7T2~pOZA}&lvQ1z5d5km7?Ab@?Wt0u=|)#&j7&w zX}+b}nfXHIPb%vNP~icX0YV&*<_BK*sOedFuKgMnuUFfjeqy}B2KzsLcgDQUh#f#7 zaCWl_Fp5g)we`Vb00)9o^F0nQFn|motRF?m%Q;8=ye}YO&-^{3y2TQcBu{vCL6Dyu zMblIOkPjnR;rJgZ%0N=yX~zhRgMnvzza1&X_ig)1EHC4z1teiM{(5fvho3o(AA-!g zyQlyfLMgrpFpC+PWj(ik!+^rdy;D2CkDX8A4;ZLp9rcU;nU0wyVPFqnb470&{b_>- zVD$&}y+`>FKDqP&Ri4kgc(18Fn3GG7bY?zPi71jLYjd*NW%>0Vhqaa}JdqR%nWvdA zK>l22>GSj`#{n`RY{h^PET6)N0b*$~(vIYGdcM|7E3T2{io#{`_K9S`4q0XJB0I^2 zich&JC0Z|2t9G7sE#*CuG-vaz1KO&9&*;C^`DOis<%@2Ao=?|wdHJ=FhFKL4r!TqU^n*EIovJOB$~%%3N2Q$cUogAI1?d2I9e zMDNCx=p*qu2y9C*;rA9olD+}peI3=+EkdAT@(=4T2e7tPQ*U?NgBHjsZyeRL04_Md zyKpO1_qOs=^>`!7lO#lWI5~2JLgM}(psSVqfOt^->Tl<#fPvPK;=gWxDf^++fI>mS zxsJToI!>*%$`t=DyY0W~dZ{`B38nPD4fWGxSgijM4&wrP5nJI30xo7)zZ&_?`U?PT z0|2uBsQ-E5)+t$lIXZ0r_5$=Qkm#RcCje9s&Co>&IDX6g9GZdw5_MONl`jTR%fR+8 zF_6;w(S1u2aHIx+8c7r+AUI6?frvP6Hb1S7VQDB#LpDh2B?J}0JgmF@Q^ZX8{u)}! wP*w6%d0;rby#cia?r$#tcDIHd0KnC?PieUeh<240q^khl9zsIkc6xsNe?8v>Vq*t@#6>tS^XUQvI`&KQy09)bEl|Mx%t{eOPJ^`HO#<;(v@@IStM`G5cR<;%Z) z`CrK5Qk`Moxc>O#k1xN+{Sx?>q_eX#e9(dd@aX-iX6n6kIPvCLC#QhxiQ`|v{c><67CGO|ApW+T-%oBLrFL6J| z{SCZuiTfq)=eVEZj;1kB;Bmji{T%mG+%ZU$0+0J8?&r9l z;*KQd2|VtXxS!*GiaQ7~PvCLC#QhxiQ`{knc><3c|9g)6Def?ed1AV_U*dj_`zh`) zk9h)*`z7w@xS!&VhA~gzalgd<9QRY)F+@lLkNYL==eVEZjv(d0 zfY%-dc$IitFx+^3Q+%^UFW}@sBTm|NGy+{Oxal`|{Vn z{`JdW{_>YEfBy5Izx?S>fBNzt{}FxTil6^|?GxB1uuov0z&?R}0{aB^3G5TtC$LZ8 zS3QB>emi;c-%imJ;sU)@x7h6T8=k=Vt3F5XkM&mFedo{2@Ke_oKU49eP%B1PMi@VF zq9%#C8GKHb?LZ*WD2V4D+n%dX=Iq6cgV;gMg+Sm*u**v>EJ4B{az59FC<~_1gN;P7 zIBg`ix+m4m+8=H6{MzbarZf`dS>$dYwuE zLBR5@S{cbK>qQ3K6qykOIcq5V92cKT&xMs=dwut{##0L9qvM(TIgCke~nLGSV-^UdSBGu2w%6pYIcR^0Qc(2`yqCGoBd+1<~2nd*ZjfZ&w_tg%H_-t#Ufnw3H%Yx z4f$E=y7g7FD;)0EZfCtWwohQ6z&?R}0{aB^3G5TtC$LXopTItWeFFOg_6h70*e9@0 zV4uJ~fqeq|1ojE+6WAxPPhg+GK7oA#`vmq0>=W20uuov0z&?R}0{aBM!wLM?e|?9h z@89yj9(ayNIPX6h9KT=Z`_J>h!QD6c1dKx_};N${f z?5ZEgV)11`$hd3HW08X3h|*^(%?uq7^U~<&WC?QsZ!7~g1z;(+7r+f5KS5j9QvBfQdwqJPPC;- z@{6lL@Js`y3qeabl@M22aWsHB3$gc4*%nA{_M=QCGC3Ez!UZd?k`AcpL~5MQr~ctZ z9lO=i9QCSkeqH@P8Rs;1BD1OD+Cjeg9RUDMcr^>{H)&k(XOvuE~ znyA^yRElC;-VW`uSY!strc9+_(y2yQsOkF2ciM2}2#+k|R8X16E-E~awSc|xyse0*wPlJ(?dISx3#yc=S^nKoE;T6>ouZAqj zN-J2O9EDbFRtQz8RX<1zCrJAKU~||giS|m5N1G;UVY(;Ov@Oi)LpyZ0wYRGeHQA(n z0{aB^3G5TtC$LXopTItWeFASk0sTVSel1;pEncnf)mQ$`KlKS5-v7P7VD8sH_4EEP z!{Np7XDt@~8SJ0Y*j!@JV?3M4)TFSXdU_WcsSp~l9aZ(RgHV7b=s?nJgD#CUr*g8H zgpyT@bdiPBJPe!i`2qjbS3f|UHEvvm9|Kj3Q|ZaM9mVi3G^ADouI5!&z?mjOF&8V4 zN({reN;nk?oz07*x*UG$wVpT*0`DLnyzpZ{7TEe&C~ZJxp+fO0untsSLxUg5{t6|b zp-R?}m0FXKc5!kfQH9iOq4829H3@*g|0S;ViSxlbKF2tj8OehZT4xvOkqWTX5(*l& zqb?#1Q)AlP5)QcJH1x)7(;F9L&FHQQoPLQ552_!PSn<90lPe&SAR#QXB+GGJS@PkL z+AX9Fnm;^Yvr^k##IKblcUKFDRE8BJr>K;@FhRL?I_mjQj8iO&pLt!MH1pi2XFq~R z1m`-5j>$q;(#Ch?n$WliL0rk>&35u&ji}dum6)f~A2yF8_g*`k?eVlpKbTG?;j(-| zR-oz*DxZCj%_U?rlKFzRj!Wg(Vk7$m_6h70*e9@0V4uJ~fqeq|1ojC$dIICu>k);v z{Q~}|)6c}4&f@Na-9N0?`Q2^!j)XDUh-km0@7VGOuzKyo-{s#WTpmg&^=Uto@rBc0 z(%KF&;PHock z4`D>^k0@gYf(Q;pvSvgIVKkJsukUP%IdU{VbB(07Ifvju9=aM2fkmj|^0#6^RXba4 z5gU{|OwtIzTyRSTj>ZtF3}F)Kl}U4?U*pSXBHCuQ>fWhAkNCu;A+a$5G)6HeRY=XB zSfr`&fu@{HBjiAwr%mOD5M0keVN&s+uE*9c&d(PD$^#cza?(l(TxPgaOaukjpgJq= zFdh{NYyr6G+sMPTQ77Xv#~7nxLmN-{)QQQ&n#vz&il@}aGgLmI;*2>kt94yq4^~O& z?=I2nooq?Msl8EqX+vWcxhfWrmCPn0W)m3$I3iO|0MxKiZV7gQnS&jpc8!EoSSFYB zx4z~P-yA7wl_ndg<@=dp5&w!FRV*hKks&BsqqjD3XNEDE%_U?D zKBrSQB}XG6rzC)16I{R<@xxp+aW(#@N0L3?YuOe)ji|a^!_+! zG}v@2x(r}MC-#>`6b{7!jOZJgo;`T9zB$LJns%Fg@+2GDC$LXopTItWeFFOg_6h70 z*eCGAp1{Sg(CvBdGaC6*g|{c)zxV59-9Lx>j8FC2+c38#zg24%cfrdj-sod>4;NdMd?k5eM9p}?oG}N9 zU7vKB=|al^To5LURH!g1iVKuF2jSq{W|8>=9A#V?3Snl5NNS1?3y7q?xt33{ zk&A*JlMkRuPGlss;%?VUmNaDcLp_o7A|}P8Q=QKZ)q&B0jAKvR@vKBp5er+A7z!4u zcrBaXX9=hjRn87Bf*`|MMV($!)s~<-sFSLr)p-QxU`AVRAW>K#(ge+F&XSTN1F=(( zF3gvQgR6zuAZI5fnuv8zM80U?kxrcoV@;!#VRFLqNSTVB03brAi9%^OHYE&XLVzl= zWCBpbj-RAn&RX@8VXd@=$*^H(@Rtv8O@fN61}--`&+M`d5o5R(SOF~~8;zW(SMh+7 zq_uF;ESW$h$sWxu&{1R=-RCQx=)jnL{b;G4CV(Mryd#e*or_z+N%;f{Jza8UrkXoY<7dLWSBF!lqC7xJx5?%16e5br4uXUaQDNd&x1GGh3Bd3A-0TYgodBJxAOX z90HG~Ng@yeoi9q@Z)GuLC3r1@>w4Lo2ZLz;96&o(7NA}rH0Wh_6kQc+MRWCNLrzxH z(GQG`15AAgKD=n^+w|mk>Osyz%s0U6=%5eksqz#&^A+)oe#DN59Z{%a1=;QZWZ`S} zspZ!gLHjim>g#xCf^2Y@dK7-F_n&j?xtZ0E)?E9#)4e)ZG;_l%$}8}7;#WvFb)UdK zfqeq|1ojE+6WAxPPhg+GYfj*s{Ob80O&m43H*taupO&Q-|{ac4O{dKEvwrbHg4aA96AN|2v<+LKZ63X-60*DT=;pDPUBy`lq z*oHiScVG|C#v?)|SsW^*FpkM<@2dfW6 zLN;VUZKZ@!>fAQCX_|=qVRE=o63r1Z-ibp3%zKd)7*#nX3n$fQ<H(?Fr1=_yme?L_Vr`^3iUeiNHgmrrptw5>hc z!y=r9={21}h!#VN;8pmDMyLL8R1_eoAJHW_@OfqI6{4tNO_Qp~M@p}NE-!m{#Njv` zAayf<%tkd8#;aO^oFz1=phW9YdS!{-dm7=g2^s~HzKhS2k~tp7!uA@2ukv^|_YOfV zhN*LoG*Cp9!4kQzUP@dpB8^xPWT?agD=Gp3yPj=QL1_7iXs4OX8a>2PKgVnw#9k7? zE80h~Y)c1BH3SPK>4b}Bt-!v5;R_tMOOr8A{&#^~(8NW`$SEomAs=IsJ~8KVSEXZh zaw{q5icozg{ejXqB&n+5O7q3cvPM z1rJ}^3bJ-X4er9f!;bQ8!CCbTb03t}@_4g-n86xRuiuO3PIDGon?`SyPQOSd-D`EM zr!d`*3?MbbdHE8>$k|~8q8EOaqBs$z#Qh3$PAolPxtU4e>39i&+GMyZ}u=~^vTD& za~As3n@`~f@sB7nh7q*bB-Z?Aa)ZDuvO13jF62KUC?%=&0g5ZDvCDx$wiScircITp zb^&)D3WjK-HEY#4YxS=OGmmEAG*~Uv*QLpBP$O~$`g}O(mA61t(!H=Lxr1)MWYAm~ zSGGvW`3`B`is;Tz@@@jA>Zvi39-T}g>q2`CFiTkbC;ex`l>w=+!!!lc0d^Dl!K_>y z*rU23ZNp7C;%wv`7kqE^mO-IVn>>o@kBzM)gSSQXe3 z`5AWFaVE~vTeWUB^LphhK4YI@ceNCqDJN`7&OGm62mJs>bo9WNk6%EPK)gj>=W20uuov0zz=Z(Z~2w>M`EZ7WK~IlG_249kKTCn#2?@Ovz8|laeCTB1oO0|n`TO$gzAvqV!)X!o3j&_ zK=p|Y-nfdy3gLi~$gu2+uRwSiFqP8&bW;!ha|wF_Y??-OGnVz}TIqn6an)qdRav#K zT+>c1Y({W&Rf;?=ta-P|0#aSoTmklv42qnR+34UuS$DgNIXK*AWXvm^v^LwM=u#I< zMW$;N1X?n)#-<2s-q|{GLyo!+It{@{M4c+2e%%GTdIWvB+K^FUR~FRSd`>u&w%{y- z*Q^JDhBO{unKUA-{%~n9ond05baBe^RF$B-$RE$A2!b>SB)_Twji*G28j#ryN1b{6)c0PkCq8iH*RN46$HU9cFz2usPyWbOpSK3Phg+GK7oA#`vmq0>=W20uutHZJ%QP^O1%}Fi@E+ANYvY<_7fYv&DmEGVp^|V^+zq42MJ3Tt{8Sf@&u5q?iP3pD#@2h(vmRH5k=@eGOB}%bgCtfFx{h$9cvba5Cdcb=Ob-|CYM=_!5(tJ zN;h`0FF`g$(G`2t&wQ2W_W2e}&guJT*T8{Z)I+5kJ`$JHP4Z)`dZbIb3zv0&Ey`#a z>RJcl?doFneN&8j99Q4kF=W20uuov0z&?R}0{aB^3G5U2+$ZqhFSh*6`Ex(XyG-}saYU~NPvmjKcbWgy zCJ)c|F!9wRd?vwbp7Js7W32Z)19prB`}meBidBVdNI?H!KnBIB6W2cB#%m~4Kp#^E zBO+kBL^$Vwqzd<89w_HepQ;qPAT)voSM2)0h6=AL&jfR%1FuBGq=P`41|iD?lSs_4 zHmf3`0rqraj6|Q<*nwp(r8Pl<^A%hhF(gZo)B{bP>C%;Ym`F#X0I4^mt=H3wEJzR( zO&%k6F-a?3x=ADobj?<&khLI>$tl}GCaKoLTvnOqZLrYFS#Fuzkc=WVI~JPn%1Iyi zW-K`Y%FmZcpqB*$MqImrEHykBs+pm@R9kX+<-Z&UkA2#eI0nK_1 zVLAywu$cof<|f&3s3#M;(uj|jhN;SYv`PUglhYVS;v^g_%G-+a?uCp!HmGqWI>iFB zp6wc%IvF&R;52$G4F3tFCnl;(UEB+Hybu_RT+y-uJ(Q%rSS`rSEWB*^u%i-G@?{EE z-eT8t;~-Qup)3HvFfK+$-Qk>Ljb>`HG_bf_+hFJ=(AVzE5DEz&?R}0{aB^3G5Tt zC$LXoJ%QK!wmNCAei6OGL;RXvceywEEOY9Qj|tq#IDtnGawr&G$*%C5qQ(0m?#)Ks z@L^&X{RA<8g!J$c;-{dN2=u|vWd3|ipr0Q_-{qlvT5ZiAaVk)?&<@NAx2R0AkPeG|c!^s?U>!o{qMw+lrFk4oC!OsfrQxtq z?&q^cBsEZX6izRd%NIf3HtUQk3QWgT6!kO+Hi%q{klh4S5j0#7_%4PjfCpp_xvhbz z4M}2}t4DeD^0CxtAo40Kvw5&U2csedZT_P936wV}-CgW9z$5pHsIrv?(%~vnR20*I zCRK9*ViXduuP(lQy-j!RR9}M`kvP^bHKx*z}MCYZm4SsTEXSg+!2sv9m$1&1Fcd+G9WOT9F3H{2U3HA@Q;mo3;8t-!h)BhBXPTM1WcLO4 z8M3^^n`%?i-k0&Eyv)nAQCb)!WHZv`s?^H2+3WV!&+D00NxQ1qsNRb^-Y2k6V4uJ~ zfqeq|1ojE+6WAy4+7tL(zg4zhcVGJ;E|dZwGAub=3HkL>33C&jND=j+rb zmc**e(!KI%-{$&7{YQ zDR3d^8Ph~fB7JB^i!{(q&u%;u=Vs!mGvZ-iq2<((Zk~XIQ&>e(qngj==L=XAmKeKJ zA3`EChm$mIm759n73RJd+|pGbJ}i8VusA&^zQE<=F!}9I>Dey0<|9Rxxm@n%lBCEE zwvt6My0crkH1h!Vd-5)71*6v(A5+IAjy5}D<2CZZn%WvRece>WcW+Ev3d5=CT+rj9 z&U{;NQ;igG@)6R3y7>hQ@>3OWZ7?)&)rVaoY-tp$JV+h#fCWKZCuIaYOP3b00?m6&J$2iP za}`8$K1FK8>kWF`T~gr(LE6h@G@&aC#k>$!>LfOONE(@Dc4@$71&}Yp_CS1hwqmGy z(VD>GVlCS#PrhXKut6GOrx@hpHJs5}T8=p45_K-fQ80@gR2B|Rc5OJqxQ4LDO(WVV z4=pvITtJ#e&pbg3NWx6g4-tUk%BrPgTSB7kNx_mg=Ab(<*_-R8>Ox_L>OIz+u111u zc5u-16EjQc$+=9`dxv{XhV4vuMS_sT4sa>3#rI znBi2;=)G|cYzyS3s^YVr!fN0%GgB63n)R>4%se@Ul`!Y8Z9c0X%(6-Dr?Q(xD;7?r z2r4P==`oG}K8VL3zoYtKH_g2ELJ>yj7>jr16t>Vg_-acw(Y^c(C$PTjpW&JIGwc)C zC$LXopTItWeFDGo3H%(t-7HV>VZVYeeSV5B&W9b=H$9!{DW>Fo$M`7g_-4_%Hjf>k zKH5fmL{(Ihe;_BxUiz~%{CWq=fm!CLSq)@xXj6_H(#6>Hk!KoD)ods5*czh{wUg3% zQZ(RQi+R}$Vp6b~;WfagU{cRB?@) z+1hGF;5#5$tIn890Y)kvj{4Tlo#^4l*6;pWsrSSD8hTJnkAju!|S-RPLx~ z>4E@H{_K<_f>ewtdQ~wv2hRi0by>{4*DAhQELH?0@}Tqpz4n@TZCE*iN@mA`9aKKk zcD7GopTItWeFFOg_6h70*e9@0;Jcha|9b)h?B7?v%WL?KP3Jd0XWwzG-8z0W`FCcl zdMgzm2c#cf^2ETQNme!eNH?Z9(Ay%6gtc5IrRoefU_&WX-Rt|FK%8y=gt=05slpPY z7S||8G-N0G0ZqCxnCs~kC|r57;a=YV1bp=TNyK62;g1Lo~}r8O~+9hjPqKdnq#zIEz~LO*p;2B z1uw2DXB|ip7$*@P?lXiePAJ7dNNNg)?8%xqBd5e&h9zargLe?Bomi!HQ|7Sa zWna~}W~o7LIw2(o|5W1+*d}F?OLaxG(rVJJm0utZasmL;II7n=%~EnniX;=I98Goh zkG$~=v1c+xF7;ZQ%#T)dTwz(FGu)8rN*>Tz7Q|YW!>~it3>=IE>JkTjgG^t@fuU%WvvzR zF$#)#c@>}l9rGrlGnnNEg0(QTUP!Ig3-$JikXM6b(Mj}_HTY+m#9(&xGKy`w_#W}? z5z0tvHZg7jX^8o~MU6-sM-a@&f+>Qy6ct`bGntx+kOpW`{T$mnjnN493-FQ21bx5O#Py~+zP(h((hAS1$gWWDwVweYNbj-83jMCq!$;%nY4s_!wl zP!(~iS5iUoP6B5^>E68y)#NaDBU-jLpX7q}se<(DAI5f!dc+xAj3Mgwp;}WNc z5>NW#t9C=?7K7)A8(Xw)2sx$%ndq(JG!aM2VUD{@EVKi%{-H|N9d|=J~oT<)U!6x+;{A0gI#WQctj;=tGgFWNMB;;DYxW=nWiMvO} zxi{bD(NV%@bdoL$lf_8_A;n`^SjAZIky1L+s|RR|3NO1B<4(Ynzr$g98uB4kDzInV zItj|3JQM;!8gwO86)-$VGFN0OayjYM4U;zQ7n+H)lYIjF1ojE+6WAxPPhg+GK7oA# z?{@!UpubYZnzeL}v-8B7mif=!nw=3WEbZ?Gvv-qxKd?PbH5P$akX!Xvjs zxnGsnGjf!1Kz0%jYbs(tepU#rI%`o^%Akm2z=Dnej04rBa@hf26xqR?Qg(fp5Fad+ z0vwQ%u31UWOM*aHLD{BY1#2VH9$MgBW@Uq;Vj-640*Z?S#0TOqqXo=)X|Jk+(b_p3 z2inyzz+G;VaFPT?5i`qniw##YY1LA*N>p{Jk}0_#yU1A`I|o5K$vv~iLju?>5zAH( z;L6QuE)*B+Ahr})`{)Lp`pP2XG+unN4F^(7DT>z(01id<8NrB#%VaRC%Z$N9tWIUr z%dlx9yX~-(x+}7SsmJr}WZ2{KuB{VBQK-1ZKshegV$+47IEBtw)vbBuhC_j&mWqX7 z%~{$=5elB@CPJZ))WbqvTmi$^hHEbF+ zD5@u+L4j1J&Dar<;}xQ2H)`V9y1SY$QFAFHVWZy1L%YYW9QiSJ^n8$5wAU+28o{Ej z6hS3ju%hQAD|)fVX?TWZt?$Xpz1MEXXNtlQRFXamu%yX)eCK!WVfy`cD`U;)R=2Ci z$Ioe@JJ&AglFr@3qQ1`~5(oK;E$T{>mwOfN2B(Ug3dI9q0haV`!%f&Huuov0z&?R} z0{aB^3G5TtC-B-6$lp(!?gVPp?-hQ7sXp89-{0Vo<87Wi^$GO7UVH2N;ZuEhgZ40w zg|C{(WPNL5#h=4i;?^fNV7M4yG0&jkMoW{0Knt4L#FnIWQ~C$Tw9#KZ)LwN{WG$jd zLoDLxHH6900EY=E=?(bg)3iB?SusG)4qC+JQ8}BY36jyloFVE4j=>%l%p#SIopOr8 zhp+m!H4R{?54N1zi1~A2fMT&)O1UUa<8)M!%&RBDYEhrB(40AG1i+S2(a=Yf1wg65D8{mzW;TE@DwK5Ig|I zd=lcyxvEy7o&}&Hip!y3Rk4Z~kv^4+!PcDK9&%_t`Dj(>gCmv^-5FLxw-N^>T97!# zvMvX$#%5G*ZR=32JAk}Y=Cm>gYaSg6YTc%=6E3Ek_)NO!SPdkdKs=D6cm~_Z^n>cO z&jP+lw0P`vpTItWeFFOg_6h70*e9@0V4uK^6Ug6mZ&0fAX@5O^%|q1F+zReKsXE@J z-RkjKYOi>RS5Uw4)4lU#57?3N0Ph_RBED?=`#f95UX2waZ9fE+il$YXr34kcO~J5Y zq#w%xO)Rr()1Sj;H3bo}63o-c97V<|C`B`US}j=O*27OMJOr)@6ay0{j4Fh@ zNG=5+l9R)PGtVN4;Ygq6lCC*h=I&?Vt!hOrFQ z(r@&a_U;PLbfs;%&(9{3x^a->5KUh5DHu~AX9xJHSk7h%9YqmywJy`u3?9cCoddqA z&5C4qG_f-8Q#a!2csj{L_vU#VjYTaSoa%5F6I)Ht+NU5T&E+D5rA;-a+{gy5^aAuS zAe&o!l?eCFZr5GizgTdJtEQT{)!-ONH;*i_4e7e-)T^WPS-O@(#|;M5HxD#e~@~J4m5(QzLMO51#zU$M))1WPL1(-f%%H%iGmv0PPap3;;36;z$viHD&_tiV}$##T5R zUEx`OWPcBj`+fW%{Q(o2#23??awj2^6WVIH=0}r4UP1MnyHu=&HAhci2V6gf2iP+j zzbbdXOU`AX&S3}p1ojE+6WAxPPhg+GK7oA#`vgAO3B1!UvF~K_b%*ojzpuZpZK*%S zA=EUF1@AQTJJ~!o^EK-`kMXhX;jWwipfvuSDb6F4`Vla|++zvq$PgAi|BxnaBs}uO z&^~P@Z}O)R!Q-^qYVc|4$;}dXlDJd$=MlI+W7PdQ^kPpfBBcvONC{C?nyWWG4gbHr)@56b~GT z6yD6rCIb~q{36vn!>4KvP*GSbOaY=)4mqC?akD%~ihvIcHs$SPMgVr@p;~hAW~Pt_ zSNhcZ#}leGJ(UcsnkrCVITV7vPEwxZ6$}nYT+uM&aVln@;M+7(q0z-2$`A^U4G~kJ zM(pY~qlZWktoh|Vf;K!w{B{VWo6pyotM@v-tCz4c7EjkBkPTZNC=+T7^*%&S3 zvNjVn^bD;#cr9)7mLdXBTrv!R(xbuf6T{-xrx1D+YgiRTW>dOt8q^d3^a&|Y-vuL= zs}E-;sU!|m`rr;t;mDDCEM!8gABXt^*vZ7ny(`=kzH9h1U5>f;jIXAe0--~7lc0XyQqTL`d z0_K2@$P-YMa|_MBMA<(ZaURN(i9ud_X`TmFY`Jnz!A3gN4?rVdg+nuks8X1FO|Ss$wP3|%fMVWrrOJZO zTuy}~p0Q8tH?&V+pTItWeFFOg_6h70*e9@0;LRt{ez9IXZj@H)oWEH(+uYB-s?q*! zTL*mO9B!0uznnJz`uZ8g!=l(8n1d##>1X=Q|Yx;2a^mz)-bB0E}$k#;Nf2B+)P4^475 zFuv!dC$2RDecI-5lw#gWB0$0$&(RBt2PzWSMR!;#kmIWS7)&*>4c!uo7>DlW2VWL! zmwv#E7vD|J@Z>bv$w&c-n9aWLj$ttoP9|dpN-|WnIDqSu96d-njWYd<#Cl|Lr65ma zfJ024r~*gdL8l$vO1K0r(#;MMrL~9ANcKZbbxYjw1cxqQeqc4tRuu#&O?9{YP8+A0 z2GnC1^28GXlZrH`Su^#FQT} zLK^r}xm=#~_STHuXoL?!hDv+J&gpw2$ibcb- zlVf6RIu7JkW zyJOZzt_$7;+#Piq9l3}f@H$tn!ZokAyvW;RljI7gd}0DQ085uoo%(xyd&YJiD{+4K zIWzZ$dUmt=)MREZ*{WFci+6-)*N^N>xWd(SHBX0Srk(B+*e9@0V4uJ~fqeq|1ojE+ z6ZkGC@G-xievIqU9lj+9h+OTZOET?K-ZkRq%pk4lyi=(F}} zl`?Z1Y^7U*Q5zJ>f(Jy>zLo)LT}8UetVwQ$EZQRtJRhYaGCx*^y`s^hPl7nF#sI`r zSgfO{1i3Nn4i(*4d#{IN6u`Yq)1n?Z`-7E(bpBA^GE3X)vjnIMT1JsQzDkH{0=~ck zjpth>Q%RGA0SaRwFuuoSf=;x6*q4;5z+q4_v2Q*G1Z<{Y8eCI&J@aDw6h`7OJzb8p zKF3}vX^6oq!6@5JoNN^t9srA(mBZ4Y%Smyeie*L#7nvPbOKqrn3Wi@GMAe6 z!k#pi<}*aC25FOXwxMfj1KCDPKDgYxVv9@f7LCLbq*NHb@nq#=W20uuov0 zz&?QwI)VI6^@Hq(?cLvY-!RFQXR~VInB~pURl_$Megfe)dZq{3JV2Sx>srt%Eu7VF z$llZIwe8(IHbwExjz1#XpOLBn9AA1;l-5cWI0&>!N-u}37KgMnrjFCQ9#tD<$w2v! zU|6ynr24Q0U1^6@3}Az$3^l?G=y{lh47m=vL}@4wyNimomt7nV=q!rYw1k<|tTSzD z`U-s8S|bd5O<+4Gv6%^c0#zE-kt>?nvIW~!x#c={H3#gtEK)Qu`BagG!W4A*K){?b z0Oej4(;9UeOQKp83`XSb<7)Pu$erhy<0KiFE(CGwW9+S)O^27hQHI&4dexT=RVn() z5&9QhMKFu)GM>aR0-#8JktCp(Brw->3ALs|-ctp}P!u==$f5=Y19PQlvzjp3K!)kH zQdu4>m`$*ru_{wT51}@)TKBMs2@Yc9_1gUKg#3);dyd*#DT1B@#8nnnUw&e%om z_W2<4u$4?$>fEU+j+;{*OaC06WbtD?hflYB?wnPIX~hgSz0aT=Q3={Ju4FhJ{RZT^ zC{tT--g;%z{0fJ0pR{Kv@FECeWVQAh9asyLY)LvBLZD)ZHhV0k#+4^#NiYJ%1mLPl zZiDHGI-L&%W(A0p)5c3cV#pP!+>$K-9M)8&%FJ{?I+LksP16!)pvp3{QnNzzjSHMl zu7cHhVN`YCCr}noEwXsM9~>uON^C;xtibxA0N?=W20uuov0z&?R}0{aB^3G5TtC$LXopTItW zeFFOg@&tbS?Y9i~{tKQ!y#M_L_yynlc;x;5$65T6(f$JblCQlUdcXfVicb*W|B&PI zBuak!BX`2BJ_a@;g?~_zWfql)mj&+CEwU&Bn>Vud@{LZwXYX#A<(^-K@uEqLvR~ZL zr9}Ij^=H}dzn{i;kMl)okj&bS7oBNNTY0`r0!*^xJ=0Y33suPuzWWKxFDSF)J`I|$ zy}lU9A72$CqhNyomj9Sc&O7jM_vCh&;8!}7jORu;OaoXJzj6_;{8Wm*U4xo z2tEe>CRCyGQgvdvp>KQw^9#z%d#3HjdW;vvdXW`XaQgnUTDsx3qwjM9`AXD1v#Wi~ z7>pzZIKqs)XS&)Cqn|nY@6UIw$9;G~{(FD=|Mi&^76DAyNHWqMD}L6M7=lsyiuuWwAj)2JAwIC&e`Qu2igI+lvGp_6TZU<;Ps75 z13dgfE&L8+@0Ra$0{vb0_?_&x%|3yB0{aB^3G5TtC$LXopTItWeFFOg_6h70*e9@0 aV4uJ~fqeq|1ojE+6WAxPPvD0>f&UK&g49s} literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Titles#134.bmp b/Images/Maelstrom_Titles#134.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bc75cd6098080a672275ffab606fcc3726dc007b GIT binary patch literal 197686 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 J6L_Hs{C_tK$yWdX literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Titles#135.bmp b/Images/Maelstrom_Titles#135.bmp new file mode 100644 index 0000000000000000000000000000000000000000..386c8e70e72ef6e0b290fa8356681d67d7f70e07 GIT binary patch literal 197686 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 U3XB4yz$h>Zi~^&;BPj6y0r?R5wEzGB literal 0 HcmV?d00001 diff --git a/Images/Maelstrom_Titles#999.bmp b/Images/Maelstrom_Titles#999.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bd07c3170b16c72a95a59e693cc23cf4eaf03140 GIT binary patch literal 92598 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
EhZ=Ja_KAKhE|Vig24Ai|U|& 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 literal 0 HcmV?d00001 diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..4a9e949 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,89 @@ + + +bin_PROGRAMS = Maelstrom Maelstrom-netd + +Maelstrom_SOURCES = \ + Maelstrom.h \ + Maelstrom_Globals.h \ + buttonlist.h \ + checksum.cpp \ + checksum.h \ + colortable.h \ + controls.cpp \ + controls.h \ + dialog.cpp \ + dialog.h \ + fastrand.cpp \ + fastrand.h \ + init.cpp \ + load.cpp \ + load.h \ + logic.h \ + main.cpp \ + myerror.cpp \ + myerror.h \ + netscore.cpp \ + netscore.h \ + public_key.h \ + rect.cpp \ + rect.h \ + scores.cpp \ + scores.h + +LOGIC = netlogic + +Maelstrom_LDADD = \ + $(LOGIC)/liblogic.a \ + screenlib/libSDLscreen.a \ + maclib/libSDLmac.a \ + @MATHLIB@ @INETLIB@ @ICONOBJ@ + +SUBDIRS = $(LOGIC) screenlib maclib + +EXTRA_DIST = \ + autogen.sh \ + VisualC.zip \ + PBProjects.tar.gz \ + MPWmake.sea.bin \ + CREDITS \ + Changelog \ + README.joystick \ + README.network \ + README.options \ + COPYING \ + COPYING.GPL \ + Images \ + Maelstrom_Fonts \ + Maelstrom_Sounds \ + Maelstrom_Sprites \ + Maelstrom-Scores \ + ico_o \ + icon.bmp icon.xpm \ + Maelstrom.spec + +DIST_SUBDIRS = $(SUBDIRS) Images Docs + +# Special install rule for the game +install: + make install_gamedata target=@GAME_INSTALLDIR@ + +install_gamedata: + sh mkinstalldirs $(target)/ + cp -rv Images \ + Maelstrom_Fonts \ + Maelstrom_Sounds \ + Maelstrom_Sprites \ + Maelstrom-Scores \ + icon.bmp icon.xpm $(target)/ + chmod 666 $(target)/Maelstrom-Scores + +install_gamedocs: + sh mkinstalldirs $(target)/ + cp -rv README* COPYING* Docs* $(target)/ + +# Rule to build tar-gzipped distribution package +$(PACKAGE)-$(VERSION).tar.gz: dist + +# Rule to build RPM distribution package +rpm: $(PACKAGE)-$(VERSION).tar.gz + rpm -ta $(PACKAGE)-$(VERSION).tar.gz diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..e4cc837 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,459 @@ +# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = . + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +CXX = @CXX@ +GAME_INSTALLDIR = @GAME_INSTALLDIR@ +ICONOBJ = @ICONOBJ@ +INETLIB = @INETLIB@ +MAKEINFO = @MAKEINFO@ +MATHLIB = @MATHLIB@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +VERSION = @VERSION@ + +bin_PROGRAMS = Maelstrom Maelstrom-netd + +Maelstrom_SOURCES = Maelstrom.h Maelstrom_Globals.h buttonlist.h checksum.cpp checksum.h colortable.h controls.cpp controls.h dialog.cpp dialog.h fastrand.cpp fastrand.h init.cpp load.cpp load.h logic.h main.cpp myerror.cpp myerror.h netscore.cpp netscore.h public_key.h rect.cpp rect.h scores.cpp scores.h + + +LOGIC = netlogic + +Maelstrom_LDADD = $(LOGIC)/liblogic.a screenlib/libSDLscreen.a maclib/libSDLmac.a @MATHLIB@ @INETLIB@ @ICONOBJ@ + + +SUBDIRS = $(LOGIC) screenlib maclib + +EXTRA_DIST = autogen.sh VisualC.zip PBProjects.tar.gz MPWmake.sea.bin CREDITS Changelog README.joystick README.network README.options COPYING COPYING.GPL Images Maelstrom_Fonts Maelstrom_Sounds Maelstrom_Sprites Maelstrom-Scores ico_o icon.bmp icon.xpm Maelstrom.spec + + +DIST_SUBDIRS = $(SUBDIRS) Images Docs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = Maelstrom.spec +PROGRAMS = $(bin_PROGRAMS) + + +DEFS = @DEFS@ -I. -I$(srcdir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +Maelstrom_OBJECTS = checksum.o controls.o dialog.o fastrand.o init.o \ +load.o main.o myerror.o netscore.o rect.o scores.o +Maelstrom_DEPENDENCIES = $(LOGIC)/liblogic.a screenlib/libSDLscreen.a \ +maclib/libSDLmac.a +Maelstrom_LDFLAGS = +Maelstrom_netd_SOURCES = Maelstrom-netd.c +Maelstrom_netd_OBJECTS = Maelstrom-netd.o +Maelstrom_netd_LDADD = $(LDADD) +Maelstrom_netd_DEPENDENCIES = +Maelstrom_netd_LDFLAGS = +CXXFLAGS = @CXXFLAGS@ +CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = README COPYING INSTALL Maelstrom.spec.in Makefile.am \ +Makefile.in acinclude.m4 aclocal.m4 config.guess config.sub configure \ +configure.in install-sh missing mkinstalldirs + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +SOURCES = $(Maelstrom_SOURCES) Maelstrom-netd.c +OBJECTS = $(Maelstrom_OBJECTS) Maelstrom-netd.o + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .cpp .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +$(ACLOCAL_M4): configure.in acinclude.m4 + cd $(srcdir) && $(ACLOCAL) + +config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) + cd $(srcdir) && $(AUTOCONF) +Maelstrom.spec: $(top_builddir)/config.status Maelstrom.spec.in + cd $(top_builddir) && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status + +mostlyclean-binPROGRAMS: + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +distclean-binPROGRAMS: + +maintainer-clean-binPROGRAMS: + +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + if test -f $$p; then \ + echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ + $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + list='$(bin_PROGRAMS)'; for p in $$list; do \ + rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ + done + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +Maelstrom: $(Maelstrom_OBJECTS) $(Maelstrom_DEPENDENCIES) + @rm -f Maelstrom + $(CXXLINK) $(Maelstrom_LDFLAGS) $(Maelstrom_OBJECTS) $(Maelstrom_LDADD) $(LIBS) + +Maelstrom-netd: $(Maelstrom_netd_OBJECTS) $(Maelstrom_netd_DEPENDENCIES) + @rm -f Maelstrom-netd + $(LINK) $(Maelstrom_netd_LDFLAGS) $(Maelstrom_netd_OBJECTS) $(Maelstrom_netd_LDADD) $(LIBS) +.cpp.o: + $(CXXCOMPILE) -c $< + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. + +@SET_MAKE@ + +all-recursive install-data-recursive install-exec-recursive \ +installdirs-recursive install-recursive uninstall-recursive \ +check-recursive installcheck-recursive info-recursive dvi-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $(MAKEFLAGS); amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ + test "$$subdir" != "." || dot_seen=yes; \ + done; \ + test "$$dot_seen" = "no" && rev=". $$rev"; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + -rm -rf $(distdir) + GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz + mkdir $(distdir)/=build + mkdir $(distdir)/=inst + dc_install_base=`cd $(distdir)/=inst && pwd`; \ + cd $(distdir)/=build \ + && ../configure --srcdir=.. --prefix=$$dc_install_base \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) dist + -rm -rf $(distdir) + @banner="$(distdir).tar.gz is ready for distribution"; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes" +dist: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +dist-all: distdir + -chmod -R a+r $(distdir) + GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) + -rm -rf $(distdir) +distdir: $(DISTFILES) + -rm -rf $(distdir) + mkdir $(distdir) + -chmod 777 $(distdir) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done + for subdir in $(DIST_SUBDIRS); do \ + if test "$$subdir" = .; then :; else \ + test -d $(distdir)/$$subdir \ + || mkdir $(distdir)/$$subdir \ + || exit 1; \ + chmod 777 $(distdir)/$$subdir; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ + || exit 1; \ + fi; \ + done +info-am: +info: info-recursive +dvi-am: +dvi: dvi-recursive +check-am: all-am +check: check-recursive +installcheck-am: +installcheck: installcheck-recursive +install-exec-am: install-binPROGRAMS +install-exec: install-exec-recursive + +install-data-am: +install-data: install-data-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-recursive +uninstall-am: uninstall-binPROGRAMS +uninstall: uninstall-recursive +all-am: Makefile $(PROGRAMS) +all-redirect: all-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: installdirs-recursive +installdirs-am: + $(mkinstalldirs) $(DESTDIR)$(bindir) + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ + mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-recursive + +clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ + mostlyclean-am + +clean: clean-recursive + +distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ + distclean-generic clean-am + +distclean: distclean-recursive + -rm -f config.status + +maintainer-clean-am: maintainer-clean-binPROGRAMS \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-recursive + -rm -f config.status + +.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ +maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile install-data-recursive \ +uninstall-data-recursive install-exec-recursive \ +uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ +all-recursive check-recursive installcheck-recursive info-recursive \ +dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ +maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ +distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ +dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ +install-exec install-data-am install-data install-am install \ +uninstall-am uninstall all-redirect all-am all installdirs-am \ +installdirs mostlyclean-generic distclean-generic clean-generic \ +maintainer-clean-generic clean mostlyclean distclean maintainer-clean + + +# Special install rule for the game +install: + make install_gamedata target=@GAME_INSTALLDIR@ + +install_gamedata: + sh mkinstalldirs $(target)/ + cp -rv Images \ + Maelstrom_Fonts \ + Maelstrom_Sounds \ + Maelstrom_Sprites \ + Maelstrom-Scores \ + icon.bmp icon.xpm $(target)/ + chmod 666 $(target)/Maelstrom-Scores + +install_gamedocs: + sh mkinstalldirs $(target)/ + cp -rv README* COPYING* Docs* $(target)/ + +# Rule to build tar-gzipped distribution package +$(PACKAGE)-$(VERSION).tar.gz: dist + +# Rule to build RPM distribution package +rpm: $(PACKAGE)-$(VERSION).tar.gz + rpm -ta $(PACKAGE)-$(VERSION).tar.gz + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/PBProjects.tar.gz b/PBProjects.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b4d18462fa00ad9255c9e06eb3fb5489a08ec4a GIT binary patch literal 22789 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 + This option runs Maelstrom on the given X11 display. + It is disabled if Maelstrom is compiled with + -DFORCE_XSHM + + -privatecmap Runs Maelstrom with a private (custom) colormap. + This prevents Maelstrom from locking up all of + the colors on your display. It is only useful + on 256 color (pseudo-color) displays. + + -nofade This option prevents Maelstrom from doing the + screen fading. This is useful if you find screen + fading annoying. + + -gamma [0-8] Sets the gamma correction level for Maelstrom. + The higher the gamma correction, the brighter + Maelstrom will appear on your monitor. + If no gamma level is given, Maelstrom will print + the current gamma level saved in your custom + configuration. + Once this option is used, the gamma correction + level is saved, and this option doesn't need to + be used later unless you want to change it again. + + -fullscreen This option puts a big black border around the + Maelstrom screen, and centers Maelstrom within it. + This help create a "full screen" effect on large + displays. + + -version This option prints the version of the Maelstrom binary. + + -speedtest This option will run Maelstrom in a graphics test + mode. It prints the number of milliseconds it + takes for your graphics display to display a full + 48-frame, 360 degree rotation of your ship. It is + for comparative information only. + diff --git a/VisualC.zip b/VisualC.zip new file mode 100644 index 0000000000000000000000000000000000000000..4c8a18f6b5e1a0f270862c377a49e7b209f82ebb GIT binary patch literal 5380 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 $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..d39f692 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,280 @@ +dnl aclocal.m4 generated automatically by aclocal 1.4-p5 + +dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This program is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without +dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A +dnl PARTICULAR PURPOSE. + +# Configure paths for SDL +# Sam Lantinga 9/21/99 +# stolen from Manish Singh +# stolen back from Frank Belew +# stolen from Manish Singh +# Shamelessly stolen from Owen Taylor + +dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) +dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS +dnl +AC_DEFUN(AM_PATH_SDL, +[dnl +dnl Get the cflags and libraries from the sdl-config script +dnl +AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], + sdl_prefix="$withval", sdl_prefix="") +AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], + sdl_exec_prefix="$withval", sdl_exec_prefix="") +AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], + , enable_sdltest=yes) + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + AC_REQUIRE([AC_CANONICAL_TARGET]) + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) + min_sdl_version=ifelse([$1], ,0.11.0,$1) + AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" +dnl +dnl Now check if the installed SDL is sufficiently new. (Also sanity +dnl checks the results of sdl-config to some extent +dnl + rm -f conf.sdltest + AC_TRY_RUN([ +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + +],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + AC_MSG_RESULT(yes) + ifelse([$2], , :, [$2]) + else + AC_MSG_RESULT(no) + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + AC_TRY_LINK([ +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main +], [ return 0; ], + [ echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], + [ echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + ifelse([$3], , :, [$3]) + fi + AC_SUBST(SDL_CFLAGS) + AC_SUBST(SDL_LIBS) + rm -f conf.sdltest +]) + +# Do all the work for Automake. This macro actually does too much -- +# some checks are only needed if your package does certain things. +# But this isn't really a big deal. + +# serial 1 + +dnl Usage: +dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AC_PROG_INSTALL]) +PACKAGE=[$1] +AC_SUBST(PACKAGE) +VERSION=[$2] +AC_SUBST(VERSION) +dnl test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi +ifelse([$3],, +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) +AC_REQUIRE([AM_SANITY_CHECK]) +AC_REQUIRE([AC_ARG_PROGRAM]) +dnl FIXME This is truly gross. +missing_dir=`cd $ac_aux_dir && pwd` +AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) +AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) +AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) +AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) +AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) +AC_REQUIRE([AC_PROG_MAKE_SET])]) + +# +# Check to make sure that the build environment is sane. +# + +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "[$]*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "[$]*" != "X $srcdir/configure conftestfile" \ + && test "[$]*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "[$]2" = conftestfile + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +rm -f conftest* +AC_MSG_RESULT(yes)]) + +dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) +dnl The program must properly implement --version. +AC_DEFUN([AM_MISSING_PROG], +[AC_MSG_CHECKING(for working $2) +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if ($2 --version) < /dev/null > /dev/null 2>&1; then + $1=$2 + AC_MSG_RESULT(found) +else + $1="$3/missing $2" + AC_MSG_RESULT(missing) +fi +AC_SUBST($1)]) + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..b686b4d --- /dev/null +++ b/autogen.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# +aclocal +automake --foreign +autoconf + +#./configure $* +echo "Now you are ready to run ./configure" diff --git a/buttonlist.h b/buttonlist.h new file mode 100644 index 0000000..7bb37b3 --- /dev/null +++ b/buttonlist.h @@ -0,0 +1,64 @@ + +/* A simple menu button class -- only handles mouse input */ + +#include "SDL_types.h" + + +class ButtonList { + +public: + ButtonList() { + button_list.next = NULL; + } + ~ButtonList() { + Delete_Buttons(); + } + + void Add_Button(Uint16 x, Uint16 y, Uint16 width, Uint16 height, + void (*callback)(void)) { + struct button *belem; + + for ( belem=&button_list; belem->next; belem=belem->next ); + belem->next = new button; + belem = belem->next; + belem->x1 = x; + belem->y1 = y; + belem->x2 = x+width; + belem->y2 = y+height; + belem->callback = callback; + belem->next = NULL; + } + + void Activate_Button(Uint16 x, Uint16 y) { + struct button *belem; + + for ( belem=button_list.next; belem; belem=belem->next ) { + if ( (x >= belem->x1) && (x <= belem->x2) && + (y >= belem->y1) && (y <= belem->y2) ) { + if ( belem->callback ) + (*belem->callback)(); + } + } + } + + void Delete_Buttons(void) { + struct button *belem, *btemp; + + for ( belem=button_list.next; belem; ) { + btemp = belem; + belem = belem->next; + delete btemp; + }; + button_list.next = NULL; + } + +private: + typedef struct button { + /* Sensitive area */ + Uint16 x1, y1; + Uint16 x2, y2; + void (*callback)(void); + struct button *next; + } button; + button button_list; +}; diff --git a/checksum.cpp b/checksum.cpp new file mode 100644 index 0000000..28c109e --- /dev/null +++ b/checksum.cpp @@ -0,0 +1,267 @@ + +/* Okay, here is a method of doing checksumming on ourselves. + + We calculate a checksum over the text segment from the address + of main() to the end of the text segment (etext), and then + encrypt it and ascii armour it (base64) for transport. + + Note, this is NOT foolproof, so don't rely on it for critical software! + + It is pretty slick though. :) + The md5 checksum is xor'd with a random value, which is stored in + the authentication packet. This gives relatively random input to + the RSA encryption engine which encrypts the packet with the server's + public key. The result is ascii armoured and sent to the server + where the md5 checksum is extracted. Each time the packet is sent, + it is a different ascii text, but decodes to a known checksum. + + This method should be resistant to cracking by snooping, spoofing, + and code tampering, as long as the private key remains private. +*/ + +/* These checksum routines are activated by -DUSE_CHECKSUM */ +#if defined(WIN32) || defined(__BEOS__) +/* How do we get the end of the text segment with this OS? */ +#undef USE_CHECKSUM +#endif + +#ifdef USE_CHECKSUM + +#include +#include +#include +#include +#include +#ifdef WIN32 +#include +#endif +#include "checksum.h" +#include "myerror.h" + +/* RSA MD5 checksum, public key routines */ +#include "global.h" +#include "rsaref.h" +extern "C" { + extern int RSAPublicEncrypt ( + unsigned char *output, /* output block */ + unsigned int *outputLen,/* length of output block */ + unsigned char *input, /* input block */ + unsigned int inputLen, /* length of input block */ + R_RSA_PUBLIC_KEY *publicKey, /* RSA public key */ + R_RANDOM_STRUCT *randomStruct /* random structure */ + ); +}; +#include "public_key.h" + +/* Encrypt and ascii armour a message */ +static char *armour_encrypt(unsigned char *buf, unsigned int len); + +/* Here is where we save the checksum and encrypted checksum */ +#define MD5LEN 16 +static unsigned char our_checksum[MD5LEN]; +static unsigned char weak_encoder; + +/* How many times do you see this? :) */ +extern "C" int main(int argc, char *argv[]); + +/* Call this to calculate the checksum -- first thing in main()! */ +void checksum(void) +{ + struct timeval now; + + /* These are the end of the text and data segments. */ + extern int etext, edata; + +#ifdef PRINT_CHECKSUM +error("Main = 0x%x, etext = 0x%x, edata = 0x%x\n",main,&etext,&edata); +#endif + /* Local variables */ + void *mem_end=NULL; + int i; + MD5_CTX *ctx; + + /* Find the end of our code segment */ + mem_end = &etext; + if ( (caddr_t)mem_end < (caddr_t)main ) { // Uh oh... + error("Warning: unexpected environment -- no checksum!!\n"); + return; + } + + /* Allocate and calculate our checksum */ + ctx = new MD5_CTX; + MD5Init(ctx); + MD5Update(ctx, (unsigned char *)main, (caddr_t)mem_end-(caddr_t)main); + MD5Final(our_checksum, ctx); + +/* ERASE THIS!! */ +#ifdef PRINT_CHECKSUM +error("Real checksum: "); +for ( i=0; i 0; --bytesleft ) { + randbyte = (rand()%256); + R_RandomUpdate(&weewee, &randbyte, 1); + } + + /* Get down to business! */ + if (RSAPublicEncrypt(cbuf, &clen, tmp, len, pkey, &weewee)) { + /* Uh oh... what do we do? */ + error("Warning! RSA encryption failed!\n"); + clen = 0; + } + } + /* Clear out the original buffer, just in case */ + for ( i=0; i. +# Please send patches to . +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c + for c in cc gcc c89 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break + fi + done + rm -f $dummy.c $dummy.o $dummy.rel + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 8/24/94.) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # Netbsd (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-unknown ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE}" in + i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i?86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + case "${HPUX_REV}" in + 11.[0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + esac ;; + esac + fi ;; + esac + if [ "${HP_ARCH}" = "" ]; then + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i?86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i?86:BSD/386:*:* | i?86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + cat >$dummy.c < /* for printf() prototype */ +int main (int argc, char *argv[]) { +#else +int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __MIPSEB__ + printf ("%s-unknown-linux-gnu\n", argv[1]); +#endif +#ifdef __MIPSEL__ + printf ("%sel-unknown-linux-gnu\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + ;; + ppc:Linux:*:*) + # Determine Lib Version + cat >$dummy.c < +#if defined(__GLIBC__) +extern char __libc_version[]; +extern char __libc_release[]; +#endif +main(argc, argv) + int argc; + char *argv[]; +{ +#if defined(__GLIBC__) + printf("%s %s\n", __libc_version, __libc_release); +#else + printf("unknown\n"); +#endif + return 0; +} +EOF + LIBC="" + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null + if test "$?" = 0 ; then + ./$dummy | grep 1\.99 > /dev/null + if test "$?" = 0 ; then LIBC="libc1" ; fi + fi + rm -f $dummy.c $dummy + echo powerpc-unknown-linux-gnu${LIBC} + exit 0 ;; + alpha:Linux:*:*) + cat <$dummy.s + .data + \$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + .text + .globl main + .align 4 + .ent main + main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + LIBC="" + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) UNAME_MACHINE="alpha" ;; + 1-0) UNAME_MACHINE="alphaev5" ;; + 1-1) UNAME_MACHINE="alphaev56" ;; + 1-101) UNAME_MACHINE="alphapca56" ;; + 2-303) UNAME_MACHINE="alphaev6" ;; + 2-307) UNAME_MACHINE="alphaev67" ;; + esac + objdump --private-headers $dummy | \ + grep ld.so.1 > /dev/null + if test "$?" = 0 ; then + LIBC="libc1" + fi + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i?86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + ld_supported_emulations=`cd /; ld --help 2>&1 \ + | sed -ne '/supported emulations:/!d + s/[ ][ ]*/ /g + s/.*supported emulations: *// + s/ .*// + p'` + case "$ld_supported_emulations" in + i?86linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 + ;; + elf_i?86) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + i?86coff) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 + ;; + esac + # Either a pre-BFD a.out linker (linux-gnuoldld) + # or one that does not give us useful --help. + # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout. + # If ld does not provide *any* "supported emulations:" + # that means it is gnuoldld. + test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0 + case "${UNAME_MACHINE}" in + i?86) + VENDOR=pc; + ;; + *) + VENDOR=unknown; + ;; + esac + # Determine whether the default compiler is a.out or elf + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-${VENDOR}-linux-gnu\n", argv[1]); +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; +# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions +# are messed up and put the nodename in both sysname and nodename. + i?86:DYNIX/ptx:4*:*) + echo i386-sequent-sysv4 + exit 0 ;; + i?86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i?86:*:5:7*) + # Fixed at (any) Pentium or better + UNAME_MACHINE=i586 + if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then + echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE} + fi + exit 0 ;; + i?86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i?86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[KW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + i?86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..7146a2f --- /dev/null +++ b/config.sub @@ -0,0 +1,1357 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. + +timestamp='2001-03-19' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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 2 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \ + | arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \ + | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | sh[34] \ + | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp10 | pdp11 \ + | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \ + | pj | pjl | h8500) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[234567]86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i[234567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \ + | arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \ + | [cjt]90-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \ + | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [cjt]90) + basic_machine=${basic_machine}-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4) + basic_machine=sh-unknown + ;; + sparc | sparcv9) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i[34567]86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..3621a0f --- /dev/null +++ b/configure @@ -0,0 +1,4097 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.53. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="README" + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] + --target=TARGET configure for building compilers for TARGET [HOST] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-sdltest Do not try to compile and run a test SDL program + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-sdl-prefix=PFX Prefix where SDL is installed (optional) + --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.53. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell meta-characters. +ac_configure_args= +ac_sep= +for ac_arg +do + case $ac_arg in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n ) continue ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub $ac_cv_target_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftestfile +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftestfile` + fi + if test "$*" != "X $srcdir/configure conftestfile" \ + && test "$*" != "X conftestfile $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftestfile + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f conftest* +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="${MAKE}"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + + +PACKAGE=Maelstrom + +VERSION=3.0.6 + +if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + + + +missing_dir=`cd $ac_aux_dir && pwd` +echo "$as_me:$LINENO: checking for working aclocal" >&5 +echo $ECHO_N "checking for working aclocal... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (aclocal --version) < /dev/null > /dev/null 2>&1; then + ACLOCAL=aclocal + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + ACLOCAL="$missing_dir/missing aclocal" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working autoconf" >&5 +echo $ECHO_N "checking for working autoconf... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoconf --version) < /dev/null > /dev/null 2>&1; then + AUTOCONF=autoconf + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOCONF="$missing_dir/missing autoconf" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working automake" >&5 +echo $ECHO_N "checking for working automake... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (automake --version) < /dev/null > /dev/null 2>&1; then + AUTOMAKE=automake + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOMAKE="$missing_dir/missing automake" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working autoheader" >&5 +echo $ECHO_N "checking for working autoheader... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (autoheader --version) < /dev/null > /dev/null 2>&1; then + AUTOHEADER=autoheader + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + AUTOHEADER="$missing_dir/missing autoheader" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + +echo "$as_me:$LINENO: checking for working makeinfo" >&5 +echo $ECHO_N "checking for working makeinfo... $ECHO_C" >&6 +# Run test in a subshell; some versions of sh will print an error if +# an executable is not found, even if stderr is redirected. +# Redirect stdin to placate older versions of autoconf. Sigh. +if (makeinfo --version) < /dev/null > /dev/null 2>&1; then + MAKEINFO=makeinfo + echo "$as_me:$LINENO: result: found" >&5 +echo "${ECHO_T}found" >&6 +else + MAKEINFO="$missing_dir/missing makeinfo" + echo "$as_me:$LINENO: result: missing" >&5 +echo "${ECHO_T}missing" >&6 +fi + + + + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="${MAKE}"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$as_dir/$ac_word" ${1+"$@"} + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null; + ls a.out conftest 2>/dev/null; + ls a.* conftest.* 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5 +echo "$as_me: error: C compiler cannot create executables" >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +$ac_declaration +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_declaration +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_prog_cxx_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +#include +$ac_declaration +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" +$ac_declaration +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +case "$target" in + alpha*-*-linux*) + CFLAGS="$CFLAGS -mcpu=ev4 -Wa,-mall" + ;; +esac + +case "$target" in + *-*-mingw32*) + MATHLIB="" + INETLIB="-lwsock32" + ;; + *-*-beos*) + MATHLIB="" + INETLIB="" + ;; + *-*-darwin*) + MATHLIB="" + INETLIB="" + ;; + *) + MATHLIB="-lm" + INETLIB="" + ;; +esac + + + +SDL_VERSION=1.2.0 + + +# Check whether --with-sdl-prefix or --without-sdl-prefix was given. +if test "${with_sdl_prefix+set}" = set; then + withval="$with_sdl_prefix" + sdl_prefix="$withval" +else + sdl_prefix="" +fi; + +# Check whether --with-sdl-exec-prefix or --without-sdl-exec-prefix was given. +if test "${with_sdl_exec_prefix+set}" = set; then + withval="$with_sdl_exec_prefix" + sdl_exec_prefix="$withval" +else + sdl_exec_prefix="" +fi; +# Check whether --enable-sdltest or --disable-sdltest was given. +if test "${enable_sdltest+set}" = set; then + enableval="$enable_sdltest" + +else + enable_sdltest=yes +fi; + + if test x$sdl_exec_prefix != x ; then + sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config + fi + fi + if test x$sdl_prefix != x ; then + sdl_args="$sdl_args --prefix=$sdl_prefix" + if test x${SDL_CONFIG+set} != xset ; then + SDL_CONFIG=$sdl_prefix/bin/sdl-config + fi + fi + + + PATH="$prefix/bin:$prefix/usr/bin:$PATH" + # Extract the first word of "sdl-config", so it can be a program name with args. +set dummy sdl-config; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_SDL_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $SDL_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" + ;; +esac +fi +SDL_CONFIG=$ac_cv_path_SDL_CONFIG + +if test -n "$SDL_CONFIG"; then + echo "$as_me:$LINENO: result: $SDL_CONFIG" >&5 +echo "${ECHO_T}$SDL_CONFIG" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + min_sdl_version=$SDL_VERSION + echo "$as_me:$LINENO: checking for SDL - version >= $min_sdl_version" >&5 +echo $ECHO_N "checking for SDL - version >= $min_sdl_version... $ECHO_C" >&6 + no_sdl="" + if test "$SDL_CONFIG" = "no" ; then + no_sdl=yes + else + SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` + SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` + + sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` + sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` + sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ + sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` + if test "x$enable_sdltest" = "xyes" ; then + ac_save_CFLAGS="$CFLAGS" + ac_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + rm -f conf.sdltest + if test "$cross_compiling" = yes; then + echo $ac_n "cross compiling; assumed OK... $ac_c" +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#include +#include +#include +#include "SDL.h" + +char* +my_strdup (char *str) +{ + char *new_str; + + if (str) + { + new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); + strcpy (new_str, str); + } + else + new_str = NULL; + + return new_str; +} + +int main (int argc, char *argv[]) +{ + int major, minor, micro; + char *tmp_version; + + /* This hangs on some systems (?) + system ("touch conf.sdltest"); + */ + { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } + + /* HP/UX 9 (%@#!) writes to sscanf strings */ + tmp_version = my_strdup("$min_sdl_version"); + if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { + printf("%s, bad version string\n", "$min_sdl_version"); + exit(1); + } + + if (($sdl_major_version > major) || + (($sdl_major_version == major) && ($sdl_minor_version > minor)) || + (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) + { + return 0; + } + else + { + printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); + printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); + printf("*** best to upgrade to the required version.\n"); + printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); + printf("*** to point to the correct copy of sdl-config, and remove the file\n"); + printf("*** config.cache before re-running configure\n"); + return 1; + } +} + + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +( exit $ac_status ) +no_sdl=yes +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + if test "x$no_sdl" = x ; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + : + else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + if test "$SDL_CONFIG" = "no" ; then + echo "*** The sdl-config script installed by SDL could not be found" + echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" + echo "*** your path, or set the SDL_CONFIG environment variable to the" + echo "*** full path to sdl-config." + else + if test -f conf.sdltest ; then + : + else + echo "*** Could not run SDL test program, checking why..." + CFLAGS="$CFLAGS $SDL_CFLAGS" + LIBS="$LIBS $SDL_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +#include +#include "SDL.h" + +int main(int argc, char *argv[]) +{ return 0; } +#undef main +#define main K_and_R_C_main + +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "*** The test program compiled, but did not run. This usually means" + echo "*** that the run-time linker is not finding SDL or finding the wrong" + echo "*** version of SDL. If it is not finding SDL, you'll need to set your" + echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" + echo "*** to the installed location Also, make sure you have run ldconfig if that" + echo "*** is required on your system" + echo "***" + echo "*** If you have an old version installed, it is best to remove it, although" + echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + echo "*** The test program failed to compile or link. See the file config.log for the" + echo "*** exact error that occured. This usually means SDL was incorrectly installed" + echo "*** or that you have moved SDL since it was installed. In the latter case, you" + echo "*** may want to edit the sdl-config script: $SDL_CONFIG" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + CFLAGS="$ac_save_CFLAGS" + LIBS="$ac_save_LIBS" + fi + fi + SDL_CFLAGS="" + SDL_LIBS="" + { { echo "$as_me:$LINENO: error: *** SDL version $SDL_VERSION not found!" >&5 +echo "$as_me: error: *** SDL version $SDL_VERSION not found!" >&2;} + { (exit 1); exit 1; }; } + + fi + + + rm -f conf.sdltest + +CFLAGS="$CFLAGS $SDL_CFLAGS" +LIBS="$LIBS $SDL_LIBS" + +echo "$as_me:$LINENO: checking for SDLNet_Init in -lSDL_net" >&5 +echo $ECHO_N "checking for SDLNet_Init in -lSDL_net... $ECHO_C" >&6 +if test "${ac_cv_lib_SDL_net_SDLNet_Init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lSDL_net $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char SDLNet_Init (); +#ifdef F77_DUMMY_MAIN +# ifdef __cplusplus + extern "C" +# endif + int F77_DUMMY_MAIN() { return 1; } +#endif +int +main () +{ +SDLNet_Init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_SDL_net_SDLNet_Init=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_SDL_net_SDLNet_Init=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_SDL_net_SDLNet_Init" >&5 +echo "${ECHO_T}$ac_cv_lib_SDL_net_SDLNet_Init" >&6 +if test $ac_cv_lib_SDL_net_SDLNet_Init = yes; then + have_SDL_net=yes +fi + +if test x$have_SDL_net = xyes; then + LIBS="$LIBS -lSDL_net" +else + { { echo "$as_me:$LINENO: error: *** Can't find the SDL_net library +The SDL_net library can be found at: +http://www.devolution.com/~slouken/SDL/projects/SDL_net/ +" >&5 +echo "$as_me: error: *** Can't find the SDL_net library +The SDL_net library can be found at: +http://www.devolution.com/~slouken/SDL/projects/SDL_net/ +" >&2;} + { (exit 1); exit 1; }; } +fi + +echo "$as_me:$LINENO: checking for RSA checksum authentication" >&5 +echo $ECHO_N "checking for RSA checksum authentication... $ECHO_C" >&6 +if test -d $HOME/RSA; then + CFLAGS="$CFLAGS -DUSE_CHECKSUM -I$HOME/RSA/source" + LIBS="$LIBS $HOME/RSA/install/rsaref.a" + use_checksum=yes +else + use_checksum=no +fi +echo "$as_me:$LINENO: result: $use_checksum" >&5 +echo "${ECHO_T}$use_checksum" >&6 + +CFLAGS="$CFLAGS -I\$(top_srcdir)" +CFLAGS="$CFLAGS -I\$(top_srcdir)/netlogic" +CFLAGS="$CFLAGS -I\$(top_srcdir)/screenlib" +CFLAGS="$CFLAGS -I\$(top_srcdir)/maclib" + +case "$target" in + *-*-mingw32*) + cp ico_o ico.o + ICONOBJ="ico.o" + ;; + *) + ICONOBJ="" + ;; +esac + + +case "$target" in + *-*-mingw32*) + GAME_INSTALLDIR="." + ICONOBJ="ico.o" + ;; + *-*-beos*) + ac_default_prefix=/boot/beos + GAME_INSTALLDIR="\$(prefix)/games/$PACKAGE" + ;; + *) + GAME_INSTALLDIR="\$(prefix)/games/$PACKAGE" + ;; +esac + +CFLAGS="$CFLAGS -DLIBDIR=\\\"$GAME_INSTALLDIR\\\"" + +CXXFLAGS="$CXXFLAGS $CFLAGS" + +# Finally create all the generated files +ac_config_files="$ac_config_files Makefile netlogic/Makefile screenlib/Makefile maclib/Makefile Images/Makefile Docs/Makefile Maelstrom.spec" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overriden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# NLS nuisances. +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +(set +x; test -n "`(LANG=C; export LANG) 2>&1`") && + { $as_unset LANG || test "${LANG+set}" != set; } || + { LANG=C; export LANG; } +(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") && + { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } || + { LC_ALL=C; export LC_ALL; } +(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") && + { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } || + { LC_TIME=C; export LC_TIME; } +(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") && + { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } || + { LC_CTYPE=C; export LC_CTYPE; } +(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") && + { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } || + { LANGUAGE=C; export LANGUAGE; } +(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") && + { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } || + { LC_COLLATE=C; export LC_COLLATE; } +(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") && + { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } || + { LC_NUMERIC=C; export LC_NUMERIC; } +(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") && + { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } || + { LC_MESSAGES=C; export LC_MESSAGES; } + + +# Name of the executable. +as_me=`(basename "$0") 2>/dev/null || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conftest.sh + echo "exit 0" >>conftest.sh + chmod +x conftest.sh + if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conftest.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; } + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.53. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.53, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion" + exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;; +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "netlogic/Makefile" ) CONFIG_FILES="$CONFIG_FILES netlogic/Makefile" ;; + "screenlib/Makefile" ) CONFIG_FILES="$CONFIG_FILES screenlib/Makefile" ;; + "maclib/Makefile" ) CONFIG_FILES="$CONFIG_FILES maclib/Makefile" ;; + "Images/Makefile" ) CONFIG_FILES="$CONFIG_FILES Images/Makefile" ;; + "Docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES Docs/Makefile" ;; + "Maelstrom.spec" ) CONFIG_FILES="$CONFIG_FILES Maelstrom.spec" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@MATHLIB@,$MATHLIB,;t t +s,@INETLIB@,$INETLIB,;t t +s,@SDL_CONFIG@,$SDL_CONFIG,;t t +s,@SDL_CFLAGS@,$SDL_CFLAGS,;t t +s,@SDL_LIBS@,$SDL_LIBS,;t t +s,@ICONOBJ@,$ICONOBJ,;t t +s,@GAME_INSTALLDIR@,$GAME_INSTALLDIR,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || + mkdir "$as_incr_dir" || + { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +done; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..0170f4b --- /dev/null +++ b/configure.in @@ -0,0 +1,126 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(README) + +dnl Detect the canonical target build environment +AC_CANONICAL_HOST +AC_CANONICAL_TARGET + +dnl Setup for automake +AM_INIT_AUTOMAKE(Maelstrom, 3.0.6) + +dnl Check for tools + +AC_PROG_MAKE_SET +AC_PROG_CC +AC_PROG_CXX +AC_PROG_RANLIB +AC_PROG_INSTALL + +dnl The alpha architecture needs special flags for binary portability +case "$target" in + alpha*-*-linux*) + CFLAGS="$CFLAGS -mcpu=ev4 -Wa,-mall" + ;; +esac + +dnl Figure out which math and networking libraries to use +case "$target" in + *-*-mingw32*) + MATHLIB="" + INETLIB="-lwsock32" + ;; + *-*-beos*) + MATHLIB="" + INETLIB="" + ;; + *-*-darwin*) + MATHLIB="" + INETLIB="" + ;; + *) + MATHLIB="-lm" + INETLIB="" + ;; +esac +AC_SUBST(MATHLIB) +AC_SUBST(INETLIB) + +dnl Check for SDL +SDL_VERSION=1.2.0 +AM_PATH_SDL($SDL_VERSION, + :, + AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!]) +) +CFLAGS="$CFLAGS $SDL_CFLAGS" +LIBS="$LIBS $SDL_LIBS" + +dnl Check for SDL_net +AC_CHECK_LIB(SDL_net, SDLNet_Init, have_SDL_net=yes) +if test x$have_SDL_net = xyes; then + LIBS="$LIBS -lSDL_net" +else + AC_MSG_ERROR([*** Can't find the SDL_net library +The SDL_net library can be found at: +http://www.devolution.com/~slouken/SDL/projects/SDL_net/ +]) +fi + +dnl Check for RSA checksum authentication +AC_MSG_CHECKING(for RSA checksum authentication) +if test -d $HOME/RSA; then + CFLAGS="$CFLAGS -DUSE_CHECKSUM -I$HOME/RSA/source" + LIBS="$LIBS $HOME/RSA/install/rsaref.a" + use_checksum=yes +else + use_checksum=no +fi +AC_MSG_RESULT($use_checksum) + +dnl Add the include directories for the object libraries +CFLAGS="$CFLAGS -I\$(top_srcdir)" +CFLAGS="$CFLAGS -I\$(top_srcdir)/netlogic" +CFLAGS="$CFLAGS -I\$(top_srcdir)/screenlib" +CFLAGS="$CFLAGS -I\$(top_srcdir)/maclib" + +dnl Set up the icon object file, for Mingw32 +case "$target" in + *-*-mingw32*) + cp ico_o ico.o + ICONOBJ="ico.o" + ;; + *) + ICONOBJ="" + ;; +esac +AC_SUBST(ICONOBJ) + +dnl Set up the game data install directory +case "$target" in + *-*-mingw32*) + GAME_INSTALLDIR="." + ICONOBJ="ico.o" + ;; + *-*-beos*) + ac_default_prefix=/boot/beos + GAME_INSTALLDIR="\$(prefix)/games/$PACKAGE" + ;; + *) + GAME_INSTALLDIR="\$(prefix)/games/$PACKAGE" + ;; +esac +AC_SUBST(GAME_INSTALLDIR) +CFLAGS="$CFLAGS -DLIBDIR=\\\"$GAME_INSTALLDIR\\\"" + +dnl C++ flags are the same as the C flags +CXXFLAGS="$CXXFLAGS $CFLAGS" + +# Finally create all the generated files +AC_OUTPUT([ +Makefile +netlogic/Makefile +screenlib/Makefile +maclib/Makefile +Images/Makefile +Docs/Makefile +Maelstrom.spec +]) diff --git a/controls.cpp b/controls.cpp new file mode 100644 index 0000000..a85e78a --- /dev/null +++ b/controls.cpp @@ -0,0 +1,558 @@ + +/* This file handles the controls configuration and updating the keystrokes +*/ + +#include +#include + +#include "Maelstrom_Globals.h" +#include "load.h" +#include "dialog.h" + +#define MAELSTROM_DATA ".Maelstrom-data" + +/* Savable and configurable controls/data */ + +/* Pause Shield Thrust TurnR TurnL Fire Quit */ +#ifdef FAITHFUL_SPECS +Controls controls = +{ SDLK_CAPSLOCK,SDLK_SPACE,SDLK_UP,SDLK_RIGHT,SDLK_LEFT,SDLK_TAB,SDLK_ESCAPE }; +#else +Controls controls = + { SDLK_PAUSE,SDLK_SPACE,SDLK_UP,SDLK_RIGHT,SDLK_LEFT,SDLK_TAB,SDLK_ESCAPE }; +#endif + +#ifdef MOVIE_SUPPORT +int gMovie = 0; +#endif +Uint8 gSoundLevel = 4; +Uint8 gGammaCorrect = 3; + + +/* Map a keycode to a key name */ +void KeyName(SDLKey keycode, char *namebuf) +{ + char *name, ch; + int starting; + + /* Get the name of the key */ + name = SDL_GetKeyName(keycode); + + /* Add "arrow" to the arrow keys */ + if ( strcmp(name, "up") == 0 ) { + name = "up arrow"; + } else + if ( strcmp(name, "down") == 0 ) { + name = "down arrow"; + } else + if ( strcmp(name, "right") == 0 ) { + name = "right arrow"; + } else + if ( strcmp(name, "left") == 0 ) { + name = "left arrow"; + } + /* Make the key names uppercased */ + for ( starting = 1; *name; ++name ) { + ch = *name; + if ( starting ) { + if ( islower(ch) ) + ch = toupper(ch); + starting = 0; + } else { + if ( ch == ' ' ) + starting = 1; + } + *namebuf++ = ch; + } + *namebuf = '\0'; +} + +static FILE *OpenData(char *mode, char **fname) +{ + static char datafile[BUFSIZ]; + char *home; + FILE *data; + + if ( (home=getenv("HOME")) == NULL ) { + if ( strcmp(CUR_DIR, DIR_SEP) != 0 ) { + home = CUR_DIR; + } else { + home=""; + } + } + if ( fname ) { + *fname = datafile; + } + sprintf(datafile, "%s"DIR_SEP"%s", home, MAELSTROM_DATA); + if ( (data=fopen(datafile, mode)) == NULL ) + return(NULL); + return(data); +} + +void LoadControls(void) +{ + char buffer[BUFSIZ], *datafile; + FILE *data; + + /* Open our control data file */ + data = OpenData("r", &datafile); + if ( data == NULL ) { + return; + } + + /* Read the controls */ + if ( (fread(buffer, 1, 5, data) != 5) || strncmp(buffer, "MAEL3", 5) ) { + error( + "Warning: Data file '%s' is corrupt! (will fix)\n", datafile); + fclose(data); + return; + } + fread(&gSoundLevel, sizeof(gSoundLevel), 1, data); + fread(&controls, sizeof(controls), 1, data); + fread(&gGammaCorrect, sizeof(gGammaCorrect), 1, data); + fclose(data); +} + +void SaveControls(void) +{ + char *datafile, *newmode; + FILE *data; + + /* Don't clobber existing joystick data */ + if ( (data=OpenData("r", NULL)) != NULL ) { + newmode = "r+"; + fclose(data); + } else + newmode = "w"; + + if ( (data=OpenData(newmode, &datafile)) == NULL ) { + error("Warning: Couldn't save controls to %s\n", datafile); + return; + } + + fwrite("MAEL3", 1, 5, data); + fwrite(&gSoundLevel, sizeof(gSoundLevel), 1, data); + fwrite(&controls, sizeof(controls), 1, data); + fwrite(&gGammaCorrect, sizeof(gGammaCorrect), 1, data); + fclose(data); +} + +#define FIRE_CTL 0 +#define THRUST_CTL 1 +#define SHIELD_CTL 2 +#define TURNR_CTL 3 +#define TURNL_CTL 4 +#define PAUSE_CTL 5 +#define QUIT_CTL 6 +#define NUM_CTLS 7 + +#define SP 3 + +#define CTL_DIALOG_WIDTH 482 +#define CTL_DIALOG_HEIGHT 300 + +Controls newcontrols; +static struct { + char *label; + int yoffset; + SDLKey *control; +} checkboxes[] = { + { "Fire", 0*BOX_HEIGHT+0*SP, &newcontrols.gFireControl }, + { "Thrust", 1*BOX_HEIGHT+1*SP, &newcontrols.gThrustControl }, + { "Shield", 2*BOX_HEIGHT+2*SP, &newcontrols.gShieldControl }, + { "Turn Clockwise", 3*BOX_HEIGHT+3*SP, &newcontrols.gTurnRControl }, + { "Turn Counter-Clockwise", + 4*BOX_HEIGHT+4*SP, &newcontrols.gTurnLControl }, + { "Pause", 5*BOX_HEIGHT+5*SP, &newcontrols.gPauseControl }, + { "Abort Game", 6*BOX_HEIGHT+6*SP, &newcontrols.gQuitControl }, +}; + +static int X=0; +static int Y=0; +static MFont *chicago; +static SDL_Surface *keynames[NUM_CTLS]; +static int currentbox, valid; + +static int OK_callback(void) { + valid = 1; + return(1); +} +static int Cancel_callback(void) { + valid = 0; + return(1); +} +static void BoxKeyPress(SDL_keysym key, int *doneflag) +{ + SDL_Color black = { 0x00, 0x00, 0x00, 0 }; + SDL_Color white = { 0xFF, 0xFF, 0xFF, 0 }; + int i; + char keyname[128]; + + if ( key.sym == *checkboxes[currentbox].control ) + return; + + /* Make sure the key isn't in use! */ + for ( i=0; iInvertText(keynames[currentbox]); + screen->QueueBlit( + X+96+(BOX_WIDTH-keynames[currentbox]->w)/2, + Y+75+SP+checkboxes[currentbox].yoffset, + keynames[currentbox], NOCLIP); + screen->Update(); + fontserv->FreeText(keynames[currentbox]); + + /* Blit the new message */ + strcpy(keyname, "That key is in use!"); + keynames[currentbox] = fontserv->TextImage(keyname, + chicago, STYLE_NORM, black, white); + screen->QueueBlit( + X+96+(BOX_WIDTH-keynames[currentbox]->w)/2, + Y+75+SP+checkboxes[currentbox].yoffset, + keynames[currentbox], NOCLIP); + screen->Update(); + SDL_Delay(1000); + break; + } + } + + /* Clear the current text */ + fontserv->InvertText(keynames[currentbox]); + screen->QueueBlit(X+96+(BOX_WIDTH-keynames[currentbox]->w)/2, + Y+75+SP+checkboxes[currentbox].yoffset, + keynames[currentbox], NOCLIP); + screen->Update(); + fontserv->FreeText(keynames[currentbox]); + + /* Display the new key */ + *checkboxes[currentbox].control = key.sym; + KeyName(*checkboxes[currentbox].control, keyname); + keynames[currentbox] = fontserv->TextImage(keyname, chicago, STYLE_NORM, + black, white); + screen->QueueBlit(X+96+(BOX_WIDTH-keynames[currentbox]->w)/2, + Y+75+SP+checkboxes[currentbox].yoffset, + keynames[currentbox], NOCLIP); + screen->Update(); +} + +void ConfigureControls(void) +{ +#ifdef FAITHFUL_SPECS + static char *C_text1 = + "While playing Maelstrom, CAPS LOCK pauses the game and"; + static char *C_text2 = + "ESC aborts the game."; + SDL_Surface *text1, *text2; +#endif + Uint32 black; + int i; + char keyname[128]; + Maclike_Dialog *dialog; + SDL_Surface *splash; + Mac_Button *cancel, *okay; + Mac_RadioList *radiobuttons; + Mac_Dialog *boxes; + + + /* Set up all the components of the dialog box */ + black = screen->MapRGB(0x00, 0x00, 0x00); + if ( (chicago = fontserv->NewFont("Chicago", 12)) == NULL ) { + error("Can't use Chicago font!\n"); + return; + } + if ( (splash = Load_Title(screen, 100)) == NULL ) { + error("Can't load configuration splash!\n"); + delete chicago; + return; + } + X=(SCREEN_WIDTH-CTL_DIALOG_WIDTH)/2; + Y=(SCREEN_HEIGHT-CTL_DIALOG_HEIGHT)/2; + dialog = new Maclike_Dialog(X, Y, CTL_DIALOG_WIDTH, CTL_DIALOG_HEIGHT, + screen); + dialog->Add_Image(splash, 4, 4); +#ifdef FAITHFUL_SPECS + text1 = fontserv->TextImage(C_text1,chicago,STYLE_NORM,0x00,0x00,0x00); + text2 = fontserv->TextImage(C_text2,chicago,STYLE_NORM,0x00,0x00,0x00); + dialog->Add_Image(text1, 66, 216); + dialog->Add_Image(text2, 66, 232); +#endif + valid = 0; + cancel = new Mac_Button(291, 265, BUTTON_WIDTH, BUTTON_HEIGHT, + "Cancel", chicago, fontserv, Cancel_callback); + dialog->Add_Dialog(cancel); + okay = new Mac_Button(291+BUTTON_WIDTH+26, 265, + BUTTON_WIDTH, BUTTON_HEIGHT, + "OK", chicago, fontserv, OK_callback); + dialog->Add_Dialog(okay); + memcpy(&newcontrols, &controls, sizeof(controls)); + radiobuttons = new Mac_RadioList(¤tbox, X+266, Y+75, + chicago, fontserv); + currentbox = FIRE_CTL; + for ( i=0; iTextImage(keyname, chicago, STYLE_NORM, + 0x00, 0x00, 0x00); + /* Only display "Fire" through "Turn Counter-Clockwise" */ +#ifdef FAITHFUL_SPECS + if ( i < PAUSE_CTL ) { +#else + if ( i < NUM_CTLS ) { +#endif + radiobuttons->Add_Radio(263, 71+checkboxes[i].yoffset, + checkboxes[i].label); + dialog->Add_Rectangle(92, 71+checkboxes[i].yoffset, + BOX_WIDTH, BOX_HEIGHT, black); + dialog->Add_Image(keynames[i], + 92+(BOX_WIDTH-keynames[i]->w)/2, + 71+SP+checkboxes[i].yoffset); + } + } + dialog->Add_Dialog(radiobuttons); + boxes = new Mac_Dialog(92, 71); + boxes->SetKeyPress(BoxKeyPress); + dialog->Add_Dialog(boxes); + + /* Run the dialog box */ + dialog->Run(EXPAND_STEPS); + + /* Clean up and return */ + screen->FreeImage(splash); +#ifdef FAITHFUL_SPECS + fontserv->FreeText(text1); + fontserv->FreeText(text2); +#endif + for ( i=0; iFreeText(keynames[i]); + } + delete chicago; + delete dialog; + if ( valid ) { + memcpy(&controls, &newcontrols, sizeof(controls)); + SaveControls(); + } + return; +} + +static void HandleEvent(SDL_Event *event) +{ + SDLKey key; + + switch (event->type) { +#ifdef SDL_INIT_JOYSTICK + /* -- Handle joystick axis motion */ + case SDL_JOYAXISMOTION: + /* X-Axis - rotate right/left */ + if ( event->jaxis.axis == 0 ) { + if ( event->jaxis.value < -8000 ) { + SetControl(LEFT_KEY, 1); + SetControl(RIGHT_KEY, 0); + } else + if ( event->jaxis.value > 8000 ) { + SetControl(RIGHT_KEY, 1); + SetControl(LEFT_KEY, 0); + } else { + SetControl(LEFT_KEY, 0); + SetControl(RIGHT_KEY, 0); + } + } else + /* Y-Axis - accelerate */ + if ( event->jaxis.axis == 1 ) { + if ( event->jaxis.value < -8000 ) { + SetControl(THRUST_KEY, 1); + } else { + SetControl(THRUST_KEY, 0); + } + } + break; + + /* -- Handle joystick button presses/releases */ + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + if ( event->jbutton.state == SDL_PRESSED ) { + if ( event->jbutton.button == 0 ) { + SetControl(FIRE_KEY, 1); + } else + if ( event->jbutton.button == 1 ) { + SetControl(SHIELD_KEY, 1); + } + } else { + if ( event->jbutton.button == 0 ) { + SetControl(FIRE_KEY, 0); + } else + if ( event->jbutton.button == 1 ) { + SetControl(SHIELD_KEY, 0); + } + } + break; +#endif + + /* -- Handle key presses/releases */ + case SDL_KEYDOWN: + /* -- Handle ALT-ENTER hotkey */ + if ( (event->key.keysym.sym == SDLK_RETURN) && + (event->key.keysym.mod & KMOD_ALT) ) { + screen->ToggleFullScreen(); + break; + } + case SDL_KEYUP: + /* -- Handle normal key bindings */ + key = event->key.keysym.sym; + if ( event->key.state == SDL_PRESSED ) { + /* Check for various control keys */ + if ( key == controls.gFireControl ) + SetControl(FIRE_KEY, 1); + else if ( key == controls.gTurnRControl ) + SetControl(RIGHT_KEY, 1); + else if ( key == controls.gTurnLControl ) + SetControl(LEFT_KEY, 1); + else if ( key == controls.gShieldControl ) + SetControl(SHIELD_KEY, 1); + else if ( key == controls.gThrustControl ) + SetControl(THRUST_KEY, 1); + else if ( key == controls.gPauseControl ) + SetControl(PAUSE_KEY, 1); + else if ( key == controls.gQuitControl ) + SetControl(ABORT_KEY, 1); + else if ( SpecialKey(event->key.keysym) == 0 ) + /* The key has been handled */; + else if ( key == SDLK_F3 ) { + /* Special key -- + Do a screen dump here. + */ + screen->ScreenDump("ScreenShot", + 0, 0, 0, 0); +#ifdef MOVIE_SUPPORT + } else if ( key == XK_F5 ) { + /* Special key -- + Toggle movie function. + */ + extern int SelectMovieRect(void); + if ( ! gMovie ) + gMovie = SelectMovieRect(); + else + gMovie = 0; +mesg("Movie is %s...\n", gMovie ? "started" : "stopped"); +#endif + } + } else { + /* Update control key status */ + if ( key == controls.gFireControl ) + SetControl(FIRE_KEY, 0); + else if ( key == controls.gTurnRControl ) + SetControl(RIGHT_KEY, 0); + else if ( key == controls.gTurnLControl ) + SetControl(LEFT_KEY, 0); + else if ( key == controls.gShieldControl ) + SetControl(SHIELD_KEY, 0); + else if ( key == controls.gThrustControl ) + SetControl(THRUST_KEY, 0); + } + break; + + case SDL_QUIT: + SetControl(ABORT_KEY, 1); + break; + } +} + + +/* This function gives a good way to delay a specified amount of time + while handling keyboard/joystick events, or just to poll for events. +*/ +void HandleEvents(int timeout) +{ + SDL_Event event; + + do { + while ( SDL_PollEvent(&event) ) { + HandleEvent(&event); + } + if ( timeout ) { + /* Delay 1/60 of a second... */ + Delay(1); + } + } while ( timeout-- ); +} + +int DropEvents(void) +{ + SDL_Event event; + int keys = 0; + + while ( SDL_PollEvent(&event) ) { + if ( event.type == SDL_KEYDOWN ) { + ++keys; + } + } + return(keys); +} + +#define DAWN_DIALOG_WIDTH 318 +#define DAWN_DIALOG_HEIGHT 194 + +void ShowDawn(void) +{ + static char *D_text[6] = { + "No eternal reward will forgive us", + "now", + "for", + "wasting", + "the", + "dawn." + }; + MFont *chicago; + SDL_Surface *splash, *text[6]; + Maclike_Dialog *dialog; + Mac_Button *OK; + int i, x, y, X, Y; + + /* Set up all the components of the dialog box */ +#ifdef CENTER_DIALOG + X=(SCREEN_WIDTH-DAWN_DIALOG_WIDTH)/2; + Y=(SCREEN_HEIGHT-DAWN_DIALOG_HEIGHT)/2; +#else /* The way it is on the original Maelstrom */ + X=160; + Y=73; +#endif + if ( (chicago = fontserv->NewFont("Chicago", 12)) == NULL ) { + error("Can't use Chicago font!\n"); + return; + } + if ( (splash = GetCIcon(screen, 103)) == NULL ) { + error("Can't load alien dawn splash!\n"); + return; + } + dialog = new Maclike_Dialog(X, Y, DAWN_DIALOG_WIDTH, DAWN_DIALOG_HEIGHT, + screen); + x = y = 19; + dialog->Add_Image(splash, x, y); + x += (splash->w+26); + text[0] = fontserv->TextImage(D_text[0], chicago, STYLE_NORM, + 0x00, 0x00, 0x00); + dialog->Add_Image(text[0], x, y); + for ( i=1; i<6; ++i ) { + y += (text[i-1]->h+2); + text[i] = fontserv->TextImage(D_text[i], chicago, STYLE_NORM, + 0x00, 0x00, 0x00); + dialog->Add_Image(text[i], x, y); + x += (text[i]->w+2); + } + OK = new Mac_DefaultButton(210, 160, 90, BUTTON_HEIGHT, + "OK", chicago, fontserv, NULL); + dialog->Add_Dialog(OK); + + /* Run the dialog box */ + dialog->Run(EXPAND_STEPS); + + /* Clean up and return */ + screen->FreeImage(splash); + for ( i=0; i<6; ++i ) + fontserv->FreeText(text[i]); + delete chicago; + delete dialog; + return; +} + diff --git a/controls.h b/controls.h new file mode 100644 index 0000000..1057fc0 --- /dev/null +++ b/controls.h @@ -0,0 +1,33 @@ + +// Functions from controls.cc +#ifdef USE_JOYSTICK +extern void CalibrateJoystick(char *joystick); +#endif +extern void LoadControls(void); +extern void SaveControls(void); +extern void ConfigureControls(void); +extern int PollEvent(SDL_Event *event, int timeout); +extern void HandleEvents(int timeout); +extern int DropEvents(void); +extern void ShowDawn(void); + +/* Generic key control definitions */ +#define THRUST_KEY 0x01 +#define RIGHT_KEY 0x02 +#define LEFT_KEY 0x03 +#define SHIELD_KEY 0x04 +#define FIRE_KEY 0x05 +#define PAUSE_KEY 0x06 +#define ABORT_KEY 0x07 + +/* The controls structure */ +typedef struct { + SDLKey gPauseControl; + SDLKey gShieldControl; + SDLKey gThrustControl; + SDLKey gTurnRControl; + SDLKey gTurnLControl; + SDLKey gFireControl; + SDLKey gQuitControl; +} Controls; + diff --git a/dialog.cpp b/dialog.cpp new file mode 100644 index 0000000..7c150f9 --- /dev/null +++ b/dialog.cpp @@ -0,0 +1,310 @@ + +#include "dialog.h" + + +int Mac_Dialog::text_enabled = 0; + +Mac_Dialog::Mac_Dialog(int x, int y) +{ + Screen = NULL; + X = x; + Y = y; + button_callback = NULL; + key_callback = NULL; + errstr = NULL; +} + +Mac_Button::Mac_Button(int x, int y, int width, int height, + char *text, MFont *font, FontServ *fontserv, + int (*callback)(void)) : Mac_Dialog(x, y) +{ + SDL_Surface *textb; + SDL_Rect dstrect; + + /* Set private variables */ + Width = width; + Height = height; + + /* Build image of the button */ + button = SDL_CreateRGBSurface(SDL_SWSURFACE, Width, Height, + 8, 0, 0, 0, 0); + if ( button == NULL ) { + SetError("%s", SDL_GetError()); + return; + } + button->format->palette->colors[0].r = 0xFF; + button->format->palette->colors[0].g = 0xFF; + button->format->palette->colors[0].b = 0xFF; + button->format->palette->colors[1].r = 0x00; + button->format->palette->colors[1].g = 0x00; + button->format->palette->colors[1].b = 0x00; + textb = fontserv->TextImage(text, font, STYLE_NORM, + 0x00, 0x00, 0x00); + if ( textb != NULL ) { + if ( (textb->w <= button->w) && + (textb->h <= button->h) ) { + dstrect.x = (button->w-textb->w)/2; + dstrect.y = (button->h-textb->h)/2; + dstrect.w = textb->w; + dstrect.h = textb->h; + SDL_BlitSurface(textb, NULL, button, &dstrect); + } + fontserv->FreeText(textb); + } + Bevel_Button(button); + + /* Set the callback */ + Callback = callback; +} + +Mac_DefaultButton::Mac_DefaultButton(int x, int y, int width, int height, + char *text, MFont *font, FontServ *fontserv, + int (*callback)(void)) : + Mac_Button(x, y, width, height, text, font, fontserv, callback) +{ + return; +} + +Mac_CheckBox::Mac_CheckBox(int *toggle, int x, int y, char *text, + MFont *font, FontServ *fontserv) : Mac_Dialog(x, y) +{ + /* Create the text label */ + Fontserv = fontserv; + label = Fontserv->TextImage(text, font, STYLE_NORM, 0, 0, 0); + + /* Set the checkbox variable */ + checkval = toggle; +} + +Mac_RadioList::Mac_RadioList(int *variable, int x, int y, + MFont *font, FontServ *fontserv) : Mac_Dialog(x, y) +{ + Fontserv = fontserv; + Font = font; + radiovar = variable; + *radiovar = 0; + radio_list.next = NULL; +} + +Mac_TextEntry::Mac_TextEntry(int x, int y, + MFont *font, FontServ *fontserv) : Mac_Dialog(x, y) +{ + Fontserv = fontserv; + Font = font; + Cwidth = Fontserv->TextWidth("0", Font, STYLE_NORM); + Cheight = Fontserv->TextHeight(font); + entry_list.next = NULL; + current = &entry_list; + EnableText(); +} + +Mac_NumericEntry::Mac_NumericEntry(int x, int y, + MFont *font, FontServ *fontserv) : Mac_Dialog(x, y) +{ + Fontserv = fontserv; + Font = font; + Cwidth = Fontserv->TextWidth("0", Font, STYLE_NORM); + Cheight = Fontserv->TextHeight(font); + entry_list.next = NULL; + current = &entry_list; +} + +Maclike_Dialog:: Maclike_Dialog(int x, int y, int width, int height, + FrameBuf *screen) +{ + Screen = screen; + X = x; + Y = y; + Width = width; + Height = height; + rect_list.next = NULL; + image_list.next = NULL; + dialog_list.next = NULL; +} + +Maclike_Dialog:: ~Maclike_Dialog() +{ + struct rect_elem *rect, *rtemp; + struct image_elem *image, *itemp; + struct dialog_elem *dialog, *dtemp; + + /* Clean out the lists */ + for ( rect = rect_list.next; rect; ) { + rtemp = rect; + rect = rect->next; + delete rtemp; + } + for ( image = image_list.next; image; ) { + itemp = image; + image = image->next; + delete itemp; + } + for ( dialog = dialog_list.next; dialog; ) { + dtemp = dialog; + dialog = dialog->next; + delete dtemp->dialog; + delete dtemp; + } +} + +void +Maclike_Dialog:: Add_Rectangle(int x, int y, int w, int h, Uint32 color) +{ + struct rect_elem *relem; + + for ( relem = &rect_list; relem->next; relem = relem->next ); + relem->next = new rect_elem; + relem = relem->next; + relem->x = x; + relem->y = y; + relem->w = w; + relem->h = h; + relem->color = color; + relem->next = NULL; +} + +void +Maclike_Dialog:: Add_Image(SDL_Surface *image, int x, int y) +{ + struct image_elem *ielem; + + for ( ielem = &image_list; ielem->next; ielem = ielem->next ); + ielem->next = new image_elem; + ielem = ielem->next; + ielem->image = image; + ielem->x = x; + ielem->y = y; + ielem->next = NULL; +} + +void +Maclike_Dialog:: Add_Dialog(Mac_Dialog *dialog) +{ + struct dialog_elem *delem; + + for ( delem = &dialog_list; delem->next; delem = delem->next ); + delem->next = new dialog_elem; + delem = delem->next; + delem->dialog = dialog; + delem->next = NULL; +} + + +/* The big Kahones */ +void +Maclike_Dialog:: Run(int expand_steps) +{ + SDL_Surface *savedfg; + SDL_Surface *savedbg; + SDL_Event event; + struct rect_elem *relem; + struct image_elem *ielem; + struct dialog_elem *delem; + Uint32 black, dark, medium, light, white; + int i, done; + int maxX, maxY; + double XX, YY, H, Hstep, V, Vstep; + + /* Save the area behind the dialog box */ + savedfg = Screen->GrabArea(X, Y, Width, Height); + Screen->FocusBG(); + savedbg = Screen->GrabArea(X, Y, Width, Height); + + /* Show the dialog box with the nice Mac border */ + black = Screen->MapRGB(0x00, 0x00, 0x00); + dark = Screen->MapRGB(0x66, 0x66, 0x99); + medium = Screen->MapRGB(0xBB, 0xBB, 0xBB); + light = Screen->MapRGB(0xCC, 0xCC, 0xFF); + white = Screen->MapRGB(0xFF, 0xFF, 0xFF); + maxX = X+Width-1; + maxY = Y+Height-1; + Screen->DrawLine(X, Y, maxX, Y, light); + Screen->DrawLine(X, Y, X, maxY, light); + Screen->DrawLine(X, maxY, maxX, maxY, dark); + Screen->DrawLine(maxX, Y, maxX, maxY, dark); + Screen->DrawRect(X+1, Y+1, Width-2, Height-2, medium); + Screen->DrawLine(X+2, Y+2, maxX-2, Y+2, dark); + Screen->DrawLine(X+2, Y+2, X+2, maxY-2, dark); + Screen->DrawLine(X+3, maxY-2, maxX-2, maxY-2, light); + Screen->DrawLine(maxX-2, Y+3, maxX-2, maxY-2, light); + Screen->DrawRect(X+3, Y+3, Width-6, Height-6, black); + Screen->FillRect(X+4, Y+4, Width-8, Height-8, white); + Screen->FocusFG(); + + /* Allow the dialog to expand slowly */ + XX = (double)(X+Width/2); + YY = (double)(Y+Height/2); + Hstep = (double)(Width/expand_steps); + Vstep = (double)(Height/expand_steps); + for ( H=0, V=0, i=0; i Width ) { + H = Width; + } + if ( V > Height ) { + V = Height; + } + Screen->Clear((Uint16)XX, (Uint16)YY, (Uint16)H, (Uint16)V); + Screen->Update(); + } + Screen->Clear((Uint16)X, (Uint16)Y, (Uint16)Width, (Uint16)Height); + Screen->Update(); + + /* Draw the dialog elements (after the slow expand) */ + for ( relem = rect_list.next; relem; relem = relem->next ) { + Screen->DrawRect(X+4+relem->x, Y+4+relem->y, relem->w, relem->h, + relem->color); + } + for ( ielem = image_list.next; ielem; ielem = ielem->next ) { + Screen->QueueBlit(X+4+ielem->x, Y+4+ielem->y, + ielem->image, NOCLIP); + } + for ( delem = dialog_list.next; delem; delem = delem->next ) { + delem->dialog->Map(X+4, Y+4, Screen, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00); + delem->dialog->Show(); + } + Screen->Update(); + + /* Wait until the dialog box is done */ + for ( done = 0; !done; ) { + Screen->WaitEvent(&event); + + switch (event.type) { + /* -- Handle mouse clicks */ + case SDL_MOUSEBUTTONDOWN: + for ( delem = dialog_list.next; delem; delem = delem->next ) + (delem->dialog)->HandleButtonPress(event.button.x, + event.button.y, event.button.button, &done); + break; + /* -- Handle key presses */ + case SDL_KEYDOWN: + for ( delem = dialog_list.next; delem; delem = delem->next ) + (delem->dialog)->HandleKeyPress(event.key.keysym, &done); + break; + } + } + + /* Replace the old section of screen */ + if ( savedbg ) { + Screen->FocusBG(); + Screen->QueueBlit(X, Y, savedbg, NOCLIP); + Screen->Update(); + Screen->FocusFG(); + Screen->FreeImage(savedbg); + } + if ( savedfg ) { + Screen->QueueBlit(X, Y, savedfg, NOCLIP); + Screen->Update(); + Screen->FreeImage(savedfg); + } +} diff --git a/dialog.h b/dialog.h new file mode 100644 index 0000000..d658d5e --- /dev/null +++ b/dialog.h @@ -0,0 +1,938 @@ + +#include +#include + +#include "SDL_FrameBuf.h" +#include "Mac_FontServ.h" + +/* This is a class set for Macintosh-like dialogue boxes. :) */ +/* Sorta complex... */ + +/* Defaults for various dialog classes */ + +#define BUTTON_WIDTH 75 +#define BUTTON_HEIGHT 19 + +#define BOX_WIDTH 170 +#define BOX_HEIGHT 20 + +#define EXPAND_STEPS 50 + +class Mac_Dialog { + +public: + Mac_Dialog(int x, int y); + virtual ~Mac_Dialog() { } + + /* Input handling */ + virtual void SetButtonPress(void (*new_button_callback) + (int x, int y, int button, int *doneflag)) { + button_callback = new_button_callback; + } + virtual void HandleButtonPress(int x, int y, int button, + int *doneflag) { + if ( button_callback ) { + (*button_callback)(x, y, button, doneflag); + } + } + virtual void SetKeyPress(void (*new_key_callback) + (SDL_keysym key, int *doneflag)) { + key_callback = new_key_callback; + } + virtual void HandleKeyPress(SDL_keysym key, int *doneflag) { + if ( key_callback ) { + (*key_callback)(key, doneflag); + } + } + + /* Display handling */ + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + X += Xoff; + Y += Yoff; + Screen = screen; + } + virtual void Show(void) { + } + + static void EnableText(void) { + if ( text_enabled++ == 0 ) { + SDL_EnableUNICODE(1); + } + } + static void DisableText(void) { + if ( --text_enabled == 0 ) { + SDL_EnableUNICODE(0); + } + } + + /* Error message routine */ + virtual char *Error(void) { + return(errstr); + } + +protected: + static int text_enabled; + FrameBuf *Screen; + int X, Y; + void (*button_callback)(int x, int y, int button, int *doneflag); + void (*key_callback)(SDL_keysym key, int *doneflag); + + /* Utility routines for dialogs */ + int IsSensitive(SDL_Rect *area, int x, int y) { + if ( (y > area->y) && (y < (area->y+area->h)) && + (x > area->x) && (x < (area->x+area->w)) ) + return(1); + return(0); + } + + /* Error message */ + virtual void SetError(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsprintf(errbuf, fmt, ap); + va_end(ap); + errstr = errbuf; + } + char *errstr; + char errbuf[1024]; +}; + + +/* The button callbacks should return 1 if they finish the dialog, + or 0 if they do not. +*/ + +class Mac_Button : public Mac_Dialog { + +public: + Mac_Button(int x, int y, int width, int height, + char *text, MFont *font, FontServ *fontserv, + int (*callback)(void)); + virtual ~Mac_Button() { + SDL_FreeSurface(button); + } + + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + /* Do the normal dialog mapping */ + Mac_Dialog::Map(Xoff, Yoff, screen, + R_bg, G_bg, B_bg, R_fg, G_fg, B_fg); + + /* Set up the button sensitivity */ + sensitive.x = X; + sensitive.y = Y; + sensitive.w = Width; + sensitive.h = Height; + + /* Map the bitmap image */ + button->format->palette->colors[0].r = R_bg; + button->format->palette->colors[0].g = G_bg; + button->format->palette->colors[0].b = B_bg; + button->format->palette->colors[1].r = R_fg; + button->format->palette->colors[1].g = G_fg; + button->format->palette->colors[1].b = B_fg; + } + virtual void Show(void) { + Screen->QueueBlit(X, Y, button, NOCLIP); + } + + virtual void HandleButtonPress(int x, int y, int button, + int *doneflag) { + if ( IsSensitive(&sensitive, x, y) ) + ActivateButton(doneflag); + } + +protected: + int Width, Height; + SDL_Surface *button; + SDL_Rect sensitive; + int (*Callback)(void); + + virtual void Bevel_Button(SDL_Surface *image) { + Uint16 h; + Uint8 *image_bits; + + image_bits = (Uint8 *)image->pixels; + + /* Bevel upper corners */ + memset(image_bits+3, 0x01, image->w-6); + image_bits += image->pitch; + memset(image_bits+1, 0x01, 2); + memset(image_bits+image->w-3, 0x01, 2); + image_bits += image->pitch; + memset(image_bits+1, 0x01, 1); + memset(image_bits+image->w-2, 0x01, 1); + image_bits += image->pitch; + + /* Draw sides */ + for ( h=3; h<(image->h-3); ++h ) { + image_bits[0] = 0x01; + image_bits[image->w-1] = 0x01; + image_bits += image->pitch; + } + + /* Bevel bottom corners */ + memset(image_bits+1, 0x01, 1); + memset(image_bits+image->w-2, 0x01, 1); + image_bits += image->pitch; + memset(image_bits+1, 0x01, 2); + memset(image_bits+image->w-3, 0x01, 2); + image_bits += image->pitch; + memset(image_bits+3, 0x01, image->w-6); + } + virtual void InvertImage(void) { + int i; + Uint8 *buf; + + for ( i=button->h*button->pitch, buf=(Uint8 *)button->pixels; + i > 0; --i, ++buf ) { + *buf = !*buf; + } + } + virtual void ActivateButton(int *doneflag) { + /* Flash the button */ + InvertImage(); + Show(); + Screen->Update(); + SDL_Delay(50); + InvertImage(); + Show(); + Screen->Update(); + /* Run the callback */ + if ( Callback ) + *doneflag = (*Callback)(); + else + *doneflag = 1; + } +}; + +/* The only difference between this button and the Mac_Button is that + if is pressed, this button is activated. +*/ +class Mac_DefaultButton : public Mac_Button { + +public: + Mac_DefaultButton(int x, int y, int width, int height, + char *text, MFont *font, FontServ *fontserv, + int (*callback)(void)); + virtual ~Mac_DefaultButton() { } + + virtual void HandleKeyPress(SDL_keysym key, int *doneflag) { + if ( key.sym == SDLK_RETURN ) + ActivateButton(doneflag); + } + + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + Mac_Button::Map(Xoff, Yoff, screen, + R_bg, G_bg, B_bg, R_fg, G_fg, B_fg); + Fg = Screen->MapRGB(R_fg, G_fg, B_fg); + } + virtual void Show(void) { + int x, y, maxx, maxy; + + /* Show the normal button */ + Mac_Button::Show(); + + /* Show the thick edge */ + x = X-4; + maxx = x+4+Width+4-1; + y = Y-4; + maxy = y+4+Height+4-1; + + Screen->DrawLine(x+5, y, maxx-5, y, Fg); + Screen->DrawLine(x+3, y+1, maxx-3, y+1, Fg); + Screen->DrawLine(x+2, y+2, maxx-2, y+2, Fg); + Screen->DrawLine(x+1, y+3, x+5, y+3, Fg); + Screen->DrawLine(maxx-5, y+3, maxx-1, y+3, Fg); + Screen->DrawLine(x+1, y+4, x+3, y+4, Fg); + Screen->DrawLine(maxx-3, y+4, maxx-1, y+4, Fg); + Screen->DrawLine(x, y+5, x+3, y+5, Fg); + Screen->DrawLine(maxx-3, y+5, maxx, y+5, Fg); + + Screen->DrawLine(x, y+6, x, maxy-6, Fg); + Screen->DrawLine(maxx, y+6, maxx, maxy-6, Fg); + Screen->DrawLine(x+1, y+6, x+1, maxy-6, Fg); + Screen->DrawLine(maxx-1, y+6, maxx-1, maxy-6, Fg); + Screen->DrawLine(x+2, y+6, x+2, maxy-6, Fg); + Screen->DrawLine(maxx-2, y+6, maxx-2, maxy-6, Fg); + + Screen->DrawLine(x, maxy-5, x+3, maxy-5, Fg); + Screen->DrawLine(maxx-3, maxy-5, maxx, maxy-5, Fg); + Screen->DrawLine(x+1, maxy-4, x+3, maxy-4, Fg); + Screen->DrawLine(maxx-3, maxy-4, maxx-1, maxy-4, Fg); + Screen->DrawLine(x+1, maxy-3, x+5, maxy-3, Fg); + Screen->DrawLine(maxx-5, maxy-3, maxx-1, maxy-3, Fg); + Screen->DrawLine(x+2, maxy-2, maxx-2, maxy-2, Fg); + Screen->DrawLine(x+3, maxy-1, maxx-3, maxy-1, Fg); + Screen->DrawLine(x+5, maxy, maxx-5, maxy, Fg); + } + +protected: + Uint32 Fg; /* The foreground color of the dialog */ + +}; + +/* Class of checkboxes */ + +#define CHECKBOX_SIZE 12 + +class Mac_CheckBox : public Mac_Dialog { + +public: + Mac_CheckBox(int *toggle, int x, int y, char *text, + MFont *font, FontServ *fontserv); + virtual ~Mac_CheckBox() { + if ( label ) { + Fontserv->FreeText(label); + } + } + + virtual void HandleButtonPress(int x, int y, int button, + int *doneflag) { + if ( IsSensitive(&sensitive, x, y) ) { + *checkval = !*checkval; + Check_Box(*checkval); + Screen->Update(); + } + } + + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + /* Do the normal dialog mapping */ + Mac_Dialog::Map(Xoff, Yoff, screen, + R_bg, G_bg, B_bg, R_fg, G_fg, B_fg); + + /* Set up the checkbox sensitivity */ + sensitive.x = X; + sensitive.y = Y; + sensitive.w = CHECKBOX_SIZE; + sensitive.h = CHECKBOX_SIZE; + + /* Get the screen colors */ + Fg = Screen->MapRGB(R_fg, G_fg, B_fg); + Bg = Screen->MapRGB(R_bg, G_bg, B_bg); + + /* Map the checkbox text */ + label->format->palette->colors[1].r = R_fg; + label->format->palette->colors[1].g = G_fg; + label->format->palette->colors[1].b = B_fg; + } + virtual void Show(void) { + Screen->DrawRect(X, Y, CHECKBOX_SIZE, CHECKBOX_SIZE, Fg); + if ( label ) { + Screen->QueueBlit(X+CHECKBOX_SIZE+4, Y-2, label,NOCLIP); + } + Check_Box(*checkval); + } + +private: + FontServ *Fontserv; + SDL_Surface *label; + Uint32 Fg, Bg; + int *checkval; + SDL_Rect sensitive; + + void Check_Box(int checked) { + Uint32 color; + + if ( checked ) + color = Fg; + else + color = Bg; + + Screen->DrawLine(X, Y, + X+CHECKBOX_SIZE-1, Y+CHECKBOX_SIZE-1, color); + Screen->DrawLine(X, Y+CHECKBOX_SIZE-1, + X+CHECKBOX_SIZE-1, Y, color); + } +}; + +/* Class of radio buttons */ + +class Mac_RadioList : public Mac_Dialog { + +public: + Mac_RadioList(int *variable, int x, int y, + MFont *font, FontServ *fontserv); + virtual ~Mac_RadioList() { + struct radio *radio, *old; + + for ( radio=radio_list.next; radio; ) { + old = radio; + radio = radio->next; + if ( old->label ) + Fontserv->FreeText(old->label); + delete old; + } + } + + virtual void HandleButtonPress(int x, int y, int button, + int *doneflag) { + int n; + struct radio *radio, *oldradio; + + oldradio = radio_list.next; + for (n=0, radio=radio_list.next; radio; radio=radio->next, ++n){ + if ( n == *radiovar ) { + oldradio = radio; + break; + } + } + for (n=0, radio=radio_list.next; radio; radio=radio->next, ++n){ + if ( IsSensitive(&radio->sensitive, x, y) ) { + Spot(oldradio->x, oldradio->y, Bg); + *radiovar = n; + Spot(radio->x, radio->y, Fg); + Screen->Update(); + } + } + } + + virtual void Add_Radio(int x, int y, char *text) { + struct radio *radio; + + for ( radio=&radio_list; radio->next; radio=radio->next ) + /* Loop to end of radio box list */; +/* Which is ANSI C++? */ +#ifdef linux + radio->next = new struct Mac_RadioList::radio; +#else + radio->next = new struct radio; +#endif + radio = radio->next; + radio->label = Fontserv->TextImage(text, Font, + STYLE_NORM, 0, 0, 0); + radio->x = x; + radio->y = y; + radio->sensitive.x = x; + radio->sensitive.y = y; + radio->sensitive.w = 20+radio->label->w; + radio->sensitive.h = BOX_HEIGHT; + radio->next = NULL; + } + + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + struct radio *radio; + + /* Do the normal dialog mapping */ + Mac_Dialog::Map(Xoff, Yoff, screen, + R_bg, G_bg, B_bg, R_fg, G_fg, B_fg); + + /* Get the screen colors */ + Fg = Screen->MapRGB(R_fg, G_fg, B_fg); + Bg = Screen->MapRGB(R_bg, G_bg, B_bg); + + /* Adjust sensitivity and map the radiobox text */ + for ( radio=radio_list.next; radio; radio=radio->next ) { + radio->x += Xoff; + radio->y += Yoff; + radio->sensitive.x += Xoff; + radio->sensitive.y += Yoff; + radio->label->format->palette->colors[1].r = R_fg; + radio->label->format->palette->colors[1].g = G_fg; + radio->label->format->palette->colors[1].b = B_fg; + } + } + virtual void Show(void) { + int n; + struct radio *radio; + + for (n=0, radio=radio_list.next; radio; radio=radio->next, ++n){ + Circle(radio->x, radio->y); + if ( n == *radiovar ) { + Spot(radio->x, radio->y, Fg); + } + if ( radio->label ) { + Screen->QueueBlit(radio->x+21, radio->y+3, + radio->label, NOCLIP); + } + } + } + +private: + FontServ *Fontserv; + MFont *Font; + Uint32 Fg, Bg; + int *radiovar; + struct radio { + SDL_Surface *label; + int x, y; + SDL_Rect sensitive; + struct radio *next; + } radio_list; + + void Circle(int x, int y) { + x += 5; + y += 5; + Screen->DrawLine(x+4, y, x+7, y, Fg); + Screen->DrawLine(x+2, y+1, x+3, y+1, Fg); + Screen->DrawLine(x+8, y+1, x+9, y+1, Fg); + Screen->DrawLine(x+1, y+2, x+1, y+3, Fg); + Screen->DrawLine(x+10, y+2, x+10, y+3, Fg); + Screen->DrawLine(x, y+4, x, y+7, Fg); + Screen->DrawLine(x+11, y+4, x+11, y+7, Fg); + Screen->DrawLine(x+1, y+8, x+1, y+9, Fg); + Screen->DrawLine(x+10, y+8, x+10, y+9, Fg); + Screen->DrawLine(x+2, y+10, x+3, y+10, Fg); + Screen->DrawLine(x+8, y+10, x+9, y+10, Fg); + Screen->DrawLine(x+4, y+11, x+7, y+11, Fg); + } + void Spot(int x, int y, Uint32 color) + { + x += 8; + y += 8; + Screen->DrawLine(x+1, y, x+4, y, color); + ++y; + Screen->DrawLine(x, y, x+5, y, color); + ++y; + Screen->DrawLine(x, y, x+5, y, color); + ++y; + Screen->DrawLine(x, y, x+5, y, color); + ++y; + Screen->DrawLine(x, y, x+5, y, color); + ++y; + Screen->DrawLine(x+1, y, x+4, y, color); + } +}; + + +/* Class of text entry boxes */ + +class Mac_TextEntry : public Mac_Dialog { + +public: + Mac_TextEntry(int x, int y, MFont *font, FontServ *fontserv); + virtual ~Mac_TextEntry() { + struct text_entry *entry, *old; + + for ( entry=entry_list.next; entry; ) { + old = entry; + entry = entry->next; + if ( old->text ) + Fontserv->FreeText(old->text); + delete old; + } + DisableText(); + } + + virtual void HandleButtonPress(int x, int y, int button, + int *doneflag) { + struct text_entry *entry; + + for ( entry=entry_list.next; entry; entry=entry->next ) { + if ( IsSensitive(&entry->sensitive, x, y) ) { + current->hilite = 0; + Update_Entry(current); + current = entry; + DrawCursor(current); + Screen->Update(); + } + } + } + virtual void HandleKeyPress(SDL_keysym key, int *doneflag) { + int n; + + switch (key.sym) { + case SDLK_TAB: + current->hilite = 0; + Update_Entry(current); + if ( current->next ) + current=current->next; + else + current=entry_list.next; + current->hilite = 1; + Update_Entry(current); + break; + + case SDLK_DELETE: + case SDLK_BACKSPACE: + if ( current->hilite ) { + *current->variable = '\0'; + current->hilite = 0; + } else if ( *current->variable ) { + n = strlen(current->variable); + current->variable[n-1] = '\0'; + } + Update_Entry(current); + DrawCursor(current); + break; + + default: + if ( (current->end+Cwidth) > current->width ) + return; + if ( key.unicode ) { + current->hilite = 0; + n = strlen(current->variable); + current->variable[n] = (char)key.unicode; + current->variable[n+1] = '\0'; + Update_Entry(current); + DrawCursor(current); + } + break; + } + Screen->Update(); + } + + virtual void Add_Entry(int x, int y, int width, int is_default, + char *variable) { + struct text_entry *entry; + + for ( entry=&entry_list; entry->next; entry=entry->next ) + /* Loop to end of entry list */; + entry->next = new struct text_entry; + entry = entry->next; + + entry->variable = variable; + if ( is_default ) { + current = entry; + entry->hilite = 1; + } else + entry->hilite = 0; + entry->x = x+3; + entry->y = y+3; + entry->width = width*Cwidth; + entry->height = Cheight; + entry->sensitive.x = x; + entry->sensitive.y = y; + entry->sensitive.w = 3+(width*Cwidth)+3; + entry->sensitive.h = 3+Cheight+3; + entry->text = NULL; + entry->next = NULL; + } + + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + struct text_entry *entry; + + /* Do the normal dialog mapping */ + Mac_Dialog::Map(Xoff, Yoff, screen, + R_bg, G_bg, B_bg, R_fg, G_fg, B_fg); + + /* Get the screen colors */ + foreground.r = R_fg; + foreground.g = G_fg; + foreground.b = B_fg; + background.r = R_bg; + background.g = G_bg; + background.b = B_bg; + Fg = Screen->MapRGB(R_fg, G_fg, B_fg); + Bg = Screen->MapRGB(R_bg, G_bg, B_bg); + + /* Adjust sensitivity and map the radiobox text */ + for ( entry=entry_list.next; entry; entry=entry->next ) { + entry->x += Xoff; + entry->y += Yoff; + entry->sensitive.x += Xoff; + entry->sensitive.y += Yoff; + } + } + virtual void Show(void) { + struct text_entry *entry; + + for ( entry=entry_list.next; entry; entry=entry->next ) { + Screen->DrawRect(entry->x-3, entry->y-3, + 3+entry->width+3, 3+Cheight+3, Fg); + Update_Entry(entry); + } + } + +private: + FontServ *Fontserv; + MFont *Font; + Uint32 Fg, Bg; + int Cwidth, Cheight; + SDL_Color foreground; + SDL_Color background; + + struct text_entry { + SDL_Surface *text; + char *variable; + SDL_Rect sensitive; + int x, y; + int width, height; + int end; + int hilite; + struct text_entry *next; + } entry_list, *current; + + + void Update_Entry(struct text_entry *entry) { + Uint32 clear; + + /* Create the new entry text */ + if ( entry->text ) { + Fontserv->FreeText(entry->text); + } + if ( entry->hilite ) { + clear = Fg; + entry->text = Fontserv->TextImage(entry->variable, + Font, STYLE_NORM, background, foreground); + } else { + clear = Bg; + entry->text = Fontserv->TextImage(entry->variable, + Font, STYLE_NORM, foreground, background); + } + Screen->FillRect(entry->x, entry->y, + entry->width, entry->height, clear); + if ( entry->text ) { + entry->end = entry->text->w; + Screen->QueueBlit(entry->x, entry->y, entry->text, NOCLIP); + } else { + entry->end = 0; + } + } + void DrawCursor(struct text_entry *entry) { + Screen->DrawLine(entry->x+entry->end, entry->y, + entry->x+entry->end, entry->y+entry->height-1, Fg); + } +}; + + +/* Class of numeric entry boxes */ + +class Mac_NumericEntry : public Mac_Dialog { + +public: + Mac_NumericEntry(int x, int y, MFont *font, FontServ *fontserv); + virtual ~Mac_NumericEntry() { + struct numeric_entry *entry, *old; + + for ( entry=entry_list.next; entry; ) { + old = entry; + entry = entry->next; + if ( old->text ) + Fontserv->FreeText(old->text); + delete old; + } + } + + virtual void HandleButtonPress(int x, int y, int button, + int *doneflag) { + struct numeric_entry *entry; + + for ( entry=entry_list.next; entry; entry=entry->next ) { + if ( IsSensitive(&entry->sensitive, x, y) ) { + current->hilite = 0; + Update_Entry(current); + current = entry; + DrawCursor(current); + Screen->Update(); + } + } + } + virtual void HandleKeyPress(SDL_keysym key, int *doneflag) { + int n; + + switch (key.sym) { + case SDLK_TAB: + current->hilite = 0; + Update_Entry(current); + if ( current->next ) + current=current->next; + else + current=entry_list.next; + current->hilite = 1; + Update_Entry(current); + break; + + case SDLK_DELETE: + case SDLK_BACKSPACE: + if ( current->hilite ) { + *current->variable = 0; + current->hilite = 0; + } else + *current->variable /= 10; + Update_Entry(current); + DrawCursor(current); + break; + + case SDLK_0: + case SDLK_1: + case SDLK_2: + case SDLK_3: + case SDLK_4: + case SDLK_5: + case SDLK_6: + case SDLK_7: + case SDLK_8: + case SDLK_9: + n = (key.sym-SDLK_0); + if ( (current->end+Cwidth) > current->width ) + return; + if ( current->hilite ) { + *current->variable = n; + current->hilite = 0; + } else { + *current->variable *= 10; + *current->variable += n; + } + Update_Entry(current); + DrawCursor(current); + break; + + default: + break; + } + Screen->Update(); + } + + virtual void Add_Entry(int x, int y, int width, int is_default, + int *variable) { + struct numeric_entry *entry; + + for ( entry=&entry_list; entry->next; entry=entry->next ) + /* Loop to end of numeric entry list */; + entry->next = new struct numeric_entry; + entry = entry->next; + + entry->variable = variable; + if ( is_default ) { + current = entry; + entry->hilite = 1; + } else + entry->hilite = 0; + entry->x = x+3; + entry->y = y+3; + entry->width = width*Cwidth; + entry->height = Cheight; + entry->sensitive.x = x; + entry->sensitive.y = y; + entry->sensitive.w = 3+(width*Cwidth)+3; + entry->sensitive.h = 3+Cheight+3; + entry->text = NULL; + entry->next = NULL; + } + + virtual void Map(int Xoff, int Yoff, FrameBuf *screen, + Uint8 R_bg, Uint8 G_bg, Uint8 B_bg, + Uint8 R_fg, Uint8 G_fg, Uint8 B_fg) { + struct numeric_entry *entry; + + /* Do the normal dialog mapping */ + Mac_Dialog::Map(Xoff, Yoff, screen, + R_bg, G_bg, B_bg, R_fg, G_fg, B_fg); + + /* Get the screen colors */ + foreground.r = R_fg; + foreground.g = G_fg; + foreground.b = B_fg; + background.r = R_bg; + background.g = G_bg; + background.b = B_bg; + Fg = Screen->MapRGB(R_fg, G_fg, B_fg); + Bg = Screen->MapRGB(R_bg, G_bg, B_bg); + + /* Adjust sensitivity and map the radiobox text */ + for ( entry=entry_list.next; entry; entry=entry->next ) { + entry->x += Xoff; + entry->y += Yoff; + entry->sensitive.x += Xoff; + entry->sensitive.y += Yoff; + } + } + virtual void Show(void) { + struct numeric_entry *entry; + + for ( entry=entry_list.next; entry; entry=entry->next ) { + Screen->DrawRect(entry->x-3, entry->y-3, + 3+entry->width+3, 3+Cheight+3, Fg); + Update_Entry(entry); + } + } + +private: + FontServ *Fontserv; + MFont *Font; + Uint32 Fg, Bg; + int Cwidth, Cheight; + SDL_Color foreground; + SDL_Color background; + + struct numeric_entry { + SDL_Surface *text; + int *variable; + SDL_Rect sensitive; + int x, y; + int width, height; + int end; + int hilite; + struct numeric_entry *next; + } entry_list, *current; + + + void Update_Entry(struct numeric_entry *entry) { + char buf[128]; + Uint32 clear; + + /* Create the new entry text */ + if ( entry->text ) { + Fontserv->FreeText(entry->text); + } + sprintf(buf, "%d", *entry->variable); + + if ( entry->hilite ) { + clear = Fg; + entry->text = Fontserv->TextImage(buf, + Font, STYLE_NORM, background, foreground); + } else { + clear = Bg; + entry->text = Fontserv->TextImage(buf, + Font, STYLE_NORM, foreground, background); + } + entry->end = entry->text->w; + Screen->FillRect(entry->x, entry->y, + entry->width, entry->height, clear); + Screen->QueueBlit(entry->x, entry->y, entry->text, NOCLIP); + } + void DrawCursor(struct numeric_entry *entry) { + Screen->DrawLine(entry->x+entry->end, entry->y, + entry->x+entry->end, entry->y+entry->height-1, Fg); + } +}; + + +/* Finally, the macintosh-like dialog class */ + +class Maclike_Dialog { + +public: + Maclike_Dialog(int x, int y, int width, int height, FrameBuf *screen); + ~Maclike_Dialog(); + + void Add_Rectangle(int x, int y, int w, int h, Uint32 color); + void Add_Image(SDL_Surface *image, int x, int y); + void Add_Dialog(Mac_Dialog *dialog); + + void Run(int expand_steps = 1); + +private: + FrameBuf *Screen; + int X, Y; + int Width, Height; + + struct rect_elem { + Sint16 x, y; + Uint16 w, h; + Uint32 color; + struct rect_elem *next; + } rect_list; + struct image_elem { + SDL_Surface *image; + int x, y; + struct image_elem *next; + } image_list; + struct dialog_elem { + Mac_Dialog *dialog; + struct dialog_elem *next; + } dialog_list; +}; diff --git a/fastrand.cpp b/fastrand.cpp new file mode 100644 index 0000000..ed5a135 --- /dev/null +++ b/fastrand.cpp @@ -0,0 +1,93 @@ + +/* -- Return a random value between 0 and range - 1 */ + +#include +#include +#include + +#include "SDL_types.h" + +static Uint32 randomSeed; + +void SeedRandom(Uint32 Seed) +{ +#ifdef SERIOUS_DEBUG + fprintf(stderr, "SeedRandom(%lu)\n", Seed); +#endif + if ( ! Seed ) { + srand(time(NULL)); + Seed = (((rand()%0xFFFF)<<16)|(rand()%0xFFFF)); + } + randomSeed = Seed; +} + +Uint32 GetRandSeed(void) +{ + return(randomSeed); +} + +/* This magic is wholly the result of Andrew Welch, not me. :-) */ +Uint16 FastRandom(Uint16 range) +{ + Uint16 result; + register Uint32 calc; + register Uint32 regD0; + register Uint32 regD1; + register Uint32 regD2; + +#ifdef SERIOUS_DEBUG + fprintf(stderr, "FastRandom(%hd) Seed in: %lu ", range, randomSeed); +#endif + calc = randomSeed; + regD0 = 0x41A7; + regD2 = regD0; + + regD0 *= calc & 0x0000FFFF; + regD1 = regD0; + + regD1 = regD1 >> 16; + + regD2 *= calc >> 16; + regD2 += regD1; + regD1 = regD2; + regD1 += regD1; + + regD1 = regD1 >> 16; + + regD0 &= 0x0000FFFF; + regD0 -= 0x7FFFFFFF; + + regD2 &= 0x00007FFF; + regD2 = (regD2 << 16) + (regD2 >> 16); + + regD2 += regD1; + regD0 += regD2; + + /* An unsigned value < 0 is always 0 */ + /************************************* + Not compiled: + if (regD0 < 0) + regD0 += 0x7FFFFFFF; + *************************************/ + + randomSeed = regD0; +#ifdef SERIOUS_DEBUG + fprintf(stderr, "Seed out: %lu ", randomSeed); +#endif + + if ((regD0 & 0x0000FFFF) == 0x8000) + regD0 &= 0xFFFF0000; + +/* -- Now that we have our pseudo random number, pin it to the range we want */ + + regD1 = range; + regD1 *= (regD0 & 0x0000FFFF); + regD1 = (regD1 >> 16); + + result = regD1; +#ifdef SERIOUS_DEBUG + fprintf(stderr, "Result: %hu\n", result); +#endif + + return result; +} diff --git a/fastrand.h b/fastrand.h new file mode 100644 index 0000000..c068f08 --- /dev/null +++ b/fastrand.h @@ -0,0 +1,7 @@ + +/* Declarations for the fast random functions */ + +extern void SeedRandom(Uint32 seed); +extern Uint16 FastRandom(Uint16 range); +extern Uint32 GetRandSeed(void); + diff --git a/ico_o b/ico_o new file mode 100644 index 0000000000000000000000000000000000000000..d5feaa2c071d580183fc65b825fcea5d945dd300 GIT binary patch literal 2518 zcmeH}y>A;g7{*^UIq78GhmPbOzuLxXTsKO9q-Q%o4yb`tfPq3tkn~a)h1yL^0WC!| zdhy`VqehQ4(4pSy(Lg5;9XxvUzv4dBx6lM#GvtN%aqmO^_>w%H_@YuFXMfj;Cbhej z$8U#k`(y7U`wiMRsQ!u4*(XTPiC(+>g!|2y-qK<{AuCfes{=lmV`bNCBzI_Q(b zSHRbX-hw}euMLKR&&}V*m_A}By1l)9#}0gSeO!SLbOkD2^}Xid>*Zy7ZpO^3<4Wcc zRrO+GEU|cSX=1v%qMIbll+j||W1(xQ^#c+3#*kU7D<#K}g|1T3A6JuxQVH_dCscyIy zQN7yWWR2Alv}E_kd+}T+sZHp4Ro^~JF-DrK1#0{AV4)KkTlGBe$;%BXC6<_25UCYi zbKmpWmf$IjYZkQZ|b+vp3_z!G%+IRVa;? zeA8@iDJ5n)$y5lT^rQVERMyH^=yFS>3!O3{cb`i3Wn?VdQ6hMeJfNwN0M zR{Bp|<9@Rf;`HV7wR*a=cIWH=&gTUC0q5?%w7x#MmAM;DWqwDhk-PmktI_gZ&E1*q Ikh{$M3xyfBM*si- literal 0 HcmV?d00001 diff --git a/icon.bmp b/icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2f3dd3b61cd0b2ca7df4053c4177cf92070b45bb GIT binary patch literal 2732 zcmb7GId@Y>7##;BKk4nWF99NBW6P|v!OTIbPRjN73?WPSc5C#SA;EA1?=&2~{=#?v zdjI}CdH3!edHeP)dGqECdHwn|dG+cQdHM1sIXXHbFJ8PL&!0ahhlhvc;NXDl@9&en zy*)A*49M>8F4@`HA=}&Aq~Gt8Uav>G-7e{LI;7QVk!G_=8jS|gT9YixNDu_zI|9!k zcn-j^2d;ha48XGsj%{%C!O;Up7aSdMw7}5>M*|!h92ryx@Ed@`>)3_A*U$%t*UcEQyFR|{NC?Dui@0Gti@`LjB}?ZEDJw}9UUPZ#HD_%y-W178RGU7Vi*-vZ9t zyRf%l?|`QZpB8K#*qYdHz}|wb2@VaLzkh%;189eItm3RorDs^GDAJiq^?$C)ObUEO znyF>&lwtH!R)9~cZu$!Lgk^|u)dc)iGlf?)SEYxW@-tPhXBuy19%oWRl;o3CQ+QYM zS;gYnSZU`BjWbn@iJQbbqqH%4iRV#}Sz8pA)@zy8YA6n(r|?<`o@I>DJeSTPMk1Z9 z<(j1*R88R(=k(%NKirt(!Z@phRy3@|oHIQN$Rr*J&gQnB-AHmOl$Km8mPSzuKZx^d z0&k=M#`e}#9>!6^6_nE?isK|>BSDjRo>Q)i>&s3=K@cXw8YNhsW?x*)M}j8s2z$a2 z6ytPW3&MJ?5iKj3T#d5R@P+d_kpgE$To1!2N6L^i`{<|D=Cpn%8G42_~NWXDrH1lAQmF>iU6sP~S&_%}i0jqpVuVnS zbvvUu`=-!{W4eHG~nWWP8Hpca1G#GTF&<;Uz*9$E*wyncwVR=RsDs?pG8>A1I2^EB4Onioh;PdMrMEIN$;tJ$Uu$v(8+sQ6U!325x@qugr6h zP2dZIN|9iyg)e;!^6WE!l>6W1`UHQu_u(;gj2`JZ<#{@yJMl4mo}PSOpZ>JQ VZT$24tp5kj`hVku%KtVH@-Kc@_8tHL literal 0 HcmV?d00001 diff --git a/icon.xpm b/icon.xpm new file mode 100644 index 0000000..2b57021 --- /dev/null +++ b/icon.xpm @@ -0,0 +1,147 @@ +/* XPM */ +static char *Maelstrom_icon[] = { +/* width height num_colors chars_per_pixel */ +" 48 48 92 2", +/* colors */ +".. c #dedede", +".# c #d6d6d6", +".a c #cecece", +".b c #c6c6c6", +".c c #bdbdbd", +".d c #b5b5b5", +".e c #adadad", +".f c #a5a5a5", +".g c #9c9c9c", +".h c #949494", +".i c #8c8c8c", +".j c #848484", +".k c #7b7b7b", +".l c #737373", +".m c #6b6b6b", +".n c #636363", +".o c #5a5a5a", +".p c #525252", +".q c #4a4a4a", +".r c #424242", +".s c #393939", +".t c #313131", +".u c #292929", +".v c #212121", +".w c #181818", +".x c #101010", +".y c #080808", +".z c #ada5a5", +".A c #948c8c", +".B c #8c8484", +".C c #7b7373", +".D c #847b7b", +".E c #736b6b", +".F c #6b6363", +".G c #5a5252", +".H c #524a4a", +".I c #4a4242", +".J c #423939", +".K c #393131", +".L c #312929", +".M c #292121", +".N c #211818", +".O c #181010", +".P c #100808", +".Q c #080000", +".R c #737b7b", +".S c #7b8484", +".T c #6b7373", +".U c #636b6b", +".V c #525a5a", +".W c #5a6363", +".X c #4a5252", +".Y c #424a4a", +".Z c #738484", +".0 c #6b7b7b", +".1 c #394242", +".2 c #313939", +".3 c #293131", +".4 c #526363", +".5 c #738c8c", +".6 c #212929", +".7 c #5a7373", +".8 c #394a4a", +".9 c #638484", +"#. c #4a6363", +"## c #314242", +"#a c #5a7b7b", +"#b c #425a5a", +"#c c #182121", +"#d c #293939", +"#e c #4a6b6b", +"#f c #395252", +"#g c #426363", +"#h c #101818", +"#i c #314a4a", +"#j c #294242", +"#k c #426b6b", +"#l c #315252", +"#m c #396363", +"#n c #427373", +"#o c #315a5a", +"#p c #396b6b", +"#q c #295252", +"#r c #214242", +"#s c #316363", +"#t c #295a5a", +"#u c #183939", +"#v c #215252", +"#w c #081818", +"#x c #082929", +"#y c #000808", +"#z c #000000", +/* pixels */ +"#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z", +"#z.u.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.u#z", +"#z.m...c.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.c...m#z", +"#z.m.c.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.c.m#z", +"#z.l.d.y#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.y.d.l#z", +"#z.m.d.w#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.x.y#z#z#z#z#z#z.y#z#z#z#z#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.x.w.v.x.y.y.y.x.u.s.v.y#z#z#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.x.v.v.w.w.w.t.r.u.w.w.t.r.r.u.v.w#z#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z#z#z#z#z.y.y.y.w.s.p.X.2.v.v.r.o.p.t.v.r.q.s.v.s.r.x#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z.y.y.P.N.t.2.r.m.F.X#m#f.r.r.r.q.G.s.v.r.q.s.w.s.p.r.v#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z.w.t.u#d#l.X.p.o.m.n.q#f##.t.u.s.X#.#j.v.s.r.s.t.r.q.q.s.u.u.w#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z.x.t.q.r#l#s.p.p.p.p.q.r.H.K.x.y.L.V#p#r.v.J.q.p.o.p.r.r.r.r.o.s.y#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z.t.q.r.u#c.6.Y.K.u.p.q.I.l.q.x.y.u.p.X.3.v.r.m.j.S.F.H.r.u.u.p.s#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z.w.r.p.r.t.u.L.t.6.v.K.8#g.n.n.r.x.x.u.M.N.u.n.k.l.G#b#g.X.s.t.q.r.v#z#z.w.d.m#z", +"#z.m.d.w#z#z#z.x.u.s.r.r.r.q.r.v.w.w.O#r#s.2.F.k.v#z.y.y.x.u.m.m.r.w#u#p.V.H.r.s.q.r.y#z.w.d.m#z", +"#z.m.d.w#z#z.y.x.v.v.s.q.r.q.r.w#z#z.y#c.6.v.o.k.u.y.x.w.w.u.q.p.J.x.3.W.V.s.v.v.s.r.y#z.w.d.m#z", +"#z.m.d.w#z#z.v.s.s.w.v.t.r.s.v.y.x.v.x.y.Q#z.v.t.v.y#z.w.x.y.v.t.v#z.x.r.n.p.u.w.v.u#z#z.w.d.m#z", +"#z.m.d.w#z.y.s.o.p.t.w.u.r.u#z.x.t.r.w#z#z.y#z#z.v#h#y.v.w.y.v.u.v.y.y.t.l.m.t.x#h#c.y#z.w.d.m#z", +"#z.m.d.w#z#z.v.Y.o.p.r.r.q.w#z.s.t.x.y.N.J.r.s.t.r#l#v.1.o.n.q.o.m.q.s.p.i.p#z#z#x#o.Y.P.x.d.m#z", +"#z.m.d.w#z#z.y.v.Y#..4.I.L.x.x.u.x#z.M#i#g.T.m.n.j.Z.9.j.A.i.l.k.j.l.l.k.l.u.y.t.7.9.1.y.x.d.m#z", +"#z.m.d.w#z#z#z.Q#c#q#f.K.x.w.v.y.y.u.G#.#p.T.C.j.e.f.A.e.f.j.l.m.l.l.j.k.q.u.t.m.A.E.w#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#h.w.w.w.v.w.y.r.k.l.W.X.p.n.j.e.f.i.h.i.l.p.r.q.q.o.o.p.q.q.p.I.u.y#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z.x.v.x.w.p.h.d.g.E.q.H.p.n.j.k.n.n.n.o.r.q.q.t.t.q.m.k.o.v.x#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z.x.w.v.q.f.a.c.c.j.p.V.q.r.q.r.s.s.s.s.s.q.q.w.v.p.j.h.m.y#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z.x.y.o.d.c.c.c.c.z.S#k#b.H.u.v.u.u.u.v.x.w.w#z.x.p.j.g.l.v#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z.y.y#z.y.r.g.#.b.c.b.a.h.X#j#f.q.w.y.y.y.y.w.v.r.p.r.u.s.C.h.j.n.u#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z.w.u.w#z.x.k.e.c.c.c.d.f.p.y.O.t.s.x#z#z#z.x.s.o.k.h.j.r.v.W.j.B.j.r#z#z#z.w.d.m#z", +"#z.m.d.w#z#z.x.s.q.w.w.r.l.i.g.d.d.i.q.x#z.y.w.x.y.y.w.u.o.j.j.i.k.o.L.6#t#a.C.m.u#z#z#z.w.d.m#z", +"#z.m.d.w#z#z.w.r.o.p.n.m.q.p.m.m.o.s.y#z#z.y.y#z.w.u.r.o.j.h.k.m.p.t.x#c#b.5.k.q.x#z#z#z.w.d.m#z", +"#z.m.d.w#z#z.w.s.n.i.g.k.u.v.t.w.y#z#z#z#z.y.x.v.q.o.n.k.l.n.q.r.t.x#z.N.m.h.l.u#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z.w.p.j.j.i.k.q.u.x#z#z.x.x#z#z#z.t.l.k.j.j.i.q.w.v.u.v#z#z.u.l.l.r.y#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z.y.t.q.s.s.r.t.x#z#z#z#z.x.y.x.t.m.h.i.h.j.o.v#z.x.x.y#z#w#i.U.I.x#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z.y.v.u.x#z.y.y#z.y.x.s.k.h.i.i.j.o.v.x.x.x.x.w.x#j#n.W.M#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z.x.t.o.l.r#z#z.x.w.y.v.o.g.f.i.h.o.v.v.w.w.x.t.q.t.W.j.n.v#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z.w.r.o.p.r.v#z.Q.N.y.s.j.f.f.i.l.s.x.w.u.s.q.o.m.n.D.B.o.v#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z.w.t.s.v.t.r.x#h.6.u.o.i.k.j.l.r.u.v.v.u.p.l.j.k.k.l.n.q.w#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z.x.u.s.r.q.F#g#s.R.l.o.p.s.u.v.t.r.v.u.q.m.j.j.m.s.v.u.x#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z.y.u.r.r.p.B.0#e.R.F.r.s.w.y.x.u.s.v.u.p.i.g.k.r.r.q.v#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z.y.v.s.s.r.n.n.q.q.p.o.o.t.y.y.x.w.w.s.m.e.g.o.v.q.m.w#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z.y.w.u.v.w.w.v.L.r.o.j.f.n.x.x#z#z.x.p.h.g.n.v.v.u.u.y#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z.y.y.y#z#z#z.x.u.q.k.e.k.u.v.y.y.w.p.k.n.u#z.x.y#z#z#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z#z#z#z#z#z#z#z.x.t.o.k.n.t.v.x.x.w.t.r.w#z#z#z#z#z#z#z#z#z#z#z#z#z.w.d.m#z", +"#z.m.d.w#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.u.p.o.u.y#z#z#z#z.y.y#z#z#z#z#z#z#z#z#z#z#z#z#z#z.w.d.m#z", +"#z.l.d.y#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.x.y#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z.y.d.l#z", +"#z.m.c.t.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.x.x.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.t.c.m#z", +"#z.m...c.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.c...m#z", +"#z.u.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.u#z", +"#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z#z" +}; diff --git a/init.cpp b/init.cpp new file mode 100644 index 0000000..27bdfd0 --- /dev/null +++ b/init.cpp @@ -0,0 +1,1263 @@ + +#define library(X) (X) + +#ifdef COMPUTE_VELTABLE +#include +#endif +#include +#include + +#include "Maelstrom_Globals.h" +#include "load.h" +#include "colortable.h" +#include "fastrand.h" + + +// Global variables set in this file... +Sound *sound = NULL; +FontServ *fontserv = NULL; +FrameBuf *screen = NULL; + +Sint32 gLastHigh; +Uint32 gLastDrawn; +int gNumSprites; +Rect gScrnRect; +SDL_Rect gClipRect; +int gStatusLine; +int gTop, gLeft, gBottom, gRight; +MPoint gShotOrigins[SHIP_FRAMES]; +MPoint gThrustOrigins[SHIP_FRAMES]; +MPoint gVelocityTable[SHIP_FRAMES]; +StarPtr gTheStars[MAX_STARS]; +Uint32 gStarColors[20]; + +/* -- The blit'ers we use */ +BlitPtr gRock1R, gRock2R, gRock3R, gDamagedShip; +BlitPtr gRock1L, gRock2L, gRock3L, gShipExplosion; +BlitPtr gPlayerShip, gExplosion, gNova, gEnemyShip, gEnemyShip2; +BlitPtr gMult[4], gSteelRoidL; +BlitPtr gSteelRoidR, gPrize, gBonusBlit, gPointBlit; +BlitPtr gVortexBlit, gMineBlitL, gMineBlitR, gShieldBlit; +BlitPtr gThrust1, gThrust2, gShrapnel1, gShrapnel2; + +/* -- The prize CICN's */ + +SDL_Surface *gAutoFireIcon, *gAirBrakesIcon, *gMult2Icon, *gMult3Icon; +SDL_Surface *gMult4Icon, *gMult5Icon, *gLuckOfTheIrishIcon, *gLongFireIcon; +SDL_Surface *gTripleFireIcon, *gKeyIcon, *gShieldIcon; + +// Local functions used in this file. +static void DrawLoadBar(int first); +static int InitSprites(void); +static int LoadBlits(Mac_Resource *spriteres); +static int LoadCICNS(void); +static void BackwardsSprite(BlitPtr *theBlit, BlitPtr oldBlit); +static int LoadSprite(Mac_Resource *spriteres, + BlitPtr *theBlit, int baseID, int numFrames); +static int LoadSmallSprite(Mac_Resource *spriteres, + BlitPtr *theBlit, int baseID, int numFrames); + + +/* Put up an Ambrosia Software splash screen */ +void DoSplash(void) +{ + SDL_Surface *splash; + + splash = Load_Title(screen, 999); + if ( splash == NULL ) { + error("Can't load Ambrosia splash title! (ID=%d)\n", 999); + return; + } + screen->QueueBlit(SCREEN_WIDTH/2-splash->w/2, + SCREEN_HEIGHT/2-splash->h/2, splash, NOCLIP); + screen->Update(); + screen->FreeImage(splash); +} + +/* ----------------------------------------------------------------- */ +/* -- Put up our intro splash screen */ + +void DoIntroScreen(void) +{ + MFont *geneva; + SDL_Surface *intro, *text; + Uint16 Yoff, Xoff; + Uint32 clr, ltClr, ltrClr; + + intro = Load_Title(screen, 130); + if ( intro == NULL ) { + error("Can't load intro title! (ID=%d)\n", 130); + return; + } + + // -- Draw a border + clr = screen->MapRGB(30000>>8, 30000>>8, 0xFF); + ltClr = screen->MapRGB(40000>>8, 40000>>8, 0xFF); + ltrClr = screen->MapRGB(50000>>8, 50000>>8, 0xFF); + + screen->Clear(); + Xoff = (SCREEN_WIDTH-intro->w)/2; + Yoff = (SCREEN_HEIGHT-intro->h)/2; + screen->DrawRect(Xoff-1, Yoff-1, intro->w+2, intro->h+2, clr); + screen->DrawRect(Xoff-2, Yoff-2, intro->w+4, intro->h+4, clr); + screen->DrawRect(Xoff-3, Yoff-3, intro->w+6, intro->h+6, ltClr); + screen->DrawRect(Xoff-4, Yoff-4, intro->w+8, intro->h+8, ltClr); + screen->DrawRect(Xoff-5, Yoff-5, intro->w+10, intro->h+10, ltrClr); + screen->DrawRect(Xoff-6, Yoff-6, intro->w+12, intro->h+12, ltClr); + screen->DrawRect(Xoff-7, Yoff-7, intro->w+14, intro->h+14, clr); + Yoff += intro->h; + screen->QueueBlit(SCREEN_WIDTH/2-intro->w/2, SCREEN_HEIGHT/2-intro->h/2, + intro, NOCLIP); + screen->FreeImage(intro); + +/* -- Draw the loading message */ + + geneva = fontserv->NewFont("Geneva", 9); + if ( geneva == NULL ) { + error("Warning: %s\n", fontserv->Error()); + return; + } + text = fontserv->TextImage("Loading...", geneva, STYLE_BOLD, + 0xFF, 0xFF, 0x00); + if ( text ) { + screen->QueueBlit(SCREEN_WIDTH/2-text->w/2, + Yoff+20-text->h/2, text, NOCLIP); + fontserv->FreeText(text); + } + delete geneva; + + screen->Update(); +} // -- DoIntroScreen + + +/* ----------------------------------------------------------------- */ +/* -- Draw a loading status bar */ + +#define MAX_BAR 26 + +static void DrawLoadBar(int first) +{ + static int stage; + Uint32 black, clr; + int fact; + + DropEvents(); + if (first) { + stage = 1; + + black = screen->MapRGB(0x00, 0x00, 0x00); + screen->DrawRect((SCREEN_WIDTH-200)/2, + ((SCREEN_HEIGHT-10)/2)+185, 200, 10, black); + clr = screen->MapRGB(0xFF, 0xFF, 0xFF); + screen->DrawRect(((SCREEN_WIDTH-200)/2)+1, + ((SCREEN_HEIGHT-10)/2)+185+1, + 200-2, 10-2, clr); + clr = screen->MapRGB(0x8F, 0x8F, 0xFF); + screen->FillRect(((SCREEN_WIDTH-200)/2)+1+1, + ((SCREEN_HEIGHT-10)/2)+185+1+1, + 200-2-2, 10-2-2, clr); + } + clr = screen->MapRGB(0x6F, 0x6F, 0xFF); + fact = ((200-2-2) * stage) / MAX_BAR; + screen->FillRect(((SCREEN_WIDTH-200)/2)+1+1, + ((SCREEN_HEIGHT-10)/2)+185+1+1, fact, 10-2-2, clr); + screen->Update(); + stage++; +} /* -- DrawLoadBar */ + + +/* ----------------------------------------------------------------- */ +/* -- Set a star */ + +void SetStar(int which) +{ + gTheStars[which]->xCoord = gClipRect.x+FastRandom(gClipRect.w); + gTheStars[which]->yCoord = gClipRect.y+FastRandom(gClipRect.h); + gTheStars[which]->color = gStarColors[FastRandom(20)]; +} /* -- SetStar */ + +/* ----------------------------------------------------------------- */ +/* -- Initialize the stars */ + +static void InitStars(void) +{ + int index; + + /* Map star pixel colors to new colormap */ + gStarColors[0] = screen->MapRGB(colors[gGammaCorrect][0xEB].r, + colors[gGammaCorrect][0xEB].g, + colors[gGammaCorrect][0xEB].b); + gStarColors[1] = screen->MapRGB(colors[gGammaCorrect][0xEC].r, + colors[gGammaCorrect][0xEC].g, + colors[gGammaCorrect][0xEC].b); + gStarColors[2] = screen->MapRGB(colors[gGammaCorrect][0xED].r, + colors[gGammaCorrect][0xED].g, + colors[gGammaCorrect][0xED].b); + gStarColors[3] = screen->MapRGB(colors[gGammaCorrect][0xEE].r, + colors[gGammaCorrect][0xEE].g, + colors[gGammaCorrect][0xEE].b); + gStarColors[4] = screen->MapRGB(colors[gGammaCorrect][0xEF].r, + colors[gGammaCorrect][0xEF].g, + colors[gGammaCorrect][0xEF].b); + gStarColors[5] = screen->MapRGB(colors[gGammaCorrect][0xD9].r, + colors[gGammaCorrect][0xD9].g, + colors[gGammaCorrect][0xD9].b); + gStarColors[6] = screen->MapRGB(colors[gGammaCorrect][0xDA].r, + colors[gGammaCorrect][0xDA].g, + colors[gGammaCorrect][0xDA].b); + gStarColors[7] = screen->MapRGB(colors[gGammaCorrect][0xDB].r, + colors[gGammaCorrect][0xDB].g, + colors[gGammaCorrect][0xDB].b); + gStarColors[8] = screen->MapRGB(colors[gGammaCorrect][0xDC].r, + colors[gGammaCorrect][0xDC].g, + colors[gGammaCorrect][0xDC].b); + gStarColors[9] = screen->MapRGB(colors[gGammaCorrect][0xDD].r, + colors[gGammaCorrect][0xDD].g, + colors[gGammaCorrect][0xDD].b); + gStarColors[10] = screen->MapRGB(colors[gGammaCorrect][0xE4].r, + colors[gGammaCorrect][0xE4].g, + colors[gGammaCorrect][0xE4].b); + gStarColors[11] = screen->MapRGB(colors[gGammaCorrect][0xE5].r, + colors[gGammaCorrect][0xE5].g, + colors[gGammaCorrect][0xE5].b); + gStarColors[12] = screen->MapRGB(colors[gGammaCorrect][0xE6].r, + colors[gGammaCorrect][0xE6].g, + colors[gGammaCorrect][0xE6].b); + gStarColors[13] = screen->MapRGB(colors[gGammaCorrect][0xE7].r, + colors[gGammaCorrect][0xE7].g, + colors[gGammaCorrect][0xE7].b); + gStarColors[14] = screen->MapRGB(colors[gGammaCorrect][0xE8].r, + colors[gGammaCorrect][0xE8].g, + colors[gGammaCorrect][0xE8].b); + gStarColors[15] = screen->MapRGB(colors[gGammaCorrect][0xF7].r, + colors[gGammaCorrect][0xF7].g, + colors[gGammaCorrect][0xF7].b); + gStarColors[16] = screen->MapRGB(colors[gGammaCorrect][0xF8].r, + colors[gGammaCorrect][0xF8].g, + colors[gGammaCorrect][0xF8].b); + gStarColors[17] = screen->MapRGB(colors[gGammaCorrect][0xF9].r, + colors[gGammaCorrect][0xF9].g, + colors[gGammaCorrect][0xF9].b); + gStarColors[18] = screen->MapRGB(colors[gGammaCorrect][0xFA].r, + colors[gGammaCorrect][0xFA].g, + colors[gGammaCorrect][0xFA].b); + gStarColors[19] = screen->MapRGB(colors[gGammaCorrect][0xFB].r, + colors[gGammaCorrect][0xFB].g, + colors[gGammaCorrect][0xFB].b); + + for (index = 0; index < MAX_STARS; index++) { + gTheStars[index] = new Star; + gTheStars[index]->color = 0L; + SetStar(index); + } +} /* -- InitStars */ + + +/* ----------------------------------------------------------------- */ +/* -- Build the ship's velocity table */ + +static void InitShots(void) +{ + int xx = 30; + + /* Load the shot images */ + gPlayerShot = screen->LoadImage(SHOT_SIZE,SHOT_SIZE,gPlayerShotColors); + gEnemyShot = screen->LoadImage(SHOT_SIZE, SHOT_SIZE, gEnemyShotColors); + + /* Now setup the shot origin table */ + + gShotOrigins[0].h = 15 * SCALE_FACTOR; + gShotOrigins[0].v = 12 * SCALE_FACTOR; + + gShotOrigins[1].h = 16 * SCALE_FACTOR; + gShotOrigins[1].v = 12 * SCALE_FACTOR; + + gShotOrigins[2].h = 18 * SCALE_FACTOR; + gShotOrigins[2].v = 12 * SCALE_FACTOR; + + gShotOrigins[3].h = 21 * SCALE_FACTOR; + gShotOrigins[3].v = 12 * SCALE_FACTOR; + + gShotOrigins[4].h = xx * SCALE_FACTOR; + gShotOrigins[4].v = xx * SCALE_FACTOR; + + gShotOrigins[5].h = xx * SCALE_FACTOR; + gShotOrigins[5].v = xx * SCALE_FACTOR; + + gShotOrigins[6].h = xx * SCALE_FACTOR; + gShotOrigins[6].v = xx * SCALE_FACTOR; + + gShotOrigins[7].h = xx * SCALE_FACTOR; + gShotOrigins[7].v = xx * SCALE_FACTOR; + + gShotOrigins[8].h = xx * SCALE_FACTOR; + gShotOrigins[8].v = xx * SCALE_FACTOR; + + gShotOrigins[9].h = xx * SCALE_FACTOR; + gShotOrigins[9].v = xx * SCALE_FACTOR; + + gShotOrigins[10].h = xx * SCALE_FACTOR; + gShotOrigins[10].v = xx * SCALE_FACTOR; + + gShotOrigins[11].h = xx * SCALE_FACTOR; + gShotOrigins[11].v = xx * SCALE_FACTOR; + + gShotOrigins[12].h = xx * SCALE_FACTOR; + gShotOrigins[12].v = xx * SCALE_FACTOR; + + gShotOrigins[13].h = xx * SCALE_FACTOR; + gShotOrigins[13].v = xx * SCALE_FACTOR; + + gShotOrigins[14].h = xx * SCALE_FACTOR; + gShotOrigins[14].v = xx * SCALE_FACTOR; + + gShotOrigins[15].h = xx * SCALE_FACTOR; + gShotOrigins[15].v = xx * SCALE_FACTOR; + + gShotOrigins[16].h = xx * SCALE_FACTOR; + gShotOrigins[16].v = xx * SCALE_FACTOR; + + gShotOrigins[17].h = xx * SCALE_FACTOR; + gShotOrigins[17].v = xx * SCALE_FACTOR; + + gShotOrigins[18].h = xx * SCALE_FACTOR; + gShotOrigins[18].v = xx * SCALE_FACTOR; + + gShotOrigins[19].h = xx * SCALE_FACTOR; + gShotOrigins[19].v = xx * SCALE_FACTOR; + + gShotOrigins[20].h = xx * SCALE_FACTOR; + gShotOrigins[20].v = xx * SCALE_FACTOR; + + gShotOrigins[21].h = xx * SCALE_FACTOR; + gShotOrigins[21].v = xx * SCALE_FACTOR; + + gShotOrigins[22].h = xx * SCALE_FACTOR; + gShotOrigins[22].v = xx * SCALE_FACTOR; + + gShotOrigins[23].h = xx * SCALE_FACTOR; + gShotOrigins[23].v = xx * SCALE_FACTOR; + + gShotOrigins[24].h = xx * SCALE_FACTOR; + gShotOrigins[24].v = xx * SCALE_FACTOR; + + gShotOrigins[25].h = xx * SCALE_FACTOR; + gShotOrigins[25].v = xx * SCALE_FACTOR; + + gShotOrigins[26].h = xx * SCALE_FACTOR; + gShotOrigins[26].v = xx * SCALE_FACTOR; + + gShotOrigins[27].h = xx * SCALE_FACTOR; + gShotOrigins[27].v = xx * SCALE_FACTOR; + + gShotOrigins[28].h = xx * SCALE_FACTOR; + gShotOrigins[28].v = xx * SCALE_FACTOR; + + gShotOrigins[29].h = xx * SCALE_FACTOR; + gShotOrigins[29].v = xx * SCALE_FACTOR; + + gShotOrigins[30].h = xx * SCALE_FACTOR; + gShotOrigins[30].v = xx * SCALE_FACTOR; + + gShotOrigins[31].h = xx * SCALE_FACTOR; + gShotOrigins[31].v = xx * SCALE_FACTOR; + + gShotOrigins[32].h = xx * SCALE_FACTOR; + gShotOrigins[32].v = xx * SCALE_FACTOR; + + gShotOrigins[33].h = xx * SCALE_FACTOR; + gShotOrigins[33].v = xx * SCALE_FACTOR; + + gShotOrigins[34].h = xx * SCALE_FACTOR; + gShotOrigins[34].v = xx * SCALE_FACTOR; + + gShotOrigins[35].h = xx * SCALE_FACTOR; + gShotOrigins[35].v = xx * SCALE_FACTOR; + + gShotOrigins[36].h = xx * SCALE_FACTOR; + gShotOrigins[36].v = xx * SCALE_FACTOR; + + gShotOrigins[37].h = xx * SCALE_FACTOR; + gShotOrigins[37].v = xx * SCALE_FACTOR; + + gShotOrigins[38].h = xx * SCALE_FACTOR; + gShotOrigins[38].v = xx * SCALE_FACTOR; + + gShotOrigins[39].h = xx * SCALE_FACTOR; + gShotOrigins[39].v = xx * SCALE_FACTOR; + + gShotOrigins[40].h = xx * SCALE_FACTOR; + gShotOrigins[40].v = xx * SCALE_FACTOR; + + gShotOrigins[41].h = xx * SCALE_FACTOR; + gShotOrigins[41].v = xx * SCALE_FACTOR; + + gShotOrigins[42].h = xx * SCALE_FACTOR; + gShotOrigins[42].v = xx * SCALE_FACTOR; + + gShotOrigins[43].h = xx * SCALE_FACTOR; + gShotOrigins[43].v = xx * SCALE_FACTOR; + + gShotOrigins[44].h = xx * SCALE_FACTOR; + gShotOrigins[44].v = xx * SCALE_FACTOR; + + gShotOrigins[45].h = xx * SCALE_FACTOR; + gShotOrigins[45].v = xx * SCALE_FACTOR; + + gShotOrigins[46].h = xx * SCALE_FACTOR; + gShotOrigins[46].v = xx * SCALE_FACTOR; + + gShotOrigins[47].h = xx * SCALE_FACTOR; + gShotOrigins[47].v = xx * SCALE_FACTOR; + +/* -- Now setup the thruster origin table */ + + gThrustOrigins[0].h = 8 * SCALE_FACTOR; + gThrustOrigins[0].v = 22 * SCALE_FACTOR; + + gThrustOrigins[1].h = 6 * SCALE_FACTOR; + gThrustOrigins[1].v = 22 * SCALE_FACTOR; + + gThrustOrigins[2].h = 4 * SCALE_FACTOR; + gThrustOrigins[2].v = 21 * SCALE_FACTOR; + + gThrustOrigins[3].h = 1 * SCALE_FACTOR; + gThrustOrigins[3].v = 20 * SCALE_FACTOR; + + gThrustOrigins[4].h = 0 * SCALE_FACTOR; + gThrustOrigins[4].v = 19 * SCALE_FACTOR; + + gThrustOrigins[5].h = -1 * SCALE_FACTOR; + gThrustOrigins[5].v = 19 * SCALE_FACTOR; + + gThrustOrigins[6].h = -3 * SCALE_FACTOR; + gThrustOrigins[6].v = 16 * SCALE_FACTOR; + + gThrustOrigins[7].h = -5 * SCALE_FACTOR; + gThrustOrigins[7].v = 15 * SCALE_FACTOR; + + gThrustOrigins[8].h = -6 * SCALE_FACTOR; + gThrustOrigins[8].v = 13 * SCALE_FACTOR; + + gThrustOrigins[9].h = -9 * SCALE_FACTOR; + gThrustOrigins[9].v = 11 * SCALE_FACTOR; + + gThrustOrigins[10].h = -10 * SCALE_FACTOR; + gThrustOrigins[10].v = 10 * SCALE_FACTOR; + + gThrustOrigins[11].h = -11 * SCALE_FACTOR; + gThrustOrigins[11].v = 7 * SCALE_FACTOR; + + gThrustOrigins[12].h = -9 * SCALE_FACTOR; + gThrustOrigins[12].v = 7 * SCALE_FACTOR; + + gThrustOrigins[13].h = -9 * SCALE_FACTOR; + gThrustOrigins[13].v = 4 * SCALE_FACTOR; + + gThrustOrigins[14].h = -7 * SCALE_FACTOR; + gThrustOrigins[14].v = 2 * SCALE_FACTOR; + + gThrustOrigins[15].h = -6 * SCALE_FACTOR; + gThrustOrigins[15].v = 0 * SCALE_FACTOR; + + gThrustOrigins[16].h = -9 * SCALE_FACTOR; + gThrustOrigins[16].v = 1 * SCALE_FACTOR; + + gThrustOrigins[17].h = -3 * SCALE_FACTOR; + gThrustOrigins[17].v = -3 * SCALE_FACTOR; + + gThrustOrigins[18].h = -1 * SCALE_FACTOR; + gThrustOrigins[18].v = -2 * SCALE_FACTOR; + + gThrustOrigins[19].h = 0 * SCALE_FACTOR; + gThrustOrigins[19].v = -4 * SCALE_FACTOR; + + gThrustOrigins[20].h = 4 * SCALE_FACTOR; + gThrustOrigins[20].v = -6 * SCALE_FACTOR; + + gThrustOrigins[21].h = 5 * SCALE_FACTOR; + gThrustOrigins[21].v = -8 * SCALE_FACTOR; + + gThrustOrigins[22].h = 5 * SCALE_FACTOR; + gThrustOrigins[22].v = -6 * SCALE_FACTOR; + + gThrustOrigins[23].h = 8 * SCALE_FACTOR; + gThrustOrigins[23].v = -7 * SCALE_FACTOR; + + gThrustOrigins[24].h = 9 * SCALE_FACTOR; + gThrustOrigins[24].v = -7 * SCALE_FACTOR; + + gThrustOrigins[25].h = 12 * SCALE_FACTOR; + gThrustOrigins[25].v = -6 * SCALE_FACTOR; + + gThrustOrigins[26].h = 13 * SCALE_FACTOR; + gThrustOrigins[26].v = -6 * SCALE_FACTOR; + + gThrustOrigins[27].h = 15 * SCALE_FACTOR; + gThrustOrigins[27].v = -7 * SCALE_FACTOR; + + gThrustOrigins[28].h = 17 * SCALE_FACTOR; + gThrustOrigins[28].v = -6 * SCALE_FACTOR; + + gThrustOrigins[29].h = 18 * SCALE_FACTOR; + gThrustOrigins[29].v = -4 * SCALE_FACTOR; + + gThrustOrigins[30].h = 20 * SCALE_FACTOR; + gThrustOrigins[30].v = -2 * SCALE_FACTOR; + + gThrustOrigins[31].h = 19 * SCALE_FACTOR; + gThrustOrigins[31].v = -1 * SCALE_FACTOR; + + gThrustOrigins[32].h = 21 * SCALE_FACTOR; + gThrustOrigins[32].v = 0 * SCALE_FACTOR; + + gThrustOrigins[33].h = 22 * SCALE_FACTOR; + gThrustOrigins[33].v = 2 * SCALE_FACTOR; + + gThrustOrigins[34].h = 24 * SCALE_FACTOR; + gThrustOrigins[34].v = 3 * SCALE_FACTOR; + + gThrustOrigins[35].h = 25 * SCALE_FACTOR; + gThrustOrigins[35].v = 5 * SCALE_FACTOR; + + gThrustOrigins[36].h = 26 * SCALE_FACTOR; + gThrustOrigins[36].v = 7 * SCALE_FACTOR; + + gThrustOrigins[37].h = 25 * SCALE_FACTOR; + gThrustOrigins[37].v = 7 * SCALE_FACTOR; + + gThrustOrigins[38].h = 24 * SCALE_FACTOR; + gThrustOrigins[38].v = 10 * SCALE_FACTOR; + + gThrustOrigins[39].h = 23 * SCALE_FACTOR; + gThrustOrigins[39].v = 11 * SCALE_FACTOR; + + gThrustOrigins[40].h = 23 * SCALE_FACTOR; + gThrustOrigins[40].v = 12 * SCALE_FACTOR; + + gThrustOrigins[41].h = 20 * SCALE_FACTOR; + gThrustOrigins[41].v = 14 * SCALE_FACTOR; + + gThrustOrigins[42].h = 20 * SCALE_FACTOR; + gThrustOrigins[42].v = 16 * SCALE_FACTOR; + + gThrustOrigins[43].h = 18 * SCALE_FACTOR; + gThrustOrigins[43].v = 18 * SCALE_FACTOR; + + gThrustOrigins[44].h = 15 * SCALE_FACTOR; + gThrustOrigins[44].v = 18 * SCALE_FACTOR; + + gThrustOrigins[45].h = 15 * SCALE_FACTOR; + gThrustOrigins[45].v = 20 * SCALE_FACTOR; + + gThrustOrigins[46].h = 12 * SCALE_FACTOR; + gThrustOrigins[46].v = 21 * SCALE_FACTOR; + + gThrustOrigins[47].h = 9 * SCALE_FACTOR; + gThrustOrigins[47].v = 22 * SCALE_FACTOR; + +} /* -- InitShots */ + + +/* ----------------------------------------------------------------- */ +/* -- Build the ship's velocity table */ + +static void BuildVelocityTable(void) +{ +#ifdef COMPUTE_VELTABLE + /* Calculate the appropriate values */ + int index; + double factor; + double ss; + + ss = SHIP_FRAMES; + factor = (360.0 / ss); + + for (index = 0; index < SHIP_FRAMES; index++) { + ss = index; + ss = -(((ss * factor) * PI) / 180.0); + gVelocityTable[index].h = (int)(sin(ss) * -8.0); + gVelocityTable[index].v = (int)(cos(ss) * -8.0); +#ifdef PRINT_TABLE + printf("\tgVelocityTable[%d].h = %d;\n", index, + gVelocityTable[index].h); + printf("\tgVelocityTable[%d].v = %d;\n", index, + gVelocityTable[index].v); +#endif + } +#else + /* Because PI, sin() and cos() return _slightly_ different + values across architectures, we need to precompute our + velocity table -- make it standard across compilations. :) + */ + gVelocityTable[0].h = 0; + gVelocityTable[0].v = -8; + gVelocityTable[1].h = 1; + gVelocityTable[1].v = -7; + gVelocityTable[2].h = 2; + gVelocityTable[2].v = -7; + gVelocityTable[3].h = 3; + gVelocityTable[3].v = -7; + gVelocityTable[4].h = 4; + gVelocityTable[4].v = -6; + gVelocityTable[5].h = 4; + gVelocityTable[5].v = -6; + gVelocityTable[6].h = 5; + gVelocityTable[6].v = -5; + gVelocityTable[7].h = 6; + gVelocityTable[7].v = -4; + gVelocityTable[8].h = 6; + gVelocityTable[8].v = -4; + gVelocityTable[9].h = 7; + gVelocityTable[9].v = -3; + gVelocityTable[10].h = 7; + gVelocityTable[10].v = -2; + gVelocityTable[11].h = 7; + gVelocityTable[11].v = -1; + gVelocityTable[12].h = 8; + gVelocityTable[12].v = 0; + gVelocityTable[13].h = 7; + gVelocityTable[13].v = 1; + gVelocityTable[14].h = 7; + gVelocityTable[14].v = 2; + gVelocityTable[15].h = 7; + gVelocityTable[15].v = 3; + gVelocityTable[16].h = 6; + gVelocityTable[16].v = 3; + gVelocityTable[17].h = 6; + gVelocityTable[17].v = 4; + gVelocityTable[18].h = 5; + gVelocityTable[18].v = 5; + gVelocityTable[19].h = 4; + gVelocityTable[19].v = 6; + gVelocityTable[20].h = 3; + gVelocityTable[20].v = 6; + gVelocityTable[21].h = 3; + gVelocityTable[21].v = 7; + gVelocityTable[22].h = 2; + gVelocityTable[22].v = 7; + gVelocityTable[23].h = 1; + gVelocityTable[23].v = 7; + gVelocityTable[24].h = 0; + gVelocityTable[24].v = 8; + gVelocityTable[25].h = -1; + gVelocityTable[25].v = 7; + gVelocityTable[26].h = -2; + gVelocityTable[26].v = 7; + gVelocityTable[27].h = -3; + gVelocityTable[27].v = 7; + gVelocityTable[28].h = -4; + gVelocityTable[28].v = 6; + gVelocityTable[29].h = -4; + gVelocityTable[29].v = 6; + gVelocityTable[30].h = -5; + gVelocityTable[30].v = 5; + gVelocityTable[31].h = -6; + gVelocityTable[31].v = 4; + gVelocityTable[32].h = -6; + gVelocityTable[32].v = 4; + gVelocityTable[33].h = -7; + gVelocityTable[33].v = 3; + gVelocityTable[34].h = -7; + gVelocityTable[34].v = 2; + gVelocityTable[35].h = -7; + gVelocityTable[35].v = 1; + gVelocityTable[36].h = -8; + gVelocityTable[36].v = 0; + gVelocityTable[37].h = -7; + gVelocityTable[37].v = -1; + gVelocityTable[38].h = -7; + gVelocityTable[38].v = -2; + gVelocityTable[39].h = -7; + gVelocityTable[39].v = -3; + gVelocityTable[40].h = -6; + gVelocityTable[40].v = -4; + gVelocityTable[41].h = -6; + gVelocityTable[41].v = -4; + gVelocityTable[42].h = -5; + gVelocityTable[42].v = -5; + gVelocityTable[43].h = -4; + gVelocityTable[43].v = -6; + gVelocityTable[44].h = -4; + gVelocityTable[44].v = -6; + gVelocityTable[45].h = -3; + gVelocityTable[45].v = -7; + gVelocityTable[46].h = -2; + gVelocityTable[46].v = -7; + gVelocityTable[47].h = -1; + gVelocityTable[47].v = -7; +#endif /* COMPUTE_VELTABLE */ +} /* -- BuildVelocityTable */ + + +/* This function needs to be able to properly clean up from any stage + of the program at any time, including itself if interrupted during + cleanup. *sigh* reentrant multi-threading can be a pain. :) +*/ +extern "C" void CleanUp(void) +{ + HaltLogic(); + if ( fontserv ) { + delete fontserv; + fontserv = NULL; + } + if ( sound ) { + delete sound; + sound = NULL; + } + if ( screen ) { + delete screen; + screen = NULL; + } + SaveControls(); + SDL_Quit(); +} + +/* ----------------------------------------------------------------- */ +/* -- Perform some initializations and report failure if we choke */ +int DoInitializations(Uint32 video_flags) +{ + LibPath library; + int i; + SDL_Surface *icon; + + /* Make sure we clean up properly at exit */ + Uint32 init_flags = (SDL_INIT_VIDEO|SDL_INIT_AUDIO); +#ifdef SDL_INIT_JOYSTICK + init_flags |= SDL_INIT_JOYSTICK; +#endif + if ( SDL_Init(init_flags) < 0 ) { + init_flags &= ~SDL_INIT_JOYSTICK; + if ( SDL_Init(init_flags) < 0 ) { + error("Couldn't initialize SDL: %s\n", SDL_GetError()); + return(-1); + } + } + atexit(CleanUp); + signal(SIGSEGV, exit); + + // -- Initialize some variables + gLastHigh = -1; + + // -- Create our scores file + LoadScores(); + +#ifdef SDL_INIT_JOYSTICK + /* Initialize the first joystick */ + if ( SDL_NumJoysticks() > 0 ) { + if ( SDL_JoystickOpen(0) == NULL ) { + error("Warning: Couldn't open joystick '%s' : %s\n", + SDL_JoystickName(0), SDL_GetError()); + } + } +#endif + + /* Load the Font Server */ + fontserv = new FontServ(library.Path("Maelstrom Fonts")); + if ( fontserv->Error() ) { + error("Fatal: %s\n", fontserv->Error()); + return(-1); + } + + /* Load the Sound Server and initialize sound */ + sound = new Sound(library.Path("Maelstrom Sounds"), gSoundLevel); + if ( sound->Error() ) { + error("Fatal: %s\n", sound->Error()); + return(-1); + } + + /* Load the Maelstrom icon */ + icon = SDL_LoadBMP(library.Path("icon.bmp")); + if ( icon == NULL ) { + error("Fatal: Couldn't load icon: %s\n", SDL_GetError()); + return(-1); + } + + /* Initialize the screen */ + screen = new FrameBuf; + if (screen->Init(SCREEN_WIDTH, SCREEN_HEIGHT, video_flags, + colors[gGammaCorrect], icon) < 0){ + error("Fatal: %s\n", screen->Error()); + return(-1); + } + screen->SetCaption("Maelstrom"); + atexit(CleanUp); // Need to reset this under X11 DGA + SDL_FreeSurface(icon); + + /* -- We want to access the FULL screen! */ + SetRect(&gScrnRect, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + gStatusLine = (gScrnRect.bottom - gScrnRect.top - STATUS_HEIGHT); + gScrnRect.bottom -= STATUS_HEIGHT; + gTop = 0; + gLeft = 0; + gBottom = gScrnRect.bottom - gScrnRect.top; + gRight = gScrnRect.right - gScrnRect.left; + + gClipRect.x = gLeft+SPRITES_WIDTH; + gClipRect.y = gTop+SPRITES_WIDTH; + gClipRect.w = gRight-gLeft-2*SPRITES_WIDTH; + gClipRect.h = gBottom-gTop-2*SPRITES_WIDTH+STATUS_HEIGHT; + screen->ClipBlit(&gClipRect); + + /* Do the Ambrosia Splash screen */ + screen->Clear(); + screen->Update(); + screen->Fade(); + DoSplash(); + screen->Fade(); + for ( i=0; i<5; ++i ) { + if ( DropEvents() ) { + break; + } + Delay(60); + } + + /* -- Throw up our intro screen */ + screen->Fade(); + DoIntroScreen(); + sound->PlaySound(gPrizeAppears, 1); + screen->Fade(); + + /* -- Load in our sprites and other needed resources */ + { + Mac_Resource spriteres(library.Path("Maelstrom Sprites")); + + if ( spriteres.Error() ) { + error("%s\n", spriteres.Error()); + return(-1); + } + if ( LoadBlits(&spriteres) < 0 ) { + return(-1); + } + } + + /* -- Create the shots array */ + InitShots(); + + /* -- Initialize the sprite manager - after we load blits and shots! */ + if ( InitSprites() < 0 ) + return(-1); + + /* -- Load in the prize CICN's */ + if ( LoadCICNS() < 0 ) + return(-1); + + /* -- Create the stars array */ + InitStars(); + + /* -- Set up the velocity tables */ + BuildVelocityTable(); + + return(0); +} /* -- DoInitializations */ + + +/* ----------------------------------------------------------------- */ +/* -- Load in the blits */ + +static int LoadBlits(Mac_Resource *spriteres) +{ + + DrawLoadBar(1); + +/* -- Load in the thrusters */ + + if ( LoadSmallSprite(spriteres, &gThrust1, 400, SHIP_FRAMES) < 0 ) + return(-1); + DrawLoadBar(0); + + if ( LoadSmallSprite(spriteres, &gThrust2, 500, SHIP_FRAMES) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the player's ship */ + + if ( LoadSprite(spriteres, &gPlayerShip, 200, SHIP_FRAMES) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the large rock */ + + if ( LoadSprite(spriteres, &gRock1R, 500, 60) < 0 ) + return(-1); + BackwardsSprite(&gRock1L, gRock1R); + DrawLoadBar(0); + +/* -- Load in the medium rock */ + + if ( LoadSprite(spriteres, &gRock2R, 400, 40) < 0 ) + return(-1); + BackwardsSprite(&gRock2L, gRock2R); + DrawLoadBar(0); + +/* -- Load in the small rock */ + + if ( LoadSmallSprite(spriteres, &gRock3R, 300, 20) < 0 ) + return(-1); + BackwardsSprite(&gRock3L, gRock3R); + DrawLoadBar(0); + +/* -- Load in the explosion */ + + if ( LoadSprite(spriteres, &gExplosion, 600, 12) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the 2x multiplier */ + + if ( LoadSprite(spriteres, &gMult[0], 2000, 1) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the 3x multiplier */ + + if ( LoadSprite(spriteres, &gMult[1], 2002, 1) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the 4x multiplier */ + + if ( LoadSprite(spriteres, &gMult[2], 2004, 1) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the 5x multiplier */ + + if ( LoadSprite(spriteres, &gMult[3], 2006, 1) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the steel asteroid */ + + if ( LoadSprite(spriteres, &gSteelRoidL, 700, 40) < 0 ) + return(-1); + BackwardsSprite(&gSteelRoidR, gSteelRoidL); + DrawLoadBar(0); + +/* -- Load in the prize */ + + if ( LoadSprite(spriteres, &gPrize, 800, 30) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the bonus */ + + if ( LoadSprite(spriteres, &gBonusBlit, 900, 10) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the bonus */ + + if ( LoadSprite(spriteres, &gPointBlit, 1000, 6) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the vortex */ + + if ( LoadSprite(spriteres, &gVortexBlit, 1100, 10) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the homing mine */ + + if ( LoadSprite(spriteres, &gMineBlitR, 1200, 40) < 0 ) + return(-1); + BackwardsSprite(&gMineBlitL, gMineBlitR); + DrawLoadBar(0); + +/* -- Load in the shield */ + + if ( LoadSprite(spriteres, &gShieldBlit, 1300, 2) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the nova */ + + if ( LoadSprite(spriteres, &gNova, 1400, 18) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the ship explosion */ + + if ( LoadSprite(spriteres, &gShipExplosion, 1500, 21) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the shrapnel */ + + if ( LoadSprite(spriteres, &gShrapnel1, 1800, 50) < 0 ) + return(-1); + DrawLoadBar(0); + + if ( LoadSprite(spriteres, &gShrapnel2, 1900, 42) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the damaged ship */ + + if ( LoadSprite(spriteres, &gDamagedShip, 1600, 10) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the enemy ship */ + + if ( LoadSprite(spriteres, &gEnemyShip, 1700, 40) < 0 ) + return(-1); + DrawLoadBar(0); + +/* -- Load in the enemy ship */ + + if ( LoadSprite(spriteres, &gEnemyShip2, 2100, 40) < 0 ) + return(-1); + DrawLoadBar(0); + + return(0); +} /* -- LoadBlits */ + + +/* -- Initialize our sprites */ + +int InitSprites(void) +{ + /* Initialize sprite variables */ + gNumSprites = 0; + gLastDrawn = 0L; + + /* Initialize player sprites */ + return(InitPlayerSprites()); +} /* -- InitSprites */ + + +/* ----------------------------------------------------------------- */ +/* -- Load in the sprites we use */ + +static void BackwardsSprite(BlitPtr *theBlit, BlitPtr oldBlit) +{ + BlitPtr aBlit; + int index, nFrames; + + aBlit = new Blit; + nFrames = oldBlit->numFrames; + aBlit->numFrames = nFrames; + aBlit->hitRect.left = oldBlit->hitRect.left; + aBlit->hitRect.right = oldBlit->hitRect.right; + aBlit->hitRect.top = oldBlit->hitRect.top; + aBlit->hitRect.bottom = oldBlit->hitRect.bottom; + aBlit->isSmall = oldBlit->isSmall; + + /* -- Reverse the sprite images */ + for (index = 0; index < aBlit->numFrames; index++) { + aBlit->sprite[index] = oldBlit->sprite[nFrames - index - 1]; + aBlit->mask[index] = oldBlit->mask[nFrames - index - 1]; + } + (*theBlit) = aBlit; +} /* -- BackwardsSprite */ + + +/* ----------------------------------------------------------------- */ +/* -- Load in the sprites we use */ + +static int LoadSprite(Mac_Resource *spriteres, + BlitPtr *theBlit, int baseID, int numFrames) +{ + Mac_ResData *S, *M; + int index; + BlitPtr aBlit; + Uint32 offset; + int top, left, bottom, right; + int row, col; + Uint8 *mask; + + aBlit = new Blit; + aBlit->numFrames = numFrames; + aBlit->isSmall = 0; + + left = 32; + right = 0; + top = 32; + bottom = 0; + + /* -- Load in the image data */ + for (index = 0; index < numFrames; index++) { + + M = spriteres->Resource("ICN#", baseID+index); + if ( M== NULL ) { + error( + "LoadSprite(%d+%d): Couldn't load ICN# resource!\n", baseID, index); + return(-1); + } + mask = M->data+128; + + S = spriteres->Resource("icl8", baseID+index); + if ( S == NULL ) { + error( + "LoadSprite(%d+%d): Couldn't load icl8 resource!\n", baseID, index); + return(-1); + } + + /* -- Figure out the hit rectangle */ + /* -- Do the top/left first */ + for ( row=0; row<32; ++row ) { + for ( col=0; col<32; ++col ) { + offset = (row*32)+col; + if ((mask[offset/8]>>(7-(offset%8))) & 0x01){ + if ( row < top ) + top = row; + if ( col < left ) + left = col; + } + } + } + for ( row=31; row>top; --row ) { + for ( col=31; col>left; --col ) { + offset = (row*32)+col; + if ((mask[offset/8]>>(7-(offset%8))) & 0x01){ + if ( row > bottom ) + bottom = row; + if ( col > right ) + right = col; + } + } + } + SetRect(&aBlit->hitRect, left, top, right, bottom); + + /* Load the image */ + aBlit->sprite[index] = screen->LoadImage(32, 32, S->data, mask); + if ( aBlit->sprite[index] == NULL ) { + error( + "LoadSprite(%d+%d): Couldn't convert sprite image!\n", baseID, index); + return(-1); + } + + /* Create the bytemask */ + M->length = (M->length-128)*8; + aBlit->mask[index] = new Uint8[M->length]; + for ( offset=0; offsetlength; ++offset ) { + aBlit->mask[index][offset] = + ((mask[offset/8]>>(7-(offset%8)))&0x01); + } + } + (*theBlit) = aBlit; + return(0); +} /* -- LoadSprite */ + + +/* ----------------------------------------------------------------- */ +/* -- Load in the prize CICN's */ + +static int LoadCICNS(void) +{ + if ( (gAutoFireIcon = GetCIcon(screen, 128)) == NULL ) + return(-1); + if ( (gAirBrakesIcon = GetCIcon(screen, 129)) == NULL ) + return(-1); + if ( (gMult2Icon = GetCIcon(screen, 130)) == NULL ) + return(-1); + if ( (gMult3Icon = GetCIcon(screen, 131)) == NULL ) + return(-1); + if ( (gMult4Icon = GetCIcon(screen, 132)) == NULL ) + return(-1); + if ( (gMult5Icon = GetCIcon(screen, 134)) == NULL ) + return(-1); + if ( (gLuckOfTheIrishIcon = GetCIcon(screen, 133)) == NULL ) + return(-1); + if ( (gTripleFireIcon = GetCIcon(screen, 135)) == NULL ) + return(-1); + if ( (gLongFireIcon = GetCIcon(screen, 136)) == NULL ) + return(-1); + if ( (gShieldIcon = GetCIcon(screen, 137)) == NULL ) + return(-1); + if ( (gKeyIcon = GetCIcon(screen, 100)) == NULL ) + return(-1); + return(0); +} /* -- LoadCICNS */ + + +/* ----------------------------------------------------------------- */ +/* -- Load in the sprites we use */ + +static int LoadSmallSprite(Mac_Resource *spriteres, + BlitPtr *theBlit, int baseID, int numFrames) +{ + Mac_ResData *S, *M; + int index; + BlitPtr aBlit; + Uint32 offset; + int top, left, bottom, right; + int row, col; + Uint8 *mask; + + aBlit = new Blit; + aBlit->numFrames = numFrames; + aBlit->isSmall = 1; + + left = 16; + right = 0; + top = 16; + bottom = 0; + + /* -- Load in the image data */ + + for (index = 0; index < numFrames; index++) { + + M = spriteres->Resource("ics#", baseID+index); + if ( M == NULL ) { + error( + "LoadSmallSprite(%d+%d): Couldn't load ics# resource!\n", baseID,index); + return(-1); + } + mask = M->data+32; + + S = spriteres->Resource("ics8", baseID+index); + if ( S == NULL ) { + error( + "LoadSmallSprite(%d+%d): Couldn't load ics8 resource!\n", baseID,index); + return(-1); + } + + /* -- Figure out the hit rectangle */ + /* -- Do the top/left first */ + for ( row=0; row<16; ++row ) { + for ( col=0; col<16; ++col ) { + offset = (row*16)+col; + if ((mask[offset/8]>>(7-(offset%8))) & 0x01){ + if ( row < top ) + top = row; + if ( col < left ) + left = col; + } + } + } + for ( row=15; row>top; --row ) { + for ( col=15; col>left; --col ) { + offset = (row*16)+col; + if ((mask[offset/8]>>(7-(offset%8))) & 0x01){ + if ( row > bottom ) + bottom = row; + if ( col > right ) + right = col; + } + } + } + SetRect(&aBlit->hitRect, left, top, right, bottom); + + /* Load the image */ + aBlit->sprite[index] = screen->LoadImage(16, 16, S->data, mask); + if ( aBlit->sprite[index] == NULL ) { + error( + "LoadSprite(%d+%d): Couldn't convert sprite image!\n", baseID, index); + return(-1); + } + + /* Create the bytemask */ + M->length = (M->length-32)*8; + aBlit->mask[index] = new Uint8[M->length]; + for ( offset=0; offsetlength; ++offset ) { + aBlit->mask[index][offset] = + ((mask[offset/8]>>(7-(offset%8)))&0x01); + } + } + (*theBlit) = aBlit; + return(0); +} /* -- LoadSmallSprite */ + diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..e9de238 --- /dev/null +++ b/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/load.cpp b/load.cpp new file mode 100644 index 0000000..50ab0c3 --- /dev/null +++ b/load.cpp @@ -0,0 +1,139 @@ + +#include +#include + +#include "SDL_endian.h" + +#include "load.h" +#include "myerror.h" +#include "bitesex.h" + + +/* For data loading */ +char *LibPath::exepath = NULL; + +SDL_Surface *Load_Icon(char **xpm) +{ + SDL_Surface *icon; + int width, height, num_colors, chars_per_pixel; + int index, i; + char *buf; + int b, p; + Uint8 rgb[3]; + + /* Figure out the size of the picture */ + index = 0; + if ( sscanf(xpm[index++], "%d %d %d %d", &width, &height, &num_colors, + &chars_per_pixel) != 4 ) { + SDL_SetError("Can't read XPM format"); + return(NULL); + } + + /* We only support 8-bit images, we punt here */ + if ( chars_per_pixel != 1 ) { + SDL_SetError("Can't read XPM colors"); + return(NULL); + } + + /* Allocate a surface of the appropriate type */ + icon = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 8, 0,0,0,0); + if ( icon == NULL ) { + return(NULL); + } + + /* Fill in the palette */ + for ( i=0; i= 'a') && (*buf <='f') ) { + rgb[b/2] += 10+*buf-'a'; + } else + if ( (*buf >= 'A') && (*buf <='F') ) { + rgb[b/2] += 10+*buf-'A'; + } else + if ( (*buf >= '0') && (*buf <='9') ) { + rgb[b/2] += *buf-'0'; + } + ++buf; + } + icon->format->palette->colors[p].r = rgb[0]; + icon->format->palette->colors[p].g = rgb[1]; + icon->format->palette->colors[p].b = rgb[2]; + } + + /* Fill in the pixels */ + buf = (char *)icon->pixels; + for ( i=0; ipitch; + } + return(icon); +} + +SDL_Surface *Load_Title(FrameBuf *screen, int title_id) +{ + char file[256]; + LibPath path; + SDL_Surface *bmp, *title; + + /* Open the title file -- we know its colormap is our global one */ + sprintf(file, "Images"DIR_SEP"Maelstrom_Titles#%d.bmp", title_id); + bmp = SDL_LoadBMP(path.Path(file)); + if ( bmp == NULL ) { + return(NULL); + } + + /* Create an image from the BMP */ + title = screen->LoadImage(bmp->w, bmp->h, (Uint8 *)bmp->pixels, NULL); + SDL_FreeSurface(bmp); + return(title); +} + +SDL_Surface *GetCIcon(FrameBuf *screen, short cicn_id) +{ + char file[256]; + LibPath path; + SDL_Surface *cicn; + SDL_RWops *cicn_src; + Uint8 *pixels, *mask; + Uint16 w, h; + + /* Open the cicn sprite file.. */ + sprintf(file, "Images"DIR_SEP"Maelstrom_Icon#%hd.cicn", cicn_id); + if ( (cicn_src=SDL_RWFromFile(path.Path(file), "r")) == NULL ) { + error("GetCIcon(%hd): Can't open CICN %s: ", + cicn_id, path.Path(file)); + return(NULL); + } + + w = SDL_ReadBE16(cicn_src); + h = SDL_ReadBE16(cicn_src); + pixels = new Uint8[w*h]; + if ( SDL_RWread(cicn_src, pixels, 1, w*h) != (w*h) ) { + error("GetCIcon(%hd): Corrupt CICN!\n", cicn_id); + delete[] pixels; + SDL_RWclose(cicn_src); + return(NULL); + } + mask = new Uint8[(w/8)*h]; + if ( SDL_RWread(cicn_src, mask, 1, (w/8)*h) != ((w/8)*h) ) { + error("GetCIcon(%hd): Corrupt CICN!\n", cicn_id); + delete[] pixels; + delete[] mask; + SDL_RWclose(cicn_src); + return(NULL); + } + SDL_RWclose(cicn_src); + + cicn = screen->LoadImage(w, h, pixels, mask); + delete[] pixels; + delete[] mask; + if ( cicn == NULL ) { + error("GetCIcon(%hd): Couldn't convert CICN!\n", cicn_id); + } + return(cicn); +} diff --git a/load.h b/load.h new file mode 100644 index 0000000..df0ac47 --- /dev/null +++ b/load.h @@ -0,0 +1,126 @@ + +#ifndef _load_h +#define _load_h + +#include +#include +#ifdef WIN32 // For access() prototype +#include +#define F_OK 0 +#define access _access +#else +#ifdef macintosh +static inline char *strdup(const char *str) +{ + char *newstr; + + newstr = (char *)malloc(strlen(str)+1); + if ( newstr ) { + strcpy(newstr, str); + } + return(newstr); +} +#endif +#if defined(unix) || defined(__MACH__) || defined(__BEOS__) +#include +#endif +#endif /* WIN32 */ + +#include "SDL_FrameBuf.h" + +/* Pathing stuff for the different operating systems */ +#if defined(unix) || defined(__MACH__) +#define DIR_SEP "/" +#define CUR_DIR "." +#elif defined(WIN32) +#define DIR_SEP "/" +#define CUR_DIR "." +#elif defined(__BEOS__) +#define DIR_SEP "/" +#define CUR_DIR "." +#elif defined(macintosh) +#define DIR_SEP ":" +#define CUR_DIR ":" +#else +#error Unspecified platform! +#endif /* Choose your platform */ + +#ifndef LIBDIR +#if defined(unix) || defined(__MACH__) +#define LIBDIR "/usr/local/lib/Maelstrom" +#else +#define LIBDIR CUR_DIR +#endif +#endif /* !defined(LIBDIR) */ + +class LibPath { + +private: + static char *exepath; + +public: + static void SetExePath(const char *exe) { + char *exep; + + exepath = strdup(exe); + for ( exep = exepath+strlen(exe); exep > exepath; --exep ) { + if ( (*exep == *DIR_SEP) || (*exep == '\\') ) { + break; + } + } + if ( exep > exepath ) { + *exep = '\0'; + } else { + strcpy(exepath, CUR_DIR); + } + } + +public: + LibPath() { + path = NULL; + } + LibPath(char *file) { + path = NULL; + Path(file); + } + ~LibPath() { + if ( path ) delete[] path; + } + + const char *Path(const char *filename) { + char *directory; + + directory = getenv("MAELSTROM_LIB"); + if ( directory == NULL ) { + directory = LIBDIR; +#ifndef macintosh + if ( access(directory, F_OK) < 0 ) { + directory = exepath; + } +#endif + } + + if ( path != NULL ) + delete[] path; + path = new char[strlen(directory)+1+strlen(filename)+1]; + if ( strcmp(directory, DIR_SEP) == 0 ) { + sprintf(path, DIR_SEP"%s", filename); + } else { + sprintf(path, "%s"DIR_SEP"%s", directory, filename); + } + return(path); + } + const char *Path(void) { + return(path); + } + +private: + char *path; +}; + +/* Functions exported from load.cc */ +extern SDL_Surface *Load_Icon(char **xpm); +extern SDL_Surface *Load_Title(FrameBuf *screen, int title_id); +extern SDL_Surface *GetCIcon(FrameBuf *screen, short cicn_id); + +#endif /* _load_h */ diff --git a/logic.h b/logic.h new file mode 100644 index 0000000..07c4158 --- /dev/null +++ b/logic.h @@ -0,0 +1,28 @@ + +/* Game Logic interface routines and variables */ + +#include "netlogic.h" + +/* From logic.cpp */ +extern void LogicUsage(void); +extern int InitLogicData(void); +extern int LogicParseArgs(char ***argvptr, int *argcptr); +extern int InitLogic(void); +extern int InitPlayerSprites(void); +extern void HaltLogic(void); +extern void SetControl(unsigned char which, int toggle); +extern int SpecialKey(SDL_keysym key); +extern int GetScore(void); + +/* From game.cpp */ +extern void NewGame(void); + +/* From about.cpp */ +extern void DoAbout(void); + +/* From blit.cpp (fastlogic) player.cpp (netlogic) */ +extern Uint8 gPlayerShotColors[]; +extern SDL_Surface *gPlayerShot; +extern Uint8 gEnemyShotColors[]; +extern SDL_Surface *gEnemyShot; + diff --git a/maclib/COPYING b/maclib/COPYING new file mode 100644 index 0000000..960fe74 --- /dev/null +++ b/maclib/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + END OF TERMS AND CONDITIONS diff --git a/maclib/Mac_Compat.h b/maclib/Mac_Compat.h new file mode 100644 index 0000000..7d03929 --- /dev/null +++ b/maclib/Mac_Compat.h @@ -0,0 +1,37 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#ifndef _Mac_Compat_h +#define _Mac_Compat_h + +#include "SDL_timer.h" + +/* Some simple inline Macintosh compatibility routines */ + +/* Delay(x) -- sleep for x number of 1/60 second slices */ +#define Delay(x) SDL_Delay(((x)*1000)/60) +/* Ticks -- a global variable containing current time in 1/60 second slices */ +#define Ticks ((SDL_GetTicks()*60)/1000) + +#endif /* _Mac_Compat_h */ diff --git a/maclib/Mac_FontServ.cpp b/maclib/Mac_FontServ.cpp new file mode 100644 index 0000000..18d39a9 --- /dev/null +++ b/maclib/Mac_FontServ.cpp @@ -0,0 +1,418 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* The Macintosh Font Server module */ + +#include +#include +#include +#include + +#include "SDL_types.h" +#include "bitesex.h" +#include "Mac_FontServ.h" + +#define copy_short(S, D) memcpy(&S, D, 2); D += 2; +#define copy_long(L, D) memcpy(&L, D, 4); D += 4; + +/* The structure of the Macintosh 'FOND' resource */ +struct Font_entry { + Uint16 size; + Uint16 style; + Uint16 ID; +}; +struct FOND { + Uint16 flags; + Uint16 ID; + Uint16 firstCH; + Uint16 lastCH; + Uint16 MaxAscent; /* Maximum Font Ascent */ + Uint16 MaxDescent; /* Maximum Font Descent */ + Uint16 MaxLead; /* Maximum Font Leading */ + Uint16 MaxWidth; /* Maximum Font Glyph Width */ + Uint32 WidthOff; /* Width table offset */ + Uint32 KernOff; /* Kerning table offset */ + Uint32 StyleOff; /* Style mapping table offset */ + Uint16 StyleProp[9]; /* 9 Style Properties */ + Uint32 Intl_info; /* International script info */ + Uint16 Version; /* The version of the FOND resource */ + + /* The Font Association Table */ + Uint16 num_fonts; /* Number of fonts in table - 1 */ +#ifdef SHOW_VARLENGTH_FIELDS + struct Font_entry nfnts[0]; +#endif + + /* The Offset Table */ + /* The Bounding Box Table */ + /* The Glyph Width Table */ + /* The Style Mapping Table */ + /* The Kerning Table */ +}; + + +FontServ:: FontServ(const char *fontfile) +{ + fontres = new Mac_Resource(fontfile); + text_allocated = 0; + if ( fontres->Error() ) { + SetError("Couldn't load resources from %s", fontfile); + return; + } + if ( fontres->NumResources("FOND") == 0 ) { + SetError("FontServ: No 'FOND' resources in %s", fontfile); + return; + } + errstr = NULL; +} + +FontServ:: ~FontServ() +{ + if ( text_allocated != 0 ) { + fprintf(stderr, + "FontServ: Warning: %d text surfaces extant\n", + text_allocated); + } + delete fontres; +} + + +MFont * +FontServ:: NewFont(const char *fontname, int ptsize) +{ + Mac_ResData *fond; + Uint8 *data; + struct FOND Fond; + struct Font_entry Fent; + int nchars; /* number of chars including 'missing char' */ + int nwords; /* bit image size, in words */ + int i, swapfont; + MFont *font; + + /* Get the font family */ + fond = fontres->Resource("FOND", fontname); + if ( fond == NULL ) { + SetError("Warning: Font family '%s' not found", fontname); + return(NULL); + } + + /* Find out what font ID we need */ + data = fond->data; + copy_short(Fond.flags, data); + copy_short(Fond.ID, data); + copy_short(Fond.firstCH, data); + copy_short(Fond.lastCH, data); + copy_short(Fond.MaxAscent, data); + copy_short(Fond.MaxDescent, data); + copy_short(Fond.MaxLead, data); + copy_short(Fond.MaxWidth, data); + copy_long(Fond.WidthOff, data); + copy_long(Fond.KernOff, data); + copy_long(Fond.StyleOff, data); + memcpy(Fond.StyleProp, data, 18); data += 18; + copy_long(Fond.Intl_info, data); + copy_short(Fond.Version, data); + copy_short(Fond.num_fonts, data); + bytesex16(Fond.num_fonts); + ++Fond.num_fonts; + for (i=0; infnt = fontres->Resource("NFNT", Fent.ID); + if ( font->nfnt == NULL ) { + delete font; + SetError( +"Warning: Can't find NFNT resource for %d pt %s font", ptsize, fontname); + return(NULL); + } + + /* Now that we have the resource, fiddle with the font structure + so we can use it. (Code taken from 'mac2bdf' -- Thanks! :) + */ + font->header = (struct FontHdr *)(font->nfnt)->data; + if ( ((font->header->fontType & ~3) != PROPFONT) && + ((font->header->fontType & ~3) != FIXEDFONT) ) { + swapfont = 1; + } else { + swapfont = 0; + } + if ( swapfont ) { + byteswap((Uint16 *)font->header, + sizeof(struct FontHdr)/sizeof(Uint16)); + } + + /* Check magic number. + The low two bits are masked off; newer versions of the Font Manager + use these to indicate the presence of optional 'width' and 'height' + tables, which are for fractional character spacing (unused). + */ + if ( ((font->header->fontType & ~3) != PROPFONT) && + ((font->header->fontType & ~3) != FIXEDFONT) ) { + SetError("Warning: Bad font Magic number: 0x%04x", + (font->header)->fontType); + delete font; + return(NULL); + } + nchars= ((font->header)->lastChar - (font->header)->firstChar + 1) + 1; + /* One extra for "missing character image" */ + nwords= (font->header)->rowWords * (font->header)->fRectHeight; + + /* Read the tables. They follow sequentially in the resource */ + font->bitImage = (Uint16 *)((font->nfnt)->data+sizeof(*font->header)); + font->locTable = (Uint16 *)(font->bitImage+nwords); + font->owTable = (Sint16 *)(font->locTable+nchars+1); + + /* Note -- there may be excess data at the end of the resource + (the optional width or height tables) */ + + /* Byteswap the tables */ + if ( swapfont ) { + byteswap(font->bitImage, nwords); + byteswap(font->locTable, nchars+1); + byteswap((Uint16 *)font->owTable, nchars); + } + return(font); +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +#define HiByte(word) ((word>>8)&0xFF) +#define LoByte(word) (word&0xFF) + +/* The width of the specified text in pixels when displayed with the + specified font and style. +*/ +Uint16 +FontServ:: TextWidth(const char *text, MFont *font, Uint8 style) +{ + int nchars, i; + int space_width; /* The width of the whole character */ + int extra_width; /* Stylistic width */ + Uint16 Width; + + switch (style) { + case STYLE_NORM: extra_width = 0; + break; + case STYLE_BOLD: extra_width = 1; + break; + case STYLE_ULINE: extra_width = 0; + break; + default: return(0); + } + nchars = strlen(text); + + Width = 0; + for ( i = 0; i < nchars; ++i ) { + /* check to see if this character is defined */ + if (font->owTable[(Uint8)text[i]] <= 0) + continue; + + space_width = LoByte(font->owTable[(Uint8)text[i]]); +#ifdef WIDE_BOLD + Width += (space_width+extra_width); +#else + Width += space_width; +#endif + } + return(Width); +} +Uint16 +FontServ:: TextHeight(MFont *font) +{ + return((font->header)->fRectHeight); +} + +/* Get/Set bit i of a scan line */ +#define GETBIT(scanline, i) \ + ((scanline[(i)/16] >> (15 - (i)%16)) & 1) +#define SETBIT(scanline, i, bit) \ + (scanline[(i)/8] |= bit << (7 - (i)%8)) + +SDL_Surface * +FontServ:: TextImage(const char *text, MFont *font, Uint8 style, + SDL_Color foreground, SDL_Color background) +{ + Uint16 width, height; + SDL_Surface *image; + Uint8 *bitmap; + int nchars; + int bit_offset; /* The current bit offset into a scanline */ + int space_width; /* The width of the whole character */ + int space_offset; /* The offset into the character of glyph */ + int glyph_line_offset; /* The offset into scanline of glyph */ + int glyph_width; /* The width of brushed glyph */ + int bold_offset, boldness; + int ascii, i, y; + int bit; + + switch (style) { + case STYLE_NORM: bold_offset = 0; + break; + case STYLE_BOLD: bold_offset = 1; + break; + case STYLE_ULINE: bold_offset = 0; + break; + case STYLE_ITALIC: SetError( + "FontServ: Italics not implemented!"); + return(NULL); + default: SetError( + "FontServ: Unknown text style!"); + return(NULL); + } + + /* Notes on the tables. + + Table 'bits' contains a bitmap image of the entire font. + There are fRectHeight rows, each rowWords long. + The high bit of a word is leftmost in the image. + The characters are placed in this image in order of their + ASCII value. The last image is that of the "missing + character"; every Mac font must have such an image + (traditionally a maximum-sized block). + + The location table (loctab) and offset/width table (owtab) + have one entry per character in the range firstChar..lastChar, + plus two extra entries: one for the "missing character" image + and a terminator. They describe, respectively, where to + find the character in the bitmap and how to interpret it with + respect to the "character origin" (pen position on the base + line). + + The location table entry for a character contains the bit (!) + offset of the start of its image data in the font's bitmap. + The image data's width is computed by subtracting the start + from the start of the next character (hence the terminator). + + The offset/width table contains -1 for undefined characters; + for defined characters, the high byte contains the character + offset (distance between left of character image and + character origin), and the low byte contains the character + width (distance between the character origin and the origin + of the next character on the line). + */ + + /* Figure out how big the text image will be */ + width = TextWidth(text, font, style); + if ( width == 0 ) { + SetError("No text to convert"); + return(NULL); + } + height = (font->header)->fRectHeight; + + /* Allocate the text bitmap image */ + image = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 1, 0,0,0,0); + if ( image == NULL ) { + SetError("Unable to allocate bitmap: %s", SDL_GetError()); + return(NULL); + } + bitmap = (Uint8 *)image->pixels; + + /* Print the individual characters */ + /* Note: this could probably be optimized.. eh, who cares. :) */ + nchars = strlen(text); + for ( boldness=0; boldness <= bold_offset; ++boldness ) { + bit_offset=0; + for ( i = 0; i < nchars; ++i ) { + /* check to see if this character is defined */ + /* According to the above comment, we should */ + /* check if the table contains -1, but this */ + /* change seems to fix a SIGSEGV that would */ + /* otherwise occur in some cases. */ + if (font->owTable[(Uint8)text[i]] <= 0) + continue; + + space_width = LoByte(font->owTable[(Uint8)text[i]]); + space_offset = HiByte(font->owTable[(Uint8)text[i]]); + ascii = (Uint8)text[i] - (font->header)->firstChar; + glyph_line_offset = font->locTable[ascii]; + glyph_width = (font->locTable[ascii+1] - + font->locTable[ascii]); + for ( y=0; ypitch*8+ + bit_offset+space_offset); + src_scanline = font->bitImage + + y*(font->header)->rowWords; + for ( bit = 0; bitheader)->descent+1); + bit_offset = (y*image->pitch*8); + for ( bit=0; bitformat->palette->colors[0] = background; + image->format->palette->colors[1] = foreground; + ++text_allocated; + return(image); +} +void +FontServ:: FreeText(SDL_Surface *text) +{ + --text_allocated; + SDL_FreeSurface(text); +} +int +FontServ:: InvertText(SDL_Surface *text) +{ + SDL_Color colors[2]; + + /* Only works on bitmap images */ + if ( text->format->BitsPerPixel != 1 ) { + SetError("Not a text bitmap"); + return(-1); + } + + /* Swap background and foreground colors */ + colors[0] = text->format->palette->colors[1]; + colors[1] = text->format->palette->colors[0]; + SDL_SetColors(text, colors, 0, 2); + return(0); +} diff --git a/maclib/Mac_FontServ.h b/maclib/Mac_FontServ.h new file mode 100644 index 0000000..e919cca --- /dev/null +++ b/maclib/Mac_FontServ.h @@ -0,0 +1,146 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#ifndef _fontserv_h +#define _fontserv_h + +/* This documents the FontServ C++ class */ + +/* The FontServ takes a Macintosh NFNT resource file and extracts + the fonts for use with any blit type display. Specifically + designed for the Maelstrom port to Linux. :) + + The specs for the NFNT resource were finally understood by looking + at mac2bdf, written by Guido van Rossum + + -Sam Lantinga (slouken@devolution.com) +*/ + +#include +#include + +#include "Mac_Resource.h" +#include "SDL_FrameBuf.h" + +/* Different styles supported by the font server */ +#define STYLE_NORM 0x00 +#define STYLE_BOLD 0x01 +#define STYLE_ULINE 0x02 +#define STYLE_ITALIC 0x04 /* Unimplemented */ + +#define WIDE_BOLD /* Bold text is widened porportionally */ + +/* Macintosh font magic numbers */ +#define PROPFONT 0x9000 +#define FIXEDFONT 0xB000 + +/* Lay-out of a Font Record header */ +struct FontHdr { + Uint16 fontType; /* PROPFONT or FIXEDFONT */ + Sint16 firstChar, + lastChar, + widMax, + kernMax, /* Negative of max kern */ + nDescent; /* negative of descent */ + Uint16 fRectWidth, + fRectHeight, + owTLoc, /* Offset in words from itself to + the start of the owTable */ + ascent, + descent, + leading, + rowWords; /* Row width of bit image in words */ +}; + +typedef struct { + struct FontHdr *header; /* The NFNT header! */ + + /* Variable-length tables */ + Uint16 *bitImage; /* bitImage[rowWords][fRectHeight]; */ + Uint16 *locTable; /* locTable[lastChar+3-firstChar]; */ + Sint16 *owTable; /* owTable[lastchar+3-firstChar]; */ + + /* The Raw Data */ + Mac_ResData *nfnt; +} MFont; + +class FontServ { + +public: + /* The "fontfile" parameter should be a Macintosh Resource fork file + that contains FOND and NFNT information for the desired fonts. + */ + FontServ(const char *fontfile); + ~FontServ(); + + /* The font returned by NewFont() should be delete'd */ + MFont *NewFont(const char *fontname, int ptsize); + + /* Determine the final width/height of a text block (in pixels) */ + Uint16 TextWidth(const char *text, MFont *font, Uint8 style); + Uint16 TextHeight(MFont *font); + + /* Returns a bitmap image filled with the requested text. + The text should be freed with FreeText() after it is used. + */ + SDL_Surface *TextImage(const char *text, MFont *font, Uint8 style, + SDL_Color background, SDL_Color foreground); + SDL_Surface *TextImage(const char *text, MFont *font, Uint8 style, + Uint8 R, Uint8 G, Uint8 B) { + SDL_Color background = { 0xFF, 0xFF, 0xFF, 0 }; + SDL_Color foreground; + + foreground.r = R; + foreground.g = G; + foreground.b = B; + return(TextImage(text, font, style, foreground, background)); + } + void FreeText(SDL_Surface *text); + + /* Inverts the color of the text image */ + int InvertText(SDL_Surface *text); + + /* Returns NULL if everything is okay, or an error message if not */ + char *Error(void) { + return(errstr); + } + +private: + Mac_Resource *fontres; + int text_allocated; + + /* Useful for getting error feedback */ + void SetError(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsprintf(errbuf, fmt, ap); + va_end(ap); + errstr = errbuf; + } + char *errstr; + char errbuf[BUFSIZ]; +}; + +#endif /* _fontserv_h */ diff --git a/maclib/Mac_Resource.cpp b/maclib/Mac_Resource.cpp new file mode 100644 index 0000000..85c184f --- /dev/null +++ b/maclib/Mac_Resource.cpp @@ -0,0 +1,531 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* These are routines to parse a Macintosh Resource Fork file + + -Sam Lantinga (slouken@devolution.com) + +Note: Most of the info in this file came from "Inside Macintosh" +*/ + +#include +#include + +#include "SDL_types.h" +#include "bitesex.h" +#include "Mac_Resource.h" + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +/* The format for AppleDouble files -- in a header file */ +#define APPLEDOUBLE_MAGIC 0x00051607 +#include "applefile.h" + +/* The format for MacBinary files -- in a header file */ +#define MACBINARY_MASK 0xFCFF +#define MACBINARY_MAGIC 0x8081 +#include "macbinary.h" + +/* These are the data structures that make up the Macintosh Resource Fork */ +struct Resource_Header { + Uint32 res_offset; /* Offset of resources in file */ + Uint32 map_offset; /* Offset of resource map in file */ + Uint32 res_length; /* Length of the resource data */ + Uint32 map_length; /* Length of the resource map */ +}; + +struct Resource_Data { + Uint32 Data_length; /* Length of the resources data */ +#ifdef SHOW_VARLENGTH_FIELDS + Uint8 Data[0]; /* The Resource Data */ +#endif +}; + +struct Type_entry { + char Res_type[4]; /* Resource type */ + Uint16 Num_rez; /* # this type resources in map - 1 */ + Uint16 Ref_offset; /* Offset from type list, of reference + list for this type */ +}; + +struct Ref_entry { + Uint16 Res_id; /* The ID for this resource */ + Uint16 Name_offset; /* Offset in name list of resource + name, or -1 if no name */ + Uint8 Res_attrs; /* Resource attributes */ + Uint8 Res_offset[3]; /* 3-byte offset from Resource data */ + Uint32 Reserved; /* Reserved for use in-core */ +}; + +struct Name_entry { + Uint8 Name_len; /* Length of the following name */ +#ifdef SHOW_VARLENGTH_FIELDS + Uint8 name[0]; /* Variable length resource name */ +#endif + }; + +struct Resource_Map { + Uint8 Reserved[22]; /* Reserved for use in-core */ + Uint16 Map_attrs; /* Map attributes */ + Uint16 types_offset; /* Offset of resource type list */ + Uint16 names_offset; /* Offset of resource name list */ + Uint16 num_types; /* # of types in map - 1 */ +#ifdef SHOW_VARLENGTH_FIELDS + struct Type_entry types[0]; /* Variable length types list */ + struct Ref_entry refs[0]; /* Variable length reference list */ + struct Name_entry names[0]; /* Variable length name list */ +#endif + }; + +int Res_cmp(const void *A, const void *B) +{ + struct Mac_Resource::resource *a, *b; + + a=(struct Mac_Resource::resource *)A; + b=(struct Mac_Resource::resource *)B; + + if ( a->id > b->id ) + return(1); + else if ( a->id < b->id ) + return(-1); + else /* They are equal?? */ + return(0); +} + +/* Here's an iterator to find heuristically (I've always wanted to use that + word :-) a macintosh resource fork from a general mac name. + + This function may be overkill, but I want to be able to find any Macintosh + resource fork, darn it! :) +*/ +static void CheckAppleFile(FILE *resfile, Uint32 *resbase) +{ + ASHeader header; + if (fread(&header.magicNum,sizeof(header.magicNum),1,resfile)&& + (bytesex32(header.magicNum) == APPLEDOUBLE_MAGIC) ) { + fread(&header.versionNum, + sizeof(header.versionNum), 1, resfile); + bytesex32(header.versionNum); + fread(&header.filler, + sizeof(header.filler), 1, resfile); + fread(&header.numEntries, + sizeof(header.numEntries), 1, resfile); + bytesex16(header.numEntries); +#ifdef APPLEDOUBLE_DEBUG +mesg("Header magic: 0x%.8x, version 0x%.8x\n", + header.magicNum, header.versionNum); +#endif + + ASEntry entry; +#ifdef APPLEDOUBLE_DEBUG +mesg("Number of entries: %d, sizeof(entry) = %d\n", + header.numEntries, sizeof(entry)); +#endif + for ( int i = 0; idata; + delete Resources[i].list[n].data; + } + } + delete[] Resources[i].list; + } + delete[] Resources; +} + +char ** +Mac_Resource:: Types(void) +{ + int i; + char **types; + + types = new char *[num_types+1]; + for ( i=0; ilength, 4, 1, filep); + bytesex32(d->length); + d->data = new Uint8[d->length]; + if (!fread(d->data,d->length,1,filep)) { + delete[] d->data; + error("Couldn't read %d bytes", d->length); + delete d; + return(NULL); + } + Resources[i].list[n].data = d; + return(d); + } + } + } + } + error("Couldn't find resource of type '%s', id %hu", res_type, id); + return(NULL); +} + +Mac_ResData * +Mac_Resource:: Resource(const char *res_type, const char *name) +{ + int i, n; + Mac_ResData *d; + + for ( i=0; ilength, 4, 1, filep); + bytesex32(d->length); + d->data = new Uint8[d->length]; + if (!fread(d->data,d->length,1,filep)) { + delete[] d->data; + error("Couldn't read %d bytes", d->length); + delete d; + return(NULL); + } + Resources[i].list[n].data = d; + return(d); + } + } + } + } + error("Couldn't find resource of type '%s', name %s", res_type, name); + return(NULL); +} + diff --git a/maclib/Mac_Resource.h b/maclib/Mac_Resource.h new file mode 100644 index 0000000..1115b2d --- /dev/null +++ b/maclib/Mac_Resource.h @@ -0,0 +1,107 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#ifndef _Mac_Resource_h +#define _Mac_Resource_h + +/* These are routines to parse a Macintosh Resource Fork file + + -Sam Lantinga (slouken@devolution.com) + +Note: Most of the info in this file came from "Inside Macintosh" +*/ + +#include +#include + +/* The actual resources in the resource fork */ +typedef struct { + Uint32 length; + Uint8 *data; +} Mac_ResData; + + +class Mac_Resource { +public: + Mac_Resource(const char *filename); + ~Mac_Resource(); + + /* Create a NULL terminated list of resource types in this file */ + char **Types(void); + + /* Return the number of resources of the given type */ + Uint16 NumResources(const char *res_type); + + /* Create a 0xFFFF terminated list of resource ids for a type */ + Uint16 *ResourceIDs(const char *res_type); + + /* Return a resource of a certain type and id. These resources + are deleted automatically when Mac_Resource object is deleted. + */ + char *ResourceName(const char *res_type, Uint16 id); + Mac_ResData *Resource(const char *res_type, Uint16 id); + Mac_ResData *Resource(const char *res_type, const char *name); + + /* This returns a more detailed error message, or NULL */ + char *Error(void) { + return(errstr); + } + +protected: + friend int Res_cmp(const void *A, const void *B); + + /* Offset of Resource data in resource fork */ + Uint32 res_offset; + Uint16 num_types; /* Number of types of resources */ + + struct resource { + char *name; + Uint16 id; + Uint32 offset; + Mac_ResData *data; + }; + + struct resource_list { + char type[5]; /* Four character type + nul */ + Uint16 count; + struct resource *list; + } *Resources; + + FILE *filep; /* The Resource Fork File */ + Uint32 base; /* The offset of the rsrc */ + + /* Useful for getting error feedback */ + void error(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsprintf(errbuf, fmt, ap); + va_end(ap); + errstr = errbuf; + } + char *errstr; + char errbuf[BUFSIZ]; +}; + +#endif /* _Mac_Resource_h */ diff --git a/maclib/Mac_Sound.cpp b/maclib/Mac_Sound.cpp new file mode 100644 index 0000000..89d1e03 --- /dev/null +++ b/maclib/Mac_Sound.cpp @@ -0,0 +1,287 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#include + +#include "Mac_Sound.h" +#include "Mac_Compat.h" + +static int bogus_running = 0; + +extern "C" { +static int BogusAudioThread(void *data) +{ + SDL_AudioSpec *spec; + void (*fill)(void *userdata, Uint8 *stream, int len); + Uint32 then; + Uint32 playticks; + Sint32 ticksleft; + Uint8 *stream; + +#ifdef NSIG + /* Clear out any signal handlers */ + for ( int i = 0; icallback == NULL ) { + for ( ; ; ) + Delay(60*60*60); /* Delay 1 hour */ + } + fill = spec->callback; + playticks = ((Uint32)spec->samples*1000)/spec->freq; + /* Fill in the spec */ + spec->size = (spec->format&0xFF)/8; + spec->size *= spec->channels; + spec->size *= spec->samples; + stream = new Uint8[spec->size]; + + while ( bogus_running ) { + then = SDL_GetTicks(); + + /* Fill buffer */ + if ( fill ) + (*fill)(spec->userdata, stream, spec->size); + + /* Calculate time left, and sleep */ + ticksleft = playticks-(SDL_GetTicks()-then); + if ( ticksleft > 0 ) + SDL_Delay(ticksleft); + } + delete[] stream; + + return(0); +} + +static void FillAudio(void *udata, Uint8 *stream, int len) +{ + Sound *sound = (Sound *)udata; + + Sound::FillAudioU8(sound, stream, len); +} +/* extern "C" */ +}; + +Sound:: Sound(const char *soundfile, Uint8 vol) +{ + Wave *wave; + Mac_Resource *soundres; + int i, p; + Uint16 *ids; + Mac_ResData *snd; + + /* Initialize variables */ + volume = 0; + playing = 0; + bogus_audio = NULL; + InitHash(); + errstr = NULL; + + /* Load the sounds from the resource files */ + soundres = new Mac_Resource(soundfile); + if ( soundres->Error() ) { + error("%s", soundres->Error()); + return; + } + if ( soundres->NumResources("snd ") == 0 ) { + error("No sound resources in '%s'", soundfile); + return; + } + ids = soundres->ResourceIDs("snd "); + wave = NULL; + for ( i=0; ids[i] != 0xFFFF; ++i ) { + snd = soundres->Resource("snd ", ids[i]); + if ( snd == NULL ) { + error("%s", soundres->Error()); + delete soundres; + return; + } + wave = new Wave(snd, DSP_FREQUENCY); + if ( wave->Error() ) { + error("%s", wave->Error()); + delete wave; + delete soundres; + return; + } + Hash(ids[i], wave); + } + delete soundres; + spec = wave->Spec(); + /* Allow ~ 1/30 second time-lag in audio buffer -- samples is x^2 */ + spec->samples = (wave->Frequency()*wave->SampleSize())/30; + for ( p = 0; spec->samples > 1; ++p ) + spec->samples /= 2; + ++p; + for ( i = 0; i < p; ++i ) + spec->samples *= 2; + spec->callback = FillAudio; + spec->userdata = (void *)this; + + /* Empty the channels and start the music :-) */ + HaltSound(); + if ( vol == 0 ) { + bogus_running = 1; + bogus_audio = SDL_CreateThread(BogusAudioThread, spec); + } else { + Volume(vol); + } +} + +Sound:: ~Sound() +{ + if ( playing ) + SDL_CloseAudio(); + else + if ( bogus_audio ) { + bogus_running = 0; + SDL_WaitThread(bogus_audio, NULL); + bogus_audio = NULL; + } + FreeHash(); +} + +Uint8 +Sound:: Volume(Uint8 vol) +{ + Uint8 active; + + active = playing; + if ( (volume == 0) && (vol > 0) ) { + /* Kill bogus sound thread */ + if ( bogus_audio ) { + bogus_running = 0; + SDL_WaitThread(bogus_audio, NULL); + bogus_audio = NULL; + } + + /* Try to open the audio */ + if ( SDL_OpenAudio(spec, NULL) < 0 ) + vol = 0; /* Fake sound */ + active = 1; + SDL_PauseAudio(0); /* Go! */ + } + if ( vol > MAX_VOLUME ) + vol = MAX_VOLUME; + volume = vol; + + if ( active && (volume == 0) ) { + if ( playing ) + SDL_CloseAudio(); + active = 0; + + /* Run bogus sound thread */ + bogus_running = 1; + bogus_audio = SDL_CreateThread(BogusAudioThread, spec); + if ( bogus_audio == NULL ) { + /* Oh well... :-) */ + } + } + playing = active; + return(volume); +} + +int +Sound:: PlaySound(Uint16 sndID, Uint8 priority, Uint8 channel, + void (*callback)(Uint8 channel)) +{ + Wave *wave; + + if ( priority <= Priority(channel) ) + return(-1); + + wave = Hash(sndID); + if ( wave == NULL ) + return(-1); + + channels[channel].ID = sndID; + channels[channel].priority = priority; + channels[channel].len = wave->DataLeft(); + channels[channel].src = wave->Data(); + channels[channel].callback = callback; +#ifdef DEBUG_SOUND +printf("Playing sound %hu on channel %d\n", sndID, channel); +#endif + return(0); +} + +/* This has to be a very fast routine, otherwise sound will lag and crackle */ +void +Sound:: FillAudioU8(Sound *sound, Uint8 *stream, int len) +{ + int i, s; + + /* Mix in each of the channels, assuming 8-bit unsigned audio data */ + while ( len-- ) { + s = 0; + for ( i=0; ichannels[i].len > 0 ) { + /* + Possible race condition: + If the channel is halted here, + len = 0 then we do '--len' + len = -1, but that's okay. + */ + --sound->channels[i].len; + s += *(sound->channels[i].src)-0x80; + ++sound->channels[i].src; + /* + Possible race condition: + If a sound is played here, + len > 0, then we do 'if len <= 0' + We never call back on channel.. bad. + */ + if ( sound->channels[i].len <= 0 ) { +#ifdef DEBUG_SOUND +printf("Channel %d finished\n", i); +#endif + /* This is critical */ + void (*callback)(Uint8); + callback = sound->channels[i].callback; + if ( callback ) + (*callback)(i); + } + } + } + /* handle volume */ + s = (s*sound->volume)/MAX_VOLUME; + + /* convert to 8-bit unsigned */ + s += 0x80; + + /* clip */ + if ( s > 0xFE ) /* 0xFF causes static on some audio systems */ + *stream++ = 0xFE; + else + if ( s < 0x00 ) + *stream++ = 0x00; + else + *stream++ = (Uint8)s; + } +} diff --git a/maclib/Mac_Sound.h b/maclib/Mac_Sound.h new file mode 100644 index 0000000..ba3b36d --- /dev/null +++ b/maclib/Mac_Sound.h @@ -0,0 +1,208 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* This is a general mixer that takes Macintosh sound resource files + and mixes various sounds on command. +*/ + +#include +#include +#include +#include "SDL_types.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" +#include "SDL_audio.h" +#include "Mac_Wave.h" + +#define MAX_VOLUME 8 /* Software volume ranges from 0 - 8 */ +#define NUM_CHANNELS 4 /* 4 sound mixing channels, limit 128 */ +#define DSP_FREQUENCY 11025 /* Convert the SNDs to this frequency */ + +class Sound { + +public: + Sound(const char *soundfile, Uint8 vol = 4); + ~Sound(); + + /* Set volume in the range 0-8 */ + Uint8 Volume(Uint8 vol); + Uint8 Volume(void) { + return(volume); + } + + /* Play the requested sound */ + int PlaySound(Uint16 sndID, Uint8 priority = 0, + void (*callback)(Uint8 channel) = NULL) { + int i; + + for ( i=0; i Priority(i) ) + return(PlaySound(sndID, priority, i, callback)); + } + return(-1); + } + int PlaySound(Uint16 sndID, Uint8 priority, Uint8 channel, + void (*callback)(Uint8 channel) = NULL); + + /* Stop mixing on the requested channels */ + void HaltSound(void) { + Uint8 i; + + for ( i=0; i 0 ) + return(channels[channel].priority); + return(-1); + } + int ChannelFree(Sint8 channel = -1) { + Uint8 i; + + /* Checking a particular channel? */ + if ( channel >= 0 ) + return((channels[channel].len > 0) ? 1 : 0); + + /* Checking any channel */ + for ( i=0; i 0 ) + return(1); + } + return(0); + } + + char *Error(void) { + return(errstr); + } + + /* These functions really do all the work */ + static void FillAudioU8(Sound *sound, Uint8 *stream, int len); + +private: + Uint8 playing; + + struct channel { + Uint16 ID; + Sint16 priority; + int len; /* Signed, so race conditions can make it < 0 */ + Uint8 *src; + void (*callback)(Uint8 channel); + } channels[NUM_CHANNELS]; + + SDL_AudioSpec *spec; + Uint8 volume; + + /* Fake audio handler, in case we can't open the real thing */ + SDL_Thread *bogus_audio; + + /* Functions for getting and setting a hash indexed by Uint16 */ + /* We use a sparse tiered pointer page scheme :-) + It's probably not unique, but I made this version up. :-) + */ + Wave ***hashpage; + void InitHash(void) { + hashpage = new Wave **[256]; + memset(hashpage, 0, 256*sizeof(Wave **)); + } + void Hash(Uint16 index, Wave *value) { + Uint8 upper, lower; + upper = index>>8; + lower = index&0xFF; + if ( hashpage[upper] == NULL ) { + hashpage[upper] = new Wave *[256]; + memset(hashpage[upper], 0, 256*sizeof(Wave *)); + } + if ( hashpage[upper][lower] ) { +#ifdef DEBUG_HASH +printf("Warning: Hash page %d/%d already used!\n", upper, lower); +#endif + delete hashpage[upper][lower]; + } +#ifdef DEBUG_HASH +printf("Saving Wave id %hu to hash page %d/%d\n", index, upper, lower); +#endif + hashpage[upper][lower] = value; + } + Wave *Hash(Uint16 index) { + Uint8 upper, lower; + upper = index>>8; + lower = index&0xFF; + if ( hashpage[upper] == NULL ) + return(NULL); + return(hashpage[upper][lower]); + } + void FreeHash(void) { + Uint16 upper, lower; + + for ( upper = 0; upper < 256; ++upper ) { + if ( hashpage[upper] ) { + for ( lower = 0; lower < 256; ++lower ) { + if ( hashpage[upper][lower] ) { +#ifdef DEBUG_HASH +printf("Freeing Wave id %hu at hash page %d/%d\n",(upper<<8)|lower,upper,lower); +#endif + delete hashpage[upper][lower]; + } + } + delete[] hashpage[upper]; + } + } + delete[] hashpage; + } + + /* Useful for getting error feedback */ + void error(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsprintf(errbuf, fmt, ap); + va_end(ap); + errstr = errbuf; + } + char *errstr; + char errbuf[BUFSIZ]; +}; diff --git a/maclib/Mac_Wave.cpp b/maclib/Mac_Wave.cpp new file mode 100644 index 0000000..2ca3067 --- /dev/null +++ b/maclib/Mac_Wave.cpp @@ -0,0 +1,571 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* Microsoft WAVE file loading routines */ + +#include +#include +#include "SDL_endian.h" +#include "SDL_rwops.h" +#include "Mac_Wave.h" + +#if SDL_BYTEORDER == SDL_BIG_ENDIAN +#define wavesex32(x) \ + ((x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24)) +#define wavesex16(x) ((x << 8) | (x >> 8)) +#define snd_sex32(x) (x) +#define snd_sex16(x) (x) +#else +#define wavesex32(x) (x) +#define wavesex16(x) (x) +#define snd_sex32(x) \ + ((x << 24) | ((x & 0xff00) << 8) | ((x >> 8) & 0xff00) | (x >> 24)) +#define snd_sex16(x) ((x << 8) | (x >> 8)) +#endif /* Endianness */ + +/*******************************************/ +/* Define values for Macintosh SND format */ +/*******************************************/ + +/* Different sound header formats */ +#define FORMAT_1 0x0001 +#define FORMAT_2 0x0002 + +/* The different types of sound data */ +#define SAMPLED_SND 0x0005 + +/* Initialization commands */ +#define MONO_SOUND 0x00000080 +#define STEREO_SOUND 0x000000A0 + +/* The different sound commands; we only support BUFFER_CMD */ +#define SOUND_CMD 0x8050 /* Different from BUFFER_CMD? */ +#define BUFFER_CMD 0x8051 + +/* Different original sampling rates -- rate = (#define)>>16 */ +#define rate44khz 0xAC440000 /* 44100.0 */ +#define rate22khz 0x56EE8BA3 /* 22254.5 */ +#define rate11khz 0x2B7745D0 /* 11127.3 */ +#define rate11khz2 0x2B7745D1 /* 11127.3 (?) */ + +#define stdSH 0x00 +#define extSH 0xFF +#define cmpSH 0xFE + +/*******************************************/ + +#define snd_copy16(V, D) \ +{ \ + V = *((Uint16 *)D); \ + D += 2; \ + V = snd_sex16(V); \ +} +#define snd_copy32(V, D) \ +{ \ + memcpy(&V, D, sizeof(Uint32)); \ + D += 4; \ + V = snd_sex32(V); \ +} + +/*******************************************/ + +void +Wave:: Init(void) { + sound_data = NULL; + errstr = NULL; +} +void +Wave:: Free(void) { + if ( sound_data ) { + delete[] sound_data; + sound_data = NULL; + } +} + +int +Wave:: Load(const char *wavefile, Uint16 desired_rate) +{ + Uint8 *samples; + + /* Free any existing WAVE data */ + Free(); + Init(); + + /* Load the WAVE file */ + if ( SDL_LoadWAV(wavefile, &spec, &samples, &sound_datalen) == NULL ) { + error("%s", SDL_GetError()); + return(-1); + } + /* Copy malloc()'d data to new'd data */ + sound_data = new Uint8[sound_datalen]; + memcpy(sound_data, samples, sound_datalen); + SDL_FreeWAV(samples); + + /* Set the desired sample frequency */ + Frequency(desired_rate); + + /* Rewind and go! */ + Rewind(); + return(0); +} + +Uint32 +Wave:: Frequency(Uint16 desired_rate) +{ + if ( (desired_rate > 0) && (desired_rate != spec.freq) ) { + Uint8 *samples; + Uint32 datalen, samplesize; + + samples = sound_data; + samplesize = SampleSize(); + datalen = ConvertRate(spec.freq, desired_rate, + &samples, sound_datalen/samplesize, samplesize); + if ( samples != sound_data ) { + /* Create new sound data */ + delete[] sound_data; + sound_data = samples; + sound_datalen = datalen*samplesize; + + /* Adjust the format */ + spec.freq = desired_rate; + } + } + return(spec.freq); +} + +/* Most of this information came from the "Inside Macintosh" book series */ +int +Wave:: Load(Mac_ResData *snd, Uint16 desired_rate) +{ + Uint8 *data; + Uint8 *samples; + Uint16 snd_version; + int snd_channels; + + /* Free any existing WAVE data */ + Free(); + Init(); + + /* Start loading the WAVE from the SND */ + data = snd->data; + snd_copy16(snd_version, data); + + snd_channels = 1; /* Is this always true? */ + if ( snd_version == FORMAT_1 ) { + Uint16 n_types; /* Number of sound data types */ + Uint16 f_type; /* First sound data type */ + Uint32 init_op; /* Initialization option (unused) */ + + snd_copy16(n_types, data); + if ( n_types != 1 ) { + error("Multi-type sound not supported"); + return(-1); + } + snd_copy16(f_type, data); + if ( f_type != SAMPLED_SND ) { + error("Not a sampled sound resource"); + return(-1); + } + snd_copy32(init_op, data); + } else if ( snd_version == FORMAT_2 ) { + Uint16 ref_cnt; /* (unused) */ + + snd_copy16(ref_cnt, data); + } else { + error("Unknown sound format: 0x%X", snd_version); + return(-1); + } + + /* Next is the Sound commands section */ + { + Uint16 num_cmds; /* Number of sound commands */ + Uint16 command; /* The first sound command */ + Uint16 param1; /* BUFFER_CMD parameter 1 */ + Uint32 param2; /* Offset to sampled data */ + + snd_copy16(num_cmds, data); + if ( num_cmds != 1 ) { + error("Multi-command sound not supported"); + return(-1); + } + snd_copy16(command, data); + if ( (command != BUFFER_CMD) && (command != SOUND_CMD) ) { + error("Unknown sound command: 0x%X\n", command); + return(-1); + } + snd_copy16(param1, data); + /* Param1 is ignored (should be 0x0000) */ + + snd_copy32(param2, data); + /* Set 'data' to the offset of the sampled data */ + if ( param2 > snd->length ) { + error("Offset too large -- corrupt sound?"); + return(-1); + } + data = snd->data+param2; + } + + /* Next is the sampled sound header */ + { + Uint32 sample_offset; + Uint32 num_samples; + Uint32 sample_rate; + Uint32 loop_start, loop_end; + Uint8 encoding; + Uint8 freq_base; + + snd_copy32(sample_offset, data); + /* FIXME: What's the interpretation of this offset? */ + if ( sample_offset != 0 ) { + error("Sound samples don't immediately follow header"); + return(-1); + } + snd_copy32(num_samples, data); + snd_copy32(sample_rate, data); + /* Sound loops are ignored for now */ + snd_copy32(loop_start, data); + snd_copy32(loop_end, data); + encoding = *data++; + if ( encoding != stdSH ) { + error("Non-standard sound encoding: 0x%X", encoding); + return(-1); + } + /* Frequency base might be used later */ + freq_base = *data++; + + /* Now allocate room for the sound */ + if ( num_samples > snd->length-(data-snd->data) ) { + error("truncated sound resource"); + return(-1); + } + + /* Convert the audio data to desired sample rates */ + samples = data; + switch ( sample_rate ) { + case rate11khz: + case rate11khz2: + /* Assuming 8-bit mono samples */ + if ( desired_rate == 0 ) + desired_rate = 11025; + num_samples = + ConvertRate(sample_rate>>16, desired_rate, + &samples, num_samples, 1); + break; + case rate22khz: + /* Assuming 8-bit mono samples */ + if ( desired_rate == 0 ) + desired_rate = 22050; + num_samples = + ConvertRate(sample_rate>>16, desired_rate, + &samples, num_samples, 1); + break; + case rate44khz: + default: + if ( desired_rate == 0 ) { + desired_rate = (sample_rate>>16); + break; + } + num_samples = + ConvertRate(sample_rate>>16, desired_rate, + &samples, num_samples, 1); + break; + } + sample_rate = desired_rate; + + /* Fill in the audio spec */ + spec.freq = sample_rate; + spec.format = AUDIO_U8; /* The only format? */ + spec.channels = snd_channels; + spec.samples = 4096; + spec.callback = NULL; + spec.userdata = NULL; + + /* Save the audio data */ + sound_datalen = num_samples*snd_channels; + if ( samples == data ) { + sound_data = new Uint8[sound_datalen]; + memcpy(sound_data, samples, sound_datalen); + } else { + sound_data = samples; + } + } + Rewind(); + return(0); +} + +#define SLOW_CONVERT +#ifdef SLOW_CONVERT +/* This is relatively accurate, but not very fast */ +Uint32 +Wave:: ConvertRate(Uint16 rate_in, Uint16 rate_out, + Uint8 **samples, Uint32 n_samples, Uint8 s_size) +{ + double ipos, i_size; + Uint32 opos; + Uint32 n_in, n_out; + Uint8 *input, *output; + + n_in = n_samples*s_size; + input = *samples; + n_out = (Uint32)(((double)rate_out/rate_in)*n_samples)+1; + output = new Uint8[n_out*s_size]; + i_size = ((double)rate_in/rate_out)*s_size; +#ifdef CONVERTRATE_DEBUG +printf("%g seconds of input\n", (double)n_samples/rate_in); +printf("Input rate: %hu, Output rate: %hu, Input increment: %g\n", rate_in, rate_out, i_size/s_size); +printf("%g seconds of output\n", (double)n_out/rate_out); +#endif + for ( ipos = 0, opos = 0; (Uint32)ipos < n_in; ) { +#ifdef CONVERTRATE_DEBUG +if ( opos >= n_out*s_size ) printf("Warning: buffer output overflow!\n"); +#endif + memcpy(&output[opos], &input[(Uint32)ipos], s_size); + ipos += i_size; + opos += s_size; + } + *samples = output; + return(opos/s_size); +} +#else +#define CHECK_ERROR +/* This assumes that the rate in and the rate out are close to eachother, + i.e. only one sample needs to be inserted or deleted for a certain + number of skips. It's fast, but if inaccurate it can lead to output + distortion and buffer overrun. +*/ +Uint32 +Wave:: ConvertRate(Uint16 rate_in, Uint16 rate_out, + Uint8 **samples, Uint32 n_samples, Uint8 s_size) +{ + Uint8 *s_in, *s_out; + Uint32 n_in, n_out; /* number of bytes in sample */ + Uint32 ideal_out; + Uint32 p_in, p_out; /* byte position in sample */ + Uint16 run, runs, i; + Uint8 free_sin; + Uint8 srate_in, srate_out; + Uint8 skip_in, stuff_out; + int cumulative_error; + +#ifdef CONVERTRATE_DEBUG +printf("%g seconds of input\n", (double)n_samples/rate_in); +#endif + /* Initialize variables for input samples */ + srate_in = rate_in>>8; + srate_out = rate_out>>8; + free_sin = 0; + s_in = *samples; + n_in = n_samples*s_size; + skip_in = srate_in/srate_out; + stuff_out = srate_out/srate_in; + +#ifdef CONVERTRATE_DEBUG +printf("Rate in: 0x%X, Rate out: 0x%X, Rate in/out = %d, Rate out/in = %d\n", + rate_in>>8, rate_out>>8, skip_in, stuff_out); +#endif + /* Use simple integer rate conversion to get sample rates close */ + if ( skip_in > 0 ) { + /* rate_in is approximately some multiple of rate_out */ + n_out = n_in/skip_in; + s_out = new Uint8[n_out]; + p_in = 0; + p_out = 0; + while ( p_in < n_in ) { + memcpy(&s_out[p_out], &s_in[p_in], s_size); + p_in += s_size*skip_in; + p_out += s_size*1; + } + free_sin = 1; + s_in = s_out; + n_in = n_out; + rate_in /= skip_in; + } else + if ( stuff_out > 0 ) { + /* rate_out is approximately some multiple of rate_in */ + n_out = n_in*stuff_out; + s_out = new Uint8[n_out]; + p_in = 0; + p_out = 0; + while ( p_in < n_in ) { + for ( run = 0; run < stuff_out; ++run ) { + memcpy(&s_out[p_out], &s_in[p_in], s_size); + p_out += s_size; + } + p_in += s_size; + } + free_sin = 1; + s_in = s_out; + n_in = n_out; + rate_in *= stuff_out; + } + + /* The algorithm: + Since rate_in is close to rate_out, we can go 'run' samples + before having to insert or delete a sample. We always insert + or delete a full sample, doing no floating point carry over + for the next run. If rate_in is relatively close to rate_out, + the error is negligible. The above rate change code works + to shift standard Macintosh frequencies close to standard PC + frequencies for no error with relatively short samples. + */ + if ( rate_in > rate_out ) { + run = (rate_out/(rate_in-rate_out))*s_size; + ideal_out = (Uint32)(((double)rate_out/rate_in)*n_in)*s_size; + runs = ideal_out/run; + n_out = (Uint32)run*runs+(n_in-(Uint32)(run+s_size)*runs); + s_out = new Uint8[n_out]; + p_in = 0; + p_out = 0; +#ifdef CHECK_ERROR + printf("Ideal output: %lu bytes\n", ideal_out); + cumulative_error = n_out - ideal_out; + if ( cumulative_error != 0 ) { + printf( +"WARNING: error in converting samples from rate %lu to %lu: %d bytes\n", + rate_in, rate_out, cumulative_error); + } +#endif /* CHECK_ERROR */ + for ( i=0; i rate_in ) { + run = (rate_in/(rate_out-rate_in))*s_size; + ideal_out = (Uint32)(((double)rate_in/rate_out)*n_in)*s_size; + runs = ideal_out/run; + n_out = (Uint32)runs*(run+s_size)+(n_in-(Uint32)runs*run); + s_out = new Uint8[n_out]; + p_in = 0; + p_out = 0; +#ifdef CHECK_ERROR + printf("Ideal output: %lu bytes\n", ideal_out); + cumulative_error = n_out - ideal_out; + if ( cumulative_error != 0 ) { + printf( +"WARNING: error in converting samples from rate %lu to %lu: %d bytes\n", + rate_in, rate_out, cumulative_error); + } +#endif /* CHECK_ERROR */ + for ( i=0; i +#include +#include "SDL_audio.h" +#include "Mac_Resource.h" + +class Wave { + +public: + Wave() { + Init(); + } + Wave(char *wavefile, Uint16 desired_rate = 0) { + Init(); + Load(wavefile, desired_rate); + } + Wave(Mac_ResData *snd, Uint16 desired_rate = 0) { + Init(); + Load(snd, desired_rate); + } + ~Wave() { + Free(); + } + + /* Load WAVE resources, converting to the desired sample rate */ + int Load(const char *wavefile, Uint16 desired_rate = 0); + int Load(Mac_ResData *snd, Uint16 desired_rate = 0); + int Save(char *wavefile); + + void Rewind(void) { + soundptr = sound_data; + soundlen = sound_datalen; + } + void Forward(Uint32 distance) { + soundlen -= distance; + soundptr += distance; + } + Uint32 DataLeft(void) { + return(soundlen > 0 ? soundlen : 0); + } + Uint8 *Data(void) { + if ( soundlen > 0 ) + return(soundptr); + return(NULL); + } + SDL_AudioSpec *Spec(void) { + return(&spec); + } + Uint32 Frequency(Uint16 desired_rate = 0); + Uint16 SampleSize(void) { + return(((spec.format&0xFF)/8)*spec.channels); + } + int BitsPerSample(void) { + return(spec.format&0xFF); + } + int Stereo(void) { + return(spec.channels/2); + } + + char *Error(void) { + return(errstr); + } + +private: + void Init(void); + void Free(void); + + /* The SDL-ready audio specification */ + SDL_AudioSpec spec; + Uint8 *sound_data; + Uint32 sound_datalen; + + /* Current position of the WAVE file */ + Uint8 *soundptr; + Sint32 soundlen; + + /* Utility functions */ + Uint32 ConvertRate(Uint16 rate_in, Uint16 rate_out, + Uint8 **samples, Uint32 n_samples, Uint8 s_size); + + /* Useful for getting error feedback */ + void error(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsprintf(errbuf, fmt, ap); + va_end(ap); + errstr = errbuf; + } + char *errstr; + char errbuf[BUFSIZ]; +}; diff --git a/maclib/Makefile.am b/maclib/Makefile.am new file mode 100644 index 0000000..7623783 --- /dev/null +++ b/maclib/Makefile.am @@ -0,0 +1,27 @@ + +noinst_LIBRARIES = libSDLmac.a + +libSDLmac_a_SOURCES = \ + Mac_Compat.h \ + Mac_FontServ.cpp \ + Mac_FontServ.h \ + Mac_Resource.cpp \ + Mac_Resource.h \ + Mac_Sound.cpp \ + Mac_Sound.h \ + Mac_Wave.cpp \ + Mac_Wave.h \ + applefile.h \ + macbinary.h \ + bitesex.h + +noinst_PROGRAMS = macres playwave snd2wav + +macres_SOURCES = macres.cpp +macres_LDADD = libSDLmac.a + +playwave_SOURCES = playwave.cpp +playwave_LDADD = libSDLmac.a + +snd2wav_SOURCES = snd2wav.cpp +snd2wav_LDADD = libSDLmac.a diff --git a/maclib/Makefile.in b/maclib/Makefile.in new file mode 100644 index 0000000..91821e1 --- /dev/null +++ b/maclib/Makefile.in @@ -0,0 +1,321 @@ +# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +CXX = @CXX@ +GAME_INSTALLDIR = @GAME_INSTALLDIR@ +ICONOBJ = @ICONOBJ@ +INETLIB = @INETLIB@ +MAKEINFO = @MAKEINFO@ +MATHLIB = @MATHLIB@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +VERSION = @VERSION@ + +noinst_LIBRARIES = libSDLmac.a + +libSDLmac_a_SOURCES = Mac_Compat.h Mac_FontServ.cpp Mac_FontServ.h Mac_Resource.cpp Mac_Resource.h Mac_Sound.cpp Mac_Sound.h Mac_Wave.cpp Mac_Wave.h applefile.h macbinary.h bitesex.h + + +noinst_PROGRAMS = macres playwave snd2wav + +macres_SOURCES = macres.cpp +macres_LDADD = libSDLmac.a + +playwave_SOURCES = playwave.cpp +playwave_LDADD = libSDLmac.a + +snd2wav_SOURCES = snd2wav.cpp +snd2wav_LDADD = libSDLmac.a +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +libSDLmac_a_LIBADD = +libSDLmac_a_OBJECTS = Mac_FontServ.o Mac_Resource.o Mac_Sound.o \ +Mac_Wave.o +AR = ar +PROGRAMS = $(noinst_PROGRAMS) + +macres_OBJECTS = macres.o +macres_DEPENDENCIES = libSDLmac.a +macres_LDFLAGS = +playwave_OBJECTS = playwave.o +playwave_DEPENDENCIES = libSDLmac.a +playwave_LDFLAGS = +snd2wav_OBJECTS = snd2wav.o +snd2wav_DEPENDENCIES = libSDLmac.a +snd2wav_LDFLAGS = +CXXFLAGS = @CXXFLAGS@ +CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = README COPYING Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +SOURCES = $(libSDLmac_a_SOURCES) $(macres_SOURCES) $(playwave_SOURCES) $(snd2wav_SOURCES) +OBJECTS = $(libSDLmac_a_OBJECTS) $(macres_OBJECTS) $(playwave_OBJECTS) $(snd2wav_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .cpp .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps maclib/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstLIBRARIES: + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +distclean-noinstLIBRARIES: + +maintainer-clean-noinstLIBRARIES: + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +libSDLmac.a: $(libSDLmac_a_OBJECTS) $(libSDLmac_a_DEPENDENCIES) + -rm -f libSDLmac.a + $(AR) cru libSDLmac.a $(libSDLmac_a_OBJECTS) $(libSDLmac_a_LIBADD) + $(RANLIB) libSDLmac.a + +mostlyclean-noinstPROGRAMS: + +clean-noinstPROGRAMS: + -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) + +distclean-noinstPROGRAMS: + +maintainer-clean-noinstPROGRAMS: + +macres: $(macres_OBJECTS) $(macres_DEPENDENCIES) + @rm -f macres + $(CXXLINK) $(macres_LDFLAGS) $(macres_OBJECTS) $(macres_LDADD) $(LIBS) + +playwave: $(playwave_OBJECTS) $(playwave_DEPENDENCIES) + @rm -f playwave + $(CXXLINK) $(playwave_LDFLAGS) $(playwave_OBJECTS) $(playwave_LDADD) $(LIBS) + +snd2wav: $(snd2wav_OBJECTS) $(snd2wav_DEPENDENCIES) + @rm -f snd2wav + $(CXXLINK) $(snd2wav_LDFLAGS) $(snd2wav_OBJECTS) $(snd2wav_LDADD) $(LIBS) +.cpp.o: + $(CXXCOMPILE) -c $< + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = maclib + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile $(LIBRARIES) $(PROGRAMS) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ + mostlyclean-noinstPROGRAMS mostlyclean-tags \ + mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-noinstLIBRARIES clean-compile clean-noinstPROGRAMS \ + clean-tags clean-generic mostlyclean-am + +clean: clean-am + +distclean-am: distclean-noinstLIBRARIES distclean-compile \ + distclean-noinstPROGRAMS distclean-tags \ + distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ + maintainer-clean-compile \ + maintainer-clean-noinstPROGRAMS maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ +clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile mostlyclean-noinstPROGRAMS \ +distclean-noinstPROGRAMS clean-noinstPROGRAMS \ +maintainer-clean-noinstPROGRAMS tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/maclib/README b/maclib/README new file mode 100644 index 0000000..731ed27 --- /dev/null +++ b/maclib/README @@ -0,0 +1,35 @@ + + +This directory contains C++ classes that make Macintosh resource forks useful +for programs running on other operating systems: + + Mac_Compat.h + A header with some inline Macintosh compatibility functions. + + Mac_Resource.h + A class for reading data from a Macintosh resource fork. + + Mac_FontServ.h + A class for loading Macintosh bitmap fonts and using them + to convert text to sprites suitable for blitting to a FrameBuf. + + Mac_Wave.h + A class for converting WAVE files and Macintosh 'snd ' + resources into a WAVE chunk of a particular frequency. + + Mac_Sound.h + A class that takes a sounds from a Macintosh resource fork + and becomes an audio server, playing them on 4 channels. + + macres.cc + A program to list and optionally extract resources from + a Macintosh resource fork file. + + playwave.cc + A program to play a WAVE file using the SDL library. + + snd2wav.cc + A program to convert a file full of Macintosh sound resources + to WAVE files, named "snd_N.wav" where N is the number of the + sound resource in the resource fork file. + diff --git a/maclib/applefile.h b/maclib/applefile.h new file mode 100644 index 0000000..f9c3a24 --- /dev/null +++ b/maclib/applefile.h @@ -0,0 +1,342 @@ + +/* + The file is written by Lee Jones. Distribution is unlimited. +*/ + +/* applefile.h - Data structures used by AppleSingle/AppleDouble + * file format + * + * Written by Lee Jones, 22-Oct-1993 + * + * For definitive information, see "AppleSingle/AppleDouble + * Formats for Foreign Files Developer's Note"; Apple Computer + * Inc.; (c) 1990. + * + * Other details were added from: + * Inside Macintosh [old version], volumes II to VI, + * Apple include files supplied with Think C 5.0.1, + * Microsoft MS-DOS Programmer's Reference, version 5, and + * Microsoft C 6.00a's dos.h include file. + * + * I don't have ProDOS or AFP Server documentation so related + * entries may be a bit skimpy. + * + * Edit history: + * + * when who why + * --------- --- ------------------------------------------ + * 22-Oct-93 LMJ Pull together from Inside Macintosh, + * Developer's Note, etc + * 26-Oct-93 LMJ Finish writing first version and list + * references + * 06-Feb-94 EEF Very minor cleanup + */ + +/* REMINDER: the Motorola 680x0 is a big-endian architecture! */ + +typedef Uint32 OSType; /* 32 bit field */ + +/* In the QuickDraw coordinate plane, each coordinate is + * -32767..32767. Each point is at the intersection of a + * horizontal grid line and a vertical grid line. Horizontal + * coordinates increase from left to right. Vertical + * coordinates increase from top to bottom. This is the way + * both a TV screen and page of English text are scanned: + * from top left to bottom right. + */ + +struct Point /* spot in QuickDraw 2-D grid */ +{ + Sint16 v; /* vertical coordinate */ + Sint16 h; /* horizontal coordinate */ +}; /* Point */ + +typedef struct Point Point; + +/* See older Inside Macintosh, Volume II page 84 or Volume IV + * page 104. + */ + +struct FInfo /* Finder information */ +{ + OSType fdType; /* File type, 4 ASCII chars */ + OSType fdCreator; /* File's creator, 4 ASCII chars */ + Uint16 fdFlags; /* Finder flag bits */ + Point fdLocation; /* file's location in folder */ + Sint16 fdFldr; /* file 's folder (aka window) */ +}; /* FInfo */ + +typedef struct FInfo FInfo; + +/* + * Masks for finder flag bits (field fdFlags in struct + * FInfo). + */ + +#define F_fOnDesk 0x0001 /* file is on desktop (HFS only) */ +#define F_maskColor 0x000E /* color coding (3 bits) */ +/* 0x0010 /* reserved (System 7) */ +#define F_fSwitchLaunch 0x0020 /* reserved (System 7) */ +#define F_fShared 0x0040 /* appl available to multiple users */ +#define F_fNoINITs 0x0080 /* file contains no INIT resources */ +#define F_fBeenInited 0x0100 /* Finder has loaded bundle res. */ +/* 0x0200 /* reserved (System 7) */ +#define F_fCustomIcom 0x0400 /* file contains custom icon */ +#define F_fStationary 0x0800 /* file is a stationary pad */ +#define F_fNameLocked 0x1000 /* file can't be renamed by Finder */ +#define F_fHasBundle 0x2000 /* file has a bundle */ +#define F_fInvisible 0x4000 /* file's icon is invisible */ +#define F_fAlias 0x8000 /* file is an alias file (System 7) */ + +/* See older Inside Macintosh, Volume IV, page 105. + */ + +struct FXInfo /* Extended finder information */ + +{ + Sint16 fdIconID; /* icon ID number */ + Sint16 fdUnused[3]; /* spare */ + Sint8 fdScript; /* scrip flag and code */ + Sint8 fdXFlags; /* reserved */ + Sint16 fdComment; /* comment ID number */ + Sint32 fdPutAway; /* home directory ID */ +}; /* FXInfo */ + +typedef struct FXInfo FXInfo; + +/* Pieces used by AppleSingle & AppleDouble (defined later). */ + +struct ASHeader /* header portion of AppleSingle */ +{ + /* AppleSingle = 0x00051600; AppleDouble = 0x00051607 */ + Uint32 magicNum; /* internal file type tag */ + Uint32 versionNum; /* format version: 2 = 0x00020000 */ + Uint8 filler[16]; /* filler, currently all bits 0 */ + Uint16 numEntries; /* number of entries which follow */ +}; /* ASHeader */ + +typedef struct ASHeader ASHeader; + +struct ASEntry /* one AppleSingle entry descriptor */ +{ + Uint32 entryID; /* entry type: see list, 0 invalid */ + Uint32 entryOffset; /* offset, in octets, from beginning */ + /* of file to this entry's data */ + Uint32 entryLength; /* length of data in octets */ +}; /* ASEntry */ + +typedef struct ASEntry ASEntry; + +/* Apple reserves the range of entry IDs from 1 to 0x7FFFFFFF. + * Entry ID 0 is invalid. The rest of the range is available + * for applications to define their own entry types. "Apple does + * not arbitrate the use of the rest of the range." + */ + +#define AS_DATA 1 /* data fork */ +#define AS_RESOURCE 2 /* resource fork */ +#define AS_REALNAME 3 /* File's name on home file system */ +#define AS_COMMENT 4 /* standard Mac comment */ +#define AS_ICONBW 5 /* Mac black & white icon */ +#define AS_ICONCOLOR 6 /* Mac color icon */ + /* 7 /* not used */ +#define AS_FILEDATES 8 /* file dates; create, modify, etc */ +#define AS_FINDERINFO 9 /* Mac Finder info & extended info */ +#define AS_MACINFO 10 /* Mac file info, attributes, etc */ +#define AS_PRODOSINFO 11 /* Pro-DOS file info, attrib., etc */ +#define AS_MSDOSINFO 12 /* MS-DOS file info, attributes, etc */ +#define AS_AFPNAME 13 /* Short name on AFP server */ +#define AS_AFPINFO 14 /* AFP file info, attrib., etc */ + +#define AS_AFPDIRID 15 /* AFP directory ID */ + +/* matrix of entry types and their usage: + * + * Macintosh Pro-DOS MS-DOS AFP server + * --------- ------- ------ ---------- + * 1 AS_DATA xxx xxx xxx xxx + * 2 AS_RESOURCE xxx xxx + * 3 AS_REALNAME xxx xxx xxx xxx + * + * 4 AS_COMMENT xxx + * 5 AS_ICONBW xxx + * 6 AS_ICONCOLOR xxx + * + * 8 AS_FILEDATES xxx xxx xxx xxx + * 9 AS_FINDERINFO xxx + * 10 AS_MACINFO xxx + * + * 11 AS_PRODOSINFO xxx + * 12 AS_MSDOSINFO xxx + * + * 13 AS_AFPNAME xxx + * 14 AS_AFPINFO xxx + * 15 AS_AFPDIRID xxx + */ + +/* entry ID 1, data fork of file - arbitrary length octet string */ + +/* entry ID 2, resource fork - arbitrary length opaque octet string; + * as created and managed by Mac O.S. resoure manager + */ + +/* entry ID 3, file's name as created on home file system - arbitrary + * length octet string; usually short, printable ASCII + */ + +/* entry ID 4, standard Macintosh comment - arbitrary length octet + * string; printable ASCII, claimed 200 chars or less + */ + +/* This is probably a simple duplicate of the 128 octet bitmap + * stored as the 'ICON' resource or the icon element from an 'ICN#' + * resource. + */ + +struct ASIconBW /* entry ID 5, standard Mac black and white icon */ +{ + Uint32 bitrow[32]; /* 32 rows of 32 1-bit pixels */ +}; /* ASIconBW */ + +typedef struct ASIconBW ASIconBW; + +/* entry ID 6, "standard" Macintosh color icon - several competing + * color icons are defined. Given the copyright dates + * of the Inside Macintosh volumes, the 'cicn' resource predominated + * when the AppleSingle Developer's Note was written (most probable + * candidate). See Inside Macintosh, Volume V, pages 64 & 80-81 for + * a description of 'cicn' resources. + * + * With System 7, Apple introduced icon families. They consist of: + * large (32x32) B&W icon, 1-bit/pixel, type 'ICN#', + * small (16x16) B&W icon, 1-bit/pixel, type 'ics#', + * large (32x32) color icon, 4-bits/pixel, type 'icl4', + * small (16x16) color icon, 4-bits/pixel, type 'ics4', + * large (32x32) color icon, 8-bits/pixel, type 'icl8', and + * small (16x16) color icon, 8-bits/pixel, type 'ics8'. + * If entry ID 6 is one of these, take your pick. See Inside + * Macintosh, Volume VI, pages 2-18 to 2-22 and 9-9 to 9-13, for + * descriptions. + */ + +/* entry ID 7, not used */ + +/* Times are stored as a "signed number of seconds before of after + * 12:00 a.m. (midnight), January 1, 2000 Greenwich Mean Time (GMT). + * Applications must convert to their native date and time + * conventions." Any unknown entries are set to 0x80000000 + * (earliest reasonable time). + */ + +struct ASFileDates /* entry ID 8, file dates info */ +{ + Sint32 create; /* file creation date/time */ + Sint32 modify; /* last modification date/time */ + Sint32 backup; /* last backup date/time */ + Sint32 access; /* last access date/time */ +}; /* ASFileDates */ + +typedef struct ASFileDates ASFileDates; + +/* See older Inside Macintosh, Volume II, page 115 for + * PBGetFileInfo(), and Volume IV, page 155, for PBGetCatInfo(). + */ + +/* entry ID 9, Macintosh Finder info & extended info */ +struct ASFinderInfo +{ + FInfo ioFlFndrInfo; /* PBGetFileInfo() or PBGetCatInfo() */ + FXInfo ioFlXFndrInfo; /* PBGetCatInfo() (HFS only) */ +}; /* ASFinderInfo */ + +typedef struct ASFinderInfo ASFinderInfo; + +struct ASMacInfo /* entry ID 10, Macintosh file information */ +{ + Uint8 filler[3]; /* filler, currently all bits 0 */ + Uint8 ioFlAttrib; /* PBGetFileInfo() or PBGetCatInfo() */ +}; /* ASMacInfo */ + +typedef struct ASMacInfo ASMacInfo; + +#define AS_PROTECTED 0x0002 /* protected bit */ +#define AS_LOCKED 0x0001 /* locked bit */ + +/* NOTE: ProDOS-16 and GS/OS use entire fields. ProDOS-8 uses low + * order half of each item (low byte in access & filetype, low word + * in auxtype); remainder of each field should be zero filled. + */ + +struct ASProdosInfo /* entry ID 11, ProDOS file information */ +{ + Uint16 access; /* access word */ + Uint16 filetype; /* file type of original file */ + Uint32 auxtype; /* auxiliary type of the orig file */ +}; /* ASProDosInfo */ + +typedef struct ASProdosInfo ASProdosInfo; + +/* MS-DOS file attributes occupy 1 octet; since the Developer Note + * is unspecific, I've placed them in the low order portion of the + * field (based on example of other ASMacInfo & ASProdosInfo). + */ + +struct ASMsdosInfo /* entry ID 12, MS-DOS file information */ +{ + Uint8 filler; /* filler, currently all bits 0 */ + Uint8 attr; /* _dos_getfileattr(), MS-DOS */ + /* interrupt 21h function 4300h */ +}; /* ASMsdosInfo */ + +typedef struct ASMsdosInfo ASMsdosInfo; + +#define AS_DOS_NORMAL 0x00 /* normal file (all bits clear) */ +#define AS_DOS_READONLY 0x01 /* file is read-only */ +#define AS_DOS_HIDDEN 0x02 /* hidden file (not shown by DIR) */ +#define AS_DOS_SYSTEM 0x04 /* system file (not shown by DIR) */ +#define AS_DOS_VOLID 0x08 /* volume label (only in root dir) */ +#define AS_DOS_SUBDIR 0x10 /* file is a subdirectory */ +#define AS_DOS_ARCHIVE 0x20 /* new or modified (needs backup) */ + +/* entry ID 13, short file name on AFP server - arbitrary length + * octet string; usualy printable ASCII starting with + * '!' (0x21) + */ + +struct ASAfpInfo /* entry ID 12, AFP server file information */ +{ + Uint8 filler[3]; /* filler, currently all bits 0 */ + Uint8 attr; /* file attributes */ +}; /* ASAfpInfo */ + +typedef struct ASAfpInfo ASAfpInfo; + +#define AS_AFP_Invisible 0x01 /* file is invisible */ +#define AS_AFP_MultiUser 0x02 /* simultaneous access allowed */ +#define AS_AFP_System 0x04 /* system file */ +#define AS_AFP_BackupNeeded 0x40 /* new or modified (needs backup) */ + +struct ASAfpDirId /* entry ID 15, AFP server directory ID */ +{ + Uint32 dirid; /* file's directory ID on AFP server */ +}; /* ASAfpDirId */ + +typedef struct ASAfpDirId ASAfpDirId; + +/* + * The format of an AppleSingle/AppleDouble header + */ +struct AppleSingle /* format of disk file */ +{ + ASHeader header; /* AppleSingle header part */ + ASEntry entry[1]; /* array of entry descriptors */ +/* Uint8 filedata[]; /* followed by rest of file */ +}; /* AppleSingle */ + +typedef struct AppleSingle AppleSingle; + +/* + * FINAL REMINDER: the Motorola 680x0 is a big-endian architecture! + */ + +/* End of applefile.h */ diff --git a/maclib/bitesex.h b/maclib/bitesex.h new file mode 100644 index 0000000..1fbeb86 --- /dev/null +++ b/maclib/bitesex.h @@ -0,0 +1,19 @@ +#ifndef _bitesex_h +#define _bitesex_h + +#include "SDL_endian.h" + +#define bytesex32(x) (x = SDL_SwapBE32(x)) +#define bytesex16(x) (x = SDL_SwapBE16(x)) + +/* Swap bytes from big-endian to this machine's type. + The input data is assumed to be always in big-endian format. +*/ +static inline void +byteswap(Uint16 *array, int nshorts) +{ + for (; nshorts-- > 0; array++) + bytesex16(*array); +} + +#endif /* _bitesex_h */ diff --git a/maclib/macbinary.h b/maclib/macbinary.h new file mode 100644 index 0000000..63997b9 --- /dev/null +++ b/maclib/macbinary.h @@ -0,0 +1,62 @@ +/* + MACLIB: A companion library to SDL for working with Macintosh (tm) data + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* This is the general format of a MacBinary archive + This information is taken from /usr/share/magic - thanks! :) + Verified by looking at: + http://www.lazerware.com/formats/macbinary/macbinary.html +*/ + +/* This uses a class because the data doesn't align properly as a struct */ + +class MBHeader +{ +public: + MBHeader() { } + + Uint16 Version() const { + Uint16 version = (data[122] << 0) | + (data[123] << 8); + return version; + } + + Uint32 DataLength() const { + Uint32 length = (data[83] << 0) | + (data[84] << 8) | + (data[85] << 16) | + (data[86] << 24); + return length; + } + + Uint32 ResourceLength() const { + Uint32 length = (data[87] << 0) | + (data[88] << 8) | + (data[89] << 16) | + (data[90] << 24); + return length; + } + +public: + Uint8 data[128]; +}; diff --git a/maclib/macres.cpp b/maclib/macres.cpp new file mode 100644 index 0000000..756a9e9 --- /dev/null +++ b/maclib/macres.cpp @@ -0,0 +1,77 @@ +/* + MACRES: A program to extract data from Macintosh (tm) resource forks + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* Test program to list and extract Macintosh resources from a resource fork */ + +#include + +#include "SDL.h" +#include "Mac_Resource.h" + +int main(int argc, char *argv[]) +{ + Mac_Resource *res; + char **types; + Uint16 *ids; + int i, j; + + if ( ! argv[1] ) { + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(1); + } + + res = new Mac_Resource(argv[1]); + if ( res->Error() ) { + fprintf(stderr, "Mac_Resource: %s\n", res->Error()); + delete res; + exit(2); + } + + types = res->Types(); + for ( i=0; types[i]; ++i ) { + ids = res->ResourceIDs(types[i]); + printf("Resource set: type = '%s', contains %hd resources\n", + types[i], res->NumResources(types[i])); + for ( j=0; ids[j] < 0xFFFF; ++j ) { + printf("\tResource %hu (ID = %d): \"%s\"\n", j+1, + ids[j], res->ResourceName(types[i], ids[j])); + if ( argv[2] ) { + char path[23]; + sprintf(path,"%s/%s:%hu", argv[2], + types[i], ids[j]); + FILE *output; + Mac_ResData *D; + if ( (output=fopen(path, "w")) != NULL ) { + D = res->Resource(types[i], ids[j]); + fwrite(D->data, D->length, 1, output); + fclose(output); + } + } + } + delete[] ids; + } + delete[] types; + delete res; + exit(0); +} diff --git a/maclib/playwave.cpp b/maclib/playwave.cpp new file mode 100644 index 0000000..1e0b790 --- /dev/null +++ b/maclib/playwave.cpp @@ -0,0 +1,176 @@ +/* + PLAYWAVE: A WAVE file player using the maclib and SDL libraries + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* Very simple WAVE player */ + +#include +#include +#include + +#include "SDL.h" +#include "SDL_audio.h" +#include "SDL_mutex.h" +#include "Mac_Wave.h" + +static SDL_mutex *done; +static Wave *wave; +static Uint8 silence; + +void fillerup(void *unused, Uint8 *stream, int len) +{ + Sint32 waveleft; + + /* Are we done? */ + if ( wave->DataLeft() == 0 ) { + memset(stream, silence, len); + SDL_mutexV(done); + return; + } + + /* Fill streaming buffer */ + waveleft = wave->DataLeft(); + if ( waveleft > len ) + waveleft = len; + memcpy(stream, wave->Data(), waveleft); + wave->Forward(waveleft); +} + +void CleanUp(int status) +{ + SDL_CloseAudio(); + SDL_DestroyMutex(done); + SDL_Quit(); + delete wave; + exit(status); +} + +int main(int argc, char *argv[]) +{ + Mac_Resource *macx; + Mac_ResData *snd; + SDL_AudioSpec *spec; + Uint16 rate; + + if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) { + fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); + exit(1); + } + rate = 0; + if ( (argc >= 3) && (strcmp(argv[1], "-rate") == 0) ) { + int i; + rate = (Uint16)atoi(argv[2]); + for ( i=3; argv[i]; ++i ) { + argv[i-2] = argv[i]; + } + argv[i-2] = NULL; + argc -= 2; + } + switch (argc) { + case 2: + /* Load the wave file into memory */ + wave = new Wave(argv[1], rate); + if ( wave->Error() ) { + fprintf(stderr, "%s\n", wave->Error()); + delete wave; + exit(255); + } + break; + case 3: + macx = new Mac_Resource(argv[1]); + if ( macx->Error() ) { + fprintf(stderr, "%s\n", macx->Error()); + delete macx; + exit(255); + } + if ( (argv[2][0] >= '0') && (argv[2][0] <= '9') ) + snd = macx->Resource("snd ", atoi(argv[2])); + else + snd = macx->Resource("snd ", argv[2]); + if ( snd == NULL ) { + fprintf(stderr, "%s\n", macx->Error()); + delete macx; + exit(255); + } + wave = new Wave(snd, rate); + delete macx; + if ( wave->Error() ) { + fprintf(stderr, "%s\n", wave->Error()); + delete wave; + exit(255); + } + break; + default: + fprintf(stderr, "Usage: %s [-rate ] \n", argv[0]); + fprintf(stderr, "or..\n"); + fprintf(stderr, " %s [-rate ] [soundnum]\n", + argv[0]); + exit(1); + } + spec = wave->Spec(); + silence = ((spec->format&AUDIO_U8) ? 0x80 : 0x00); + spec->callback = fillerup; + +#ifdef SAVE_THE_WAVES + if ( wave->Save("save.wav") < 0 ) + fprintf(stderr, "Warning: %s\n", wave->Error()); +#endif + + /* Create a semaphore to wait for end of play */ + done=SDL_CreateMutex(); + if ( done == NULL ) { + fprintf(stderr, "%s\n", SDL_GetError()); + SDL_Quit(); + exit(255); + } + SDL_mutexP(done); /* Prime it for blocking */ + + /* Set the signals */ +#ifdef SIGHUP + signal(SIGHUP, CleanUp); +#endif + signal(SIGINT, CleanUp); +#ifdef SIGQUIT + signal(SIGQUIT, CleanUp); +#endif + signal(SIGTERM, CleanUp); + + /* Show what audio format we're playing */ + printf("Playing %#.2f seconds (%d bit %s) at %lu Hz\n", + (double)(wave->DataLeft()/wave->SampleSize())/wave->Frequency(), + wave->BitsPerSample(), + wave->Stereo() ? "stereo" : "mono", wave->Frequency()); + + /* Start the audio device */ + if ( SDL_OpenAudio(spec, NULL) < 0 ) { + fprintf(stderr, "%s\n", SDL_GetError()); + CleanUp(255); + } + + /* Let the audio run, waiting until finished */ + SDL_PauseAudio(0); + SDL_mutexP(done); + + /* We're done! */ + CleanUp(0); +} diff --git a/maclib/snd2wav.cpp b/maclib/snd2wav.cpp new file mode 100644 index 0000000..987eb07 --- /dev/null +++ b/maclib/snd2wav.cpp @@ -0,0 +1,90 @@ +/* + SND2WAV: A program to convert Macintosh (tm) sound resources + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +/* A Macintosh sound resource converter */ + +#include +#include + +#include "Mac_Wave.h" + +static Wave wave; + +int main(int argc, char *argv[]) +{ + Mac_Resource *macx; + Mac_ResData *snd; + char wavname[128]; + Uint16 *ids, rate; + int i; + + rate = 0; + if ( (argc >= 3) && (strcmp(argv[1], "-rate") == 0) ) { + int i; + rate = (Uint16)atoi(argv[2]); + for ( i=3; argv[i]; ++i ) { + argv[i-2] = argv[i]; + } + argv[i-2] = NULL; + argc -= 2; + } + if ( argv[1] == NULL ) { + fprintf(stderr, + "Usage: %s [-rate ] [soundnum]\n", argv[0]); + exit(1); + } + + macx = new Mac_Resource(argv[1]); + if ( macx->Error() ) { + fprintf(stderr, "%s\n", macx->Error()); + delete macx; + exit(255); + } + if ( macx->NumResources("snd ") == 0 ) { + fprintf(stderr, "No sound resources in '%s'\n", argv[1]); + delete macx; + exit(1); + } + + /* If a specific resource is requested, save it alone */ + if ( argv[2] ) { + ids = new Uint16[2]; + ids[0] = atoi(argv[2]); + ids[1] = 0xFFFF; + } else + ids = macx->ResourceIDs("snd "); + + for ( i=0; ids[i] != 0xFFFF; ++i ) { + snd = macx->Resource("snd ", ids[i]); + if ( snd == NULL ) { + fprintf(stderr, "Warning: %s\n", macx->Error()); + continue; + } + wave.Load(snd, rate); + sprintf(wavname, "snd_%d.wav", ids[i]); + wave.Save(wavname); + } + delete macx; + exit(0); +} diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..7728c0b --- /dev/null +++ b/main.cpp @@ -0,0 +1,682 @@ +/* ------------------------------------------------------------- */ +/* */ +/* Maelstrom */ +/* By Andrew Welch */ +/* */ +/* Ported to Linux (Spring 1995) */ +/* Ported to Win95 (Fall 1996) -- not releasable */ +/* Ported to SDL (Fall 1997) */ +/* By Sam Lantinga (slouken@devolution.com) */ +/* */ +/* ------------------------------------------------------------- */ + +#include "Maelstrom_Globals.h" +#include "buttonlist.h" +#include "load.h" +#include "fastrand.h" +#include "checksum.h" + +/* External functions used in this file */ +extern int DoInitializations(Uint32 video_flags); /* init.cc */ + +static char *Version = +"Maelstrom v1.4.3 (GPL version 3.0.6) -- 10/19/2002 by Sam Lantinga\n"; + +// Global variables set in this file... +int gStartLives; +int gStartLevel; +Bool gUpdateBuffer; +Bool gRunning; +int gNoDelay; + +// Local variables in this file... +static ButtonList buttons; + +// Local functions in this file... +static void DrawMainScreen(void); +static void DrawSoundLevel(void); +static void DrawKey(MPoint *pt, char *ch, char *str, void (*callback)(void)); + +// Main Menu actions: +static void RunDoAbout(void) +{ + gNoDelay = 0; + Delay(SOUND_DELAY); + sound->PlaySound(gNovaAppears, 5); + DoAbout(); +} +static void RunConfigureControls(void) +{ + Delay(SOUND_DELAY); + sound->PlaySound(gHomingAppears, 5); + ConfigureControls(); +} +static void RunPlayGame(void) +{ + gStartLives = 3; + gStartLevel = 1; + gNoDelay = 0; + sound->PlaySound(gNewLife, 5); + Delay(SOUND_DELAY); + NewGame(); + Message(NULL); /* Clear any messages */ +} +static void RunQuitGame(void) +{ + Delay(SOUND_DELAY); + sound->PlaySound(gMultiplierGone, 5); + while ( sound->Playing() ) + Delay(SOUND_DELAY); + gRunning = false; +} +static void IncrementSound(void) +{ + if ( gSoundLevel < 8 ) { + sound->Volume(++gSoundLevel); + sound->PlaySound(gNewLife, 5); + + /* -- Draw the new sound level */ + DrawSoundLevel(); + } +} +static void DecrementSound(void) +{ + if ( gSoundLevel > 0 ) { + sound->Volume(--gSoundLevel); + sound->PlaySound(gNewLife, 5); + + /* -- Draw the new sound level */ + DrawSoundLevel(); + } +} +static void SetSoundLevel(int volume) +{ + /* Make sure the device is working */ + sound->Volume(volume); + + /* Set the new sound level! */ + gSoundLevel = volume; + sound->PlaySound(gNewLife, 5); + + /* -- Draw the new sound level */ + DrawSoundLevel(); +} + +static void RunZapScores(void) +{ + Delay(SOUND_DELAY); + sound->PlaySound(gMultShotSound, 5); + if ( ZapHighScores() ) { + /* Fade the screen and redisplay scores */ + screen->Fade(); + Delay(SOUND_DELAY); + sound->PlaySound(gExplosionSound, 5); + gUpdateBuffer = true; + } +} + +/* ----------------------------------------------------------------- */ +/* -- Run a graphics speed test. */ +static void RunSpeedTest(void) +{ + const int test_reps = 100; /* How many full cycles to run */ + + Uint32 then, now; + int i, frame, x=((640/2)-16), y=((480/2)-16), onscreen=0; + + screen->Clear(); + then = SDL_GetTicks(); + for ( i=0; iClear(x, y, 32, 32); + } else { + onscreen = 1; + } + screen->QueueBlit(x, y, gPlayerShip->sprite[frame]); + screen->Update(); + } + } + now = SDL_GetTicks(); + mesg("Graphics speed test took %d microseconds per cycle.\r\n", + ((now-then)/test_reps)); +} + +/* ----------------------------------------------------------------- */ +/* -- Print a Usage message and quit. + In several places we depend on this function exiting. + */ +static char *progname; +void PrintUsage(void) +{ + error("\nUsage: %s [-netscores] -printscores\n", progname); + error("or\n"); + error("Usage: %s \n\n", progname); + error("Where can be any of:\n\n" +" -fullscreen # Run Maelstrom in full-screen mode\n" +" -gamma [0-8] # Set the gamma correction\n" +" -volume [0-8] # Set the sound volume\n" +" -netscores # Use the world-wide network score server\n" + ); + LogicUsage(); + error("\n"); + exit(1); +} + +/* ----------------------------------------------------------------- */ +/* -- Blitter main program */ +int main(int argc, char *argv[]) +{ + /* Command line flags */ + int doprinthigh = 0; + int speedtest = 0; + Uint32 video_flags = SDL_SWSURFACE; + + /* Normal variables */ + SDL_Event event; + LibPath::SetExePath(argv[0]); + +#ifndef __WIN95__ + /* The first thing we do is calculate our checksum */ + (void) checksum(); +#endif /* ! Win95 */ + + /* Seed the random number generator */ + SeedRandom(0L); + /* Initialize the controls */ + LoadControls(); + + /* Initialize game logic data structures */ + if ( InitLogicData() < 0 ) { + exit(1); + } + + /* Parse command line arguments */ + for ( progname=argv[0]; --argc; ++argv ) { + if ( strcmp(argv[1], "-fullscreen") == 0 ) { + video_flags |= SDL_FULLSCREEN; + } else + if ( strcmp(argv[1], "-gamma") == 0 ) { + int gammacorrect; + + if ( ! argv[2] ) { /* Print the current gamma */ + mesg("Current Gamma correction level: %d\n", + gGammaCorrect); + exit(0); + } + if ( (gammacorrect=atoi(argv[2])) < 0 || + gammacorrect > 8 ) { + error( + "Gamma correction value must be between 0 and 8. -- Exiting.\n"); + exit(1); + } + /* We need to update the gamma */ + gGammaCorrect = gammacorrect; + SaveControls(); + + ++argv; + --argc; + } + else if ( strcmp(argv[1], "-volume") == 0 ) { + int volume; + + if ( ! argv[2] ) { /* Print the current volume */ + mesg("Current volume level: %d\n", + gSoundLevel); + exit(0); + } + if ( (volume=atoi(argv[2])) < 0 || volume > 8 ) { + error( + "Volume must be a number between 0 and 8. -- Exiting.\n"); + exit(1); + } + /* We need to update the volume */ + gSoundLevel = volume; + SaveControls(); + + ++argv; + --argc; + } +#define CHECKSUM_DEBUG +#ifdef CHECKSUM_DEBUG + else if ( strcmp(argv[1], "-checksum") == 0 ) { + mesg("Checksum = %s\n", get_checksum(NULL, 0)); + exit(0); + } +#endif /* CHECKSUM_DEBUG */ + else if ( strcmp(argv[1], "-printscores") == 0 ) + doprinthigh = 1; + else if ( strcmp(argv[1], "-netscores") == 0 ) + gNetScores = 1; + else if ( strcmp(argv[1], "-speedtest") == 0 ) + speedtest = 1; + else if ( LogicParseArgs(&argv, &argc) == 0 ) { + /* LogicParseArgs() took care of everything */; + } else if ( strcmp(argv[1], "-version") == 0 ) { + error("%s", Version); + exit(0); + } else { + PrintUsage(); + } + } + + /* Do we just want the high scores? */ + if ( doprinthigh ) { + PrintHighScores(); + exit(0); + } + + /* Make sure we have a valid player list (netlogic) */ + if ( InitLogic() < 0 ) + exit(1); + + /* Initialize everything. :) */ + if ( DoInitializations(video_flags) < 0 ) { + /* An error message was already printed */ + exit(1); + } + + if ( speedtest ) { + RunSpeedTest(); + exit(0); + } + + gRunning = true; + sound->PlaySound(gNovaBoom, 5); + screen->Fade(); /* Fade-out */ + Delay(SOUND_DELAY); + gUpdateBuffer = true; + while ( sound->Playing() ) + Delay(SOUND_DELAY); + + while ( gRunning ) { + + /* Update the screen if necessary */ + if ( gUpdateBuffer ) + DrawMainScreen(); + + /* -- Get an event */ + screen->WaitEvent(&event); + + /* -- Handle it! */ + if ( event.type == SDL_KEYDOWN ) { + switch (event.key.keysym.sym) { + + /* -- Toggle fullscreen */ + case SDLK_RETURN: + if ( event.key.keysym.mod & KMOD_ALT ) + screen->ToggleFullScreen(); + break; + + /* -- About the game...*/ + case SDLK_a: + RunDoAbout(); + break; + + /* -- Configure the controls */ + case SDLK_c: + RunConfigureControls(); + break; + + /* -- Start the game */ + case SDLK_p: + RunPlayGame(); + break; + + /* -- Start the game */ + case SDLK_l: + Delay(SOUND_DELAY); + sound->PlaySound(gLuckySound, 5); + gStartLevel = GetStartLevel(); + if ( gStartLevel > 0 ) { + Delay(SOUND_DELAY); + sound->PlaySound(gNewLife, 5); + Delay(SOUND_DELAY); + NewGame(); + } + break; + + /* -- Let them leave */ + case SDLK_q: + RunQuitGame(); + break; + + /* -- Set the volume */ + /* (SDLK_0 - SDLK_8 are contiguous) */ + case SDLK_0: + case SDLK_1: + case SDLK_2: + case SDLK_3: + case SDLK_4: + case SDLK_5: + case SDLK_6: + case SDLK_7: + case SDLK_8: + SetSoundLevel(event.key.keysym.sym + - SDLK_0); + break; + + /* -- Give 'em a little taste of the peppers */ + case SDLK_x: + Delay(SOUND_DELAY); + sound->PlaySound(gEnemyAppears, 5); + ShowDawn(); + break; + + /* -- Zap the high scores */ + case SDLK_z: + RunZapScores(); + break; + + /* -- Create a screen dump of high scores */ + case SDLK_F3: + screen->ScreenDump("ScoreDump", + 64, 48, 298, 384); + break; + + // Ignore Shift, Ctrl, Alt keys + case SDLK_LSHIFT: + case SDLK_RSHIFT: + case SDLK_LCTRL: + case SDLK_RCTRL: + case SDLK_LALT: + case SDLK_RALT: + break; + + // Dink! :-) + default: + Delay(SOUND_DELAY); + sound->PlaySound(gSteelHit, 5); + break; + } + } else + /* -- Handle mouse clicks */ + if ( event.type == SDL_MOUSEBUTTONDOWN ) { + buttons.Activate_Button(event.button.x, + event.button.y); + } else + /* -- Handle window close requests */ + if ( event.type == SDL_QUIT ) { + RunQuitGame(); + } + } + screen->Fade(); + Delay(60); + return(0); +} /* -- main */ + + +int DrawText(int x, int y, char *text, MFont *font, Uint8 style, + Uint8 R, Uint8 G, Uint8 B) +{ + SDL_Surface *textimage; + int width; + + textimage = fontserv->TextImage(text, font, style, R, G, B); + if ( textimage == NULL ) { + width = 0; + } else { + screen->QueueBlit(x, y-textimage->h+2, textimage, NOCLIP); + width = textimage->w; + fontserv->FreeText(textimage); + } + return(width); +} + + +/* ----------------------------------------------------------------- */ +/* -- Draw the current sound volume */ +static void DrawSoundLevel(void) +{ + static int need_init=1; + static MFont *geneva; + static char text[12]; + static int xOff, yOff; + + if ( need_init ) { + if ( (geneva = fontserv->NewFont("Geneva", 9)) == NULL ) { + error("Can't use Geneva font! -- Exiting.\n"); + exit(255); + } + xOff = (SCREEN_WIDTH - 512) / 2; + yOff = (SCREEN_HEIGHT - 384) / 2; + need_init = 0; + } else { + DrawText(xOff+309-7, yOff+240-6, text, geneva, STYLE_BOLD, + 0x00, 0x00, 0x00); + } + sprintf(text, "%d", gSoundLevel); + DrawText(xOff+309-7, yOff+240-6, text, geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + screen->Update(); +} /* -- DrawSoundLevel */ + + +/* ----------------------------------------------------------------- */ +/* -- Draw the main screen */ + +void DrawMainScreen(void) +{ + SDL_Surface *title; + MFont *font, *bigfont; + MPoint pt; + Uint16 width, height; + Uint16 xOff, yOff, botDiv, rightDiv; + Uint16 index, sRt, wRt, sw; + Uint32 clr, ltClr, ltrClr; + char buffer[128]; + int offset; + + gUpdateBuffer = false; + buttons.Delete_Buttons(); + + width = 512; + height = 384; + xOff = (SCREEN_WIDTH - width) / 2; + yOff = (SCREEN_HEIGHT - height) / 2; + + title = Load_Title(screen, 129); + if ( title == NULL ) { + error("Can't load 'title' title! (ID=%d)\n", 129); + exit(255); + } + + clr = screen->MapRGB(30000>>8, 30000>>8, 0xFF); + ltClr = screen->MapRGB(40000>>8, 40000>>8, 0xFF); + ltrClr = screen->MapRGB(50000>>8, 50000>>8, 0xFF); + + screen->Lock(); + screen->Clear(); + /* -- Draw the screen frame */ + screen->DrawRect(xOff-1, yOff-1, width+2, height+2, clr); + screen->DrawRect(xOff-2, yOff-2, width+4, height+4, clr); + screen->DrawRect(xOff-3, yOff-3, width+6, height+6, ltClr); + screen->DrawRect(xOff-4, yOff-4, width+8, height+8, ltClr); + screen->DrawRect(xOff-5, yOff-5, width+10, height+10, ltrClr); + screen->DrawRect(xOff-6, yOff-6, width+12, height+12, ltClr); + screen->DrawRect(xOff-7, yOff-7, width+14, height+14, clr); + /* -- Draw the dividers */ + botDiv = yOff + 5 + title->h + 5; + rightDiv = xOff + 5 + title->w + 5; + screen->DrawLine(rightDiv, yOff, rightDiv, yOff+height, ltClr); + screen->DrawLine(xOff, botDiv, rightDiv, botDiv, ltClr); + screen->DrawLine(rightDiv, 263+yOff, xOff+width, 263+yOff, ltClr); + /* -- Draw the title image */ + screen->Unlock(); + screen->QueueBlit(xOff+5, yOff+5, title, NOCLIP); + screen->Update(); + screen->FreeImage(title); + + + /* -- Draw the high scores */ + + /* -- First the headings -- fontserv() isn't elegant, but hey.. */ + if ( (bigfont = fontserv->NewFont("New York", 18)) == NULL ) { + error("Can't use New York (18) font! -- Exiting.\n"); + exit(255); + } + DrawText(xOff+5, botDiv+22, "Name", bigfont, STYLE_ULINE, + 0xFF, 0xFF, 0x00); + sRt = xOff+185; + DrawText(sRt, botDiv+22, "Score", bigfont, STYLE_ULINE, + 0xFF, 0xFF, 0x00); + sRt += fontserv->TextWidth("Score", bigfont, STYLE_ULINE); + wRt = xOff+245; + DrawText(wRt, botDiv+22, "Wave", bigfont, STYLE_ULINE, + 0xFF, 0xFF, 0x00); + wRt += fontserv->TextWidth("Wave", bigfont, STYLE_ULINE)-10; + + /* -- Now the scores */ + LoadScores(); + if ( (font = fontserv->NewFont("New York", 14)) == NULL ) { + error("Can't use New York (14) font! -- Exiting.\n"); + exit(255); + } + + for (index = 0; index < 10; index++) { + Uint8 R, G, B; + + if ( gLastHigh == index ) { + R = 0xFF; + G = 0xFF; + B = 0xFF; + } else { + R = 30000>>8; + G = 30000>>8; + B = 30000>>8; + } + DrawText(xOff+5, botDiv+42+(index*18), hScores[index].name, + font, STYLE_BOLD, R, G, B); + sprintf(buffer, "%u", hScores[index].score); + sw = fontserv->TextWidth(buffer, font, STYLE_BOLD); + DrawText(sRt-sw, botDiv+42+(index*18), buffer, + font, STYLE_BOLD, R, G, B); + sprintf(buffer, "%u", hScores[index].wave); + sw = fontserv->TextWidth(buffer, font, STYLE_BOLD); + DrawText(wRt-sw, botDiv+42+(index*18), buffer, + font, STYLE_BOLD, R, G, B); + } + delete font; + + DrawText(xOff+5, botDiv+46+(10*18)+3, "Last Score: ", + bigfont, STYLE_NORM, 0xFF, 0xFF, 0xFF); + sprintf(buffer, "%d", GetScore()); + sw = fontserv->TextWidth("Last Score: ", bigfont, STYLE_NORM); + DrawText(xOff+5+sw, botDiv+46+(index*18)+3, buffer, + bigfont, STYLE_NORM, 0xFF, 0xFF, 0xFF); + delete bigfont; + + /* -- Draw the Instructions */ + offset = 34; + + pt.h = rightDiv + 10; + pt.v = yOff + 10; + DrawKey(&pt, "P", " Start playing Maelstrom", RunPlayGame); + + pt.h = rightDiv + 10; + pt.v += offset; + DrawKey(&pt, "C", " Configure the game controls", RunConfigureControls); + + pt.h = rightDiv + 10; + pt.v += offset; + DrawKey(&pt, "Z", " Zap the high scores", RunZapScores); + + pt.h = rightDiv + 10; + pt.v += offset; + DrawKey(&pt, "A", " About Maelstrom...", RunDoAbout); + + pt.v += offset; + + pt.h = rightDiv + 10; + pt.v += offset; + DrawKey(&pt, "Q", " Quit Maelstrom", RunQuitGame); + + pt.h = rightDiv + 10; + pt.v += offset; + DrawKey(&pt, "0", " ", DecrementSound); + + if ( (font = fontserv->NewFont("Geneva", 9)) == NULL ) { + error("Can't use Geneva font! -- Exiting.\n"); + exit(255); + } + DrawText(pt.h+gKeyIcon->w+3, pt.v+19, "-", + font, STYLE_NORM, 0xFF, 0xFF, 0x00); + + pt.h = rightDiv + 50; + DrawKey(&pt, "8", " Set Sound Volume", IncrementSound); + +/* -- Draw the credits */ + + DrawText(xOff+5+68, yOff+5+127, "Port to Linux by Sam Lantinga", + font, STYLE_BOLD, 0xFF, 0xFF, 0x00); + DrawText(rightDiv+10, yOff+259, "©1992-4 Ambrosia Software, Inc.", + font, STYLE_BOLD, 0xFF, 0xFF, 0xFF); + +/* -- Draw the version number */ + + DrawText(xOff+20, yOff+151, VERSION_STRING, + font, STYLE_NORM, 0xFF, 0xFF, 0xFF); + delete font; + + DrawSoundLevel(); + + /* Always drawing while faded out -- fade in */ + screen->Update(); + screen->Fade(); +} /* -- DrawMainScreen */ + + + +/* ----------------------------------------------------------------- */ +/* -- Draw the key and its function */ + +static void DrawKey(MPoint *pt, char *key, char *text, void (*callback)(void)) +{ + MFont *geneva; + + if ( (geneva = fontserv->NewFont("Geneva", 9)) == NULL ) { + error("Can't use Geneva font! -- Exiting.\n"); + exit(255); + } + screen->QueueBlit(pt->h, pt->v, gKeyIcon); + screen->Update(); + + DrawText(pt->h+14, pt->v+20, key, geneva, STYLE_BOLD, 0xFF, 0xFF, 0xFF); + DrawText(pt->h+13, pt->v+19, key, geneva, STYLE_BOLD, 0x00, 0x00, 0x00); + DrawText(pt->h+gKeyIcon->w+3, pt->v+19, text, + geneva, STYLE_BOLD, 0xFF, 0xFF, 0x00); + delete geneva; + + buttons.Add_Button(pt->h, pt->v, gKeyIcon->w, gKeyIcon->h, callback); +} /* -- DrawKey */ + + +void Message(char *message) +{ + static MFont *font; + static int xOff; + static char *last_message; + + if ( ! last_message ) { /* Initialize everything */ + /* This was taken from the DrawMainScreen function */ + xOff = (SCREEN_WIDTH - 512) / 2; + + if ( (font = fontserv->NewFont("New York", 14)) == NULL ) { + error("Can't use New York(14) font! -- Exiting.\n"); + exit(255); + } + } else { + DrawText(xOff, 25, last_message, font, STYLE_BOLD, 0, 0, 0); + delete[] last_message; + } + if ( message ) { + DrawText(xOff, 25, message, font, STYLE_BOLD, 0xCC,0xCC,0xCC); + last_message = new char[strlen(message)+1]; + strcpy(last_message, message); + } else { + last_message = new char[1]; + last_message[0] = '\0'; + } + screen->Update(); +} + diff --git a/missing b/missing new file mode 100755 index 0000000..7789652 --- /dev/null +++ b/missing @@ -0,0 +1,190 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. +# Copyright (C) 1996, 1997 Free Software Foundation, Inc. +# Franc,ois Pinard , 1996. + +# 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 2, 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, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch]" + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing - GNU libit 0.0" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acinclude.m4' or \`configure.in'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`configure.in'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`acconfig.h' or \`configure.in'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is missing on your system. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and you do not seem to have it handy on your + system. You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequirements for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..4f58503 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/myerror.cpp b/myerror.cpp new file mode 100644 index 0000000..83bf1f8 --- /dev/null +++ b/myerror.cpp @@ -0,0 +1,47 @@ + +#ifndef _myerror_h +#define _myerror_h + +/* Generic error message routines */ + +#include +#include +#include +#include + + +void error(char *fmt, ...) +{ + char mesg[BUFSIZ]; + va_list ap; + + va_start(ap, fmt); + vsprintf(mesg, fmt, ap); + fputs(mesg, stderr); + va_end(ap); +} + +void mesg(char *fmt, ...) +{ + char mesg[BUFSIZ]; + va_list ap; + + va_start(ap, fmt); + vsprintf(mesg, fmt, ap); + fputs(mesg, stdout); + va_end(ap); +} + +void myperror(char *msg) +{ + char buffer[BUFSIZ]; + + if ( *msg ) { + sprintf(buffer, "%s: %s\n", msg, strerror(errno)); + error(buffer); + } else + error((char *)strerror(errno)); +} + +#endif /* _myerror_h */ + diff --git a/myerror.h b/myerror.h new file mode 100644 index 0000000..0dd8d97 --- /dev/null +++ b/myerror.h @@ -0,0 +1,12 @@ + +#ifndef _myerror_h +#define _myerror_h + +/* Generic error message routines */ + +extern void error(char *fmt, ...); +extern void mesg(char *fmt, ...); +extern void myperror(char *msg); + +#endif /* _myerror_h */ + diff --git a/netlogic/Makefile.am b/netlogic/Makefile.am new file mode 100644 index 0000000..1ddb28b --- /dev/null +++ b/netlogic/Makefile.am @@ -0,0 +1,22 @@ + +noinst_LIBRARIES = liblogic.a + +liblogic_a_SOURCES = \ + about.cpp \ + blit.cpp \ + game.cpp \ + globals.h \ + logic.cpp \ + make.cpp \ + make.h \ + netlogic.h \ + netplay.cpp \ + netplay.h \ + object.cpp \ + object.h \ + objects.cpp \ + objects.h \ + player.cpp \ + player.h \ + protocol.h \ + shinobi.h diff --git a/netlogic/Makefile.in b/netlogic/Makefile.in new file mode 100644 index 0000000..22083d1 --- /dev/null +++ b/netlogic/Makefile.in @@ -0,0 +1,273 @@ +# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +CXX = @CXX@ +GAME_INSTALLDIR = @GAME_INSTALLDIR@ +ICONOBJ = @ICONOBJ@ +INETLIB = @INETLIB@ +MAKEINFO = @MAKEINFO@ +MATHLIB = @MATHLIB@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +VERSION = @VERSION@ + +noinst_LIBRARIES = liblogic.a + +liblogic_a_SOURCES = about.cpp blit.cpp game.cpp globals.h logic.cpp make.cpp make.h netlogic.h netplay.cpp netplay.h object.cpp object.h objects.cpp objects.h player.cpp player.h protocol.h shinobi.h + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +liblogic_a_LIBADD = +liblogic_a_OBJECTS = about.o blit.o game.o logic.o make.o netplay.o \ +object.o objects.o player.o +AR = ar +CXXFLAGS = @CXXFLAGS@ +CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +SOURCES = $(liblogic_a_SOURCES) +OBJECTS = $(liblogic_a_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .cpp .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps netlogic/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstLIBRARIES: + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +distclean-noinstLIBRARIES: + +maintainer-clean-noinstLIBRARIES: + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +liblogic.a: $(liblogic_a_OBJECTS) $(liblogic_a_DEPENDENCIES) + -rm -f liblogic.a + $(AR) cru liblogic.a $(liblogic_a_OBJECTS) $(liblogic_a_LIBADD) + $(RANLIB) liblogic.a +.cpp.o: + $(CXXCOMPILE) -c $< + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = netlogic + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile $(LIBRARIES) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ + mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ + mostlyclean-am + +clean: clean-am + +distclean-am: distclean-noinstLIBRARIES distclean-compile \ + distclean-tags distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ +clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/netlogic/about.cpp b/netlogic/about.cpp new file mode 100644 index 0000000..07a0f0c --- /dev/null +++ b/netlogic/about.cpp @@ -0,0 +1,204 @@ + +#include "Maelstrom_Globals.h" +#include "object.h" +#include "load.h" + +#define ICON_V_OFF 14 + +#define KEYPRESS(X) (X.type == SDL_KEYDOWN) +#define BUTTONPRESS(X) (X.type == SDL_MOUSEBUTTONDOWN) + +/* ----------------------------------------------------------------- */ +/* -- Tell 'em about the game */ + +void DoAbout(void) +{ + SDL_Event event; + Uint32 clr, ltClr, ltrClr; + Bool done = false; + int idOn = 133; + Bool drawscreen = true; + int numsprites=0, i; + Object *objects[MAX_SPRITES]; + + /* Set up the colors */ + clr = screen->MapRGB(30000>>8, 30000>>8, 0xFF); + ltClr = screen->MapRGB(40000>>8, 40000>>8, 0xFF); + ltrClr = screen->MapRGB(50000>>8, 50000>>8, 0xFF); + + while ( ! done ) { + int sound_to_play = 0; + + /* Rotate any sprites */ + for ( i=0; iUnBlitSprite(); + objects[i]->Move(0); + objects[i]->BlitSprite(); + } + screen->Update(); + + /* Wait for keyboard input */ + while ( SDL_PollEvent(&event) ) { + + if ( KEYPRESS(event) || BUTTONPRESS(event) ) { + Bool next_screen; + + next_screen = ( + (event.type == SDL_MOUSEBUTTONDOWN) || + (event.key.keysym.sym == SDLK_RETURN) + ); + drawscreen = true; + + if ( next_screen ) { + sound_to_play = gExplosionSound; + } else { + done = true; + sound_to_play = gMultiplierGone; + } + + if ( ++idOn > 135 ) { + done = true; + sound_to_play = gPrettyGood; + } + Delay(SOUND_DELAY); + sound->PlaySound(sound_to_play, 5); + + for ( i=0; iFade(); + screen->Clear(); + + /* -- Draw the screen frame */ + width = 512; + height = 384; + xOff = ((gScrnRect.right - gScrnRect.left) - width) /2; + yOff = ((gScrnRect.bottom - gScrnRect.top) - height)/2; + + screen->DrawRect(xOff-1,yOff-1,width+2,height+2,clr); + screen->DrawRect(xOff-2,yOff-2,width+4,height+4,clr); + screen->DrawRect(xOff-3,yOff-3,width+6,height+6,ltClr); + screen->DrawRect(xOff-4,yOff-4,width+8,height+8,ltClr); + screen->DrawRect(xOff-5,yOff-5,width+10,height+10,ltrClr); + screen->DrawRect(xOff-6,yOff-6,width+12,height+12,ltClr); + screen->DrawRect(xOff-7,yOff-7,width+14,height+14,clr); + screen->DrawRect(xOff,yOff,width,height,ltClr); + + /* -- Now draw the picture */ + title = Load_Title(screen, idOn); + if ( title == NULL ) { + error( + "Can't load 'about' title! (ID=%d)\n", idOn); + exit(255); + } + screen->QueueBlit(xOff, yOff, title, NOCLIP); + screen->Update(); + screen->FreeImage(title); + + /* Draw color icons if this is Game screen */ + if ( idOn == 134 ) { + int x, y, off; + + x = (80) * SCALE_FACTOR; + y = (136) * SCALE_FACTOR; + off = 39 * SCALE_FACTOR; + + objects[numsprites++] = + new Object(x, y, 0, 0, gPlayerShip, 1); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gPrize, 2); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gBonusBlit, 2); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gMult[3], 1); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gDamagedShip, 1); + y += off; + + /* -- Now for the second column */ + x = (340) * SCALE_FACTOR; + y = (136) * SCALE_FACTOR; + off = 39 * SCALE_FACTOR; + + objects[numsprites++] = + new Object(x, y, 0, 0, gRock1R, 1); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gSteelRoidR, 1); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gNova, 4); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gMineBlitL, 1); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gVortexBlit, 3); + y += off; + objects[numsprites++] = + new Object(x, y, 0, 0, gEnemyShip, 1); + y += off; + + /* Now for the icons */ + x = xOff+25; + y = yOff+314; + screen->QueueBlit(x, y, gShieldIcon, NOCLIP); + screen->QueueBlit(x+16, y, + gAirBrakesIcon, NOCLIP); + y += ICON_V_OFF; + screen->QueueBlit(x, y, gLongFireIcon, NOCLIP); + screen->QueueBlit(x+16, y, + gTripleFireIcon, NOCLIP); + y += ICON_V_OFF; + screen->QueueBlit(x, y, gAutoFireIcon, NOCLIP); + screen->QueueBlit(x+16, y, + gLuckOfTheIrishIcon, NOCLIP); + + } + if ( idOn == 135 ) { + MFont *font; + SDL_Surface *text1, *text2; + + /* Put in the right credits / mask the old... */ + clr = screen->MapRGB(0x00, 0x00, 0x00); + screen->FillRect(xOff+166,yOff+282,338,62,clr); + font = fontserv->NewFont("New York", 18); + if ( font == NULL ) { + error( + "Can't use New York(18) font! -- Exiting.\n"); + exit(255); + } + text1 = fontserv->TextImage("Port to Linux: ", + font, STYLE_NORM, 0xFF, 0xFF, 0x55); + text2 = fontserv->TextImage("Sam Lantinga", + font, STYLE_NORM, 0xFF, 0xFF, 0xFF); + screen->QueueBlit(xOff+178, yOff+298, + text1, NOCLIP); + screen->QueueBlit(xOff+178+text1->w, yOff+298, + text2, NOCLIP); + fontserv->FreeText(text1); + fontserv->FreeText(text2); + delete font; + } + screen->Update(); + screen->Fade(); + drawscreen = false; + } + } + screen->Fade(); + gUpdateBuffer = true; +} /* -- DoAbout */ diff --git a/netlogic/blit.cpp b/netlogic/blit.cpp new file mode 100644 index 0000000..84b3cae --- /dev/null +++ b/netlogic/blit.cpp @@ -0,0 +1,165 @@ + +/* Note well: The order that things are done is very important to prevent + bugs. Several optimizing assumptions are done in player.cc + and object.cc that require this order. For example, I assume + that all sprites are erased when object->Move() is called, + that object->HitBy() is called before the move, and that + object->Move() is called EVERY timestep! +*/ + +#include "Maelstrom_Globals.h" +#include "netplay.h" +#include "object.h" +#include "player.h" +#include "globals.h" + +/* Returns the number of players left in the game */ +int RunFrame(void) +{ + int i, j, PlayersLeft; + + /* Read in keyboard input for our ship */ + HandleEvents(0); + + /* Send Sync! signal to all players, and handle keyboard. */ + if ( SyncNetwork() < 0 ) { + error("Game aborted!\n"); + return(0); + } + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->HandleKeys(); + + if ( gPaused > 0 ) + return(1); + + /* Play the boom sounds */ + if ( --gNextBoom == 0 ) { + if ( gBoomPhase ) { + sound->PlaySound(gBoom1, 0); + gBoomPhase = 0; + } else { + sound->PlaySound(gBoom2, 0); + gBoomPhase = 1; + } + gNextBoom = gBoomDelay; + } + + /* UnBlit all of the sprites and players */ + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->UnBlitSprite(); + OBJ_LOOP(i, gNumSprites) + gSprites[i]->UnBlitSprite(); + + /* Do all hit detection */ + OBJ_LOOP(j, gNumPlayers) { + if ( ! gPlayers[j]->Alive() ) + continue; + + /* This loop looks funny because gNumSprites can change + dynamically during the loop as sprites are killed/created. + This same logic is used whenever looping where sprites + might be destroyed. + */ + OBJ_LOOP(i, gNumSprites) { + if ( gSprites[i]->HitBy(gPlayers[j]) < 0 ) { + delete gSprites[i]; + gSprites[i] = gSprites[gNumSprites]; + } + } + OBJ_LOOP(i, gNumPlayers) { + if ( i == j ) // Don't shoot ourselves. :) + continue; + (void) gPlayers[i]->HitBy(gPlayers[j]); + } + } + if ( gEnemySprite ) { + OBJ_LOOP(i, gNumPlayers) { + if ( ! gPlayers[i]->Alive() ) + continue; + (void) gPlayers[i]->HitBy(gEnemySprite); + } + OBJ_LOOP(i, gNumSprites) { + if ( gSprites[i] == gEnemySprite ) + continue; + if ( gSprites[i]->HitBy(gEnemySprite) < 0 ) { + delete gSprites[i]; + gSprites[i] = gSprites[gNumSprites]; + } + } + } + + /* Handle all the shimmy and the shake. :-) */ + if ( gShakeTime && (gShakeTime-- > 0) ) { + int shakeV; + + OBJ_LOOP(i, gNumPlayers) { + shakeV = FastRandom(SHAKE_FACTOR); + if ( ! gPlayers[i]->Alive() ) + continue; + gPlayers[i]->Shake(FastRandom(SHAKE_FACTOR)); + } + OBJ_LOOP(i, gNumSprites) { + shakeV = FastRandom(SHAKE_FACTOR); + gSprites[i]->Shake(FastRandom(SHAKE_FACTOR)); + } + } + + /* Move all of the sprites */ + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->Move(0); + OBJ_LOOP(i, gNumSprites) { + if ( gSprites[i]->Move(gFreezeTime) < 0 ) { + delete gSprites[i]; + gSprites[i] = gSprites[gNumSprites]; + } + } + if ( gFreezeTime ) + --gFreezeTime; + + /* Now Blit them all again */ + OBJ_LOOP(i, gNumSprites) + gSprites[i]->BlitSprite(); + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->BlitSprite(); + screen->Update(); + + /* Make sure someone is still playing... */ + for ( i=0, PlayersLeft=0; i < gNumPlayers; ++i ) { + if ( gPlayers[i]->Kicking() ) + ++PlayersLeft; + } + if ( gNumPlayers > 1 ) { + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->ShowDot(); + screen->Update(); + } + +#ifdef SERIOUS_DEBUG +printf("Player listing: "); +OBJ_LOOP(i, gNumPlayers) { + int x, y; + gPlayers[i]->GetPos(&x, &y); + printf(" %d = (%d,%d)", i, x, y); +} +printf("\n"); + +printf("Object listing: "); +OBJ_LOOP(i, gNumSprites) { + int x, y; + gSprites[i]->GetPos(&x, &y); + printf(" %d = (%d,%d)", i, x, y); +} +printf("\n"); +#endif /* SERIOUS_DEBUG */ + + /* Timing handling -- Delay the FRAME_DELAY */ + screen->Update(); + if ( ! gNoDelay ) { + Uint32 ticks; + while ( ((ticks=Ticks)-gLastDrawn) < FRAME_DELAY ) { + SDL_Delay(1); + } + gLastDrawn = ticks; + } + return(PlayersLeft); +} diff --git a/netlogic/game.cpp b/netlogic/game.cpp new file mode 100644 index 0000000..6cc1ff9 --- /dev/null +++ b/netlogic/game.cpp @@ -0,0 +1,1048 @@ + +#include "Maelstrom_Globals.h" +#include "object.h" +#include "player.h" +#include "netplay.h" +#include "make.h" +#include "load.h" + + +#ifdef MOVIE_SUPPORT +extern int gMovie; +static SDL_Rect gMovieRect; +int SelectMovieRect(void) +{ + SDL_Event event; + SDL_Surface *saved; + Uint32 white; + int center_x, center_y; + int width, height; + + /* Wait for initial button press */ + screen->ShowCursor(); + center_x = 0; + center_y = 0; + while ( ! center_x && ! center_y ) { + screen->WaitEvent(&event); + + /* Check for escape key */ + if ( (event.type == SDL_KEYEVENT) && + (event.key.state == SDL_PRESSED) && + (event.key.keysym.sym == SDL_ESCAPE) ) { + screen->HideCursor(); + return(0); + } + + /* Wait for button press */ + if ( (event.type == SDL_MOUSEBUTTONEVENT) && + (event.button.state == SDL_PRESSED) ) { + center_x = event.button.x; + center_y = event.button.y; + break; + } + } + + /* Save the screen */ + white = screen->MapRGB(0xFFFF, 0xFFFF, 0xFFFF); + saved = screen->GrabArea(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + + /* As the box moves... */ + width = height = 0; + while ( 1 ) { + win->GetEvent(&event); + + /* Check for escape key */ + if ( (event.type == SDL_KEYEVENT) && + (event.key.state == SDL_PRESSED) && + (event.key.keysym.sym == SDL_ESCAPE) ) { + screen->QueueBlit(0, 0, saved, NOCLIP); + screen->Update(); + screen->FreeImage(saved); + win->HideCursor(); + return(0); + } + + /* Check for ending button press */ + if ( event.type == ButtonPress ) { + gMovieRect.x = center_x - width; + gMovieRect.y = center_y - height; + gMovieRect.w = 2*width; + gMovieRect.h = 2*height; + screen->QueueBlit(0, 0, saved, NOCLIP); + screen->Update(); + screen->FreeImage(saved); + win->HideCursor(); + return(1); + } + + if ( event.type == MotionNotify ) { + screen->QueueBlit(0, 0, saved, NOCLIP); + screen->Update(); + width = abs(event.motion.x - center_x); + height = abs(event.motion.y - center_y); + screen->DrawRect(center_x-width, center_y-height, + 2*width, 2*height, white); + screen->Update(); + } + } + /* NEVERREACHED */ + +} +#endif +extern int RunFrame(void); /* The heart of blit.cc */ + +// Global variables set in this file... +int gGameOn; +int gPaused; +int gWave; +int gBoomDelay; +int gNextBoom; +int gBoomPhase; +int gNumRocks; +int gLastStar; +int gWhenDone; +int gDisplayed; + +int gMultiplierShown; +int gPrizeShown; +int gBonusShown; +int gWhenHoming; +int gWhenGrav; +int gWhenDamaged; +int gWhenNova; +int gShakeTime; +int gFreezeTime; +Object *gEnemySprite; +int gWhenEnemy; + +// Local global variables; +static MFont *geneva=NULL; +static Uint32 ourGrey, ourWhite, ourBlack; +static int text_height; + +// Local functions used in the game module of Maelstrom +static void DoHouseKeeping(void); +static void NextWave(void); +static void DoGameOver(void); +static void DoBonus(void); +static void TwinkleStars(void); + +/* ----------------------------------------------------------------- */ +/* -- Draw the status display */ + +void DrawStatus(Bool first, Bool ForceDraw) +{ + static int nextDraw; + static int lastDisplayed; + int Score; + static int lastScore, lastScores[MAX_PLAYERS]; + static int lastWave; + int Lives; + static int lastLives; + static int lastLife[MAX_PLAYERS]; + int Bonus; + static int lastBonus; + int Frags; + static int lastFrags; + int AutoFire; + static int lastGun; + int AirBrakes; + static int lastBrakes; + int ShieldLevel; + static int lastShield; + int MultFactor; + static int lastMult; + int LongFire; + static int lastLong; + int TripleFire; + static int lastTriple; + int LuckOfTheIrish; + static int lastLuck; + static int fragoff; + static int score_width, wave_width; + static int lives_width, bonus_width; + static int frags_width; + int i; + char numbuf[128]; + + if (first) { + int x; + + nextDraw = 1; + lastDisplayed = -1; + OBJ_LOOP(i, gNumPlayers) + lastScores[i] = -1; + lastScore = -1; + lastWave = -1; + lastShield = -1; + lastLives = -1; + lastBonus = -1; + lastFrags = -1; + lastGun = -1; + lastBrakes = -1; + lastMult = -1; + lastLuck = -1; + if (gWave == 1) { + OBJ_LOOP(i, gNumPlayers) + lastLife[i] = 0; + } + lastLong = -1; + lastTriple = -1; + + score_width = 0; + wave_width = 0; + lives_width = 0; + bonus_width = 0; + frags_width = 0; + +/* -- Draw the status display */ + + screen->DrawLine(0, gStatusLine, SCREEN_WIDTH-1, + gStatusLine, ourWhite); + x = 3; + i = DrawText(x, gStatusLine+11, "Score:", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + x += (i+70); + i = DrawText(x, gStatusLine+11, "Shield:", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + x += (i+70); + i = DrawText(x, gStatusLine+11, "Wave:", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + x += (i+30); + i = DrawText(x, gStatusLine+11, "Lives:", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + x += (i+30); + DrawText(x, gStatusLine+11, "Bonus:", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + /* Heh, DOOM style frag count */ + if ( gNumPlayers > 1 ) { + x = 530; + i = DrawText(x, gStatusLine+11, "Frags:", geneva, + STYLE_BOLD, 30000>>8, 30000>>8, 0xFF); + fragoff = x+i+4; + } + } + + if ( ForceDraw || (--nextDraw == 0) ) { + nextDraw = DISPLAY_DELAY+1; + /* -- Do incremental updates */ + + if ( (gNumPlayers > 1) && (lastDisplayed != gDisplayed) ) { + char caption[BUFSIZ]; + + lastDisplayed = gDisplayed; + screen->FillRect(0, 0, SCREEN_WIDTH, 12, ourBlack); + sprintf(caption, + "You are player %d --- displaying player %d", + gOurPlayer+1, gDisplayed+1); + DrawText(SPRITES_WIDTH, 11, caption, geneva, + STYLE_BOLD, 30000>>8, 30000>>8, 0xFF); + + /* Fill in the color by the frag count */ + screen->FillRect(518, gStatusLine+4, 4, 8, + TheShip->Color()); + } + + ShieldLevel = TheShip->GetShieldLevel(); + if (lastShield != ShieldLevel) { + int fact; + + lastShield = ShieldLevel; + screen->DrawRect(152, gStatusLine+4, SHIELD_WIDTH, + 8, ourWhite); + fact = ((SHIELD_WIDTH - 2) * ShieldLevel) / MAX_SHIELD; + screen->FillRect(152+1,gStatusLine+4+1, fact, 6, + ourGrey); + screen->FillRect(152+1+fact, gStatusLine+4+1, + SHIELD_WIDTH-2-fact, 6, ourBlack); + } + + MultFactor = TheShip->GetBonusMult(); + if (lastMult != MultFactor) { + lastMult = MultFactor; + + switch (MultFactor) { + case 1: screen->FillRect(424, + gStatusLine+4, 8, 8, ourBlack); + break; + case 2: screen->QueueBlit(424, gStatusLine+4, + gMult2Icon, NOCLIP); + break; + case 3: screen->QueueBlit(424, gStatusLine+4, + gMult3Icon, NOCLIP); + break; + case 4: screen->QueueBlit(424, gStatusLine+4, + gMult4Icon, NOCLIP); + break; + case 5: screen->QueueBlit(424, gStatusLine+4, + gMult5Icon, NOCLIP); + break; + default: /* WHAT? */ + break; + } + } + + /* -- Do incremental updates */ + + AutoFire = TheShip->GetSpecial(MACHINE_GUNS); + if (lastGun != AutoFire) { + lastGun = AutoFire; + + if ( AutoFire > 0 ) { + screen->QueueBlit(438, gStatusLine+4, + gAutoFireIcon, NOCLIP); + } else { + screen->FillRect(438, gStatusLine+4, 8, 8, + ourBlack); + } + } + + AirBrakes = TheShip->GetSpecial(AIR_BRAKES); + if (lastBrakes != AirBrakes) { + lastBrakes = AirBrakes; + + if ( AirBrakes > 0 ) { + screen->QueueBlit(454, gStatusLine+4, + gAirBrakesIcon, NOCLIP); + } else { + screen->FillRect(454, gStatusLine+4, 8, 8, + ourBlack); + } + } + + LuckOfTheIrish = TheShip->GetSpecial(LUCKY_IRISH); + if (lastLuck != LuckOfTheIrish) { + lastLuck = LuckOfTheIrish; + + if ( LuckOfTheIrish > 0 ) { + screen->QueueBlit(470, gStatusLine+4, + gLuckOfTheIrishIcon, NOCLIP); + } else { + screen->FillRect(470, gStatusLine+4, 8, 8, + ourBlack); + } + } + + TripleFire = TheShip->GetSpecial(TRIPLE_FIRE); + if (lastTriple != TripleFire) { + lastTriple = TripleFire; + + if ( TripleFire > 0 ) { + screen->QueueBlit(486, gStatusLine+4, + gTripleFireIcon, NOCLIP); + } else { + screen->FillRect(486, gStatusLine+4, 8, 8, + ourBlack); + } + } + + LongFire = TheShip->GetSpecial(LONG_RANGE); + if (lastLong != LongFire) { + lastLong = LongFire; + + if ( LongFire > 0 ) { + screen->QueueBlit(502, gStatusLine+4, + gLongFireIcon, NOCLIP); + } else { + screen->FillRect(502, gStatusLine+4, 8, 8, + ourBlack); + } + } + + /* Check for everyone else's new lives */ + OBJ_LOOP(i, gNumPlayers) { + Score = gPlayers[i]->GetScore(); + + if ( (i == gDisplayed) && (Score != lastScore) ) { + /* -- Erase old and draw new score */ + screen->FillRect(45, gStatusLine+1, + score_width, text_height, ourBlack); + sprintf(numbuf, "%d", Score); + score_width = DrawText(45, gStatusLine+11, + numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + lastScore = Score; + } + + if (lastScores[i] == Score) + continue; + + /* -- See if they got a new life */ + lastScores[i] = Score; + if ((Score - lastLife[i]) >= NEW_LIFE) { + gPlayers[i]->IncrLives(1); + lastLife[i] = (Score / NEW_LIFE) * NEW_LIFE; + if ( i == gOurPlayer ) + sound->PlaySound(gNewLife, 5); + } + } + + if (lastWave != gWave) { + screen->FillRect(255, gStatusLine+1, + wave_width, text_height, ourBlack); + sprintf(numbuf, "%d", gWave); + wave_width = DrawText(255, gStatusLine+11, + numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + lastWave = gWave; + } + + Lives = TheShip->GetLives(); + if (lastLives != Lives) { + screen->FillRect(319, gStatusLine+1, + lives_width, text_height, ourBlack); + sprintf(numbuf, "%-3.1d", Lives); + lives_width = DrawText(319, gStatusLine+11, + numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + lastLives = Lives; + } + + Bonus = TheShip->GetBonus(); + if (lastBonus != Bonus) { + screen->FillRect(384, gStatusLine+1, + bonus_width, text_height, ourBlack); + sprintf(numbuf, "%-7.1d", Bonus); + bonus_width = DrawText(384, gStatusLine+11, + numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + lastBonus = Bonus; + } + + if ( gNumPlayers > 1 ) { + Frags = TheShip->GetFrags(); + if (lastFrags != Frags) { + screen->FillRect(fragoff, gStatusLine+1, + frags_width, text_height, ourBlack); + sprintf(numbuf, "%-3.1d", Frags); + frags_width = DrawText(fragoff, gStatusLine+11, + numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + lastFrags = Frags; + } + } + } +} /* -- DrawStatus */ + + +/* ----------------------------------------------------------------- */ +/* -- Start a new game */ + +void NewGame(void) +{ + int i; + + /* Send a "NEW_GAME" packet onto the network */ + if ( gNumPlayers > 1 ) { + if ( gOurPlayer == 0 ) { + if ( Send_NewGame(&gStartLevel,&gStartLives,&gNoDelay) + < 0) + return; + } else { + if ( Await_NewGame(&gStartLevel,&gStartLives,&gNoDelay) + < 0 ) + return; + } + } + + /* Load the font and colors we use everywhere */ + if ( (geneva = fontserv->NewFont("Geneva", 9)) == NULL ) { + error("Can't use Geneva font! -- Exiting.\n"); + exit(255); + } + text_height = fontserv->TextHeight(geneva); + ourGrey = screen->MapRGB(30000>>8, 30000>>8, 0xFF); + ourWhite = screen->MapRGB(0xFF, 0xFF, 0xFF); + ourBlack = screen->MapRGB(0x00, 0x00, 0x00); + + /* Fade into game mode */ + screen->Fade(); + screen->HideCursor(); + + /* Initialize some game variables */ + gGameOn = 1; + gPaused = 0; + gWave = gStartLevel - 1; + for ( i=gNumPlayers; i--; ) + gPlayers[i]->NewGame(gStartLives); + gLastStar = STAR_DELAY; + gLastDrawn = 0L; + gNumSprites = 0; + + NextWave(); + + /* Play the game, dammit! */ + while ( (RunFrame() > 0) && gGameOn ) + DoHouseKeeping(); + +/* -- Do the game over stuff */ + + DoGameOver(); + screen->ShowCursor(); + delete geneva; +} /* -- NewGame */ + + +/* ----------------------------------------------------------------- */ +/* -- Do some housekeeping! */ + +static void DoHouseKeeping(void) +{ + /* Don't do anything if we're paused */ + if ( gPaused ) { + /* Give up the CPU for a frame duration */ + Delay(FRAME_DELAY); + return; + } + +#ifdef MOVIE_SUPPORT + if ( gMovie ) + win->ScreenDump("MovieFrame", &gMovieRect); +#endif + /* -- Maybe throw a multiplier up on the screen */ + if (gMultiplierShown && (--gMultiplierShown == 0) ) + MakeMultiplier(); + + /* -- Maybe throw a prize(!) up on the screen */ + if (gPrizeShown && (--gPrizeShown == 0) ) + MakePrize(); + + /* -- Maybe throw a bonus up on the screen */ + if (gBonusShown && (--gBonusShown == 0) ) + MakeBonus(); + + /* -- Maybe make a nasty enemy fighter? */ + if (gWhenEnemy && (--gWhenEnemy == 0) ) + MakeEnemy(); + + /* -- Maybe create a transcenfugal vortex */ + if (gWhenGrav && (--gWhenGrav == 0) ) + MakeGravity(); + + /* -- Maybe create a recified space vehicle */ + if (gWhenDamaged && (--gWhenDamaged == 0) ) + MakeDamagedShip(); + + /* -- Maybe create a autonominous tracking device */ + if (gWhenHoming && (--gWhenHoming == 0) ) + MakeHoming(); + + /* -- Maybe make a supercranial destruction thang */ + if (gWhenNova && (--gWhenNova == 0) ) + MakeNova(); + + /* -- Maybe create a new star ? */ + if ( --gLastStar == 0 ) { + gLastStar = STAR_DELAY; + TwinkleStars(); + } + + /* -- Time for the next wave? */ + if (gNumRocks == 0) { + if ( gWhenDone == 0 ) + gWhenDone = DEAD_DELAY; + else if ( --gWhenDone == 0 ) + NextWave(); + } + + /* -- Housekeping */ + DrawStatus(false, false); +} /* -- DoHouseKeeping */ + + +/* ----------------------------------------------------------------- */ +/* -- Start the next wave! */ + +static void NextWave(void) +{ + int index, x, y; + int NewRoids; + short temp; + + gEnemySprite = NULL; + + /* -- Initialize some variables */ + gDisplayed = gOurPlayer; + gNumRocks = 0; + gShakeTime = 0; + gFreezeTime = 0; + + if (gWave != (gStartLevel - 1)) + DoBonus(); + + gWave++; + + /* See about the Multiplier */ + if ( FastRandom(2) ) + gMultiplierShown = ((FastRandom(30) * 60)/FRAME_DELAY); + else + gMultiplierShown = 0; + + /* See about the Prize */ + if ( FastRandom(2) ) + gPrizeShown = ((FastRandom(30) * 60)/FRAME_DELAY); + else + gPrizeShown = 0; + + /* See about the Bonus */ + if ( FastRandom(2) ) + gBonusShown = ((FastRandom(30) * 60)/FRAME_DELAY); + else + gBonusShown = 0; + + /* See about the Gravity */ + if (FastRandom(10 + gWave) > 11) + gWhenGrav = ((FastRandom(30) * 60)/FRAME_DELAY); + else + gWhenGrav = 0; + + /* See about the Nova */ + if (FastRandom(10 + gWave) > 13) + gWhenNova = ((FastRandom(30) * 60)/FRAME_DELAY); + else + gWhenNova = 0; + + /* See about the Enemy */ + if (FastRandom(3) == 0) + gWhenEnemy = ((FastRandom(30) * 60)/FRAME_DELAY); + else + gWhenEnemy = 0; + + /* See about the Damaged Ship */ + if (FastRandom(10) == 0) + gWhenDamaged = ((FastRandom(60) * 60L)/FRAME_DELAY); + else + gWhenDamaged = 0; + + /* See about the Homing Mine */ + if (FastRandom(10 + gWave) > 12) + gWhenHoming = ((FastRandom(60) * 60L)/FRAME_DELAY); + else + gWhenHoming = 0; + + temp = gWave / 4; + if (temp < 1) + temp = 1; + + NewRoids = FastRandom(temp) + (gWave / 5) + 3; + + /* -- Black the screen out and draw the wave */ + screen->Clear(); + + /* -- Kill any existing sprites */ + while (gNumSprites > 0) + delete gSprites[gNumSprites-1]; + + /* -- Initialize some variables */ + gLastDrawn = 0L; + gBoomDelay = (60/FRAME_DELAY); + gNextBoom = gBoomDelay; + gBoomPhase = 0; + gWhenDone = 0; + + /* -- Create the ship's sprite */ + for ( index=gNumPlayers; index--; ) + gPlayers[index]->NewWave(); + DrawStatus(true, false); + screen->Update(); + + /* -- Create some asteroids */ + for (index = 0; index < NewRoids; index++) { + int randval; + + x = FastRandom(SCREEN_WIDTH) * SCALE_FACTOR; + y = 0; + + randval = FastRandom(10); + + /* -- See what kind of asteroid to make */ + if (randval == 0) + MakeSteelRoid(x, y); + else + MakeLargeRock(x, y); + } + + /* -- Create the star field */ + screen->FocusBG(); + for ( index=0; indexDrawPoint(gTheStars[index]->xCoord, + gTheStars[index]->yCoord, gTheStars[index]->color); + } + screen->Update(1); + screen->FocusFG(); + screen->Fade(); +} /* -- NextWave */ + +/* ----------------------------------------------------------------- */ +/* -- Do the game over display */ + +struct FinalScore { + int Player; + int Score; + int Frags; +}; + +static int cmp_byscore(const void *A, const void *B) +{ + return(((struct FinalScore *)B)->Score-((struct FinalScore *)A)->Score); +} +static int cmp_byfrags(const void *A, const void *B) +{ + return(((struct FinalScore *)B)->Frags-((struct FinalScore *)A)->Frags); +} + +static void DoGameOver(void) +{ + SDL_Event event; + SDL_Surface *gameover; + MFont *newyork; + int newyork_height, w, x; + int which = -1, i; + char handle[20]; + Uint8 key; + int chars_in_handle = 0; + Bool done = false; + + /* Get the final scoring */ + struct FinalScore *final = new struct FinalScore[gNumPlayers]; + for ( i=0; iGetScore(); + final[i].Frags = gPlayers[i]->GetFrags(); + } +#ifndef macintosh + if ( gDeathMatch ) + qsort(final,gNumPlayers,sizeof(struct FinalScore),cmp_byfrags); + else + qsort(final,gNumPlayers,sizeof(struct FinalScore),cmp_byscore); +#endif + + screen->Fade(); + sound->HaltSound(); + + /* -- Kill any existing sprites */ + while (gNumSprites > 0) + delete gSprites[gNumSprites-1]; + + /* -- Clear the screen */ + screen->FillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, ourBlack); + + /* -- Draw the game over picture */ + gameover = Load_Title(screen, 128); + if ( gameover == NULL ) { + error("Can't load 'gameover' title!\n"); + exit(255); + } + screen->QueueBlit((SCREEN_WIDTH-gameover->w)/2, + ((SCREEN_HEIGHT-gameover->h)/2)-80, gameover, NOCLIP); + screen->FreeImage(gameover); + + /* Show the player ranking */ + if ( gNumPlayers > 1 ) { + if ( (newyork = fontserv->NewFont("New York", 18)) == NULL ) { + error("Can't use New York font! -- Exiting.\n"); + exit(255); + } + newyork_height = fontserv->TextHeight(newyork); + for ( i=0; i>8, 30000>>8, 0xFF); + } + delete newyork; + } + screen->Update(); + + /* -- Play the game over sound */ + sound->PlaySound(gGameOver, 5); + screen->Fade(); + + while( sound->Playing() ) + Delay(SOUND_DELAY); + + /* -- See if they got a high score */ + LoadScores(); + for ( i = 0; i<10; ++i ) { + if ( OurShip->GetScore() > hScores[i].score ) { + which = i; + break; + } + } + + /* -- They got a high score! */ + gLastHigh = which; + + if ((which != -1) && (gStartLevel == 1) && (gStartLives == 3) && + (gNumPlayers == 1) && !gDeathMatch ) { + sound->PlaySound(gBonusShot, 5); + for ( i = 8; i >= which ; --i ) { + hScores[i + 1].score = hScores[i].score; + hScores[i + 1].wave = hScores[i].wave; + strcpy(hScores[i+1].name, hScores[i].name); + } + + /* -- Draw the "Enter your name" string */ + if ( (newyork = fontserv->NewFont("New York", 18)) == NULL ) { + error("Can't use New York font! -- Exiting.\n"); + exit(255); + } + newyork_height = fontserv->TextHeight(newyork); + x = (SCREEN_WIDTH-(fontserv->TextWidth("Enter your name: ", + newyork, STYLE_NORM)*2))/2; + x += DrawText(x, 300, "Enter your name: ", + newyork, STYLE_NORM, 30000>>8, 30000>>8, 0xFF); + screen->Update(); + + /* -- Let them enter their name */ + w = 0; + chars_in_handle = 0; + + while ( screen->PollEvent(&event) ) /* Loop, flushing events */; + SDL_EnableUNICODE(1); + while ( !done ) { + screen->WaitEvent(&event); + + /* -- Handle key down's (no UNICODE support) */ + if ( event.type == SDL_KEYDOWN ) { + key = (Uint8)event.key.keysym.unicode; + switch ( key ) { + case '\0': // Ignore NUL char + case '\033': // Ignore ESC char + case '\t': // Ignore TAB too. + continue; + case '\003': + case '\r': + case '\n': + done = true; + continue; + case 127: + case '\b': + if ( chars_in_handle ) { + sound->PlaySound(gExplosionSound, 5); + --chars_in_handle; + } + break; + default: + if ( chars_in_handle < 15 ) { + sound->PlaySound(gShotSound, 5); + handle[chars_in_handle++] = (char)key; + } else + sound->PlaySound(gBonk, 5); + break; + } + screen->FillRect(x, 300-newyork_height+2, + w, newyork_height, ourBlack); + + handle[chars_in_handle] = '\0'; + w = DrawText(x, 300, handle, + newyork, STYLE_NORM, 0xFF, 0xFF, 0xFF); + screen->Update(); + } + } + delete newyork; + SDL_EnableUNICODE(0); + + /* In case the user just pressed */ + handle[chars_in_handle] = '\0'; + + hScores[which].wave = gWave; + hScores[which].score = OurShip->GetScore(); + strcpy(hScores[which].name, handle); + + sound->HaltSound(); + sound->PlaySound(gGotPrize, 6); + if ( gNetScores ) // All time high! + RegisterHighScore(hScores[which]); + else + SaveScores(); + } else + if ( gNumPlayers > 1 ) /* Let them watch their ranking */ + SDL_Delay(3000); + + while ( sound->Playing() ) + Delay(SOUND_DELAY); + HandleEvents(0); + + screen->Fade(); + gUpdateBuffer = true; +} /* -- DoGameOver */ + + +/* ----------------------------------------------------------------- */ +/* -- Do the bonus display */ + +static void DoBonus(void) +{ + int i, x, sw, xs, xt; + int bonus_width; + int score_width; + char numbuf[128]; + + DrawStatus(false, true); + screen->Update(); + + /* -- Now do the bonus */ + sound->HaltSound(); + sound->PlaySound(gRiff, 6); + + /* Fade out */ + screen->Fade(); + + /* -- Clear the screen */ + screen->FillRect(0, 0, SCREEN_WIDTH, gStatusLine-1, ourBlack); + + + /* -- Draw the wave completed message */ + sprintf(numbuf, "Wave %d completed.", gWave); + sw = fontserv->TextWidth(numbuf, geneva, STYLE_BOLD); + x = (SCREEN_WIDTH - sw) / 2; + DrawText(x, 150, numbuf, geneva, STYLE_BOLD, 0xFF, 0xFF, 0x00); + + /* -- Draw the bonus */ + sw = fontserv->TextWidth("Bonus Score: ", geneva, STYLE_BOLD); + x = ((SCREEN_WIDTH - sw) / 2) - 20; + DrawText(x, 200, "Bonus Score: ", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + xt = x+sw; + + /* -- Draw the score */ + sw = fontserv->TextWidth("Score: ", geneva, STYLE_BOLD); + x = ((SCREEN_WIDTH - sw) / 2) - 3; + DrawText(x, 220, "Score: ", geneva, STYLE_BOLD, + 30000>>8, 30000>>8, 0xFF); + xs = x+sw; + screen->Update(); + + /* Fade in */ + screen->Fade(); + while ( sound->Playing() ) + Delay(SOUND_DELAY); + + /* -- Count the score down */ + x = xs; + + OBJ_LOOP(i, gNumPlayers) { + if ( i != gOurPlayer ) { + gPlayers[i]->MultBonus(); + continue; + } + + if (OurShip->GetBonusMult() != 1) { + SDL_Surface *sprite; + + sprintf(numbuf, "%-5.1d", OurShip->GetBonus()); + DrawText(x, 200, numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + x += 75; + OurShip->MultBonus(); + Delay(SOUND_DELAY); + sound->PlaySound(gMultiplier, 5); + sprite = gMult[OurShip->GetBonusMult()-2]->sprite[0]; + screen->QueueBlit(xs+34, 180, sprite); + screen->Update(); + Delay(60); + } + } + Delay(SOUND_DELAY); + sound->PlaySound(gFunk, 5); + + sprintf(numbuf, "%-5.1d", OurShip->GetBonus()); + bonus_width = DrawText(x, 200, numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + sprintf(numbuf, "%-5.1d", OurShip->GetScore()); + score_width = DrawText(xt, 220, numbuf, geneva, STYLE_BOLD, + 0xFF, 0xFF, 0xFF); + screen->Update(); + Delay(60); + + /* -- Praise them or taunt them as the case may be */ + if (OurShip->GetBonus() == 0) { + Delay(SOUND_DELAY); + sound->PlaySound(gNoBonus, 5); + } + if (OurShip->GetBonus() > 10000) { + Delay(SOUND_DELAY); + sound->PlaySound(gPrettyGood, 5); + } + while ( sound->Playing() ) + Delay(SOUND_DELAY); + + /* -- Count the score down */ + OBJ_LOOP(i, gNumPlayers) { + if ( i != gOurPlayer ) { + while ( gPlayers[i]->GetBonus() > 500 ) { + gPlayers[i]->IncrScore(500); + gPlayers[i]->IncrBonus(-500); + } + continue; + } + + while (OurShip->GetBonus() > 0) { + while ( sound->Playing() ) + Delay(SOUND_DELAY); + + sound->PlaySound(gBonk, 5); + if ( OurShip->GetBonus() >= 500 ) { + OurShip->IncrScore(500); + OurShip->IncrBonus(-500); + } else { + OurShip->IncrScore(OurShip->GetBonus()); + OurShip->IncrBonus(-OurShip->GetBonus()); + } + + screen->FillRect(x, 200-text_height+2, + bonus_width, text_height, ourBlack); + sprintf(numbuf, "%-5.1d", OurShip->GetBonus()); + bonus_width = DrawText(x, 200, numbuf, + geneva, STYLE_BOLD, 0xFF, 0xFF, 0xFF); + screen->FillRect(xt, 220-text_height+2, + score_width, text_height, ourBlack); + sprintf(numbuf, "%-5.1d", OurShip->GetScore()); + score_width = DrawText(xt, 220, numbuf, + geneva, STYLE_BOLD, 0xFF, 0xFF, 0xFF); + + DrawStatus(false, true); + screen->Update(); + } + } + while ( sound->Playing() ) + Delay(SOUND_DELAY); + HandleEvents(10); + + /* -- Draw the "next wave" message */ + sprintf(numbuf, "Prepare for Wave %d...", gWave+1); + sw = fontserv->TextWidth(numbuf, geneva, STYLE_BOLD); + x = (SCREEN_WIDTH - sw)/2; + DrawText(x, 259, numbuf, geneva, STYLE_BOLD, 0xFF, 0xFF, 0x00); + screen->Update(); + HandleEvents(100); + + screen->Fade(); +} /* -- DoBonus */ + + +/* ----------------------------------------------------------------- */ +/* -- Flash the stars on the screen */ + +static void TwinkleStars(void) +{ + int theStar; + + theStar = FastRandom(MAX_STARS); + + /* -- Draw the star */ + screen->FocusBG(); + screen->DrawPoint(gTheStars[theStar]->xCoord, + gTheStars[theStar]->yCoord, ourBlack); + SetStar(theStar); + screen->DrawPoint(gTheStars[theStar]->xCoord, + gTheStars[theStar]->yCoord, gTheStars[theStar]->color); + screen->Update(1); + screen->FocusFG(); +} /* -- TwinkleStars */ + diff --git a/netlogic/globals.h b/netlogic/globals.h new file mode 100644 index 0000000..da5d45f --- /dev/null +++ b/netlogic/globals.h @@ -0,0 +1,29 @@ +/* ----------------------------------------------------------------- */ +/* -- Special logic module variables */ + +// in game.cc : +extern int gDisplayed; +extern int gGameOn; +extern int gPaused; +extern int gBoomDelay; +extern int gNextBoom; +extern int gBoomPhase; +extern int gNumRocks; +extern int gLastStar; +extern int gWhenDone; + +extern int gMultiplierShown; +extern int gPrizeShown; +extern int gBonusShown; +extern int gWhenHoming; +extern int gWhenGrav; +extern int gWhenDamaged; + +extern int gWhenNova; +extern int gShakeTime; +extern int gFreezeTime; + +extern int gWave; +extern Object *gEnemySprite; +extern int gWhenEnemy; + diff --git a/netlogic/logic.cpp b/netlogic/logic.cpp new file mode 100644 index 0000000..027a0e8 --- /dev/null +++ b/netlogic/logic.cpp @@ -0,0 +1,118 @@ + +#include "Maelstrom_Globals.h" +#include "object.h" +#include "player.h" +#include "globals.h" +#include "netplay.h" + +/* Extra options specific to this logic module */ +void LogicUsage(void) +{ + error( +" -player N[@host][:port] # Designate player N (at host and/or port)\n" +" -server N@host[:port] # Play with N players using server at host\n" +" -deathmatch [N] # Play deathmatch to N frags (default = 8)\n" + ); +} + +/* Initialize special logic data */ +int InitLogicData(void) +{ + /* Initialize network player data */ + if ( InitNetData() < 0 ) { + return(-1); + } + gDeathMatch = 0; + return(0); +} + +/* Parse logic-specific command line arguments */ +int LogicParseArgs(char ***argvptr, int *argcptr) +{ + char **argv = *argvptr; + int argc = *argcptr; + + /* Check for the '-player' option */ + if ( strcmp(argv[1], "-player") == 0 ) { + if ( ! argv[2] ) { + error( + "The '-player' option requires an argument!\n"); + PrintUsage(); + } + if ( AddPlayer(argv[2]) < 0 ) + exit(1); + ++(*argvptr); + --(*argcptr); + return(0); + } + + /* Check for the '-server' option */ + if ( strcmp(argv[1], "-server") == 0 ) { + if ( ! argv[2] ) { + error("The '-server' option requires an argument!\n"); + PrintUsage(); + } + if ( SetServer(argv[2]) < 0 ) + exit(1); + ++(*argvptr); + --(*argcptr); + return(0); + } + + /* Check for the '-deathmatch' option */ + if ( strcmp(argv[1], "-deathmatch") == 0 ) { + if ( argv[2] && ((gDeathMatch=atoi(argv[2])) > 0) ) { + ++(*argvptr); + --(*argcptr); + } else + gDeathMatch = 8; + return(0); + } + return(-1); +} + +/* Do final logic initialization */ +int InitLogic(void) +{ + /* Make sure we have a valid player list */ + if ( CheckPlayers() < 0 ) + return(-1); + return(0); +} + +void HaltLogic(void) +{ + HaltNetData(); +} + +/* Initialize the player sprites */ +int InitPlayerSprites(void) +{ + int index; + + OBJ_LOOP(index, gNumPlayers) + gPlayers[index] = new Player(index); + return(0); +} + +int SpecialKey(SDL_keysym key) +{ + if ( key.sym == SDLK_F1 ) { + /* Special key -- switch displayed player */ + if ( ++gDisplayed == gNumPlayers ) + gDisplayed = 0; + return(0); + } + return(-1); +} + +void SetControl(unsigned char which, int toggle) +{ + QueueKey(toggle ? KEY_PRESS : KEY_RELEASE, which); +} + +int GetScore(void) +{ + return(OurShip->GetScore()); +} + diff --git a/netlogic/make.cpp b/netlogic/make.cpp new file mode 100644 index 0000000..4027535 --- /dev/null +++ b/netlogic/make.cpp @@ -0,0 +1,372 @@ + +#include "Maelstrom_Globals.h" +#include "netplay.h" +#include "object.h" +#include "player.h" +#include "globals.h" +#include "objects.h" +#include "shinobi.h" + + +/* ----------------------------------------------------------------- */ +/* -- Make an enemy Shenobi fighter! */ + +void MakeEnemy(void) +{ + int newsprite, x, y; + + y = FastRandom(gScrnRect.bottom-gScrnRect.top-SPRITES_WIDTH) + + SPRITES_WIDTH; + y *= SCALE_FACTOR; + x = 0; + + newsprite = gNumSprites; + if (FastRandom(5 + gWave) > 10) + gSprites[newsprite] = new LittleShinobi(x, y); + else + gSprites[newsprite] = new BigShinobi(x, y); +} /* -- MakeEnemy */ + + +/* ----------------------------------------------------------------- */ +/* -- Make a Prize */ + +void MakePrize(void) +{ + int x, y, newsprite, xVel, yVel, rx; + int index, cap; + + if (FastRandom(BLUE_MOON) == 0) + cap = (FastRandom(MOON_FACTOR) + 2) * 2; + else + cap = 1; + + for (index = 0; index < cap; index++) { + x = FastRandom(gScrnRect.right - gScrnRect.left - + SPRITES_WIDTH) + SPRITES_WIDTH; + y = 0; + + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (1 * SCALE_FACTOR); + else + xVel -= (1 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (1 * SCALE_FACTOR); + else + yVel -= (1 * SCALE_FACTOR); + + newsprite = gNumSprites; + gSprites[newsprite] = new Prize(x, y, xVel, yVel); + } + return; +} /* -- MakePrize */ + + +/* ----------------------------------------------------------------- */ +/* -- Make a multiplier */ + +void MakeMultiplier(void) +{ + int newsprite, x, y; + + x = FastRandom(gClipRect.w - SPRITES_WIDTH) + SPRITES_WIDTH; + y = FastRandom(gClipRect.h - SPRITES_WIDTH - STATUS_HEIGHT) + + SPRITES_WIDTH; + + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + + newsprite = gNumSprites; + gSprites[newsprite] = new Multiplier(x, y, FastRandom(4)+2); + return; +} /* -- MakeMultiplier */ + + +/* ----------------------------------------------------------------- */ +/* -- Make a nova... (!) */ + +void MakeNova(void) +{ + int newsprite, min_bad_distance, i, x, y; + + min_bad_distance = MIN_BAD_DISTANCE; +tryAgain: + if ( min_bad_distance ) + --min_bad_distance; + + x = FastRandom(gClipRect.w - SPRITES_WIDTH) + SPRITES_WIDTH; + y = FastRandom(gClipRect.h - SPRITES_WIDTH - STATUS_HEIGHT) + + SPRITES_WIDTH; + + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + +// -- Make sure it isn't appearing right next to the ship + + for ( i=gNumPlayers; i--; ) { + int xDist, yDist; + + /* Make sure the player is alive. :) */ + if ( ! gPlayers[i]->Alive() ) + continue; + + gPlayers[i]->GetPos(&xDist, &yDist); + xDist = abs(xDist-x); + yDist = abs(yDist-y); + + if ( (xDist < (SCALE_FACTOR * min_bad_distance)) || + (yDist < (SCALE_FACTOR * min_bad_distance)) ) + goto tryAgain; + } + + newsprite = gNumSprites; + gSprites[newsprite] = new Nova(x, y); +} /* -- MakeNova */ + + +/* ----------------------------------------------------------------- */ +/* -- Make a bonus */ + +void MakeBonus(void) +{ + int newsprite, x, y, which; + int rx, xVel, yVel; + int index, cap; + long multFact; + + if (FastRandom(BLUE_MOON) == 0) + cap = (FastRandom(MOON_FACTOR) + 2) * 2; + else + cap = 1; + + for (index = 0; index < cap; index++) { + x = FastRandom(gScrnRect.right - gScrnRect.left - + SPRITES_WIDTH) + SPRITES_WIDTH; + y = 0; + + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + + which = FastRandom(6); + if (which == 0) + multFact = 500L; + else + multFact = which * 1000L; + + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx / 2); + xVel += (3 * SCALE_FACTOR); + + yVel = xVel; + + newsprite = gNumSprites; + gSprites[newsprite] = new Bonus(x, y, xVel, yVel, multFact); + } +} /* -- MakeBonus */ + + +/* ----------------------------------------------------------------- */ +/* -- Make a damaged ship */ + +void MakeDamagedShip(void) +{ + int newsprite, x, y, xVel, yVel, rx; + + x = FastRandom(gScrnRect.right - gScrnRect.left - + SPRITES_WIDTH) + SPRITES_WIDTH; + y = 0; + + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + + rx = (VEL_FACTOR) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (0 * SCALE_FACTOR); + else + xVel -= (0 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (1 * SCALE_FACTOR); + else + yVel -= (1 * SCALE_FACTOR); + + newsprite = gNumSprites; + gSprites[newsprite] = new DamagedShip(x, y, xVel, yVel); +} /* -- MakeDamagedShip */ + + +/* ----------------------------------------------------------------- */ +/* -- Create a gravity sprite */ + +void MakeGravity(void) +{ + int newsprite, i, rx; + int x, y, min_bad_distance; + int index, cap; + + if (FastRandom(BLUE_MOON) == 0) + cap = (FastRandom(MOON_FACTOR) + 2) * 2; + else + cap = 1; + + for (index = 0; index < cap; index++) { + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + min_bad_distance = MIN_BAD_DISTANCE; + tryAgain: + if ( min_bad_distance ) + --min_bad_distance; + + x = FastRandom(gClipRect.w - SPRITES_WIDTH) + SPRITES_WIDTH; + y = FastRandom(gClipRect.h - SPRITES_WIDTH - STATUS_HEIGHT) + + SPRITES_WIDTH; + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + + // -- Make sure it isn't appearing right next to the ship + + for ( i=gNumPlayers; i--; ) { + int xDist, yDist; + + /* Make sure the player is alive. :) */ + if ( ! gPlayers[i]->Alive() ) + continue; + + gPlayers[i]->GetPos(&xDist, &yDist); + xDist = abs(xDist-x); + yDist = abs(yDist-y); + + if ( (xDist < (SCALE_FACTOR * min_bad_distance)) || + (yDist < (SCALE_FACTOR * min_bad_distance)) ) + goto tryAgain; + } + newsprite = gNumSprites; + gSprites[newsprite] = new Gravity(x, y); + } +} /* -- MakeGravity */ + + +/* ----------------------------------------------------------------- */ +/* -- Create a homing pigeon */ + +void MakeHoming(void) +{ + int newsprite, xVel, yVel, rx; + int x, y; + int index, cap; + + if (FastRandom(BLUE_MOON) == 0) + cap = (FastRandom(MOON_FACTOR) + 2) * 2; + else + cap = 1; + + for (index = 0; index < cap; index++) { + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (0 * SCALE_FACTOR); + else + xVel -= (0 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (0 * SCALE_FACTOR); + else + yVel -= (0 * SCALE_FACTOR); + + x = FastRandom(gScrnRect.right - gScrnRect.left - + SPRITES_WIDTH) + SPRITES_WIDTH; + y = 0; + + x *= SCALE_FACTOR; + y *= SCALE_FACTOR; + + newsprite = gNumSprites; + gSprites[newsprite] = new Homing(x, y, xVel, yVel); + } +} /* -- MakeHoming */ + + +/* ----------------------------------------------------------------- */ +/* -- Create a large rock */ + +void MakeLargeRock(int x, int y) +{ + int newsprite, xVel, yVel, phaseFreq, rx; + + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (0 * SCALE_FACTOR); + else + xVel -= (0 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (0 * SCALE_FACTOR); + else + yVel -= (0 * SCALE_FACTOR); + + phaseFreq = (FastRandom(3) + 2); + + newsprite = gNumSprites; + gSprites[newsprite] = new LargeRock(x, y, xVel, yVel, phaseFreq); +} /* -- MakeLargeRock */ + + +/* ----------------------------------------------------------------- */ +/* -- Create a steel asteroid */ + +void MakeSteelRoid(int x, int y) +{ + int newsprite, xVel, yVel, rx; + + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (1 * SCALE_FACTOR); + else + xVel -= (1 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (2 * SCALE_FACTOR); + else + yVel -= (2 * SCALE_FACTOR); + + newsprite = gNumSprites; + gSprites[newsprite] = new SteelRoid(x, y, xVel, yVel); +} /* -- MakeSteelRoid */ + diff --git a/netlogic/make.h b/netlogic/make.h new file mode 100644 index 0000000..ec0ea1c --- /dev/null +++ b/netlogic/make.h @@ -0,0 +1,13 @@ + +// Functions from make.cc +extern void MakeLargeRock(int x, int y); +extern void MakeSteelRoid(int x, int y); +extern void MakeMultiplier(void); +extern void MakeBonus(void); +extern void MakePrize(void); +extern void MakeHoming(void); +extern void MakeGravity(void); +extern void MakeNova(void); +extern void MakeDamagedShip(void); +extern void MakeEnemy(void); + diff --git a/netlogic/netlogic.h b/netlogic/netlogic.h new file mode 100644 index 0000000..cac4eb0 --- /dev/null +++ b/netlogic/netlogic.h @@ -0,0 +1,48 @@ + +/* Maelstrom version... */ +#ifndef VERSION +#define VERSION "3.0.6" +#endif +#define VERSION_STRING VERSION ".N" + +#define ENEMY_SHOT_DELAY (10/FRAME_DELAY) + +#define INITIAL_SHIELD ((60/FRAME_DELAY) * 3) +#define SAFE_TIME (120/FRAME_DELAY) +#define MAX_SHIELD ((60/FRAME_DELAY) * 5) +#define DISPLAY_DELAY (60/FRAME_DELAY) +#define BONUS_DELAY (30/FRAME_DELAY) +#define STAR_DELAY (30/FRAME_DELAY) +#define DEAD_DELAY (3 * (60/FRAME_DELAY)) +#define BOOM_MIN (20/FRAME_DELAY) + +#define PLAYER_HITS 3 +#define VAPOROUS 0 + +#define PLAYER_PTS 1000 +#define DEFAULT_POINTS 0 + +#define PRIZE_DURATION (10 * (60/FRAME_DELAY)) +#define MULT_DURATION (6 * (60/FRAME_DELAY)) +#define BONUS_DURATION (10 * (60/FRAME_DELAY)) +#define SHOT_DURATION (1 * (60/FRAME_DELAY)) +#define POINT_DURATION (2 * (60/FRAME_DELAY)) +#define DAMAGED_DURATION (10 * (60/FRAME_DELAY)) +#define FREEZE_DURATION (10 * (60/FRAME_DELAY)) +#define SHAKE_DURATION (5 * (60/FRAME_DELAY)) + + +/* ----------------------------------------------------------------- */ +/* -- Structures and typedefs */ + +typedef struct { + int damage; + int x; + int y; + int xvel; + int yvel; + int ttl; + Rect hitRect; + } Shot; +typedef Shot *ShotPtr; + diff --git a/netlogic/netplay.cpp b/netlogic/netplay.cpp new file mode 100644 index 0000000..6c4dc1e --- /dev/null +++ b/netlogic/netplay.cpp @@ -0,0 +1,820 @@ + +/* This contains the network play functions and data */ + +#include + +#include "SDL_net.h" +#include "SDL_endian.h" + +#include "Maelstrom_Globals.h" +#include "netplay.h" +#include "protocol.h" + + +int gNumPlayers; +int gOurPlayer; +int gDeathMatch; +UDPsocket gNetFD; + +static int GotPlayer[MAX_PLAYERS]; +static IPaddress PlayAddr[MAX_PLAYERS]; +static IPaddress ServAddr; +static int FoundUs, UseServer; +static Uint32 NextFrame; +UDPpacket *OutBound[2]; +static int CurrOut; +/* This is the data offset of a SYNC packet */ +#define PDATA_OFFSET (1+1+sizeof(Uint32)+sizeof(Uint32)) + +/* We keep one packet backlogged for retransmission */ +#define OutBuf OutBound[CurrOut]->data +#define OutLen OutBound[CurrOut]->len +#define LastBuf OutBound[!CurrOut]->data +#define LastLen OutBound[!CurrOut]->len + +static unsigned char *SyncPtrs[2][MAX_PLAYERS]; +static unsigned char SyncBufs[2][MAX_PLAYERS][BUFSIZ]; +static int SyncLens[2][MAX_PLAYERS]; +static int ThisSyncs[2]; +static int CurrIn; +static SDLNet_SocketSet SocketSet; + +/* We cache one packet if the other player is ahead of us */ +#define SyncPtr SyncPtrs[CurrIn] +#define SyncBuf SyncBufs[CurrIn] +#define SyncLen SyncLens[CurrIn] +#define ThisSync ThisSyncs[CurrIn] +#define NextPtr SyncPtrs[!CurrIn] +#define NextBuf SyncBufs[!CurrIn] +#define NextLen SyncLens[!CurrIn] +#define NextSync ThisSyncs[!CurrIn] + +#define TOGGLE(var) var = !var + + +int InitNetData(void) +{ + int i; + + /* Initialize the networking subsystem */ + if ( SDLNet_Init() < 0 ) { + error("NetLogic: Couldn't initialize networking!\n"); + return(-1); + } + atexit(SDLNet_Quit); + + /* Create the outbound packets */ + for ( i=0; i<2; ++i ) { + OutBound[i] = SDLNet_AllocPacket(BUFSIZ); + if ( OutBound[i] == NULL ) { + error("Out of memory (creating network buffers)\n"); + return(-1); + } + } + + /* Initialize network game variables */ + FoundUs = 0; + gOurPlayer = -1; + gDeathMatch = 0; + UseServer = 0; + for ( i=0; idata[0] = SYNC_MSG; + OutBound[1]->data[0] = SYNC_MSG; + /* Type field, frame sequence, current random seed */ + OutBound[0]->len = PDATA_OFFSET; + OutBound[1]->len = PDATA_OFFSET; + CurrOut = 0; + + ThisSyncs[0] = 0; + ThisSyncs[1] = 0; + CurrIn = 0; + return(0); +} + +void HaltNetData(void) +{ + SDLNet_Quit(); +} + +int AddPlayer(char *playerstr) +{ + int playernum; + int portnum; + char *host=NULL, *port=NULL; + + /* Extract host and port information */ + if ( (port=strchr(playerstr, ':')) != NULL ) + *(port++) = '\0'; + if ( (host=strchr(playerstr, '@')) != NULL ) + *(host++) = '\0'; + + /* Find out which player we are referring to */ + if (((playernum = atoi(playerstr)) <= 0) || (playernum > MAX_PLAYERS)) { + error( +"Argument to '-player' must be in integer between 1 and %d inclusive.\r\n", + MAX_PLAYERS); + PrintUsage(); + } + + /* Do some error checking */ + if ( GotPlayer[--playernum] ) { + error("Player %d specified multiple times!\r\n", playernum+1); + return(-1); + } + if ( port ) { + portnum = atoi(port); + } else { + portnum = NETPLAY_PORT+playernum; + } + if ( host ) { + /* Resolve the remote address */ + SDLNet_ResolveHost(&PlayAddr[playernum], host, portnum); + if ( PlayAddr[playernum].host == INADDR_NONE ) { + error("Couldn't resolve host name for %s\r\n", host); + return(-1); + } + } else { /* No host specified, local player */ + if ( FoundUs ) { + error( +"More than one local player! (players %d and %d specified as local players)\r\n", + gOurPlayer+1, playernum+1); + return(-1); + } else { + gOurPlayer = playernum; + FoundUs = 1; + SDLNet_ResolveHost(&PlayAddr[playernum], NULL, portnum); + } + } + + /* We're done! */ + GotPlayer[playernum] = 1; + return(0); +} + +int SetServer(char *serverstr) +{ + int portnum; + char *host=NULL, *port=NULL; + + /* Extract host and port information */ + if ( (host=strchr(serverstr, '@')) == NULL ) { + error( + "Server host must be specified in the -server option.\r\n"); + PrintUsage(); + } else + *(host++) = '\0'; + if ( (port=strchr(serverstr, ':')) != NULL ) + *(port++) = '\0'; + + /* We should know how many players we have now */ + if (((gNumPlayers = atoi(serverstr)) <= 0) || + (gNumPlayers > MAX_PLAYERS)) { + error( +"The number of players must be an integer between 1 and %d inclusive.\r\n", + MAX_PLAYERS); + PrintUsage(); + } + + /* Resolve the remote address */ + if ( port ) { + portnum = atoi(port); + } else { + portnum = NETPLAY_PORT-1; + } + SDLNet_ResolveHost(&ServAddr, host, portnum); + if ( ServAddr.host == INADDR_NONE ) { + error("Couldn't resolve host name for %s\r\n", host); + return(-1); + } + + /* We're done! */ + UseServer = 1; + return(0); +} + +/* This MUST be called after command line options have been processed. */ +int CheckPlayers(void) +{ + int i; + int port; + + /* Check to make sure we have all the players */ + if ( ! UseServer ) { + for ( i=0, gNumPlayers=0; i gNumPlayers ) { + error("You cannot be player %d in a %d player game.\r\n", + gOurPlayer+1, gNumPlayers); + return(-1); + } + if ( (gNumPlayers == 1) && gDeathMatch ) { + error("Warning: No deathmatch in a single player game!\r\n"); + gDeathMatch = 0; + } + + /* Oh heck, create the UDP socket here... */ + port = SDL_SwapBE16(PlayAddr[gOurPlayer].port); + gNetFD = SDLNet_UDP_Open(port); + if ( gNetFD == NULL ) { + error("Couldn't create bound network socket"); + return(-1); + } + SocketSet = SDLNet_AllocSocketSet(1); + if ( SocketSet == NULL ) { + error("Couldn't create socket watch set"); + return(-1); + } + SDLNet_UDP_AddSocket(SocketSet, gNetFD); + + /* Now, so we can send to ourselves... */ + PlayAddr[gOurPlayer] = *SDLNet_UDP_GetPeerAddress(gNetFD, -1); + if ( ! PlayAddr[gOurPlayer].host ) { + SDLNet_ResolveHost(&PlayAddr[gOurPlayer], "127.0.0.1", port); + } + + /* Bind all of our players to the channels */ + if ( ! UseServer ) { + for ( i=0; i= (BUFSIZ-2) ) + return; + +//error("Queued key 0x%.2x for frame %d\r\n", Type, NextFrame); + OutBuf[OutLen++] = Op; + OutBuf[OutLen++] = Type; +} + +/* This function is called every frame, and is used to flush the network + buffers, sending sync and keystroke packets. + It is called AFTER the keyboard is polled, and BEFORE GetSyncBuf() is + called by the player objects. + + Note: We assume that FastRand() isn't called by an interrupt routine, + otherwise we lose consistency. +*/ + +int SyncNetwork(void) +{ + UDPpacket sent; + Uint32 seed, frame; + unsigned char buf[BUFSIZ]; + int index, nleft; + + /* Set the next inbound packet buffer */ + TOGGLE(CurrIn); + + /* Set the frame number */ + frame = NextFrame; + SDLNet_Write32(frame, &OutBuf[1]); + seed = GetRandSeed(); + SDLNet_Write32(seed, &OutBuf[1+sizeof(frame)]); + + /* Send the packet to all the players */ + SDLNet_UDP_Send(gNetFD, 0, OutBound[CurrOut]); + for ( nleft=0, index=0; index 0 ) { + for ( int i=1; inumFrames); + else + phase = 0; + nextphase = 0; + + playground.left = (gScrnRect.left<numFrames*phasetime); + ExplodeSound(); + return(0); +} + +/* Movement */ +/* This function returns 0, or -1 if the sprite died */ +int +Object::Move(int Frozen) // This is called every timestep. +{ + if ( ! Frozen ) + SetPos(x+xvec, y+yvec); + + /* Phase, but don't draw our new position */ + Phase(); + + /* Does this object have a lifetime? */ + if ( TTL && (--TTL == 0) ) { // This sprite died... + return(BeenTimedOut()); + } + return(0); +} +void +Object::BlitSprite(void) +{ + screen->QueueBlit(x>>SPRITE_PRECISION, y>>SPRITE_PRECISION, + myblit->sprite[phase]); + onscreen = 1; +} +void +Object::UnBlitSprite(void) +{ + /* Only unblit if we were onscreen */ + if ( ! onscreen ) + return; + + if ( myblit->isSmall ) { + screen->Clear(x>>SPRITE_PRECISION, y>>SPRITE_PRECISION, 16, 16, + DOCLIP); + } else { + screen->Clear(x>>SPRITE_PRECISION, y>>SPRITE_PRECISION, 32, 32, + DOCLIP); + } + onscreen = 0; +} + +/* Sound functions */ +void +Object::HitSound(void) +{ + sound->PlaySound(gSteelHit, 3); +} +void +Object::ExplodeSound(void) +{ + sound->PlaySound(gExplosionSound, 3); +} + +/* The objects!! */ +Object *gSprites[MAX_SPRITES]; diff --git a/netlogic/object.h b/netlogic/object.h new file mode 100644 index 0000000..084da56 --- /dev/null +++ b/netlogic/object.h @@ -0,0 +1,289 @@ + +#ifndef _object_h +#define _object_h + + +/* The screen object class */ +class Object { + +public: + Object(int X, int Y, int Xvec, int Yvec, Blit *blit, int PhaseTime); + virtual ~Object(); + + /* Flags */ + virtual int IsPlayer(void) { + return(0); + } + virtual int Alive(void) { + return(1); + } + + /* Settings */ + void Set_Blit(Blit *blit) { + myblit = blit; + if ( myblit->isSmall ) + xsize = ysize = 16; + else + xsize = ysize = 32; + } + virtual void Set_Points(int points) { + Points = points; + } + virtual void Set_HitPoints(int hp) { + HitPoints = hp; + } + virtual void Set_TTL(int ttl) { + /* We use ttl+1 because of the way Move() checks TTL */ + TTL = ttl+1; + } + virtual void IncrScore(int pts) { + return; + } + virtual void IncrFrags(void) { + return; + } + + /* Shot and hit detection */ + virtual Shot *ShotHit(Rect *hitRect) { + /* This function is called to see if we shot something */ + return(NULL); + } + virtual int Collide(Object *object) { + /* Set up the location rectangles */ + Rect *R1=&HitRect, *R2=&object->HitRect; + + /* No collision if no overlap */ + if ( ! Overlap(R1, R2) ) + return(0); + + /* Check the bitmasks to see if the sprites really intersect */ + int xoff1, xoff2; + int roff; + unsigned char *mask1, *mask2; + int checkwidth, checkheight, w; + + /* -- Load the ptrs to the sprite masks */ + mask1 = myblit->mask[phase]; + mask2 = (object->myblit)->mask[object->phase]; + + /* See where the sprites are relative to eachother, x-Axis */ + if ( R2->left < R1->left ) { + /* The second sprite is left of the first one */ + checkwidth = (R2->right-R1->left); + xoff2 = R1->left-R2->left; + xoff1 = 0; + } else { + /* The first sprite is left of the second one */ + checkwidth = (R1->right-R2->left); + xoff1 = R2->left-R1->left; + xoff2 = 0; + } + + /* See where the sprites are relative to eachother, y-Axis */ + if ( R2->top < R1->top ) { + /* The second sprite is above of the first one */ + checkheight = (R2->bottom-R1->top); + mask2 += (R1->top-R2->top)*object->xsize; + } else { + /* The first sprite is on top of the second one */ + checkheight = (R1->bottom-R2->top); + mask1 += (R2->top-R1->top)*xsize; + } + + /* Do the actual mask hit detection */ + while ( checkheight-- ) { + for ( roff=0, w=checkwidth; w; --w, ++roff ) { + if ( mask1[xoff1+roff] && mask2[xoff2+roff] ) + return(1); + } + mask1 += xsize; + mask2 += object->xsize; + } + return(0); + } + /* Should be called in main loop -- return (-1) if dead */ + virtual int HitBy(Object *ship) { + Shot *shot; + while ( shootable && (shot=ship->ShotHit(&HitRect)) ) { + if ( BeenShot(ship, shot) > 0 ) + return(-1); + } + if ( (solid && ship->solid) && + Collide(ship) && (BeenRunOver(ship) > 0) ) + return(-1); + return(0); + } + + /* We've been shot! (returns 1 if we are dead) */ + virtual int BeenShot(Object *ship, Shot *shot) { + if ( (HitPoints -= shot->damage) <= 0 ) { + ship->IncrScore(Points); + if ( IsPlayer() ) + ship->IncrFrags(); + return(Explode()); + } else { + HitSound(); + Accelerate(shot->xvel/2, shot->yvel/2); + } + return(0); + } + + /* We've been run over! (returns 1 if we are dead) */ + virtual int BeenRunOver(Object *ship) { + if ( ship->IsPlayer() ) + ship->BeenDamaged(PLAYER_HITS); + if ( (HitPoints -= 1) <= 0 ) { + ship->IncrScore(Points); + return(Explode()); + } else { + HitSound(); + ship->Accelerate(xvec/2, yvec/2); + } + return(0); + } + + /* We've been globally damaged! (returns 1 if we are dead) */ + virtual int BeenDamaged(int damage) { + if ( (HitPoints -= damage) <= 0 ) { + return(Explode()); + } else + HitSound(); + return(0); + } + + /* We expired (returns -1 if we are dead) */ + virtual int BeenTimedOut(void) { + return(-1); + } + + /* What happens when we have been shot up or crashed into */ + /* Returns 1 if we die here, instead of go into explosion */ + virtual int Explode(void); + + /* Movement */ + void GetPos(int *X, int *Y) { + *X = x; + *Y = y; + } + virtual void SetPos(int X, int Y) { + /* Set new X position */ + x = X; + if ( x > playground.right ) + x = playground.left + (x-playground.right); + else if ( x < playground.left ) + x = playground.right - (playground.left-x); + + /* Set new Y position */ + y = Y; + if ( y > playground.bottom ) + y = playground.top + (y-playground.bottom); + else if ( y < playground.top ) + y = playground.bottom - (playground.top-y); + + /* Set the new HitRect */ + HitRect.left = myblit->hitRect.left+(x>>SPRITE_PRECISION); + HitRect.right = myblit->hitRect.right+(x>>SPRITE_PRECISION); + HitRect.top = myblit->hitRect.top+(y>>SPRITE_PRECISION); + HitRect.bottom = myblit->hitRect.bottom+(y>>SPRITE_PRECISION); + } + virtual void Shake(int shakiness) { + int Xvec = ((xvec < 0) ? shakiness : -shakiness); + int Yvec = ((yvec < 0) ? shakiness : -shakiness); + Accelerate(Xvec, Yvec); + } + void Accelerate(int Xvec, int Yvec) { + if ( Exploding ) + return; + xvec += Xvec; + if ( abs(xvec) > VEL_MAX ) + xvec = ((xvec > 0) ? VEL_MAX : -VEL_MAX); + yvec += Yvec; + if ( abs(yvec) > VEL_MAX ) + yvec = ((yvec > 0) ? VEL_MAX : -VEL_MAX); + } + virtual void Phase(void) { + if ( phasetime != NO_PHASE_CHANGE ) { + if ( nextphase++ >= phasetime ) { + nextphase = 0; + if ( ++phase >= myblit->numFrames ) + phase = 0; + } + } + } + /* This function returns 0, or -1 if the sprite died */ + virtual int Move(int Frozen); + + virtual void BlitSprite(void); + virtual void UnBlitSprite(void); + + /* Sound functions */ + virtual void HitSound(void); + virtual void ExplodeSound(void); + + /* Player access functions (not used here) */ + virtual void SetSpecial(unsigned char Spec) { + } + virtual void IncrShieldLevel(int level) { + } + virtual void Multiplier(int multiplier) { + } + virtual void IncrBonus(int bonus) { + } + virtual void IncrLives(int lives) { + } + +protected: + int Points; + int x, y; + int xvec, yvec; + int xsize, ysize; + int solid; + int shootable; + int HitPoints; + int TTL; + + int onscreen; + int phase; + int phasetime; + int nextphase; + Blit *myblit; + Rect HitRect; + Rect playground; + int Exploding; + + /* See if two rectangles overlap */ + int Overlap(Rect *R1, Rect *R2) { + /* If the top of R1 is below the bottom of R2, they can't overlap */ + if ( (R1->top > R2->bottom) || + /* If the bottom R1 is above the top of R2, they can't overlap */ + (R1->bottom < R2->top) || + /* If the left of R1 is greater than the right of R2, no overlap */ + (R1->left > R2->right) || + /* If the right of R1 is less than the left of R2, no overlap */ + (R1->right < R2->left) ) + return(0); + + /* They must overlap */ + return(1); + } +}; + +/* These macros are useful for manipulating the high speed object arrays + in use for dynamically keeping track of objects on the screen. +*/ +#define OBJ_LOOP(index, range) for ( index=(range-1); index >= 0; --index ) + +/* Free a slot in the middle of the array, fill the slot with the object + at the end of the array, and shrink the size of the array. +*/ +#define OBJ_KILL(array, index, numobj, type) \ + if ( index != --numobj ) { \ + type *tmp = array[index]; \ + array[index] = array[numobj]; \ + array[numobj] = tmp; \ + } + +/* The Objects!! */ +extern Object *gSprites[MAX_SPRITES]; + +#endif /* _object_h */ diff --git a/netlogic/objects.cpp b/netlogic/objects.cpp new file mode 100644 index 0000000..5776e5c --- /dev/null +++ b/netlogic/objects.cpp @@ -0,0 +1,144 @@ + +/* Here we define all of the strange and wonderous objects in the game */ + +#include "Maelstrom_Globals.h" +#include "netplay.h" +#include "object.h" +#include "player.h" +#include "globals.h" +#include "objects.h" + + +Prize::Prize(int X, int Y, int xVel, int yVel) : + Object(X, Y, xVel, yVel, gPrize, 2) +{ + Set_TTL(PRIZE_DURATION); + sound->PlaySound(gPrizeAppears, 4); +#ifdef SERIOUS_DEBUG +error("Created a prize!\n"); +#endif +} + +Multiplier::Multiplier(int X, int Y, int Mult) : + Object(X, Y, 0, 0, gMult[Mult-2], NO_PHASE_CHANGE) +{ + Set_TTL(MULT_DURATION); + multiplier = Mult; + solid = 0; + sound->PlaySound(gMultiplier, 4); +#ifdef SERIOUS_DEBUG +error("Created a multiplier!\n"); +#endif +} + +Nova::Nova(int X, int Y) : Object(X, Y, 0, 0, gNova, 4) +{ + Set_TTL(gNova->numFrames*phasetime); + Set_Points(NOVA_PTS); + phase = 0; + sound->PlaySound(gNovaAppears, 4); +#ifdef SERIOUS_DEBUG +error("Created a nova!\n"); +#endif +} + +Bonus::Bonus(int X, int Y, int xVel, int yVel, int Bonus) : + Object(X, Y, xVel, yVel, gBonusBlit, 2) +{ + Set_TTL(BONUS_DURATION); + solid = 0; + bonus = Bonus; + sound->PlaySound(gBonusAppears, 4); +#ifdef SERIOUS_DEBUG +error("Created a bonus!\n"); +#endif +} + +Shrapnel::Shrapnel(int X, int Y, int xVel, int yVel, Blit *blit) : + Object(X, Y, xVel, yVel, blit, 2) +{ + solid = 0; + shootable = 0; + phase = 0; + TTL = (myblit->numFrames*phasetime); +#ifdef SERIOUS_DEBUG +error("Created a shrapnel!\n"); +#endif +} + +DamagedShip::DamagedShip(int X, int Y, int xVel, int yVel) : + Object(X, Y, xVel, yVel, gDamagedShip, 1) +{ + Set_TTL(DAMAGED_DURATION*phasetime); + sound->PlaySound(gDamagedAppears, 4); +#ifdef SERIOUS_DEBUG +error("Created a damaged ship!\n"); +#endif +} + +Gravity::Gravity(int X, int Y) : Object(X, Y, 0, 0, gVortexBlit, 2) +{ + Set_Points(GRAVITY_PTS); + sound->PlaySound(gGravAppears, 4); +#ifdef SERIOUS_DEBUG +error("Created a gravity well!\n"); +#endif +} + +Homing::Homing(int X, int Y, int xVel, int yVel) : + Object(X, Y, xVel, yVel, + ((xVel > 0) ? gMineBlitR : gMineBlitL), 2) +{ + Set_HitPoints(HOMING_HITS); + Set_Points(HOMING_PTS); + target=AcquireTarget(); + sound->PlaySound(gHomingAppears, 4); +#ifdef SERIOUS_DEBUG +error("Created a homing mine!\n"); +#endif +} + +SmallRock::SmallRock(int X, int Y, int xVel, int yVel, int phaseFreq) : + Object(X, Y, xVel, yVel, + ((xVel > 0) ? gRock3R : gRock3L), phaseFreq) +{ + Set_Points(SMALL_ROID_PTS); + ++gNumRocks; +#ifdef SERIOUS_DEBUG +error("+ Small rock! (%d)\n", gNumRocks); +#endif +} + +MediumRock::MediumRock(int X, int Y, int xVel, int yVel, int phaseFreq) : + Object(X, Y, xVel, yVel, + ((xVel > 0) ? gRock2R : gRock2L), phaseFreq) +{ + Set_Points(MEDIUM_ROID_PTS); + ++gNumRocks; +#ifdef SERIOUS_DEBUG +error("++ Medium rock! (%d)\n", gNumRocks); +#endif +} + +LargeRock::LargeRock(int X, int Y, int xVel, int yVel, int phaseFreq) : + Object(X, Y, xVel, yVel, + ((xVel > 0) ? gRock1R : gRock1L), phaseFreq) +{ + Set_Points(BIG_ROID_PTS); + ++gNumRocks; +#ifdef SERIOUS_DEBUG +error("+++ Large rock! (%d)\n", gNumRocks); +#endif +} + +SteelRoid::SteelRoid(int X, int Y, int xVel, int yVel) : + Object(X, Y, xVel, yVel, + ((xVel > 0) ? gSteelRoidR : gSteelRoidL), 3) +{ + Set_HitPoints(STEEL_SPECIAL); + Set_Points(STEEL_PTS); +#ifdef SERIOUS_DEBUG +error("Created a steel asteroid!\n"); +#endif +} + diff --git a/netlogic/objects.h b/netlogic/objects.h new file mode 100644 index 0000000..20e3c58 --- /dev/null +++ b/netlogic/objects.h @@ -0,0 +1,539 @@ + +/* Here we define all of the strange and wonderous objects in the game */ + + +class Prize : public Object { + +public: + Prize(int X, int Y, int xVel, int yVel); + ~Prize() { } + + /* When we are run over, we give prizes! */ + int BeenRunOver(Object *ship) { + int i; + + if ( ! ship->IsPlayer() || ! ship->Alive() ) + return(0); + + switch (FastRandom(NUM_PRIZES)) { + case 0: + /* -- They got machine guns! */ + ship->SetSpecial(MACHINE_GUNS); + break; + case 1: + /* -- They got Air brakes */ + ship->SetSpecial(AIR_BRAKES); + break; + case 2: + /* -- They might get Lucky */ + ship->SetSpecial(LUCKY_IRISH); + break; + case 3: + /* -- They triple fire */ + ship->SetSpecial(TRIPLE_FIRE); + break; + case 4: + /* -- They got long range */ + ship->SetSpecial(LONG_RANGE); + break; + case 5: + /* -- They got more shields */ + ship->IncrShieldLevel((MAX_SHIELD/5)+ + FastRandom(MAX_SHIELD/2)); + break; + case 6: + /* -- Put 'em on ICE */ + sound->PlaySound(gFreezeSound, 4); + gFreezeTime = FREEZE_DURATION; + break; + case 7: + /* Blow up everything */ + sound->PlaySound(gNovaBoom, 5); + OBJ_LOOP(i, gNumSprites) { + if ( gSprites[i] == this ) + continue; + if (gSprites[i]->BeenDamaged(1) < 0) { + delete gSprites[i]; + gSprites[i] = gSprites[gNumSprites]; + } + } + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->CutThrust(SHAKE_DURATION); + gShakeTime = SHAKE_DURATION; + break; + } + sound->PlaySound(gGotPrize, 4); + return(1); + } + + int BeenTimedOut(void) { + /* If we time out, we explode, then die. */ + if ( Exploding ) + return(-1); + else + return(Explode()); + } + + void ExplodeSound(void) { + sound->PlaySound(gIdiotSound, 4); + } +}; + + +class Multiplier : public Object { + +public: + Multiplier(int X, int Y, int Mult); + ~Multiplier() { } + + int BeenShot(Object *ship, Shot *shot) { + ship->Multiplier(multiplier); + sound->PlaySound(gMultShotSound, 4); + return(1); + } + int BeenDamaged(int damage) { + return(0); + } + int BeenTimedOut(void) { + sound->PlaySound(gMultiplierGone, 4); + return(-1); + } + void Shake(int shakiness) { } + +protected: + int multiplier; +}; + + +class Nova : public Object { + +public: + Nova(int X, int Y); + ~Nova() { } + + int BeenTimedOut(void) { + if ( ! Exploding ) { + int i; + sound->PlaySound(gNovaBoom, 5); + OBJ_LOOP(i, gNumSprites) { + if ( gSprites[i] == this ) + continue; + if (gSprites[i]->BeenDamaged(1) < 0) { + delete gSprites[i]; + gSprites[i] = gSprites[gNumSprites]; + } + } + OBJ_LOOP(i, gNumPlayers) + gPlayers[i]->CutThrust(SHAKE_DURATION); + gShakeTime = SHAKE_DURATION; + } + return(-1); + } + void Shake(int shakiness) { } +}; + +class Bonus : public Object { + +public: + Bonus(int X, int Y, int xVel, int yVel, int Bonus); + ~Bonus() { } + + int BeenShot(Object *ship, Shot *shot) { + + /* Increment the ship's bonus. :) */ + ship->IncrBonus(bonus); + sound->PlaySound(gBonusShot, 4); + + /* Display point bonus */ + shootable = 0; + Set_Blit(gPointBlit); + phasetime = NO_PHASE_CHANGE; + phase = (bonus/1000); + Set_TTL(POINT_DURATION); + xvec = yvec = 0; + + bonus = 0; + return(0); + } + int BeenDamaged(int damage) { + return(0); + } + int BeenTimedOut(void) { + if ( bonus ) + sound->PlaySound(gMultiplierGone, 4); + return(-1); + } + void Shake(int shakiness) { } + +protected: + int bonus; +}; + + +class Shrapnel : public Object { + +public: + Shrapnel(int X, int Y, int xVel, int yVel, Blit *blit); + ~Shrapnel() { } + + int BeenDamaged(int damage) { + return(0); + } +}; + + +class DamagedShip : public Object { + +public: + DamagedShip(int X, int Y, int xVel, int yVel); + ~DamagedShip() { } + + int BeenRunOver(Object *ship) { + ship->IncrLives(1); + sound->PlaySound(gSavedShipSound, 4); + return(1); + } + + int BeenTimedOut(void) { + if ( ! Exploding ) + return(Explode()); + else + return(-1); + } + + int Explode(void) { + /* Create some shrapnel */ + int newsprite, xVel, yVel, rx; + + /* Don't do anything if we're already exploding */ + if ( Exploding ) { + return(0); + } + + /* Type 1 shrapnel */ + rx = (SCALE_FACTOR); + xVel = yVel = 0; + + while (xVel == 0) + xVel = FastRandom(rx / 2) + SCALE_FACTOR; + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += SCALE_FACTOR; + else + yVel -= SCALE_FACTOR; + + newsprite = gNumSprites; + gSprites[newsprite]=new Shrapnel(x, y, xVel, yVel, gShrapnel1); + + /* Type 2 shrapnel */ + rx = (SCALE_FACTOR); + xVel = yVel = 0; + + while (xVel == 0) + xVel = FastRandom(rx / 2) + SCALE_FACTOR; + xVel *= -1; + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += SCALE_FACTOR; + else + yVel -= SCALE_FACTOR; + + newsprite = gNumSprites; + gSprites[newsprite]=new Shrapnel(x, y, xVel, yVel, gShrapnel2); + + /* Finish our explosion */ + Exploding = 1; + solid = 0; + shootable = 0; + phase = 0; + nextphase = 0; + phasetime = 2; + xvec = yvec = 0; + myblit = gShipExplosion; + TTL = (myblit->numFrames*phasetime); + ExplodeSound(); + return(0); + } + + void ExplodeSound(void) { + sound->PlaySound(gShipHitSound, 5); + } +}; + + +class Gravity : public Object { + +public: + Gravity(int X, int Y); + ~Gravity() { } + + int Move(int Frozen) { + int i; + + /* Don't gravitize while exploding */ + if ( Exploding ) + return(Object::Move(Frozen)); + + /* Warp the courses of the players */ + OBJ_LOOP(i, gNumPlayers) { + int X, Y, xAccel, yAccel; + + if ( ! gPlayers[i]->Alive() ) + continue; + + /* Gravitize! */ + gPlayers[i]->GetPos(&X, &Y); + + if ( ((X>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) <= + ((x>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) ) + xAccel = GRAVITY_MOVE; + else + xAccel = -GRAVITY_MOVE; + + if ( ((Y>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) <= + ((y>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) ) + yAccel = GRAVITY_MOVE; + else + yAccel = -GRAVITY_MOVE; + + gPlayers[i]->Accelerate(xAccel, yAccel); + } + + /* Phase normally */ + return(Object::Move(Frozen)); + } + void Shake(int shakiness) { } +}; + + +class Homing : public Object { + +public: + Homing(int X, int Y, int xVel, int yVel); + ~Homing() { } + + /* This is duplicated in the Shinobi class */ + virtual int AcquireTarget(void) { + int i, newtarget=(-1); + + for ( i=0; iAlive() ) + break; + } + if ( i != gNumPlayers ) { // Player(s) alive! + do { + newtarget = FastRandom(gNumPlayers); + } while ( ! gPlayers[newtarget]->Alive() ); + } + return(newtarget); + } + + int Move(int Frozen) { + if ( ((target >= 0) && gPlayers[target]->Alive()) || + ((target=AcquireTarget()) >= 0) ) { + int X, Y, xAccel=0, yAccel=0; + + gPlayers[target]->GetPos(&X, &Y); + if ( ((X>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) <= + ((x>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) ) + xAccel -= HOMING_MOVE; + else + xAccel += HOMING_MOVE; + if ( ((Y>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) <= + ((y>>SPRITE_PRECISION)+(SPRITES_WIDTH/2)) ) + yAccel -= HOMING_MOVE; + else + yAccel += HOMING_MOVE; + Accelerate(xAccel, yAccel); + } + return(Object::Move(Frozen)); + } + +protected: + int target; +}; + + +class SmallRock : public Object { + +public: + SmallRock(int X, int Y, int xVel, int yVel, int phaseFreq); + ~SmallRock() { + --gNumRocks; + } + + int Explode() { + /* Don't do anything if we're already exploding */ + if ( Exploding ) { + return(0); + } + + /* Speed things up. :-) */ + if ( --gBoomDelay < BOOM_MIN ) + gBoomDelay = BOOM_MIN; +#ifdef SERIOUS_DEBUG +error("- Small rock! (%d)\n", gNumRocks); +#endif + + return(Object::Explode()); + } +}; +class MediumRock : public Object { + +public: + MediumRock(int X, int Y, int xVel, int yVel, int phaseFreq); + ~MediumRock() { + --gNumRocks; + } + + int Explode() { + int newrocks; + int newsprite = gNumSprites; + + /* Don't do anything if we're already exploding */ + if ( Exploding ) { + return(0); + } + + /* Create 0-3 new rocks */ + newrocks = FastRandom(3); + do { + int xVel, yVel, phaseFreq, rx; + + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (2 * SCALE_FACTOR); + else + xVel -= (2 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (2 * SCALE_FACTOR); + else + yVel -= (2 * SCALE_FACTOR); + + phaseFreq = (FastRandom(3) + 1); + + gSprites[newsprite++] = + new SmallRock(x, y, xVel, yVel, phaseFreq); + } while ( newrocks-- ); + + /* Speed things up. :-) */ + if ( --gBoomDelay < BOOM_MIN ) + gBoomDelay = BOOM_MIN; +#ifdef SERIOUS_DEBUG +error("-- Medium rock! (%d)\n", gNumRocks); +#endif + + return(Object::Explode()); + } +}; + + +class LargeRock : public Object { + +public: + LargeRock(int X, int Y, int xVel, int yVel, int phaseFreq); + ~LargeRock() { + --gNumRocks; + } + + int Explode() { + int newrocks; + int newsprite = gNumSprites; + + /* Don't do anything if we're already exploding */ + if ( Exploding ) { + return(0); + } + + /* Create 0-3 new rocks */ + newrocks = FastRandom(3); + do { + int xVel, yVel, phaseFreq, rx; + + rx = (VEL_FACTOR + (gWave / 6)) * (SCALE_FACTOR); + + xVel = yVel = 0; + while (xVel == 0) + xVel = FastRandom(rx) - (rx / 2); + if (xVel > 0) + xVel += (1 * SCALE_FACTOR); + else + xVel -= (1 * SCALE_FACTOR); + + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += (1 * SCALE_FACTOR); + else + yVel -= (1 * SCALE_FACTOR); + + phaseFreq = (FastRandom(3) + 2); + + gSprites[newsprite++] = + new MediumRock(x, y, xVel, yVel, phaseFreq); + } while ( newrocks-- ); + + /* Speed things up. :-) */ + if ( --gBoomDelay < BOOM_MIN ) + gBoomDelay = BOOM_MIN; +#ifdef SERIOUS_DEBUG +error("--- Large rock! (%d)\n", gNumRocks); +#endif + + return(Object::Explode()); + } +}; + + +class SteelRoid : public Object { + +public: + SteelRoid(int X, int Y, int xVel, int yVel); + ~SteelRoid() { } + + int Explode(void) { + int newsprite; + + /* Don't do anything if we're already exploding */ + if ( Exploding ) { + return(0); + } + + Set_HitPoints(STEEL_SPECIAL); + switch (FastRandom(10)) { + + /* Turn into an Asteroid */ + case 0: + sound->PlaySound(gFunk, 4); + newsprite = gNumSprites; + gSprites[newsprite] = new LargeRock(x, y, + xvec, yvec, phasetime); + return(1); + + /* Blow up! */ + case 1: + return(Object::Explode()); + + /* Turn into a homing mine */ + case 2: + sound->PlaySound(gHomingAppears, 4); + newsprite = gNumSprites; + gSprites[newsprite] = + new Homing(x, y, xvec, yvec); + return(1); + + default: + break; + } + return(0); + } +}; diff --git a/netlogic/player.cpp b/netlogic/player.cpp new file mode 100644 index 0000000..7f48b8a --- /dev/null +++ b/netlogic/player.cpp @@ -0,0 +1,702 @@ + +#include "Maelstrom_Globals.h" +#include "netplay.h" +#include "object.h" +#include "player.h" +#include "globals.h" +#include "objects.h" + + +/* ----------------------------------------------------------------- */ +/* -- The thrust sound callback */ + +static void ThrustCallback(Uint8 theChannel) +{ +#ifdef DEBUG +error("Thrust called back on channel %hu\n", theChannel); +#endif + /* -- Check the control key */ + if ( gPlayers[gOurPlayer]->IsThrusting() ) + sound->PlaySound(gThrusterSound,1,theChannel,ThrustCallback); +} /* -- ThrustCallback */ + + +/* ----------------------------------------------------------------- */ +/* -- The Player class */ + +Player:: Player(int index) : Object(0, 0, 0, 0, gPlayerShip, NO_PHASE_CHANGE) +{ + int i; + + Index = index; + Score = 0; + for ( i=0; idamage = 1; + } + numshots = 0; + + /* Create a colored dot for this player */ + ship_color = screen->MapRGB(gPlayerColors[index][0], + gPlayerColors[index][1], + gPlayerColors[index][2]); + + --gNumSprites; // We aren't really a sprite +} +Player::~Player() +{ + for ( int i=0; i= gDeathMatch) ) { + /* Game over, we got a stud. :) */ + int i; + OBJ_LOOP(i, gNumPlayers) { + gPlayers[i]->IncrLives(-1); + gPlayers[i]->Explode(); +#ifdef DEBUG +error("Killing player %d\n", i+1); +#endif + } + } +} + +void +Player::IncrLives(int lives) +{ + if ( gDeathMatch && (lives > 0) ) + return; + Lives += lives; +} + +/* We've been shot! (returns 1 if we are dead) */ +int +Player::BeenShot(Object *ship, Shot *shot) +{ + if ( Exploding || !Alive() ) + return(0); + if ( AutoShield || (ShieldOn && (ShieldLevel > 0)) ) + return(0); + if ( (special & LUCKY_IRISH) && (FastRandom(LUCK_ODDS) == 0) ) { + sound->PlaySound(gLuckySound, 4); + return(0); + } + return(Object::BeenShot(ship, shot)); +} + +/* We've been run over! (returns 1 if we are dead) */ +int +Player::BeenRunOver(Object *ship) { + if ( Exploding || !Alive() ) + return(0); + if ( AutoShield || (ShieldOn && (ShieldLevel > 0)) ) + return(0); + if ( ship->IsPlayer() ) /* Players phase through eachother */ + return(0); + if ( (special & LUCKY_IRISH) && (FastRandom(LUCK_ODDS) == 0) ) { + sound->PlaySound(gLuckySound, 4); + return(0); + } + return(Object::BeenRunOver(ship)); +} + +/* We've been run over by a rock or something */ +int +Player::BeenDamaged(int damage) +{ + if ( Exploding || !Alive() ) + return(0); + if ( AutoShield || (ShieldOn && (ShieldLevel > 0)) ) + return(0); + if ( (special & LUCKY_IRISH) && (FastRandom(LUCK_ODDS) == 0) ) { + sound->PlaySound(gLuckySound, 4); + return(0); + } + return(Object::BeenDamaged(damage)); +} + +/* We expired (returns -1 if our sprite should be deleted) */ +int +Player::BeenTimedOut(void) +{ + Exploding = 0; + SetPos( + ((SCREEN_WIDTH/2-((gNumPlayers/2-Index)*(2*SPRITES_WIDTH))) + *SCALE_FACTOR), + ((SCREEN_HEIGHT/2)*SCALE_FACTOR) + ); + if ( gDeathMatch ) + Dead = (DEAD_DELAY/2); + else + Dead = DEAD_DELAY; + return(0); +} + +int +Player::Explode(void) +{ + /* Create some shrapnel */ + int newsprite, xVel, yVel, rx; + + /* Don't explode while already exploding. :) (DeathMatch) */ + if ( Exploding || !Alive() ) + return(0); + + /* Type 1 shrapnel */ + rx = (SCALE_FACTOR); + xVel = yVel = 0; + + while (xVel == 0) + xVel = FastRandom(rx / 2) + SCALE_FACTOR; + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += SCALE_FACTOR; + else + yVel -= SCALE_FACTOR; + + newsprite = gNumSprites; + gSprites[newsprite]=new Shrapnel(x, y, xVel, yVel, gShrapnel1); + + /* Type 2 shrapnel */ + rx = (SCALE_FACTOR); + xVel = yVel = 0; + + while (xVel == 0) + xVel = FastRandom(rx / 2) + SCALE_FACTOR; + xVel *= -1; + while (yVel == 0) + yVel = FastRandom(rx) - (rx / 2); + if (yVel > 0) + yVel += SCALE_FACTOR; + else + yVel -= SCALE_FACTOR; + + newsprite = gNumSprites; + gSprites[newsprite]=new Shrapnel(x, y, xVel, yVel, gShrapnel2); + + /* We may lose our special abilities */ + if ( (special & LUCKY_IRISH) && (FastRandom(LUCK_ODDS) == 0) ) + special &= ~LUCKY_IRISH; + else + special = 0; + + /* Finish our explosion */ + Exploding = 1; + Thrusting = 0; + Shooting = 0; + ShieldOn = 0; + solid = 0; + shootable = 0; + phase = 0; + nextphase = 0; + phasetime = 2; + xvec = yvec = 0; + Set_Blit(gShipExplosion); + Set_TTL(myblit->numFrames*phasetime); + ExplodeSound(); + return(0); +} + +Shot * +Player::ShotHit(Rect *hitRect) +{ + int i; + OBJ_LOOP(i, numshots) { + if ( Overlap(&shots[i]->hitRect, hitRect) ) { + /* KillShot() rearranges the shot[] array */ + Shot *shotputt = shots[i]; + KillShot(i); + return(shotputt); + } + } + return(NULL); +} +int +Player::Move(int Freeze) +{ + int i; + + /* Move and time out old shots */ +#ifdef SERIOUS_DEBUG +printf("Shots(%d): ", numshots); +#endif + OBJ_LOOP(i, numshots) { + int offset; + + if ( --shots[i]->ttl == 0 ) { + KillShot(i); + continue; + } + + /* Set new X position */ + shots[i]->x += shots[i]->xvel; + if ( shots[i]->x > playground.right ) + shots[i]->x = playground.left + + (shots[i]->x-playground.right); + else if ( shots[i]->x < playground.left ) + shots[i]->x = playground.right - + (playground.left-shots[i]->x); + + /* Set new Y position */ + shots[i]->y += shots[i]->yvel; + if ( shots[i]->y > playground.bottom ) + shots[i]->y = playground.top + + (shots[i]->y-playground.bottom); + else if ( shots[i]->y < playground.top ) + shots[i]->y = playground.bottom - + (playground.top-shots[i]->y); + + /* -- Setup the hit rectangle */ + offset = (shots[i]->y>>SPRITE_PRECISION); + shots[i]->hitRect.top = offset; + shots[i]->hitRect.bottom = offset+SHOT_SIZE; + offset = (shots[i]->x>>SPRITE_PRECISION); + shots[i]->hitRect.left = offset; + shots[i]->hitRect.right = offset+SHOT_SIZE; +#ifdef SERIOUS_DEBUG +printf(" %d = (%d,%d)", i, shots[i]->x, shots[i]->y); +#endif + } +#ifdef SERIOUS_DEBUG +printf("\n"); +#endif + + /* Decrement the Bonus and NoThrust time */ + if ( Bonus && CutBonus-- == 0 ) { + Bonus -= 10; + CutBonus = BONUS_DELAY; + } + if ( NoThrust ) + --NoThrust; + + /* Check to see if we are dead... */ + if ( Dead ) { + if ( --Dead == 0 ) { // New Chance at Life! + if ( NewShip() < 0 ) { + /* Game Over */ + Dead = DEAD_DELAY; + Playing = 0; + } + } + return(0); + } + + /* Update our status... :-) */ + if ( Alive() && ! Exploding ) { + /* Airbrakes slow us down. :) */ + if ( special & AIR_BRAKES ) { + if ( yvec > 0 ) + --yvec; + else if ( yvec < 0 ) + ++yvec; + + if ( xvec > 0 ) + --xvec; + else if ( xvec < 0 ) + ++xvec; + } + + /* Thrust speeds us up! :) */ + if ( Thrusting ) { + if ( ! WasThrusting ) { + sound->PlaySound(gThrusterSound, + 1, 3, ThrustCallback); + WasThrusting = 1; + } + + /* -- The thrust key is down, increase the thrusters! */ + if ( ! NoThrust ) { + Accelerate(gVelocityTable[phase].h, + gVelocityTable[phase].v); + } + } else + WasThrusting = 0; + + /* Shoot baby, shoot. */ + if ( Shooting ) { + if ( ! WasShooting || (special&MACHINE_GUNS) ) { + WasShooting = 1; + + /* Make a single bullet */ + MakeShot(0); + sound->PlaySound(gShotSound, 2); + + if ( special & TRIPLE_FIRE ) { + /* Followed by two more.. */ + MakeShot(1); + MakeShot(-1); + } + } + } else + WasShooting = 0; + + /* We be rotating. :-) */ + if ( Rotating & 0x01 ) { // Heading right.. + if ( ++phase == myblit->numFrames ) + phase = 0; + } + if ( Rotating & 0x10 ) { // Heading left.. + if ( --phase < 0 ) + phase = (myblit->numFrames-1); + } + + /* Check the shields */ + if ( AutoShield ) { + WasShielded = 1; + --AutoShield; + } else if ( ShieldOn ) { + if ( ShieldLevel > 0 ) { + if ( ! WasShielded ) { + sound->PlaySound(gShieldOnSound, 1); + WasShielded = 1; + } + --ShieldLevel; + } else { + sound->PlaySound(gNoShieldSound, 2); + } + } else + WasShielded = 0; + } + return(Object::Move(Freeze)); +} + +void +Player::HandleKeys(void) +{ + /* Wait for keystrokes and sync() */ + unsigned char *inbuf; + int len, i; + + if ( (len=GetSyncBuf(Index, &inbuf)) <= 0 ) + return; + + for ( i=0; i 0 ) { + --gPaused; + } else { + sound->PlaySound(gPauseSound, 5); + ++gPaused; + } + } + if ( inbuf[i] == ABORT_KEY ) + gGameOn = 0; + break; + } + /* Regular key press handling */ + switch(inbuf[++i]) { + case THRUST_KEY: + Thrusting = 1; + break; + case RIGHT_KEY: + Rotating |= 0x01; + break; + case LEFT_KEY: + Rotating |= 0x10; + break; + case SHIELD_KEY: + ShieldOn = 1; + break; + case FIRE_KEY: + Shooting = 1; + break; + case PAUSE_KEY: + if ( gPaused > 0 ) { + --gPaused; + } else { + sound->PlaySound(gPauseSound, 5); + ++gPaused; + } + break; + case ABORT_KEY: + gGameOn = 0; + break; + default: + break; + } + break; + + case KEY_RELEASE: + switch(inbuf[++i]) { + case THRUST_KEY: + Thrusting = 0; + if ( sound->Playing(gThrusterSound) ) + sound->HaltSound(3); + break; + case RIGHT_KEY: + Rotating &= ~0x01; + break; + case LEFT_KEY: + Rotating &= ~0x10; + break; + case SHIELD_KEY: + ShieldOn = 0; + break; + case FIRE_KEY: + Shooting = 0; + break; + case ABORT_KEY: + /* Do nothing on release */; + break; + default: + break; + } + break; + + default: + break; + } + } +} + +void +Player::BlitSprite(void) +{ + int i; + + if ( ! Alive() ) + return; + + /* Draw the new shots */ + OBJ_LOOP(i, numshots) { + int X = (shots[i]->x>>SPRITE_PRECISION); + int Y = (shots[i]->y>>SPRITE_PRECISION); + screen->QueueBlit(X, Y, gPlayerShot); + } + /* Draw the shield, if necessary */ + if ( AutoShield || (ShieldOn && (ShieldLevel > 0)) ) { + screen->QueueBlit(x>>SPRITE_PRECISION, y>>SPRITE_PRECISION, + gShieldBlit->sprite[Sphase]); + } + /* Draw the thrust, if necessary */ + if ( Thrusting && ! NoThrust ) { + int thrust_x, thrust_y; + thrust_x = x + gThrustOrigins[phase].h; + thrust_y = y + gThrustOrigins[phase].v; + screen->QueueBlit(thrust_x>>SPRITE_PRECISION, + thrust_y>>SPRITE_PRECISION, + ThrustBlit->sprite[phase]); + } + + /* Draw our ship */ + Object::BlitSprite(); +} +void +Player::UnBlitSprite(void) +{ + int i; + + if ( ! Alive() ) + return; + + /* Erase all old shots */ + OBJ_LOOP(i, numshots) { + int X = (shots[i]->x>>SPRITE_PRECISION); + int Y = (shots[i]->y>>SPRITE_PRECISION); + screen->Clear(X, Y, SHOT_SIZE, SHOT_SIZE, DOCLIP); + } + /* Erase the thrust, if necessary */ + if ( WasThrusting ) { + int thrust_x, thrust_y; + thrust_x = (x + gThrustOrigins[phase].h)>>SPRITE_PRECISION; + thrust_y = (y + gThrustOrigins[phase].v)>>SPRITE_PRECISION; + screen->Clear(thrust_x, thrust_y, 16, 16, DOCLIP); + if ( ThrustBlit == gThrust1 ) + ThrustBlit = gThrust2; + else + ThrustBlit = gThrust1; + } + if ( WasShielded ) { + if ( Sphase ) + Sphase = 0; + else + Sphase = 1; + } + Object::UnBlitSprite(); +} +void +Player::HitSound(void) +{ + sound->PlaySound(gSteelHit, 3); +} +void +Player::ExplodeSound(void) +{ + sound->PlaySound(gShipHitSound, 3); +} + +void +Player::AbortGame(void) +{ + QueueKey(KEY_PRESS, ABORT_KEY); +} + +/* Private functions... */ + +int +Player::MakeShot(int offset) +{ + int shotphase; + + if ( numshots == MAX_SHOTS ) + return(-1); + + /* Handle the velocity */ + if ( (shotphase = phase+offset) < 0 ) + shotphase = myblit->numFrames-1; + else if ( shotphase == myblit->numFrames ) + shotphase = 0; + shots[numshots]->yvel = + (gVelocityTable[shotphase].v<xvel = + (gVelocityTable[shotphase].h<x = x; + shots[numshots]->y = y; + offset = ((SPRITES_WIDTH/2)-2)<x += offset; + shots[numshots]->y += offset; + + shots[numshots]->xvel += xvec; + shots[numshots]->x -= xvec; + shots[numshots]->yvel += yvec; + shots[numshots]->y -= yvec; + + /* -- Setup the hit rectangle */ + offset = (shots[numshots]->y>>SPRITE_PRECISION); + shots[numshots]->hitRect.top = offset; + shots[numshots]->hitRect.bottom = offset+SHOT_SIZE; + offset = (shots[numshots]->x>>SPRITE_PRECISION); + shots[numshots]->hitRect.left = offset; + shots[numshots]->hitRect.right = offset+SHOT_SIZE; + + /* How LONG do they live? :) */ + if ( special & LONG_RANGE ) + shots[numshots]->ttl = (SHOT_DURATION * 2); + else + shots[numshots]->ttl = SHOT_DURATION; + return(++numshots); +} +void +Player::KillShot(int index) +{ + OBJ_KILL(shots, index, numshots, Shot); +} + +/* The Shot sprites for the Shinobi and Player */ + +Uint8 gPlayerShotColors[] = { + 0xF0, 0xCC, 0xCC, 0xF0, + 0xCC, 0x96, 0xC6, 0xCC, + 0xCC, 0xC6, 0xC6, 0xCC, + 0xF0, 0xCC, 0xCC, 0xF0 +}; +SDL_Surface *gPlayerShot; +Uint8 gEnemyShotColors[] = { + 0xDC, 0xDA, 0xDA, 0xDC, + 0xDA, 0x17, 0x23, 0xDA, + 0xDA, 0x23, 0x23, 0xDA, + 0xDC, 0xDA, 0xDA, 0xDC +}; +SDL_Surface *gEnemyShot; + +Uint8 gPlayerColors[MAX_PLAYERS][3] = { + { 0x00, 0x00, 0xFF }, /* Player 1 */ + { 0xFF, 0x99, 0xFF }, /* Player 2 */ + { 0x33, 0x99, 0x00 }, /* Player 3 */ +}; + +/* The players!! */ +Player *gPlayers[MAX_PLAYERS]; diff --git a/netlogic/player.h b/netlogic/player.h new file mode 100644 index 0000000..3922f91 --- /dev/null +++ b/netlogic/player.h @@ -0,0 +1,160 @@ + +#include "protocol.h" + +/* Special features of the player */ +#define MACHINE_GUNS 0x01 +#define AIR_BRAKES 0x02 +#define TRIPLE_FIRE 0x04 +#define LONG_RANGE 0x08 +#define LUCKY_IRISH 0x80 + +class Player : public Object { + +public: + Player(int index); + ~Player(); + + virtual int IsPlayer(void) { + return(1); + } + virtual int Alive(void) { + return(!Dead); + } + virtual int Kicking(void) { + return(Playing); + } + virtual void NewGame(int lives); + virtual void NewWave(void); + /* NewShip() MUST be called before Move() */ + virtual int NewShip(void); + virtual int BeenShot(Object *ship, Shot *shot); + virtual int BeenRunOver(Object *ship); + virtual int BeenDamaged(int damage); + virtual int BeenTimedOut(void); + virtual int Explode(void); + virtual Shot *ShotHit(Rect *hitRect); + virtual int Move(int Freeze); + virtual void HandleKeys(void); + virtual void BlitSprite(void); + virtual void UnBlitSprite(void); + + /* Small access functions */ + virtual Uint32 Color(void) { + return(ship_color); + } + virtual void IncrLives(int lives); + virtual int GetLives(void) { + return(Lives); + } + virtual void IncrScore(int score) { + Score += score; + } + virtual unsigned int GetScore(void) { + if ( Score < 0 ) { + return(0); + } else { + return(Score); + } + } + virtual void IncrFrags(void); + virtual int GetFrags(void) { + return(Frags); + } + virtual void Multiplier(int multiplier) { + BonusMult = multiplier; + } + virtual void MultBonus(void) { + Bonus *= BonusMult; + } + virtual void IncrBonus(int bonus) { + Bonus += bonus; + } + virtual int GetBonus(void) { + return(Bonus); + } + virtual int GetBonusMult(void) { + return(BonusMult); + } + virtual void IncrShieldLevel(int level) { + ShieldLevel += level; + if ( ShieldLevel > MAX_SHIELD ) + ShieldLevel = MAX_SHIELD; + } + virtual int GetShieldLevel(void) { + return(ShieldLevel); + } + virtual void CutThrust(int duration) { + NoThrust = duration; + } + virtual int IsThrusting(void) { + return(Thrusting); + } + virtual void SetSpecial(unsigned char Spec) { + special |= Spec; + } + virtual int GetSpecial(unsigned char Spec) { + return(special&Spec); + } + virtual void HitSound(void); + virtual void ExplodeSound(void); + + virtual void ShowDot(void) { + /* Draw our identity dot */ + int X, Y; + if ( ! Alive() ) { + return; + } + X = (x>>SPRITE_PRECISION)+12; + Y = (y>>SPRITE_PRECISION)+12; + if ( (X > gClipRect.x) && (X < (gClipRect.x+gClipRect.w-4)) && + (Y > gClipRect.y) && (Y < (gClipRect.y+gClipRect.h-4)) ) { + screen->FillRect(X, Y, 4, 4, ship_color); + } + } + virtual void AbortGame(void); + +private: + int Index; + int Lives; + int Score; + int Frags; + int Bonus; + int BonusMult; + int CutBonus; + int ShieldLevel; + int ShieldOn; + int AutoShield; + int WasShielded; + int Sphase; + int Thrusting; + int NoThrust; + Blit *ThrustBlit; + int WasThrusting; + int Shooting; + int WasShooting; + int Rotating; + unsigned char special; + int Playing; + int Dead; + + Shot *shots[MAX_SHOTS]; + int nextshot; + int shotodds; + int target; + int numshots; + Uint32 ship_color; + + struct sockaddr_in *myaddr; + + /* Create a new shot */ + int MakeShot(int offset); + /* Rubout a flying shot */ + void KillShot(int index); +}; + +#define OurShip gPlayers[gOurPlayer] +#define TheShip gPlayers[gDisplayed] + +/* The Players!! */ +extern Player *gPlayers[MAX_PLAYERS]; +extern Uint8 gPlayerColors[MAX_PLAYERS][3]; diff --git a/netlogic/protocol.h b/netlogic/protocol.h new file mode 100644 index 0000000..6054a95 --- /dev/null +++ b/netlogic/protocol.h @@ -0,0 +1,23 @@ + +/* Network protocol for synchronization and keystrokes */ + +#define SYNC_MSG 0x00 /* Sent during game */ +#define NEW_GAME 0x01 /* Sent by players at start */ +#define NET_ABORT 0x04 /* Used with address server */ +#define KEY_PRESS 0x80 /* Sent during game */ +#define KEY_RELEASE 0xF0 /* Sent during game */ + +/* * * * * * * * + This stuff is shared between netplay.cc and netplayd +*/ +/* The default port for Maelstrom games. What is 0xAEAE?? *shrug* :) */ +#define NETPLAY_PORT 0xAEAE /* port 44718 */ + +/* The minimum length of a new packet buffer */ +#define NEW_PACKETLEN (3+3*4) + +/* Note: if you change MAX_PLAYERS, you need to modify the gPlayerColors + array in player.cc +*/ +#define MAX_PLAYERS 3 /* No more than 255!! */ + diff --git a/netlogic/shinobi.h b/netlogic/shinobi.h new file mode 100644 index 0000000..45fb5b8 --- /dev/null +++ b/netlogic/shinobi.h @@ -0,0 +1,273 @@ + +/* Da da da dum, the ENEMY */ + +class Shinobi : public Object { + +public: + Shinobi(int X, int Y, Blit *blit, int ShotOdds) : + Object(X, Y, 0, 0, blit, 1) { + Set_Points(ENEMY_PTS); + Set_HitPoints(ENEMY_HITS); + + for ( int i=0; idamage = PLAYER_HITS; + } + nextshot = 0; + shotodds = ShotOdds; + target = AcquireTarget(); + barrel = phase; + numshots = 0; + + gEnemySprite = this; + sound->PlaySound(gEnemyAppears, 4); + } + ~Shinobi() { + for ( int i=0; iAlive() ) + break; + } + if ( i != gNumPlayers ) { // Player(s) alive! + do { + newtarget = FastRandom(gNumPlayers); + } while ( ! gPlayers[newtarget]->Alive() ); + } + return(newtarget); + } + + + virtual Shot *ShotHit(Rect *hitRect) { + int i; + /* Shots are painless if we are exploding */ + if ( Exploding ) + return(NULL); + + /* Otherwise.. Ow! :-) */ + OBJ_LOOP(i, numshots) { + if ( Overlap(&shots[i]->hitRect, hitRect) ) { + /* KillShot() rearranges the shot[] array */ + Shot *shotputt = shots[i]; + KillShot(i); + return(shotputt); + } + } + return(NULL); + } + virtual int Move(int Frozen) { + int DX, DY, slope; + int newphase; + int coin, i, alive; + + /* Move and time out old shots */ + OBJ_LOOP(i, numshots) { + int offset; + + if ( --shots[i]->ttl == 0 ) { + KillShot(i); + continue; + } + + /* Set new X position */ + shots[i]->x += shots[i]->xvel; + if ( shots[i]->x > playground.right ) + shots[i]->x = playground.left + + (shots[i]->x-playground.right); + else if ( shots[i]->x < playground.left ) + shots[i]->x = playground.right - + (playground.left-shots[i]->x); + + /* Set new Y position */ + shots[i]->y += shots[i]->yvel; + if ( shots[i]->y > playground.bottom ) + shots[i]->y = playground.top + + (shots[i]->y-playground.bottom); + else if ( shots[i]->y < playground.top ) + shots[i]->y = playground.bottom - + (playground.top-shots[i]->y); + + /* -- Setup the hit rectangle */ + offset = (shots[i]->y>>SPRITE_PRECISION); + shots[i]->hitRect.top = offset; + shots[i]->hitRect.bottom = offset+SHOT_SIZE; + offset = (shots[i]->x>>SPRITE_PRECISION); + shots[i]->hitRect.left = offset; + shots[i]->hitRect.right = offset+SHOT_SIZE; + } + + /* Do no shooting if we are exploding. */ + if ( Exploding ) { + return(Object::Move(Frozen)); + } + + /* Find out where our target is */ + if ( ((target >= 0) && gPlayers[target]->Alive()) || + ((target=AcquireTarget()) >= 0) ) { + gPlayers[target]->GetPos(&DX, &DY); + DX -= x; + DY -= y; + slope = (abs(DX)-abs(DY)); + + /* -- See if we should accelerate */ + /* -- figure out what sector we are in */ + if ( DY < 0 ) { + if ( DX < 0 ) { + /* -- We are in sector 4 */ + newphase = 6; + if ( slope < 0 ) + ++newphase; + } else { + /* -- We are in sector 1 */ + newphase = 0; + if ( slope > 0 ) + ++newphase; + } + } else { + if ( DX < 0 ) { + /* -- We are in sector 3 */ + newphase = 4; + if ( slope > 0 ) + ++newphase; + } else { + /* -- We are in sector 2 */ + newphase = 2; + if ( slope < 0 ) + ++newphase; + } + } + + newphase *= 6; + newphase += FastRandom(6); + + /* -- Turn to a new one */ + xvec = 30; + + coin = FastRandom(100); + if ( coin == 0 ) + yvec = 30; + else if ( coin == 1 ) + yvec = -30; + else if ( coin < 7 ) + yvec = 0; + + barrel = (barrel + newphase)/2; +//error("phase = %d, blit = 0x%x\n", barrel, myblit); + ++nextshot; + if ( (FastRandom(shotodds) == 0) && + (nextshot >= ENEMY_SHOT_DELAY) ) { + /* -- If we are within range and facing the ship, FIRE! */ + (void) MakeShot(0); + } + } + + alive = Object::Move(Frozen); + + if ( ((x+26)>>SPRITE_PRECISION) >= SCREEN_WIDTH ) + alive = -1; + return(alive); + } + virtual void BlitSprite(void) { + /* Draw the new shots */ + int i; + OBJ_LOOP(i, numshots) { + int X = (shots[i]->x>>SPRITE_PRECISION); + int Y = (shots[i]->y>>SPRITE_PRECISION); + screen->QueueBlit(X, Y, gEnemyShot); + } + Object::BlitSprite(); + } + virtual void UnBlitSprite(void) { + /* Erase all old shots */ + int i; + OBJ_LOOP(i, numshots) { + int X = (shots[i]->x>>SPRITE_PRECISION); + int Y = (shots[i]->y>>SPRITE_PRECISION); + screen->Clear(X, Y, SHOT_SIZE, SHOT_SIZE, DOCLIP); + } + Object::UnBlitSprite(); + } + + virtual void HitSound(void) { + sound->PlaySound(gBonk, 3); + } + virtual void ExplodeSound(void) { + sound->PlaySound(gExplosionSound, 3); + } + +private: + Shot *shots[MAX_SHOTS]; + int nextshot; + int shotodds; + int target; + int barrel; + int numshots; + + virtual int MakeShot(int offset) { + int shotphase; + + if ( numshots == MAX_SHOTS ) + return(-1); + + /* Handle the velocity */ + if ( (shotphase = barrel+offset) < 0 ) + shotphase = myblit->numFrames-1; + else if ( shotphase == myblit->numFrames ) + shotphase = 0; + shots[numshots]->yvel = + (gVelocityTable[shotphase].v<xvel = + (gVelocityTable[shotphase].h<x = x; + shots[numshots]->y = y; + offset = ((SPRITES_WIDTH/2)-2)<x += offset; + shots[numshots]->y += offset; + + shots[numshots]->xvel += xvec; + shots[numshots]->x -= xvec; + shots[numshots]->yvel += yvec; + shots[numshots]->y -= yvec; + + /* -- Setup the hit rectangle */ + offset = (shots[numshots]->y>>SPRITE_PRECISION); + shots[numshots]->hitRect.top = offset; + shots[numshots]->hitRect.bottom = offset+SHOT_SIZE; + offset = (shots[numshots]->x>>SPRITE_PRECISION); + shots[numshots]->hitRect.left = offset; + shots[numshots]->hitRect.right = offset+SHOT_SIZE; + + /* How LONG do they live? :) */ + shots[numshots]->ttl = SHOT_DURATION; + return(++numshots); + } + + virtual void KillShot(int index) { + OBJ_KILL(shots, index, numshots, Shot); + } +}; + + +class BigShinobi : public Shinobi { + +public: + BigShinobi(int X, int Y) : Shinobi(X, Y, gEnemyShip, 30) { + } +}; + +class LittleShinobi : public Shinobi { + +public: + LittleShinobi(int X, int Y) : Shinobi(X, Y, gEnemyShip2, 15) { + } +}; + diff --git a/netscore.cpp b/netscore.cpp new file mode 100644 index 0000000..27c2713 --- /dev/null +++ b/netscore.cpp @@ -0,0 +1,210 @@ + +/* This module registers a high score with the official Maelstrom + score server +*/ +#include + +#include "SDL_net.h" + +#include "Maelstrom_Globals.h" +#include "netscore.h" +#include "checksum.h" + +#define NUM_SCORES 10 // Copied from scores.cc + +static TCPsocket Goto_ScoreServer(char *server, int port); +static void Leave_ScoreServer(TCPsocket remote); + +/* This function actually registers the high scores */ +void RegisterHighScore(Scores high) +{ + TCPsocket remote; + int i, n; + unsigned char key[KEY_LEN]; + unsigned int keynums[KEY_LEN]; + char netbuf[1024], *crc; + + remote = Goto_ScoreServer(SCORE_HOST, SCORE_PORT); + if ( remote == NULL ) { + error( + "Warning: Couldn't connect to Maelstrom Score Server.\r\n"); + error("-- High Score not registered.\r\n"); + return; + } + + /* Read the welcome banner */ + SDLNet_TCP_Recv(remote, netbuf, 1024); + + /* Get the key... */ + strcpy(netbuf, "SHOWKEY\n"); + SDLNet_TCP_Send(remote, netbuf, strlen(netbuf)); + if ( SDLNet_TCP_Recv(remote, netbuf, 1024) <= 0 ) { + error("Warning: Score Server protocol error.\r\n"); + error("-- High Score not registered.\r\n"); + return; + } + for ( i=0, n=0, crc=netbuf; i < KEY_LEN; ++i, ++n ) { + key[i] = 0xFF; + if ( ! (crc=strchr(++crc, ':')) || + (sscanf(crc, ": 0x%x", &keynums[i]) <= 0) ) + break; + } +/*error("%d items read:\n", n);*/ + if ( n != KEY_LEN ) + error("Warning: short authentication key.\n"); + for ( i=0; i 0 ) { + netbuf[n] = '\0'; + if ( strncmp(netbuf, "Accepted!", 9) != 0 ) { + error("New high score was rejected: %s", netbuf); + } + } else + perror("Read error on socket"); + Leave_ScoreServer(remote); +} + +/* This function is just a hack */ +int GetLine(TCPsocket remote, char *buffer, int maxlen) +{ + int packed = 0; + static int lenleft, len; + static char netbuf[1024], *ptr=NULL; + + if ( buffer == NULL ) { + lenleft = 0; + return(0); + } + if ( lenleft <= 0 ) { + len = SDLNet_TCP_Recv(remote, netbuf, 1024); + if ( len <= 0 ) + return(-1); + lenleft = len; + ptr = netbuf; + } + while ( (*ptr != '\n') && (*ptr != '\r') ) { + if ( lenleft <= 0 ) { + len = SDLNet_TCP_Recv(remote, netbuf, 1024); + if ( len <= 0 ) { + *buffer = '\0'; + return(packed); + } + lenleft = len; + ptr = netbuf; + } + if ( maxlen == 0 ) { + *buffer = '\0'; + return(packed); + } + *(buffer++) = *(ptr++); + ++packed; + --maxlen; + --lenleft; + } + ++ptr; --lenleft; + *buffer = '\0'; + return(packed); +} + +/* Load the scores from the network score server */ +int NetLoadScores(void) +{ + TCPsocket remote; + int i; + char netbuf[1024], *ptr; + + remote = Goto_ScoreServer(SCORE_HOST, SCORE_PORT); + if ( remote == NULL ) { + error( + "Warning: Couldn't connect to Maelstrom Score Server.\r\n"); + return(-1); + } + + /* Read the welcome banner */ + SDLNet_TCP_Recv(remote, netbuf, 1024); + + /* Send our request */ + strcpy(netbuf, "SHOWSCORES\n"); + SDLNet_TCP_Send(remote, netbuf, strlen(netbuf)); + + /* Read the response */ + GetLine(remote, NULL, 0); + GetLine(remote, netbuf, 1024-1); + memset(&hScores, 0, NUM_SCORES*sizeof(Scores)); + for ( i=0; i= netbuf) && isspace(*tail) ) + *(tail--) = '\0'; + strncpy(hScores[i].name, netbuf, + sizeof(hScores[i].name)-1); + if ( (len=strlen(netbuf)) > + (int)(sizeof(hScores[i].name)-1) ) + len = (sizeof(hScores[i].name)-1); + hScores[i].name[len] = '\0'; + *ptr = '\t'; + break; + } + } + if ( sscanf(ptr, "%u %u", &hScores[i].score, + &hScores[i].wave) != 2 ) { + error( + "Warning: Couldn't read complete score list!\r\n"); + error("Line was: %s", netbuf); + break; + } + } + Leave_ScoreServer(remote); + return(0); +} + +static TCPsocket Goto_ScoreServer(char *server, int port) +{ + TCPsocket remote; + IPaddress remote_address; + + if ( SDLNet_Init() < 0 ) { + return(NULL); + } + + /* + * Fill in the structure "serv_addr" with the address of the + * server that we want to connect with. + */ + SDLNet_ResolveHost(&remote_address, server, port); + if ( remote_address.host == INADDR_NONE ) { + /*error("%s: host name error.\n", server);*/ + return(NULL); + } + + /* + * Open a TCP socket (an Internet stream socket). + */ + remote = SDLNet_TCP_Open(&remote_address); + return(remote); +} + +static void Leave_ScoreServer(TCPsocket remote) +{ + SDLNet_TCP_Close(remote); + SDLNet_Quit(); +} diff --git a/netscore.h b/netscore.h new file mode 100644 index 0000000..fed5ef1 --- /dev/null +++ b/netscore.h @@ -0,0 +1,10 @@ + +/* Definitions for the network part of the score service */ + +#define SCORE_HOST "devolution.com" +#define SCORE_PORT 4444 + +#define KEY_LEN 4 /* Auth key length in bytes */ + +/* CRC Name Score Wave */ +#define SCOREFMT "NEWSCORE\t%s\t%s\t%-3.1u\t%u\n" diff --git a/public_key.h b/public_key.h new file mode 100644 index 0000000..d8c3635 --- /dev/null +++ b/public_key.h @@ -0,0 +1,8 @@ +/* RSA Public Key */ + +static R_RSA_PUBLIC_KEY public_key = { + /* bits */ 512, + /* modulus */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x68, 0x99, 0xB7, 0x4E, 0x93, 0xE1, 0x51, 0x26, 0x1A, 0x15, 0xB6, 0xF7, 0xE4, 0x12, 0xF8, 0xFE, 0x0F, 0x41, 0x5C, 0x31, 0x0B, 0xD1, 0x7B, 0x20, 0x10, 0x0D, 0x73, 0xD8, 0x05, 0xAE, 0x96, 0x32, 0x49, 0x54, 0x57, 0xD0, 0x15, 0x77, 0xD2, 0x33, 0x90, 0xF9, 0x44, 0x30, 0xCB, 0xE3, 0x3E, 0xF0, 0x63, 0xF7, 0x49, 0x23, 0xC1, 0xF2, 0x27, 0x66, 0x13, 0xCB, 0xCC, 0x54, 0x1B, 0x1E, 0xB9, }, + /* exponent */ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, }, +}; + diff --git a/rect.cpp b/rect.cpp new file mode 100644 index 0000000..cf391bc --- /dev/null +++ b/rect.cpp @@ -0,0 +1,26 @@ + +#include "rect.h" + +void SetRect(Rect *R, int left, int top, int right, int bottom) +{ + R->left = left; + R->top = top; + R->right = right; + R->bottom = bottom; +} + +void OffsetRect(Rect *R, int x, int y) +{ + R->left += x; + R->top += y; + R->right += x; + R->bottom += y; +} + +void InsetRect(Rect *R, int x, int y) +{ + R->left += x; + R->top += y; + R->right -= x; + R->bottom -= y; +} diff --git a/rect.h b/rect.h new file mode 100644 index 0000000..134b17e --- /dev/null +++ b/rect.h @@ -0,0 +1,23 @@ + +#ifndef _rect_h +#define _rect_h + +/* Avoid collisions with Mac data structures */ +#define Rect MaelstromRect +#define SetRect SetMaelstromRect +#define OffsetRect OffsetMaelstromRect +#define InsetRect InsetMaelstromRect + +typedef struct { + short top; + short left; + short bottom; + short right; +} Rect; + +/* Functions exported from rect.cpp */ +extern void SetRect(Rect *R, int left, int top, int right, int bottom); +extern void OffsetRect(Rect *R, int x, int y); +extern void InsetRect(Rect *R, int x, int y); + +#endif /* _rect_h */ diff --git a/scores.cpp b/scores.cpp new file mode 100644 index 0000000..1633e8f --- /dev/null +++ b/scores.cpp @@ -0,0 +1,271 @@ + +/* + This file handles the cheat dialogs and the high score file +*/ + +#ifdef unix +#include +#include +#endif +#include + +#include "SDL_endian.h" + +#include "Maelstrom_Globals.h" +#include "load.h" +#include "dialog.h" + +#define MAELSTROM_SCORES "Maelstrom-Scores" +#define NUM_SCORES 10 // Do not change this! + +/* Everyone can write to scores file if defined to 0 */ +#define SCORES_PERMMASK 0 + +#define CLR_DIALOG_WIDTH 281 +#define CLR_DIALOG_HEIGHT 111 + +Bool gNetScores = 0; +Scores hScores[NUM_SCORES]; + +void LoadScores(void) +{ + LibPath path; + SDL_RWops *scores_src; + int i; + + /* Try to load network scores, if we can */ + if ( gNetScores ) { + if ( NetLoadScores() == 0 ) + return; + else { + mesg("Using local score file\n\n"); + gNetScores = 0; + } + } + memset(&hScores, 0, sizeof(hScores)); + + scores_src = SDL_RWFromFile(path.Path(MAELSTROM_SCORES), "rb"); + if ( scores_src != NULL ) { + for ( i=0; iNewFont("Chicago", 12)) == NULL ) { + error("Can't use Chicago font!\n"); + return(0); + } + if ( (splash = Load_Title(screen, 102)) == NULL ) { + error("Can't load score zapping splash!\n"); + delete chicago; + return(0); + } + dialog = new Maclike_Dialog(X, Y, CLR_DIALOG_WIDTH, CLR_DIALOG_HEIGHT, + screen); + dialog->Add_Image(splash, 4, 4); + do_clear = 0; + clear = new Mac_Button(99, 74, BUTTON_WIDTH, BUTTON_HEIGHT, + "Clear", chicago, fontserv, Clear_callback); + dialog->Add_Dialog(clear); + cancel = new Mac_DefaultButton(99+BUTTON_WIDTH+14, 74, + BUTTON_WIDTH, BUTTON_HEIGHT, + "Cancel", chicago, fontserv, Cancel_callback); + dialog->Add_Dialog(cancel); + + /* Run the dialog box */ + dialog->Run(); + + /* Clean up and return */ + screen->FreeImage(splash); + delete chicago; + delete dialog; + if ( do_clear ) { + memset(hScores, 0, sizeof(hScores)); + SaveScores(); + gLastHigh = -1; + } + return(do_clear); +} + + +#define LVL_DIALOG_WIDTH 346 +#define LVL_DIALOG_HEIGHT 136 + +static int do_level; + +static int Level_callback(void) { + do_level = 1; + return(1); +} +static int Cancel2_callback(void) { + do_level = 0; + return(1); +} + +int GetStartLevel(void) +{ + static char *Ltext1 = + "Enter the level to start from (1-40). This"; + static char *Ltext2 = + "disqualifies you from a high score..."; + static char *Ltext3 = "Level:"; + static char *Ltext4 = "Lives:"; + MFont *chicago; + Maclike_Dialog *dialog; + SDL_Surface *splash; + SDL_Surface *text1, *text2, *text3, *text4; + static char *turbotext = "Turbofunk On"; + int x, y, X, Y; + Mac_Button *doit; + Mac_Button *cancel; + Mac_NumericEntry *numeric_entry; + Mac_CheckBox *checkbox; + int startlevel=10, startlives=5, turbofunk=0; + + /* Set up all the components of the dialog box */ + if ( (chicago = fontserv->NewFont("Chicago", 12)) == NULL ) { + error("Can't use Chicago font!\n"); + return(0); + } + if ( (splash = GetCIcon(screen, 103)) == NULL ) { + error("Can't load alien level splash!\n"); + delete chicago; + return(0); + } + X=(SCREEN_WIDTH-LVL_DIALOG_WIDTH)/2; + Y=(SCREEN_HEIGHT-LVL_DIALOG_HEIGHT)/2; + dialog = new Maclike_Dialog(X, Y, LVL_DIALOG_WIDTH, LVL_DIALOG_HEIGHT, + screen); + x = y = 14; + dialog->Add_Image(splash, x, y); + x += (splash->w+14); + text1 = fontserv->TextImage(Ltext1,chicago,STYLE_NORM,0x00,0x00,0x00); + dialog->Add_Image(text1, x, y); + y += (text1->h+2); + text2 = fontserv->TextImage(Ltext2, chicago, STYLE_NORM, + 0x00, 0x00, 0x00); + dialog->Add_Image(text2, x, y); + do_level = 0; + cancel = new Mac_Button(166, 96, 73, BUTTON_HEIGHT, + "Cancel", chicago, fontserv, Cancel2_callback); + dialog->Add_Dialog(cancel); + doit = new Mac_DefaultButton(166+73+14, 96, BUTTON_WIDTH, BUTTON_HEIGHT, + "Do it!", chicago, fontserv, Level_callback); + dialog->Add_Dialog(doit); + numeric_entry = new Mac_NumericEntry(X, Y, chicago, fontserv); + numeric_entry->Add_Entry(78, 60, 3, 1, &startlevel); + text3 = fontserv->TextImage(Ltext3,chicago,STYLE_NORM,0x00,0x00,0x00); + dialog->Add_Image(text3, 78-text3->w-2, 60+3); + numeric_entry->Add_Entry(78, 86, 3, 0, &startlives); + text4 = fontserv->TextImage(Ltext4,chicago,STYLE_NORM,0x00,0x00,0x00); + dialog->Add_Image(text4, 78-text3->w-2, 86+3); + dialog->Add_Dialog(numeric_entry); + checkbox = new Mac_CheckBox(&turbofunk, 136, 64, turbotext, + chicago, fontserv); + dialog->Add_Dialog(checkbox); + + /* Run the dialog box */ + dialog->Run(EXPAND_STEPS); + + /* Clean up and return */ + screen->FreeImage(splash); + fontserv->FreeText(text1); + fontserv->FreeText(text2); + fontserv->FreeText(text3); + fontserv->FreeText(text4); + delete chicago; + delete dialog; + if ( do_level ) { + if ( ! startlives || (startlives > 40) ) + startlives = 3; + gStartLives = startlives; + if ( startlevel > 40 ) + startlevel = 0; + gStartLevel = startlevel; + gNoDelay = turbofunk; + return(gStartLevel); + } + return(0); +} + diff --git a/scores.h b/scores.h new file mode 100644 index 0000000..4126260 --- /dev/null +++ b/scores.h @@ -0,0 +1,15 @@ + +// Functions from scores.cc +extern void LoadScores(void); +extern void SaveScores(void); +extern int ZapHighScores(void); +extern int GetStartLevel(void); +extern void PrintHighScores(void); + +/* The high scores structure */ +typedef struct { + char name[20]; + Uint32 wave; + Uint32 score; +} Scores; + diff --git a/screenlib/COPYING b/screenlib/COPYING new file mode 100644 index 0000000..960fe74 --- /dev/null +++ b/screenlib/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + END OF TERMS AND CONDITIONS diff --git a/screenlib/Makefile.am b/screenlib/Makefile.am new file mode 100644 index 0000000..71cf13c --- /dev/null +++ b/screenlib/Makefile.am @@ -0,0 +1,8 @@ + +noinst_LIBRARIES = libSDLscreen.a + +libSDLscreen_a_SOURCES = \ + SDL_FrameBuf.cpp \ + SDL_FrameBuf.h \ + pixel.cpp \ + pixel.h diff --git a/screenlib/Makefile.in b/screenlib/Makefile.in new file mode 100644 index 0000000..0732228 --- /dev/null +++ b/screenlib/Makefile.in @@ -0,0 +1,272 @@ +# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am + +# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include + +DESTDIR = + +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ + +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +transform = @program_transform_name@ + +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ +CC = @CC@ +CXX = @CXX@ +GAME_INSTALLDIR = @GAME_INSTALLDIR@ +ICONOBJ = @ICONOBJ@ +INETLIB = @INETLIB@ +MAKEINFO = @MAKEINFO@ +MATHLIB = @MATHLIB@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_CONFIG = @SDL_CONFIG@ +SDL_LIBS = @SDL_LIBS@ +VERSION = @VERSION@ + +noinst_LIBRARIES = libSDLscreen.a + +libSDLscreen_a_SOURCES = SDL_FrameBuf.cpp SDL_FrameBuf.h pixel.cpp pixel.h + +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +LIBRARIES = $(noinst_LIBRARIES) + + +DEFS = @DEFS@ -I. -I$(srcdir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +libSDLscreen_a_LIBADD = +libSDLscreen_a_OBJECTS = SDL_FrameBuf.o pixel.o +AR = ar +CXXFLAGS = @CXXFLAGS@ +CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ +CFLAGS = @CFLAGS@ +COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ +DIST_COMMON = README COPYING Makefile.am Makefile.in + + +DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +TAR = gtar +GZIP_ENV = --best +SOURCES = $(libSDLscreen_a_SOURCES) +OBJECTS = $(libSDLscreen_a_OBJECTS) + +all: all-redirect +.SUFFIXES: +.SUFFIXES: .S .c .cpp .o .s +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) + cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps screenlib/Makefile + +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + + +mostlyclean-noinstLIBRARIES: + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + +distclean-noinstLIBRARIES: + +maintainer-clean-noinstLIBRARIES: + +.c.o: + $(COMPILE) -c $< + +.s.o: + $(COMPILE) -c $< + +.S.o: + $(COMPILE) -c $< + +mostlyclean-compile: + -rm -f *.o core *.core + +clean-compile: + +distclean-compile: + -rm -f *.tab.c + +maintainer-clean-compile: + +libSDLscreen.a: $(libSDLscreen_a_OBJECTS) $(libSDLscreen_a_DEPENDENCIES) + -rm -f libSDLscreen.a + $(AR) cru libSDLscreen.a $(libSDLscreen_a_OBJECTS) $(libSDLscreen_a_LIBADD) + $(RANLIB) libSDLscreen.a +.cpp.o: + $(CXXCOMPILE) -c $< + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + here=`pwd` && cd $(srcdir) \ + && mkid -f$$here/ID $$unique $(LISP) + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS)'; \ + unique=`for i in $$list; do echo $$i; done | \ + awk ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ + || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) + +mostlyclean-tags: + +clean-tags: + +distclean-tags: + -rm -f TAGS ID + +maintainer-clean-tags: + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) + +subdir = screenlib + +distdir: $(DISTFILES) + @for file in $(DISTFILES); do \ + d=$(srcdir); \ + if test -d $$d/$$file; then \ + cp -pr $$d/$$file $(distdir)/$$file; \ + else \ + test -f $(distdir)/$$file \ + || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ + || cp -p $$d/$$file $(distdir)/$$file || :; \ + fi; \ + done +info-am: +info: info-am +dvi-am: +dvi: dvi-am +check-am: all-am +check: check-am +installcheck-am: +installcheck: installcheck-am +install-exec-am: +install-exec: install-exec-am + +install-data-am: +install-data: install-data-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am +install: install-am +uninstall-am: +uninstall: uninstall-am +all-am: Makefile $(LIBRARIES) +all-redirect: all-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install +installdirs: + + +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + -rm -f config.cache config.log stamp-h stamp-h[0-9]* + +maintainer-clean-generic: +mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ + mostlyclean-tags mostlyclean-generic + +mostlyclean: mostlyclean-am + +clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ + mostlyclean-am + +clean: clean-am + +distclean-am: distclean-noinstLIBRARIES distclean-compile \ + distclean-tags distclean-generic clean-am + +distclean: distclean-am + +maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ + maintainer-clean-compile maintainer-clean-tags \ + maintainer-clean-generic distclean-am + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + +maintainer-clean: maintainer-clean-am + +.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ +clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ +mostlyclean-compile distclean-compile clean-compile \ +maintainer-clean-compile tags mostlyclean-tags distclean-tags \ +clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/screenlib/README b/screenlib/README new file mode 100644 index 0000000..98032fb --- /dev/null +++ b/screenlib/README @@ -0,0 +1,5 @@ + + +This is a library that sits on top of the SDL screen library and provides +simple image blitting and drawing functions for the SDL framebuffer. + diff --git a/screenlib/SDL_FrameBuf.cpp b/screenlib/SDL_FrameBuf.cpp new file mode 100644 index 0000000..d1e087f --- /dev/null +++ b/screenlib/SDL_FrameBuf.cpp @@ -0,0 +1,877 @@ +/* + SCREENLIB: A framebuffer library based on the SDL library + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#include + +#include "SDL_FrameBuf.h" +#include "pixel.h" + + +#define LOWER_PREC(X) ((X)/16) /* Lower the precision of a value */ +#define RAISE_PREC(X) ((X)/16) /* Raise the precision of a value */ + +#define MIN(A, B) ((A < B) ? A : B) +#define MAX(A, B) ((A > B) ? A : B) + +#define ADJUSTX(X) \ +{ \ + if ( X < 0 ) X = 0; \ + else \ + if ( X > screen->w ) X = screen->w; \ +} +#define ADJUSTY(Y) \ +{ \ + if ( Y < 0 ) Y = 0; \ + else \ + if ( Y > screen->h ) Y = screen->h; \ +} + +/* Constructors cannot fail. :-/ */ +FrameBuf:: FrameBuf() +{ + /* Initialize various variables to null state */ + screenfg = NULL; + screenbg = NULL; + blitQ = NULL; + dirtymap = NULL; + updatelist = NULL; + errstr = NULL; + faded = 0; + locked = 0; + images.next = NULL; + itail = &images; +} + +static void PrintSurface(char *title, SDL_Surface *surface) +{ +#ifdef FRAMEBUF_DEBUG + fprintf(stderr, "%s:\n", title); + fprintf(stderr, "\t%dx%d at %d bpp\n", surface->w, surface->h, + surface->format->BitsPerPixel); + fprintf(stderr, "\tLocated in %s memory\n", + (surface->flags & SDL_HWSURFACE) ? "video" : "system" ); + if ( surface->flags & SDL_HWACCEL ) { + fprintf(stderr, "\t(hardware acceleration possible)\n"); + } + if ( SDL_LockSurface(surface) == 0 ) { + fprintf(stderr, "\tPixels at 0x%x\n", surface->pixels); + SDL_UnlockSurface(surface); + } + fprintf(stderr, "\n"); +#endif + return; +} + +int +FrameBuf:: Init(int width, int height, Uint32 video_flags, + SDL_Color *colors, SDL_Surface *icon) +{ + /* Set the icon, if any */ + if ( icon ) { + int masklen; + Uint8 *mask; + + masklen = ((icon->w+7)/8)*icon->h; + mask = new Uint8[masklen]; + memset(mask, 0xFF, masklen); + SDL_WM_SetIcon(icon, mask); + delete[] mask; + } + + /* Try for the 8-bit video mode that was requested, accept any depth */ + //video_flags |= SDL_ANYFORMAT; + screenfg = SDL_SetVideoMode(width, height, 8, video_flags); + if ( screenfg == NULL ) { + SetError("Couldn't set %dx%d video mode: %s", + width, height, SDL_GetError()); + return(-1); + } + FocusFG(); + PrintSurface("Created foreground", screenfg); + + /* Create the background */ + screenbg = SDL_CreateRGBSurface(screen->flags, screen->w, screen->h, + screen->format->BitsPerPixel, + screen->format->Rmask, + screen->format->Gmask, + screen->format->Bmask, 0); + if ( screenbg == NULL ) { + SetError("Couldn't create background: %s", SDL_GetError()); + return(-1); + } + PrintSurface("Created background", screenbg); + + /* Create a dirty rectangle map of the screen */ + dirtypitch = LOWER_PREC(width); + dirtymaplen = LOWER_PREC(height)*dirtypitch; + dirtymap = new SDL_Rect *[dirtymaplen]; + + /* Create the update list */ + updatelist = new SDL_Rect[UPDATE_CHUNK]; + ClearDirtyList(); + updatemax = UPDATE_CHUNK; + + /* Create the blit list */ + blitQ = new BlitQ[QUEUE_CHUNK]; + blitQlen = 0; + blitQmax = QUEUE_CHUNK; + + /* Set the blit clipping rectangle */ + clip.x = 0; + clip.y = 0; + clip.w = screen->w; + clip.h = screen->h; + + /* Copy the image colormap and set a black background */ + SetBackground(0, 0, 0); + if ( colors ) { + SetPalette(colors); + } + + /* Figure out what putpixel routine to use */ + switch (screen->format->BytesPerPixel) { + case 1: + PutPixel = PutPixel1; + break; + case 2: + PutPixel = PutPixel2; + break; + case 3: + PutPixel = PutPixel3; + break; + case 4: + PutPixel = PutPixel4; + break; + } + return(0); +} + +FrameBuf:: ~FrameBuf() +{ + image_list *ielem, *iold; + + UNLOCK_IF_NEEDED(); + for ( ielem = images.next; ielem; ) { + iold = ielem; + ielem = ielem->next; + SDL_FreeSurface(iold->image); + delete iold; + } + if ( screenbg ) + SDL_FreeSurface(screenbg); + if ( blitQ ) + delete[] blitQ; + if ( dirtymap ) + delete[] dirtymap; + if ( updatelist ) + delete[] updatelist; +} + +/* Setup routines */ +void +FrameBuf:: SetPalette(SDL_Color *colors) +{ + int i; + + if ( screenfg->format->palette ) { + SDL_SetColors(screenfg, colors, 0, 256); + SDL_SetColors(screenbg, screenfg->format->palette->colors, + 0, screenfg->format->palette->ncolors); + } + for ( i=0; i<256; ++i ) { + image_map[i] = SDL_MapRGB(screenfg->format, + colors[i].r, colors[i].g, colors[i].b); + } + SetBackground(BGrgb[0], BGrgb[1], BGrgb[2]); +} +void +FrameBuf:: SetBackground(Uint8 R, Uint8 G, Uint8 B) +{ + BGrgb[0] = R; + BGrgb[1] = G; + BGrgb[2] = B; + BGcolor = SDL_MapRGB(screenfg->format, R, G, B); + FocusBG(); + Clear(); + FocusFG(); +} +Uint32 +FrameBuf:: MapRGB(Uint8 R, Uint8 G, Uint8 B) +{ + return(SDL_MapRGB(screenfg->format, R, G, B)); +} +void +FrameBuf:: ClipBlit(SDL_Rect *cliprect) +{ + clip = *cliprect; +} + +/* Locking routines */ +void +FrameBuf:: Lock(void) +{ + /* Keep trying to lock the screen until we succeed */ + if ( ! locked ) { + ++locked; + while ( SDL_LockSurface(screen) < 0 ) { + SDL_Delay(10); + } + screen_mem = (Uint8 *)screen->pixels; + } +} +void +FrameBuf:: Unlock(void) +{ + if ( locked ) { + SDL_UnlockSurface(screen); + --locked; + } +} +void +FrameBuf:: PerformBlits(void) +{ + if ( blitQlen > 0 ) { + /* Perform lazy unlocking */ + UNLOCK_IF_NEEDED(); + + /* Blast and free the queued blits */ + for ( int i=0; iformat->BytesPerPixel; + screen_loc = screen_mem + y*screen->pitch + x*screen_bpp; + w *= screen_bpp; + while ( h-- ) { + /* Note that BGcolor is a 32 bit quantity while memset() + fills with an 8-bit quantity. This only matters if + the background is a different color than black on a + HiColor or TrueColor display. + */ + memset(screen_loc, BGcolor, w); + screen_loc += screen->pitch; + } + } +} +void +FrameBuf:: DrawPoint(Sint16 x, Sint16 y, Uint32 color) +{ + SDL_Rect dirty; + + /* Adjust the bounds */ + if ( x < 0 ) return; + if ( x > screen->w ) return; + if ( y < 0 ) return; + if ( y > screen->h ) return; + + PerformBlits(); + LOCK_IF_NEEDED(); + PutPixel(screen_mem+y*screen->pitch+x*screen->format->BytesPerPixel, + screen, color); + dirty.x = x; + dirty.y = y; + dirty.w = 1; + dirty.h = 1; + AddDirtyRect(&dirty); +} +/* Simple, slow, line drawing algorithm. Improvement, anyone? :-) */ +void +FrameBuf:: DrawLine(Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color) +{ + SDL_Rect dirty; + Sint16 x , y; + Sint16 lo, hi; + double slope, b; + Uint8 screen_bpp; + Uint8 *screen_loc; + + /* Adjust the bounds */ + ADJUSTX(x1); ADJUSTY(y1); + ADJUSTX(x2); ADJUSTY(y2); + + PerformBlits(); + LOCK_IF_NEEDED(); + screen_bpp = screen->format->BytesPerPixel; + if ( y1 == y2 ) { /* Horizontal line */ + if ( x1 < x2 ) { + lo = x1; + hi = x2; + } else { + lo = x2; + hi = x1; + } + screen_loc = screen_mem + y1*screen->pitch + lo*screen_bpp; + for ( x=lo; x<=hi; ++x ) { + PutPixel(screen_loc, screen, color); + screen_loc += screen_bpp; + } + dirty.x = lo; + dirty.y = y1; + dirty.w = (Uint16)(hi-lo+1); + dirty.h = 1; + AddDirtyRect(&dirty); + } else if ( x1 == x2 ) { /* Vertical line */ + if ( y1 < y2 ) { + lo = y1; + hi = y2; + } else { + lo = y2; + hi = y1; + } + screen_loc = screen_mem + lo*screen->pitch + x1*screen_bpp; + for ( y=lo; y<=hi; ++y ) { + PutPixel(screen_loc, screen, color); + screen_loc += screen->pitch; + } + dirty.x = x1; + dirty.y = lo; + dirty.w = 1; + dirty.h = (Uint16)(hi-lo+1); + AddDirtyRect(&dirty); + } else { + /* Equation: y = mx + b */ + slope = ((double)((int)(y2 - y1)) / + (double)((int)(x2 - x1))); + b = (double)(y1 - slope*(double)x1); + if ( ((slope < 0) ? slope > -1 : slope < 1) ) { + if ( x1 < x2 ) { + lo = x1; + hi = x2; + } else { + lo = x2; + hi = x1; + } + for ( x=lo; x<=hi; ++x ) { + y = (int)((slope*(double)x) + b); + screen_loc = screen_mem + + y*screen->pitch + x*screen_bpp; + PutPixel(screen_loc, screen, color); + } + } else { + if ( y1 < y2 ) { + lo = y1; + hi = y2; + } else { + lo = y2; + hi = y1; + } + for ( y=lo; y<=hi; ++y ) { + x = (int)(((double)y - b)/slope); + screen_loc = screen_mem + + y*screen->pitch + x*screen_bpp; + PutPixel(screen_loc, screen, color); + } + } + dirty.x = MIN(x1, x2); + dirty.y = MIN(y1, y2); + dirty.w = (Uint16)(MAX(x1, x2)-dirty.x+1); + dirty.h = (Uint16)(MAX(y1, y2)-dirty.y+1); + AddDirtyRect(&dirty); + } +} +void +FrameBuf:: DrawRect(Sint16 x, Sint16 y, Uint16 w, Uint16 h, Uint32 color) +{ + SDL_Rect dirty; + int i; + Uint8 screen_bpp; + Uint8 *screen_loc; + + /* Adjust the bounds */ + ADJUSTX(x); ADJUSTY(y); + if ( (x+w) > screen->w ) w = (Uint16)(screen->w-x); + if ( (y+h) > screen->h ) h = (Uint16)(screen->h-y); + + PerformBlits(); + LOCK_IF_NEEDED(); + screen_bpp = screen->format->BytesPerPixel; + + /* Horizontal lines */ + screen_loc = screen_mem + y*screen->pitch + x*screen_bpp; + for ( i=0; ipitch + x*screen_bpp; + for ( i=0; ipitch + x*screen_bpp; + for ( i=0; ipitch; + } + screen_loc = screen_mem + y*screen->pitch + (x+w-1)*screen_bpp; + for ( i=0; ipitch; + } + + /* Update rectangle */ + dirty.x = x; + dirty.y = y; + dirty.w = w; + dirty.h = h; + AddDirtyRect(&dirty); +} +void +FrameBuf:: FillRect(Sint16 x, Sint16 y, Uint16 w, Uint16 h, Uint32 color) +{ + SDL_Rect dirty; + Uint16 i, skip; + Uint8 screen_bpp; + Uint8 *screen_loc; + + /* Adjust the bounds */ + ADJUSTX(x); ADJUSTY(y); + if ( (x+w) > screen->w ) w = (screen->w-x); + if ( (y+h) > screen->h ) h = (screen->h-y); + + /* Set the dirty rectangle */ + dirty.x = x; + dirty.y = y; + dirty.w = w; + dirty.h = h; + + /* Semi-efficient, for now. :) */ + LOCK_IF_NEEDED(); + screen_bpp = screen->format->BytesPerPixel; + screen_loc = screen_mem + y*screen->pitch + x*screen_bpp; + skip = screen->pitch - (w*screen_bpp); + while ( h-- ) { + for ( i=w; i!=0; --i ) { + PutPixel(screen_loc, screen, color); + screen_loc += screen_bpp; + } + screen_loc += skip; + } + AddDirtyRect(&dirty); +} + +static inline void memswap(Uint8 *dst, Uint8 *src, Uint8 len) +{ +#ifdef SWAP_XOR + /* Swap two buffers using ye ol' xor trick :-) */ + while ( len-- ) { + *dst ^= *src; + *src ^= *dst; + *dst ^= *src; + ++src; ++dst; + } +#else + /* Swap two buffers using a temporary variable */ + register Uint8 tmp; + + while ( len-- ) { + tmp = *dst; + *dst = *src; + *src = tmp; + ++src; ++dst; + } +#endif +} + +void +FrameBuf:: Fade(void) +{ + const int max = 32; + Uint16 ramp[256]; + + for ( int j = 1; j <= max; j++ ) { + int v = faded ? j : max - j + 1; + for ( int i = 0; i < 256; i++ ) { + ramp[i] = (i * v / max) << 8; + } + SDL_SetGammaRamp(ramp, ramp, ramp); + SDL_Delay(10); + } + faded = !faded; + + if ( faded ) { + for ( int i = 0; i < 256; i++ ) { + ramp[i] = 0; + } + SDL_SetGammaRamp(ramp, ramp, ramp); + } +} + +SDL_Surface * +FrameBuf:: GrabArea(Uint16 x, Uint16 y, Uint16 w, Uint16 h) +{ + SDL_Surface *area; + + /* Clip the area we are grabbing */ + if ( x >= screen->w ) { + return(NULL); + } + if ( (x+w) > screen->w ) { + w -= (screen->w-(x+w)); + } + if ( y >= screen->h ) { + return(NULL); + } + if ( (y+h) > screen->h ) { + h -= (screen->h-(y+h)); + } + + /* Allocate an area of the same pixel format */ + area = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, + screen->format->BitsPerPixel, + screen->format->Rmask, + screen->format->Gmask, + screen->format->Bmask, 0); + if ( area ) { + Uint8 *area_mem; + Uint8 *scrn_mem; + int cursor_shown; + + if ( area->format->palette ) { + memcpy(area->format->palette->colors, + screen->format->palette->colors, + screen->format->palette->ncolors + *sizeof(SDL_Color)); + } + cursor_shown = SDL_ShowCursor(0); + Lock(); + area_mem = (Uint8 *)area->pixels; + scrn_mem = screen_mem + y*screen->pitch + + x*screen->format->BytesPerPixel; + w *= screen->format->BytesPerPixel; + while ( h-- ) { + memcpy(area_mem, scrn_mem, w); + area_mem += area->pitch; + scrn_mem += screen->pitch; + } + Unlock(); + SDL_ShowCursor(cursor_shown); + } + + /* Add the area to the list of images */ + itail->next = new image_list; + itail = itail->next; + itail->image = area; + itail->next = NULL; + return(area); +} + +int +FrameBuf:: ScreenDump(char *prefix, Uint16 x, Uint16 y, Uint16 w, Uint16 h) +{ + SDL_Surface *dump; + int retval; + + /* Get a suitable new filename */ + dump = GrabArea(x, y, w, h); + if ( dump ) { + int which, found; + char file[1024]; + FILE *fp; + + found = 0; + for ( which=0; !found; ++which ) { + sprintf(file, "%s%d.bmp", prefix, which); + if ( ((fp=fopen(file, "r")) == NULL) && + ((fp=fopen(file, "w")) != NULL) ) { + found = 1; + } + if ( fp != NULL ) { + fclose(fp); + } + } + retval = SDL_SaveBMP(dump, file); + if ( retval < 0 ) { + SetError("%s", SDL_GetError()); + } + FreeImage(dump); + } else { + retval = -1; + } + return(retval); +} + +SDL_Surface * +FrameBuf:: LoadImage(Uint16 w, Uint16 h, Uint8 *pixels, Uint8 *mask) +{ + SDL_Surface *artwork; + int i, j, pad; + Uint8 *art_mem, *pix_mem; + + /* Assume 8-bit artwork using the current palette */ + artwork = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, + screenfg->format->BitsPerPixel, + screenfg->format->Rmask, + screenfg->format->Gmask, + screenfg->format->Bmask, 0); + if ( artwork == NULL ) { + SetError("Couldn't create artwork: %s", SDL_GetError()); + return(NULL); + } + + /* Set the palette and copy pixels, checking for colorkey */ + if ( artwork->format->palette != NULL ) { + memcpy(artwork->format->palette->colors, + screenfg->format->palette->colors, + screenfg->format->palette->ncolors*sizeof(SDL_Color)); + } + pad = ((w%4) ? (4-(w%4)) : 0); + if ( mask ) { + int used[256]; + Uint8 colorkey, m; + + /* Look for an unused palette entry */ + memset(used, 0, 256); + pix_mem = pixels; + for ( i=(w*h); i!=0; --i ) { + ++used[*pix_mem]; + ++pix_mem; + } + for ( i=0; used[i] && i<256; ++i ) { + /* Keep looking */; + } + colorkey = image_map[(Uint8)i]; + + /* Copy over the pixels */ + pix_mem = pixels; + for ( i=0; ipixels + i*artwork->pitch; + for ( j=0; jformat->BytesPerPixel; + pix_mem += 1; + } + pix_mem += pad; + } + SDL_SetColorKey(artwork,SDL_SRCCOLORKEY|SDL_RLEACCEL,colorkey); + } else { + /* Copy over the pixels */ + pix_mem = pixels; + for ( i=0; ipixels + i*artwork->pitch; + for ( j=0; jformat->BytesPerPixel; + pix_mem += 1; + } + pix_mem += pad; + } + } + /* Add the image to the list of images */ + itail->next = new image_list; + itail = itail->next; + itail->image = artwork; + itail->next = NULL; + return(artwork); +} +void +FrameBuf:: FreeImage(SDL_Surface *image) +{ + image_list *ielem, *iold; + + /* Remove the image from the list of images */ + for ( ielem=&images; ielem->next; ) { + iold = ielem->next; + if ( iold->image == image ) { + if ( iold == itail ) { + itail = ielem; + } + ielem->next = iold->next; + SDL_FreeSurface(iold->image); + delete iold; + return; + } else { + ielem = ielem->next; + } + } + fprintf(stderr, "Warning: image to be freed not in list\n"); +} + +void +FrameBuf:: QueueBlit(int dstx, int dsty, SDL_Surface *src, + int srcx, int srcy, int w, int h, clipval do_clip) +{ + int diff; + + /* Perform clipping */ + if ( do_clip == DOCLIP ) { + diff = (int)clip.x - dstx; + if ( diff > 0 ) { + w -= diff; + if ( w <= 0 ) + return; + srcx += diff; + dstx = clip.x; + } + diff = (int)clip.y - dsty; + if ( diff > 0 ) { + h -= diff; + if ( h <= 0 ) + return; + srcy += diff; + dsty = clip.y; + } + diff = (int)(dstx+w) - (clip.x+clip.w); + if ( diff > 0 ) { + w -= diff; + if ( w <= 0 ) + return; + } + diff = (int)(dsty+h) - (clip.y+clip.h); + if ( diff > 0 ) { + h -= diff; + if ( h <= 0 ) + return; + } + } + + /* Lengthen the queue if necessary */ + if ( blitQlen == blitQmax ) { + BlitQ *newq; + + blitQmax += QUEUE_CHUNK; + newq = new BlitQ[blitQmax]; + memcpy(newq, blitQ, blitQlen*sizeof(BlitQ)); + delete[] blitQ; + blitQ = newq; + } + + /* Add the blit to the queue */ + ++src->refcount; + blitQ[blitQlen].src = src; + blitQ[blitQlen].srcrect.x = srcx; + blitQ[blitQlen].srcrect.y = srcy; + blitQ[blitQlen].srcrect.w = w; + blitQ[blitQlen].srcrect.h = h; + blitQ[blitQlen].dstrect.x = dstx; + blitQ[blitQlen].dstrect.y = dsty; + blitQ[blitQlen].dstrect.w = w; + blitQ[blitQlen].dstrect.h = h; + AddDirtyRect(&blitQ[blitQlen].dstrect); + ++blitQlen; +} + +/* Maintenance routines */ +/* Add a rectangle to the update list + This is a little bit smart -- if the center nearly overlaps the center + of another rectangle update, expand the existing rectangle to include + the new area, instead adding another update rectangle. +*/ +void +FrameBuf:: AddDirtyRect(SDL_Rect *rect) +{ + Uint16 mapoffset; + SDL_Rect *newrect; + + /* The dirty map offset is the center of the rectangle */ + mapoffset = LOWER_PREC(rect->y+(rect->h/2)) * dirtypitch + + LOWER_PREC(rect->x+(rect->w/2)); + + if ( dirtymap[mapoffset] == NULL ) { + /* New dirty rectangle */ + if ( updatelen == updatemax ) { + /* Expand the updatelist */ + SDL_Rect *newlist; + int i; + + updatemax += UPDATE_CHUNK; + newlist = new SDL_Rect[updatemax+UPDATE_CHUNK]; + memcpy(newlist,updatelist,updatelen*sizeof(SDL_Rect)); + /* Update the dirty rectangle map with the new list */ + for ( i=0; ix, newrect->x); + y1 = MIN(rect->y, newrect->y); + x2 = MAX(rect->x+rect->w, newrect->x+newrect->w); + y2 = MAX(rect->y+rect->h, newrect->y+newrect->h); + newrect->x = x1; + newrect->y = y1; + newrect->w = (Uint16)(x2 - x1); + newrect->h = (Uint16)(y2 - y1); + } +} diff --git a/screenlib/SDL_FrameBuf.h b/screenlib/SDL_FrameBuf.h new file mode 100644 index 0000000..1957c81 --- /dev/null +++ b/screenlib/SDL_FrameBuf.h @@ -0,0 +1,218 @@ +/* + SCREENLIB: A framebuffer library based on the SDL library + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#ifndef _SDL_FrameBuf_h +#define _SDL_FrameBuf_h + +/* A simple display management class based on SDL: + + It supports medium-slow line drawing, rectangle filling, and fading, + and it supports loading 8 bits-per-pixel masked images. +*/ + +#include +#include +#include + +#include "SDL.h" + +/* Macros to make sure we lock the screen if necessary (used internally!) */ +#define LOCK_IF_NEEDED() { if ( ! locked ) Lock(); } +#define UNLOCK_IF_NEEDED() { if ( locked ) Unlock(); } + +typedef enum { + DOCLIP, + NOCLIP +} clipval; + +class FrameBuf { + +public: + FrameBuf(); + int Init(int width, int height, Uint32 video_flags, + SDL_Color *colors = NULL, SDL_Surface *icon = NULL); + ~FrameBuf(); + + /* Setup routines */ + /* Set the image palette -- 256 entries */ + void SetPalette(SDL_Color *colors); + /* Set the background color -- used by Clear() */ + void SetBackground(Uint8 r, Uint8 g, Uint8 b); + /* Map an RGB value to a color pixel */ + Uint32 MapRGB(Uint8 R, Uint8 G, Uint8 B); + /* Set the blit clipping rectangle */ + void ClipBlit(SDL_Rect *cliprect); + + /* Event Routines */ + int PollEvent(SDL_Event *event) { + return(SDL_PollEvent(event)); + } + int WaitEvent(SDL_Event *event) { + return(SDL_WaitEvent(event)); + } + int ToggleFullScreen(void) { + return(SDL_WM_ToggleFullScreen(SDL_GetVideoSurface())); + } + + /* Locking blitting and update routines */ + void Lock(void); + void Unlock(void); + void QueueBlit(int dstx, int dsty, SDL_Surface *src, + int srcx, int srcy, int w, int h, clipval do_clip); + void QueueBlit(int x, int y, SDL_Surface *src, clipval do_clip) { + QueueBlit(x, y, src, 0, 0, src->w, src->h, do_clip); + } + void QueueBlit(int x, int y, SDL_Surface *src) { + QueueBlit(x, y, src, DOCLIP); + } + void PerformBlits(void); + void Update(int auto_update = 0); + void Fade(void); /* Fade screen out, then in */ + + /* Informational routines */ + Uint16 Width(void) { + return(screen->w); + } + Uint16 Height(void) { + return(screen->h); + } + SDL_PixelFormat *Format(void) { + return(screenfg->format); + } + + /* Set the drawing focus (foreground or background) */ + void FocusFG(void) { + UNLOCK_IF_NEEDED(); + screen = screenfg; + } + void FocusBG(void) { + UNLOCK_IF_NEEDED(); + screen = screenbg; + } + + /* Drawing routines */ + /* These drawing routines must be surrounded by Lock()/Unlock() calls */ + void Clear(Sint16 x, Sint16 y, Uint16 w, Uint16 h, + clipval do_clip = NOCLIP); + void Clear(void) { + Clear(0, 0, screen->w, screen->h); + } + void DrawPoint(Sint16 x, Sint16 y, Uint32 color); + void DrawLine(Sint16 x1, Sint16 y1, Sint16 x2, Sint16 y2, Uint32 color); + void DrawRect(Sint16 x1, Sint16 y1, Uint16 w, Uint16 h, Uint32 color); + void FillRect(Sint16 x1, Sint16 y1, Uint16 w, Uint16 h, Uint32 color); + + /* Load and convert an 8-bit image with the given mask */ + SDL_Surface *LoadImage(Uint16 w, Uint16 h, Uint8 *pixels, + Uint8 *mask = NULL); + void FreeImage(SDL_Surface *image); + + /* Area copy/dump routines */ + SDL_Surface *GrabArea(Uint16 x, Uint16 y, Uint16 w, Uint16 h); + int ScreenDump(char *prefix, Uint16 x, Uint16 y, Uint16 w, Uint16 h); + + /* Cursor handling routines */ + void ShowCursor(void) { + SDL_ShowCursor(1); + } + void HideCursor(void) { + SDL_ShowCursor(0); + } + void SetCaption(char *caption, char *icon = NULL) { + if ( icon == NULL ) { + icon = caption; + } + SDL_WM_SetCaption(caption, icon); + } + + /* Error message routine */ + char *Error(void) { + return(errstr); + } + +private: + /* The current display and background */ + SDL_Surface *screen; + SDL_Surface *screenfg; + SDL_Surface *screenbg; + Uint8 *screen_mem; + Uint32 image_map[256]; + int locked, faded; + + /* Error message */ + void SetError(char *fmt, ...) { + va_list ap; + + va_start(ap, fmt); + vsprintf(errbuf, fmt, ap); + va_end(ap); + errstr = errbuf; + } + char *errstr; + char errbuf[1024]; + + /* Blit queue list */ +#define QUEUE_CHUNK 16 + typedef struct { + SDL_Surface *src; + SDL_Rect srcrect; + SDL_Rect dstrect; + } BlitQ; + BlitQ *blitQ; + int blitQlen; + int blitQmax; + + /* Rectangle update list */ +#define UPDATE_CHUNK QUEUE_CHUNK*2 + void AddDirtyRect(SDL_Rect *rect); + int updatelen; + int updatemax; + SDL_Rect *updatelist; + Uint16 dirtypitch; + SDL_Rect **dirtymap; + Uint16 dirtymaplen; + void ClearDirtyList(void) { + updatelen = 0; + memset(dirtymap, 0, dirtymaplen*sizeof(SDL_Rect *)); + } + + /* Background color */ + Uint8 BGrgb[3]; + Uint32 BGcolor; + + /* Blit clipping rectangle */ + SDL_Rect clip; + + /* List of loaded images */ + typedef struct image_list { + SDL_Surface *image; + struct image_list *next; + } image_list; + image_list images, *itail; + + /* Function to write to the display surface */ + void (*PutPixel)(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel); +}; + +#endif /* _SDL_FrameBuf_h */ diff --git a/screenlib/pixel.cpp b/screenlib/pixel.cpp new file mode 100644 index 0000000..aaf622c --- /dev/null +++ b/screenlib/pixel.cpp @@ -0,0 +1,47 @@ +/* + SCREENLIB: A framebuffer library based on the SDL library + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#include "SDL.h" +#include "pixel.h" + +void PutPixel1(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel) { + *((Uint8 *)screen_loc) = pixel; +} +void PutPixel2(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel) { + *((Uint16 *)screen_loc) = pixel; +} +void PutPixel3(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel) { + int shift; + + /* Gack - slow, but endian correct */ + shift = screen->format->Rshift; + *(screen_loc+shift/8) = pixel>>shift; + shift = screen->format->Gshift; + *(screen_loc+shift/8) = pixel>>shift; + shift = screen->format->Bshift; + *(screen_loc+shift/8) = pixel>>shift; +} +void PutPixel4(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel) { + *((Uint32 *)screen_loc) = pixel; +} diff --git a/screenlib/pixel.h b/screenlib/pixel.h new file mode 100644 index 0000000..2d1c49c --- /dev/null +++ b/screenlib/pixel.h @@ -0,0 +1,33 @@ +/* + SCREENLIB: A framebuffer library based on the SDL library + Copyright (C) 1997 Sam Lantinga + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + 5635-34 Springhouse Dr. + Pleasanton, CA 94588 (USA) + slouken@devolution.com +*/ + +#ifndef _pixel_h +#define _pixel_h + +extern void PutPixel1(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel); +extern void PutPixel2(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel); +extern void PutPixel3(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel); +extern void PutPixel4(Uint8 *screen_loc, SDL_Surface *screen, Uint32 pixel); + +#endif /* _pixel_h */
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 literal 0 HcmV?d00001 diff --git a/Images/Makefile b/Images/Makefile new file mode 100644 index 0000000..d1458d5 --- /dev/null +++ b/Images/Makefile @@ -0,0 +1,9 @@ +# This is the minimum Makefile necessary to include this directory +# in the package distribution build process + +# Succeed at the default target +all: + +# Copy this directory to the distribution build directory +distdir: + cp -rp . $(distdir) diff --git a/Images/Makefile.in b/Images/Makefile.in new file mode 100644 index 0000000..d1458d5 --- /dev/null +++ b/Images/Makefile.in @@ -0,0 +1,9 @@ +# This is the minimum Makefile necessary to include this directory +# in the package distribution build process + +# Succeed at the default target +all: + +# Copy this directory to the distribution build directory +distdir: + cp -rp . $(distdir) diff --git a/MPWmake.sea.bin b/MPWmake.sea.bin new file mode 100644 index 0000000000000000000000000000000000000000..7037897bc5d1764a3f6f771aa696698895b866b9 GIT binary patch literal 20224 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%0D-}+{VZR2K9=#BzO>r0xtRvQa8iM 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 Ip1n@=8+q+qb^rhX literal 0 HcmV?d00001 diff --git a/Maelstrom-Scores b/Maelstrom-Scores new file mode 100644 index 0000000000000000000000000000000000000000..ff2297e0e2d06946f1e4a3970909638fb431e36a GIT binary patch literal 280 zcmZ=xEXq;vO)RQls031Z3{b$sz@(fMoS2)GucHv0T7e?R$G{}=11Oi7mspZt#E{64 zS_IR^z`?+{$ONp9!6h*%2}O>JfzkU_BuG>NLynVykxk7dF&AiLW`3R`1G1TH3=EsL zA?!nuV`gCJ>~bth&PdElPfX20kz-|GsQCtVi$Y{-Vul{FnJf$pA(J5PEYC +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* We wait in a loop for players to connect and tell us how many people + are playing. Then, once all players have connected, then we broadcast + the addresses of all players, and then start again. + + Note: We rely on our MAX_PLAYERS and the client's MAX_PLAYERS being + the same. Otherwise we crash. +*/ + +#include "protocol.h" + +#define MAX_CONNECTIONS 64 +#define UNCONNECTED 0 +#define CONNECTED 1 +#define ACTIVE 2 +#define TIMEOUT 300 /* timeout in seconds */ + +typedef struct { + int state; + int sockfd; + time_t timestamp; + int player; + int numplayers; + unsigned char *packet; + int packetlen; + struct sockaddr_in raddr; + } connection; + +connection players[MAX_CONNECTIONS]; + +/* This function disconnects a player */ +void DisconnectPlayer(int which) +{ + if ( players[which].state == ACTIVE ) + (void) free(players[which].packet); + close(players[which].sockfd); + players[which].state = UNCONNECTED; +printf("Player on slot %d has been disconnected.\n", which); +} + +void SendError(int which, char *message) +{ + unsigned char mesgbuf[BUFSIZ]; + int mesglen; + + mesglen = (2+strlen(message)+1); + if ( mesglen > BUFSIZ ) { + fprintf(stderr, "Fatal error: error message too long!\n"); + exit(3); + } + mesgbuf[0] = mesglen; + mesgbuf[1] = NET_ABORT; + strcpy((char *)&mesgbuf[2], message); +printf("Sending error '%s' to player in slot %d\n", message, which); + (void) write(players[which].sockfd, mesgbuf, mesglen); + + DisconnectPlayer(which); +} + +/* Uh oh, a fatal error. Tell all currently connected players, and exit. */ +void Fatal(char *message) +{ + int i; + + for ( i=0; i TIMEOUT ) { + SendError(i, "Server timed out waiting for packet"); + } + } +} + +/* This is the function that makes the server go 'round. :) */ +/* We check to see if all advertised players have connected, and + if so we blast everyone's address to each player. +*/ +void CheckNewGame(void) +{ + unsigned char buffer[BUFSIZ]; + int first, i; + int numplayers, players_on; + int positions[MAX_PLAYERS]; + + /* Find the first player */ + for ( i=0, first=(-1); iraddr.sin_addr)); +printf("Setting up player %d at host %s and port ", i+1, ptr); + len += strlen(ptr)+1; + ptr += strlen(ptr)+1; + sprintf(ptr, "%d", ntohs(player->raddr.sin_port)); +printf("%s\n", ptr); + len += strlen(ptr)+1; + ptr += strlen(ptr)+1; + } + buffer[0] = len; + + for ( i=0; i screen precision */ +#define VEL_FACTOR 4 +#define VEL_MAX (8< + +%prep +rm -rf ${RPM_BUILD_ROOT} + +%setup -q + +%build +# Needed for snapshot releases. +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh --prefix=%prefix +else + CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix +fi + +if [ "$SMP" != "" ]; then + (make "MAKE=make -k -j $SMP"; exit 0) + make +else + make +fi + +%install +rm -rf $RPM_BUILD_ROOT +make install prefix=$RPM_BUILD_ROOT/%{prefix} + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +# Add desktop menu bar items +function Add_DeskTop_MenuItem +{ + desktop=$1; deskfile=$2 + if [ -d "$desktop" ]; then + desktop="$desktop/Games" + if [ ! -d "$desktop" ]; then + mkdir "$desktop" 2>/dev/null + fi + if [ -w "$desktop" ]; then + echo "Creating $desktop/$deskfile" + cat >"$desktop/$deskfile" <<__EOF__ +# KDE Config File +[KDE Desktop Entry] +Name=Maelstrom +Comment=Maelstrom +Exec=/usr/bin/Maelstrom +Icon=/usr/games/Maelstrom/icon.xpm +Terminal=0 +Type=Application +__EOF__ + fi + fi +} +echo "=============================================================" +echo "Adding desktop menu items ..." +for gnomedir in "/opt/gnome" "/usr/share/gnome" "$HOME/.gnome" +do Add_DeskTop_MenuItem "$gnomedir/apps" "maelstrom.desktop" +done +for kdedir in "/opt/kde" "/usr/share/kde" "$HOME/.kde" +do Add_DeskTop_MenuItem "$kdedir/share/applnk" "maelstrom.kdelnk" +done + +%postun +echo "=============================================================" +echo "Removing desktop menu items ..." +for gnomedir in "/opt/gnome" "/usr/share/gnome" "$HOME/.gnome" +do rm -f "$gnomedir/apps/Games/maelstrom.desktop" +done +for kdedir in "/opt/kde" "/usr/share/kde" "$HOME/.kde" +do rm -f "$kdedir/share/applnk/Games/maelstrom.kdelnk" +done + +%files +%defattr(-, root, root) +%doc COPYING* CREDITS README* Changelog Docs +%{prefix}/bin/Maelstrom +%{prefix}/games/Maelstrom + +%changelog +* Tue Sep 21 1999 Sam Lantinga + +- first attempt at a spec file + diff --git a/Maelstrom.spec.in b/Maelstrom.spec.in new file mode 100644 index 0000000..1095ccb --- /dev/null +++ b/Maelstrom.spec.in @@ -0,0 +1,103 @@ +# Note that this is NOT a relocatable package +%define name @PACKAGE@ +%define version @VERSION@ +%define release 1 +%define prefix /usr + +Summary: Simple DirectMedia Layer +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{name}-%{version}.tar.gz +URL: http://www.devolution.com/~slouken/Maelstrom/ +Copyright: GPL +Group: Games +BuildRoot: /var/tmp/%{name}-buildroot + +%description +Maelstrom is a rockin' asteroids game ported from the Macintosh +Originally written by Andrew Welch of Ambrosia Software, and ported +to UNIX and then SDL by Sam Lantinga + +%prep +rm -rf ${RPM_BUILD_ROOT} + +%setup -q + +%build +# Needed for snapshot releases. +if [ ! -f configure ]; then + CFLAGS="$RPM_OPT_FLAGS" ./autogen.sh --prefix=%prefix +else + CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%prefix +fi + +if [ "$SMP" != "" ]; then + (make "MAKE=make -k -j $SMP"; exit 0) + make +else + make +fi + +%install +rm -rf $RPM_BUILD_ROOT +make install prefix=$RPM_BUILD_ROOT/%{prefix} + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +# Add desktop menu bar items +function Add_DeskTop_MenuItem +{ + desktop=$1; deskfile=$2 + if [ -d "$desktop" ]; then + desktop="$desktop/Games" + if [ ! -d "$desktop" ]; then + mkdir "$desktop" 2>/dev/null + fi + if [ -w "$desktop" ]; then + echo "Creating $desktop/$deskfile" + cat >"$desktop/$deskfile" <<__EOF__ +# KDE Config File +[KDE Desktop Entry] +Name=Maelstrom +Comment=Maelstrom +Exec=/usr/bin/Maelstrom +Icon=/usr/games/Maelstrom/icon.xpm +Terminal=0 +Type=Application +__EOF__ + fi + fi +} +echo "=============================================================" +echo "Adding desktop menu items ..." +for gnomedir in "/opt/gnome" "/usr/share/gnome" "$HOME/.gnome" +do Add_DeskTop_MenuItem "$gnomedir/apps" "maelstrom.desktop" +done +for kdedir in "/opt/kde" "/usr/share/kde" "$HOME/.kde" +do Add_DeskTop_MenuItem "$kdedir/share/applnk" "maelstrom.kdelnk" +done + +%postun +echo "=============================================================" +echo "Removing desktop menu items ..." +for gnomedir in "/opt/gnome" "/usr/share/gnome" "$HOME/.gnome" +do rm -f "$gnomedir/apps/Games/maelstrom.desktop" +done +for kdedir in "/opt/kde" "/usr/share/kde" "$HOME/.kde" +do rm -f "$kdedir/share/applnk/Games/maelstrom.kdelnk" +done + +%files +%defattr(-, root, root) +%doc COPYING* CREDITS README* Changelog Docs +%{prefix}/bin/Maelstrom +%{prefix}/games/Maelstrom + +%changelog +* Tue Sep 21 1999 Sam Lantinga + +- first attempt at a spec file + diff --git a/Maelstrom_Fonts b/Maelstrom_Fonts new file mode 100644 index 0000000000000000000000000000000000000000..76b72c1204a7dd59b838ce8345a2745de4f80443 GIT binary patch literal 153211 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

9a4_f~YZZD$wvuEK+F8aZzddd{Qg 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.yvF{)UT1Hx7_@#5qgQ&9y#;Q4l)cT~0SEsl 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 + +#include "SDL_FrameBuf.h" +#include "Mac_FontServ.h" +#include "Mac_Sound.h" +#include "Mac_Compat.h" + +#include "Maelstrom.h" + +#include "myerror.h" +#include "fastrand.h" +#include "logic.h" +#include "scores.h" +#include "controls.h" + + +// The Font Server :) +extern FontServ *fontserv; + +// The Sound Server *grin* +extern Sound *sound; + +// The SCREEN!! :) +extern FrameBuf *screen; + +/* Boolean type */ +typedef Uint8 Bool; +#define true 1 +#define false 0 + +// Functions from main.cc +extern void PrintUsage(void); +extern int DrawText(int x, int y, char *text, MFont *font, Uint8 style, + Uint8 R, Uint8 G, Uint8 B); +extern void Message(char *message); + +// Functions from init.cc +extern void SetStar(int which); + +// Functions from netscore.cc +extern void RegisterHighScore(Scores high); +extern int NetLoadScores(void); + +// External variables... +// in main.cc : +extern Bool gUpdateBuffer; +extern Bool gRunning; +extern int gNoDelay; + +// in init.cc : +extern Sint32 gLastHigh; +extern Rect gScrnRect; +extern SDL_Rect gClipRect; +extern int gStatusLine; +extern int gTop, gLeft, gBottom, gRight; +extern MPoint gShotOrigins[SHIP_FRAMES]; +extern MPoint gThrustOrigins[SHIP_FRAMES]; +extern MPoint gVelocityTable[SHIP_FRAMES]; +extern StarPtr gTheStars[MAX_STARS]; +extern Uint32 gStarColors[]; +// in controls.cc : +extern Controls controls; +extern Uint8 gSoundLevel; +extern Uint8 gGammaCorrect; +// int scores.cc : +extern Scores hScores[]; + +// -- Variables specific to each game +// in main.cc : +extern int gStartLives; +extern int gStartLevel; +// in init.cc : +extern Uint32 gLastDrawn; +extern int gNumSprites; +// in scores.cc : +extern Bool gNetScores; + +// Sound resource definitions... +#define gShotSound 100 +#define gMultiplier 101 +#define gExplosionSound 102 +#define gShipHitSound 103 +#define gBoom1 104 +#define gBoom2 105 +#define gMultiplierGone 106 +#define gMultShotSound 107 +#define gSteelHit 108 +#define gBonk 109 +#define gRiff 110 +#define gPrizeAppears 111 +#define gGotPrize 112 +#define gGameOver 113 +#define gNewLife 114 +#define gBonusAppears 115 +#define gBonusShot 116 +#define gNoBonus 117 +#define gGravAppears 118 +#define gHomingAppears 119 +#define gShieldOnSound 120 +#define gNoShieldSound 121 +#define gNovaAppears 122 +#define gNovaBoom 123 +#define gLuckySound 124 +#define gDamagedAppears 125 +#define gSavedShipSound 126 +#define gFunk 127 +#define gEnemyAppears 128 +#define gPrettyGood 131 +#define gThrusterSound 132 +#define gEnemyFire 133 +#define gFreezeSound 134 +#define gIdiotSound 135 +#define gPauseSound 136 + +/* -- The blit'ers we use */ +extern BlitPtr gRock1R, gRock2R, gRock3R, gDamagedShip; +extern BlitPtr gRock1L, gRock2L, gRock3L, gShipExplosion; +extern BlitPtr gPlayerShip, gExplosion, gNova, gEnemyShip, gEnemyShip2; +extern BlitPtr gMult[], gSteelRoidL; +extern BlitPtr gSteelRoidR, gPrize, gBonusBlit, gPointBlit; +extern BlitPtr gVortexBlit, gMineBlitL, gMineBlitR, gShieldBlit; +extern BlitPtr gThrust1, gThrust2, gShrapnel1, gShrapnel2; + +/* -- The prize CICN's */ + +extern SDL_Surface *gAutoFireIcon, *gAirBrakesIcon, *gMult2Icon, *gMult3Icon; +extern SDL_Surface *gMult4Icon, *gMult5Icon, *gLuckOfTheIrishIcon; +extern SDL_Surface *gLongFireIcon, *gTripleFireIcon, *gKeyIcon, *gShieldIcon; diff --git a/Maelstrom_Sounds b/Maelstrom_Sounds new file mode 100644 index 0000000000000000000000000000000000000000..88c54cd9ff6b5f7d3fc8e88d46e289d2cc2ffcef GIT binary patch literal 413235 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

aCfEoAA$W~aoM;# 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%0DvfoaITDD2!2lBgp z2}PxxejV-cN)^_jRB4jsCmT6rgJV(fAtbg;nz;h)eJa} zhh|&R5Lr6QNHX3RuFw2GJS91Qd|da`9fe=DILxd<2nHvh&rBi?5wz^EvKoXY^xVvr z_9eJLj% zB#=O=ZZDgUzvQ};M7J3AMhU*0c!V8;slcE=3S8pWI-5hRr*+T3k_m>8rkGWsN~fWZ z`I!0*N+Qg|9w+NfV{D2zGm&5gN!6m^&;;b0Tausl6g)L*Q&ANY20ax7w`llKJv@2Ml0c~u+mNo(j+Fz=EK3VIn+{S$(J9fa{Mf~TPDzyz0l?ojd1p$G>?Bvs?Vgo?rt z6H7uBC+i=s7`oliFSbiggd3qm=v1+=d$cp(cra&(MMc;pNJ=*s#6lzUkMywu(V$T2 zG^hMVwgO%2*g;bj#@L~3pABL6hN2S`-kD3vm6>N!^>m2a(bOq9^qM2bp9Ss?ho-}# zh8$k{ESqh2Grf>*mZvSPDak`G$gMyRvHMvJP?U3CuroSrKFV9_n>dZ*EI1|w>6XY! zEW~iqWU-}f38U8j(Cxf;? zSqL6taGnt43`|LTM?h#q{mdS(5=%o$77C}0diEjjF=R%k%?rEkwPZbE-2?L9qiUEMP1l!F*Z(~K%*fx zKo-u>okNvktx?4?6~=2ErI=|=QHnH2J36|695^f?XatS^!o=u&U3vCXnE$8H_E4;T z`Ssm3{!go-3c?GaGE+0y1>m+^dYNglWhg=Mb|m|F3>u-36$^xGm3eSd6^QyiTUeHn zY&Wcs>-aLGNSw_gPOkRz^$P0M?2JSWqfInGe5D;)jALLR$An2MNbJGgr_8q^xFB7& zwERE;XvW2GDz?(0T)}!IznFYAx83avl$lc5 zaveF0L#~9jd*>y;qB*IDf<0nDLcl0tG52Un$Jh3#0&43@DugD-(vb}uCC-GQPFNnO z1C8Wf0X0Q-L7Pg$LePRl=(ST13+aD7JKk z)dJ<~AfQ*O=uL&#@`4ZqiaB;}uLfMqjvBBTlU>00qWZSYXe<%wMq0jhKoX!%-Ujvv zB`bxaM*LGQw{r}HVrLqs!3%C8l0m|4itrWdqMSdFnF6{}$UtK`Ew%*_0??hvbMvju ztU0hn(M!BjXH_M*$m81lO>)-_!l_4WAMFUSjcQD+>lq+AxEl1;fp<)Z18&6TZGklw zQ##PFf{DIC4rJbiwT{Bofn{he8t7VaTR|!=4Q%G3W*jnL9N6N+)4-hNvP?}JVx6L+ zAe+T~UGi_G3P24@GtLgfW@F+Jc4Z8kf{~tg+*qN0>0)zk`Gqx+!N-jeqD9pZmDcZ$ zjbskU0|xTtxq?d?U}k_t+7#lvXt+}B4t{eT8A~ECXWJ+dO84ZO?WFGc3-E&S>6FHY zEmGi6my~>i5#^jSu?_~iR%5VROGC8-iqZxRMJ`-}1A-4F4PlrGy&(tDkO0VDtRBq) z+kh;o5xE{IuF^OUR$$f%0E^dT z0gMB}6(T66G(ij}pVzKsnH+viJd$DtifkJuv##f8Htn1y!PmC80W@@q5_Ig&HM>FKI7nN^LZArM)MY2Sy6XV)XQ4xz2?j2?76H$0MYT|YP0kLBzGl}5 zV%qj#=ZH6BcBE*zrc!&{Y!U}rnb}eSpOV*1<+Ah^_z|%q3{Ol3iFPt-OrV9xMRk&) z%x(2U4i z8!x8Y0eG5RAt98y=_PrQ7^j^GW2%Hag$m3j?L0q3P%yz7I$bW9R#7?=VjG}_5h1E| z#cV1&h@3y^Gp&OnW!M3893=uYIAD2sPK;BNAw(cdDsJ2L|0IXb3NUdpVp4GA^5Yfa z63ZvmC0StS3k{{Ba2>~yHn^Z0saYRP99;oc`mb>{hICnMlR51N;S3ZPHQO?I;51eO zGp7`Jutl-0th9mKTczEWhqH( zQl6c56c^x7Xk+bcE|taPgj~263J;0qhoJy<*_xxrAue`JgA#ON8pLqX51ME$NB=v+ z-C}r%4PDW(V^R+C#Cgk*hY>F99Sw|~E>Nv)Dhn5p`;G#a>XBbZbGIL2LRY|V4o@jR zLHA&-2y2;;N^4kHjKxzNTZ1wcZi_E1WTs1yKvJ@sZl@&0EST2UnsNG~E)_5o>LQxx zz;V=~e9rCXk6as}npb#l2Ql&_hDp!hBx%O+k(%Ykk`Z9N@6e-m_<(d1m$;L^=&M5+Mvy$W%Mb)Sr`C&s1*S zF1rViJ)Sz%pyIa`X|^x~D%h`NbSV2z?g$N%W+MRTkp#%-fS>d~Bu4V0w1QAlmNtn> z+7>4Tr!fL;F?Om7Bhf*20>ucXs8ODu0E_g1@))=RSC1gzrf{3t7u8#cM1{lyk1*$g zsgj4I$~u-h4VM%djTVS@E4dM5N;-`*Y1aT(!VZeWUn#Fh;;tab^aJDo=>9V*5n}b` z(2Ra2gk($(5QxDcJ|&SkR+YFIsRu>uv{}r)ft?}paTKzWN=aOWYds-m9yt}I5Z$5g zf#0Ix`|#m{t}*hF5pf4d{7hK^dkaXLgEpkrs74gMxT^%(~cbn_-VD&NRGRCWzv z3oI30K8aNk#<985l7Wv10H#&L7s+43VM@^}-XkwYiZ2?kfUp4u0)lRs8?hELE2h;5 zAxNJ&#UU9ft01!+bPg>fR}6hBqpA2iVLbwpuu_UFB;^AkL2@L7d4v`WcqnH29cm?}|6UDpl1~Ee zX#ufrlv6u)fsjh{B zGd4=F5k8-4WO%EWVUxg=vi@vpNF);3hCeF%3&?|V;ZS^X!yM_6^mt)T%Fz+wed!?TgCVv54B7cqqH8;2%2}KFUP}IdCJ1a7Y zo>+#+2a{2u0q+Qru<(F1QYKmrHWD&tatja~h%(b-jQtT%Wbk6zApdke4GbCE3?h?7 zjFWz~0kJc;6_S*Y!=T85nsi7e%vCKA0VF^{3+;V_WC4kBUo`&kG8Lsg!`H+mKPZ>& zP|ku-pA?Y2BU=^hoXv-ot3r%mUQ)7djdZsIwwFXwn>P1oPmyPZIGh!LmYoA&EIis@ zpdWt$EOW?1KOaLZnD=@x;7d7eGhO{=%s2&PjjRg3gak@7n13Xm74Kv#DThHmUeg(=`>WQWXF*-qH*V2hOb_|F+Ms$~(kFOlPe1xRp$ zTUgme^NgfSH#7=IxHjoK%#D( zj7-dVnGAq@({fPJDwYoE8$uKgm?=U>(v$3hbQFdO!-C7*N@vm%k$#DNJuDL%;1u97 zAyO@eq&z|&g;I>6tB z5}^nD9&OWz27{$_t2Bxj$p4E*)=^ee@>jy5*AqfP_X&F`ha+m@%I=F)jLIKAUBpTH z%r+^CMu|bQ{lWGn)^Ui8S>A%+ zJylw2$~#aBnR1#06J>5iOjR`DooIqg`VRj$e%pY6mo}@oA@|4g6-9DLH!*UTFUrlH@o^d}LG5HHLwrUQ(S+T(CsoaO?H1Y}*ajf_n4D}QDm`k9GjPxm7M|w8R945>A zO;k)p0S)wuRSIKAJSb8WlHLHRpa8<8rDW~yJ|Z%)UNTkHgVBGP~;x02sQ#t;o_N$?_NO~PF8Lw}qBKQ-`)3OW`gCu!k@%dScc4Teui zH{pB*Wfd_j6h(qtFhOn{1(D+a2dbZ;d^tfR+ZAUe#EMe_hE}Ug zs%et^8-Kh-0@x*Oodt}d8)E_H)D?miUTiX1AQ$WxqZexP6T#IOoG8Ujh>KhUmY9V~ z#2kKx38mO+hE=j*a^{3!gyMJjQVN&oH{a01y_`d3yCA1b5K)Gqa?nodMw(4TOAJK> zj+8MgdpW^#NeO6gp20V8{44jJk0 zExH$K8qVNeD3s^HhA<}9Gt3bR#+{b?lX9M)P2GzapZ3lKSLY=rC82a4H30;$O`*?B zX*mVLfhA{qvX>RDJ-t6K^L~r9bq*cqV;?UkJk! z_q5Y~48c6{Z2C651Sn&0zRtxMb--` z)&CZKdIn>d^Xwx-LuL{1Y>Dvaj|xiE}yt^sEg zng}OCcq0;a48z1Vsdfvu^-PNaXlIfta8WTV@-E~_kujHQ$#@@>LX4&4012oF$f%N* zz@f~!2xKTVfyQYzF*b4xq?d5c1QkT|DTD@l65dTH4#}>}9Y~GXZa-nQLYk7AmHi&a zTTDL0as#r&&N-VDY>FHr9K+W{W`lr~IUI#79HetzhJlxMkU&CN{b^x&Dw6#|2`N8A z{t`Y5n~h`|G-5Uoev}^Q?tgaUq(D$3nk5;7wEhqdSp#=MJ1)c$0g6Hud22=xBHJTPROPn$rwyGofIE0%8GCwD}^u5Yl{-QDbE}2SWBpWSq<%VItr1NjvMDaAcjN zXs;Y&Aqh-y1c$~Bx}4&W1SU3Vn3xLGf;ph-fY~-oi%o*^W7Ig?PE-R?5-T)o5XnbM z$5J|vGO|o`m}L?7LW-9eF;zfP%7}RjmWE2k*v@HR8B<|IVNek(L-v1ODKGc`#(E)VT;7h1y~WGzL<024y0O zBsN-9ya}YEd_PfT=p|>mgod#|fIk&w#5wHUz#2GPL*^YOGRLsM`@4*9fQo0X^&Y7M=?mT4u$ z&dN)43#3a7fOvFyjKrwR%RsJ$8y1D&1`9y8z(fXagNY3KXYWp>Nw5ovjKMtMYk5NK zv1CpM<$+P-lWy z;*0D&InhJu6l6roDN#W;S?=Vh$d_@A8PbX5d#JVshQXF0RElo&Wh@}wAUqO{G9#1@ zCVoztAu7$Ds+EUMu!E%-jQ2e_rz1Q7?Q}xnL|T^24&C#XBngPZS0D)p5lvo5j4hax zhR7KSxEGsUlq3PZlAok0inf$8&?5P8sc=5PYUB@?EsI>EbW!H%1U&!{ZnzLN+T9_- z&iexZ4}olyN?~|qJ)q4CaUwryj+I8Td7+G&6aCIl(zOAA&{nDtR+KHka`5EHg;S~yXhYFFcT70L?2(j1434ye$RO0Ytk1AKLBNS)0kcW$ z_>?V9EG+N8al`Y6mb^t)A1k-@wN&rg^P?9M7LWq63U6(DK&*l^8foDqN7Iw$}mj??eB6&@D zGQv2@NC}rmaXcqIgl1COgs2Jo63PbAlti>gDkCN5EBy;8kmd1-SPX_zpxso193)RC zU7B!=6_ja!pgg2P)Oa+4|IlO!qNGL?i-8Ol!>}U2SFAZ>4bwT4v$KbU^MV%x%Pub} zDY7IL!Ou8KA~--Rmmx6k#R7>2SGGg=FOhGgOcIHW_zuYzVj^o~?O-=SR>Uw2v=H+l z7-uDdzu-Y~4nROKDIQdjeeVJy3lv>4@{8^z`ous__AJCqBF4~Jsub&$wU6UE!ehcf zcAdh>GVqEAB4IRKHW3UIBPy#l;R!)APGG&LWFA?igc*>>6LS@gkXRp~0zo5YOY1^l zPyI-ZQ3_w-aE|bU7nqe=poZ{r7>Z~#AmL_N#CVgWHl>a*E;bsPJsPJtDPkciz%Ey~ zC&7EzmzQad7--p=r-nEM8CbV6z%@?upi}CHr70tcSX;uBDV3d4+V#}fJjs=p^^PVc zq$hBSk6~v5M0iPIGvujQ`Ix;CeG}6lzA9Xu1myx{gbd1B%0eKN5hzO;a%LI=HAyE0 z{s{mintG|!IAcTgy}Vh#DF)aN+!;-P@f~w5gCTz?;G)|x(t0IM26l6&jE_9Yy z1u#-XLmYwulAt2f1%V}jFK6`?97H-_irEOm(1c4CNi8fA$48O}WqWj!esdCIngUCh zf+uJmfgQfVD91KS%Tiee&_FB#>lQDC6pM2d$16aqzym1{pO%%7fE9`Ly{ueJ%NQ$Q zB5d}Yw51e2+JzS~rREZR&P);YMd%0$&t654X{ffSjha9cpj1|ja;B5=EdV8$BsIPs z+hqmEMUQ1-#OpwbAS_f_wnD09lPeJf_McsKK&>{#D-kt1j z63x^)vx2e5E;~4(v=Z;2(E@r1EEs^MWJ=4(J03)b-{2zAvJ}ZRNMa;)l^P)qUNDT&jHC;&eZjel1ZE}3l9&_; zmIuQ+N?VzB#csfeR9?Im|F)M*Ob`3q@2wTuLW2O=I3Ye}v_ z@(twINlhw^$Rl2m`Y@;pA4vk2nwTA7g2-kNtpbf8)8qsIMOH*2%ki274MKw;C84u; zEIVLHTr^MNB8k_)0tmk(HK1wp1f+;cI1Lto5Ip9?u9=OVbV{g(7&2R3`GFOOjS?S< zOS2s^O%j$@rt>0_BSyqxC;XxngTNVRX@nFgOMoeWMht+LN2m;WENV>3#e)zp$w45b z7^O5Y(j4+9d|9esfO<;E$Koxc4T?I&`x12&2`yS@{xTmhG7~sYf$wz3$O9nx2{p#E zh!(^sG3K%f(csHEA(-AYRhK}v%q+w;Nja#|JRm<_N-QgbgG9rLd$Q7Sq83@bjL!+l}q6t4kn#y$uG=GxA^feNwOhUr&i6?Lj!b>880^WsUW@Vy4#-Yv>Y}j&69@;35$+E|BZL-9#K3}i(ZsM|Wt))Z#^>NYHX4aX2-}8b z2-6^KDo1luumf}j?oc>NPTB8J>_F+oa#{oihOmSjuINcZbwL zqGuN>l#?iea6UX>9T`FtW{QU_%=MxhNFTLL}stMWog9|%6k#GI}}J={qf@xnz27{)Jk zNQx@0UU{VD3o#L-@nf-trA&)DB^EY4UqC*G^j{jWxO#aE+>3yDT6-3yusuAoXoYzB zy^8E5yypqE)^tTcw}Ul_P~<+^aFYj zvk}XM>5!dBi!Kn3!AlA=%Z{JjCvzT&Ba%3zX;;QE?b(`26N$w2-Rg|7UYD~mmz?mk-kxxwwO3gp1csf%^mXR zIKtfiV=EiEkS)y`1H>?=HyZ!+*U~x)5>}QsGZ*2Hc_56kj65vLskP&mbQ$5PE8dP- zzA&ST;Y|5S{yr}_<}G{}o3c=OdPFPR0sCn|nMHiXct0hBX{sjl@uNc;cAGP)i&Y0T4J@a*s)KKaB4 zn7&w{iXd=Oxf}joSp@VZrd?haNoPn9WhwBP71;>nrT5C0moC9iLUklDK!s=!UD34Zh~MP5SPVPkRt!l>{KV zCL!?BPFFV3XZefbTf8DPDjKC|WZRVm{1hZq^j)05CyEC#Q>dggWL##N!LsU4JycK( zCu6{$k`C*2StK;f@{lW-$sda8h-rvUFn*SJ`9aJ_>Rp=MC!WeDibWEuL;@5SpSr+j zk19j@^nqkOQzHGuHSjj|U%oV5Y5`7+mG!%0YS174O77(v|tDQ0Vg2Kk-}{Bc1-4 zMK2Fr8lCi1xu$@*%9SgZ#tBp3m^ypf(bUJ~OOW`>$5Wq9`^wZIeJq{&Z{{L>!hMuG z{LjyoOO?BqW;0FV(+|sYEuSsE&fS-XBCb{GR~l;h)ABQ&HSL_rgg)_Jy4M4rIZ%c&#&;NL$? zoizPuYWV;5X!@!DyN*9Oy#HOjPWAK2iSYaXy;b3}ruzAhM`8k%k1O-3yi-1yZuFnD z|MD5)xzfY*gHN9FzkK!Io8tenoB#O2SWkw%@+s;{r*6}@1y3yH=Hh9 z+U;`KZ0OEP{@Y}>+PQP9#bUKn=QfAS<3(2<3;`#5{piH!4@G0K2o8L{KsXW#1Vf=< z0Db$NCWBsQw7cv^oxx<(DrK#03awVHHCxRVhr_H@X|4W9&~3AOL!nSK9*xA(`Fu7W zillPsDE+Cb&RoKeskyuXzuWHg1$|DdNvBfl^;*5vi9wol8lA~vv)jyiquuNC&;)V$ zXd)hPxqQK3Fp@|mBR-b{XP6xxm(}75C!&6r#b|N3y}?K%5Qrusey=|q2?sn5hc^-p z<4QJPED;Mh%?6{zj<4Fi0iQ#!Q0a6^nXE&uw&1l*BUhPSE}P98i3G#RY$lV*=5o1A zI^R1`%BHhPzr&MAIgM7u>ZP?Ry~&_8sGD0YA*V{#p^&RQrIBL5=QAr!v6QWT)%vDZ znciWjU(=xX#*$HtCe=SNIHPsDjZS(5I%bQG2o7Had=1QgB z!O?98AKSfU%eKwKg+yuR{%yShy~bvh)zvl0G`iNB>eW@NYnoL~w@I&PXfh{KsX|vz zcgp7tMIteevP~PvcP5<{f3AOIun-AFqRGP0j=h`G{#Y{X@j$yA24&;QrK{^}*Vojy zX$-Orb?wH)K!2fYeEW_~Lt}gPZr-?c=a#LT`=Vy8#qVxic-eVpo_6t^C2LkMUA%Da zylR70Z}erldIvUc*}C=6>qj4d`s0sZ-`SNJ!1N~jV?K{fD{HE0Y^`2d(^@@${?e7T zjZJM0%jT{#d#nbVFW@z_$u%0Y&u37(3j?KiIJa?P)1g<%{rsWoA2rBfB3mW+xmiTz2{evsX5&weqHVWdauq6i2q~e)zGc4nF+Y3s3HS`u*3pr#;?q z#1|k#uC8AEP20HHydQAS_O_RfY zrI8)mb{snV*tYEx`AEEba_e9+k#RI{s9m>o`QmG@n>~Mntmf*O*R9j~+-4)JDVWam zZac7N^W>(Tdo~S^PV^?y37c9jSE<|9tZ8lEuz2pmwHm;d-DnM`Tt;uI*gdjk=f3Sj z{e?(!WcSuCpH8he8clXP48NnPu}!XMUB9-)pjfxAwzf&DTf0INPIzQX7V7)Pdm=VV zcwqBzHjx|LePGn9RB1E@r$rMe<-Jb7E85?aEB54~xt_GkX>Y94$m$wu7hPFZx4y~f z@%jB$gMZ_5AAfvg@4lywymWB95cUOKO_!f^(u@<%f)|@#v!QzV?4{~NDnGL6;g{Yy zeDJ9!_UwQ1;MmZ_KrR_{xYNZ%(ALq=W{%{Fxv0Zvak-35OXjbt-LQJayvwdx)3jz; zy&+yoC|1|&gMFJP`UZFG+r4$NuefnIoy^38sos>!TNvLo6nFSDg?zCq6N^UZFPAKy zcioke{ zKDXLnQPi$&^>z0ZIwv1Hv}=4I7f$pH6+9+eAna8&>b<^1chRLaS-q*w?%v+GGgkE1 zEvZ_(cztubLaWi*%(6CjZ(m5$uCfJl{R2In#hxyYToa1h^=gIMlkbd}4Z)3%@9j!< zb|+)`Y_2n#O8I3gmaUj`)+MVp)U>Lx#!7RtyQ_O_`)J>mBOkqf`0;%^ha>uq#zoi6 zx#px9GZxlWU2@vYCE8d%Y83KKbg=R}O6K%*Nxry4?i2@5>q5S{gSjIO~KnFS&TuvSx+SU{lv9yLapujs{EPL%myfZR{TzNt@*zdY8|l z^<{f@J-(wD%I|t|_vrBWM8VkD*jl@8{nB%0oN)21^JZQ$cY{W6i^iPx+~kg(d-grN zWBZ=RpFOm7^0ECzk4d(nYGw7B`Eyn({q}ViU$}UKJ|1&BLWQ1UA~~>oS63vNNhC`- zn@a19$7~v%GZv3^kM#Bo4rY8#yFcOAwl=T5?#hKL7A$Ksy5s3g!lmf&Z`{_G%4DDDXp}AMtCjwUsofOKkM7w$J~X!d&~y7IH|-t|wy&CZ?P^ua>V@Z=SJhI#d_|)% zlwy&I<%uFnH$|Y95u*w(NfOu35UrArhB^+L2J{pr7IULtXe*A&eGMZS8r%h+5Fy6 zv9}OU_fG8CHri9n1`JB0&6V(Xba+dHogs^(xck{>_iq^+-@dIYk%+5d*7bT<2w$&v~T;Cp;XYLGx*#(Z2Yy$npZDaT&uO1wDLBk z*%OL{L)reEwOwTi^iPyxvEtzPkguiL7VyLi-Q!z_(~(rZcQB<|v$|^b#n&#r?&_*m zrL0Y^_hg4RZQcx%_i5Wy@-}ze*4os#Y=yaRAR5Z|c4tEdnaa2M&6f^5`PTa{9o$q( zL>+5RAW}M~c3ss5EnpA^Q0g7(k65Fl;|W(Jo$uScWgz1>Ddin?>(;MavZAJ?asARI zO};|DZ~K;k-od!6$>8&tboR{Xw%rGxJg{Tmz9FBiu3oO!nB#q;gHf}x%{4OWU32+4 zGiRQ9+Lg=JG}uxBYj}91FfcJX4*#17X`9=%R$^Q*z`jkBg+#F{?)Jr#vHr(jeQf)_ zXCE8XFJHW3(IrHrk6*mDYF&dmJHD}RBSw}<$3mHjM-NS8lAT?d{)czu0cP#1*0i)X zY*Bjek)ZQikSB%-WuxA`nCNO;$-Zi`B7 z3dgncFPO7@(cD!na=kO0jHgB)+h6i{V}5PBN>#lCf0RV&@>o5wcp{hc`HKDhz1^kZ zJ$tr3{>uK1J6_rATXEh=C!Txx#TT4&`393!1;0NyIy^i&I*@Vd432QuXqR2+BidGB)<;oBQJO`evocW_RfUdL~Oo7)#*@lTsMbM~6G%bT6rc4ukpfycHDj!pFC1Il{K z@b-y;Vmv-HT1aJ+c16qjWlO4B%m%gI=8dKbIge~Z^_msy+SSd?=5VHe_uj4hAKNRuBo=!~I)# zj24sOU@~c|SytyvrBa#V;7E7Gu50PgteLk)VR9y8c7L{zDVF>lwQH+Zx0_t)LaI18 z&@=J$d#~;rFZv8RM<`&?ncUHcY5jtwwYH>F*4i#>tzB^W3Kf`HG@coM^w6#?!(E;J z#uZB!&ReZ<+MS8cOf(eDj_#i5O8R|?(%9C?vB^#2gS~y7)+IA%&A)NX?xbX68 z7Hnv5UbmsGT@l*6Z@ko5D#jg(<~E((<1@=Nk>2ifB0IQgFetBGS=AQExV5%qE*f;| zbq0e`*S5M=uWHt2#y0QVxpl|hy<4^)*wGVqXquWjH2SvnjXH~7ZSvUVP0bCfHkka@ z*4ie0tZ!^=Vq$Q7dr=K~Rj+7R-sJL|3~q0zXUEQge7<|AJDDHa2%8$r`hD?q#Ou(s z)-IX}O}%i1F5oa&tghtnzNZg#`;(nvom?eThkNq=#L$lYTQVMBJmS)~Hnyuwo`6%+ zuCukTt8H$qYmqgqska1OT77u*v8SJU<;Y`u_iX7+hTVFF!Gg%Fy}CUR3&SNvEsa%6 zmsjf|5xv?QPj!usbw*ryc5WOR-m+;R z8;itJVY9rgVd=tU*IjVsvKnPD8H#4|-NRTFbyHn!Q)_F7&Kb>j7D|)*x5ZU*i#?F? zn{ED($F5W8U0%DkZ9{E`PTs6GISOO_@n~sc_v5d;^7!ttV#wIq&{)5E#Ri!i0i?ke zE5tocT|?E9swPLiuQP+o^mS!3*`QWdJ?F}mS{vkU^Yw4;i@5{EO*_Z>2TDD|y$O#e znv8@aPDcduT)(zz(Yysqmo2YVSYoA-ZJYah21-7Y#i*1UtY%j%o9PA9!(569i|l`EQbYVan# zBM^&v?LbPmMy0M@QDX`x^XX8$kdInB8rH3@UNP&Mb%sE|ss=Ca-@bjQ(6edl(7>k2 z(cw}ufPqhr=K`T*#8|W7%Gv9{OXY3NDu=_98y+si!yes+#VeZCa*Zb%%M4Bom3lT# zP7Huib*SyhT-a(r2v%LA@`VfyO|30DpI4)fZQi$I%Z`K3J-K6JZ`$MXXljIcTdEmH*1?(jDCMGQ|j(2jcgw4 zE)0wmoCZTjLt|@mlTzIV0syp2yDJb+hOP1zwcTpa%375Mqsi$Fq(`=m zkMG_+luG4NF_+%#vb5LNRo7{}E>(xdY_;fG>)TCW75%+^Tc3L2sYmzi8ILs0pFMY( z%%-p1fWC}Yr#D$hhn!Z6)9ZBjBjI2y?6O;QDtjWVZ*FR=Yg8DGTD>b->gyXA8kyX) zy({4H+0-(H-rqZvi=~QP#iX@q?fSZ!_3OdXJtni)8|fV@+Ei@~G81wb8bo4&+jp)%ucHr!jJWB+r4>Y%M;J;C}0L1 ztxc=v&RM5Ir*4NYnTV%Tv3NR6Iipm}Sl4KBIsExF^c@VXMs6}2%x;g%8}Awz8k-pC z?#Tx&Dw)!rK$z`Ca%o^=PbTDX={77`BiE@kHk-*CvbMJx0=dqBx?PRDlFgTZvltxc z8rXekdsi}KRmgRkhGmPYHZ-+%Xw>cPYNJW3GMFv?L@L`oGP(bSgOihcAMW#MJLDRz zyhGm7Zt)nE-mc!>&P+UlTak@$C>Ec+WBuw{xy2U_Se32yNU^l~V;)zktI)G?)3&V> zeZ{oj9ST}>fzF2yT)X*Dypk>(V(_XVYIrvE_b|l zlOw%x^_nHi*VWZGwYRr4H@7K`&Oq3yY?mw5p5DnZ{Be8y;jm2;gPBk`=7B}F z$c#3#$?kCn;sIZ3aI8P=F&nh<#&uOIn+z6phshssnKd2l3WK)2U1@@e4E6O70uFm3 z4ujh04u-OQ83g*>T?3;-J-MI(X-KVAQ-@3s{;gauxBDDODj4(zz1ETG?I{+DJ>&bH zdVI$~HlH=suU}bJt2H9qXSZ3*MyuCnH|W$FM=;j4abr)RkWCl5^FE`&q-v8Xl^q=l zwb7gD8SKxdi@8ib>rw0NHbY14ss>xwXLBPT=~Fb+Hps1Ri@_PsWJ&|2B)q)as_sx} z&AxaZInPu)*)_6x+vc8tRnu7Aq|>+6wsf>9)iMBeAmCK%g2{lz>O^21mDV z>hj|!dK=a*U$M5fMXA+jECHXsL*qhLH5T$Fiii;lor7Z_!o$UoT`TL5wJKZ@rwM7; z@W7U_uBg}RGV9f{`kGd)Z0))>lP~0RJ6&E|M}2*pF;>b&6S>Y}DwZx55pwu-#!%Sh zN)$VB@u9v#p?{<|h8)B46>HYj)T~;vrcEx_TFg3=)2>!nE^u|g9y#rf! zj`ekSB?BO6Ypa%3)igCUt1LEGFywRSIur)0D>XEdjb=-IBa@Ruoym}+W7U#sl~E2o zRoR_-rP|_4WTI{)iDNOO@S@RJA|6T%Y#uEn;{iiQdsAHt&;*RTP)x-$#gto(@Uy9Q zUA;o5HClA~K(XLev?%me53<=#f2uPVjV6<^h~H`rrc+3NhcaDhuP-+=xn=XF$)S`@ z+p==$n(7scmaSU7wn2$pw9Do3JB?b6(N~}`mP*5$CN~bk#hSErD{Hif%RmUMZkNqq zaK%#rx6kADI8Az+KN5|_L&0RJ3uy*mgGQ&fOcOSe)E|c(Cbsa5j3Y9{kHaG%d zkJA^9M=UM19VUk_5^`AJ84a#TG99*JCeCmy=p%u4cNTg#@7Xav*co^0Th}aJUX9yL zY8yK=21h7_T?@MrsRKB{p5f7f&U`i%kAciuwa72mG$}1sRfoY7%NAmGt1lMzy1kKf zBH*xC1Er09nRFqWO886|r_O}k3~wl&D|L6K113dVOGAA-b`q5E)k>?^ABrW@DPVku z(j1KXeBo%&>$18t{iTo{m=WzN#AE61p~3#4@$sR7-n2v6-m+%S?78z-H?_62$hAgn zMVK&UxU*cTGm-2a>Mrz+3=}glhYmDQ+1k*ocOo=5n*F&_KH@a!tVAyH>y{Ri&JY^d zJd%rqf)15TV|MtW@klJ+l}#iQ$u#~puu;>}ti)ea(rb-2hs_mF_@Ft+6{zGLpdChy z(c$x1P3~AG6?W*2c+Tf@y<7KfAKU)$=AM{c+1%JH>!?|>xVlxQGMe>ff;ofLA4m83 z&NNc-*f5Eva&ebYBWseGZOZyKq<IDK}F zLTe91W6@|Zm@C3~^hi5t)H0x#)@(DGY)&VBZ!Hsp$x)nR(#blkZhN56oe2knp-2$U zHJIof?93F0H*eoO&{ZmhMHei=TgaVD4tAa zN=5u=msZx?sxn)226rUn3&rDzcI`@;N~c2DVhN{`u~;Ho8t6#^*^|tH-lrpp zeAcT4u2`*Br^~9x)Krcr*gzD#%AwO6RBdelK6#r=?~Z2k39rK&4*CM|RHk=)Vz763 z^PW8uo$-)E)mSxW!TJuhR^8mBG6CG1?p`CKj;i9`c-y-KcgdvtPJJlj3kS1fdbJlV`nuLokoZkXS0aRnmLps5jNuhoMn zVx!BXw?<0+U5Q8tX>f~CrPe5wW}n;Y@W=Dr#TeYU7ndyz3=NNs_T&()#ynPSM{DEi z`E!?6x4~PfOfH`n_n0L!F`pOvV%^!GHx!FyySvk2pTh=Cw_3CcbnS{~)2U3tYg9uL zg}y@6ZICxN zG&D6eVV}e7@W-NHSwVjwnoMPjrBct}=;UUk0(<)@TyE=-w>H+TTU9OB%9SR!FBHY* zn>&<@I?b+7z+tx7{cs$4TwL4H+^ljz3~p=`CJUuP#AUZ?fa zN@da^yFqUYC)|2H^8J3d4#~ifO{LOeQM6_!9AzPu$P^0+uR+#=8wS*Rd575-@W*ob z6bK&HBGorgDh+g}@&hCN*`NouCaL?qJ;8X_*tX3Zhx?1b zy@9@z*W7@f+>`P zh|{r1#A`8Vl^qC^O`eF?<_^UYxt^int{CmqhT;K}QU`_)@Ur`ZUYlN{v$`Bcya)%~ zu0X6XxUm$pT1>Lqn#MMT9&q6HAvOrc^TkX&8t}#ooqfZ7nFOvBO(X(#gIeBFU)KaT z-7b^sT(KmWULcyuglypJ9=F5h0sF{Mb}DK&TWuD1*lRZ1vGW@CVOtvPzOJqv;xO4@ za)Dqh*WEunF;a;6umu~B`%G}~P8YmUBpmh`ReFoXYQz`5z2i#UjrM01{y%mg8Zw;n$*^pVS(ZRu3 zjkciQq_>CRyQ9HKJP~pjP4IV#u-EAhMkB$1*JidDJ6aTGyWK@w%%ONXSL`1hD&>=I zO@|B-p+&1U+MRBnAK-@=Pv;0neJ=2YbgqyJc!L4E4%|?slELX1Tmi4ki`+;y76@lM z^M&qWA`%OGywPkSn~a4#$QidZ)-<#!)OwSVeps~FnLv20)9R6y@`vNtn)YV;`!XTF z*W(X+O(thB7WLUIHjB|<(CbZRfRqAR6pIOAc)B<++}ATO(47vtvHc}iQ+yi?VUs)z z)(1wbGkDY4u*>box$&SwE0eWtSl5hTUM^Pv{ZKIw%k}hiCKKsgX9<2ho6RJlO!>jy zgx_Pu>}9P@AZef{9?e9?01>e zO1<5Qpj+n%`dzL7V)NdfY}9gXEng*ez^BAtwf1AhGEM$qF2Du!%Ym7=AwT?rZoA;v(tZCp2? z1G}-i{lRD|ortHh@T^{&)91w|vfX4b+pH$D%kR;*w;&4f`78z-Djve|{J_}g&_H)4 z;<4zoI=#hV)$8qUw?B@bJNJ2=HXAYsI4vG@Io(cN#;8&$+Z#cAI&5CM9(izV!x!M! zIt!^-G7FuJMPoVqRntTSMFCEOMyu7RRdS`lY<1xKZnsg*nGk_f~90U=7!REmZk$LRxjJoU&8>$+N zdZQIzLUo1T?}hFoh*GPJZq$TeE+`3!;atEZsxWK@qXC5wNQ_~F*9?{b^KU`fgD*rI zFBoQ5cXt;!7Q#lS$0+MC*xf;dFEA;%CVwmzfbYPE1CFc*UrE9MDc-yxYn znL{a;N`zb}qA}?$RwIJ^sM`W`!n|}Ey(<#+hq7J0NH!+p*dm7VYiurfFr~@q@kis~ zP$=NC`Le|nXo=tBaXC?Wf{9XW)hYw(8?l=j3`a7ZoyE>V9K*ueI^7Xm8cGm~r6~}! zSb^sTJ2rAG1{5>+9Xfdj!YPZ(>j04t0$mHmLMEL~qFe?*1+@lE(V?Ct5CacZX>|r0 zp+qX5Mgn)BKOc|Bf-d|zw}Sd4Jq_ZAXi_oo9%!Z~mWiT>1(gJL2h<&*KNPQ{rA1-1 zdji;I>+H@aZA()-n6TRmx`OW~ zi^F3Bow;-bq|s})V29HTW1}J+zuSs{8_73!FcFWXpnVa5Z_sYG&@P~?L+b#;hFN0C z;U|GN=+Flj1x>)@d~Q2j9)7Y~XECS{TLEX$64=E=`H9Qw00YA>5C+mkMCZvEQd>}e zkKbd_BAulNOq!58v1(LGWFE+V5{YConT21=g&Zc6NspYkT4SVwAzTm96zZVtZn(7= zqPosP5=G&W1Q>%IrfD@O6_~fv2bK-a42q2Wj?N50V zdiy&QA)n1;4@5$6Bx%HcNNT3CzuXd0r$_U1OMm_@IF8bTrpo!RaISH(6*H_8D@ zJzXh)5wzC~&2V56C}jfAG$QOJONmDPaFfX>e7e_Tw-Ab1j2e~BXafwx%a#~9f>Yf+OmA$WJAEDW__VC}J>2lUcnbt57Kn1-QOxpWFSI7kC~4Uj%8TA|Qd zoi=z93)qRy2$}i9v1ATekRoit4{vHv!S5h&r7Rv8V#sYV8m%7W5V2~g77KyiBV_cs z%v^B>&DWcpfoKGUV3~BnZ-LJO_8AQhuM^9H1fNB(Rl(`%RR(M;A-V4B<^q$iRx?-wMN}2*a><_Qq)XF zY>Pqd{P5Kdo5|t{#*%SBpbPn8NEd;s)d=9XK%*TlRP^K#-p1o$q)mt-xa>}EkYWg{ z%L6x}(;A$J(sWk%tq|Ua46yuO^4`!TRJ|2CySjU5Q2_8Zo7Jdnlc~v$@pBp`E%d;F z+BP4m%(Cf3ES@VQL#SXw3ws13jTU$g zu$g!o*$L>bi`)|Q8U=OW_aMP$>}Xl67PHj}stoG{-$!K^w&F1+OgR?vLmTijdqpT; zXDZ^iqYe*|31z=s1NEsjt!LGC|?IHlCp33BdpSaq^C$~DoF!v`=+0=D{Ni9|dehc+kUzoN6#ZIODb&p+%6r6CY!%1F4{h#{p~A8emVT z(exk)a3Z7uo}h5j?XsF|5P}sfHyH3i(L>0EI8o^kO{BAVq&7P9iBQmILph@sDUMcz zGq?c^voz~<7D&h!O@nkrlev5*4Jzw$!hFa`?MS6rJTX)Ogrm@YJJo2CV4Q(~%i#fW z2kL@#lht`}zgQ%eNX7v=Pzkfcff1r2G=#!Or^5x>0bXE%KIqjdtqE%Ai$y#(s}&Ih z969s`RJMDdzq=Ex74@H3Pz|;Skcfe=LdBmMYht1)2LthR40IuY>PjRFkUW8JFgmdF zflp(Ea^XM__5+nh1*yyFkEgIphLFHV)vI$Igljb#u*srOKvQ)(jT*(G&>2`PDn&!_ zSQrXU=n;#eU=^D*E|5gM6-Ot$wK_to=kv9=R14)x{Flv3W<<4n$=1q zy$tX|W@I{G9=-roR3hjBZop&$Fh>U>ew6*%z@%)*2Ec*j@<|_%pRmJ$(Aw`oH4n%q z!Y>#)tP2a_c35oKJoCYu0lLV}F-sTX6)*aP7_g>pICD@x2+WLi1cX4;DDm}q{0Zb> z=yrHSS1=2NZAz3Y7&S0`Jrb`}F$|rvBYz9Hz@#BsI15zN!f7Kap`u~rzYs^@=ISW2 zttJY(5E?t^`fi6O6p#9yKurh_wZxQ=aY0*gBGnwjhuV?ULQW={h`}2D9xNcy4FwYB zdK3EglT2Jx&x`;gg=)DpC6KZ)5FCdS7o#kU9xMeJUN5pJZfGJ>FJZqOu;TWHK@}hg zyy*Y{!R6!9NbORKpd=XkNpNR&2XZ@@8zdG8`<-CVNE%`49yh_4KM0OU719XKk)p-W zBk4jW>_Pep28F?5Hw}IQq=c2~dZ34yk?` z!v#jWLeUW1F-8UPlJ7u57PCN#4Z@0pu6jTft*~dRgvN|Pb+Flr3T#n`4G&-=_eqF` zZ}{yd6TVLv1sK9IA&VXMm^CVu0$E0QRd5Qh9Z`ag0TY;K(jbAUcr+XZL2=;{R;12Y zQ?Q8O=ZMh(a>PH-GXf8~H8tpQ0Eu92EG&>gR15+5d8lyU5St4I=Z85!O`x;T6=ZD? z8R$SD05JT@YM=#%Lqg^$5e*{|;RE#PDcEN}jSr#kRQFApV9JM5S`-t)LeVuGR&XDK z8q6E=f$@=*Lq@nX0x8%PZ7hTkd;(kW9>RCBX%|FAplAgLfCG19m?*mET6YK)3qd>s zlVfs^bwc=n&mC6S9<3T&ZZv|33?OZyp;Ab0L>%WPRt$DRD$ZlX)S(B^X=o8u^23JA zz#1E_2F1j9tn57SzQaS8fQCa+kpc1$%uumCUK5uFexpjAWI+u!M5X=Mx~D-y+s$zO z4&q(V9IFk`hrTgV@C6E!C=4K^VIF}53t~fD3=_e;&^O;NK$y#(%L7w~+jU?}_zLAh z=puCU0Nx;Lz*;drQ}{_L#tX^gqRZk;h>dO|AWOkOX{1;_x}^c5gAvjs_)Z0818#hs zB}U5vX8}CpkpjSIxBxdVjS_O8TNtQ6NSBVqWnl`q5H;$bvQcm%;thxcmP%_)pI~hK z0GX3`xIrCoLj+tcKk4KZvWk*bi%Z=roV$@ z=}YA!dPAH+&*fu&=ihbz|LA)&W_;z$|9k_|yl2D>Nb{bWF=O7-GgjOQeZAuji0Wr( z5G7WZZoq<>Q@ic9+n{=){S*z#C+=^(_10T)Pi-|8#*i+x`jGQ zH>(Maa=B;#ykvJk_r=|4ciu_r&o5ZH=>euGn$LU3&s;Q64ACTC{gt%}OCa;$t`|T2 z=;#xFdFX-k&t11_u$l0^?|x_9x^?Tnv!SN0vAOjJ3bhWP^fT{WKmSE6@vC$;_v_+) zon80ee}7k3=Y54==X3XF?@1-^j{hgQ|pb*H=xL*zW#eP8@_S%6?2xYy8$)Bzep9j`+xiU zEeBqD{ne-cG8nhCuAYDSS)ZG6-0{a9cl`0kpLE7~S6n-9$-~Di^ zz5D#$KlEn8?w|e`!3?^;@y3>$e$au!7u`>8{V4&`9iBVyguw5*>n@Tw$-?ndvlUBs z`_DXg`tUOlw^?t+AT>XtF}Af}d=1~P`(E|+*Ijhg*Vf*sb0UG;J23qFv9a;-hbAUA z_CIhxveVhV?GHcbGKV9w)i>S#i|}18;}37F{q{FkEL*yC`O0studQ8m-37C2P08_p zzJBce4?ddutFRw_@ZKwXAMpNg{Z}tKX~uE5!|u2lCttbxW@oy8eEY)(4?X$fF`WC( z!3V70z3%K&r?<1dbVFd7We!wZ5Kk3=z92zq+k5X;^nKpU0qY(gi=}AO(>14t0#k!t8V!*ZP6p|l7C=${120p z6Az7!{o%iM{_U}+kGyg0L$QF6+S`we7lXI{NFi%$YnKz%^W61|yYIO-U+ktoI<@_w z-tlMOd1l9-{_#4#a`e!)2k&uIUvc{9&!6+nM&)hyJ^aM3&fDs~eAeeM*Hg|o=iHg6 zpL{|^8W`XSXI;1IMy>s>IR4tw$j+B=+tj`upStGjSD$<4X)~|+#|4Cmmhhkf8vps-=y}&Tez|0 z*t_q)|L&Wwy!_g0uN-;d$a7nwt=FA`B{=?bC!T!j=TATLth3I(YGqyZH^0*?`;ozN z+wDLx*X=f7oij1H<)`0m{OTzuUAB7Nh38f)uD_&ec6vY+3ZVZo^kr=XPtB2 zMPFR{?b;h|>iCh#>Ho#uX<$+5!I6orJ9qEdvwPRh?fb%aF8tA_mPKcr zc+ukTDQ}P6lN;V~@W^Zb`um@EKK<6gU)=iB(wW;oLgk@Dm?@%u90Y{g2;0^3?t@ZdAgAAa`H zzyIU$r(gf@qxar^<0vHY&U?q+c=?q#UVHxemyf=FwRH{YdLbM=MiopI8Mr=E7|iCCZ$W*j%Cq5X#SORxIE%(Ks$ zdG7faUV6nN;+IQ%=SKnnb`{@0*Uw!^xfB$1| z`u6Y6I`e`m|G%Kgk`{gN{(Em9eeRJz|1Mbj^?GBZd-A}GM_+jQ@KfXNALtYPzrMBh zYv+9K3s-;R2Bqna@UQX@Y?|kKh501V4 z=F#VN|6%XpmtQ{e(&58LUVZ)TWADBH-fNHl=|0b$(b(O^u5e-R_Cn~cpJ^Jte#tqf zf9}N3K?0vU>BJLH!sKS0aK?F;Uia1I>l<&nSuX#f>W4Qge{962qS>VT-j^<&f77pa z?CG04@|XL5<+|nO<{RZd(wVJ4z4a$Q{_*X-kL)e#zq?}L>}yevv2fv{h4a4hm8&ng z?1~G|zh>^7udTR#P5sS3amTwS9)9YXzx4j*uP?oE^yuqvy!Gz;6%@k2kG_25#lz1( z|H8{JzxeDw5Bzo4-o0b7TfQ^<47S!XN}M}y_BXzJ^~K*@b=6syF0K2KGu}Bcw)L+E z{_)})PaJq;!e0HuWZ&@bCJ(&)_FHefO%i_Z=!;K3vU9xuz9h1-x*xXR@ZHtR7BBw# zid8rGe)mxPrX|n5W1Q)+?cN5x;O*gb)8&Iy$+#>tlx;5Y0&}{qtD{nt~@aU1h zZyC%*0^ZvIqZ)a;{Fa~GdMolN!HBKt`^Nm1r{4c~8uq^b`g4c&|M_mNtn zeEXgEKKl5hkETw+(Xqq-*t6-ueEb)8*>$oTYQDXyYWcFIOO`BKasBmG>u&yeA?)_3 zR$hHNfd0gjKY!NwmtFFObIv^Jl=H4zvT}XPEl3YUE zQ?IK2>HP;@gIT@)`q85dG{Bd)-k!FmAAkJOv11>;_s+|^i?`ogTea}ID=s>B<~e7c zdd4Zoopt?fzxmrM<-hVJECG*iJu+GhS(VLLq=ob5&6_*-%hz3X+3XvAJqKTU_L+Zf z?+zGl{MLf2FT41>vp#<^^cGG86F&LGlg^#D=0>&E`-}LmQ0YAO+XsJtfBTs;PCOYF zed5VyUpDLVYv+CC8}fU`f8%IebS~_7#_=bgdg|xTIPHw9))_N@dO4^cDzWdzn z-#>6)E)lxxPLKPxAK&82{%+S}&m4XKqhqf=^Tda*80~TAF4`cw)tl`8?eNx@ag}HLZ@;l> z{gPXy%Bd$EKTEgiAAij2u3uhVe*?-URq`KnSi2^Fd-qSi zzx=v$#Vlx=$DeZM+2>xns?~5uESJ0Mhl*q4(n8Bi+aoQD&R#&h2(%Dyk&vD-$4?OwgKmYaIORv2F4SxIRYi|l4{~=}w&3Ny{ zzfW}EH`d-bcI?O_f7)2O+hfrvWG(gIS-E7+1)n?a?8~nF^4x2${o>X0s;a-c zw(46ob?X<-nq6)Dh)ZQH4`@zS@z(PKJ@68tuOmyFSchG+GqRZ;?+s5-gP3_me zc*z$&4@bn>3*{6?pF4Zjm#)41lEu1T_jW#X=xEt>zH#uOQqph#iRz~M?|iFj+0vEY zu4yG5k^e{oMX6s|b9?9Z=ihwi-FM!3`;8Y4ZvJiQUI^ZEC(2C{cmFc-^Ityj>pLQ2 z2X_5(%^5R}JGZW|^Y4!wc;xA$*_Df{qk2=HT=-zxWj#`qGt9vm#@1uJ-YXw&m4Z`jS8SZ*025{ddr4I z*IqMc!Ti}*TzJt1GiRQD%GsA(cK%ssUvSle>({PYIBQ8Nj&18zW(ZqTh}IiaqlFS9r*a_ z&Ch@MA5$$F=W4x8C*m>l$!W`8c{gUk-yWSc<9=eiOkEXmWq%%1gNWSm@i%{NzVBTY zF>n0%{VzWq*S&i`)`ABg{Oc1>&yE#V_83pbnwFq=Z;Ps|M3vVrso38fHd(p{cQ>eQRHD&-U)RQd3dH{P1+1wM><=F^5b_j7!K=b{^hY z)pY7q9WpvnBi{I5_qMnXKKl5Ru-~A={qVCdzcOq7((q(W&++4fesw|IqSu~(^6@91 zd*Q_wXDta|_~shLj;r7O->wdq{m<{e|MACv{QdIzqq_(C`1oOF zF;Q!mEMCuPx$@2B!73d)D{j@2T$5RI4n61RFYaDKoosEX!|C!?RC1;!lDR!suYYv? z&KIBGftmE_XLruF2%}zq{6Xx3iB3)QYW(x?OVj79=T#0IIC1gv$DiCfvqhn<2^BkQ zy$qTG(Fc8-OD!E2#&=&oy`!tX z)T9t{i>R4ti3w>LDQP59YGl}=#mhGoNR2j&PUF}zd7+b?#?GCE^FBLw&XZH8zW>qb zbC%eEajS_xc|G{q5^(=g)t*uc@)MdE1`z-~9X3MBn`7o3HME zarNAZ$pfRkjg<}sKYRY1{FX+Esiqhq1zN=0%idqTblH+Oo|+!V$XvT%(Ta$egyhuJ zjgiZiu1ieW5FM9BCKpwV3^*l5otPH&(tVH3Pmz>u-GAvW_UV88`om8*kDNoh{r2l` zzx{ak>+kR0x_ol-#PP|=BZqf7HoW}EW0)|Xe(sey^XJWd^PL6D)~sE%zR25m=I`f+ zcV7JEk6-`!+YdL-96NsW;NHD^_8vU2cVgeJp}wF(3!Y!+X7XxanM zucGJ>N(uFhp1FDZ^KamE`S0=jAKx7G6(y}%x*~k}@=cQbcVAes?)BGKrBM0$^2Tik zE`9#fum2>5Akpr3zx(62>-#&4rQ~HZXTAB(TW`!+BkekQhj3~AkK^~BZ%uX=iwZIm z5}EScxlcU%@SmNH=yLz=cmMwKz$380A9?Q8`3bVdN$jC<7UB_n^XauKAD%mN`t+GI zdpD~xS4@BK-r98E)9*y)ahVjyp&RgO5-_$rOAmYD;fEf9)%)1=IkTR6 zb{WIgaO#Ku7^73u$VEr)#tpeb1QxY&b!q?Q??2tQ#hdjSu|iF|@0n*Fc|AqnJn`}E zyI+6)*%x2lxrG(;&u!zs?+z#Y{OtbW$677u@EPGErVf1l$A^dZ?HSoINTfRsj*ai$ zJ-%=6?%~Y_SM%@(m%skcQvcsK{Q51illk$aKW}YJ7KIcavo3rEF-I+WYv#h_q^OAS zMYEoI{He!ayF4~`;fiE|y|kinf7(FSif;2$uM+o*i~})Ul@8nefRZOpWnW5@q>v2lcz6UIyqRJ@(R)B&o50x zxwSGoY|bir*}$3ar!EOs^~1Nnz~k30iF_GT{ht;V(M5?9-2d0d9(ruf`)RpZYuEBx z&l4WM|LuU``02$FxIvTNdU3|gC;sw6gs`T6|A#;P{`H-2;T*g)(dMyMcQke%*p3?I z=$M$*^Jc#A@;htNiqy`^x*ByJ)j9IfCm(!PA{$D@cy>;X2m8%y!v**m)5Hn|HIIFb#$hCV@$)9)fuRnhK>{xHPD0R((*)Knb zY3=p7Z!L-!Z{Gj+pML!6^Dpk)y7A$@cDVM;CVR0)f<;>&VK|o-;Q-KE1cq$w^c;E5NXe+)PN@KZ0mGG{^9qJ@iMxD_M+V}1Pn=dW&la_#!16MKgcj_BVp zux;DU4`5WoiF$ry`;MM!Rc_SMCCgXAMZb1KW|6jb&!2jl_dg#fgA0^Bf z{PM+xF-1C7_)|tw*1D@|hX$EL)ezD=u%{H{4L^cMEcpW1(g5wP43;by}iD|icpwb#Ajq>iwvBIS6`a`!jn(@_5S-G zdhD5JpMK`)C!c@im6x7>=IN)Nd$oI7@S|AC3I(F2ovcl0)j)@K#(y!2-e|NWnzAM4!Q-B&GRlIGlV z6#Tbq-uJ+RkG?p2*7Hx#&2Vi$^*M$OaqAd{pYG~70n6*p&hf9`f4STvU;El~|K0IU z-P^N^Hc$+02agSUEusF?|F}EZ(cZuNA_m4+d%D_N0_GyphV_|jE@i{=#fgQf5lMV| zdE@ArQ{x>a;;aqpqnEw*xBDKNyUEsh`1T*a|M0`TJNkFy|LeyuZr=Rj$Dgk^Cciwj z@Zp629#HoqtnmCxVFliviOJJf?|yUlhu{DB;mUA@n5pnO^WU7Z3(!R|Y25#pN1l0g zZdkIWcLv%=Ca-+`&)s;VJp{$ zy*6X|^D|$a{@VOi>(j_gb+HRo`?XuP?K*Vq$i#tz`}XWRczFLnt*>tTp8b1v_HNy_ zMM*B8WvAs7(#Y_+Zj4yIaL$WQKll7|&mb%b&-y|BEwKg)94z)ri0*n62Vpr4Tr(b<~<l+_l z`sAbIhYt?=MX4*_eRIz1v)`J(c=@WeF-e)(Y0-;c``csBKmXEFZtKwxKRkPQZ0yLH zb7#+ec=_h1myhim-`>WPE6RCr7p8DL``FzZX-W--mKa4m#tbE2H)(fi;~Eh zk{!2y{Oabl>(_7G{`#LV67Sx)e*5ONzkl}Gt=pg7{_M-UcmDp#>4W?Ccd0hMJAL|V zuT6jY@h6^pb;0V0HOuC`{?fD0yfAa_JMX^x_S-Olk|{#Hv$P`ET<G|;-%uD;O&6Fuc-FDwzx(>jo0ra~l@abNUTR`mdPd^ci__{^PSR{%^Z*L>SKO15EJf!QDH$dr-UB?sHaeKXPPyg;peB(-}xv zSMjMC@sZ&xS1wyH=cUK)d*B(Y{fk$uh>1&5nI+XD`_G*l>)d(e>%Whedz*qrfmCNH zZ)^=(8L=zZ#>K5&x^O|*%7}<%Z@>1+%-M5h&w#t(h1qkLrK2!OYIS?dQ2FckSBESW-VRvDz);_oYOmF(RjZL5VD}G*tAD+>`+D?^@Ys#X0NaqbPUNc&P8>UZ{_-c6Kl%HeJ70bO z?KeOE_{F*L!&k3fICtT~xpQY>seCZ7#c#-2^1?$8zc6Ln-Rn`<(k#-}vXf9 z%kYkzIy$lEz@Y<&4%g=9no2~;k;@jXPEU_Y((gEb{j;xs`0<_#4g=`>&ptlTgR;lM zl-Pt!p^BQx*V()k{+haup+l$6p1=0ZuW$n2-d|dF-7)Q>133xs_B_2R66%!L&#ENN@L+5;YrM-L+xw&R;+{!B(way=v9! zwMm3PpU~aW-q6xk=MrTn=Sy8%0&G6_Q-PusE-g2YlD7$y zaeR)<*Ky#==bwLe=k~3e*RFp0%|EW4J$2^HxpPPQs_ja4{-&f2F_Dq+IefLr>2;fR z5;Dz-;$u%~b*OGj*WkVn&R)Lq;n~v{KR&f@cw1`&>eLG|Qj#{TTk_7^VT<1(Z2Kk4 zmaR+KlwDB7L=_#-uAq@-CM8h>MQO3|D8OWKz7QHg?j z&)PsuO@&>F%zCZf?5^q9zJ2Wc?Z1C~_4cPXu3S8M^4yv8S8v|F`{R#a-~9%0{IBm^ zzkKndt5>dEzjSnTYsjO@iwt{b){ME~X)Kk+;Y0z5ik%r36`M}sA@A5z-GbU}CvQ`1 zOkB*mi1(9oY0M%fFq#||3Yc?JlQu*wd3VN3^H;w6^6X^`UZ1l{+_BY7S+g)o*syDK z=dL}6PF%S0#pgFZxp@ng_Qflgj!o>_JJeAhtnk)!4)5Eydu*V!aZ4+(e8pO^KqS*v zZXX+Luk(AINYRu_1U$Zg!$6SHpi>~jzc4N$iKRoTqouT|r>m{+;D^_)e{$jY!SSJ< zrb>ri%9k6BlC=3RPoMGHtXZ$WKI`>4^TVTKVq@2@kH-ijZ&NR+Sj~&6n?xbH*SA+1WULWK_XM=E4e2TD*^74%nN@~ZT?VD#9{8h&<4Zb3%W3d{%5s}{Zc?qbY-8}j6i zl45sBF#rxyoz+v@+}Xdq!6}oMbdUD7_l@j5a^~XM5B83a@7mtk(b3x6+Sbw#3~mlq zq87nt)gnn+sgMad$Vtl2&dJ%7vZ(;MIWlLJ7qtg9TlxpP07A)(kByDrxFI@bV|sdW zY{a_v-v{z>T|{)!CNfW<20lWqG?z8>?Am)^^2EtA7cX5racKXc4<>=eJbPqkUz^id zSyO6a=WI&N6js(dn2B+@Opex!M0{gOeb3PNp<^e`T)F-EXMg|X+`*yV-mMM5OEM^2 zrO8*K*VxLdD|}U(8;NYQYM0aPYaSYIFEdJ*IZ4ssi{G2SV9A=e#N@03CWlQ)3|}~J z(efp$63GGsGKlRpE!##9PaZkAZ+tgg5_^xFJc||i@WigZrc#g3ZboS-m&uW-;5Eod zOxqY9o~cF!cXK6s6T{WgSmJc(g#sC$KpSL{GD#^pD6?V|0O`Za-;|aTAGLZ7$fXgH zaT^noNCk+)%QZ$zN$b9ISFRz5`}dn)eSQ1-rSligd~oQ{{_)W$EqI>Z zV!NZPw#;O)8H{$PQKQrA&0deDh?KZ-!@5-~SFMhSipJuXmY#{-DN|AIcb9jKAKX2# zeQ3D1t)(e|Tx_?)X4EL;Y9v%CEp~Nb>iesfEO_^=xo^%}v}DEF^&2-tMy!iTA|Zg1 zn35-u%29mO1+nO!j+V}C{X;wYhIS41^&$_YaZ6h#2pvc?gZ^><&|rUOeX!h&1n)vx zJ}EsbmoC;Bjb^LOT~-~eYi!-NbFinap{cWXU}WEcJ;S5>_YL=UG!ZF)RTafVzOmEF zBc0GB!N4bLY0k zKyY)Jx-cuJfJ!Oks@=X4P-M1l>u!aHU`I!z-&a;vTG`lKp%)ZUvr-ciHpHx1GXJf) zbKZF4&9~o%n=UdbkFE7JbZy@;FgUh*XnWuG-fjKEyGP-G=<8|SjOrw>RUzQe^YXbu zMs`|qVp4K)68cL?AtlAb7<_qvC}6HV@BPxckl4l&8W6g5ImApWSOQW zY{W(4GBe3VYOB>*QihreWRn_|3S$YXx{J$eo4R-H9RbDGUx^Fa+yF{UB{(=PCu$Fo z8eifoL&VZw;%8lOcW(-A3|a(=<4_VvhxkLe$Q3aIahrHr;6%G@ei-00HzN2^h_TH^+t!>Sl{nf!*RKYq7I-OdsP^*;+6}E%c z;?hc7*5=J9lW%Bl@9f&z)4LtU7cg;sI|jO2KsEBZoerB>rx0<93UML|g-oUv6foE* zs6gREvA4Lmw5qzQqOzv8HVBwSDT*$9#a2SqQjHCYTqF=lQF~RyC@d`ENsxPtngNkQ zPqctap*B0MS~Y49OUqE^Rb1?LxsbK$bfeV3L!|Lq%_ijWYPI(gnz6A^AdOXr40zkU z^j4dNNV%0t#3GRxo)nG#->Jy||41R9Htnf*h^_au|3^uRr=}qz{PeVGPyUX-e@t6V zG#aW+h-w)Wgp~XJHK;A~;%WE^U^9xhYKR&&6kV3$S197e3xbVpKp1qvJJVQ)BHi|u zCa`ZnOaUYZ9ExC7c{yH5@DnQV9f01b=Rpk!z7TaKDCI!S25KmjNCD#s1gLq%H>k+E zcMz(IM8PGOhn);1J0l~5l$}GN(P)%^ALN|uY$7EU9SS+f*?D9L4KP@2;$3uDObjM* zFz9rmTpR^S0-OZ@h(XjKYMY3XC)7e#K=qD*>UaqKhN(IglxI)X$o+ZS1n{J}t-ZaS zD6S;-IDm^aH8taCYDA$>O&}1gBMvAcpu&mJM3_48V@(xGu~FMaR8SaD&N)>&LsT!I z4ugP&;6I4E9CT>Z65;}dLN2P&F%;?aoa~%zWYAG4H1No|02JZ|*f|-Q*`QW|UrA-t zSzIoI33j8B21NvrcTn<&$}c6sGvvuoyop*}s)a|S;7f#BIh}?YU=-EcwL*hl=+IbI z5UVf+0fyIGs!UozO`SmOk{Psif!^V%(~I45q%#Ipu28zkr`HNydM>@j%5v9OLfsye zjJn#u4BW?SgLZ?Y-4`&`4_d2gOiAu?fn_{s*i$a^7`mzkI@3ckF>@fGYQhr9w0AdB zgMI$yW}nM7>LOG6#5JRJfu1opqs6OD@dnDV+09JgS(N3C;`VM2S>np{XhM#bYzu`O zVuUA&sXPmYe>s?adPjH)Lm;;c86&DVJ&)b#P&Nt3O(8J&{G|b9jJTX8$sp$}eJYWf zV}RD~N>+M68=$1ryDKOf7fm1xNdzWuNbYh-@;q@Kc2K}m1*1=$D5dmgR_WcYItN1% zS^Y`LQmiFXHrEp+h!%+T;%pvCQciKFR>k(v?P6Iwxr^D>R@LqbOj!H6eP5RD zX;)rsHsy5Y^?KN$C}n8zaD1vhRc1%=UhHeB+4s}r(@2?*$`huQk{=G{Ef!Oku`5`a zL|JcpK-E{CZlB1c-^>f|YkH^Za4dUL8P+n9V(oV=b(JS*1daoO%&KAfilNb!(TDBx zNXP4=CC!XDZj}LraNg3fs_cn<=l*}-nDC+F4rtzT{=LWXSg*SzqaY9bzb=K zeJL|o!~VCQ#Xw(~WXWN(S5t(UXkYqDPh&;m<4Gru8fGu_9}PxKV;$+CE_l&*JV1&_ z$?G{RrZeTe=LR&Pi9mf*UDs$+m2Yg%%}$f7?(BsL2an~yeA6#XVRW82Cy5VR9lSDZ zn)P^i&kyH@D9AvCdPAe-VUDRUeEg{}-r$9! zorV<;-#?G+J$LqKD1G6J)8`4AhYybg^H$D%6#d5M?e(b=-(31;IN&ag!|iTJDdg~g zSqb&^)%#F!Xs-!X)C{%N)uXP`U1}*O@JLPN^#gUiL;LzvE&;_9pWyK}^^^~}^WtW| z_~_%$g=Z+S;izYmV`oo?#Lvn&ef!Aqk>-#rW%jfOr#(D7LS7R(Hx#TFM8&>5?f%DR zu8uMs|7Z_nO{~g<6;C}p^UZlAyZ7=R*M9vK;7?#mmad44;dQl*{o|*f{`hR)skWN( z#nYn}EY0SX22bBS_vxo!o<6wGC1z(XT^X|=UgNDA9D^_C`0?SI3VnP^&fBj=PJfi5 zjbXbDba{KdOqsAaa`vTM$Fcx5D*98=V)Ol*CM@@$3e#z0_bT z1vIqF?~vCwiuLtc)99eY+uhTM>VF7D_#wn%>KgI6C;QxOL+82%Pfc|84|lipHCbw! zD)bs))*W^sRT8kX^i6hhd7UroLxGlNGC9GRHBdG*4M(dk_r6!+OX)AVY3&$vtaGQ`QZ_f=`^a`>IpUvO~g?kGg8;CT^6=@aoB?JwP7)lYvZy>R2Gk+bvT+^`i3Ts9G|>=>cmGE zj-EbvWCB7Y!2k&1R)dh7M9Nqj`SzQ$r%!(Z$n59-^57GXJTc>m>9ZCrTM-|VotnxN zfHhPK66)xY^ytKB57zw(fHy5( z4PaqlN0JgF)~*O!9kyWEyw~1%d)_11!wF0*M@H)NS?N=C;wk!HLnM z69+C`KDg)FN5?N*IzD;)z#uMfun7$lv}?3(Fj|m1&Pb;ug+~GnxMJRl>C;!tnhpNm zoAVbhTd{a$cvyT=R7yr_2AwI?+T{*EAShkEV`Du>PfwmYd;Hu-SIL z<6{Sg;5HlW4R*IR`cW?Lt1@X!GOJw%xC)s?&7hHDqM&pVxomYreC+DDsD!A*cu2aW zGpRs5=mD}*VSge<=|AdB^;KBzn>*_phx*zFhet>E4E1$^WZTjPk58b{k8mC>yoEY14s(bX{_~C>5`X@%mjvncsI5#%AZ+Ku2 zP{U0@;I;gAy+xyEp%j}zLyRY#M#+v(C#5DOu3a1#7abkDY~{+eYa_x|M9m9}ikUZa z@zVLrmW3}44_h4*8yy#)kdc& z2giVdKY0Aa#DOD|dnV6;;W|13*GE@hKek7qU~^p%4-(`pA9g}kP;u-o9_Aq?3x(eh zte~SHC?_=~B|a%5DvA^r9z%+YPKk?&jERkl$5lqe5(Fu70vaqOJtZkSFFljS%n=G1 z#70gFh5`zj{azHb`v4QH0azwf*WKLQ)zjNO&_6f?*Z=6?AW+eRu(Esmx`##whI)E? z`})CM>gnw1ukRd$a!Yv-s6_~EL2%1wH+d?sCq>1!24G_*13)rz1}P&wJtaLc2I@d5 z$T?UYu_9t^bj<42t0SW$mPW2z9UT=Fhii?AiH?aREb(j-37fRcY!pDy$mBdSFuyzj z=sKW}nB>^a7|cVJe5#rn_zW(KO)yI6R8n3}4p?;* zT23ZCFO!l-%Ak<2i%v<3jZR5OjERD~KOre0Ar3CF^pv=C_z^O4GBUEsr1WfZc1~ta zPC6CDWI9a%PdZp8P?#Wy6oBWT?^{vLY%N7)IM@e7ExWhWRqpXXc?^4LfSS-n>Ol{M z0}msjr@Ir}Rs3mg>gjCmY^$$pYUylgYH6vjZ)_p9&W&{-7~tW7?LRlh;oC~3EDMiML_!qz(W9Wp2q?h6ZSetCp z*1_!Y0De&cgSM*5=c_5N!qql~fI-4d5Qae`P}40fAz&k#@I;%zI>VEyZ)yq!;FBUO zs35-9HwA(iLcm!8!UPfz3=rVRDym9B&h}u8z&0U#+wgD$#sxt-D8Dg;1fhh^5YPbT z#=+zga1RzpC}JqIaY0bw37G;|4ut6ga|gD8fWcre@$@J#B`8b=IwI^O8VsbI9HJp` z*W~nUv`S`91_^*b^b1O6HkC%kt7)*EazLhr;~NwoUr1EXpr){KmdT)P(27$fj|XVhG-#lFFRnIr2yVoORa7P#=VEI zr--?g0BC_y2+s`&Ayb4OgOVo(fdq;b3{Zb*3@!`S6BG$3Od69*6`}>vXNXP%`w3lw z3_A`ho)3>L67Ot4;%ddj6!fl&nI90xvu&SulVQ3FmDuVK-lV*=3$7F|HW zoP^#3kPZwnHYi;ntFvIvfoKO89(t4)`H4b2w0eHmE7H}5b;5=aMb-UpdcZ0(K@&Q42uxo)q)N0&N z2@`;rfEk)6W~zXp28JA*Zvj`u!0_Uc^Kw|=36itfgfbuq;amwt$zy9IQ~_NhpvvWd z(bL6DrI;!f0#(f9As~vT7J_;w6Y@0j95FyE3;_>7K#2i39AF{oOQV%oHq z^8e4?l9!g;tDk=<46j@K|3bjijJCA_10U+@@9%0v_*9X%;=P#MJW@U_H=9P3ycMBz zm_Sv4r(!eO0z3AP_qNuRIdp~5%i^);VT-v%LiiT>0NCh=nrugL3Eb^f+b2I5>29sI zs2I@;*W}O(7$QL-Tg+!*4&Z|xg3$>|g-+*e7(1}DyS3J?;%r>BB$=FzP&rQw$@rWxf_-)K@t>+T#$>uSievZu7I};PII$Pt@kz$^rG0y zEMaD>S+OB6Kbu+z_b-b^p%<~aBDor$Xt#lRQPMKBb6aOirA=Lw6qQ!QWpEId5h)~G z5z1rLI{4smVk{gbTXrIp(_Ceg(Gyn3QHuaO=Fo}+JZ2GaK=46LIq9rMQ*pz{{#}5@ zmKw!bF&pW8ET&SvP)(qlbvh%#^>De1!OL@@YHVxkmY~-tqorjq#C)z;DikU}u2N`# z-!P&H?QRS`Yk5<5XJdVh3z^Dk=?s}vsMKNhFzYm+^EivWrDbpnm6v!*Yav|&H?iNL z<7cN8h!B=Sh)HMGD>X*ks@qdiQbM@0iYwc8B23;Mbep8))I6b7AcWUa4zwg-XejjX zcuRa0@bZ?|c8>1dxqWK`FjMqRc|wIyC|8K3I;{e@Dl_iG?JfpJ26U$Y7RZLpevcXO zXo$1O!5UK&05hcu&P$z+0BjibT8+_D+kknt%z@gw0-8vzR%i`6EFe~*>p4)qPtZZ^ zW|PfV*IZv+USiWJ*f}J+fX@MyQXoZ9suXAjRQ2N%jRv?;-L=gPpvpN7YF_RpDwbBE zOp3-+%Fqk+MC`mgiOWtKHAz95wRpXeN$34t0*t8kX1cD)U4Y1 z!LEA$X1@e`t=Nq@Mf8l+0v;om!r>ON<)(@q#}0Od8aC_GqcXD z)R?`U2S3=+SXZmdh>A^0$>9iTS%nf|AzdI9@)ZVm%Yjql?a;Bxem^EDC5t6uWaF7K z3pnt3OSQJ(=*j)v4Yk(1sHmj0Y_^nNzz|Cc$qYW92O@35-jB|V^)!2#vG1b}o+Xzs zSxTdnE7coyX5eB+FMWJ?M|-6xaeX=|t57Os6$;g2CR?hI$iao)e&PC=-Q7WT+WL&# zyh4eLTO>7U1Ol}|X9Q-f@BF79ALy$yW^Tx$6>?Mt1x!qXSg0}@jBbCh=j5k1PK>lU zb7RwhXb=GZ$k(d*h$1QEdZ(v$$I%mey6c?GO?hm-KxHv1lxC||f$)IIQ5I<5d-3CA z!)-nuDU*&tgIq(o$)=O4j3y%hbagvUUYy+7RxZxTX7c$mgGsH>o0NPE7`fW)uIfB= z=I~%^nJ|50b^(k1D}ED|S}2r@c_NjJRmetLinX?~j$Omuo4x9S)GT;u`7#M#D3@_rd@K)g zy{)W$c(|v&L`_Xh$6`MgvWpQm7l~LjdQlOB zCDGV|y@U8<9SteWdHIFlK7+);EyM;ifbMhH)=kZ`b1;BbUWqbJnf8uVEu)NFDggC&w=j$KwugK+86sBLIzh2hBvAmP21b@#ZFE*{>A?a}Y8Dra|c0!bYscw**2FlP zOd^%=xJm?;%%0}Ghg(IN1-8D)LFI-7rW}&Tv;qPAd3sOVzJrb2w0v9N{?@`Z8;Sr@ z;S?YOs}L)lE&C2P3rL0Do%B3poYA>?-*j30h;UJU>;`Fw)9jwHS)UY)W>%SSv@D zG1ToI_T;3>+xN7KqSlc3asfS`sWPdha-F;5(4I0%mSNkTCQejTu2{~^&jBP`DiEn` z^*ehV`MKK0u2O1r97QbW(H|HQPt(Wpq_t zUyCL+He0BYFv)bWS}v5TZK0uEK{3PFI=DrdmQ#a-Ff-)a}iN?Th?1vwO< z2KNeruvx1%Ld0vh(=9g!w{?|?3fLN(O($2FKpeBUDz@w#-|Er2w)A(n*yJLW*{Bdn zft7}ump9bgAJU2}bzPgaluWu5TXum&2NJX1=4J1XmIt$dEExXP=b zWEaA)Vls+^n5FnKlP^%JEM&+Xr8ZvXCa9diJT3$jlEaah%L86Hlcz7KuyL|-*dk0l zY_3!;$<$C{zh3ypnBw<<|02@_P|f z8mUmj&f(dOOqRWKV$kpLdvasQLVAwW$YUz4Vz!}X`&b78?4t0c8AUmHVs0)~t>f}_ z<=aNK)>OK3BhtizY^GeqRsw_|ceU?7&{b8TOW#0Ou^C#kgrzo$MH)}b(7@&jH!b3Q zhM2)qD>!nGRU+0_^&c1txJ3!!=@NdSP_I=uAuFQuHV*IYtgZY93oDl^JzX43EIr2ZJFKb$t>a zgf^2|Z7nS}8!W{g$4>6_OVZ+~N;yY>y|Bxv#adF*Ke?~jkQcMDNXBO=3|gbZrUM2y zFn(%pttc@vog-p#6dI!&dli$(*>&d9n3tB2#?@&gDl@cP${aSAt9JKCXS=jn2_%+? z$3(QSM+uB>J%14$GKq3Sr9ppGE8aA}8)mfC0me1j{ku4xsE5&?1UtrqYQYOfV zPbL?!i`YUbcF8J)y>0b7`usBFcuPTVQXmLwGXjmN@wRPmG8Uw5D&X?jMO=KgTmFCeh&Y(5rRc2N;q6XpU=i{Tg$No2app1~$#VNL-yhwCmJ5Bq7(M zEDT1IS`AqkBUoR+Od35wAaUJ#kr#GpDZio`5p6y#I5kkQ_CtWOdhoyRPs7ZwxtjvHM793#=xuJCXp^kzjYci?1WJ+!h*XXF(eZH5rBDM%N7K=g_TZ?P=eLTpG zOy~2NEDn__wc5(Y&TY+Imc-`LSw%UST%*2Z*M*MsMR5#TE{&d<&eiFPcU^2wU6jma zQVSWINFs}|c>H2ZMmSl@D-`ha@}xF>>AsJeHY~}M5`7L9NGpf_Oy8@z5Lu@&mAx{9&Arr3CnoXwN+@>wREb@Swe zenYZA27iO7KnQnH+v&Z!_)NKqFH&&|M6iQeCU?m;bTcXD=bP6b`Se$`| z5&?~myi5rqO(M0kkuj2xCksW4PFmk10s#rbI*A(d)ygB7Hg>U2393wZh28n@9`>yjIt)OebToue8YkzDk&<^;z7lTOG!7MS8YIN)nWK9ieUIwo*lUx>A|LvboH`LBH8&%})`l zsSJ}_Q#M$K*`pwZr!1i8%8exh&2FcqFo~__Q*NyCM)#avUK}u33SD1r{X1i$VnT2w* zS)+C~jvN}TVr7!qaUu%$X?go7m{V9=F_-ZgOvDjpw*O{Mr8^#@N-&1TemlxU>ef7YLilEtnD7` zbdpmkMFNdYD>8=qb`AJh8Tl-c#%7cn{9S{+<%LNZWV%47;)vaiUG2WY_@rDKHqTtK zqoJp#nv;~AgU?cNg^tFao{%VULnf6Wh3`=x?AjWXroc94N|i#sp%y3BW5q8hLjH=# z7-(q?8mOsRR0iBn0=2KMDWJ=P&JRv4V2NFUhM=`zV=68a8VFK*P19yOBPBH}pA9=k z;;3$F@Ni&e(!qw3$ep##Tgt_oGV+;3TAW@nR&_;RGu=_}f{b(V4=62_BY zcdzyY>jF+OjatM9vRrK_3D(uRVf`_Qd_<)h$`4gG5#l>6o=B$B*~)6G9nwN-AzK7n zQ|t8C)p|8-8k3LQIUSbIrus4i=57Iggp8TLp{~q?kf0D&yv|l!y``ZH39>A{Qi~tm zRZR`$CMgGr#9#&E$Hs;Vi=0!)QRq}!M{#9ili#j`LY-2t);T@UY_D+|Ao8a+sda!R z*R=F?IAyjPJ2hY7t!=DUE6e?|O;oATUn!$IIvwN!^s72so+uPxuaU7$|int zk;fD2^9r3?-5c`&w6ANFD7xE)sS1~_xgyBCQ@o%TeUQKj}b@VUX#{0xgn?r$+MP1THeKAfffZDM_uI-X=V=PNh$OwQ`592L1kx&TxZBw&s2-$^>vWw;&MwiJ4ISi zVlrRH)om$9l6mfiLbX&I+*+p77A9xP6}*zRT8BZNm&I3#ly$9corIE3*GOfh4OLn` zIcXD1%r!P|DVF3XCggKi;*yqH19Hgo5UnxSHG25joANm#k-Db(BW-MyxKE?kY4vQYo73JzOmfHqm>)}0OfTrnmUb4hS}n=*%~ zSIdmWp}rv>C0`ErsHeJncbkf?v}++?+p&A6izRhB4bJk=_Wm*^U1vf!F00$NS(MM$ zDWnExP5TxjCK3SB&EAG~FQ-thhhxMYX!eWg5`!K-!_c;NJBM#T)X81lzO70kGC}^J z*x#|U-6n?QnybX$)CWF-!sam9O9DN8RbsB*YPJ;noBQgO@V4nd1Fz|9G1FK`DOH)= zp(Y2jK&q3&uT$R<5Rp0Hx$B)(?M+5#sDor+F5A*ohU>ug((I~j^-IVcfLT>WdwHc6 zED{C$U{DD#vI;?k7s^nLXXVq_Quu^4Hn&|$XFy_Htg;k4l?*DAFBCz(&8g=VB3LPu z=v*GF60T_^&ziwGha?Vc0;Abm;kBuSd?`Y#PG5-)6n8!{_Ovd$K`mhyi4{_4++b-g z!mKERJ+B5KfW{DGlkK!=vOo6N@~y}1=yf9D>;0lS>yDY4Q3suNC^>J zwHBy*twgHVfrqbB>vc*6An*hqUkxuW8bKyg;0O5WiG#rQBJBGAT~h3{X>(@$pCc@9 ze0MLx^2RsQroHj)wABP|n#i35<{yzz=vW{ln8;@Yauk`A1lXQ9@QQl};?h$HZv2Ko zn8W1{)9}x4rcl}Vf8zKz?-~T`sUHAIM>Z-x5SgfGeQ?cjHbVY}fQ=K!6ayO~A$ZNy z%ZRkid*?!?0JJy|cf?h}>>PL>qA~{CMvZWJ(h> zBgIIgfmiOC)ZehI-V9u^yq!vf_}thkUcK*ln%>=6yL5Dy4Vg!Bbm6~V_R9*PVa z1T-%8lWsi2eyDpw zEsn|4Kq0mi>Vi|93Znvj4h;yECzM3^{b&?4yGFu>jE%dZ+{(+#&LjlN2-O~3jvH+Y z1qFP?!*fB-016jGH;@Y%c_b1;Ur`@)@bXBRT!%k|$}h-aAif6uFZ47$rdgr`qragO z7?8+-6-?%U#(M~F$)?GXUFiFwdh4dN_NG=lbw4>C50 z$xR715WUMf)$IxO8K$YOr>Dimf>NRcLQar}&>)HojVXWmRR1(Ve^moH4k(`>v)Uv_ zz(MG!Z-Fp036ixkH)Lu8K$&6!jW3B`e&d9?r*UR+Coq$Ldx}L+OqET54 zDjTA6P`}mZMXilz`FaL>>MdNE1|1TbFof!pM69o<@#5Zz&*fz&L`5d#5u5bJ3M)G` zkt` zM_JR})z#>h3pM5419dKl0x6M6hEP#Uzzu~T4U-hNA}m4E)Z6HgK?n~8yciv@zfpuB zkvT$881+K*LR1Y4j8rbLpH(BQ3W4pkw; zNW)EB92QO1gxV@pNPAL2p#`#oDEgrZ5wnJi($~@wsKAJ>uMc>T{E3edrbkBtmN3*} zVZ=p}Waxn=tdS5rZh?HIl}i!20?kcrks*_qnU@e5okG_KTX1qpHrI-=VB$hg z+*jAq(&)DeV7VcGn8(2AE{94^FjS={WccWaFIpUg8X+-3LA*x;amO46l%O?oYXAyc zrARv~#o3jvV8~|>Gw3Xq%v%?92$I6yUP`jmHHCau`0!1>`U*&O(#559sLntRQlO%4 zV5CVI|IUmV^CC$?Z+(;Bz{qA>1KmA7azu2t$`7^R#wv%~AF6W5@={2MF_bsgnm~YVpgmDN1jst==S5T0H)i?iL>_a&crf&k?GER3-_Gm%h=#mU1oBY*=~e z6r$bB-6ngex7h))AxJrUU3wOk0heAmk_T%X%%}y+k_6u7o)(V)2~Pr3(?CzaLXVAy zsfIMxp1yYEaW#fq^c62Wy@2X&8S3#0C=|8@UDnM`SQ{Ce=jk6C?rZUC^rg*RHA)6c zruPKfdk1=aIrC;MPS*sRJiPR^Ye{lneS4kT09|n!M94I*a<3Luo}P*jqLgs`cLj0=D`b>Bmdsk$(~ev)m)+meXiAy=_>3fX z-&kLbo)*2Dqz!fr_V}3bk+JDq|HxRgN6({B1iqGXxw1UqtLYx;t5N1eE{zg~T1sV1 za$T9y5vbrUd-{cNy0vk5q=uWgHr?8DaH3h3 zo|;L@VdxtN`r3mInZ)F&@(CHH`sPquXQ;-_O$?j6LfF#e(X*45hSAy&@9Al&F$w5- zDG||<-XlX(a@*eao~A&3ZRS<;FHQR4c+F68lRx#^K9vj2;` zcaLrBJo5&<^C3lx4q9|DL5pB~{*E)9 z#V$VVU$cL$0ys7$@p3Nj`#jI@7RzMI0inQF-Pmj|SK=Ojwg#$YsQ-Ik-zUq|H#b1p zICz-j$kfZ0DXB)#-8(^K>t(F&aio}G2SY$0_>GNLLDTiZ-a|Ya#Jtk6{;qyqb$hd# z&8I9vUVoo3+}f-rv$cGH&ZnFpU?L7a-d>~xJx4l4Oud;UrG5KfQMB&d*)D}0A|9u= zU%?>9jX<5`t!!=8vMGyW*W}V{n@}(mFn24Yeo|XwX zV^}g8s|Z%CZe7@DFOpq*f3UA-LP~k1LjxRvCbiXOyrs=mTkoMBktVjiy<7-{%B!&Z z)*(d_w@tyTt*%Q^T$ zx0nhbb#vethg{rQ4;w+gH*q^U`9?Cr} zQqqBtN3}^W)nhMT-P*dqo}Fr$@u%9mO_FzP?>CBsL}1XB zjd>8J+cj)8Y1U5fZMCcXCXArhWU))!i!_Dc$gZ zh)Nd9ab4dJzWyAK*}6~;%ybPgH}7951L6@6biVS^ftOz6>FCDRl{*jK-&(DBHTp1n zAu4zWzV)nT`&z>x?0No~k;=`R%MO4agTN+5#+d;gwS48X-#)r`ZTH&wfK z=#WmqBi{ShFLuHpD@(^FkeV&(?vyqj{O;kM+xPFaHLvXFqJW%H&m8{Nlf1^|I;kcc zWb)bwawlwEDs)Uw-*f!9mepDMz5w3?JCrA&^O_t%tweRtyacYBqlJ zyL&B7U*{`F204em{iKcSn73hUVgFPW)l$sHhxscK*&U}6K_UHF@n$1;) zfAslhJEeq#f@8WwmV!R{Y{l<5`@#LXy zjqx9sX*q+tsU5q zw5Wl8dOc+u+y9L{PrM*)fAW5Oa9>CM*RXkeP(cHy89em-{!Xr7sJp9E+`QU~7jFLk zH><*abvC6JNM$%!cQ!?T{X}2$*7fa%U+1S4y&b)Rk^SHN&Jj(xeB&1nKKWKI1jXYv!p)wgWu6}gyVp7`8QTM-i@bKQJd!6O=f+PF!mw)=j!+-wWjh6Ai z_ntfWYPTp{&Qe3qeETn-9*MQizjyyqITa?P%2=!7;O#$ZG>O!)t$V-yxS$8ymZWq& zPwn|H&%&f33}s!?Ar=>Y{pIJ&77-BQ;f}5!K6$WfNT49IyPrPTv?!{d|Nc%=I5IRW zvN5&YJKIxV-}B8w^xfb6(+A<9?%|={-o8Q3*ztY)r>fhRukGH0!_end>A&-#wx(G+UP+Jh-vhXl`HMN%0Rpdr-ag z-i4I#z*9#}ane>UhjiT6x)dgU-{J3m?FC)q=A+*~VlAA0`P<(;ypiJU{nj`C@~LAA ziYbM=P~}RitxEaA?K`)3QZjX6>q5id|LnmLsg7VS{_>B%y`bnh(lI5*3-9^CME%BY z+3yV3VeWDL_rJSS7e4<~w~3rOw*Q$Id*K^qOtrS^0cZ8@AHMwEj%@!A_jNdT@7--l zpa0soUiRGm;=xYU$vb?gtB)%Z_8oZU#bNL2_WA3NehZK6f4Ww~QuM-}JeiY?9^Av7O~F1c>B@42D5l&E2-=IKHk@!{m#2z{;qB8 z>9oA}`!9a|#rw-~o2d7wpnTo~YWSY-%bGha=ovO|{pO3SmAK~E-sfNJuw1;|RCd1H zCCy&Hzl&0*vy*Q!P8|B~_g@-x<_oR&?tlF0XIJWN+(y^QjwiqI-2=yaJA~!DX7K2X z2L*-go%bI7;a9h}XyJ?p-6y~E#Usj4Ab;uMmtSnBJnAtb%l|rF`9SQ`FRr8l5D&B$ z!=H@s6vzP;y(Z$H~H%;)rv8BNfZ@T8aj z`8QW9Okov@-L6-Tb4L36xzfPSFCR25MD2rz9~HXrw)T8Wcv2{k~f3GVCOe~`qRJt>8kqG@BPI$U(w~0MnQjPpRKhVAS}|} z9;p|hE=Qj|z_Bs0#Km6BtU(c)2qBP3>z$OfWzx?B!`0$J0-1FBXsg0Jm>pRa_?tbx6yMRHQQ+VhH z`?@#^$|hBmKYDm`=gQ{#jn98|v!2R&#l6_E_xxbc5^yMw@9$UZEcJVj?(M7=;+3qr z|5$flPyduc9lH47gQi1hEVr)R^zOqi?0Lz1<5$1ALl5+acW&H$_~`wL^vH7u`4&<= zbl?Zy+sC&^M`Wq$`MVE3e(>u*JlfLZX4%URR|`(T@c~DBr%V_FUfJ+qe=nbVXz!~6 zOQ3x1=I-6kZ?9+K)eG0IUfv7~JHCyVd79(QQis3S3sCtt|Mt84x3)tHg_tv}Bo&;F zBLYYE`sepAm#9DzG{3?yWX|8{BpNqA{h+Q9JLu~6?u~1yv5w9O(lWI7dwUNZ;ZTgp z*uGYcm9{_m?H8YadZ#>u!}u46HL2y2;>bw*AHTSLp%J%C9C`Au_Py9mR`L{t-j}c6 zxUt*Jl(w%`(MPL=$DjGm4~}r5%{F!&;-Jacy!^?-TkR@>)w%`*Lfpp#BB^udH@|2S z0ukN5a`%I_`gy#u!`|x;A6=$|igF!ObUhvdhVf@_C0&dglSlF8@^i)u3T7U)H;Ms7s^!s5C6-a=LQ7O zymbvTmmd7)S095PpcoKPmZ{;cBV7|}GE=WMuibmEf{8cjF>$(IdHOrgbx#rH_dfsZ z{fn)Q8+W!ERbsf~xxJnJ$2)r`L}LQ)#`SBLTa1IC8drB)g|NQ+*#rH!kp_om$ke4r zfBa=zJ;WJ2y6@Rn`uoSoaB2JQCwFgOYVW*vWuri8c)bD(<$yBfh5d(mrJf8#;)QD; z-MoBxr{u&)Q#3Kq-Op1n8#q?2l1DlvCX+DP|VY7;FAqf#OdnnWIY{U z>C;uNeg04X{P_kQh?lY;mvW!|>m$Y#t?u3X>e+n;=LW2?rnQj3CD#^cQ>h-6$n zHseTb+}PQ^d7~ic9u|%qJ>0{#a{?|OZ}{eCzqotz_KmtpDB@zY#eePPE`bvcDDA5k z7&Q@(c_>Jaok~Y_nNb{n=39FOsq@!vUTm~h8I4H9@9XLt;SBfn3q&IS&ci?aZgOL-r zzw@;bwSKDi)g!&a)Xj&FKD)KEz0)vuz0%onoF^FL^EYm`vteRtaL80|RRU5DOv*+2WP78ULXdruR!{UDex*kmYm`lW2lu@^?Af~a z`DeG!*Bh<8dhl4s(O$mThJ();BdeQG<}QaVIw>D2!wJ4F#Gu|D91%e_a`R3*31~?# z;42*_US~%iUrl)HH}2oLapTf*DrDjvI}QyK97@Qsqlbgi>5ron2fIUJx^$ ztnc31$pbwZ>>eVraiAW4MbFWGp)FNuUAYCf3)+aPN=Xu4FQ%J34F_SGA^5JHE! z2cAE8q?6}Jh80~e9_Bi$8<%fvH|wQJ}N@%sAa`Xa8DI4K-FetcMG(_w-$IKn3z*KS?j zT+NaI`*cpPMuq_6Fdz}5#T&}hq1TS%83rH~C&CP+nHuit>{XU_Zd|{H4%{-s8Q}@U zVgWmi4PjQ63Wp$=*eZC9yyIQH!ayMtAOQslh{E~pb_w~!UfQFUV!W(o5mE%LlbJ@N z3GsE7#N@oUt7i-(I|{$j-!DpTUAcT|Gw(Di1U#{WiF*htgdArhn_bT|&o>y1Px-@u z4%nb?9e;R8KqMF27cOqr0FH=ZCFW4`hev>0(S<4u<}fayfexy9ef?aSH=Fm)4D=36 zk+EuP6?Pw?I6I&bizWnW%0mERQrnou*4E}~Ic^;8?t$t=?T4L%LV@pu>YEof8%d{n zj4LG`L$@Fxu&`4g3^0iS9EK%ln2$_LuMLb=k-~y3%vQTuucRm)R3I`)+H_KwDg#Hu zWVuwRR8k%p2S!FRf4Nalk;38OF?DRQu~^Gu5{%J2P(?7<*${Pnc5kY>2sMA05c9_- z_#B={XCf#ssWW-w85Rc&6NrOn(P5IscpN}%03Ldj&;DVl9^dyHPCYNjL$mB0@BaZBngg^S@b06aW&dSOIpE1VG3*W%w*Y zjWhgsosn9As^M;p1MeeY0|Ns)5&JH@Z69J078W)q zH9&q91gl z0A!4}1cedaEc^Uy#yOBgmM{P=yxIi#l0}~>{K?|~EU3y-1W-Ewre(2a91a%M1qzIp zVN>3LJU^yGJbsY9PH=4TDIj`=f)k${ZxufP2nkmLUPQybFhFV+gatSZI2soTUI-6? zmH-r(1%X+12MfM~T=5m(1HX@-0ho?6#lFGE?}WX&aOhYLz~i@yqkz}P+hpV4|NThf z-QvN=kK@PLAO4ETfPb+6e4OTv2U*PP@!`VXA0HRo8;^g4C4{hV>@j-&_>srx|5p!! z3xUIfM{y+CgYftZPy2s;f%pMiQue97dTI9Wc!a(D9-m$O*5kv4-}s94@zsm6f3iP@ zFBY}`_h0$yng9KLJ*KsM^A+b;R=O6lyr~C7}d;He^{KNSF|Lt*n^UuG? zKK|#w|HqU3r~ZX~{;yvB|M@olzkS{R)DQ8W|77UO{^$RplfwU=_?sX7?T`NE$;W>_ zBeXu#sh-t~h-bJW_+0GSbMF7e*6$o^>-WK)J)5xg+k~wj8?XNV&#(Xf`T6f03(CbR zs@+KC^I?&NDJ7Lm8u_y(y^6@a`QhK6Wqf{}T|GW32{hWZ5H#oTp>W#u@|nH??i)Wo z-V2n_;fc(x-Td^wecbl&-x${VqSaQ~=dlJ;P<9Dy00r*IplY#^A>wJUy;} z+zj3I5|rcT5Y@GvkzjwPiwg@`FX$Vi6XP@XIBkMmr$Ih`s&7=~VyY0bctGZS>*mkj ze|On-5|-y?tk!O3+uEogtr9Yqh@XkZ+}Nb$DqpD{ z(VCcr&6RS7v5aB61hE+Da7<} zXHtuFUfL$%j}8sD!+k+4K%H*uFq zt%Phkz@Pw$dMUGk_1S|TNHSA|Qc5Y7DU5b+*lmWSGzcqHo6Q0j2bTkMn{b=@5fo!J!ZE?+4=_e2{a=HcQOsoknwokb`$)PSZhr%)Uj>BQq}CuR_oPlA_8}8 zmDWW1{XQSO5Q08$FyMypJ%pQrLP?;I8*F$8m6eMnn?fRnN|r&bobWrWAbiCmLAMpT zlP;GpmWjff$&Pa=otcG77mhPNm{Wuj(I6a8U}ucu6{K8LD8ib$+FTw|i+a_C+6<+e z#|JxD+~Gkc1=s3$obeMlrnC3~kKGn7F3i!eiPb{{>ZB9VaKHx3StTgAHdIJaC{SHC zr`zoS|F>9~OQXqD&p_^ti2hz11J|x?#-(kBAt`9JuVm z58Y0B=!nN1PN$=8oI!|nVTa{&+3^_y2}l;92)BDcFr)CC7D!{{Kj`v<4g^8#L=W zE6#q@52X&c`&yWQxO^0=-f^HU(Aim6RJilNc3P>@n(d(|>R+=?Z+7@%#cCnqc9^tU zrCg=81|n!2{A>)N)#kxJ7(et+Og84DJQ2oYV@)dHsSDfXklz>ZxGWlpL~BKr8cl-o z=7wGmb(-A+9DyJS7r#M=4{9OshO-NcrDTZIqhOEZvhiq? z_E{j?q+Bcw(~9!VgkOQTH!LbV2>O5`I1zN1SaG#Ko(9D+1Qxf=6Qq-A#&0+2VF&`b zzY{`w7+*ZDH+>#=2&Nwic!SvRRNinD%bM5YkN9mkaas^oqOpk2>9neqMzl3JV>tEL zE}%g+Ip|!mlutx_xbWbR;deu8X@RB@2cLwXnFh|h(sw|fr%vTCZS%% zMF|3M3~t#p>;S+)l|ZA2MH^s9E1Zx);EL-sL z-5v+)E8z3`Shi=FNwOaZq<*~_%|HmmHc;D9jYFpDb>XG_ks!);pBH8?EK3^Or_BXx z73_&9>+soOAK=3+gTsUx(+VCr%2WrnaivC_a&NG2KT8GYmMkGoE?(S_ks>zxOmK6rmT~jfnzGW!xM@% zci!5VFGRf-CBNr1Tz5|X_{b@lJ&;%di6xI=Ml^zxpZ2+37@Am9i#dy#S=c(aG?#Sn zFs&6iyauU=H_Vrdm7(U=TTKWnj9U5lsL)C;UwZ%j+qW*vCmn*5eW&?KgUh6X2cg-j z6@u&1s=|+koai5u$}I5&+|RX6aITQ5u#g7@E)@+DS`EI1*?-z1QDS4#d15}*#HpU1 z;aNM{My9;9yxgki=aJD7n3&NJW`&jvRGO7Urcz3T+;A6CDm7LwcC3Ie z9EK$hmJAy@MGfXc2GZkW(sPST&1S)?H99SFp~zq-F~hK1)r7_DWDXVYSLda$N?bG3zP1`KQvcah)h@p$~f zNE8VB^NR0$G6@698!M zqp)0}1EhRLDAHQp(6R>dwK)d!1(QKG*rrSyj*7^$%%0IW2r;v7z^ z*Qyf1PQc~zhbSv1H$ksKp)mQdlj5MeZ3cr46kU`-Sk~Aj-)>VrJm-xC5vIC?9)1ppb>I!iu{d z%y8OAA=w4Hpw;0+U17zBZ*~Uo7dtz8z;bGLpmfc|u(e_X!O=$H9fUg|UJybvoe5S5 zFw=mD-)Y0fjRJ~}W#{HIK9gLbHrj$w*yo$HIur8Gi*vc4(}sV*4aH_QvbU5ON+OJ^3QNo7B9KmxmD{Hf}UvxacAgA2x1})1<-fYPUnC3F|FZ4rKG;u3=*gSPc=4SOg>+ zAli}LxbgD1!zsJfYOz@{@I`_F>Mx%gwqY&;?;1w>SX3})Ot2d_JAOol3wC7a$g~Dj z>i7`Y&;Nbn_Td-VD%tOaT#T(MaEOrG;$r(9yBiz#y$u^8hh^S&p!R^ zldZty>jO$EQfcLUUK^dwgdt63LRx`DqY|8a?RB0#5>7C}0j}JJIc+%C+TK_>cj3*q zw&Igx68QZsuU2S1Jb1@B0!NZD3Ssgk5Xe2efabD){9~F;2V8sX0Vf(HF8L| zbkb=R+q`GuA>B~-xI*nNrg6a#UdS4j7Z&S9I-aIOPNcj{i%=6+b2g>ksTAP2*rnq` z14Cm9RwNRyt!2A@tcILa4{&${#T^(qZD zpc`9z^Zey@+Q>aE)aX@aTXe2ch=?TXZ=?D~F9(-DKBvvv~ zs?VoA27}9EF__KLX;@;|oQXzzv694ngK0H#A;gp8Gg_MyHg4%gv&f{&xi}UD0=C;K zGv)XBgTV;I6%cB%mU@I=JF69!FLNgrOt$bI0|4=i$=*7 zh(!~abznU<6J{zD&1CY`B5hNNB-kR|5jR}#pbB-vDTaVo4EC8|ESA8)0_(Y11y`h4 zoHD7|?%GesqR}wgZ_FL^&>y4{={)1cR$`C|W>h*OI!LS+0P@XdPp;Nj0My}B&(6s7 zc66R01ek?<0FmrgtR(R1bC}IWm6~up*3o%fRxEy2y-PkwO>{x@(IBt|VHE%WWn6xf&wRELN=+^PyNe0n|*ZM%<19?;D2>JCX}m47T_n z(y=P270eR;lnzT=Fyta_?x4?!Luo>XmWZLd#(>WDc^+$2#bZ7gM42s^ z9AK|St&i>+E0~is+Hkg^dP4_Z zt#~Jp@3E<5g}4ubX4=D=HA0jKAu;SleSQj~7m)-4uRs`U|5uwC)@8dFtzYo*Ke2Oo zf|y}=*lNZAEW@JL!k|tEhX|9^7oA&KF2%g)>~)T4shCd2Ba{iqnA>T=sLD#13^3=h z+c8G5!?X^qBArcPla@)BTIU<8$B6KF7oLsk-?XuS(sN3)*o zt^xCTD9rva5Q-+yN;~Zo;sAZ94&aSJkhnL|aC>|%lr^mPB{oNPlQyuMG}|4+^ccyn zFeC~FTsTN52~br0dvp*RH-tltP1=FdfxWh1_GdKP9=EAX6dp#Xdp#~x3r2!HO(Bm( ztI?r=g_G~pHhv7!ITobESPjKCp7GD!HFBEpd93V4jyD3C zrOHG(QyDXVMyC|%)8{_;`*ZN-HaS&1jx5+XyU4%=l?en<*h>W6J%c|ve5`kL7LlgR z{MnoT?bDCfoM$jx4kT+UQLI^Xp_~dpB8<2Qc*b(NJC2=!*G(ZIK0TpgO}2fp`ufuR zYJ2nI+a)FR_=#$xp7yHvqr+pINozD>k|^{p)AYcJQLrY8m@qp{zS8E^pWVK`=^r}$ z+8H}rRME?CZZ04c++mWB56#L2XHFgKnb10esg<=7xH<*c9%F&X_(Lv2BzETOQN1~~ zxVbu)p$&t_-xxJTB36Tve|lUzrJ|egsk2*2gGM@rNqF+?yLaAy|Gl$?kY>2McXV1~ z#6_h;{YuFABJ8F)hKU$Q2gD|$H=m+Nz1detC(5~EJ_f;7BJPLYUZbU$bdJ`{s_iPF z#v8HBjExSDOzI&_4J8`uO$haZnL-pN0F&^!h|OxyskG`DxqEJ&G08=0DHm~F5~U}R z%H?Ue^0?fvs$0LjRVF9LWG1r~GmAnlg=@!8$|t3mx_LHh#2?MoXl+T*;w>qcFjRtEEnc_%J7`Av-jVxfo2+F}H+K7&Pgq6xq%J z7dQHFEE4c6L-d+~pn{P^rd*w$hXskw>@X`Oa@hL?Q9oK?9||XEI)(ViAb2G5S&`Zq z!36;Al*0tG6&1(?*vb4bnlr;i$d^ne66v@XH@XG47|K-)(oj1SNH){jLa5r4F_h<+ zliASLq?2h(!YxXcZ{zSqC;;}T{QX!6NHg3IVD1)4;pn)|bx3X!um;!oJ?1T`T1ZjXRC=xv|qeQ5wi*;bL zSsamAEQ;0(ZZj6Nf*-ZN;OGpY*gw|cb-#uRvOu_&~n*sJl{9z?#DQ*^+tnH8H+ z5qP{7c$^2rkP|2f*tCEp<8@ng=)?V3vC!;eCW(d`vsZ=QYO}b}dV1*`z%ew`cmzz0 zAPZ!>eX)2H?iQGYgPGu?Fy1xV-LP__psi&`Fc>dl)RD;NX%}`AY~NV&gV^ibXrIwY zSxk29>@YipXrDsyXtA;t0NXsdNGbsjWKb^r79BF>tX_Do!+Ib_d(2uRwm7V%xG3x} z*VVaTC6LIod$keS2kdwv0<%1}MDxbWwK4-EK@AcJ;4J0?rh`c>ZUz!vIBB6;kDz=BXHP|WDzQBI*F40l4%uz)Nk5lm~@e$=GUSh24LeTbYe19iZd zBNFo2NjD8d6VCyUKHN2F*WMUSfZ>(5~Vh4CT4MB+=0Ralo?p3vqKjQ1~Gv_ zqAk)`{dPBm>kbSi(dSyRWuxlzvlD7K1+r86AQ}J!Hs&#-!dh!JgU*5q!EJ^uFiW}e z0G7gQM;IUGaO{8p)hBjg2c|;)SPrRDsD{B=f!(=<*F9;^$E9N$%v?gL&25)C0lTQm z>RQ@grnzIG47^HpdZ}36-6K;;Wce)N(ho{VjVXBUaxG>a6Tv$bGK-CTG(^cqj8Sa- z`ARUW<-o*>sI_5u9g7Fi8tBCmQ#S6lOAR5tKxiB5t<6?8f{8&@BQ?>>*p5d z5^l6f(P*R$g=q+`U@BLzyxh9{R;#(TxG=xOsJ+oblZh}UHx@Rf2nIQFg9mmLY16pH zEtPQxPjn9U{G{tAU5CE+-T(1_IkdlrH?Gvc?vm8XZ4uh8#hl8bGY6viXfj2+RD=VI zIqc(CFT8tc=kNah=B1y#zk8*%xVW%7*KDQd>vNS{8a(a!#YOC(2^vaPuLHRlq)dwu zp=zMJZ&EZZ7g_*j&bjZ(4oEnx-OO?~giJsmQNQ)UA8bw?%ViyoJ7K(?V zpm$+ns4{9`gR8Qd{2>(@shEli8eCedM{6UblYPVEoT0I){vm||V>2tkAfzU~yj)sq zoPX!7?dDuQl`rNijrH2fxrOHH^4i+k&fD)^Jon~XFtgrRS>0G)x^e-7^a^zFv7p0> z_5rg-CFUMulV=3HlPCK)qpu(9_}c@||LviJ|I@z1M?3%5A9MORQxoE8i&Yu0Qgb#W zk(y;X$(TZk$epC!l?mla$+U|J`HJbe+S=B}+wZ=$vA)^dXf3U6oNu<@+h#C}_w?}O$RM}@ z=+wJ59h#eqP--I_ zFvK>E*-sEyfGy}$6BxvL5`knXUY={0bI1qEMl*|*>Oy;=+B~=N=0K20!fOSz z5wJOMm&2+jT`kRJ@+o$79>K&2V+t1-1rq`hSHR_-Iy&^@qsM+SaPs8%;OxvKa!jX$ zI=vkgvywk@3Napt22&tn!U{raFj;KwoJYdd+I+o+R=He(UFPP-#`z07yXW88xww1r z+E3qk_tHDpTFqKHn*b(a*CKn1FPPy;rleX0MiF=}xkM_H%M~WIk(8>ZAdKN2?>+qn z7lXkWc#5bI6#>>QHeqy@R-h4f7hK1XE9{FV=5mc@W3$<+FEz_W$n|rLa%MhS0Dep- zeXfL;LKO(tZ&X2Yn3svlZoOSg0)xAuCK2wt+tSNQ!LQgDBPc%0m2D3iwYAB6fY*NMd7g8j2bJTC*W9M zk!UnR9YQfg6QBpf;|%tp25h1*A`d4)os1wd#%-d&FaRzDBuZ&9TAf-ItlOtKoYRN}g&gQM~BV~jEo}F zein)g3`>yi4n_;A$RwN+3uyqEOB?Hr?cJ?we|PQ5^>^NR>&?xzvq(z2vAMaxNJSpP z9l-}irfw#cOT}_dt;?XM6lZutC%Difa0drQN5@BJ#)o=OKB+J)MhXGj!BFdtySZp`ajXo@-+m+Foy8INz!iq9M6K zArXx$!0Hzp-WXIV%n`F*COkPPo~3BHI2j;4FlP3+d`>qx0b6YV!tKKsb2$SxSUVdK9YaX_yJr<9KqW4p2a=s)xpC?4`3o2bR5Jkv#RVO)NWlV1 zWh*E+nwuBa+i$L~tW^=7?e^*nh+i6;nHoDYCKZedW~X^WCnrV7!*R7!t0Xu1K!Lh880<{@oAn-MqHbUaJ=>xp2gTahuoaPGpugRvY=X%{kb~n$g56 zL^A^EBu^|8OT>DCf*^xI*x19e$77LVBNYlJpdJEbtpj=3JUTqCGR>-O1WO8X0oh0| zu2iytCqyhF| ztsw2dmBlK9nq)iVaL`Ywkp(ZERZWcYxuYYTi3zT-yL*%;N7I4)lyns_V2%2@;Tlp3vaRxU*Fk%B--nayr= zVg?N{mJ@Cm66u(Lf8yniku!)-lk4;flg)zsFsAnAcB$fbMgoM#gUEEB6?hvyM{M!z z_SU8Cx3;hDY_^u>YxDU+jgI)uNRtrqM)_m2pn1s5@aI;-qf;^^5OOEaU?u1~*4@vY zf@iAT7mv^73-gP4_{i+MbMNxXav`2U5dcd(dl=s1{%9(ZDukVmUAB1)Q-n zT>hCeV`n(y^b$a8NU%BdLdnGGS6+Gj z)QDhK1@@*9yd`8WW-Av~3pp>`yu20@&We?Ed*i7@b$M-LalV=^r{l>CqW1F9R5=<= zMia>h11gAJ9o+ta5`yvoH~%tx zy+9(%CSzF);L)Fk-6U&Sn#|__+Y~GF3yngiJeP`uL0U0Lq=H$wY+5>FQb{B_05e{{ zD`>+29PNWvA>^Dq$rZ_^80Sancxk?rW;4_4>+?RF-DJhqWKhUe*ze>54CgRbLT;kZ zgoLR=F;hV#(_9_gu{7AL=~Q73y#rj|)XGWG(D3Qu!J(nv;o z22*83=`FNT-oJVEXP?~PJ-@lsTBt9i3pgzhD?lQl(N0fI!FpY#(yH7RSHNy^P-ctT zBFB;-w^(g%gb#qJm(F@X9ML;13IG8TrB2CL4;(vwiZiL!NVRr@D-7yfK38b0uP)}m zAPd=@K9J4aMvuemN~AG0Lh@A-K?pu?f=LwfQKl3F=Ow|U>0mHKU=Ao!Cw#BKpBOwNkr*%l!y8#Tf93Lp3rh=&E|;p5Dh;R}pvOE$w}F<$(y7vX704>0D|3ytwe2N`M(H#u z9J#lDel>$B;2`_s4cF2(VVK1(Wt6(qO0lrN@Z ziI9_k?YC1kJ9bK8RmbY7`RyebJX!$s1)^n24hu#Mev?_3*&Q#{G8Xalna+N}^rXtH z(#p<=2*24lw|VK^wQ@=;F@u0)QTfpjU%s@pv|6=srxiM}Jsi>tbv8@TBDYwgIZ6rQ z9%2DRfD1EOzser51k0JkN|vE1aOG$RLQk~(Sz91MqY7jk8c&$i%?@)1&&VPn_~94U zTTKwIFqs2Q+6a==O5Nu+a)-f3N&wzWV@!kQ9`Q`$N>4N%jZpw*qTyI=V`C%ZP!9GB zq(YJ2lr7R$!}yd5X1LZ+vXl*KhK4x;8OV+pIVCbodOjWSgLL3dEWNY6y|YnARm$=O z6Dx~pj2bah9OI0R42@3;fs433goRG6*08{dl|V~8Mjbh=m~R5jw@%LzYRZoei6gRr zK?;w-SaG40@oT0PHkr}H9iK*8!GO^01~r7vH``~cVPA}N<zB2aocJU*QXWv;=3Se)&1=fGP_ zxose(!WFa9-Y#L*Y1Ge(k&;6*g>r~Wg**=Nl+tKT#~pg**qMp(sTm3Q&GU&+fD}$E zr)4l-#PLY_6x`hprjoiVJELBP>qYy=#x00X+1R7!|-KAXu~j71SW zS(>Xbq$|ew%xDSdxs}o!+zgU#Bj%b4iB2mRJv}bugL&qTz%kOMbGuA%W7XKfFv8r} zM`^^A!;IA-n5ooP*H%+N!}8@~A!bMPm)c@B*@yt+gQr-A@v5O<0Amf?xlv{YmB~ei z6JncPRcj;)qt4-r!oXss7>&Dt{)S*{o{zcol98_0PjkoQT8#c|2v|Vg zmDL+?Ax6Xi(VcFRE7T|QNS`4|MIcTjGhR=jTA0Tfk0_;Pi>K6>^SWY@#b*0lIgttb z5g=hQ1xp!sHbQyLvocaOBb!x$i)@%u>Ww;)9p27hTackds*(tTSj_rcTM5Bos@>BfeSq{X6^=MggI4sr^Pbke^+?#eL84ZVuE9>WX-hF5LTs0j4o!S%4=cD$i zGa_}c7+c+L&Zj7gX}YhEH-l*zn?8dyKfMbn2mue12?9P=kq(xZMyiOIpNdk5{|o?T zbs$E}?9`*7ce?zPRK~KqFw)1IK0dd(UaHN3&S+LcKZ=_v%_8u2w6J$_-ca0FstNOm2A%QPn7b)PfT4 zFO*ZM25H=3)KE_39$_u@#~B)S;cC4M>7rvCu>ms-M-YKV5G46hg>tnpSI$LUwtznf z0uQOvN;PIn(1YYZ!XC<+3_*Vk!xR^`5uagYY(xOiG;JTs}#I`fMQ z1tx(4jiE5aWUbOkurPC3dtwphn@Mn2f!e@>6=1nLRGniWT#bdS7{J;oKk3ZJ@wrV9 z%}B;LQngA4FcU`9q2hWm4q~X=q@EmA>P%psB(mk!QalCV2{cicjRJ_|AVEU{BB7Yk zIutr2G_mPverTnu=a%ys1|$O{8c}wq)hOuWVCWfLsKYB2lpQc>I8$KqQh)$~!UYql z{7NYlrVz^D)Q?Zf^@KlRHyR{BOKsX|JxDeYpD(po^t&8%I^wRTBG4l>#+(VC^VXOT7l=F3*>zkC+iMh(V4EdbDT(7OACHyTk+m zLD|em)3v~-Tq+nr@-Gw!G*BP#KbVYaiX@ytuuz;~(4ym!C=fhUU@n6Sfte^^Y71a1 z!>8V$f;+ujP6FMS1Ald=pX0 zbd(8tjZrL8mg#p?S0G-fo*WYXxVrd{fM#+fOguc=4^96HrFueA;FuEhq2}lft0vC*YdA zgb;xGnJ6Y>a20K?02aeg(L{h5DQ^RrSy52@t#P05vn%WP$-!ntHB z%fwOr#A6XZ9Q+*s6a6sk)@h)qkxfj4>|zBK2JM}vkPEoXBDu?5Twn$CxV+=FdLAMv zCnzQSGf2sU+Q{pSFO(B$H%pGwX;f;_$fU{ODJFtWTvxdI{qblJs-=LPDz&PK46YnK zCLWxVXM}RZ@jyrBrs33GYgRxdaR(i`NdfSBG!h77MqTe`su>nt3s{6oe*()k797%o z&`p5~QZsOBQk8P9)LhIJ(kZAufVvr`$K_V1+ZwLVVNi-#&@&37!Q&2M6bC}yLN1n$ z2B5SvsKp59m6&3cID&XIVuQ~rL_CVu3%Ut>rW-||nGnBdw4-M%(X3l-bOXxGfZkb1 z_~{@hNu+vUP{bm72qlMUqp>+Ov)*_(+AA5x;_s(aUiHxQZS8`7@a#sN7Kc^ zTmiJ5;#?*Or3`3k9`xJbE{JDm1$`qk5;pTV2<|QZTdL!P12qStgP33=xCRi_r`e8z+>Qkp_alwC;Y65_V;}QC+!iV}vdEA2K=+Ta zCWgcV9I+`@fZz~wXF#hWF{@CpBUcYcID*56GlE+h0TfR>0c}$XIUqYTsNC^6+6ny=NNNV%#NhO-6jTuh66&%mwL~%+3K%Ap z;21y`;Dv=dFm5QWz~{rrOgsgTZVv`prLzlJ#Op%W3$?SUu2SXeXyZtW2(y!T^gv%ySWD_2{$~dQ{NqL1`~7&4q(TIaQAO zZ6Zys8jXXVhGCkE0+Rt4;NUcf^ymzdMKrh!SVdUgE4fIR1nY}czL5?iR#cUQKg>6~ zA?g6m5|5YH@^QBrI!gc;gZ-$vS*j=P4&|%o&gRqkLV`l(pHQYjC}lN5YPqAcP&7o* z21`+nua=9MIJ7E}C?%4kBDCqOnprCmtmRA^^{hlFnZeF*>S(tRgm0Nxt93x3G0U5E zf?HBsSz2FR+IjE#KYV_D;q7;~&o>vUKy>GqFc4!BG{jxO0BKT;f|2e9XHSnrl(=6i zof@Cwp6oq&c>hm&hqwr7mx*Qe2rg@tbmsIMlb|+%ECiwD$LeLsHf*pVOoP4|yqcTiADmIU1D)# zA?66=ip{HA^(G6rHFDmiOZCm4R_GFr_riK9*;rm#Y&7TVZNM^6bHLnX+U&?LXG0kK ziEWKSIy5T-w^1e5Sg@F<>NMt#Vit>5oa`GM7~xK9OlrB>lBkv9Nie|zL6>ZB)+%!@ z`Xx+wLe4mqskFucVZ1*ym$VQrQly_aIxxfQpX8kxo8pd&4Vp8jMkc5Evt|-#zf2AM z$^zoBLm>iLGghvxUD&;L)&KVCy}!SCrM(?ooDI3i~VD3@7_DJJ3Tw0yB*qg%iXqeA|>Vw5IJXnAV>rv z69AEO4g|p*L{g$eWy`WHhql|DXL@>fXLhD`w{F#~`x@?pzABfy+?FX4_~9Eq=bYzs znV)C*pZZ#0(PGp|2XBr~2pUj z1ZEzFmcCWcK1}=Ym*tzA+YksIKYsS|`Dgrk^~sa-2M1g0^)hCU7=hT86(YMh4hgin zu|08-)hQ&iVsEpTUVYipxHcpnT0}7_6^G9fkLLol>i( z4EE0^I3EeB0Jh!ODlTj1!UENa1k7z137rJUiF#%8Y;S4KaKxvOdgwf%WfxyKqGPqa zvC-SP_sN@w+Z#0;-6ZpQrGfwS!%{?z@ZmbmS9n8kb{y>O?rd#ta8RjZ;?8IJH;5-$ZU$hWf?nM62CY&d8ozyObXKBb zg~11nZ#)!N+;&Q{~i35D!Wk*nobGb?`l}dF~P-7G4TSKcW zlxs-eTU3Pbe(*d(Y3gUnNqX{Ra-8FsgP;h#ihv~VNv&3{)vBceFBG?YN^*%hkb*UH z@I-*XS0S368ozV<*5K%*upi!m9_1#$;0+R>%f;a(ki)^fPwI8SZeAhIXtG4}p+(M8 zeB>6F;{~*Uqi(Zat~R&toj*Unzqz;f@ciW2y*>CEwMr(rg0*1HM^5MV;K-n0;^yGw z;MnAhWKJTPlHv6+n+)@Fbk&MQB9+EMEjf|OWI5N`+db;+u5Z;l&5iAi{RfYZA3cBc z`0W0}hv%n92m6~%ESnsFT}~@mCz)(+`u4!^otxJ$eSGP?_gLd^jNF}=5KN8F&r5j{ zSzVkqgH=f>G+XWM=g;;waUZR% zSmk2j_~g*dcmC$W`yXDpF+8VGsWk@9sAh(CZq`NGv4g8bl<^~z<7$`doi6G27q4G^ z`wzeS{Ill|k2t)vo4sC{uv@aw?(W~CieYbeZ|~^Yvn@hlk(C84+(?C1ubjMe`O4M7 z@p-vSMwCdyNXrDjWNv11?Dq8w?_c=%#_gfOLD;v$LzA;p0*TJ#WGuq6w#cZ}6ADMy zRuZj^Eq-> zgcM=at5tGj^I4H_UM8n`S~D+_D^>WHfLJ(|j4~E!fmp86nYDAH62qb|0XC<GBE5 z_3ejWfBEX!*?zZP%vZLy4mdjEMz0lMrIZ?-&7GZItJ7#UdW`}RG3w&gDy2p(lBi{K zQzLh-UAcVm%C(`}moH!Z`K7CuF7jkvzjgb{?OD0jyv&jjVyMk(&$rbQkf&O3-BJmRN z;zlQ=>5atr`Y2``)g!U&?p`%U4J(yy5bCsAy@l>>1))bUu_CcV(vRscq7;!iAy{YT z{o#lU%uXklh=eoK({n87TE^9fn^i_ z2f?f*=dwYqu{*nVO!R5%F9IM{dpQE!56s3nk>_T61IT z=)o7?zdqY;l!_^4ak%pPj1KZMEX{D?h|Yrz00882lmAYvWzbpDc=V%;6F9Ws9RsF9 zDjQb^P2(7!xwPp8B8xvvu9zjde>ue#USQ3vM+1mD7V?S)KI4560(tJUrU(wQD7=h6KpjJrGv%2$4)= zP@y@1kgcLgoyae+5KLC=%G~Jn3b9Zi6wFNx+#Z{po}484A`png!s$D=N0rM#J_l>5 zT&`HIw>R%S`1Du5cyhekZ6T;LvF!s!$Tu;}jQ7br1k5N!H<~a%S(b5KaO@$zPoj$a z6-*ft|4ssdSo!<2W8%+No7D(s*tq0DJq2$BEHM^~rz@S~6FTcSgitrdd%^DpKjgwG zKmkqy!wM;Ha*ch43ZGS^iCiwz|Dka3K-nRMxXVCLEEvG-5w+{p;R!ZP1 zdVBXypS=F=+vg7sx3)Jq!sZhJH(6H8f`cP0&w^2@kp8)feNMnK$nCEm%QN!CG2!bc z=*^TQYSn1f{9c|x8^dlQM=aXF#)t_(tcgd~BH7;h*~^1Okbqx&SbRHF+3Pp;rCev~+A>cuH!7lT>URy!`H$Uv9akKls@M6eN1q6k-aOO;Vjw zK0omB<>8s}+n0Vmxs=S7Ys{`B#)$2E;qXYwQpXk~iQ)adl& zES@Lj^!Th&DHxluASpDFK3AOS-m~BT;wcfWxvRHDYn$Cnwu9el|Gej0j(Y~Lie>Za z`C$!h8mb(Q|CA2xp+pQ1{%*nIWb;la^vT%mSm zI)%-bPrBvi`n`kw@BZ+7|JC!x&QUQ+lyLs$gqDN5OCiwD4?|L(|LDTi3m5wT=Yl=P z0lpqzYwWcXPNl>eSZ1-a8gz@%1&L*K^Q+g*oO{WwU&;DZbK%2kv|d=Y`r`TZ^7flY z_g-ysXJDJ*YEzqp70bohWuHYs=>88$;}z=-j5&MyuDVE#0{}F*UOg3)t+* ztZB|-9aXt(zG}Nw4>AAt8g=4XTBhx8t~ixKp}BkV^y~Ajjg3}4vl?Z@CR4_e#I;ll zL4VP2Oxh;(dXvo@zyG3JVvJ#hzbX|<=OiPS6c+lZjf=%1P&ID&eZf3i&f+NLl$Sxj zU(s5nGQGusWL;{6{9DcPy`!hU|LxN!56Uj!!MZ_#)wBR*4zZ=b39oY1sx=MM!r{@W zX|W~RC{^o3@s=!V@z@=;Qq8DEGNX3LjU43@cwoAve7?B@ra2l~)*JWv#@*SUwf= zg;K4fQfmK@n?ABQiz0yV?h52BI}Tb!qm9p(vP>P#W(jrk%m2b?T#U}deC%a$umAc79< z)Rns;jmhF&i$;sR7f*Xsa4mx&57?GTAxU=v1-^4x0J{i@~H#} z2738|iyFPtAeqNGY6&+>q*&RTy^A_DGA>&9-kCqfR`C~A=KQcq?r!G{OaM(o#N3lnK% z7Ye1)wUZ~kT#TIkGTC66d|`SHb_2H0Y&gK|m{C!szI#vv!xoQXh|=lkp^_<NI2@VDeer; z%qwhoEHN9!*EhTCrKC?OgoR|sUPDLTUat@jddw=x&~35N#2)2gV}m^6Gc%V7tgRJy zPCMCjz-*6lZNsDvw{4}m&*U>jmdbBZ%7(_2Y9k{hZh(at+RiErMf~1jp9%3eomWk& z^o~%J64e|Cto@w~OzAL=Za7U-;|ptxHjgpUi8APj+Ego01bv_nQ;F43t`f#+nJT1K zsV149xFvGLkYVl4NH&vBCDXo(eA*f7BD>p6L`*}5| z(_d)eM2B_2G0^LCS_A?eJNAkn&8*q&Hj5n4OT~62j_uh)>#1x?Mc|Rp8Z4evGtcxO z9$tb5#rc%$wJ+H!6LrTAWf6_>yc?E+geI}%h5~>Otp;}@zpQ-}oh^ID82tIN)?H(Jd3oogZWoJcq>5UIvL9u|y^UU>HwRX7?Io#oL) z^JF8FZns-GzRR>}DVpZocJCLz`t`TpeEIT|2hDhQ7k3Mh;z}?|Ffk>iZh`*Aw>#XYeiHkq^%m47!%{xPL!Wo4>9$4}&n6%=7L4}27 zO>0{U?i`mg)mnRJdwso2N;aHqt#6-yzTIG!_?zE-`|E%F=YRXdfB*fH^TR!;C6QHw z++;&s;=-XJ_05n}G(UFjuYUN>-~RZ*N7ruMx;dn@N@j^C2q!PUe|u8311<=|1}UWUE&$p<<&{y3Gdl?3EAhjLvd?lW5gg4wnKJxl%ASbmP+B{JVeu*MIZ= zg^zB|aoYDR+q`a@RL40L9!08f{Q1-K)5Eh@pFDs5$@%eqJJ;^^UVgE+@yVB;ef{m5 zufF~LAAb9XKmGQ6zt_QvN}Yr=u!4q``8Z+lkT)`0#3m)mDQtt}q z+MC;l_f8+Y`qeKU9c)+gFxV6VI^mXFFjnJabK;qZ)xde&MQeu6o{Tu~v@js!vM&`3 z{B**ooVj&pMrsCg4W6{tX2x;c$;A61Wzdw3G`Uu+^iHE z7=DCoC0^=~>oqSYsClY!weEG>X>Vog-qYug?mzwdQ_T3s&mYyA+v{Bnsl`mDdemp} z)z*9MO3>_Jve&1_`U1&})25iv#X=UHQb1M0g&+O&XCM644{zKW5{%s%8k#hOy=IF_ z%?qiJ3Wq;<>-zP(LVM8e@&poSy9tN8!0ody!&Y1S#}6Jp`QqD8&K})6I^C<6JM;pt zg^aUGXMYHtE|N+rZFM3j3!Kk2!#{lQ_KlHQfyT3p-3rL5!o~sv-_z&kiLMt58Mvs7 zvID@(&35y&GU7M*Ql-vjcXOR<;>$0e9Cgx(WI7sf$Y&J>ssk77&einZ$@V6^p@>O` zwF~Wietv##UZN)W$<^H`(FC2SzZxway#tqL}MwI^F?!; z4~S@P>>hT4ew--yQsB`QDglky94R{pM7kGbV>fP$PLGcM?8jH{%*%BUU#+h4PP57w z9+;ZPtC2Bz4MIj7u^w<79IFi z7ED%8W3#|eBiSQvU;F6NrK{5p7w(x*Y(WM|FP_MkilwcM z6w?>bqA{do3_mV7Dx_Q&89-N?<#u;-clYqon@2nQ>t!6=cHPjBN^c~bYjGwkOsj(6 zYkd;AjdZY7G&4y(#k?*MBw1zWT5Hi8bwmj?I*V>-0PWES%Pn3#|Mc|mVDI4Yv>UCh zqdlbKYq{gEUp{&H@)IhGik040ufyw=UR{Yc>k+?kN@@=;Q;{<#oVs=UqaVC?ooL4J zq(UX16Kj?-32bQu6!a1@DAH-8VP2t9uoL(gXgXKxZEii}SvNNuTaB%IufDo}zT0cJ zh`+C;Jvyl_NWh!ZM!rI{vRb}(j4m3*CNeWHG&eCl#yew>nG7!1f=RCDm<3fAXxmEI zzgEE!4`gqVK^>!&1*Hq}Uo2Gx5w&x4c>3V!cTbN|0kavqTw~E$%z}A^*&B1%NalE4 zCjGofBAA&Sf#5kkiGHS3>-4ysOPxFig#hzE$i4mXAKSG~ZVKd@+nam4XQXAn`~4>` zpYQdWnLwd}xjoCLG#Rz1!r4S)_xagD*R5qz67hwKSrkzuO$jgAhi~7wb#ugEx^s2b zs9y<0t5NY?shVM(efGwbSgn>y7qmkPox>kW*XyKlHcvl)QZMCKlAF=U;X$_At#x*f zcj|>zuBz4b9#hnMx!G>+J=m=E!wq4-Tp$t6-}>pzv7x(C)wsevKcrJhEH<+h$W&Y} zG8#ED+rWZCqmFo7wN8#OAzkOI#yLRV(aw6lTFf(U3Ih&}7P3IJ;$*S2t@Y;7qb`aE z>|suY5x>(iGdd|1355zyq!>=12Cpy(&|CD_Ims3qnAo6gz{^_Y8p=(`V-7Gf3#4(* zF~&l1t2Yb&Wol0-WG}ULw>ul%R%7e_$wrNXE+Gb)LOL^g?d^9yc&`tqlOmW{?EsOC zw!Vvv0iXpFvYodF&KA|cg=T{!VUQF|zEUBUTgg|u?P8)>%(%=UOq%5WY8zXJ+nepi z`hzFi^=$w1xo8b~t$MBO?&YfkcPGc@q}XPeXIb2RF0#$JY*K4fgt%Z;vB9qpN?~Jm znH?+K;Bil3MNMXl@lYZgUvjLbl7&*0%*g)H+1}R9-s!88Ry7Qn344lFrw~k!-?{S6 z-(9$QM<9k!uQuom_C+_|?}W$3e3%PFG>Q%iN~p%N%ayA{SQ7rxS`Zd5{%~l%i)yQT zCB%!Od$O^H@XG9ZJ?is zZp^?j7ji8F!VECches7;Ibv_$90eC^$%^S7j?5ZDQ@h^obvoVc{j*p1Hye2W!x{3@PC)ky(lxVZyu<)A00E(f07LV6UErK?B0v*xK9w$T4A9WDG<1i%B=nIgD!uW;X=XDiR85{729BS_RZy(BPEH z*sNv*ST!Sgz1gfWVPJ$f#RS_=WH6P-hJYQJ*(#@zT&08~225<9=Ehscz0zRj?mjyq zBvQK!9*Tq>i2Dk+i`~cP+pRnwT}HRSIvvXnuI(n3j`OZg%|)1(ixCa&GZ|Luavq#J z!z^T2<_Ou?8t!_JiyxM`w-M`}$%@x^M$)%duxB!dL`*F=Hg-;)9iu!%vEjn1=3TL& z1sJheo6TmOhJ!V-1!G)XaM@Cw%7Gl$gcK>F5~!bY4(N8kxnMWwQ0~+kHGh{)jZ8|_ zX6PfpK$!x-{AI)3Kfl*0v8lxa{Wql#n6nx9$r)+k)YOu^h6QQwV@!A=i9TaRz!qLC zS6a1lj$)=hved#=gx5*UPjAx8W~W6eJ!%D^IGDY}wCe5c)5oXXMxM_JRYy?l`kD{q zVZJMl6j}}0cH|lYf2(i{>;1bS-3LVB%FRZNoE&Ee1}mI;OJ!~p6Zu@F)+RZ*yUwz}Z$_K<5VYbQWI#{h52!jLgKQSCrKOcfI#+IVai`!n#`@A; zZ*@9k14$5LhG0yu>FeNF2!s>Bqv0&u*fS%mVCf6|B)g}l+l_LTADkSzcM0v1$vZy< zJr8!9#(>VRHdn0aXPZ95&6^SHb6y`aJ0sKawUx}4+XU~u88~YDG`{rN% z=b!%JcVB<@=JS_lXV31HGMH|1g>0qDPEzX>{JC}vEUIDP;`rT*S4ZU2AHVZ|{N;t~ zqw}%_pG_qb&CgB^58Q#jF?ILiB?H~FlxA#LF0G~mRu{TR<@lR#K7Ic3 ze)s$jzd1d4`Sn+zS$2;fJb3);KYV(Aw7=2n_BzdW!J^!-|MP$R%OCvxdmmjHRw`$v1`#JUL`@y50jVP&&sK}Y_C}{%tR$S_N~^nb zu-n^y@chNImtX$s^QWIYJ%9ROvqFkEv*r+MaNYMg)v zZW9thl(DLSJmaL$?k6-ADuWG$g>Eg+vPx|Aa?>laWNdLA+&_5q#p9h;F`I-whZS~7 zFPDxC%nE0xg+if3t{`eF7LJb3O^l5WkB&`@4v){GWd}B`eEH>8k^-*vqE`OWvg`tHlGzW(L^{(t}5AAa-Y%g3jCy>7FH6V9U)G80e` zIB5fBx~M%a^VX+#a|yaQ)(i_dmFB@%Eh?1Eb{FaZn76PtFLW zY9oP0nQ?_Yd9~D~!R74ntIxmu^}qhpx8HyB=_ltW$EOcZ4)^!>nt_#6-&~r`lnSWL zaY`Y$ozWBEs+>JW`V`Z_${Q6 zu?&-NM|1|+gpCz@OSZPrX*Q`Hgh7|%SFy9%f~*KSJrZTpr3Yit~FVtxyV~%!NO3o>NcpUA0)=y z-{t5{LwaNdhjhxGf-(SI3U5yTCnvc?*8m6{xmf;ZmlI2%ZhlBW8ysf$zGn%-RH?qc z_w;_Jp2z1ynx+psCb~pro}37NAH|4)3fvmFE7tuoU~Al748*g^XbhhffJPizSk4?K zm6T77M50hC)r#>u^xnXmn#glTpY&KWS7qAWg%FfE~qi;nrH9jp-_4f?hBIkrYUo6g0m9M;(?7Q88Y(+VPhC_Up1-?f-P{blQ zdtul%$S~z{lCHJ8>)da9T_W8tU-Q001W(4Iq@vNlDS#lhJ;%ra=Yg8@f<|w_Q4jC7 z-;D-NlZRm0VPOl_^KVh(YzE9`QmI%d6iYB>jtvUbMhD3t-pYJm+3#*0JbQh*v(c#4 z*_;u6uwX&1=Y`;7Kn@2?0X=%y^U6fN`PFKHN8#Np0A24t1US7Y#aOaoolt>z5Q;>i z+1uAJwHWbE;2%TpKt#?}cMobgkgt8ZHWn(5Uud`df>Ws0kR1c8MszwBXUtHkH=6AR z?|!Q9KH#-m#g@reS%o`i;b@`l+vpUc;ei>M+VbaCKcL=t19Ro(!4Ws8{&^d1yH9!J z& zQ6^D1$ouGbbKi5IkjtdVH?zYxh6UKV7nY#FzkX{-tky3E>z(x-xT5zCj!M!A!Oc+s zcn+mvZhYFHbAUUnmQsoR)`Ci{_U1d!8l`$9+&tO+>KBh+9j7V#m~zsdv>0h0eg5q} z`N2hl=;OiBpI*6fc~D|l_Q&^L9;92x-SR;z)y`+#9<%W7u)s^x?YPWU-SN4r%Yv!* z=R7u_Zhm}zc5pG_i=ON^iZrK$v%$rsU}5X&n>U~T{@1T|@-aP%n7_LFphWkwXwIk@ zp7M9w_$gF5j871nINL7lSIrvTS;4))J_+Qqh)Eph@84Bmf$VWV<`}s@dL7 zzIEKV|I5d(pCo}>Jd;``6`cGvNLu6omyTDaG8^=zqm@WpSQZl0X% zRFnGAS*b`SP|=7}ZQ#FlD6ZX}nvu+l)r+dhsp~@)zty?EoiD_-!x!GWJ~bm&o4lpE z-)Y38qg)I@V%j|W{H%l@+N;;q&W;~FJlJ24>y1Q>GV2c>KmU54upMxJr^!WEW{k=Z z5*J3hO|4pt`weE*%%vax?E0-4lC;IR3mJdnHr4jNXgN{b2`z^W;%J$X_eL$bq+MQ% zX6xo@t2jP0Xc(jU$su zCkF1qEm~9wB^r%0<#eyEu9&9BjfPQ~k?vgSq@Il!iJAX8RZem;+urN8Y9V{13DzQ6 zPTMSWn}@Ahe2L1k)k2)}da1E@|LEwjKUU}h;z*iQHfrAD@!Zby zll59YZl70MO?Dr2pcTj5jdAgeKqS>!JoNEM$3~d%ulgO)M#f11+F`?yJvw2w!%9ko zYzg}H3Tx3ER%GL>;?I2ugmWG||IP0ydah;TZoQ{^_~}zphzs-cW>2Vb_OKdU9J)R| zJ~k$@-~?G+Pz$Fo{^Tk?6a*MV24N`A%|8seWkF|BjSbFete0 zrT6fwH)ngbpeLPAmpZMj!^6kN(Fjqm>Uv`x14~3VGcqNW2?hoxhX%)V+UdF3S#g}=cEcaufAP=1 zIe)ZW%6KiSrAi|kW>JE?8;c-&F>jO14S)Q>wc%;5*ak4|F4Hdp&E@2Xee-g-Y{uD->7_Cs$Pxodu4NBW%(eH8M3agS#EgDd1e~ zb<^abx!W&^6;=laBadsfUBvB64X(rLO{NNs(^m)UT`d(~JF9?@NxU9VK@wiBC_vvK@tx7re{zrEug!XMqX34;i!r8uL~E)RfVm!mZ!lZX{!| zrTj^==+}q0x3WndtVpHXWl>(=Jb3x-ll>MmsWq=mZtlCxRVePJc@4fvPBgsxlUJ~3 z&rXcZs401$WA>^tKq3ItRP5DaklJg(#f=xI_jmKPy}fpg6Vm>(-~Qw4r;iXxH*#x* zS~^?XJ^}hk4FUkd1n_>dOgwyfaQMb8RJQBGq8mT>%fI{4M<+2Z`j?dx~$+!?%k(IDc-4S|?`cTc`~bN=M%i_gxh zjZeOK{Pf|y@!@vHkixLyyk)?=-;m{&SQvP(0(v>YU)Y>|E@#eSx z_aB}=efZ$Km+PE7IDPo&liz)L(2Zk5&F-G>0!Uv{+5r5zm)R*=aTjvI)U7#*(q=b$ z8>JAv9a@uxVUvnX(D=s$T7oI#5<>=NkZT+>Prv*A(^t>V zAJ!4Eiq%T@+2f5ORD(s8d?iLp$!e@o4%2Sb&u`LMq#2!+E4T(xLlh|N;OM0d)a9_s zr1V<5!(~6c?yALdw@_U#2Mr|N`fW)eFc7Igz^;+pxF%FHxVQQ$g;lQ^X>fWJ*-pZk zS_2A|CF`ODMZ-7i>Ebx=F+@*AU4p%Y`sd$c&+UW4dfBWtS7e?ma{=Y7K zbY(&{Kd+;5!lW3U;g-!r)K|(88Q{i zD>+A}O@U6ES2r03^R*-uLEOgLUS_uY=(7ih`)xq*TgY#f+_Ekd1884vS1J*;F_yHe zX-Et%G3{JRM{GvZ{MDP|Bh%tJRfJiE)oO*32hRg@u39C!GX*?4LG%t*#r@Zhj&}F& z?P8=aFIxZskf7lj6HlF-HEJ*FSFis32mj?~HwW(yO^C%p^{?PKiSo>Kvq<_re#oj@gjuski zr*6+kcnp+iBUZ|Jn4c^y(tRYH7YVh96K-duns!2$%)~19Hv8e!!it{(60==`C7pJA zbMO4y*AJjNme#DZ0yVQ*NI&-ZE8`-LKvr)*2Sg6hAQleZn3v5objZM+=qN$S`FWXf(LAklF~g8g zT)I3xJT$BJ+EK11XQpQqCf$@^$v7i-hnM+Sn%q(EvX|1BZr*FKhLY4i(4xk41<*{c zbNKwtvj+$3Ez->S2v=FR#pPWDs!r53yS?GA91>Ikfifk&b9sDBESQ`a(^v@WQPgIP zijGn0~`8#4-nNWHiOhCNk_r82c0xL@$jk_qZj0J|50Va6dAm(kH!RVA8Er5+d`!h^#Q4Cm%UK2Onj;(YHKR>jR(6Ru!`%r-&z0zyHEpjgceEKMR2Fa>-V>7 zIWp9qJZi9nq36&C|LN_4>tkYtLL{1-Vwcos|(|AVk+%=J)UT`BK61XkyP)f%k;li$Yui|EkatU!$~bH zJlK4tx!vKav~$>kp6>Qy(C4@}efPpoF9W2W<#Q@G;aZ_|&F?f!kKDaAED)gew+;lzPDrC^ZSRueSB zkI!~+t-Q5+`tqAMFV42>-M#IdJ=)81YxKA95v*+PbldeJzE`@F{Lo(fm=7@a-@JD5 z(zT!e@UK3&^wH%Z!HfVFbU)p!HM;#K>Ey6rYHVO=hQpJ$?M}$;&TZKRi2ou(i3_Vhmo$t@YCFY!e=7@r4&w2jgzmL93Nvxk?ARJ;h5sGnUP~K_J(6QlBGxI&tHA@ z=9}-o{l%L%Z%A5y^~I+zo<2O??dObXy9jyBN~r>m4s9x^?62lHhXBs{%xNnq1f=!`(ltb|B-1z9-Th}k5#e96}>g5}Q!$V_3qlC)u za+U#uZE--+M-krGKRkK-;?aF{pQD3=z0LMU14X((pqyY92($$|G1nY~F%)LXx>EcR z>0+Y@kBLJ!gGanajQ{#UDK$t0(4!=O8FMq@cZ1p?_Rdh7@khF}&RWZH49;Z|g}dJ= zvTR30pBKzbO+r0j0L@4>LuwommAP_zeeYFKVuqKm-yR$s<^7%IVVD(2 zlpJ~Wl4(pecZTndOia(r&oQG=Xv|BVC}U^hTYr|#H#WBR4)>2Ao;`W}$&1gv{Pw$V zfB9ek`>#Ix-u6bd41^8u!=jBI6EX=H zoe9zr>*GbC2bWb2Gd`WVA(wU8Zba)*>vbBXO07`zshN{=3Z2eqN5mzdovji?+dtmx z;U}&lHS~L9aaUj%?Uz;dt4T9i=mfNbFqF1il!94aCyAQkoglJ%`}E}K@NlPH!~V#- z+^>q&k?@xG6%^<>cq(`XvHJo#M61}lx4+pvIKt4fy}?)tBm^M`UKXlR40xDjN(~uP zVAF$x!{gH;ZGTX%q`Wjlv0j=ef=S!QU--N>trB{VRIU`ws$C%$I7FL9tMsQfH@P7m z?Cu?H70d1Y-3nWAZVfCCWB*j8akSmeQZQD>;8csz`D(S&kWy;z?QB-l`KZgb5J<*6 zOJ@{?KD*c4rk$)kf+gLh;1^wX~&R=AfI>W7`c)@dbXTkAbOtCd&5 zZrV);tHE7|Vs*vW*@EHa(BAyfUBks6-@0^XdIZ(=&X{DWbx?&is~Wko>@qAHMrLHf zv7cO%nwMjzUz{Ip9Xxo#p=B#l=x)9FH0E#Y-2396Ue-@voY)QL8%<=`^U8T+OzffnG7O7P484^LKvupWnYULNwQ; z@lxL$bo+~xDUw4Rx-vRTahD$2bcm^|H9)INO8Y%_!N4aaw%?QV3u=6bn& zaDKRRycTQ}Yp3xA3LE!7*;yMJ}%?xU` zzx~sjXZH`*0h5=X|KU+*O}Cs_tCoU+{Qj$xfK(Uhw%7VmU+eha{ov~DyMj59NV!yL zhCMzv^*?s4=Gr@hLI4{EcDKy^y*fVSG`EjzKseD~CINqhquJvZd)+SCABEACzqggL zPwJu4_$`ji{Wp)wHe>Rn4?QL+?iv3Ozl{NM+hVYLKNm~-DH#Gu{_$G_69CBP<`t$G z4UQQsj8S(mrXQYDY8h2{R@2q(&%b?0#Bsar)d#C5rz-Q zyr7uAa+`8fy?$Y}`JfR_R`Ep^Vt&PtMmjnJIZ0)&_ELS=2f_6<*W|dK;zHm#)K%7> zo$Yox#iKDtd>+H#bv5h|ooOYR>pXvxvQ^I>Zx^UPP6TcG*-Muu1Y+^L!Iimx;16S` zXcm%5zff!xO-|1Uv`h7)3YI4J_DnXW<`EcjyCVtr%l^G`Rry*dO_&w}d4dpF0Y z83E`QJD;?J+O)-kcVfKNKiG+0U12S!!DQ zS~NgF<;|ZmMJ5KlLiD-1`TF(x)-KP>TFhm-^Y+Nxlvpm+xVn#fm29%q;(<&REVrlU z$EHR{=AG>l5_EGBNtJ;rw{L>24_&OD1S;=b%l(+_fm4GNA9%bxQI(UEGDk znkGM*pvpsb>E?`hPP|ln^2hJH$$Ti3bm%Ryt<8|zh$Y6LGOPqFR_TmEJ$mcix8{~` zmQ^-RzW&`m{o|{QT)YI>4=8MuNmebdpP@iTClr9pnYle`h~~?MihE{?%kaRE9F}-; zHQzh`^wB}c9Eg;*cJCjAi#{<+XLx1MkYBIGv2Q$zC>jnSc-*SV-_sI&_njU(c98f4mqcsUdBS~QM$wG!}z zsa)rrslEN93nJTUG46A5CKlTxrF)MbKd9y5n$+u&Xl>*8*{^^5=F2CW^|(WP>u2L? z9p^Wt278~8>f_o*Ip|x~5B$YnTpbwKX=kQpHEvqSOHA`>h#&M~Epk>>>fF_b2l+^t zB3VYTtu+EB_LXpj5#QdEvj->J<#eT6q`BOYtQH)UhVbyn<`s^3rnymCT?M|&_+rb~@>s~CfO zyBsZ5xg;`vWK+-n}Mnt5q5uY6Zp*Zi7&cpBjpiXUVpd$U%el#7lTY-SfAGXC?4k=0#$& z8+Jx8)vAUte-esP$kgVgaPP@6tf)Tpc|8{`7W(YbUXK;6ym7$68uAk3G?ZB?t_7n? zT0AL4ASb@E*6rqtnA_8K#q_0{G?GaK3I~T995?Lf{a(W4lDc0>D3Vf;vIYk=36`AB z>(%Iz%AYGh2aB*i1-RCdNCPHS-e~9S^xzWNOY*V>L+N6izQ_KLn+z<9rhwE9UZY@1 zyogEIykIu0P&~C_nje=NOiNCR6r=5fZgaiN9IMsYF09ZLhbKFSykDyHwoysJ3pFaK z;A#v~woNG%&IvVUXQo|DXJW}pI=UdRT-R$zwIR%d>SHWN?yUs|X zx6z0>q*t#D-nvCVK_X%Nucl;({U99nS?q4>Qli~}A3kelVf81s?%@q=Z}07v(;Rv- zK0Wpf|5~O>i|fJT6NZjB6WFi(OX}G>qXHpQ3jCY|}rL#8e@GuTV5!JCO+jX~liz z%JdM&K=KsZsG$8A8o_C$anXW@!n)GOaRKk;-bP)y+hI|Psj)TORpNo4iU}YJ@ zS4ZaGy`+}wU4FPL6atXcX*Ju&FAnj?Rxtf|jLZahgy``#NeN~JJf29nwcX)o@|slC zlJ-MycHf%Uy&zQg4ScMJ@fZ!>e7|}H4#rg%sU$Cb7xM;2U&~g?`oa}B8@_NL1H3v3 zsLKl@#$yP;t#0?-rQ0X_`@0>=S(AZqKE7mdM6vgc-@(ePp?FCo!(`(PIVrU7v)Pmy z3;GvBq-kBh2Pu_q?>8$Y?sPQkWhkqq7`pG1PkPh!ggdYj$iN;7#1iz`_(ws7>&N^3^zAKfZbRp2B(I{H%~{ zU8)Jl*U#R?8kfQZ0KW40XRR*+!8I`=E$Bv@C!Ylhw@! z0fxDS+~=YTo;XY!mV>phODx2xO3gNGg|+6vR@@UwlLG0qqP_)(1(_mDbvO% zn``tyh!!#~72{tA!?9qTw+QAYuYr0}W7b;9ZF!TMol*lfG;6@Jd47x{G$LtEpKmph zPT^SQ$0@F#?jbCsQ!J4@=SJzYfc%qfAsmcsHW?rgBjLagsW_NH?k)9^pgyxmjIoLj zBQz%JE;kD{_cek`zVI>TF%$!8U6t zv9c`CRYbQTM4LYBu?jr3$nBDUpl>r9#b&T#6HQ4J1UmRrc;qOejxc3)$R?y(IDgd6 z_yQ!hgOMO((8A_+Ih&>95_fUPvjmb&GN#09O^zaz?v#k#t$2)blbv8Gz-eAddPPV= zvA))`ZmpH*Ooj^qr7+91x}z?brSq6BuxrEd0^i4Br_AiTPI@Yu0Y?v3Z8d~G+?Rvt zP=mGCkgaIE@wQ$Izlb9A@fs~25F%%}_<)M63F4V}yI z5apxAhpKeA4H6X|CX)!}>o6j8)?kJwq>o+mS%hOsqiGpVeP-jJRxHCQbJN)E=|Au* zflvS%3mn00uM%0cYlu1K3(+9W>7WYbqLEQvNH{ERPD07d`YyBI6b|Mnm_oBi>sa&= zEuxEz?TQeVO~+U&-CEB_LrjnZHd@bZ_#A}(ngC;uIq=z7IX*@A>eaNOLAcN2~N?mT`rYkK7Stt z3YRRK0@y|&pIKoGN0%YNC}oJ{3pUl5P|Md?cK2Unbi-PuSZj1oPCBLjjDsUXIK1Mp zGJi0LW>glo0}yaf+})fm`T-R-lh|4;+stqlSk(42Wh_}M@fykFAm*|NLvXzDv%`Ia zk(q)`Uhyyl)zZ${KEbhEfhZsEa-YdY1k)-~EC;f{Gl=IJwR|lnA`vY^YXu&UNH$Dv zeL1=k&$~o2yTcwi{_Ma0@qR88F`Lz+10$2uTAM;_b}<)c2Mh*GreM$_mn-yMsBhJi zU;N9z{L8bj;N$BA079UsD2ZV!(UT+Q6E;e^^}^r1drKdw?3ScNcvLP=xVYQhef{Q7 z|Lafx_Rml9q>y?K&d=&@O76*A2a7xR+8H{1i*$-b*Y|t$-c=*65c6p+RUQIa#VrVHO{-}b>Cj;^JMxma=v=@w}BPOM@ z+-Wt*uPxxZ^&=9Y2m*-OZgro0{>1}8#X&!JULW4+C;$DQzI$(T05!2>o&_A1{O#(_7o?&0_Pg77Az;Ub{#?J84_AtIbr_L|tw= z?^o0uNJMw<&grNUv1?Zn?IKSuH*qZ)V`}@{41NfC2E4@rR2XMs)vA|iywOZ|qewlr zR!3&JRHmDc@=p^k@Q^EYTrY0c{0>Xr4%h@zSJ(#f#R z>kX6}tg8@&^Pv^E1R3`NULQSdy-=~34%+~7(%WjVgb-wxLza+VwW1eC!?IvAS6g4t zyWLrW9*J@zl`n>K-5d)-q60m!{Qt4{rcrWS=anElGu_A2;~vj(%W7-0Hd7MKMI=RW zCq)v(LhL{lQ2Uxyx$lt~`@UsHM(&xFnYHgIQ~`yZ00EL932x$|h1w{|k}S)TEL*m9 zj@v!5JRaBFmmp=Ud(NEGe|mn*B#Erd$cPv3y@+`4ecyM#d&`yeGYvd;`I#BFI+J${ z=-9`)y}*Fl6_s|V(e%i%L^6=6CBcz|h~&V*{a&E4{18CYO+RH}3X0>g3m-k&+tbxC z$ZNr*tBUzFYyj_3Yv$>=AQ%~V!;}hC)8HLVM(FYGbaYQY+jRh-bqTEIBfB1W ze9vLf6$Rodj2Mb1H?4mlEFv8|F_v`HC<0Mt4WfBgeM*p8GF@m)E}wn=#jEp^Ym>CS zT$F1Fz)yfYWp%*{#jOIKUr;n;UF4o(`CQa_g^T7iKkI$6Z?tn*P9;k!U!tOAIh+oM zc!P$}1|bOO8%D}=EEt#KH1QmYIBoI-VW zaiUnCnXi|T7d)}PP@b6w`#}uMPKrI$Gd>hBU1A?VFfx)dvP=lcHsK+!5b=nHVnq%@ zBHq*AITW+X5XfQ0j1meWB?o$9)oOloLxa9^ezq`iVHVgBF~77jyLS2MD`#>H0x}$f zYi(5)&aO^QHmeiGh#wj_O}0B39ndF*q@9E5FgnEcA0CER8XO96CJ2!|j~?vo17SUI z3ziH!HZ?v5LIGfwRoDf@}#6s?^mAK$LRY zF7u^UsB3gAnLe<~Pcu?R(_Ch>CqRq&nPz=za(Y6JN-{|Mz$T!oFs)YSu*$M+2K-P$ zIWa`1JtN_iTFXk!`C_%44nYYgHDXRzHjd}=hHq$~4;-?{^>(4&RbqK)I$)KCaBwut zU_OF1W=K;t6^c}571Zk*mD^aEBuYoQ2q3W(Mf53kp#Km7>Fo4}BT~5tm9dfjV*yFj zOgo=AFc<&;7m|(0nio>Mn&{}j!XP#rNHZ=RG}DWV^OFTOB-9pbOK0;2xcrYly;`1K z%27;VX&U$!OGssMT4O%x<3JV(u5`MxI@@Si5>`%u;i18BtaF$d>I|f5fIJGVLab*D zbAS?33slECl#h{ij9eJk3X6N7?%+zNV zH!nW3IXyQwUD0wy3y9_dFw_gpY8F6gee1_3_cZfv%32BSYc< zs{yFJ4;?yyypX|>(TH4FUz@_v)2hi#xoGA@$a+C6M%V31qq%XpQG4qA;^JIBvvTI- z>2q@>I~;)54w1^r%IfM;9T|bhP?sTsN{Ive2Ee~0(*a;`YOIfkPIM6rgQ8hBQqfS{ zdz6rE4g+KZ83QX@Z3$l3m_VLbA{?lJ;eH`YD+SYSz0c9H+YW^>-ho!u!Wz4wQui9rQEF01~nj5)hzVD(dYYkHJm@+D*}`$EPxu5S6En zgS6AoBLj>TX0SqCU3NvI0@!%933b>DCubMH_eXm%mqFx4F!b!~RF2Tbx3MIn2kyHc ze6GlsjHLj#52bQhS@s|CCTTkZ$^xWAL_5a_s=~??7f!EC0U>^Txzt*7)MhS?WGcj{ z>T8>e^UEhT79FEphGkTqU(;w!wk9Sx7Nm$EmMOZDnue~r5c3Xs$G2}s$i_3`1rDIu zgssLTq(B$IXN>3{h5i9@a05dj@YM3K+?<9!o)pY^`23J2D}_^qOo**bHKwO?cCoxT z3v!BbYxUgmMiV3+1=g1WXAab>H7u@^Gyti!ddW;EX|#3i4e9!L+s-Gg=^(tGj1RsyPx9H_gG2;0cInM#@vbDc`X{2I0*T9lEtC| zy-6~|0XevTchBL2o!vf0b*5a;xR^GC{vcAAz;asx!3Po%`VI^Lfa48-@eH}8P5A0S zzENd^5Y*I0`h@z)Vv}$$w-1W^FFuvtkUm8Xq@K61*379;~-ZbFhI|Peba#(n13W+6iDUF-waph-kwGRU>h2WH)FCd|(pJ zThIy`V)MQZUmTVW?=(!P_0j2JOv*54;WB`9)JzQ)9yCC(?w3-jL{E2w&Ms6%v&d%W z?KHdtP+U57^(0msy2%6u_{iKs4j~|{_TW`5X6d1^C=g`h$VpF21%pBUb7WZ6x(1?g zvC`03Chqlv&ttGVoMs`&tGMuqwE$?X)Q}05C3IxP!s;@{049MU6fW8JZ1Y96-D@+ibg zk_>Kq1bXHG&6Q~tBrCBfmx=YKxR^NA${??@=q7Ch_pz{okG`PGlD{7-TBwS^9JD58 zbATO0LlE&axrEWG60s764yR-N17jXyROhBA3xHtgj37mad&emx_#nVknOn%`Dh3RF zl%1)xU<3OGqo8OiLzB)dCo6xD0E~3ARh`uif{|SSp_g!*#dVMR#_mS*P#Ug zjG75`2Z*Y|3y+s*0-*ft((qFeK9(?k&Qfp3foM z->|YSn1T=v1A`lwYM_sjg@@V!^F2s_0ZN6h3^F5#yh44+2IL+dF?1}A7Q!V2ryTeT zA%}xBcvHn@IFP_O0M-B~=Mc^Vc%3W*{NBjehtmc=8!|c|c7Xs2%Emj&h6o`X37{~5 z_l0msz(XgCNRdwiZHaTKH~?i}F{+XJV#SShKC;+RQ}nS39SQI=!D9r+1kjE$g2JGa zC(@nB76M5tajoEd&}_z19l$>cMD(x_K=lN)B)T11NcasqAfX##r*QcYawT}dR2iWL zBF~}{nl_}<;~PFBmI?oS+tpHwb@*)=Op=-jj(6?8~IAkM7oDG9ol_R8pJJxONzbP zKa)CRC+tDq-mM<#a&$jB3j0A%lQ?Ecx1tx&9P|#ppj_-vYK!xd)1hMRtI#f`{R7@e zbx|%Vg<{%uB)gLD?e>t9kPbl`$e$Z^B1g1K#GW_yBfquJh%Ucztxyp>NTe+EL;D?4 zU+tQZQf^#l(hBU41Mq6su3anKGFWh-$o7wTNXXepZ?=oO@rC?M+Dm>Tf7?HiV#vpK z)yetE>%BeStsiM?yNGv7Z0}Flv`CxUKmAK_q&G>Y;B{jMax(G-Z#Oo#e|xuN6wxk( zJQnXBccWWK7q#m_zW!H7-Z(8O@!c1Sd#@es;z_OA|8ATN?>EkWV=q!Ma^82p{l<~x zfEycb{MxPusT=OfUl;cOfB1i;2exhd_+M@NE&TUywr$(Cu!+o{TG&C|YJZWg@xJ(y5dN7avX{=W9Ba*rAY6a71WP(||zG z2uU+?xg@KunTVTk1mp_o7@}VRz9{&lrW;Kcv%yfYM#r+nq~D$^Ag<~=;)4dOTa)}r zTmdx?;$(p2zzAw18wD(*xP(w_$DI!yUMz4q$cyOdG;UlS&@b9*)Q#kLUvE$?s0b$en@LL41wsuKomMOk!Pd7e=rT5s!+Xfap~w!Bz%L*t4~#d9q+ zCTS5*Qe^?QQ=(~0OLC?Vrpq%mNsh1?OgpDGvNw>Q)Ki+B zj-_NhXd`rOp{WLkVuU2Gf}><8a^f%F5qJ0Ozv;ebw=Ry&)ZT+!=L}~=db?#d9g7w zw%<5i?mHR-(rNDHOGc0l-~Tyoy^<_GRUeMJd|#wkupFX#s{8v7-g?LS)~|9$`M!_e zw77NtA?~H{O}>Bp%47FV+qXUP);}x^mzVbZ;f{HsbM{Z4iv|kJ?!MLnFEq-0W=cMM z->naAZvE=S&Rah5(R-Kv=9{I#osW$cmQI~E@BjG0!rE&;etORbK7D9({%2o~cO*jx zg_o}-cXsvfA8*tS_y1_?{LLNnd;e(9KW&ZP{{8RY{lSy}-1#4Bza0Ab+SY}=)r(KO z|H13mif6yKeCUXr$<5DDy%9yKTs}4Qkq^j!(R~rFSD*N(e9Ew{EN#D6k{`ZXeCB(9_1xfX zk3RUZ;9vgd^j+dy*S*VsF8smcrF2K@@80OT`QV}34?p{7i=mXT=jill^=Q}On|@#1 z+Pd1=dB^|y2mIDAsHt!4e&3O;@9l_v-TUu%Zv7u>^{t-Yet+qO(&@jx-gU58W8Aa$ z_Wj|MmplH<7r%Axz{d^-b{#way{XQ~oa>V&sn32c4%qP1XT7&<_j^2xujlT6!YT7} zZ_eNQzK?(Kwkum(3qwc$`1e14Y3l{t>-T+-{`ob3x;pro&X-=Zm~7VvKFLj3$6ucx z^e7ZHy%gOC6|Tg$x4x|(xb4HA8D9OyTlpg$j6`KtoyTq)bgbs}ONsj*7~wOEb4Ks} zVa{1QKiT<#5A%QWy)!G~r$09O)9+49ZuI}by{FErjVp!y!*ffDG(p{RKP{>!pDN21 zwSTzcc)bq2C-u&cn&aNC+aJ$eS%G}S(Xok>6~=eu3rA{Ku5Qk;`$1-(t5mEIBGsh{ z!?SBAef_6rAQHak)}g=s2YqKkc<}C}pUm#+(?<5?zWlVv=>s?Kn_FVt^ZDLD5tPC7 zzR&MTZ~X92C%g6>e)PcX>+9ixD4TYcCsVyhTb7PrUBhHDekeU_^~UEj$3u2m z!Ys^CW)-}0YAP7hp*|117XVVgw;^#!O@)Q5iZzUo#N>&!1B9utjsodHp#=JuRDwcQ ze%6+fNq9NX#{h{!R;yH%0&$+V^N0}!ISZ_nIUxX6Cy<1e_!JWIXd@?r;|nC6j>S{Z zNs7zyfT}}H0dB2)p6Ea+ zS`o`51`Ajx$3*mcQOy>aVBE5JrR?yS)>CO<2)Np8hEcVspDwv9lg)wBS_2%BqO*WI z>t-s%Ae$evctVHrCSnMfQ*`i_61R~Cr!p1>NltNX8Ix)diA+UwU?fUsvP?P$V1iv! z1FUJ%f>XvJkO38Kz-tYiXQ14grUeEILlfaFEMefg;^I*rk{kum7tu?akjwLwJ)y;= z3>8w~3Dxs*Fs_M7!OcmGYGCfhQVx7soZUcd7umikb0W`4uFCNFOf-bVi3|ZVE0MUO z(_E#l(xp-=sG7-CsmevwEW?x=>EX1^M6Ib@g3cNgpU;8#4?>;5L}sC89A>amhPMxp zGEuzDqPeUK_p5-o2Q5@vdR)v3V3PzSB5NVIZbZdqJ(y zF#p4sZNnuE@mZx@&mv~YFqx7G6F_Fvd=_G0iMWBZO5}ePkOnV*z9fZ`HUXE~OhhOZL8~eTLcGXmuIP)o6-CS-QN?N%jU3n}5;&2prU4X{ zaEHotBFUSkoNc&)E@^F^k1A@AUq8tlqiRY}sS0Ch$W5}#6P$d%heWjq+-K(hZCn(-vexk+cSk-0Ax?!LeE^%KKgMl-7wvVoptbAjG@v~eLjB24;no67d_&6)0zhBGW) zoa-B1yP^(=6)vJE!^fCB?}bcJej?9v5C!eCpWE#GsP}8%2;akBtq*IP=3_^uHq(zE zn>cBDq@`lS+AJREpPm@!#PhY$m z{?zuTf0TbL@l5M*`jwfxZ=U;R$x$d6dR#aT|J^5@)=OcZq{Yqb&>;J zoul(_H}Cx8i(5~B{{E}4c096l{)vx7ems5qLofab*S-2Od!Y4N?4$c$n!D}6^;09k z7oPL=o_wo3rs<*ah|iM(rj>`T9uW>grWY{(9m?BZ?fGzc>*t*xFMmJwNAg=^AAaHo zukN_(#1Bh7Q(w&P~X1E;-4h zE{z@S9~fx-@Y+pJ{A^47Snp5fZr$_s=}&y-`aecL5&zZ8M`Eun?izk(>GPk`U!(32 zo;Es{ezx%N!1b5Hhm@kH$H{jebT-UkwvmNTfE$PyGB^!;JJ{EM;@tAUSGP)^+5X*& zcYgMTtG9jZ*{#&?dbhs)z(dcxbojpJxleq0`FhvwwKtT#(?6)*+5h5G`yZ*D3qHVX zD*L&MmBXVm^`Vh$#v90pz2kX(-=4L9ymHqkm$ue#zUSpvANcf{KRf)#*?&5I_mkiH zlm5F3FQp%dZ3_2yoLhSG$dy+;50zfd?T@cnd;I55jvjH2>tkYt?T@?SXfz{_c{2sd zCuc&Po|!M5-FtKF=Wiakwfq-a7UH z`%f!(_Fr7?_N^@p4@{kRy|k+&X)YR8Gigu4vExBOO;duH3 zd#6u!PM#UPt+e&c`~L9ER}X!9{`tq>Kk>KJzxV&=7a!ks?wO&T#pB(#C7yFXyXWF_ zzN05zNj=OyH+i6|wVn=4oDf6h1-75BiTxp4@I*48=!CN*41Al9LJYd_)n_|ync2Gf z;Jv4xKX~`zi~Bz$f7iZs_|^0MJu|DLhn?Axd#P(PI}V(_78b`YkOR7f}_Wi{q&eC_m}9oPO(=ly-(T)b(|^^IF^z5KPV z&out5cF)k2jlGZ8&WwIuekphF*lSmg9Xb9QyHmcL-xoMJH#EAinI6b3vt3L}9gbuq za0Y|UZo-MgEp&^TS7MYUjmXcuIP_`jpWe9llk;B+-ECbMy;XcOf5)*GE_(KYI-}2B zP3+{Z&Fg0=5u_s+eCrM(kSr<5zLG(Q&tw9*DUab?#~RQ0ld3J8o4jsXP3WdS80E?hiLs?FgmN5w4gC z3>gb~%3Ui5;vi-KD%@ zUX5|C9!Zo}C)rVYdM+8n*c}-@kzcH&Qf@QL zs&XQx>0C;NcpljQA;+V}!?GjzBbF^dl^032FdV|1YC-r1$^b~1Qn0GD=<#^2AVguz z$PDlcNY_mV=|Y7KsU~ ztw+1_7bbk+Qi-Cgg}|@?!-vi1fb!H?(a9wJlqm)LSQY7o3UG82B>^ma0Gq*EsZ|OZ zpbmrs0QMge+0x}o+NaK!Bf(5fN@^LFwqXj$rVN=dEdCsh$~22`x`DV2%W@!7CA|p# z+)P;!?Of6)F(tvM+qI&y-yW!?ZVk<=KuZ8R%ONU4Lhkc!L23>_8Vkxb&cQD#l?M{`aB;@~Xp z&Qy8Yoy6V2=_DpV#T78$$zZZW+<`-q986rr1P^LXXJr>jBT5kr%_#t%MDQf?V3G@l zjjD$AH*6@;;8Uta$90E~n@uaiG%8FiTVlLSj`u_$BAA)2(y8*43VB){7PJrnf)FNd zo=sV0DG)WySX9rXl2*e=aFr4plWb(vftIdpG0KFSqH;DS3Wo`cMLm(qxgwH~;6N5} zQ@Zf5S`I`^aX+(wD?rJC&6Qn%XB1@Pv%nF;Y=> zJhF=9mLT(8HeyN3W?55?veh~p(aWHLv>^v%X*8oDXrUuFOCWiJ8H-MU2!R!f6^XH2 zIwIwz5M^gM2nGsVHp?a?8=zTJW5hx(9k*(FgvwgUq@gF`NR|`xbz3qW7%Qd_qmT_r ztCqy-03pF_Qf!lj$%C%R$te*Dr-F`dYf?xnk(=jcBmwEEC{9hK6d6VuD8CE`Ar$xx;6@>V zGmrxm;s3CTdWv;&uwrc{E@d^ELy5c!i%mca5l4gEqyb(}WFCpY!XQ8eQxEYb#2^s% zgBB_h@?q8iJA`l+a>($YkuVp4O^}0ugGPhkDS8vpC{#R$N5skkMuU373`5=<3Fra( zg!mOuLqIJNpbcbB5P?G!5_LdIte`@0Ohsq}l|k)sFVmp4X7jns3Bk@G>+65?32K6AgG29B*hvbL%=f- zvcwLYXn;2cK@kp#m>?tuYzE;oq`(sqUcktJ;UO3f5^#i|9%7zIdjz6~#5~d0KvAI_ zpn-rh0(J_w8BPQ^5_Tu0Yi;ZUYDf~xMIPWKz-w?f;y@&LqmyyJA-D+06Pi!9pjkvy zkAO-DvIhP(fP2s%1mHwMykH9;u~c#zBI0rb_R)@%l9({6jok>Khy-mB`$bhzUo?Qk zXyIK#L=^E(M0?Qy5?)1|mPCvZ(#1Og|FnatK=hz*u@i1=5~C%M5CRAyQD0IPBAaNS zf>_oK6c+&yqb($!OioH_fl-O<*nXkW1PX^5y!Wpighl`in-B^`P4R&ge`6Kf4cGWjRQ$T+nw3|jnwA7 z;@i)~jW6vJzgyIe&*TLE<*U6zyX<#=xv|s#-LC)Tq5m!4w{6?^|A6+`N6;Q$#XdlL z?ECMH_V{mU#{b9mCC?RJZ4lkBn@%>hA(ZcKZtv3G3&ZexU)p=O_xe|d|Hh9u_GrJ~ z!2G@Y@!db|!f^ok`E0_q#t-kk-aGU+w*0Fv|MKzI=OLTkJ@IdznKTFg z$nOLl(H^ZZdf?dtZjm6$V2qOS3&;;L5MccLS1&x(7#hhaO&)1Hu>>XxatIK;K?4et z7U6IK!v_Gk1Rw&xGe%~N>lm*993bN;aH!~C2k`mbT85UEE4HE5KG_%)Nwnr z+(u3ercz84gqH-Z)&ZHtkcCN&^eTpW0?%oGz^U5Xuvy212X$DYQiXX0K6=b)m}Ur` zlOTYT!rZFsPHIELQ7HF-&ANms8JJthg~kJE!S}}#O?$HQs7IVc~1`uAjh7)mk zfdSJfUA)*R7ok4Y8#U_Ft1A<@90;-`<6N60v?#`7NPmV75SUGj+T5wH{c!HU&RxIv zdt-~IzxegdS-2(`X}E9nP%q@(U;f&;nQYI!J3Bk+mF4EbGUSmt-^iZ(j-(0@V?JI_ zcXtksML3c1hcdficFZ|A}JNhbTPQUoZ6f&!6Ch930-Z)qeC#ou+?A-5*kIU0@ zPyOOgwO-%-+ir?v7G8d4_1p=OD}n-H-$UJ^wfgo~E-tG3A3fIDBhNu9vSnDQqkW+J zkdW3nTQtOxM;@Qs`i`2Lx&MFM#bsZ3O=M=39&34S#d`FfvGIjB-n=~1`}srOV~LZe z;0^BTiVBTyZ2d&L=iUeZ!#(xu7cSO=`f5>Koeb@N=+558!rY5*9#>+$BZcDduoOHh zK)q`z(d{{O`%eApKW|;^7#;fkPh{7tOWLF3&px&I>dTpqPyWx3`$`$ z?jHkxe-6(0aCG7OTR#~3z#Vt|_Wnz6zwxrwonLdTIcsd!AAKr$V(rpfFV0lWs4u+d zwnK7uVtq=Y`@b-_{H=fbS?rVdJn;UpmtI*}6ZfPyH|Nin`@V4JEgonkLRtRI32w;0 z`!f$Gnx{AXpa|1ezy1CC_Iq~i7%0z8FPB5c@{dYgIbEI12OSPDM@uka)kw*`PJVPqdlEta(-@X{$f8@zsA-9yF zI(k}HE`9G8wNKr?e}7;(*Pn7ym2bRrwlHwt5ta>cir<%g`nzw}I-czA59>yH?7%_w z;+KE<*U~M!hL4F0$$b!j+WgtKpDGRQi{_+Auzz=F>6P!iY98s~Al4V&``F_n)8F`~ zpYr$hYw6Ow@1gyNkIwzztz|99t!yMlk3PO5Jb&$}%s>zV_fGJM`wu0izWKL{4?kG~ z;V1XR-my{j+N%}MfVgq(q;RyOZ%kWR%M2dk&z^LWz1t5btts%D9(kzz`jY5>`2M(M zENtczw0rKwS?}({DMBI?K)umTnj^CDe{bGD<@MzRzv=j7*vTN_YE>;xWhO3 z(zn-lK5_aDW7K=3%gl0l$3IrTdbJet=`(YBh%;j&$&3{rPi3XS!=Z^QU)$XC*p(mU z2S@gF6iT$j4u%#luVs_*;`#zJ%GFG0sBmIT&;lJpQhnvcvz?D#|4;ct-T{BB&@}-5 ztj1hHGOJU^XJftA$;x=gkTH?yO)37-Xi9B8^;GQ8<~uoWMhqwdh)ey^OeuqeOz3K4 zd8b)O_jNlBZ=cQ&ggI|ItDgDd_+49*!-f>ARRbeFKb1uY4m_N#rpe~kmf52N#f5ZN zfZf(7Kb;3LvK?KZgR4vLpzcJp|SmHdxV{Gi$`0?rc zZ+qo$z4vUs>6VvtrD#o84)3h2`X3w9rKDUhd&iHz)i@k|dfkugv3O{ZUgQ2__fJlJ zs_)I?+`^ogYt623yOgVi#|~u*)&9yl z90HjOi+iKjrVb9NDwJ{HYt5~cdIL|tl029_Zihl)AR(@@zcu#Hv;Q&iA{Sk&C$hEK z6|KuUkr@jKOpq4i5M7@tcZJ`$($h0D#WB%{!*woPzV+XIed~d3m%lR}+00X=iS@>= z!M9HC++ns#;~k8}NSf z>`2a(L;Z>|%r_8vw3kmLm^C+IWEFj=cctSF=KRX`e|vIkaNA3N*PD7PmpJKG&h5J6 zJJ(mpD;}Rczw`ZXYp{S!;T#g*`bu^O>v#U>hfCe2cO>>+xFr= zc8^_44J_MY>A}Z;aPoh7;<>p%Z+LD!8J?aIjg|S~o@=i^`I*J%yn9$jMG#uw7d#<6 zy8d_jw!O3!+%~yo9m?=rlhfxO+y0|3fACWmo>h+a*3Zy=?usTYg*rH#IKS#_`BOawe@Fr?|E+WU~FzS_Syb-p8LSZ zp8L|^E_-u+p!3RCJMTR8BkE@Pje4&q-;zdB6~jw4oUv3zNhJEDpS`ke+t$_}Yj9PR!bsxIzU-d<(~a|emMW#+_t;7w(i{4*jjiXx+ah0SCoNXc6E7Z2S14j zxmT)MGmAIPToVTwCl7C^&LdwgD?{Z>j1z2UGFmWuM!CXsPe1a$>8&?E{k!YGs%%dd z;Ur^{X84%?>Bs zsI5ECHa>IDx3*IMuIDSScy{DYa~9gTIk?F;9Y*d{p*jX{fnv?awfDV#0 zF3wuT9GDY|RV5+=(~`+VBUV*})QD7iYWl(3H@8lH`rgxD%^c&V#bK&B!#sJo^-A&K zJ*^8>$j@h|=B<%vxdi%>5W&PGd{#XRD6Ccl`4yZ}!101t6JCIL($+_!=dTBD4!!fv z_$|p7kBE=XwD4Lth#v_oxqUrn=BHvzn+cfVQq0Pu+_Acu1BgdTSne2u9qsu zj}JBiWytTq^=EKGJ(}YT;wwZS({8+ws6^d#o`WQ)D!Md`6_LR6C0jvQ1^p&lVCev< zpDws5hqx3==>m{(rjSXL;+14MRAPX^gPo?@Fwqe9QO$Ig&82}bV$dKh7j;oBkcy~g zXo|{!!IQUR)A3BYny5sIDx9S@h~>D9U?givxU={o&lm823P2hfxNlwpgBze^#EFzKQs5Jy(N7|eZkAOZ^2yNG zrjOfP8h!-G>fhl`tW976^Oy=nffJF|Co!C4L@4Qau z1v@YqnH_13FNBc)fcqqsMG8X1QgB`&PrJc6??fzT2zI(0X?h#!0$i-HEwx06b5eK? zEgq>2Ca(3=&}_JhU1q$9BW2;u#Vv)~st}$?#HxbI{xwORrx~b}= z{yH@sLC5oOi(5J}_;YxSw2%$ji=^XswIWquMBpOf_2vZ(0N^`xxmwbVx`IS>p9S3k z*)eO2T0V^nps2aDfoGMkL%z<=Q(8t!WpLG93}~Q@c48_(H)X04a@aguq6EIcWvr-6 zxm*E#jJsa}VYZ&m$~vDxCm^fD67cZgCd;w7pa^(HnQ$!-NQf$n9!gb2o!qLH zl#L_pgUafeaD}&l!>6&jQPPlUO2~FGE|>)*%Hv6c{{=lno=7WRiQatHU>03~%ZU!4YREPaQ9VJnFj_<>W|O{IS|LgAA~0bo+TUyPgL7Og&cSXitLD{AqIkg5YCIq0z)@?1V_TTMM#Dr&V*PP zq5*iqbu|mQ#ys$j2#AoF29Upq-f0%*Hk<_$E?8@TgyqO2+zx)g$5qJZ!7_-ladMQ7 zR^fEG4Nx_-M-=24dX=ldjOk5VUpa2Z zLE2`Bt+`}BSIMP?GIj7MWVKpV3Pk(>#8zyGEKSc$HjN0UL#9^MpAI%=O zxZ-+#PvpgOW1ZCetkGYpc*f7IcYi*)oa;FD%*w&r*1leR$UA$^7^hFSdQ#6!4vu6_ zO$3ij&IQI63thXl1^J2b*N@+`{n;0|gX#H`p&u6pICl-yUHWFr zKekZ~XX;5H=_lvLdZ%VWUON$uu%TG;e0ATGPrn8aNprTzQ;V_kd}OEwv5c6fHRBm9 z(mi1(HsrawwC}bPf1&IYr{)*v$jo|3IVtp3CyRQ#d-_!0ll5%ph!GtOoL@S8OY3LZ zN7(6^6>ZGEqH_!K;Pi^d>f@DD{vEke&wv77!@27I&o%$Ty~|yhsYwG1XB4~Uqt2}Q zV}?3k+B14ee`4Gk8Zn<1Zh7R3KkNTc_PK>T-(R_&O|(+p^UsWTmMV++#}7QWa{m)` zx+8h1@r94gZZ-a=LoYv9OCCwTv)-kZ{8QJh?c(h0WZylLZ;yPKpBwCOuN?W`)UB)k z_U5bKT@E}F`m2`@3^%m$<-+dt{B+a%fcCcehdm3-li?SZZ~2|Mt>taEJ^L3Yd+ro| z@#>MIg{jtYql*KfQoJj^Qa(Iv2cC$2>FQnEVp~7_(EpJC%Cl3w4^960T))&3ob_rd zEvBqFy?4Yd^N&1Wy>V*C@20-9up_y~jJBqn-R zP@*(nh37usY-Z9)cexaeKvTWw?d9?!L}dA_kVrF9zL1ENW^Jf@11AmQ4Xu)u5C$(9 z;nZX+5z?v-8=);OYG}StJ{R^15T9b%3>^#W!|h~x1BCLjf~Du_xDV##DJ3tW&uhMSm94VX)c zK!a(J!8p%>)(^3EBofHbs6@G@?IJ9r0fHh)hACry1{MT(3rtuD$YXj$7>D2#FpIX) z3MA4&=r;uHjci=lYnZSlu&yD!2rNi#Y7RuyA#TEO$kW8!f(`;9Hi_tB?m^p#5*rx% z!ODTt8rF?;YaS+<2-Z79!V$GcJ}H(ah&n0ABqbCoI0Un#2_S-`02dK& zLmUgDMWo8u8H*0=qDZVjzzXOl%>7u)U{)tRgKPm1u%LU%;)7(AlU71C1~WSO2Dk%u zS3q!uQ)2`#~$NahA_V@jQN80iJ3$|H&}goW8R4d)oMYC zgX1bfGrnWvE3eG=`&Onx!se1N)}NeTrUqq~31wDRS|+FF>lVcJ0wdm7c<4y(OILb( zFD>?oUtICU#=J8pqJ1uRj9FQN_^VTdgqAco!ut;m(cKS6U;ldK(WRFt`jw{`%G0-S zDRe|h9*R%bK~Zi@&P~kK$GWq|?qkN#9UarppE%ZaW+OWBl{u)FR9x^Qe) zu<)k!k>@p2F3gvmg~@cRx>895S=;ZOU5y=KYdMOVEDjyhb6iXyFj8B;W@0bR*%xuk( z;k+ose6BIdR$&ftW>bl~MGrvPQYwKQFwwCrRV@|)dCw!69OfDBUnGa*E#7Xpyo|93 zH;l$6WEY?~j4ehs1Klg0=0(WS0qZ9ySwlr!H3#}kJk_8?q9ve#EGT`u6;Ov6StG3= zJ&6*bVJ)%|3}{G-voVS}S@?aBBCg~!qFk!M0xUa#keYy?S;!$Wk*IDuED(nxaEeM2 z@GcoSZ&_X})ZwZ?rV|uOHLzeCf&%s?fbRrOcaTYM2^4D}y;wsYlLlsYs9Laq87d%9 zhV2j5Ze-GBz%-vVL_KFqQU(WS@th#rTt#jbpM;q}9uGvC+t3|df#XM@k(1V5e59)VKC?r08zUdFb-f?AXH4STTm#%NeM0rV-Jzf!Pp0j0mBCdKrneBppI`qAA!dT zBQ4hW#LY&ANHT7ca!EaKBH+?+E;8-|dPT-%GSy)Z>`Gp3R1IS3FjO!AlfkZSDYVBp z49{dMX*O&mGH79#C2UZbF3@YpUP2WSH6qp-*@V#xbK;F*742>pP8!j+=-OjC#&xt1 zy-vnyyxKSeR1GLA@{ibf?H8<6gV?6zU~)8R4qn8lgbhW8ak7ofXQ)dXe}{70Qvr5D zBS=xi(O_7FhXd9qs)^|ad5}0K&;sN_Ls1tF2aM=sB7{i=D;PWk&J5@wEc7d~UEveO zT?Ek$1^5J5Ld425(xCjpy&>tCIdfT9lVrjI9ucAxz%^n9&qM1YP3blsQ@BqBB-HV2 zp4iJO5>iESIntP>O^xv5ld+xy2Lq;78I}WU6J&yH<2lAP2Zw@dYL}JQp2;0sn$kpXmwR_myMBNN}ODZ z`%8((Ql|@)5%%#Tdu3xU^^-661h2RDXs^%PxdS_!?qlv3BM+PQ*zB3Kv6(nHeBi;s(4xLwd)4)+{BS%v7>(}UzVM5)Pl!J?KQZ^q$waYh@2v4q6S)1QE%SgKeNdtp>tF(>UI{P4hMc6+^9QnCGpjFx4b?x#X|5o#n$g}RQ>?_(HV{v$B)(tOi zj2vyu9^OB*(9`2cM>_fk=D#(0?D$`+zZd`M)Dw;G6c2KC$9`u+>McDrej9&@>OTIw z$t~o1!cBQRw_yx2#pFnC)uJXRLqnn!8)YlT;2NwJ0{cexfH$u1dz>_RS0!zCX-np)I$50w*lbw2%S-1oh| zi{F3z%LBJnUf@Psv%WDsdNA5j1~aE~p6rU|vnI7P0H|gbUK2XumT9In&Bj$ZJQ7s7 zsMxT34=RgpzaNW58&n=OBFNmlw~JDR!_$2(ur0wbEVlG+c5XDXC{LBO2HGb#2&wbq(z&nF4^ho zqU^P%bVy(}X})9y#wjip!hFWZkptrQYr4;$&9Rj;4Q+OX3bsmvvDw@ZyIKpR8}?uz zD~xjhgO_TmHD68&vxTs*IFV%P`FK5W3rr6+!Hs9;taN!Qqf{#pg@NE03=A;=a_f{Y0cLXszJi3thU6TrEX{J6 z%|=|C&BRO)r<<8Ho5`e8D)>)K1}O?WRi3ql;%rfITLpwjz%U%3xNtyl6olvWa7^SP zNra=yP7(e9W1Di?K1;dn70iRSacpp^+mOd}=c9jnoF+$MagMKw&x2`>j? zN!v_AmUJx0MEq*Y6z9*E+<2>4mYvGViNkZ5u299)_%7}RUJplj4nIvI%(F5*&s3PLr-ycG0C{G*9n z6_hwG)X7K$9crXESn= z%P8GL^{Kde`I4Pos>6$pkWt=bOU77GPILuKWVx*^RaVZ_8C4xR>h<-GP|<;SH9wZz zm=ADIZHU>ki)Llsjw^1oN67m+g`BrXDbVujiOS5S>9kT9-!+;z^!O;1(j5+}!BJ*y zy^uS8X|3cG^i<3X$CRhjqQ{c8xw*xY8>>wj$$veEz~wz6WxbG( z>TzM#9q<^jCl8N~csV=MIDOp8Z!|-(Tx`$2zHxUsy2siax=nuLq&0c+c%vf7^DoSF zj?K&eS5wy=kk-Anf958=P22Rgz5Q;Ju9!4!)9l0yN7T4CAmE;;I1oVr5kU}S3Wx|U zaPK{Wd&g*!W}4MBZPRq5O?$iN?RRhPz2|$+NptVVAM!ir{PscgJn!>9&n_2DU16aC zJP72u%0*#dW?}GN@!gMD0fwd%0X?IQla0qCr|uGkw`@#~8} zWN#?JuEwH$)AwrL40oI>36L(fxISMzAk1wyze>3}6)Eoy4!&|PI%%vmPuE(j6Gh|? z_3@I##mQ6qA7EtAh*4M!Sm331j$%vmd~dyJmEIu;)yv~?OJJVO=Wjn>EdTitKjwuNTDHMv1QiK!`I6oBNO`#zrD~>X@1`zn00rJWUn7kw zSvCb3hImm*fu>IuW1N@gH;Ybi>SB-e|0V?b0_N&uT(Wg)PS{to=quKv)RR?ZRm|*; z4zR!o@EW!6^1^Q8JcVc^nHU(z_54PBu=#4H8+Tx+mPW1Z$tkN&*sEx!#C(4SZN#vM z?KNFhE4=6GzD?XSGvFecVv4Q_c68m354NOishV|3!%Qd*yMp4bSUildxa>I+)sx1pNuj{=bn(h#4e+}DiO(>eJOwNklTe6VL z9!W#1SRU&5TG%k@%J@zC;`F&cdtR%cv{Z)ZFXs4Zb6!`Bm1x?xzJ+1y(5*WK-I|ws ze#$%6Z#-@|MU_mXNAyon$=rP@GitGp{_Glj3ckFaTdVh)yciubt?(-y15Qp#@@Nw+ zfxR#NYF~V$uMqp{@u${4)>Ra{b)A)@H>6NH#$qL{Y<5Rgd}@NH`0Q-5d$0p;5$UsK zZfS1p+%T2b7?UyI7;d&j$99-=Q?}3+mZwk69I8#pDmFD4 z{OCpW$f<7%o;i3M8$+*rfK~g`N~T)`Tyb)0{fs1mCAD_&j`)E4_?7wHXbQW9{yg)` zns5*Ky+vkPTS}N_sfOnl(tfM>FD{9?>ZQ&=7zW#d^k3dj-kK?e;pi@2^hSBuKe9J7Ms81M91*oOR2m|KE640LLf6Do^FhwX^18lleHuBin|t?Y z##bC%U(m7cGaU?U8ErKb{5F<}_F|a)K$QB-8AGHjTk`h69(U`+z)0K+ z%sY0MgD1k?#ZpiR_63WRpXj)x&F%<2F!p!WOR@IlTast|X8LJfAz>{KtjPPjD`|=W z4zJNxvB21r^V?uRP(ky1{f7_N)l(?BjOvTh%~Gsqm-L+qCTMG%QS72F)CfxQMN`dW zW=GP?sdiac=dsNnU_4~J-6SuKQ=CzFN;_lu!&Uk9Lb7qxV`FN4(`7B%hhZ^Ws%9E% zG)a}F__R|Nm$>Qq7O89Kz@YOpT-)h6Iq+Kc_$p;%cO*9{6>W-wo+0xj(9shj$SoU;thQ3W- z5TB$T71NaSc9TXxVnun=R5K3lrh@<;yCxb9vLJdwP^|n^ zXTcufzZNBxYEG1GvBTewDr=k26qT6TS|wh-KJj_xtG(X4hd%48XfJ0*$d|^Wy(qcm zCp$;<@LOz;K5{fH-g0-!*S}@XHnX5h_9~n_8P7@ci+4<%9@0c)7iGuMlKmxPld-B{ zbMEqrl9$Y>u|`Q08ELi_uyPb<9`nga%gycq0j`rvdhz5yX$HN#Q%q9u>7`SX?bdop z`eFBECR=*W6c)R7S*30_S206MMzT{R!Z_2w*%6zhFlM_qmqV_(Ty?y3xw~f3$}^{i ziu##CPHtw);Mu`)PSR_KQY9?oTy<1_Z?paFK2B+7d}3{pnU|elZaqCYR?G}|!6l)F zx74NbGuo{q@78e&Vk@rVi1HgP z7P&OvHon?W9J_Vv8*JW3Z+CF2(t@p@j0_B9=~(dLlyt7~|+HZ2L5-|=P5lOtmd zRf62;qd{(2c`KbmrdCKVwHsRM_2CI8n2FZ@xxuC8(u9l;=)DnzFVw4J#ovB0b4upIo}!DN7>nI2@Ri z*L|*~p{pvbw5hymxKhGox+laan@0OrPNm1Y?r;e$lAarc4 zbO`6QjJ7Hi5kA2Q`K|M3=VvY4ke#o+PRi=KaJ{3SpU9P{+Q<9Km5F}dB#ve1+{LB3 z;>f+*-}FedUSC`oYE6!YWX#S}-9{C~+bxb|o4$T_wpQr7?d8|~nS(1=W+zPvarr#$ z#8P9Wit6PNm(@6T?fhI_?$PZp?eI;wvikn)N@09_7Q?W#&|psqJQhV)^<2Mvwo@Ci z`=yuMgH0E2-@0u9_v29R@MNE(Gcm*~ELhQfVeRTrS@419pZ5(mpZ)y9&#Kv}VO|C8 zE&XfV?3hrOpyJl4o3|#_u`W;i$tOg!{LNQiH>%T)xUh^B6Suq7`LVD2W-ng8y;#i+ zer~;cSkm~HKmFve<-6^UV)KV@ooqMdxCBzzn#D_J`^w|DZ`d9bR&n=7?83ClduJdi z&UR*Ud89Oi>_^S+7+aibFZ6u%xr1Rz^Pm3vgBxAxE*?kx_Q6-%>2$Q)2b>u3hGpqw-gfCd&FH#RCL zDY>+9W_58;ttgD4!2^n|4IC6pIGIJ_5_v6nX(k3ogMe4>@W9kS6*#pdXGu$~R=Wi- zJE4G&BRUc`IL>5qq?H}*?cMdV5)l7^aCN2C3^-vK=x71BC*grv1lT>w^_4a&L__ln zz@-9=C_z16uLZ-?5>U<;g9;=-GHOU71%FXNu?Y0C0DXd(GaxhuaKnUbQ(XK;qtjIx z0Jj2vOYq@^JUmemgcTrC4x;q{1{Fi9HrU!4jaray2b2X+Cnae0;L#CK)&yt@Vksah zss@A|ASTG-)Pe^g4uL|#9}Yc9N+iVs0WRJSaTdV7a12fhP^%6QdEgF!l?a40ibRDF z$-t%A0ieSZ6LFDr0(Mgg5t0@79C88&JlCIFTP69SM*1h^20o5HLhZ~?I&8RRO1 z>mk?^D%1c)!5x8UKRBP3LZ&31lnHq|kOB{A8IBZzzkuEd_3_XIo@4oN#kk}>WY@y} z;o%+tSaER&(13^jG=S{^@`%#{6f%(62Zs{i+-dOG4$%3a1z5*HnkZnAfCD}R9-(VI zo&oyn0A4{916O+|$PYxg1mZma8bVSIzWq=Syhg;3Yz(k1pluKZ0)hojWPs?F&Zq~) ze&`eWgA`T?E?N&^D}V?Au7wa1EQf&dVD;s24oTW5QqW2eVnU7M3taLkqCb@hO}BhuJL`vLr;JYf&neWf&g_c6XR?h$oYla z3HPE*Tc$CpAgl&ixVZcR0D+L|S_03TB?^N^0t_u4hA#4F*t*E94jC6+#*| zn9T@sSQ1rMp8)})L6*Mh^A$NPDF*J)vD52Rq}GP ztf+_;8yX%$W~&=UFQ1>C?~~_cgnCCOWR+D`cXnH>joOk5$UX;uMN&X;C`(=2f9uA~ z{Irr0PjU^6V@q|_eFK$s9aVB`wNd~PrhouH|46;PYxRfAle67v|*9UFM)L=Y*Z zd1CtPuh%=f>~xP{pZ#H(AnjE*GN|dAYc21yW>J&84!e*e8QPWE)1Q9R(bU2}7#QN} z%H$Zztt|`I#`#l*Mq8dI$;ahTWJ;cF`SkReAIJ4Jv!5p=XfGvOsx#RaCx2NiCcnDF$1@^NU0%7k+%a;; zQQFcR;t}P#%{z@(+jes82I$L%+19G$GJT15tmV5uhlo5YN|VZquewkdc)IyhZi}sed6NU&llQ8`cJr$4{Z+0 z5lXtPWuvpYw)@kf&Jph|ey+PCXjNkuZhiFiP}NB3w&S$dcEua>OhZcL*&g-k&$`lS z$z%Jy_5@HA*sZreUn$qN1#BfzcLpmfIZX|s&RKKAkHfjm9e;Ty?1Ud(?KpGy;=7kL z+}gxv{L&74sM_+4?GoFt-TuvZUQNfAbpav%^s0p`pRZlHBug%jd)%E7;A!j=>*{2^ ztySF*teH(#^muq=P~zB+?|*griYYEfu>SShH0S-kwBAhW$7>?&#i){C)P4=zMn1cpZECLeI!w=dzO`&{i^q#QPqESjQc`{^-@??qmv2 z-DkHHbWZnneRn-KhK2qZL8hdA{jiEFdePU1%(B`SZJg4{wz_GohME+Hj*`igQ4G5Y zb4f=iA}}J-T;sUinAX%;Yrb)@D4z7*H$Xj6BYK+ zkENLrJCQGm9P=rLopGETi9slkL?Uaa$KGoe&9z$JzMoBve-?#CkdiU%he^k1|1tDb zSVRP=bA0TIF>k5gJn>UQaMD5KL5c{6O_?1Z8BIVaG&~~0a;^1L9jCXoVdU3=5Jm{v zA083bhha;O(cw&l{KH9MmA7inRmKlGl*13E+(M)$GDvtk2XZ4p9r^JOf6L9pPC%L^+nB7`;R;yN=~f% z0()m{tT4j^y_S-DIA(byf>9uTcVO;|Pco3lo4Y8HMGF|VI%ztO?I1f=LgM(m zwS|uNzZW1^uU#~n`Qmrj`LW_RilWe=YTH{`t1a%N{K;>t#{Ra7P@G3ll<22x*eBzy zTXw1UZ;o0^bJu>vI*?ZX^NRVxFEQvvI+dFG%dg*mH8n;;v5c+074v@4V|_tkg&$xo zw!cmxM5fbeW7yaC<|eFYtN7@igmdX$yi=LpIaAo3n$z#Sg$ zM;!K}{sRWLU<-z|j(jFXPEY~v*+(DDI1*7#wa1p`D}gSB9pSr}KVahxpTZbnRC)@A zUAb~*_z+UtPi$FT2y@dmQ1`Jg%xw6r2_Xud9&;D_WNLMefX5!pziXt>+x3*dbJ%LKV+o-UDm{7y!%p}2Xwd6ASI^V+ z8PO(7Zg?MdH`ToQGzy^6>CnNNqp9p!BvkwOPMer?lRPV72D=COAsbOJjUIaw!!As= z=DxU@%?qV=YPgAdWn#)@?5x;fM2HkgOZx%)`SO%4=J}%qF~|9B@F&H{rx~$NmF?q? z!?y=5>N@t1YbU$YUwD<5a3HqV1cJY1@iFHxN47(T9*d+!N-*rJvF4`GKe`o%>`w2i zmFaEr81dh};d2IEkT;E*d>OXMUMulN(WCe?_b||Pt|)Z%ma`5Wk=57h z)!LIk-fo2EZ@@h|h5hT^l8l#5Il;^D4$qg?*H+|8Ph;oH%zX45jZUq{u-oHcaTx3^ zPIB?k>CBaNf}~;WV{j@$f27f<%@}rfN?VvkI>OFyJ0@*v1`1_-GxlkLt_C40E%FQO zUl+QCk~G)w^sv`s%wsm0x`2BTyTr7(qN7wQ3%scQ+@YA zZ*Kc`rdG`p>aG zc@kO|PBpAy{~iVQC^?uS3iDtOt=913g9~o`Buq{)g<)rlv-F8?ohV~$&6qsj zpy31s+py0nRq<$BRBHQ&*e~@=srcwVhVqz)WzA70i1p##e=uZL{Q*VL^A|B}u~=%P zyhV}*y_vmosz$|hr^0WCRkscK(qrI@`LxMUN_VAZ2OZ5F9Pg-`llnWWUF+vmz6 zJl(xN#y+5m{E;WU=gvErl~GW`+wU4rj?=$)y)q!gW$!rlk9T36Y~lKU!QnRg>FtlK=enAV0d}!3--tWcR@w_!g%y z_agte*-KsT-ZXH=M&r>za!|}N*2VP;4cSHhJ2viPV4|bZ?bk=&|DrS3(h%jeKRqLP z{I}b22U7Dk`=n!7bMomBCnzfa%(oYr$34OWBiX9@D_>rzllndJ z3N5*#|J3FA#(G8IrX94RhOrAhDW1o}G72H>-`+fRA>KFis9V-R%fQNMenwW*aX>@l zKs${k#};MtC5DQwxl^{RP^zbEV$bZ%M87(n62;=N3eD9D9;XmI+Q2&#sC$a?s%E{A zC&`QwG?>ALS2ddr>lRk-UwAs2)Q3>B5-B6b#&TLuv|lfJfgv`Lwk z7RM2Q0jR|SNeV(%VUePuMJZ$#2n&V9ptk^_u3AmKft?9YZXnKFA=5UumlYKYGIC05 zs(>y~CSi;9B}rN43Yq=#f;u&a8JA<}s1zx{lTlj+I=-c??Ml8NJ2qX@ZUb>FMOI3A ze@8cD)F#nlIXY{7Q*({kY!ZTFFi?x?DvPpM@JOSoGm3cvCQIEjGu5n2B1dwyU`AZm zQV;CW>@0qHm8LkKEe588T#GaIiqm6R`i_y&9%DW;iz5PIs@oxsa3Evuw+pS3n38)~F~m8-dub22*=L z9DvGSs;bb#Q#D9j6obYuZXgJEKnmW~pivA~d?0cK)G$yE1gQXNF=#9+l_q$Q2YGTx z1%Rvtjl2k)6E#510SPKt1w5`ong+zV0R>Q37}QEo<$xoD8SH++_ZU1*WLhvu0Y4Lw zTqEO^05MA{7C{al2y#INU4?<5hJs2Mq~Mh4fZ+<@1Q1#wU@8SBu1co{@{t5+Gs0r6 z2J)mdKnDd@4!}LY>j46;8n^_wm^g@Y;E&iU_>PsqJp{!~+z1Z{wK(vB=c9ldqZXJ< zkbR;8HjPXNq&EB<&JYD!6@U?CxSR;V5d~ftPL0B8V<0&KgdPx_)CZt`Kz~eujR|6OVjBPzGr@3H z7C=9ETfmOsb^%g>BRD`GfCb4lMm1~#Fs2}96UbU{CjlY>-~-pt2Dk=L40y+}FI>|F z_)Ngn!=W>r)&&$QfN?;@3vd>E=KwFlDN+DC;fh{L_*ml=H9A-b4&T9aVXMp3zy$+P z2B*vs+$?}XfQkjM5PXFKI~T`}2r0HQU~qx65Rj^%6#?5o$FLL_6*|Iyi2+3;?26zJ zurr)$4ZJeEJ3wAw#xPxiy9V0|I|8lnO#nm@FG33(w1X+YF(lo<9mS7eYhV$$m>1N- z_aBIExHt?<0~U!_g--^KGy$s)5F~hqi4i;WyG9PQ0aOZ~1zr{AjSF?*vR1Hgye2*h z&JBc~@DCp}haJQ7ci;ej!3Dexyzm29AJL2ejBuJ8bo#Ic3 zy@=g_NkLm;Jbd0TEdGYS@Qz^(zxPTs{O<{v>hB#r?Bzd0L2F`s`1#-dpoG7mDlq_D z!MEX21^i|~89yXm_;jE((ea~qxJsPFD-gBu>Ua&JAyE~-1WP7PKdk$(M;Pk=RU-QR z{Q}f~H1?x2_-Y?khj)CE#Qh}N2h;~hj>GOH2NrU2HwH2Cn9gLl)f*@b_-FP>N;X%(*WH{q(pQeFhw{w7qolmsf zlN^O+1De`63=;7pwPlRqPmk;Tk-bY)WjhnZLW=;(=uM}av!=3{|8CR5CO zifGB;qD6W{-6GPomkW3BxaFwIH<$J;^0IMlb!JtvCQ8Wvx&xle|VjLU&zLX zHJr(u4Kx9h$=*ca<%s_?t0%&lLMGdpnvVf8rPT^rb4JNCj}=1aFD z(=V~J8ruRiUXQ1Wp|Ua;i;O-cL9p22hXh_M*nzQ3fDK^mlp@3S2VphHhd_uUvc?ju z$w1KbShLcd;q6=b{hxDAz4h(xOKNOYOH<_2Rj2CIsq_Dz=XuU^PQ6^`M$WzOOK08t z{`9PKPyhVoAARQU{K}1wUjFc}-T2v$-uSu8|K)F7{^&2>(B8`*{>VT0=&!B+ou9q& zE5H8HU;D^^efg)J{k32E=#5`L<(&KBU-{@i)B(zBZC5Pp=q8JkQPhNics~q}CchUCbKlNk(#owqZ+rIh3fA>fJw##k% zzoA+mbI!JJ{mq~J8-FwG|M-vnXMgtx!uEgrOCSD~|0rz#Bet)G?N9vDhkuca^5Z`97(e?>r1utmd42^XAOg$8y}A`K#Lr-9LwO z&>*%lDlQavv1y=u4O9g#O08#xkuD)a|k2(({Hm6?LOIC%K>&9~pCb?l<^>fzgOKfL>p_Ophm?vkYK_h}sC z;3ipVIXJkf6ZU`lox5=k3CW~iXRD1OIICyfrk05$Nf zR8cS$d?)CoE-@2xu?^eM*glMdisoptQs{ivD$!Jz%Xku`12fv*H?y@Xe2Myf)tM?{ z71G|jrrU1*@a{fIDT>EvDsWSK#eoP0)5E(`3^nXrdJki8WOb-S)?M@@8sA-%;I0(I ztAR?`2X?eoiV&6-o(7q=4&$Jc3k$xBf=5;=RCwQv+!u>^a#0rY=)9TfDlmY=4l_<_ z{7}kjdcgTC6uK{r)m%xr18~U}_{#;9ME6KbK_0S~b~e?6gPRZc-%&gJ3qmmF##Ljj zRZ~*FiQ>*~D(+={CIO|KZ(e9H!@LnxLvyeLzroDg#y)oq_!e6KSc8 z{>wJdFj&JKs=37pHbB|@30`e~2AOCH=HSf_kB6SXd+nksl%M)Fz*KsZ(pLLu_s9_( zv@%+scQC~6ZM*K=dI_{b?ZaW(7`-+oWId3FC5Q<)5(m<2@{pUh zq;wjYJ^+N!paLlz=OWefwm^}0Z*u)w4`gmsC{#!F#t^Hfx+0*(k218E!#L=jM3Rft z&YIOicL$s)&*+tp*2{RLOj#^g!jI7S>N-0dOR>K|iD? zc+7|U7z62WMYLv4-xD=agzoQ$UP17ngGTY0l|G7s!)-xl){FE&wh(qyv^n~?A9ff> zEE*V=19eTIB8Q0xjtP0PpeZY zC2|0RBtx{IOHvigCDxZ6+Seolj<7mR54yP=oX#=0uou<4iCd2~pi-m-DrloX3Nos~ z8MHfm=^#ibVvcvD)ztFV_s!|nF(0LAY8{t~nDwAN;)JV9t)u!Mgwu&hhZED|7dcAO^{5tH5ZVH|XGQ7A+lgPh4V&4sE+oGO9a z&Dw*_$;dg%eQ;Tp1JKp(fKs@m++HXTi>{4xvg8Vv> zLWrom^}zv6PAgEVaY6ur>FG4z(&{G2eiuT+B2Dp16!)~&%X3iGipA;GjMi%vgUvP_ zm9SweG==$M>{kvHMu;H90S$z|^7T|&eqoux0!;0~-u;^ZZE_IK$`*YNY-SDxatRhvs1Y%7 z?J&&%qAY`kC(S8pRy7(FS@)(kGXNTgc#b%(fWW6g#L1!r4un#QXIJyX54i&rlM*8b zDiLFdj5PK3TTALe?|drTo=|`S)nOj}uz4g6AH4lT7ys#6!6wY!qhU(4tJ+!laB7uY ztNAYJGX4z5VI062)=n>AV( zm*xW&?U12^4-MBfQB8sJ5ra6GkzGNZx(?DlZe*8w5~?NtAmumfv9wHs6wH|q6#>$H zk!5nlKA1i&==$oNB`++FH5=2V{)BrSfysx(&6Rj$5-@*I=+X0lR|$cs5wHf#)gq zjj)Aj_+G=XVn~Oo!4bA_+ud%cVr!$DUSHpA9o}|sb)!yiuisc*J%7GVyY=<+>+7rC z^!fEB?Y29|x7Qz3>#M7+4BOl56w*530j0GH)REOz4V2#1pJkRM^*{yQZQ=m4^KWHkly1u%;+bRQEIy9VLIltbNN4cvj-9}icR-wAJthBb- zyxz^e(J74M{d9fy(j2sE@7((RYPUg0VY~NN&);t`4+F4NUxhO|t*G?*-G(qSin3OI z=T^E&cfE6z~7G z3A*1o|A2ew9d%a@oDg%odmO|PZA}w3F4I%8+w5@e_JL-1t2a6&peWt+dSAJ_wsb59 z-O}2r$L8R6yW!dHD7stUSYK__fD6h2c6PY+st2-b8|_Ml?Y{0mxYEgl@jTx0cpPkR z^croWcm4Gn+g(x?)UIEK>y_zVf4zHF?;6`J>+5EG#MI+)aNr^b{ZGq$sq6as_UCIo z2!@QsAH7`J?Dlq;Q1^uO-?`P@@p!3siGza|Zv)(r_1|`%@8s&HI)`GS7XY}jj7MzU z(~HirM@jtoaM06ICAS|m)oMq8+8ZpXuS~sCn)Bn<>ajUu&Lh{4#=#M_1mbol0$5*v zrj*p=%s*m5sKXQIsQ8ugXj+?f) zHl7f#yKucU2fK9F9SWK%TEW89x*}emrMV;tg5{XLzrIVz6d`VJ-`>^X^Y!ud2PF01 zpYULt;#M~{)*H;L8>_chA9P3{MCpf7@p?zEkKmvmgS0JNgp^vXn^ECvOe4 zwP~4}h4cI8NwEZwm6XI5ze6KuHFW^x57Fu?q1{EGLEbgcyF$FXGGAHoq2u~)RjsVt zchORI9s4`g57#|pwU`46XaMQVjTS(qi32+sAb=e8E*O$A2h8W?zQlpfWZ8H?6e(Q6 z{vU_|#`4j@3VwTJYIwfpLBrSzs{-q>c~7&#%sibh$s?CwGeKH5o^SUd;o8+G+{ z&W75hbuy{*=Nl(}yV{T{ug6J@4cxYY45w5$FKhNtr^*W_h#Ns$U1tQ>UoX~!ZDGddWA0V;Wb$i% z2TiPI7EJBHH}H=tbBfaPh?b59st8BA@8dch6$hN*9oPA4{f0`bA)P<}jB>=&Df0Y{ zb&=L;Yx9^@97^7B&)k5*m{cv?Tby7U$NgE%0iFLgNaD%oZ>wGFH1Qyi>NHi;4nTSe zR<9`Hqekpe3Cb$|R>BMbgz7jJAJr9rRzgez2!7Y;>|zbDptQp}z8-vlm8Ts({owQKH*|fN^ab)4O<`%nR&pstIFtijw!Xl1t3>UT1knC_ z%(}SMczr`VZr##R?Fcm_#*>n)1_Ux1ogP)SlEPRS>)Sem_z6a|$A>uRxrQFf5q<3U ztygmu(O|xJW4^j^Tf>OB+|b51#z8E~ujTeydsLsz<_1H6uY1I}pWdB$~9p(!#%o+CnGy zre<(D@&R=!kmd z)AhCdM*H^7k~R=aSc(H~AG8A^9MI-Q?Hp9ndHP~jwKdWg(zbM(@iMXnn)bFU{T@%j zdPwP6ZU@)|8<{pb**|^@h2ZiFa`HR^OSue#wd!pRRS>5bR znW{5vkEuXN$Wz}?kXe9Q!;njwmwnN6D6Rw+Oc;iqScIZb; z_1BH3d%LUq+{dFUz2X&#yxamuuiT+6On_e>J)qad|THou0yY*E;5jopN=kZmq1Z*V{~zD^ES;6th)Q&RE)$w zj}l9<2@&arRZJmaPzI&B6Nx)i5apd{MVgaCBP$Lib39l1IeqtbbhtWxOGX%Lt0IqF zA_qri>K{B0UqP|$(C+Gud+mDx()N`b%~^7YE1xG|3Dxp?z^u!r_aK6(<$8!|j4$o; zMZl$HSRsEb|Y5*0@bpg8IQt+sTMN^5pVX&|!aeZ`Zd|{wHI8gDeZyPJ z>A}&LS%e|LwG(}q5WR;cy29c!)pYgS?s~hBc+Q{0`Y}0ZaD+Ooa-TU`2Xk4w9XzJF zHtTE#yxa7nt8yd#8^|?Bq3nM8SQ_d$<=C8-VMz}9)j;h{^ZkBxX7YD+t~lI^fnscG zzwTGD-<9=`FNfsub1lii@fWz)xC46VPPDph^TBmhuBYZr+Gzr-PLiiGy6GijyxvKVm0X&GV@eMb z`oS8oi}oWJ4E$p^sA4u1^Ry`N(~<29Fwkr#6^VAz?V*Dm;L*MA(zmbf(QfMTIq>c+ zl-Ac0n|E*Sy{)fqHkG`=-B(5sO+9P|sKp79Uq_4X6a4qprp>8Jik_z_wfnF_-EX%t z#LdU&AeIo<8y)Rc6cmpTy(pA!(s~@JjsnT07>Z$5%n!S^Bc`?HgcfUrK>bJg9#lSP ztWV-DNWEQ<7{JmKe4^v--YjyQTs=+|;zkGE3l~x%KZ)x{vxcr(b9C%LaR4*9M)NS~j-iW<>@I z@I5i={A>ge<~%n|F*F=l@g?YPnh=C>qfMh~KoQ4&Ryapvz_IBEo>e?uoht*ZkaU~) z+&W=b;QF;vH8>90@*MO{g&`S_6VxqDLMYb5G!KtkkQ42a~@$P-QizHB1 zkxEl4Mv=#8g^7Xd9t00q_~W74P{tq(1BeuGe*^wnFdtBxdWx17C&{ho2I2!7JU8j1 zw~T|=&u{2~fQb3lswMdX+> zK$}wOU~JYGRbG?*8A#xS)s=ayJ9nlje)U!$<@|#=QwF!9yKvlW;My^>RcZTH$A`9$ z9oP=G!1UinyrID@T&kdI@qDW-9yIqzJxkXO1eIK`EQ99Gg&?Z>4I$8QH&z1<)v!#1 zc+^1DtVw-8@%uanE2~woXUnj%`c@!GGgrDoQ+w`AtzNHc65PET-QzS&)wPc1+yh&l z1GOqk>`b_&Vy*74di{#W!&O#vM{n2gf$-ew%9X!Ni9&AQE83eQ&Mr zZny4BQ_%;vS0B?lY7RDd#Iacb*>bcp3>qdLHU_A6NOQ~-BT#llfL2%D7vo6ol=&qv z+N8a~uUxsZfnuz##AmSe9HjJMwL1|*uE14YwD#XTWr7^e0vk{%rT7 zn&Yq@c06)$;CN#Qb_i11k*7#$ogy`99rub+H=8GEt;kZ94UGmKU zA1lVes&AK-E33E6RqgJUs>60{t=-3Ti-&L!s~2$gW;eNm)XpG6+HHa!G&fg$*IAo3 zDrP-Q^c_lrv2mH2Nw>v&3+^VYtl(OtS-vvrU@#RPP%Lc+N+Z`rn|Tf+)1m51tQK?7 zYEvtts{}HY)__P!me$2U+3DS-CYyD4Zy_Ma>Jx%q05UebNKoS|%PnnhY@i9@_5p*) zz_^FIZ8z-d(jI+dAqTxT1zm5}49wk`FQcHviZHibss|Yz0;e0sy1|s9nOAQGU8c?H zaCaG%wC!qfr|>bk`f>ToaY=qNt>x|U$+ zwpMVQ;Z`in@-tkz(pZnD=vKYMbFy(I*txljTPyR3RD88c!+1K$?dVrRo-+0~?Q=TY z2RYavMCmLYHRnj@E}POUol{6|Y`g6;lmZ1b>_+XeWZcAAx8iZ78uy@f-?;TwIF}U% zn*>``-Q)P(yKUFRu3oZp?&8Ej4qUferqJ4wLlMvPF0=kjw`@(JcHXB@Z+Si53?#3i zZoQ@|QZ`z>eK(Fa7TP3-;3{79dME0pAH843L$;Q?JaSpU!GZiOOAp6-dpep=7Q1oZ zzVbTHy|>fq2{!7!5>+DEzHE;K-s>$p4bk=ooY(TNDy8ma+eIF+y$lCOoE{GG$^^5A zO-rtyzkQEK0-6)032mPs7tlV=;cjE~lAZZl72BbNbpPy9nU-AM9S-^zVYUAx}?vxL-bl`sL zvOFEsPJ*!)?vrdo2J?Q`%f!eyR<_^pJ#*-TjAPz-`cdo0;NU^8yc=NeItU(-c)dl4 z80aK<1*BKUjyLF)Z^;AA-p$l+_U`4#dtgWF{Kw#+b@m~f3R^o&t#91xqHG4CzKCA$ zN}W4eLZ&{5J}JM|t;+H3H>wboPRMK#6eDd*@GMX$m~Fl zeoNMm>iL}YB=vz4kKOUEa8PzHv$;&X+VL0N^L?rrSNe3X8M|HUq5_uQ_pWeo{ME_> zS$dFkyh}^_-J}C&YezqVSeR*L zukL*>w`{S;<@@Gv(CI0uqSuN8=F#8LH5R=!bR4{;j(;;as2MmWj_HTPO948NsZZpA z4Da5vx(ADH?*VpOlN%O}2;bW0Kic;3ush|wJ9-cvyQ#-+dazwf9417}{fP#j>zn=e z-QnO^6mbS6a8t&|bAxi+Xg&0DY+3JmhIfyHUT=4!^S~1I?tMLAiO=G^>tGKl@ZIC! zkPGvAlhwGar9np95)E^1=EqchXGL^muIN{>HZ7MGm?Y zY;?5!9`lK9OxrhjAgNXJ8@xN$ZTTDSe$T`7#uEppRSslmUErwAV>swXX1$_%K~C>z zzm~V_PdNCDtw$Qz!Si=*Rk+O~iQOl)AKc?{-WHMf?saBi4_w@K99KhSI+}xSu)&?Z z&hmPzLUy2I<9uYc-O_HCkEk@KbH}m+`M&N}QC=`&J{ooJ{4}Xx0&UD2G?tKrjFO!?p;qrHs$k_5**YBN_}RgwWGX0U%&Uu z8=E0R>B`&8MLlz1qGE~3n&z5u>rps}=h(VG_ubY~GF)%)DEn@u9WBfc^onTX0qhac z<}f+}1I>*_9=)|E8tuy5w@`Y{2T&qs);j#*1^DjL`IcArP?M@TXe!_jc3c{}dN-f9 z?Gc%#9H!4Z*2^uF_G=pcVg2SBdWga+zZJm)qPkxnLGAKw1E`diMH-ukq@Dc$7ZlWWFD|@_s`=B16Xzyb$o&&1fF5y0n)YP9N_J(n5&wcyE zTWcujzv57ru_@hdJr|&dx(#E95|mu$A)1ZrrOx50)y-c%*Z7xhzVOoacIV%X)~+je zV8b}zneVD|Q-dnD5X%tMtgUvI9=B=on%xk2&osU1>qLT@HeO!@iIkxIo102*+~TWm zJ_jChd(N{S!42=O^B&2Kcrtp>T&dpq_#0jic>2Cm1jgRAZn>y-B!?*&4dJY9T%7HQ zAUE}d9+_fVPv{xw(E0I1v!$=Zn`98OzIo-X_>?&LS8u%4^#7C>=7-Je}ChxvUS+q`-V`rONw!#KDxjX51Ag+dv-UZw$g0xrXMK90wj z3*I<_1B&2PJmuB1CUxK#IEfd~^9G$ymTYg6y*X+<#e;U5w?;cjccZ_fd-#!3Tg&7= zQ?5}ATxCws|W%6X|TVV+qT$)l9vp73SNRYvOnsg&uN zrR#C3SSu4D2_;xLlyGT!+M`$oivtN|s21^GI#2eVc*QMU#;BM~lWAi0@MTcKe6lw# zT;a5A+214ojPf7;G@F`?XtG_2yJ^=^+;5Y294?I@?}tuXV+*M!xG97vbEWnXP3uv zX2)xLn-A<|?-A_9xt%9rFq?WTDTvZJy8dWol<2}PeTlq)1=kJWvEQMe4q%$$D%V&V7fQfM@c`+ACLLIkWVw^mo&9p_nDgSONLC zn3Qm9yigbYyYnA}B9`&%rP!UPhJtGM3~T%3!hoO9$aV3?Tpc>wYTs)*2-6A zliypp{0L>Z(NDO&(cYMUYt%u0aXfPuBa~&ZkoT-RJG$zoG{FC&;8S5Ck%%161&d%3rI z=|hvFtq)L#Yo{-|tL_51&Nex>n$5$vPP@||zx2r`o;Z8TScUj&8i@8H7 zTUN#$J89`M-tSg&eCjLsjaR6}4rj-6wt3W_@#V>f@W*?j*=TAtfmy~Le%T7^BUkU+Iz^OA z88iM(M|-0?>a|YCbCxRO1NhLjb8DZQyfc|jW)nq0FtqkaW&G9rVnOfENQlu8{Zvw3 z$}hRU^hjk~lP}Jbx9F+gQVj9Jou}P*LTy;K;>OYI4=4)Blh=|j6W8q#txwbZH}@W; z4A{tpBF0qI=jrsh?~Iq-iW^6*&*T%8QP5-C2vZT&56wOuVD z$NR)DAem*;?dcjC>ps3b7JL}7i^l7U!nVP&hKy$J`Q^(Pm&T@;DV&FCm810Y#R*YGDIOo z>!Qb&0T)x+Vt!>lVa`J(SUIgCj`w3vx|C92a-LL^%B;VfY^}M|O)1CL<4M^YK5T6^ znT_`+)%cz9Ym5N$$s?4J;IGy`X}(KZQmxG=Z>?>$yW3^3Bo2#xg>l0k@%lWulhEyV zmSeFvr&yGp*vlAZ9L`9;m9?H`LoIN^c3}I z&@59AsguIuvqVvhVn$Q<58W@4j-@P92H9D*Mg_Am{2T3n>@xL=%U0Ytc72)oDW@{( zdBS+gR@_)(eOdl}jgm$_b38Y$mncF{HK>FqYa+r)%a@T8_Y|Q9-779%2IoyqKY99z z?)ge>9o)5e&l49kepz^I=`wWo>HKWeZ&G#RZjpF|^HL>{%ow&8k*~<2FM7i{vRtw=d!`3N(@{(nMW5@dZf}SP^2mb<+rR$*!zW*HY zQ!&0X&aISu^2qgAy~E6_{^euN)xYKEK2?LubPJeSLEl}j87pTox~n>*Wy}5^`DX{k zRws2WPnelX@{8`TbN;jT&rV#TjFK{T2u80JMC-*1Y?b^gP_eKqQO1_l;;MVvF&4_1 zeWj%5sD(4Iw30raF@U@~KMjx~ZQ6~QwJ4|1=x>Gmp@%143 z$(g||vb^&DsKuAcAKqzQbE~zza8nTjHK1JshVp0jXpo(T(&Ouawe78H*}FG_{&95csaDoa4pV zOG&0Z&e@}kJvV+pOHQU-AhhU^ICvKP&mpQFGKPZ*A`X%uDQih4nM2W>LvxbiLY$y+ z;6_ShZ&Fo^va0E*s%B)Gkr{H|MBG&*EJNa;^i8AYLEYUNRZZYPk}i;pebwAekOcfG z__Kf={8MCxFzT)5a8OBHGP@R$H|rsBpjxSKO%PS}1#b(Jsz4VCfJ$TsdFtC+?T$3| zkQyIzvlH3MgnVGn$y7j6$@!%lX9c7pYsdr{8V6?_^~$LqlICti{Uu}SK0&~dcwH~R zpL-4}vxO8jmq^{$5b1|(MY;k96o<&J#*{~|hcO`uGBggTk{jo~eUgH@7I07m4)#*7 z>m}GFMdl@Np!T1dOjwUiuqXI1$yi@OWMlF*Ol&zO%7@7T)pF{)#wBf4!a*qxz`GYE zWgF2x@sP6}+COrzhaS)c1aYk0%SaML4|+@_Tw;)VK(%abB(roLD;=y z#=%q^ zBi0wn|C#P5zTJ%ru$zulUuCS2S2KEvDJpf$GB6HsQsY0&-Q=@H@a@7L@$a!cjXdP& zeJT9nLfEUe5G2nmNY0=jIfjN|aWE>u|Ao@6eI23QlUn@HKdGkdv$=zub&*yUD^9^L z(KvBdC3KDxWQR9oU}LMc@P(xBOwpxAgPIX=t=@7k~nx$0Br*Z z&aIb$a4;#HxvUhkm1L5y7vL+wU#4D+3$?xM#Lo|bC6fd${5mJ?rQw9~$zyZWnI_=$}qhW51MDy?W;j@kOU6Wm(7<+52(B9 zKSgXjoHlJ6#|E_yWG(D*JLI>ySCxk!MP`?+d%RXF0UJZ`2Rl5S_8fXJMNcgr*rUF> zPiFVZsK3plvDW-Zl_21ox1>&Io(t)U&99MPWduFQ;2G0ppjj31Z|B6c%l5m@`9V85i13kI;o6-Zx-uMmAL9_+oUL;vd7j!(N%@>fad8j#TUgEatQtw=7`;Rf(PS(b;-H4C`Q095+|k3UAQ((4%YD3 z$$mL{Q0wg!4DyM!4rEPR+rD@#?oWMQ#RsMX9IrXhc+7Kv9y~WdJy;`dNyNddoK*XW z*99;b2U%5BK{{=of;kDiki}vK_SGD)9etwKP8_&796V16UGexnr;!kpB^d)b9V|3G*1*c2t3Td)W%he! zx)9?{*1GNRueeU$8b1%jADo5*VrAI@I*@~15;+jQg&cs@@U!l7Q1iyI=o5F=s?Tu^ z&0E6(-J@TI#K9Mxp2rM!AP&mFgW(g-%u8(tq-|Tr61KI@ych@Uvvnv3PD`g}bM&~I z-EJ`w2Eu{rGNI36-WLuENt*-gp=0OZZ1bRFRpKSuf$0tVj05?C;14LDIcvBu9)`w& zJ)i9RZ#a++l&obB>KhDa+O%_@gQzRg1syYeNLn077w|R3sM^m*;vs_vJ*qmSzR^9$ z*bzgOcz+-sqCa~}*n&iTkL$SKbRp(pEndv0N(Ta`rRRZ91L_{e7#;@2!3FArJ>ay) zpYGU#^gwd~HCAnBUN?*frF$a1nMpWTVsl8+D>x|OxHLT&BnN3OLmhvr=D=bkFevtw zw6R9pk89I|#OI0oPsBh%GOXrB?#ep6$PRx%*pC~+%h)?(>(ME(n?z1&{+Z-rP z^1dLW>F^Mbv5s+Ki9e7( zEL;i)>5K;;hsePL&q3m2M713lrjpc4tq1HA{@B)UaUhHVXT)YafX(!QV>7U+t%W!0ieia)pHcWtA_v%m*MnqAoH#T+ z;B$l;GbA=O`NFm>on8ge}_rJOjHVZ8(q~SiecWy8St>c{H6X+_iweKMWFD{U9+ z4z?*G`!~!P+mh7pi@q`T7viSIukEDEf%-?napc4BZ5_ivI2b)kn;3p#7qi(y?IwW> z`NfE__6OoXqGR#6(qN9hajI=eEDQXegN$qax;W4>5Dvzd;ozb0M-Fo8E!(yJ5sb2V zVKrSy*_ME>gFoz(E*K9SpGsOBC|34*@T=m0zF{aF$R|!7<`%!82f`mYh&+%s-zP3o zwvn0#aN4%^X&b3|AiwpmtSweHe<-g1D*b}pWEhAZjA)N!-}l>%El6)Avnb*rif{(J zhC6NXplyy#qi~Mt0_DI1?XNM@Rq4Ug!_fo1b4!1K9u#p+y(0&T0csxNcC?G27quRw zo(u6ajUrv3Jo7K62frl_)GuBf5C`ai;&<_YfK#?mwnP}L9}H`yrQ^{)r28Ea?v@yS zuLtruaB$%T@M{@}EtnoqFVBIse+$335GS=A2)_hOS{n~N4x|GX7r;Y|53F3%gKGoi zAfZkP?US0c+dpoL1H}xnFBBhUBas6zOaE(Mn1WqAa6C#W{N@jy=6Yvk3t9%E2MKl{ z4m=OB&RRzfO5q98;ekA+2ONuWL5z{?9FEuJm=4G%UgCNe2F8KnwS@RE$oM6%>!JRp z%U~>p6R~~(oiJU9HXn}FVkfMf09_cnGY1sfIY6o zf!RLCES4rcMIr|U+fn30Ot1sv!0aKt#>=$2sFopdU_L<{l#`cgKVVqF)b9687gFyB z)c>_@C1TgQj56`~e~H>NFenc6evS8u<>cksm&+ck-80rf#Eb2djz~z$PV$x% z?5l+`3W?zt2l5HY06Fk;2kIZ&9LT3x448oxi9DE30H^wdDQj^cDT3r$CqXEql)ypB zmxjmnFRrs|Gfdi^>36U>I@!9ACxFyB`ZP(U; zIoQm$VG~N zWb8+b1JX4I(gP&uLF54LZ5fCy#Oj>Q{nl34an^+$Astue*syz3CHE-H)AnqYJ}Sj> zjxQYhrGBCLa@cWjWmyNtLA#cEUP_;gtENux<4N=_i1=Ly`VO|epdSv&NlVD{+~DFWRNIwg=9Eo)XTSP|k0jL=LETIyDYF51s?B2lca@ z!kR}tkS>TL&yVtp1Myc9dz?TH^o@pOM%@vO^Gpw#wvT!s+(BdyhCk|zz9XY&bL;0) z_1f5hWx%%J3LiJ69=|vc?jU)v{fNI_M;*|&Lj1RMq)W1?()-a9#ewRK4kU1pi3egR z+B^zabEF75ptXti!4KPdCuoXDk0kJ*zU06%WIfoS&awyar{baEKo}2^5)R6S1OH7S zv!{%*LjT#NVaOajOPvD;iQzXrQ2Y1WUOFJ`67)nI7!Tejq64XfvJ{UVScc32l{F5q z=d|I#x3SlIV!uKn4um^$ARe^s`w-thS}b}JIY@;c@pgc1`&dYrd-$aXg|G+Fw)Q#S zS7J-TKS2&G1J{E@9H7V9jQ8DY{ALSqkhgRoa$wkP9wIYNob{_;hXci&_KbF)gn@Hl zIv}4eeKrnE@1qWcbC z0S>^QNoF2f!$TW)8F?|TqAn!xW*oecJB>vTECc0WOhxr`BuPO#`WVTNd+=!)ZR+(w z_$B^5E!Ogl684p56DjKi(RVb*ZyZ4HcMOz+3HT-YEOHz-+St)Ja6Jy>7lgmff#)TK zp9K8&BMe_TSsZALJ3;IlG2r(8JvZBy9(Y~I;X+dT#-Il!`}}WGc@A>3g@y5vXc?#; zj7s`)WWsyNdQK?;Yid%k_C6sqoiBn;2)9IOt^0ZaRCH?LGEfd2_>G5Yn}dko+j?eL z+t`IaHx6_xGds|?mhlDZ7f%`o&-yxRoD=)^6kJh+Pg2!92!G^2dg6If{um#gI1bLi z!4zAdPmmoX;A`Xex;_PWn+NGY4t}pMDQlgl_)vP#`q9CzNetB%R7*I}^EqA*A_v~i zJ@&X=27T}xcpk)sxXV2Ulyl|2c`$&p+F+mh~3ue6I*uR*lxr>_lZ88R1Sn+ zV!DvK2k=lC4>k4>6DTfF|5zZo=YVs>h1Vgt#2+r4LlW0RwuRGO4!{^V5Z)LQ#kJvQ zzl-yST6_LjE6z|~yKosW2WAHm2W{&0Kv>JRw8qgn+ql2xzT}DLKyB9eMCrElJO_Wx zLkoYwc8h~BpRTcnBtZ`*B?T^8hO7tFH^$1_=t1V^4B|4zET7q9I+>V@C$^ZU6M&bM!3 zEh1sS9BBNUltB-`fNr;+M^an+_BI}B{L+mM2bIn}p&U%Mygx{&KYlGfU)AtXbI`%x z=b-*+qLZix6LdhnTz-*uY_QusC)0tT3%PIy(SGB^+l{!JB9!s5!Yy6~YzvwP_dn+v zaP)1#`v&na0kSmx+ztk2qWYGRaft zPUR#C2eP>Aup(xv`?Q|NhJF?CP^y?gO9Oao5$y&kMdY zd-^-8>VN+3s`{^VkCprI#j1~y${%FxfDU{S9r%5u`~mhO|JP;CaW7ZDzfyhOeeX;E z%l~+0g|h$STU^NH?%#!n)6WivgEQ3a?2kJ43EJo;b^G*d#o6DQ6&I`Ox6fDA9dP|3 zn7+*R{KpZVLw+6kGq|vK+OAa9SK(p$VpaWHxS0Mej*M|HgaP5Fm?<&kb z=AYYtD*-2I@uBzp-q!l1s(O=r@4&&=;AQ?pg55-FLb}_CV7VeK3hyBc# zdF}s`{<=fqU;+of@c;4C1Mj#~ADfrok5ym zzJs z+eR0@k84W*hQI-Cze#OM9_jyD-OseWN@YuVp3D~v+?yQm?Y|pc~^dlAS zw^NRR+w!n24rU+Ze9F^Y3pVkv9A(qo{V_b8e~k<84TA$};eG)51@5Q(CUXR-kA124 z<-kFKZBPFic;Lgo(>XJ{*iUEM^K|y&Jehw4-N@bsvwY=O5c!NLeaCDa{FH?bJh(H$ zCPv$@I`^Odzr62Ua?u@RAhw`t=$^`dLVtfrb4UN$Ddrzn+$Tjh)P~^5r4wsa`r6vV zm!`>EYts+TCVN+=li6g-@1f7urthC6d+)Cj>3)H5zTq!N`;_-GWna07-4$FcN8&ON z4q|n_DeLz*7>q6S+g~w5g6^jHE^HyrBL*Fpp37HuMEip1IQDPz(7BzT%DyO1ap-|% zpn8ztuT}39{HgiL0xU(?&cm8x!3<-~n3@0Ey?Iz}J;vFTozagR)0F zBoP+{0uN>202);U>ZH&5FJ6YI2eGD?*vJs$z-&RjzSZufa0mRx1Ng;*1P*djBYO;~ zjAbrb51E5d-!%ZF*oOSRq@qy|lbA>Ob>33TdmLaXOEL9L&GhZ62V+>bdyUe6>As%} z!WR}nIP&*d%P0IbC#9f(`c|ACR9B9t7wuOUwut*2uKJYK*;H3FP&85{bQvIAs z5p5yjWv#JulxPQ$gTnMcF~Ujg7uqqBFa&=P;-vC04zyo-5c|=_7EYi~)IBhpQ&gN- zb5QGnaJG2pY`1K|>w(Uf9waBQZ&aNvPCURt(ZX-@NTlOB+Jk)J$>ulO!`e-eG7=2g4?z^T7i`v$Q#Z}ZUN z!0;=7$0wdhf1vv;9iJFEIDkKL(c@tO2iVwwWuW7Qx?ez#GqZ)Z9vBD08?kHM!e55I zQ5^VwCH4y%ha6Z2%z?#;3pptI_#+pA2OXC^bU9FYCy4{qRrag)^Lmi0ZG|mJM+bU( z5IHCse?U1Z??iEsFYFhN;-JNYbil-O0REFYmsXFNz<^yxT+8Tz@^X&E>(NQ&;4$YD z(TBDzoLmm-`NWPtsC`28fs5AClc+P^7Q%Spq>Y_ji4TkML2V0p^aqQu$9*wRu!lwu z={I26BlXmOBt{J}}%;Jx`oe>*(RC;HgnFn>_bAGCB}u`Qgme&JNK1;&kvb9(a! z(e_z)IEXwP>>E$wd?KA#-8VKI$kzpXKh!7a_(2X%qEDo6ln-0r6KU(>I6V+oC%#`; zem*hk!+Z0IO`m9e<3d|FX+F{B6J-kv=h7DXgy<)t9l%2?KA@bF79Z$+j)Oii7ruzK z&6L~gVWwjd4|Ga>S=(u0#Uk7RLT zcz)l{rL{RQU1;Oic8dcYk9yE>VE*7F=|M|jzfGP`ya42j$kT{^Vl+YYNYc1OPzQZF z%|4BcO4}pM83)sXjHTCceMiW?4Ts+QhtxS(ac0H=IaV_U&en%^?4!18VF*aX1GYJdy($%(W5V$|BCM<{B!62I`Te5>BnBa`L^&_RsSozxBl<_ zi$;`w?B#@V@Rh*9>+tZ85v3n{`4-?n`ta?@!T(CT{|m5755&P=`8L&qf865WTSX7- z-Ohr(4OuIF?4xl`LWig@FIymfu95E0-s#hCcD%Z?W-{$~v$N#~(aL-7X?e zA`9aK=&0i)#mZUHjggvIF(+Q;;G!7mKzyK5x#BREt5icAC`ODN#PNd03>GJ$3eMuh z{3s59wTJ`7iX9Gwe{dXJ>TxhB!7dR8sIk4TY8(_^2T~5mUZew!9*Bb+;b6sq43RO3 zgU*;q_{lR2Jvit5+r8o-L82Z^%2vF*h=ZiXK^!;Q%e^O)gQvmX=0KnNn;_ByX{_|% z(6Pcn9mu^uI9Ymd5s252s0UFOG__cdnb78D{(uA01I-WhIdE-%aHuUvvj$@eAhSh& ze>{J+99OS$zu-;2@AUR`glHW_X_r3ayZZ=pXqr1z-zZ^DEl8SAs((hGSvY-ieq!Is z`9wK><5n?xqX-Jd+U3YF`~elQ#d9!%gI{fNun+!yxbWgw^9>05-gu9L93I^GW#k&b zpMKsHOMZ0R=HRo%3E^M_2RE(l4YP1dvTEuQL>y$sgY>|3fpw1fZh)+#*{>Gk`M8u! zD%RDg7{8Ib5#k*UTnttZoa!qMkWcL~S5(^fky8xC`al|1-CP!h{W=CUasvtt#{0-D z$tSab-~buF%F!>-xPVJO zjZXwj_J?rb?M9H0x?mr7T?!FPf_3uio+Gk>9+R8R3;99)LQ2Kq)2w26Z^9w47S z85~rff`eDV^eP;HU6O#^I3PY+dq~=1B=A=y{b2!q&Z+QylC+pqpUC|umCyycP=7!2 z6P|;i#z^N-%d5!K$hCsL4#!~qUH2VV#evL`lu;74`3{ht%bEtUXSB2rnQ~m>E~+d& z=cYl(T8=G99N&>dh7>36P#vo2riHWV5BfXW8DH<8Eux*(-n4O5ri~cZ76;M?%L51E zCl?22YYy@Tzc{dEU_LRYRZ0Z?_20iUU61-+b08kTCeb&R?Hi-)lMWaMfrp&5#Osvw zz}laS2)~|@f+N_18fCJ$vBoQm?=mTo}Z4Pu!kb@l5Ixt)g+}fKtN7>CzuGhKP+=+IXgQ)XMa3DR%PaX#}lKj>YdJs7{Vr@1fe|Ta!Pz?WQ z9M~8^oCIGHIXGwwC#i2t4)+JW_OJ0r4v3$v|BwzG(1Vl2!SZ_Wh#cg-u>v|b$i9(k z^~TOIK9J9E=|PN@>v%!7AU%*Q)`P%7CsrI_jC2_eGHfC1#s|UHBi;k}qb-onY=Lyo z7Kk|}fdkn@y$p~8S2*{P102}*lT+W$_HAilUL=tN);$j3)Huj{_ApQm-hhLu)&u5M zZH%~=fm;%|SjYjq6hT@X5O>?7%EBKwsC8k09OMP}!)gu;KOAVz)UY4NLyQyULz;ep zanst@bGP=X{6uhoEsQ?9ch%oxt$)L~6bEYG$br@gg3haNi2gxb_2YwF<8U}A-~egq zf?|p|f;cr)Oa9?<;tT+-0|fhxz7X}$S_MI3-z zHW1riT!<5ibY+1aL=Lz_?GM==oGo0SPEW%DeZnDQXYiRGu#Wh(HXVo@NEdpxklPp} z_6fBP43UE!Dn*~rijuQHcFeHYk5;GxF5hy(VCr^7km65VBBdZ5bb z1-G6p1fOWw;X%ItP#$9c(X|EqOVood0i*`Vf!yN3`GXQ{64^s3-**@f-x3_Cow{S^ zk~TH`!YBPdN*BImIFR1<#?BF&I5@ zTEEb0{|^2Z2eJu!R*m(u2RM*T)XR`K*rHaY7xM?`LhGKZ#)B!s`pEf2FdKgOh`MsM z%R%0=hXHY*vBFqV1fSUD0BrRf5?mY_BL(a>w}Rg2S)C_p4%%}_wJr>VgVQd&)W=%S z&mD{t%^ye)GVn`|;KAA-?9;@HyCA!gZmH}^?)6|u93fA*2n^6A(D9Sq_x&DUU&GG z;b0xur?;H@u@AY?cNL7IUNajWDTd7E?v&Oq`|Z(>%f15_KNxtBUL3m&R1e;lJGcFc zb1%`Jj339~)$f>@NHdQ z30PJCjQd6vIFbFZ&8F?sdfCOk1(EsO+7^G)q^e$n7wL=}XS3qlfrH8~#=$lmfc>@a zf&=-M(YFT&fdczJ$P5lNewf06#+2T74#5^=k`wxTi|6IPf)8Vj&c?A%Jys0!BKS?; zCoW#&4;LLzImgBhTtm^eEd%fes)u4a{pLh`mzR64zE7}zL32ej+HD4Y-tnsRu5*ci zGhoH1EdK59&_~9;lGE*3C(T=H{A9~OIB;qgaMKPV2aQX4oJfl1#oc{|Jl(zk)#O9l@qpreQn=>)qJ zOZa$#cnS{2WVQDiIqcuh3Zm4ic)C=I&Ao)=YRMy!($N zCNV8LkPcM%2XRp0FDmu-Yj7akF}v{VeOEo!VxNq`J=pt$9TJAb0TnyNB+nYoYVF0? zh+6xGO;}4ZKzjeE_K*0*L6uhXRFrx83bN-WdaOl5Nt>?h;8$W`9Jo*9Zu}z3`-T)a z8nxDH;91~6&+BQv%$`F@umuGCQD#}gf%A_g;tn-cxp)~G2Rl^r3mC6nnPtbzkmMCCKsyQ|=Pmr`LHWmVV ztrNNhF9BxRCSU+HtuPe=UNiw_hnD9$KDk|GJR7DR)zF{0jb$QUH#axf}rBC2K{+?p>BO=;h^k>1-l3H%x}3BR9H zNP9da5SN1A3vPhIQa$4X_LPgHIpSCbW(zx1N#0s2s$ShVC@}3ZnD>;m%_rHI5&RWC zKywOn#Os3eK?A3Zlf2~Qvrx-_S1xB8LC5TOEr!Oyv()Q3IGpd8D^SlkD!I;(IJiJ{E+S7O($OqOO4^LdnoL~ReT8H${t-x)TqHji9*{Ox&_GJyjmH*D~I$toLD7OeB9Q+PbE41fc4lzP9L_u6!yPK%ABGwdR4 z&)8OsHBGP+uBrP>FfsrRzGusws^&R$x@&=) z<5G_!*{AK<70SaW?6EGn&MWxG+`UXc`Mv-9FgS?1sn|vOjn1Oi1wKvnwfjtoZ#x?o zrr<(mVXf`HSiXcj;1>3&%29bLSLNGtz#2x{G5|eLJroqB-oE?zg+X}I9@eZf9grT> zlD6_BY$J<#kU!P+bloA?0<~yy(AEKKLpV^ow%gkLT~;;N<95ovmWYGMgW^lR$LRF| zT`1^FeC#|J4)Fh855z&Kx~k5?-{YXhn1OeZr0fsU;XwM-u?caI48$ic)`Q35poL#N zoGcE+!#8aih)?{c;n#%+$N`U;Dwy@(iq9G66i8W%rUo=MqJ5qF>Ev_2k#q8+E(7F1 z_;FYMcLO|LKON+^6R>+8G>(>t4?nKdIqp~UM7;`crY> z?OZr~yQ*!i-Agc+;5T8r2okX?tvm(!5sgQ~v&-0*jmh1jWk4Jxnk!J-i31x?8+Pyr zqp;~-Vqe6E#+njs$NMoQ=amzQ|d+d`=Vp@KIN4J4oWyEj04$4$~Z~4Uh8FO z9N4_M^k5MOHO91schNTZHQtV6Z|OqAL#FW}x}cj`whWSkThPLCphYEtp5bHw=Y?Q&+K1+9gE?Xd}%dMf~9E=y>LF+PIi)Eptic#rCHm&DwZN zJcrZ3gSQFk!WFLh{t^}jpa)OB0td87<~cwIq7RVIpJl!Ff4RYI*elXO#6isi+tPzM zGL=MKsOOLp`pd~cI5_i3&q2_Gz(Gm9#le)dwI|z#Ij*yit^x<77jh76DRQ9aI}7U{ z#DV5zxT^#^Q=hiLD{MYbFVaZXi!Q9hx^0s1!x4(@oJOmr`) z;h^OYr)>_Z(C%@a9ij(1M&XU(z=7tsCxzEb?-SK8#6F?!7lbDb`cSoa z$k=ATq_%}5;Ad_9W5h3ii!JzANp@iG0}sF_>YW;KU=Lrge)*0Yy_Dzfum7L9+sT_| zI!j#{Tb^4Rxli(-(yOON`OECO9yk26F*+KC$rpr zH@MHGr8~P>I(LBr&$?!Lh0OtQ&{XJ~wDlebgVF=pL=?sI8cQeGtb8T?roY$TTUQzv zdp|0_hfk=V-Nrq17Ui?D%nwk0y$nqc^dN>km6roNCusDdiBnCirq*W`fRp41(De98 zd>l#hP5rqwKNo?YRSXKxlvzKYm~g$JaX^(?i~Z(zu@=WZiW$|;TAP4h_vWV(_URkc z%%zBj0?C0Z$U#t{_M?eoRLq{%9Uuo6FQEZ1A=EtuhnIqNiKxA8&dB0uw&U1n&UPI; zRbPdhyyBNUlPOS-S%#qp8Z!Cc*~{HpbszC_i2hwQ%_sPI^n`VW05^y|hNV6~l2oDq z&AU*Vc=tCSO7ve+ID0s;P0Ii{NL4NQJtULQLje#!r)ajUSpVDLJ=f4KijyWK9KZ+u z3qO`CW`qO9i*?K>8#qc5j)(ZT_xW4&-M&aj!iK%egQqa1uy0^qM_U!(%H2-tR^GHVYf-Cpp@4-Fh^UCrG<`>Mr4EcFwU^};k z`Vu3jsB-X$_`?Dz6ZBh>dWk;K;sW-?bc`2bTovyx6e`ap_{2$}3$>Pk`9ys`QUP3Q z{X#BZj%^o6DL)SfhOvz~Y}Z_bJX6-~xf9QU`rd@{JIl~GpmLMXUw)Qj@FRvR zZMFGf+ew4p>;NvsL2l2yYtE*#43LBIpP~mA8#wjtvW1`neGcljZ*vjw$N8gD=gSY6 zEl{rAcO5zh%<;(vB<90B54ArK#x`cQJ6!0vM0z9c;6QV!(gUww9sEiRP!B#Nfo}>9jDrg_%O)InpXgfnEmjt`w85?RKfnih z?Ag}Hfovh@mD$+f`vpGs>5|eopx$N^@F0Djg3ToD@*oa6TqGf%^hUzD(gkk|;#Q$! zXBn6t*t;x>4|EUS-+NU3g(G5PeW2~(q2@xzLtfJzol9Az_Xptj6DKVe2FAfL(f3@5PBy z&B^`u;>7pjMD&1u!N;~a{y@_42l9)u`<8Tkf{sf<-*__P#7TiI(1(RS4Gv2Bw{M>~ zQT`y#Gy8tQ+EM+SMD3e4I?#!Y;(qd+>^M;ze7nbqV>pmMI2b2R)xJ^EMi=^iA?8v3 zZ`C-ljrq`RadmRz#I62(qWT1zO9R(bk{$v_nn0+&K0)tx3`UpkWcwf=6qswRio0+btrD`i=N#x zVLr&d6|86Ou=RwtPOGw(Oxu(bC6;|)JwTrr>nPu)X9euR{%P2boRHRjaiBRu^?9j$ z9y~Vm7KIT}b~kwY$emyR&V!;P)pS(|6|WXGrvB zm?kE46Kl~jWDc%UVafABz@>Nc_?Z=9rq4HN@N+!1<2eU%XCDkx2P3gBm_Nl@(p!ec z!4CDKz4gKM5p5kszY`!y{ZDM@TXA}h-=5_(eE_?3-~T9A$%oWc$aBu+7oEGt4BaWc z5^=~fFb-t0x(8wc4E2rDeZ>fga7Pa8*}VcCsDHByThRMH;(HR+k~`j{DK7%h_^32MqsjTMU%4o$cqm@0kAp{_w9=vjW-rE@Zu$Z+)Pe z?_8*=9ruIaegpXkGByrSBzBZ-{81x!1@I8`w#f%=mLU$bntU{aL;I}PPP=(wX`}b&P#$FWYPmf`XEju_Jb{8 zj($^X^QDms*7k!FTEBo?L)yzw^}y=5<3?Zb@2MsDz9?(xcKxG_aG@VjK&G7px6Er1pFzJ;|Z zSpAQY`k*+06aS;F;-aYig={1J90J}f_mVot2UCt%hRT6ry95y!b(9Hw1Rj#=3H*U# z0sUZSfsl=38S5;~-L(%o=guMP$bX1Dg&egEl7pW|2fhZdk`ADB-;sQg?caAFsD2;Z z!YsVMeJaByyu5-=e6kkbA6(`ffXn|$om#J`G} z<-=;9R<^eH*an08M8ysMceqN{68~ey)^8{uV(}*DPbhEUGE@#q+yG+rk2u2G{61}4 z{{|Vhk(kI%%33mQQ%019__cGO99Y%Bd~iOouzo;&f$tBB;3I^;z&|un!NCL4Nukn? zSO(02YCW2sbECJhYsEiP1YD9u97Oz;pG#y6<@q@I^NG*VCu-0v{}x3Y$o3l@klqV3 zZLhH;_H~1Q&0{?N+Ji}$+lvL!Er#H;vzaE&j+C| zd~ZIHelE_Xc^BcT{hW5sY4;o*$!X^TDY1Pz6$=h8veszf1kWb|$NEPgCH|Wz-Zj?u zk+c(iw}}<43unLKo3fTT$uY}-Z9&srla~j!V11$179**@^gK|AI7m?- z2})!)Y0W+c&cWqSKlNeq*%?)D=|M(cr?yxB7bUfR@K4=~@UTW-sd0m!V|f#uc+;KA z-lm)>Tp$U3?c@XDB4ITkJy81_ZuMERqj?!?Z70?TesRP+!ssRX z#+Se^d67Qzv!M@FUpk>rMN!}b$&hRGxwc&9?^Tq}r-u1==h*o~#ewyFBJk{kku3pbI zP+m^C{bfjcP*6EsR~-|*fSS&?{0Bg*%e1j1en4_|+Rq^=Hk6&@$ZumGx)<|DNMZZ4 z7r)GO(r1Q0pZLkpFya7xH37f*_3TgFsZ2hur0*-;t?JI%s`@8SRMiaGJ1s#c;+zt= zr{JHu4k&;y-kc=Np|O#U6fR$+W^%IqsPD)6ySviC{~wI zSp|%`$HU%fSCWCMtkR;WS!nixyx}8^$@f@*!3GRSORq+omxfXA^~QjA28I{|_UxDo zgG(zt7{EqtMpKz6=KG%C?;khrz3(I0&7P`mO7fC;u3I_3kS}kX4lWQ1TmJXp*k6Cc zSYMu@S)QYr2PfaUSJqeQ`|jH6#nB(4kNSt*%BOQ}*IH30VR2|}_07}4v!n0f_vQrU zdfGGO-+ukD`CZpkoiABN94uJa_|5F%=&%0f{OI)j=;-sG5*B}k4h|h}f*+U|o6mc^ zeNnKG{!~2}@Ak3g!S(y;`l#$p#J=c(zh7bgC{A4Db&v7k^#2(KPHz3{SGfF}po6!s zaeVaP!01BqDSDtEwXfy#qVWrD{49Oktm!lT&nJJgniP<9@TYHymmB62|CVz9IeflY z|L)P-|K_KGR2tbo-UJ=oy*@IRf9nrs=;GfU{m!W|T&_2p|2q$Ou=xgCU(rurb*^y1 zzU+V1n?F5!dsFtN@cEa#{?)BZ{NsNE3;qDT+`8cPm&2pCes6g6J3l=-`kktcH$eyY z{)eMm{|py6y?yk(fBXa1%KjVj{RMrWlmCDHy??=Lv-#$G_cnj?AEN_vgFC$Ff4hg9 z{n^j>9Uc5Z^PS)SXMD+A`oY)5)!zO$v~$tD?x}}2K?lll==e_=A6CPoyG-?TlRv?? z?`@uu4-K*LkUkFog4e(0b;|2cm=gUVpU?U9^%um+?FYsPIyl7-9t1yruRK!~UAWBp z-e1!2o2G+*h)lo7%j3VocNy#N@i*#EHy3a7`rd=h#s5M7{(7^y{TF=x3;O(5V8CB7 zgx=%xckkKP;K2}uTr?Q+?C9?Q{?oFgdi%dT`g>{Mr$=>3^^MZOkbeIIUO!@(_(z!M zzdbtoPv)osn0&x%Q(z-F_!F>j!R!BC|MYt=|JS3V|L%XGz<xggN;`6tQy}gjRd%S6Wuq)rM_dwX;5nad}?_;~aEAWQ4?$9~m5{vsW`P1&P=efli=I}#RNb-ckkc!rk(dtP!b z%c|vXyQ&9t;C-+46`!d3alJX?L9V$lMr2RUt2Sl5p*r}prvIdPE)f{qL^>$3_GC2=48l-H2YqjLG3^hy4E#~bDcZ$G0?$a;ER^1`;i0AusL+`Gc>Q(n#i z@}i%eE{0`(fF8=ZQsy3f4<2ut4la(4?$Lkyr;Y1t!*^f)eqi7GFV8i!Q*=R$?7gff z--E{+rh{APpx(Qx5BF{B_j0cE*?!l)Z_o*^8YBLl?D{IYgYGiL!Q&0nflKMGeLCl_ z`!8#3yOvgCy!yEIO@GD6@)9@e_j2DCeSg5qr7HRF9dDQpA|E<%Eb9-94h)WY_nOxO zJ~w3_hU3HA=%K&8zufmmpTX6mQ(g})(7`i!^4dGzL>>G?r2J>-0pBkJWEmt~E5FC< zLCFWq3*O#j{_xCvq3WTGA&w~*=z!PhGjuRK%KAaOesC$9bM^}F`JepWqP+}gZdw(Vb3J~w^7 z;W|M6%pEsx*4A@pwaZAbv44WKbPyy>cFu?<&~GrVEXrX z?H+HS4%{@s((TldS{x!&sN-+3*6x5j*lyy4>L9xrpLvWDPz`Yf+@ZwC3- z-th+NzK*{%>p}08^OVVb;plklctdq?4;`E$Grqp} zI^~?S+V6a#6LscG+M$=_?m>V1qTB8eUHn$wzrDBhdPP$=AIrrGF>XF)i|H%q>&F^(YtTGySUu1znXkCT`w=E&!-PR9UY)wO;_vn z`Fc5BEhpmxT^v7tvA$d{N3-RNIp;f4z9;`o-#ea=zDr$zXL!{nc`MzM7s- zcj%kd+4&{LU9C2&$#^oEtgd=ySdAyE%ggoEbg@`cV0AV@g4Mbyv6;~H6>YDUqtTR# zusEAco=;yyOPllMi?3+e>hp!2+)U3Xu$)Ymm#`R5ucRW~ax`DApkG~0&c+s*(9g|k zeYuiK^--#?H|yzmF-A*gXXC4@wcU9^^UDRg;}b)z7vtgNd^jEsCTqA%CX1`f)nf7F z$F4?g@sj_?2W_uqRmSxr{w%jvW=#CrP2@BQdU z@BQdKk1wWQ?HPbf4^cSI(ZB)fZ|u~!jRC;cjUkv$qK46d0BIGlnywbF($IAE3Xs@L zrlZwpbU8iDVKY9vBuHn==Z6c7hdRt+L<}8>!K2l1b+ueAXHUR@Lk+w*TTSPy#mVsp zpPwB9vdMJ%5R93>f9I|Fr0sC`WxSd`SrHz~cW-}skUrIsXP-R(e13L-PUqHFH2-qB zBs@B{&9}*LYKV`nPbSYNXRYfN>gIepxjHA1*5}K?V7;20_v>%YfsZSw0L1!ocs9M9 z_Kn;iz^a})-u6XdSKsEs* z{9o+2S#LJeAAk7cpZw%cpH2&T0!EC7!$GTu)n~uW@q-_J_Ti7dSWVBC!{P93Ja{y$ zjiu-#1HGTi~ zF@QYvRWS}4E^i*m>Gftcoh@$e{W(#1-TK#Fx%K14YCgl%dz745y}$ux^B2q3wp-;^ z41q++=)Cd2Eh3UnF8_2fonOxpd^BDCdy&QMB>UQ(4PTQkN_Cg;lz zB+sZ!b?{@cNQfK%Edm@Jy_lX`-yDGuH$)fY2*h=xVa8iQU>dRrv09!@7UlrO%@Cdp zWx6E8SYKIvdMP}J0UeNEJ^9JQr_-OMx)4x6q(j2Z)Bo&;jPXDGrx2$==$8c}dPw@$ z|MbW2fdL=>@zd23d{_|Sgn8czSF6u{^xMDv{U3a|1UjYw2&u%jqq1Z2XUm^`LDquw zgTdg@$GrxsLa(kaSTQ@sp88AjW zr+Pm(Sb26c%80d#*-aR5bgq$Si}TgN=>T~I?lhXcm>x)`k%1xbDI@Jd8y*m0bvk{x zT+XgP`+RYBD9FcWWP;1Z@!dPeXYQ2WJ~qPv-aciBx^wsLtQ}z5LXXGHWmcovV6wRL z)+f)~^L!zOCsPJY(&dwPPR}Q^*{~IlOngYlT^Wa@0pH9g!!xq^wmRe4d4iPjdbK|L zWI*PAcGh9Y^DDuD+ULtazyuZI|84!yASc8rxk3;I;+76msDyZf0IN%r{Eof>eJ)Mo z3jh#;&zB@B9f&wAJTbxp5ctk=0!no8YybcF`(G3QpgIs22I~j!!MA+TpS4T zUrzSSyrZYL2< z{n7GbJsB?11isqu#D>l<2$B(D$b5o4oDy4VVEp!=-uXENEYt7khEACWkoyi-m(wRB z`vaRzu?B-DL}ml#udDULhj-qc+aHSPWLL{e8zyrel3}kNK0Lm|g2rMr8Z8#Ai);u9 zf)46%JQ`1y4}X03&btqvFD4Y2Prf>0;xJjB;qimP>5v3G)t?xpqtO}Z4rJ;M24mJC z&Zooi{P^8jQhCDcOOTYjooK0$i-yKy2#YcQ8HrcS1jaj2pU;O zOH>E}2OwetxO+HY9e@BQFFA}Wjy(yc#<7Q0wZ+$-Qr)fi^7jO&NR78Hg)n$PFU z<#-%XlQXyN6a*on)-JYju<+(lnb`hF0XEEZ=!>mUDqU8I8<*)Ap-C3b#^cNB!-t>F z2~dtj$;UPs=~s--jPUCx5AWW3>)rW$#=nw_QuA{4oZ)*sK3lB_V(5zrC1#n`p|pY# z;~^>X(}#EO-1&5rAU_*37_(@{&@4uX0+ZDTcWz%lF&iHf<1}!&V*TYz>VWuuJRZ*H zXAHw%o)LwQzdl-C(rYV^9R;pdoaLW^J{&vJfsys>7xcB808J$eFhaGT(V}dOPtzjWGz7CKN&H3fJlZUZ5ikpRb4YDipWNBN`_!W z4kPG<>uh#%J)545Ne4g^UX-ICT&xd35R!`*P6?JvzI)8(z=CP6byz7_Z5WRSAC1?? z@7^cCXD74STq$6nOvE{XF_=ujfLrfQiSd(@GNnisLBekAovofcymR}l`%cJ#lt8Ze zlS5~sb7CTJ%&H|5inEeWGgWa7VmN#}B)CTpZ@;@ploPuq>{lz+^^EwzBVd5|O?>-y zN{pj_mk>i`X@ET3lEnDOgMryPz{mOpljle6G80hzH6;N-dl&NX5h=sLLjz?Lj@cNSc@hw z4`l(2BxVuJf}w&DdmO+B!jU4z5z`Svw+|I9M$iCpBQyV7tch_)Zbx@64GtNh9n^_i zhw>$Y2O~H=C-#Q}M_*#sH;>Sv&93<|I$toBpDkwB*Y{_s~` zxc=adF@820CEHzt5FCpIGm0}WmOVXYoQIJ^xvLfd8v!&RFquBNd-tu|#yC-*z_Pz( zuHoQ3`thAR$1_G+At4w+m;le`tdo0c`04%oa|d#cvb37Xh$tWkkSv%lI3ND=!7zrV z_Bkoi@bSk4qrnX$aiF=nL-htE4kz!dIDisd={t0>Mg;|+9u00FGmA%UH&4#JSUULl zaU?zXcDbZ$dv0^E=x^lY-x>^P0_H{~eMN-skKtYMvaZ$r?tL>9GnC!H!5O;nkTfBw z4?}zj20u9e=i1P!bbS~ zWOj0L@^aSDOD3_L4hN3~fj@fxK1BaZuW1B{1dDOZMjqa}b!+jpLF_&TFn}@tWX4?M z(y9Ak_3-vvx8{(EWBRcML8Q(Xbn~3?{pn{6^q(fiUD@0$fFCeo$#MsCf<8qPF;Vp%o7aR zTgGk5Qu_?Zx&cF|e<@1bNG4S|JAG`*bJMY&e3zNV-x>_KNj=SZ)>B`F01g$ef(Ta4 z@WcHvUhZB!rhe86L;#kq40tb;Wt4LilRYTGZj{MzG+{(1PiLAxA6Y;6P!PgP*{p%H zk%zE+dHqgeJosSt&*inp;}P-72>$XN5B+@uH~4X|ziIFZQ-YKG_g~KDqq9-AA{7h~ zB^J~3;py4(^5LCZcgpg(^?Mkhvyx9gybA{KZJb;_7y;@qU%29m)kiG*-MO8Sny6vM zyg{OC$Y4aK1C!+kcW=!S;)7E!uPm)R=gQvIG8fE-pWiIsz*KGIo>J`+#D;UuA_Ru$C_(t_xK3PDo#AbE*)!G&Mh8Y8iA--W74F@~v%>5UO znIY~0gd|T`4JTZAV=E--H8K9qi3|h~4@xW-Bm!Kz1OUGI=H<(m*#}WEgf>h$?g#9A;R;z|91Lkd0@j1G>D3c*{gI=5u7B0b z9*gB@`GPcH$b|p){VxfqakdeFA;3pjV_09|YLnyRJNF5gvSvn%XD-3plDYGeivwWD zeG>LZ&E;<};ABpmFPPVlFV9%id;H0tJ6mrwy1EW|nYo5b4w=d~TZB{)0Kx`ACJYYs z07U6Gl;&6gFjNkPP`93LKR1Dp71f8#``gp~FHTihO@Vv=Z1)}eFe4a_4_&dh6!pD+ zF&Ol`q^oVF;(G7!MilT;1JjY4s^fw5{q*A-APOBZO&hXlvEOF@`{r^oc=QSwU=vhp zkA6MB|9=Go_LavzgPLINK)~vJO#Ckw^OFWVP4k5S6~^w5$E{kTNm1M#z1CJ+9j_=%N zAU`c0Yx^F+0P}+(1MU2SyT^~mj~_KbY@$(6V)@mj*XBm=AJ2h+ruQT&B8aOBf&kdU zF#qUr&GXUOl=TQ_6AbPy3XrnbOMPmT07@1z0tFJL`(ZqqQJww1SI9RQ53RFxtl>Wu zBv>^#G+b^Lb0Nks9eh;9?sE{MOR8{Fm{OgM4ddY<_HtqvP`SfaD}DBUe>Hni#_7s_ z-zy)Y+?CHm(x(V0!lLR&H_cZN;QWRqk-xJT!01~;ylS!c32`wyS@zC!U#~K(&QD%` zQ@1M;gJt=SLg&LXl7P{SFs>nPqN)pB5g#we5*X(R<2f_u!W8$h1gimaB6m4IdFPvV zM(kIvJC02R!eBY$+MMul`;KUFRwBji0WKmEV9Ukzqrqs(IDdRjB45VgENOxfrV;b& zPadx>pB~?Scep64>Ud{J1tykDR|KXX+yw&$pbnJt_=>A+B{Yv1T&xXts)4m{}JH^tC%2Sx2aXcb|X&GaXhFsXpMDg?q;eh;jek*$q)lBFPl+ z((4m9ML8>vY+<}PRnSiMez@0obHddc>)%9Y2lj+4>hvZ$>k7=}Ua>m4xjcisHyr-0 z#Q-#Vqb?w@SU)@93sxb~C!Z(OTr}T1Hf&;>665c@9PKHK!Yd+#or2dduer`pDub_V zVY!NrkZ_R(03Rn@F|Wg@d*cbv;VFC5R_E*`{^py{T(E04?1C`d*mB8>V=;OB%{Rxl z?yw}+IymYsUHaAvX$IXEyFAa4>8r z%?D&5M36XlgWPTuv$&F6!YiV7Y|pd}iY%WejCQMIQ!|m#;yJCK5oX)1`-{6sMk8#) z4nz`}eL5FVxqNDUA#9({jA*f9TQhmw4Qq$2E4v%Y`Um)jBl7`MiCyiqt+~DA4E_h( zw-gXd{R6Y1%HncK?N{tDX5C=$@vxR|K7VWH_nY!_efX}PDjuU^vwx+Y>3_0dN2IxC ze&Eqn25 zpWnH2e=!)8!PF2=p26pG^zs^;7O^*HDoRp-m(* zPz`99t8kqkZy+~Rx9WpkJ4@({kqv~fZ27`;es_nRO!)Q%EG$+o^6aR$b}^rTgts(4I^cVyTr!=H zhFg`kew;6uF>Lkkx3=iNwjY~4q~C6uHTMH%YRfPbzv7kwF1n4bU*6CHSMug-?wq-4 zPYCy;Q2U!vP2}4)%NM+Wn~I3>a@}o*dNi4HU*gF-pW;mJgWW#3PR(V31*!gjbj