From 539a668f326993bc369171cbbafd439b840df0a6 Mon Sep 17 00:00:00 2001 From: Ian C Date: Sun, 2 Apr 2006 00:45:06 +0000 Subject: *** empty log message *** --- .cvsignore | 2 +- license.txt | 682 +++++------ shockwave.bb | 3829 +++++++++++++++++++++++++++++----------------------------- 3 files changed, 2259 insertions(+), 2254 deletions(-) diff --git a/.cvsignore b/.cvsignore index 2105426..093fd0b 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,2 +1,2 @@ -hiscore.dat +hiscore.dat shockwave.exe \ No newline at end of file diff --git a/license.txt b/license.txt index 6f2022b..abd3cf7 100644 --- a/license.txt +++ b/license.txt @@ -1,341 +1,341 @@ - 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 - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - 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 - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - + 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 + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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 + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + diff --git a/shockwave.bb b/shockwave.bb index 6ce26c7..acc75aa 100644 --- a/shockwave.bb +++ b/shockwave.bb @@ -1,1913 +1,1918 @@ -; shockwave -- a naff game -; -; Copyright (C) 2005 Ian Cowburn (ianc@noddybox.demon.co.uk) -; -; 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 -; -; ------------------------------------------------------------------------- -; -; $Id: shockwave.bb,v 1.12 2006-02-06 01:20:00 ianc Exp $ -; - -Include "gfx/font.bb" - -; ============================================ -; TYPES -; ============================================ -; -Type Particle - Field id - Field a# - Field ai# - Field spin# - Field dx#,dy#,dz# - Field life -End Type - -Type SpriteText - Field id - Field txt - Field a# - Field ai# - Field xi# - Field yi# - Field zi# - Field life -End Type - -Type Shockwave - Field id - Field length - Field z# -End Type - -Type SWLine - Field x1#,y1# - Field r1,g1,b1 - Field x2#,y2# - Field r2,g2,b2 -End Type - -Type Asteroid - Field id - Field size - Field colcnt - Field speed# - Field dx#,dy# - Field power - Field split -End Type - -Type PowerUp - Field id - Field chance - Field max - Field count -End Type - -Type QSound - Field snd - Field time - Field obj -End Type - -; ============================================ -; CONSTS -; ============================================ -; -Const DEBUGMODE=False - -Const MAPSIZE=256 -Const FIELDSIZE=246 - -Const RADSCALE=16 -Const RADSIZE=(MAPSIZE*2)/RADSCALE -Const RADMID=RADSIZE/2 - -Const TXTSIZE=256 - -Const SPRTXTSIZE=128 - -Const SHIPZ#=149 -Const WAVEZ#=150 -Const SHIPSZ#=2 - -Const ASTLARGE=20 -Const ASTMEDIUM=10 -Const ASTSMALL=5 -Const ASTMAXSPEED#=0.5 -Const ASTMINSPEED#=0.4 -Const ASTSHIELD=200 - -Const MAXSHIELD=100 - -Const SHIPTYPE=1 -Const SWTYPE=2 -Const ASTTYPE=3 - -Const POWNONE=0 -Const POWSPLIT=1 -Const POWTURBOTURN=2 -Const POWSHIELD=3 -Const POWFPS=4 - -Const TURN_NORMAL#=3 -Const TURN_TURBO#=2 -Const MAXSPEED_NORMAL#=1 -Const MAXSPEED_TURBO#=2 - -Const CAMERA_NORMAL=1 -Const CAMERA_FPS=2 - -; ============================================ -; GLOBLS -; ============================================ -; -Global WINW=800 -Global WINH=600 - -Global sw.Shockwave=Null - - -; ============================================ -; MAIN -; ============================================ -; -Graphics3D WINW,WINH,32;,2 - -SetBuffer BackBuffer() - -Global camera=CreateCamera() -Global listener=CreateListener(camera,0.001) - -Dim snd_emitter(7) - -For f=0 To 7 - snd_emitter(f)=CreatePivot(camera) -Next - -PositionEntity snd_emitter(0),0,0,2 -PositionEntity snd_emitter(1),1,0,1 -PositionEntity snd_emitter(2),2,0,0 -PositionEntity snd_emitter(3),1,0,-1 -PositionEntity snd_emitter(4),0,0,-2 -PositionEntity snd_emitter(5),-1,0,-1 -PositionEntity snd_emitter(6),-2,0,0 -PositionEntity snd_emitter(7),-1,0,1 - -CameraRange camera,0.1,10000 -CameraFogMode camera,0 - -AmbientLight 255,255,255 - -Global vectex=CreateVectex() -Global asttex=CreateAsttex() -Global powertex=CreatePowertex() -Global shieldtex=CreateShieldtex() -Global maptex=CreateMaptex() -Global radar=CreateTexture(RADSIZE,RADSIZE,1+2+16+32+256) -Global hud=CreateTexture(TXTSIZE,TXTSIZE,1+2+16+32+256) - -Global ship=CreateShip() -Global particle=CreateParticle() -Global large_asteroid=CreateAsteroid(ASTLARGE) -Global medium_asteroid=CreateAsteroid(ASTMEDIUM) -Global small_asteroid=CreateAsteroid(ASTSMALL) -Global map=CreateMap() -Global radar_spr=CreateSprite(camera) -Global hud_spr=CreateSprite(camera) - -Global start_sfx=Load3DSound("sfx/start.wav") -Global bonus_level_sfx=Load3DSound("sfx/bonus_level.wav") -Global laugh_sfx=Load3DSound("sfx/laugh.wav") -Global explode_sfx=Load3DSound("sfx/explode.wav") -Global pop_sfx=Load3DSound("sfx/pop.wav") -Global turbostart_sfx=Load3DSound("sfx/powerstart.wav") -Global turbostop_sfx=Load3DSound("sfx/powerstop.wav") -Global turnstart_sfx=Load3DSound("sfx/powerstart.wav") -Global turnstop_sfx=Load3DSound("sfx/powerstop.wav") -Global smartbomb_sfx=Load3DSound("sfx/smartbomb.wav") - -HideEntity particle -HideEntity large_asteroid -HideEntity medium_asteroid -HideEntity small_asteroid - -EntityType ship,SHIPTYPE -EntityRadius large_asteroid,ASTLARGE/2 -EntityRadius medium_asteroid,ASTMEDIUM/2 -EntityRadius small_asteroid,ASTSMALL/2 -EntityRadius ship,SHIPSZ - -;Collisions ASTTYPE,SWTYPE,2,1 -;Collisions ASTTYPE,SHIPTYPE,2,0 -Collisions ASTTYPE,ASTTYPE,1,1 - -PositionEntity radar_spr,7,5,15 -EntityTexture radar_spr,radar -PositionEntity hud_spr,0,0,2 -EntityTexture hud_spr,hud -ScaleSprite hud_spr,1.15,0.85 - -Global fps_camera=CreateCamera(ship) -Global fps_radar_spr=CreateSprite(fps_camera) -Global fps_hud_spr=CreateSprite(fps_camera) -PositionEntity fps_radar_spr,7.4,5.3,9 -EntityTexture fps_radar_spr,radar -PositionEntity fps_hud_spr,0,0,2 -EntityTexture fps_hud_spr,hud -ScaleSprite fps_hud_spr,1.85,1.45 -TurnEntity fps_camera,-70,0,0 -MoveEntity fps_camera,0,5,-15 -CameraProjMode camera,0 - -Global current_camera=camera - -Global globang=0 -Global start_level=1 -Global start_bonus=0 -Global quit=False -Global MAX_SPEED#=MAXSPEED_NORMAL -Global turn#=TURN_NORMAL -Global speed#=0 -Global score=0 -Global shield=0 -Global dead=False -Global highscore=0 -Global highlostchain=0 -Global new_highscore=False -Global new_highlostchain=False -Global hit_count=0 -Global hit_timer=0 -Global turbo_count=0 -Global turn_count=0 -Global fps_count=0 -Global is_bonus_level=False - -LoadHighScore() - -CreatePowerUp(POWSPLIT,99,1) -CreatePowerUp(POWSHIELD,97,0) -CreatePowerUp(POWTURBOTURN,95,10) -CreatePowerUp(POWFPS,98,2) - -SetCamera(CAMERA_NORMAL) - -Global timer=CreateTimer(100) - -Restore InstructionData -Read a$ -Global instruction$ - -While a$<>"END" - instruction$=instruction$+a$ - Read a$ -Wend - -Repeat - - SetCameraFOV(60) - - Menu() - - If quit - Exit - EndIf - - speed=0 - MAX_SPEED#=MAXSPEED_NORMAL - turn#=TURN_NORMAL - - ClearText() - - PositionEntity ship,0,0,SHIPZ - RotateMesh ship,0,0,0 - - ClearParticles() - ClearSpriteText() - InitShockwave(180,WAVEZ) - InitAsteroids() - - score=0 - shield=MAXSHIELD - dead=False - done=False - level=start_level - total_chain=0 - hit_timer=0 - hit_count=0 - - new_level=True - end_level=False - - FlushKeys - Delete Each QSound - - While (Not dead) And (Not done) And (Not KeyHit(1)) - - If new_level - - If (level Mod 5)=0 - is_bonus_level=True - Else - is_bonus_level=False - EndIf - - ClearText() - - ResetPowerUps() - - AddScore(0) - SubShield(0) - - noast=5+2*level - - If noast>100 - noast=100 - EndIf - - For f=1 To noast - NewAsteroid(ASTLARGE,Rand(-FIELDSIZE,FIELDSIZE),Rand(-FIELDSIZE,FIELDSIZE)) - Next - - If is_bonus_level - For f=30 To 50 Step 4 - NewCameraSpriteText("BONUS LEVEL",$ffffff,0,0,EntityZ(camera)+f,-0.4,1,0.01) - Next - - EmitSound(bonus_level_sfx,camera) - Else - For f=30 To 50 Step 4 - NewCameraSpriteText("LEVEL "+Str$(level),$ffffff,0,0,EntityZ(camera)+f,-0.4,1,0.01) - Next - - EmitSound(start_sfx,camera) - EndIf - - total_chain=0 - hit_count=0 - turn_count=0 - turbo_count=0 - new_level=False - EndIf - - If (First Asteroid)=Null And (Not end_level) - If hit_timer>0 - hit_timer=0 - - If hit_count>5 - bonus=hit_count*50 - NewCameraSpriteText("CHAIN BONUS",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - NewCameraSpriteText(Str$(bonus),$ffff00,0,3,EntityZ(camera)+50,-0.2,1,0.005) - AddScore(bonus) - total_chain=total_chain+hit_count - EndIf - EndIf - - end_level=True - end_levelc=500 - - HudTextCentre(50,"LEVEL COMPLETE!",$ffffff) - - If start_bonus>0 - HudTextCentre(100,"START BONUS",$ff0000) - HudTextCentre(110,Str$(start_bonus),$ffff00) - AddScore(start_bonus) - start_bonus=0 - EndIf - - If total_chain>0 - bonus=total_chain*17 - HudTextCentre(160,"CHAIN BONUS",$ff0000) - HudTextCentre(170,Str$(bonus),$ffff00) - AddScore(bonus) - EndIf - - If shield=0 - HudTextCentre(190,"SECRET ZERO SHIELD BONUS",$ff0000) - HudTextCentre(200,"99999",$ffff00) - AddScore(99999) - SubShield(-MAXSHIELD) - ElseIf shield=MAXSHIELD - HudTextCentre(190,"PERFECT SHIELD BONUS",$ff0000) - HudTextCentre(200,"20000",$ffff00) - AddScore(20000) - ElseIf total_chain>0 - bonus=total_chain - - If (shield+bonus)>MAXSHIELD - bonus=MAXSHIELD-shield - EndIf - - HudTextCentre(190,"NEW SHIELDS WON",$ff0000) - HudTextCentre(200,Str$(bonus),$ffff00) - SubShield(-bonus) - EndIf - - level=level+1 - EndIf - - If end_level - end_levelc=end_levelc-1 - - If end_levelc<200 - If (level Mod 5)=0 - HudTextCentre(128,"BONUS LEVEL!",$ffffff) - Else - HudTextCentre(128,"GET READY!",$ffffff) - EndIf - EndIf - - If end_levelc=0 - end_level=False - new_level=True - EndIf - EndIf - - If turn_count>0 - turn_count=turn_count-1 - - If turn_count=0 - CircleQSound(turnstop_sfx,1) - turn=TURN_NORMAL - EndIf - EndIf - - If turbo_count>0 - turbo_count=turbo_count-1 - - If turbo_count=0 - CircleQSound(turbostop_sfx,1) - MAX_SPEED=MAXSPEED_NORMAL - EndIf - EndIf - - If fps_count>0 - fps_count=fps_count-1 - - If fps_count=0 - CircleQSound(turbostop_sfx,1) - SetCamera(CAMERA_NORMAL) - EndIf - EndIf - - If KeyDown(203) - TurnEntity ship,0,0,turn - EndIf - - If KeyDown(205) - TurnEntity ship,0,0,-turn - EndIf - - If KeyHit(25) - FlushKeys - c=$ffff00 - ci=-$111100 - While (Not KeyHit(25)) And (Not KeyHit(1)) - HudTextCentre(124,"P A U S E D",c) - c=c+ci - If c=0 Or c=$ffff00 Then ci=-ci - RenderWorld - Flip - Wend - HudTextCentre(124," ",$ffff00) - EndIf - - If speedMAX_SPEED Then speed=MAX_SPEED - ElseIf speed>MAX_SPEED - speed=speed-0.02 - If speed0 - hit_timer=hit_timer-1 - - If hit_timer=0 - If hit_count>5 - bonus=hit_count*50 - NewCameraSpriteText("CHAIN BONUS",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - NewCameraSpriteText(Str$(bonus),$ff0000,0,3,EntityZ(camera)+50,-0.2,1,0.005) - AddScore(bonus) - total_chain=total_chain+hit_count - EndIf - - hit_count=0 - EndIf - EndIf - - MoveEntity ship,0,speed,0 - - PositionEntity camera,EntityX(ship),EntityY(ship),0 - ;PointEntity camera,ship - - UpdateParticles() - UpdateSpriteText() - - UpdateWorld - - RenderWorld - - UpdateAsteroids() - - AddShockwave(ship) - - DrawRadar() - - ex=EntityX(ship) - ey=EntityY(ship) - - If ex<-MAPSIZE Or ex>MAPSIZE - RotateEntity ship,0,0,-EntityRoll(ship) - MoveEntity ship,0,speed,0 - EndIf - - If ey<-MAPSIZE Or ey>MAPSIZE - RotateEntity ship,0,0,180-EntityRoll(ship) - MoveEntity ship,0,speed,0 - EndIf - - ProcessQSounds() - ;Info() - Flip - - WaitTimer(timer) - - globang=(globang+10) Mod 360 - - If DEBUGMODE - If KeyHit(200) - MAX_SPEED=MAX_SPEED+0.1 - NewCameraSpriteText(Str$(MAX_SPEED),$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - EndIf - If KeyHit(208) - MAX_SPEED=MAX_SPEED-0.1 - NewCameraSpriteText(Str$(MAX_SPEED),$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - EndIf - If KeyHit(64) - For ast.Asteroid=Each Asteroid - FreeEntity ast\id - Delete ast - Next - NewCameraSpriteText("DELALL",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - EndIf - If KeyHit(65) - SubShield(shield) - NewCameraSpriteText("NOSHLD",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - EndIf - If KeyHit(66) - SubShield(-MAXSHIELD) - NewCameraSpriteText("FULLSHLD",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) - EndIf - EndIf - - Wend - - SetCamera(CAMERA_NORMAL) - - new_highscore=False - new_highlostchain=False - - If dead - - CircleQSound(explode_sfx,25) - - fov#=60 - - NewCameraSpriteText("GAME OVER!",$ffffff,0,0,EntityZ(camera)+0.5,0,0.1,-0.005) - - If hit_count>5 - NewCameraSpriteText("LOST A",$800000,0,-2,EntityZ(camera)+0.5,0,0.1,-0.005) - NewCameraSpriteText("CHAIN OF",$800000,0,-4,EntityZ(camera)+0.5,0,0.1,-0.005) - NewCameraSpriteText(Str$(hit_count)+"!",$800000,0,-6,EntityZ(camera)+0.5,0,0.1,-0.005) - EndIf - - If score>highscore - new_highscore=True - highscore=score - EndIf - - If hit_count>5 And hit_count>highlostchain - new_highlostchain=True - highlostchain=hit_count - EndIf - - If new_highscore Or new_highlostchain - SaveHighScore() - EndIf - - f=0 - - While (f<700) And (Not (KeyDown(57) Or KeyDown(1))) - ProcessQSounds() - SetCameraFOV(fov) - If fov<175 - fov=fov+1 - EndIf - UpdateAsteroids() - DrawRadar() - UpdateParticles() - UpdateSpriteText() - UpdateWorld - RenderWorld - Flip - f=f+1 - Wend - - While fov>60 - ProcessQSounds() - SetCameraFOV(fov) - fov=fov-5 - UpdateAsteroids() - DrawRadar() - UpdateParticles() - UpdateSpriteText() - UpdateWorld - RenderWorld - Flip - Wend - - SetCameraFOV(60) - - EndIf - -Forever - -End - -; ============================================ -; Utils -; ============================================ -; -.Utils - -Function SetCamera(cam) - Select cam - Case CAMERA_NORMAL - CameraProjMode camera,1 - CameraProjMode fps_camera,0 - ShowEntity hud_spr - ShowEntity radar_spr - HideEntity fps_hud_spr - HideEntity fps_radar_spr - current_camera=camera - Case CAMERA_FPS - CameraProjMode camera,0 - CameraProjMode fps_camera,1 - HideEntity hud_spr - HideEntity radar_spr - ShowEntity fps_hud_spr - ShowEntity fps_radar_spr - current_camera=fps_camera - End Select -End Function - -Function SetCameraFOV(FOV#) - CameraZoom camera, 1.0 / Tan(FOV#/2.0) -End Function - -Function Info() - Color 255,255,255 - Text 0,100,"M:"+MeshWidth(ship)+","+MeshHeight(ship)+","+MeshDepth(ship) - Text 0,110,"S:"+MeshWidth(sw\id)+","+MeshHeight(sw\id)+","+MeshDepth(sw\id) -End Function - -Function AddScore(s) - score=score+s - HudText(0,0,"SCORE") - HudTextCol(48,0,score,$ff0000) -End Function - -Function SubShield(s) - orig=shield - shield=shield-s - If shield<0 And (Not dead) Then shield=0:dead=True:EmitSound(laugh_sfx,snd_emitter(Rand(0,7))) - If shield>300 Then shield=300 - If orig=>50 And shield<50 Then EmitSound(laugh_sfx,snd_emitter(Rand(0,7))) - If orig=>20 And shield<20 Then EmitSound(laugh_sfx,snd_emitter(Rand(0,7))) - HudText(150,0,"SHEILD") - HudTextCol(206,0,shield+" ",$ff0000) -End Function - -Function ClearTexture(t) - w=TextureWidth(t)-1 - h=TextureHeight(t)-1 - b=TextureBuffer(t) - LockBuffer b - For x=0 To w - For y=0 To h - WritePixelFast x,y,0,b - Next - Next - UnlockBuffer b -End Function - -Function RectTexture(t,x,y,w,h,c) - tw=TextureWidth(t)-1 - th=TextureHeight(t)-1 - b=TextureBuffer(t) - LockBuffer b - For xc=x To x+w-1 - For yc=y To y+h-1 - If xc>=0 And xc=0 And yc=RADSIZE - x=RADSIZE-1 - EndIf - - For y=0 To RADSIZE-1 - WritePixelFast x,y,$7fffffff,b - Next - - y=RADMID-EntityY(ship)/RADSCALE - - If y<0 - y=0 - EndIf - - If y>=RADSIZE - y=RADSIZE-1 - EndIf - - For x=0 To RADSIZE-1 - WritePixelFast x,y,$7fffffff,b - Next - - For a.Asteroid=Each Asteroid - If a\size=ASTLARGE - c=$ffffff00 - ElseIf a\size=ASTMEDIUM - c=$ffc8c8c8 - Else - c=$ffa0a0a0 - EndIf - x=RADMID+EntityX(a\id)/RADSCALE - y=RADMID-EntityY(a\id)/RADSCALE - - If x>-1 And x-1 And y0 - a\colcnt=a\colcnt-1 - - If a\colcnt=0 - If a\power=POWNONE - EntityTexture a\id,asttex - Else - EntityTexture a\id,powertex - EndIf - EntityType a\id,ASTTYPE - EndIf - - hit_ship=False - hit_sw=False - Else - hit_ship=EntityDistance(a\id,ship)<(a\size/2+SHIPSZ) - hit_sw=HitSW(a\id,a\size) - EndIf - - If hit_ship - SubShield(1) - NewParticleMove(particle,EntityX(ship),EntityY(ship),EntityZ(ship)-1,10,2,Rnd(-2,2),Rnd(-2,2),0) - ElseIf hit_sw Or a\split - - If Not dead - AddScore(a\size) - - hit_timer=200 - hit_count=hit_count+1 - - If Not a\split - EmitSound(pop_sfx,a\id) - dz#=0.1 - For f=10 To 100 Step 10 - NewAlphaParticleMove(particle,EntityX(a\id),EntityY(a\id),EntityZ(a\id)-f,1.0,-0.01,f/10,0,0,dz) - dz=dz+0.1 - Next - EndIf - - If a\size>ASTSMALL - x#=EntityX(a\id) - y#=EntityY(a\id) - - NewAsteroid(a\size/2,x,y) - NewAsteroid(a\size/2,x,y) - EndIf - - If a\power<>POWNONE - If a\split - ReturnPowerUp(a\power) - Else - Select a\power - Case POWSPLIT - NewCameraSpriteText("SMART BOMB!",$ff0000,0,0,EntityZ(camera)+30,-0.4,1,0.01) - do_split=True - CircleQSound(smartbomb_sfx,2) - - Case POWSHIELD - NewCameraSpriteText("SHEILD UP!",$ff0000,0,0,EntityZ(camera)+31,-0.4,1,0.01) - SubShield(-10) - - Case POWTURBOTURN - If Rand(100)>50 - NewCameraSpriteText("TURBO NUTTER!",$ff0000,0,0,EntityZ(camera)+32,-0.4,1,0.01) - CircleQSOund(turbostart_sfx,1) - turbo_count=turbo_count+500 - MAX_SPEED=MAXSPEED_TURBO - Else - NewCameraSpriteText("TURN LOSS!",$ff0000,0,0,EntityZ(camera)+33,-0.4,1,0.01) - CircleQSound(turnstart_sfx,1) - turn_count=turn_count+500 - turn=TURN_TURBO - EndIf - Case POWFPS - SetCamera(CAMERA_FPS) - NewCameraSpriteText("FPS MODE!",$ff0000,0,0,EntityZ(camera)+33,-0.4,1,0.01) - CircleQSOund(laugh_sfx,4) - fps_count=fps_count+1000 - End Select - EndIf - EndIf - - FreeEntity a\id - Delete a - upd=False - EndIf - EndIf - - If upd - If CountCollisions(a\id)>0 - a\dx=CollisionNX(a\id,1)*a\speed - a\dy=CollisionNY(a\id,1)*a\speed - EndIf - - TurnEntity a\id,0,a\dx*2,0 - TranslateEntity a\id,a\dx,a\dy,0 - - ex=EntityX(a\id) - ey=EntityY(a\id) - - If ex<-MAPSIZE Or ex>MAPSIZE - s=Sgn(ex) - PositionEntity a\id,s*MAPSIZE,ey,WAVEZ - a\dx=-a\dx - EndIf - - If ey<-MAPSIZE Or ey>MAPSIZE - s=Sgn(ey) - PositionEntity a\id,ex,s*MAPSIZE,WAVEZ - a\dy=-a\dy - EndIf - EndIf - Next - - If do_split - For a=Each Asteroid - a\split=True - Next - EndIf - -End Function - - -; ============================================ -; Shockwave -; ============================================ -; -.Shochwave - -Function InitShockwave(length,z#) - If sw<>Null - FreeEntity sw\id - Else - sw=New Shockwave - EndIf - - Delete Each SWLine - CreateSWLine(0,0,0) - - sw\length=length - sw\id=CreateMesh() - PositionEntity sw\id,0,0,z - EntityType sw\id,SWTYPE - EntityRadius sw\id,1 - CreateSurface(sw\id) - sw\z=z - - EntityFX sw\id,1+2+16+32 -End Function - - -Function CreateSWLine.SWLine(x#,y#,roll#) - s.SWLine=New SWLine - sz#=0.5 - - s\x1=x-sz*Cos(roll) - s\x2=x+sz*Cos(roll) - s\y1=y-sz*Sin(roll) - s\y2=y+sz*Sin(roll) - - s\r1=Rand(100,255) - s\g1=Rand(0,100) - s\b1=Rand(0,100) - s\r2=Rand(100,255) - s\g2=Rand(0,100) - s\b2=Rand(0,100) -End Function - - -Function AddShockwave(base) - - x#=EntityX(base) - y#=EntityY(base) - roll#=EntityRoll(base) - - CreateSWLine(x,y,roll) - - If sw\length>0 - sw\length=sw\length-1 - Else - Delete First SWLine - EndIf - - s=GetSurface(sw\id,1) - ClearSurface s,True,True - - al#=0.1 - - prev.SWLine=Null - - For sl.SWLine=Each SWLine - If prev<>Null - If True - v0=AddVertex(s,sl\x1,sl\y1,0) - v1=AddVertex(s,sl\x2,sl\y2,0) - v2=AddVertex(s,prev\x1,prev\y1,0) - v3=AddVertex(s,prev\x2,prev\y2,0) - - VertexColor s,v0,sl\r1,sl\g1,sl\b1,al - VertexColor s,v1,sl\r2,sl\g2,sl\b2,al - VertexColor s,v2,prev\r1,prev\g1,prev\b1,al - VertexColor s,v3,prev\r2,prev\g2,prev\b2,al - - AddTriangle(s,v0,v1,v2) - AddTriangle(s,v1,v3,v2) - EndIf - - If False - v0=AddVertex(s,sl\x1,sl\y1,-1) - v1=AddVertex(s,sl\x2,sl\y2,-1) - v2=AddVertex(s,prev\x1,prev\y1,-1) - v3=AddVertex(s,prev\x2,prev\y2,-1) - v4=AddVertex(s,sl\x1,sl\y1,1) - v5=AddVertex(s,sl\x2,sl\y2,1) - v6=AddVertex(s,prev\x1,prev\y1,1) - v7=AddVertex(s,prev\x2,prev\y2,1) - - VertexColor s,v0,sl\r1,sl\g1,sl\b1,al - VertexColor s,v1,sl\r2,sl\g2,sl\b2,al - VertexColor s,v2,prev\r1,prev\g1,prev\b1,al - VertexColor s,v3,prev\r2,prev\g2,prev\b2,al - - AddTriangle(s,v0,v1,v2) - AddTriangle(s,v1,v3,v2) - AddTriangle(s,v4,v6,v5) - AddTriangle(s,v4,v6,v7) - EndIf - - If al<1.0 - al=al+0.05 - EndIf - EndIf - - prev=sl - Next -End Function - - -; ============================================ -; Particles -; ============================================ -; -.Particles - -Function ClearParticles() - For p.Particle=Each Particle - FreeEntity p\id - Delete p - Next -End Function - -Function UpdateParticles() - For p.Particle=Each Particle - If p\life=0 Or p\a<=0 - FreeEntity p\id - Delete p - Else - p\life=p\life-1 - p\a=p\a+p\ai - EntityAlpha p\id,p\a - TurnEntity p\id,0,0,p\spin - MoveEntity p\id,p\dx,p\dy,p\dz - EndIf - Next -End Function - -Function NewParticle(base,x#,y#,z#,life,spin#) - NewParticleMove(base,x,y,z,life,spin,0,0,0) -End Function - -Function NewParticleMove(base,x#,y#,z#,life,spin#,dx#,dy#,dz#) - p.Particle=New Particle - p\id=CopyEntity(base) - ShowEntity p\id - PositionEntity p\id,x,y,z - p\life=life - p\a=1.0 - p\dx=dx - p\dy=dy - p\dz=dz - p\spin=spin -End Function - -Function NewAlphaParticle(base,x#,y#,z#,a#,ai#,spin#) - NewAlphaParticleMove(base,x,y,z,a,ai,spin,0,0,0) -End Function - -Function NewAlphaParticleMove(base,x#,y#,z#,a#,ai#,spin#,dx#,dy#,dz#) - p.Particle=New Particle - p\id=CopyEntity(base) - ShowEntity p\id - EntityAlpha p\id,a - PositionEntity p\id,x,y,z - p\life=9999999 - p\a=a - p\ai=ai - p\dx=dx - p\dy=dy - p\dz=dz - p\spin=spin -End Function - - -; ============================================ -; Mesh and Texture -; ============================================ -; -.MeshAndTexture - -Function CreateVectex() - s=256 - t=CreateTexture(s,s,1+4+8+256) - b=BackBuffer() - SetBuffer TextureBuffer(t) - Color 128,128,128 - Rect 0,0,s,s,True - For f=0 To 128 - Color 255-f,255-f,255-f - Rect f,f,s-f*2,s-f*2,False - Next - SetBuffer b - Return t -End Function - -Function CreateParticle() - m=CreateMesh() - b=CreateBrush(255,0,0) - s=CreateSurface(m,b) - - sz#=2 - - v0=AddVertex(s,0,sz,0) - v1=AddVertex(s,-sz,-0,0) - v2=AddVertex(s,0,-sz,0) - v3=AddVertex(s,sz,0,0) - - AddTriangle(s,v0,v2,v1) - AddTriangle(s,v0,v3,v2) - - UpdateNormals m - - Return m -End Function - -Function CreateShip() - - m=CreateMesh() - b=CreateBrush(255,255,255) - BrushTexture b,vectex - s=CreateSurface(m,b) - - sz#=SHIPSZ - - v0=AddVertex(s,0,sz,0,0,0) - v1=AddVertex(s,-sz,-sz,0,0,1) - v2=AddVertex(s,0,-sz/2,1,0,1) - v3=AddVertex(s,sz,-sz,0,1,0) - - AddTriangle(s,v0,v2,v1) - AddTriangle(s,v0,v3,v2) - - UpdateNormals m - - Return m - -End Function - -Function CreateAsttex() - s=256 - t=CreateTexture(s,s,1+4+8+256) - b=BackBuffer() - SetBuffer TextureBuffer(t) - Color 0,0,128 - Rect 0,0,s,s,True - Color 64,64,255 - For f=0 To 256 Step 32 - Rect f,0,4,256,True - Rect 0,f,256,4,True - Next - SetBuffer b - Return t -End Function - -Function TRANS_CreateAsttex() - s=256 - t=CreateTexture(s,s,1+4+8+256) - ClearTexture(t) - For f=0 To 256 Step 32 - RectTexture(t,f,0,4,256,$ffffffff) - RectTexture(t,0,f,256,4,$ffffffff) - Next - Return t -End Function - -Function CreatePowertex() - s=256 - t=CreateTexture(s,s,1+4+8+256) - b=BackBuffer() - SetBuffer TextureBuffer(t) - Color 128,128,0 - Rect 0,0,s,s,True - Color 255,255,0 - For f=0 To 256 Step 32 - Rect f,0,4,256,True - Rect 0,f,256,4,True - Next - SetBuffer b - Return t -End Function - -Function TRANS_CreatePowertex() - s=256 - t=CreateTexture(s,s,1+4+8+256) - ClearTexture(t) - For f=0 To 256 Step 32 - RectTexture(t,f,0,4,256,$ffffff00) - RectTexture(t,0,f,256,4,$ffffff00) - Next - Return t -End Function - -Function OLD_CreateShieldtex() - sz=32 - t=CreateTexture(sz,sz,1+4+8+256) - i=CreateImage(sz,sz) - b=BackBuffer() - SetBuffer ImageBuffer(i) - For f=0 To sz-1 - Color Rand(255),Rand(255),Rand(255) - Line 0,f,sz-1,f - Next - SetBuffer b - CopyRect 0,0,sz,sz,0,0,ImageBuffer(i),TextureBuffer(t) - FreeImage i - Return t -End Function - -Function CreateShieldtex() - s=32 - t=CreateTexture(s,s,1+4+8+256) - ClearTexture(t) - For x=0 To s Step 2 - For y=0 To s Step 2 - RectTexture(t,x+(y Mod 2),y,1,1,$ffffffff) - ;RectTexture(t,x,y,1,1,$ffffffff) - Next - Next - Return t -End Function - -Function CreateAsteroid(size#) - - size=size/2 - - m=CreateSphere() - ScaleEntity m,size,size,size - Return m - - m=CreateMesh() - s=CreateSurface(m) - - pt#=16.0 - ai#=360.0/pt - - AddVertex(s,0,0,0,0.5,0.5) - - For f=0 To pt-1 - a#=f*ai - x#=Sin(a)*size - y#=Cos(a)*size - AddVertex(s,x,y,z,Abs(Sin(a)),Abs(Cos(a))) - Next - - For f=1 To pt-1 - AddTriangle(s,0,f,f+1) - Next - - AddTriangle(s,0,pt,1) - - UpdateNormals m - - Return m - -End Function - -Function CreateMaptex() - s=256 - t=CreateTexture(s,s,1+4+8+256) - b=BackBuffer() - SetBuffer TextureBuffer(t) - Color 0,0,64 - Rect 0,0,s,s,True - For f=0 To 128 - rd=Rand(128,255) - gn=Rand(128,255) - bl=Rand(128,255) - - x=Rand(1,s-1) - y=Rand(1,s-1) - Color rd/2,gn/2,bl/2 - Plot x-1,y - Plot x+1,y - Plot x,y-1 - Plot x,y+1 - Color rd,gn,bl - Plot x,y - Next - Color 0,0,128 - Rect 0,0,s,s,False - SetBuffer b - Return t -End Function - -Function MapSurface(m,b,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4) - s=CreateSurface(m,b) - - v0=AddVertex(s,x1,y1,z1,0,0) - v1=AddVertex(s,x2,y2,z2,1,0) - v2=AddVertex(s,x3,y3,z3,0,1) - v3=AddVertex(s,x4,y4,z4,1,1) - - AddTriangle(s,v0,v1,v2) - AddTriangle(s,v1,v3,v2) -End Function - -Function CreateMap() - - m=CreateMesh() - b=CreateBrush(255,255,255) - BrushTexture b,maptex - - sz=MAPSIZE+10 - - MapSurface(m,b, -sz,sz,sz, sz,sz,sz, -sz,-sz,sz, sz,-sz,sz) - MapSurface(m,b, -sz,sz,-sz, sz,sz,-sz, -sz,sz,sz, sz,sz,sz) - MapSurface(m,b, -sz,-sz,-sz, -sz,sz,-sz, -sz,-sz,sz, -sz,sz,sz) - MapSurface(m,b, sz,sz,-sz, sz,-sz,-sz, sz,sz,sz, sz,-sz,sz) - MapSurface(m,b, sz,-sz,-sz, -sz,-sz,-sz, sz,-sz,sz, -sz,-sz,sz) - - UpdateNormals m - - Return m - -End Function - - -; ============================================ -; Menu -; ============================================ -; -.TitleRoutines - -Function Menu() - - FlushKeys - - InitAsteroids() - - ClearText() - - PositionEntity ship,0,0,SHIPZ - RotateMesh ship,0,0,0 - - ClearParticles() - ClearSpriteText() - InitShockwave(180,WAVEZ) - - done=False - turn=0 - count=100 - speed=0 - r=0 - g=0 - b=0 - i=1 - tl$="abcdefgh" - ic=1 - icl=Len(instruction$) - icp=1 - - HudTextCentre(20,"SHOCKWAVE",$ffffff) - HudTextCentre(30,"(C) 2004 IAN C",$ffffff) - - If DEBUGMODE - HudTextCentre(150,"**** DEBUG KEYS ENABLED ****",$ff0000) - EndIf - - HudTextCentre(50,"PRESS F1 FOR LEVEL",$ffff00) - HudTextCentre(60,"PRESS SPACE TO PLAY",$ffff00) - HudTextCentre(80,"PRESS ESC TO QUIT",$ffff00) - - HudTextCentre(170,"HIGH SCORE",$ffffff) - HudTextCentre(200,"LARGEST LOST CHAIN",$ffffff) - - AddScore(0) - start_bonus=(start_level-1)^2*1000 - - ti=MilliSecs() - - While Not done - - HudText(245,0,Mid$(tl$,i,1)) - - If (MilliSecs()-ti)>200 - i=(i Mod Len(tl$))+1 - ti=MilliSecs() - EndIf - - HudTextCentre(100," START LEVEL " + start_level+" ",$00ffff) - HudTextCentre(110," BONUS " + start_bonus+" ",$00ffff) - - If new_highscore - HudTextCentre(170,"NEW HIGH SCORE",(g Shl 16) Or (b Shl 8) Or r) - EndIf - - If new_highlostchain - HudTextCentre(200,"NEW LARGEST LOST CHAIN",(g Shl 16) Or (b Shl 8) Or r) - EndIf - - HudTextCentre(180,Str$(highscore),(r Shl 16) Or (g Shl 8) Or b) - HudTextCentre(210,Str$(highlostchain),(r Shl 16) Or (g Shl 8) Or b) - - r=(r+7) And 255 - g=(g+5) And 255 - b=(b+3) And 255 - - ic=ic-1 - - If ic=0 - NewCameraSpriteTextScroll(Mid$(instruction$,icp,1),$ffffff,5,-2,EntityZ(camera)+5,-0.02,0,0,500) - ic=6 - icp=icp+1 - If icp>icl - icp=1 - EndIf - EndIf - - If KeyHit(1) - done=True - quit=True - EndIf - - If KeyHit(57) - done=True - EndIf - - If KeyHit(59) - start_level=start_level+5 - If start_level>30 - start_level=1 - EndIf - start_bonus=(start_level-1)^2*1000 - EndIf - - count=count-1 - - If count=0 - turn=Rand(-1,1) - - If turn=0 - count=Rand(1,200) - Else - count=Rand(10,200) - EndIf - EndIf - - If turn=-1 - TurnEntity ship,0,0,TURN_NORMAL - EndIf - - If turn=1 - TurnEntity ship,0,0,-TURN_NORMAL - EndIf - - If speedMAPSIZE - RotateEntity ship,0,0,-EntityRoll(ship) - MoveEntity ship,0,speed,0 - EndIf - - If ey<-MAPSIZE Or ey>MAPSIZE - RotateEntity ship,0,0,180-EntityRoll(ship) - MoveEntity ship,0,speed,0 - EndIf - - Flip - - globang=(globang+10) Mod 360 - - Wend - -End Function - - -; ============================================ -; Highscore Routines -; ============================================ -; -.HiScoreRoutines - -Function LoadHighScore() - fp=ReadFile("hiscore.dat") - - If fp=0 - Return - EndIf - - highscore=ReadInt(fp) - highlostchain=ReadInt(fp) - CloseFile fp -End Function - -Function SaveHighScore() - fp=WriteFile("hiscore.dat") - - If fp=0 - Return - EndIf - - WriteInt fp,highscore - WriteInt fp,highlostchain - CloseFile fp -End Function - - -; ============================================ -; Power Up Routines -; ============================================ -; -.PowerUpRoutines - -Function CreatePowerUp(id,chance,max) - p.PowerUp=New PowerUp - p\id=id - p\chance=chance - p\max=max -End Function - -Function ResetPowerUps() - For p.PowerUp=Each PowerUp - p\count=0 - Next -End Function - -Function PowerUp() - If is_bonus_level - Return POWSPLIT - EndIf - - i=Rand(100) - - For p.PowerUp=Each PowerUp - If i>p\chance And p\count"END" + instruction$=instruction$+a$ + Read a$ +Wend + +Repeat + + SetCameraFOV(60) + + Menu() + + If quit + Exit + EndIf + + speed=0 + MAX_SPEED#=MAXSPEED_NORMAL + turn#=TURN_NORMAL + + ClearText() + + PositionEntity ship,0,0,SHIPZ + RotateMesh ship,0,0,0 + + ClearParticles() + ClearSpriteText() + InitShockwave(180,WAVEZ) + InitAsteroids() + + score=0 + shield=MAXSHIELD + dead=False + done=False + level=start_level + total_chain=0 + hit_timer=0 + hit_count=0 + + new_level=True + end_level=False + + FlushKeys + Delete Each QSound + + While (Not dead) And (Not done) And (Not KeyHit(1)) + + If new_level + + If (level Mod 5)=0 + is_bonus_level=True + Else + is_bonus_level=False + EndIf + + ClearText() + + ResetPowerUps() + + AddScore(0) + SubShield(0) + + noast=5+2*level + + If noast>100 + noast=100 + EndIf + + For f=1 To noast + NewAsteroid(ASTLARGE,Rand(-FIELDSIZE,FIELDSIZE),Rand(-FIELDSIZE,FIELDSIZE)) + Next + + If is_bonus_level + For f=30 To 50 Step 4 + NewCameraSpriteText("BONUS LEVEL",$ffffff,0,0,EntityZ(camera)+f,-0.4,1,0.01) + Next + + EmitSound(bonus_level_sfx,camera) + Else + For f=30 To 50 Step 4 + NewCameraSpriteText("LEVEL "+Str$(level),$ffffff,0,0,EntityZ(camera)+f,-0.4,1,0.01) + Next + + EmitSound(start_sfx,camera) + EndIf + + total_chain=0 + hit_count=0 + turn_count=0 + turbo_count=0 + new_level=False + EndIf + + If (First Asteroid)=Null And (Not end_level) + If hit_timer>0 + hit_timer=0 + + If hit_count>5 + bonus=hit_count*50 + NewCameraSpriteText("CHAIN BONUS",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + NewCameraSpriteText(Str$(bonus),$ffff00,0,3,EntityZ(camera)+50,-0.2,1,0.005) + AddScore(bonus) + total_chain=total_chain+hit_count + EndIf + EndIf + + end_level=True + end_levelc=500 + + HudTextCentre(50,"LEVEL COMPLETE!",$ffffff) + + If start_bonus>0 + HudTextCentre(100,"START BONUS",$ff0000) + HudTextCentre(110,Str$(start_bonus),$ffff00) + AddScore(start_bonus) + start_bonus=0 + EndIf + + If total_chain>0 + bonus=total_chain*17 + HudTextCentre(160,"CHAIN BONUS",$ff0000) + HudTextCentre(170,Str$(bonus),$ffff00) + AddScore(bonus) + EndIf + + If shield=0 + HudTextCentre(190,"SECRET ZERO SHIELD BONUS",$ff0000) + HudTextCentre(200,"99999",$ffff00) + AddScore(99999) + SubShield(-MAXSHIELD) + ElseIf shield=MAXSHIELD + HudTextCentre(190,"PERFECT SHIELD BONUS",$ff0000) + HudTextCentre(200,"20000",$ffff00) + AddScore(20000) + ElseIf total_chain>0 + bonus=total_chain + + If (shield+bonus)>MAXSHIELD + bonus=MAXSHIELD-shield + EndIf + + HudTextCentre(190,"NEW SHIELDS WON",$ff0000) + HudTextCentre(200,Str$(bonus),$ffff00) + SubShield(-bonus) + EndIf + + level=level+1 + EndIf + + If end_level + end_levelc=end_levelc-1 + + If end_levelc<200 + If (level Mod 5)=0 + HudTextCentre(128,"BONUS LEVEL!",$ffffff) + Else + HudTextCentre(128,"GET READY!",$ffffff) + EndIf + EndIf + + If end_levelc=0 + end_level=False + new_level=True + EndIf + EndIf + + If turn_count>0 + turn_count=turn_count-1 + + If turn_count=0 + CircleQSound(turnstop_sfx,1) + turn=TURN_NORMAL + EndIf + EndIf + + If turbo_count>0 + turbo_count=turbo_count-1 + + If turbo_count=0 + CircleQSound(turbostop_sfx,1) + MAX_SPEED=MAXSPEED_NORMAL + EndIf + EndIf + + If fps_count>0 + fps_count=fps_count-1 + + If fps_count=0 + CircleQSound(turbostop_sfx,1) + SetCamera(CAMERA_NORMAL) + EndIf + EndIf + + If KeyDown(203) + TurnEntity ship,0,0,turn + EndIf + + If KeyDown(205) + TurnEntity ship,0,0,-turn + EndIf + + If KeyHit(25) + FlushKeys + c=$ffff00 + ci=-$111100 + While (Not KeyHit(25)) And (Not KeyHit(1)) + HudTextCentre(124,"P A U S E D",c) + c=c+ci + If c=0 Or c=$ffff00 Then ci=-ci + RenderWorld + Flip + Wend + HudTextCentre(124," ",$ffff00) + EndIf + + If speedMAX_SPEED Then speed=MAX_SPEED + ElseIf speed>MAX_SPEED + speed=speed-0.02 + If speed0 + hit_timer=hit_timer-1 + + If hit_timer=0 + If hit_count>5 + bonus=hit_count*50 + NewCameraSpriteText("CHAIN BONUS",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + NewCameraSpriteText(Str$(bonus),$ff0000,0,3,EntityZ(camera)+50,-0.2,1,0.005) + AddScore(bonus) + total_chain=total_chain+hit_count + EndIf + + hit_count=0 + EndIf + EndIf + + MoveEntity ship,0,speed,0 + + PositionEntity camera,EntityX(ship),EntityY(ship),0 + ;PointEntity camera,ship + + UpdateParticles() + UpdateSpriteText() + + UpdateWorld + + RenderWorld + + UpdateAsteroids() + + AddShockwave(ship) + + DrawRadar() + + ex=EntityX(ship) + ey=EntityY(ship) + + If ex<-MAPSIZE Or ex>MAPSIZE + RotateEntity ship,0,0,-EntityRoll(ship) + MoveEntity ship,0,speed,0 + EndIf + + If ey<-MAPSIZE Or ey>MAPSIZE + RotateEntity ship,0,0,180-EntityRoll(ship) + MoveEntity ship,0,speed,0 + EndIf + + ProcessQSounds() + ;Info() + + Flip + + If KeyHit(88) + SaveBuffer(FrontBuffer(),"scrshot.bmp") + EndIf + + WaitTimer(timer) + + globang=(globang+10) Mod 360 + + If DEBUGMODE + If KeyHit(200) + MAX_SPEED=MAX_SPEED+0.1 + NewCameraSpriteText(Str$(MAX_SPEED),$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + EndIf + If KeyHit(208) + MAX_SPEED=MAX_SPEED-0.1 + NewCameraSpriteText(Str$(MAX_SPEED),$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + EndIf + If KeyHit(64) + For ast.Asteroid=Each Asteroid + FreeEntity ast\id + Delete ast + Next + NewCameraSpriteText("DELALL",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + EndIf + If KeyHit(65) + SubShield(shield) + NewCameraSpriteText("NOSHLD",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + EndIf + If KeyHit(66) + SubShield(-MAXSHIELD) + NewCameraSpriteText("FULLSHLD",$ff0000,0,5,EntityZ(camera)+50,-0.2,1,0.005) + EndIf + EndIf + + Wend + + SetCamera(CAMERA_NORMAL) + + new_highscore=False + new_highlostchain=False + + If dead + + CircleQSound(explode_sfx,25) + + fov#=60 + + NewCameraSpriteText("GAME OVER!",$ffffff,0,0,EntityZ(camera)+0.5,0,0.1,-0.005) + + If hit_count>5 + NewCameraSpriteText("LOST A",$800000,0,-2,EntityZ(camera)+0.5,0,0.1,-0.005) + NewCameraSpriteText("CHAIN OF",$800000,0,-4,EntityZ(camera)+0.5,0,0.1,-0.005) + NewCameraSpriteText(Str$(hit_count)+"!",$800000,0,-6,EntityZ(camera)+0.5,0,0.1,-0.005) + EndIf + + If score>highscore + new_highscore=True + highscore=score + EndIf + + If hit_count>5 And hit_count>highlostchain + new_highlostchain=True + highlostchain=hit_count + EndIf + + If new_highscore Or new_highlostchain + SaveHighScore() + EndIf + + f=0 + + While (f<700) And (Not (KeyDown(57) Or KeyDown(1))) + ProcessQSounds() + SetCameraFOV(fov) + If fov<175 + fov=fov+1 + EndIf + UpdateAsteroids() + DrawRadar() + UpdateParticles() + UpdateSpriteText() + UpdateWorld + RenderWorld + Flip + f=f+1 + Wend + + While fov>60 + ProcessQSounds() + SetCameraFOV(fov) + fov=fov-5 + UpdateAsteroids() + DrawRadar() + UpdateParticles() + UpdateSpriteText() + UpdateWorld + RenderWorld + Flip + Wend + + SetCameraFOV(60) + + EndIf + +Forever + +End + +; ============================================ +; Utils +; ============================================ +; +.Utils + +Function SetCamera(cam) + Select cam + Case CAMERA_NORMAL + CameraProjMode camera,1 + CameraProjMode fps_camera,0 + ShowEntity hud_spr + ShowEntity radar_spr + HideEntity fps_hud_spr + HideEntity fps_radar_spr + current_camera=camera + Case CAMERA_FPS + CameraProjMode camera,0 + CameraProjMode fps_camera,1 + HideEntity hud_spr + HideEntity radar_spr + ShowEntity fps_hud_spr + ShowEntity fps_radar_spr + current_camera=fps_camera + End Select +End Function + +Function SetCameraFOV(FOV#) + CameraZoom camera, 1.0 / Tan(FOV#/2.0) +End Function + +Function Info() + Color 255,255,255 + Text 0,100,"M:"+MeshWidth(ship)+","+MeshHeight(ship)+","+MeshDepth(ship) + Text 0,110,"S:"+MeshWidth(sw\id)+","+MeshHeight(sw\id)+","+MeshDepth(sw\id) +End Function + +Function AddScore(s) + score=score+s + HudText(0,0,"SCORE") + HudTextCol(48,0,score,$ff0000) +End Function + +Function SubShield(s) + orig=shield + shield=shield-s + If shield<0 And (Not dead) Then shield=0:dead=True:EmitSound(laugh_sfx,snd_emitter(Rand(0,7))) + If shield>300 Then shield=300 + If orig=>50 And shield<50 Then EmitSound(laugh_sfx,snd_emitter(Rand(0,7))) + If orig=>20 And shield<20 Then EmitSound(laugh_sfx,snd_emitter(Rand(0,7))) + HudText(150,0,"SHEILD") + HudTextCol(206,0,shield+" ",$ff0000) +End Function + +Function ClearTexture(t) + w=TextureWidth(t)-1 + h=TextureHeight(t)-1 + b=TextureBuffer(t) + LockBuffer b + For x=0 To w + For y=0 To h + WritePixelFast x,y,0,b + Next + Next + UnlockBuffer b +End Function + +Function RectTexture(t,x,y,w,h,c) + tw=TextureWidth(t)-1 + th=TextureHeight(t)-1 + b=TextureBuffer(t) + LockBuffer b + For xc=x To x+w-1 + For yc=y To y+h-1 + If xc>=0 And xc=0 And yc=RADSIZE + x=RADSIZE-1 + EndIf + + For y=0 To RADSIZE-1 + WritePixelFast x,y,$7fffffff,b + Next + + y=RADMID-EntityY(ship)/RADSCALE + + If y<0 + y=0 + EndIf + + If y>=RADSIZE + y=RADSIZE-1 + EndIf + + For x=0 To RADSIZE-1 + WritePixelFast x,y,$7fffffff,b + Next + + For a.Asteroid=Each Asteroid + If a\size=ASTLARGE + c=$ffffff00 + ElseIf a\size=ASTMEDIUM + c=$ffc8c8c8 + Else + c=$ffa0a0a0 + EndIf + x=RADMID+EntityX(a\id)/RADSCALE + y=RADMID-EntityY(a\id)/RADSCALE + + If x>-1 And x-1 And y0 + a\colcnt=a\colcnt-1 + + If a\colcnt=0 + If a\power=POWNONE + EntityTexture a\id,asttex + Else + EntityTexture a\id,powertex + EndIf + EntityType a\id,ASTTYPE + EndIf + + hit_ship=False + hit_sw=False + Else + hit_ship=EntityDistance(a\id,ship)<(a\size/2+SHIPSZ) + hit_sw=HitSW(a\id,a\size) + EndIf + + If hit_ship + SubShield(1) + NewParticleMove(particle,EntityX(ship),EntityY(ship),EntityZ(ship)-1,10,2,Rnd(-2,2),Rnd(-2,2),0) + ElseIf hit_sw Or a\split + + If Not dead + AddScore(a\size) + + hit_timer=200 + hit_count=hit_count+1 + + If Not a\split + EmitSound(pop_sfx,a\id) + dz#=0.1 + For f=10 To 100 Step 10 + NewAlphaParticleMove(particle,EntityX(a\id),EntityY(a\id),EntityZ(a\id)-f,1.0,-0.01,f/10,0,0,dz) + dz=dz+0.1 + Next + EndIf + + If a\size>ASTSMALL + x#=EntityX(a\id) + y#=EntityY(a\id) + + NewAsteroid(a\size/2,x,y) + NewAsteroid(a\size/2,x,y) + EndIf + + If a\power<>POWNONE + If a\split + ReturnPowerUp(a\power) + Else + Select a\power + Case POWSPLIT + NewCameraSpriteText("SMART BOMB!",$ff0000,0,0,EntityZ(camera)+30,-0.4,1,0.01) + do_split=True + CircleQSound(smartbomb_sfx,2) + + Case POWSHIELD + NewCameraSpriteText("SHEILD UP!",$ff0000,0,0,EntityZ(camera)+31,-0.4,1,0.01) + SubShield(-10) + + Case POWTURBOTURN + If Rand(100)>50 + NewCameraSpriteText("TURBO NUTTER!",$ff0000,0,0,EntityZ(camera)+32,-0.4,1,0.01) + CircleQSOund(turbostart_sfx,1) + turbo_count=turbo_count+500 + MAX_SPEED=MAXSPEED_TURBO + Else + NewCameraSpriteText("TURN LOSS!",$ff0000,0,0,EntityZ(camera)+33,-0.4,1,0.01) + CircleQSound(turnstart_sfx,1) + turn_count=turn_count+500 + turn=TURN_TURBO + EndIf + Case POWFPS + SetCamera(CAMERA_FPS) + NewCameraSpriteText("FPS MODE!",$ff0000,0,0,EntityZ(camera)+33,-0.4,1,0.01) + CircleQSOund(laugh_sfx,4) + fps_count=fps_count+1000 + End Select + EndIf + EndIf + + FreeEntity a\id + Delete a + upd=False + EndIf + EndIf + + If upd + If CountCollisions(a\id)>0 + a\dx=CollisionNX(a\id,1)*a\speed + a\dy=CollisionNY(a\id,1)*a\speed + EndIf + + TurnEntity a\id,0,a\dx*2,0 + TranslateEntity a\id,a\dx,a\dy,0 + + ex=EntityX(a\id) + ey=EntityY(a\id) + + If ex<-MAPSIZE Or ex>MAPSIZE + s=Sgn(ex) + PositionEntity a\id,s*MAPSIZE,ey,WAVEZ + a\dx=-a\dx + EndIf + + If ey<-MAPSIZE Or ey>MAPSIZE + s=Sgn(ey) + PositionEntity a\id,ex,s*MAPSIZE,WAVEZ + a\dy=-a\dy + EndIf + EndIf + Next + + If do_split + For a=Each Asteroid + a\split=True + Next + EndIf + +End Function + + +; ============================================ +; Shockwave +; ============================================ +; +.Shochwave + +Function InitShockwave(length,z#) + If sw<>Null + FreeEntity sw\id + Else + sw=New Shockwave + EndIf + + Delete Each SWLine + CreateSWLine(0,0,0) + + sw\length=length + sw\id=CreateMesh() + PositionEntity sw\id,0,0,z + EntityType sw\id,SWTYPE + EntityRadius sw\id,1 + CreateSurface(sw\id) + sw\z=z + + EntityFX sw\id,1+2+16+32 +End Function + + +Function CreateSWLine.SWLine(x#,y#,roll#) + s.SWLine=New SWLine + sz#=0.5 + + s\x1=x-sz*Cos(roll) + s\x2=x+sz*Cos(roll) + s\y1=y-sz*Sin(roll) + s\y2=y+sz*Sin(roll) + + s\r1=Rand(100,255) + s\g1=Rand(0,100) + s\b1=Rand(0,100) + s\r2=Rand(100,255) + s\g2=Rand(0,100) + s\b2=Rand(0,100) +End Function + + +Function AddShockwave(base) + + x#=EntityX(base) + y#=EntityY(base) + roll#=EntityRoll(base) + + CreateSWLine(x,y,roll) + + If sw\length>0 + sw\length=sw\length-1 + Else + Delete First SWLine + EndIf + + s=GetSurface(sw\id,1) + ClearSurface s,True,True + + al#=0.1 + + prev.SWLine=Null + + For sl.SWLine=Each SWLine + If prev<>Null + If True + v0=AddVertex(s,sl\x1,sl\y1,0) + v1=AddVertex(s,sl\x2,sl\y2,0) + v2=AddVertex(s,prev\x1,prev\y1,0) + v3=AddVertex(s,prev\x2,prev\y2,0) + + VertexColor s,v0,sl\r1,sl\g1,sl\b1,al + VertexColor s,v1,sl\r2,sl\g2,sl\b2,al + VertexColor s,v2,prev\r1,prev\g1,prev\b1,al + VertexColor s,v3,prev\r2,prev\g2,prev\b2,al + + AddTriangle(s,v0,v1,v2) + AddTriangle(s,v1,v3,v2) + EndIf + + If False + v0=AddVertex(s,sl\x1,sl\y1,-1) + v1=AddVertex(s,sl\x2,sl\y2,-1) + v2=AddVertex(s,prev\x1,prev\y1,-1) + v3=AddVertex(s,prev\x2,prev\y2,-1) + v4=AddVertex(s,sl\x1,sl\y1,1) + v5=AddVertex(s,sl\x2,sl\y2,1) + v6=AddVertex(s,prev\x1,prev\y1,1) + v7=AddVertex(s,prev\x2,prev\y2,1) + + VertexColor s,v0,sl\r1,sl\g1,sl\b1,al + VertexColor s,v1,sl\r2,sl\g2,sl\b2,al + VertexColor s,v2,prev\r1,prev\g1,prev\b1,al + VertexColor s,v3,prev\r2,prev\g2,prev\b2,al + + AddTriangle(s,v0,v1,v2) + AddTriangle(s,v1,v3,v2) + AddTriangle(s,v4,v6,v5) + AddTriangle(s,v4,v6,v7) + EndIf + + If al<1.0 + al=al+0.05 + EndIf + EndIf + + prev=sl + Next +End Function + + +; ============================================ +; Particles +; ============================================ +; +.Particles + +Function ClearParticles() + For p.Particle=Each Particle + FreeEntity p\id + Delete p + Next +End Function + +Function UpdateParticles() + For p.Particle=Each Particle + If p\life=0 Or p\a<=0 + FreeEntity p\id + Delete p + Else + p\life=p\life-1 + p\a=p\a+p\ai + EntityAlpha p\id,p\a + TurnEntity p\id,0,0,p\spin + MoveEntity p\id,p\dx,p\dy,p\dz + EndIf + Next +End Function + +Function NewParticle(base,x#,y#,z#,life,spin#) + NewParticleMove(base,x,y,z,life,spin,0,0,0) +End Function + +Function NewParticleMove(base,x#,y#,z#,life,spin#,dx#,dy#,dz#) + p.Particle=New Particle + p\id=CopyEntity(base) + ShowEntity p\id + PositionEntity p\id,x,y,z + p\life=life + p\a=1.0 + p\dx=dx + p\dy=dy + p\dz=dz + p\spin=spin +End Function + +Function NewAlphaParticle(base,x#,y#,z#,a#,ai#,spin#) + NewAlphaParticleMove(base,x,y,z,a,ai,spin,0,0,0) +End Function + +Function NewAlphaParticleMove(base,x#,y#,z#,a#,ai#,spin#,dx#,dy#,dz#) + p.Particle=New Particle + p\id=CopyEntity(base) + ShowEntity p\id + EntityAlpha p\id,a + PositionEntity p\id,x,y,z + p\life=9999999 + p\a=a + p\ai=ai + p\dx=dx + p\dy=dy + p\dz=dz + p\spin=spin +End Function + + +; ============================================ +; Mesh and Texture +; ============================================ +; +.MeshAndTexture + +Function CreateVectex() + s=256 + t=CreateTexture(s,s,1+4+8+256) + b=BackBuffer() + SetBuffer TextureBuffer(t) + Color 128,128,128 + Rect 0,0,s,s,True + For f=0 To 128 + Color 255-f,255-f,255-f + Rect f,f,s-f*2,s-f*2,False + Next + SetBuffer b + Return t +End Function + +Function CreateParticle() + m=CreateMesh() + b=CreateBrush(255,0,0) + s=CreateSurface(m,b) + + sz#=2 + + v0=AddVertex(s,0,sz,0) + v1=AddVertex(s,-sz,-0,0) + v2=AddVertex(s,0,-sz,0) + v3=AddVertex(s,sz,0,0) + + AddTriangle(s,v0,v2,v1) + AddTriangle(s,v0,v3,v2) + + UpdateNormals m + + Return m +End Function + +Function CreateShip() + + m=CreateMesh() + b=CreateBrush(255,255,255) + BrushTexture b,vectex + s=CreateSurface(m,b) + + sz#=SHIPSZ + + v0=AddVertex(s,0,sz,0,0,0) + v1=AddVertex(s,-sz,-sz,0,0,1) + v2=AddVertex(s,0,-sz/2,1,0,1) + v3=AddVertex(s,sz,-sz,0,1,0) + + AddTriangle(s,v0,v2,v1) + AddTriangle(s,v0,v3,v2) + + UpdateNormals m + + Return m + +End Function + +Function CreateAsttex() + s=256 + t=CreateTexture(s,s,1+4+8+256) + b=BackBuffer() + SetBuffer TextureBuffer(t) + Color 0,0,128 + Rect 0,0,s,s,True + Color 64,64,255 + For f=0 To 256 Step 32 + Rect f,0,4,256,True + Rect 0,f,256,4,True + Next + SetBuffer b + Return t +End Function + +Function TRANS_CreateAsttex() + s=256 + t=CreateTexture(s,s,1+4+8+256) + ClearTexture(t) + For f=0 To 256 Step 32 + RectTexture(t,f,0,4,256,$ffffffff) + RectTexture(t,0,f,256,4,$ffffffff) + Next + Return t +End Function + +Function CreatePowertex() + s=256 + t=CreateTexture(s,s,1+4+8+256) + b=BackBuffer() + SetBuffer TextureBuffer(t) + Color 128,128,0 + Rect 0,0,s,s,True + Color 255,255,0 + For f=0 To 256 Step 32 + Rect f,0,4,256,True + Rect 0,f,256,4,True + Next + SetBuffer b + Return t +End Function + +Function TRANS_CreatePowertex() + s=256 + t=CreateTexture(s,s,1+4+8+256) + ClearTexture(t) + For f=0 To 256 Step 32 + RectTexture(t,f,0,4,256,$ffffff00) + RectTexture(t,0,f,256,4,$ffffff00) + Next + Return t +End Function + +Function OLD_CreateShieldtex() + sz=32 + t=CreateTexture(sz,sz,1+4+8+256) + i=CreateImage(sz,sz) + b=BackBuffer() + SetBuffer ImageBuffer(i) + For f=0 To sz-1 + Color Rand(255),Rand(255),Rand(255) + Line 0,f,sz-1,f + Next + SetBuffer b + CopyRect 0,0,sz,sz,0,0,ImageBuffer(i),TextureBuffer(t) + FreeImage i + Return t +End Function + +Function CreateShieldtex() + s=32 + t=CreateTexture(s,s,1+4+8+256) + ClearTexture(t) + For x=0 To s Step 2 + For y=0 To s Step 2 + RectTexture(t,x+(y Mod 2),y,1,1,$ffffffff) + ;RectTexture(t,x,y,1,1,$ffffffff) + Next + Next + Return t +End Function + +Function CreateAsteroid(size#) + + size=size/2 + + m=CreateSphere() + ScaleEntity m,size,size,size + Return m + + m=CreateMesh() + s=CreateSurface(m) + + pt#=16.0 + ai#=360.0/pt + + AddVertex(s,0,0,0,0.5,0.5) + + For f=0 To pt-1 + a#=f*ai + x#=Sin(a)*size + y#=Cos(a)*size + AddVertex(s,x,y,z,Abs(Sin(a)),Abs(Cos(a))) + Next + + For f=1 To pt-1 + AddTriangle(s,0,f,f+1) + Next + + AddTriangle(s,0,pt,1) + + UpdateNormals m + + Return m + +End Function + +Function CreateMaptex() + s=256 + t=CreateTexture(s,s,1+4+8+256) + b=BackBuffer() + SetBuffer TextureBuffer(t) + Color 0,0,64 + Rect 0,0,s,s,True + For f=0 To 128 + rd=Rand(128,255) + gn=Rand(128,255) + bl=Rand(128,255) + + x=Rand(1,s-1) + y=Rand(1,s-1) + Color rd/2,gn/2,bl/2 + Plot x-1,y + Plot x+1,y + Plot x,y-1 + Plot x,y+1 + Color rd,gn,bl + Plot x,y + Next + Color 0,0,128 + Rect 0,0,s,s,False + SetBuffer b + Return t +End Function + +Function MapSurface(m,b,x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4) + s=CreateSurface(m,b) + + v0=AddVertex(s,x1,y1,z1,0,0) + v1=AddVertex(s,x2,y2,z2,1,0) + v2=AddVertex(s,x3,y3,z3,0,1) + v3=AddVertex(s,x4,y4,z4,1,1) + + AddTriangle(s,v0,v1,v2) + AddTriangle(s,v1,v3,v2) +End Function + +Function CreateMap() + + m=CreateMesh() + b=CreateBrush(255,255,255) + BrushTexture b,maptex + + sz=MAPSIZE+10 + + MapSurface(m,b, -sz,sz,sz, sz,sz,sz, -sz,-sz,sz, sz,-sz,sz) + MapSurface(m,b, -sz,sz,-sz, sz,sz,-sz, -sz,sz,sz, sz,sz,sz) + MapSurface(m,b, -sz,-sz,-sz, -sz,sz,-sz, -sz,-sz,sz, -sz,sz,sz) + MapSurface(m,b, sz,sz,-sz, sz,-sz,-sz, sz,sz,sz, sz,-sz,sz) + MapSurface(m,b, sz,-sz,-sz, -sz,-sz,-sz, sz,-sz,sz, -sz,-sz,sz) + + UpdateNormals m + + Return m + +End Function + + +; ============================================ +; Menu +; ============================================ +; +.TitleRoutines + +Function Menu() + + FlushKeys + + InitAsteroids() + + ClearText() + + PositionEntity ship,0,0,SHIPZ + RotateMesh ship,0,0,0 + + ClearParticles() + ClearSpriteText() + InitShockwave(180,WAVEZ) + + done=False + turn=0 + count=100 + speed=0 + r=0 + g=0 + b=0 + i=1 + tl$="abcdefgh" + ic=1 + icl=Len(instruction$) + icp=1 + + HudTextCentre(20,"SHOCKWAVE",$ffffff) + HudTextCentre(30,"(C) 2004 IAN C",$ffffff) + + If DEBUGMODE + HudTextCentre(150,"**** DEBUG KEYS ENABLED ****",$ff0000) + EndIf + + HudTextCentre(50,"PRESS F1 FOR LEVEL",$ffff00) + HudTextCentre(60,"PRESS SPACE TO PLAY",$ffff00) + HudTextCentre(80,"PRESS ESC TO QUIT",$ffff00) + + HudTextCentre(170,"HIGH SCORE",$ffffff) + HudTextCentre(200,"LARGEST LOST CHAIN",$ffffff) + + AddScore(0) + start_bonus=(start_level-1)^2*1000 + + ti=MilliSecs() + + While Not done + + HudText(245,0,Mid$(tl$,i,1)) + + If (MilliSecs()-ti)>200 + i=(i Mod Len(tl$))+1 + ti=MilliSecs() + EndIf + + HudTextCentre(100," START LEVEL " + start_level+" ",$00ffff) + HudTextCentre(110," BONUS " + start_bonus+" ",$00ffff) + + If new_highscore + HudTextCentre(170,"NEW HIGH SCORE",(g Shl 16) Or (b Shl 8) Or r) + EndIf + + If new_highlostchain + HudTextCentre(200,"NEW LARGEST LOST CHAIN",(g Shl 16) Or (b Shl 8) Or r) + EndIf + + HudTextCentre(180,Str$(highscore),(r Shl 16) Or (g Shl 8) Or b) + HudTextCentre(210,Str$(highlostchain),(r Shl 16) Or (g Shl 8) Or b) + + r=(r+7) And 255 + g=(g+5) And 255 + b=(b+3) And 255 + + ic=ic-1 + + If ic=0 + NewCameraSpriteTextScroll(Mid$(instruction$,icp,1),$ffffff,5,-2,EntityZ(camera)+5,-0.02,0,0,500) + ic=6 + icp=icp+1 + If icp>icl + icp=1 + EndIf + EndIf + + If KeyHit(1) + done=True + quit=True + EndIf + + If KeyHit(57) + done=True + EndIf + + If KeyHit(59) + start_level=start_level+5 + If start_level>30 + start_level=1 + EndIf + start_bonus=(start_level-1)^2*1000 + EndIf + + count=count-1 + + If count=0 + turn=Rand(-1,1) + + If turn=0 + count=Rand(1,200) + Else + count=Rand(10,200) + EndIf + EndIf + + If turn=-1 + TurnEntity ship,0,0,TURN_NORMAL + EndIf + + If turn=1 + TurnEntity ship,0,0,-TURN_NORMAL + EndIf + + If speedMAPSIZE + RotateEntity ship,0,0,-EntityRoll(ship) + MoveEntity ship,0,speed,0 + EndIf + + If ey<-MAPSIZE Or ey>MAPSIZE + RotateEntity ship,0,0,180-EntityRoll(ship) + MoveEntity ship,0,speed,0 + EndIf + + Flip + + globang=(globang+10) Mod 360 + + Wend + +End Function + + +; ============================================ +; Highscore Routines +; ============================================ +; +.HiScoreRoutines + +Function LoadHighScore() + fp=ReadFile("hiscore.dat") + + If fp=0 + Return + EndIf + + highscore=ReadInt(fp) + highlostchain=ReadInt(fp) + CloseFile fp +End Function + +Function SaveHighScore() + fp=WriteFile("hiscore.dat") + + If fp=0 + Return + EndIf + + WriteInt fp,highscore + WriteInt fp,highlostchain + CloseFile fp +End Function + + +; ============================================ +; Power Up Routines +; ============================================ +; +.PowerUpRoutines + +Function CreatePowerUp(id,chance,max) + p.PowerUp=New PowerUp + p\id=id + p\chance=chance + p\max=max +End Function + +Function ResetPowerUps() + For p.PowerUp=Each PowerUp + p\count=0 + Next +End Function + +Function PowerUp() + If is_bonus_level + Return POWSPLIT + EndIf + + i=Rand(100) + + For p.PowerUp=Each PowerUp + If i>p\chance And p\count