summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2006-04-02 00:45:06 +0000
committerIan C <ianc@noddybox.co.uk>2006-04-02 00:45:06 +0000
commit539a668f326993bc369171cbbafd439b840df0a6 (patch)
tree8ece3acaf46b4e44a4053dbbc0c08399c900a91b
parent74246cf8c80717989476fc0d97da505fe00e1483 (diff)
*** empty log message ***HEADmaster
-rw-r--r--.cvsignore2
-rw-r--r--license.txt682
-rw-r--r--shockwave.bb3829
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.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- 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.
-
- <signature of Ty Coon>, 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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.
+
+ <signature of Ty Coon>, 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 speed<MAX_SPEED
- speed=speed+0.02
- If speed>MAX_SPEED Then speed=MAX_SPEED
- ElseIf speed>MAX_SPEED
- speed=speed-0.02
- If speed<MAX_SPEED Then speed=MAX_SPEED
- EndIf
-
- If hit_timer>0
- 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<tw And yc>=0 And yc<th
- WritePixelFast xc,yc,c,b
- EndIf
- Next
- Next
- UnlockBuffer b
-End Function
-
-; ============================================
-; Collisions
-; ============================================
-;
-.Collisions
-
-Function HitSW(e,size)
- size=size/2
- ex=EntityX(e)
- ey=EntityY(e)
-
- eminx=ex-size
- emaxx=ex+size
-
- eminy=ey-size
- emaxy=ey+size
-
- Return MeshesIntersect(e,sw\id)
-End Function
-
-
-; ============================================
-; Sprite Text
-; ============================================
-;
-.SpriteTextRoutines
-
-Function ClearSpriteText()
- For s.SpriteText=Each SpriteText
- FreeEntity s\id
- FreeTexture s\txt
- Delete s
- Next
-End Function
-
-Function UpdateSpriteText()
- For s.SpriteText=Each SpriteText
-
- If s\life=0
- s\a=s\a-s\ai
-
- If s\a<0.05
- FreeEntity s\id
- FreeTexture s\txt
- Delete s
- Else
- EntityAlpha s\id,s\a
- MoveEntity s\id,0,0,s\zi
- EndIf
- Else
- s\life=s\life-1
-
- If s\life=0
- FreeEntity s\id
- FreeTexture s\txt
- Delete s
- Else
- MoveEntity s\id,s\xi,s\yi,s\zi
- EndIf
- EndIf
-
- Next
-End Function
-
-Function NewSpriteText(a$,col,x#,y#,z#,zi#,al#,ai#)
- s.SpriteText=New SpriteText
- s\txt=CreateTexture(SPRTXTSIZE,SPRTXTSIZE,1+2+16+32)
- s\id=CreateSprite()
- s\a=al
- s\ai=ai
- s\zi=zi
- s\xi=0
- s\yi=0
- s\life=0
-
- ScaleSprite s\id,20,20
- EntityTexture s\id,s\txt
- PositionEntity s\id,x,y,z
- EntityAlpha s\id,al
-
- ClearTexture(s\txt)
- TextureText(s\txt,a$,col)
-End Function
-
-Function NewCameraSpriteText(a$,col,x#,y#,z#,zi#,al#,ai#)
- s.SpriteText=New SpriteText
- s\txt=CreateTexture(SPRTXTSIZE,SPRTXTSIZE,1+2+16+32)
- s\id=CreateSprite(current_camera)
- s\a=al
- s\ai=ai
- s\zi=zi
- s\xi=0
- s\yi=0
- s\life=0
-
- ScaleSprite s\id,10,10
- EntityTexture s\id,s\txt
- PositionEntity s\id,x,y,z
- EntityAlpha s\id,al
-
- ClearTexture(s\txt)
- TextureText(s\txt,a$,col)
-End Function
-
-Function NewCameraSpriteTextScroll(a$,col,x#,y#,z#,xi#,yi#,zi#,life)
- s.SpriteText=New SpriteText
- s\txt=CreateTexture(SPRTXTSIZE,SPRTXTSIZE,1+2+16+32)
- s\id=CreateSprite(camera)
- s\a=al
- s\ai=ai
- s\zi=zi
- s\xi=xi
- s\yi=yi
- s\life=life
-
- ScaleSprite s\id,1,1
- EntityTexture s\id,s\txt
- PositionEntity s\id,x,y,z
- EntityAlpha s\id,1
-
- ClearTexture(s\txt)
- TextureText(s\txt,a$,col)
-End Function
-
-; ============================================
-; Text
-; ============================================
-;
-.TextRoutines
-
-Function ClearText()
- b=TextureBuffer(hud)
- LockBuffer b
- For x=0 To TXTSIZE-1
- For y=0 To TXTSIZE-1
- WritePixelFast x,y,0,b
- Next
- Next
- UnlockBuffer b
-End Function
-
-Function HudText(tx,ty,a$)
- b=TextureBuffer(hud)
- LockBuffer b
-
- For f=1 To Len(a$)
- c=Asc(Mid$(a$,f,1))-32
- For x=0 To 7
- For y=0 To 7
- WritePixelFast tx+x,ty+y,font_data(c,x,y),b
- Next
- Next
- tx=tx+8
- Next
- UnlockBuffer b
-End Function
-
-
-Function HudTextCol(tx,ty,a$,col)
- b=TextureBuffer(hud)
- LockBuffer b
-
- For f=1 To Len(a$)
- c=Asc(Mid$(a$,f,1))-32
- For x=0 To 7
- For y=0 To 7
- WritePixelFast tx+x,ty+y,(font_data(c,x,y) And $ff000000) Or (font_data(c,x,y) And col),b
- Next
- Next
- tx=tx+8
- Next
- UnlockBuffer b
-End Function
-
-
-Function HudTextCentre(ty,a$,col)
- tx=TXTSIZE/2-Len(a$)*4
- b=TextureBuffer(hud)
- LockBuffer b
-
- For f=1 To Len(a$)
- c=Asc(Mid$(a$,f,1))-32
- For x=0 To 7
- For y=0 To 7
- WritePixelFast tx+x,ty+y,(font_data(c,x,y) And $ff000000) Or (font_data(c,x,y) And col),b
- Next
- Next
- tx=tx+8
- Next
- UnlockBuffer b
-End Function
-
-
-Function TextureText(t,a$,col)
- ty=TextureHeight(t)/2-4
- tx=TextureWidth(t)/2-Len(a$)*4
- b=TextureBuffer(t)
- LockBuffer b
-
- For f=1 To Len(a$)
- c=Asc(Mid$(a$,f,1))-32
- For x=0 To 7
- For y=0 To 7
- WritePixelFast tx+x,ty+y,(font_data(c,x,y) And $ff000000) Or (font_data(c,x,y) And col),b
- Next
- Next
- tx=tx+8
- Next
- UnlockBuffer b
-End Function
-
-
-; ============================================
-; Radar
-; ============================================
-;
-.Radar
-
-Function DrawRadar()
- b=TextureBuffer(radar)
- LockBuffer b
- For x=0 To RADSIZE-1
- For y=0 To RADSIZE-1
- WritePixelFast x,y,$20ffffff,b
- Next
- Next
-
- x=RADMID+EntityX(ship)/RADSCALE
-
- If x<0
- x=0
- EndIf
-
- If x>=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<RADSIZE And y>-1 And y<RADSIZE
- WritePixelFast x,y,c,b
- EndIf
- Next
- UnlockBuffer b
-End Function
-
-
-; ============================================
-; Asteroids
-; ============================================
-;
-.Asteroids
-
-Function InitAsteroids()
- For a.Asteroid=Each Asteroid
- FreeEntity a\id
- Delete a
- Next
-End Function
-
-
-Function NewAsteroid(size,x#,y#)
- a.Asteroid=New Asteroid
-
- If size=ASTLARGE
- a\id=CopyEntity(large_asteroid)
- ElseIf size=ASTMEDIUM
- a\id=CopyEntity(medium_asteroid)
- Else
- a\id=CopyEntity(small_asteroid)
- EndIf
-
- a\size=size
-
- EntityTexture a\id,shieldtex
- PositionEntity a\id,x,y,WAVEZ
-
- a\colcnt=ASTSHIELD
-
- a\speed#=Rnd(ASTMINSPEED,ASTMAXSPEED)
- ang=Rand(360)
-
- a\dx=Sin(ang)*a\speed
- a\dy=Cos(ang)*a\speed
-
- a\power=PowerUp()
- a\split=False
-
-End Function
-
-
-Function UpdateAsteroids()
-
- If False
- sz=32
- i=CreateImage(sz,sz)
- CopyRect 0,0,sz,sz-1,0,1,TextureBuffer(shieldtex),ImageBuffer(i)
- CopyRect 0,sz-1,sz,1,0,0,TextureBuffer(shieldtex),ImageBuffer(i)
- CopyRect 0,0,sz,sz,0,0,ImageBuffer(i),TextureBuffer(shieldtex)
- FreeImage i
- RotateTexture shieldtex,globang
- EndIf
-
- do_split=False
-
- For a.Asteroid=Each Asteroid
-
- upd=True
-
- If a\colcnt>0
- 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 speed<MAX_SPEED
- speed=speed+0.002
- EndIf
-
- MoveEntity ship,0,speed,0
-
- PositionEntity camera,EntityX(ship),EntityY(ship),0
- ;PositionEntity camera,0,0,0
- ;PointEntity camera,ship
-
- UpdateParticles()
- UpdateSpriteText()
-
- UpdateWorld
-
- RenderWorld
-
- 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
-
- 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<p\max
- p\count=p\count+1
- Return p\id
- EndIf
- Next
-
- Return POWNONE
-End Function
-
-Function ReturnPowerUp(id)
- For p.PowerUp=Each PowerUp
- If p\id=id
- p\count=p\count-1
- Return
- EndIf
- Next
-End Function
-
-
-; ============================================
-; Queued Sound Routines
-; ============================================
-;
-.QSoundRoutines
-
-Function ProcessQSounds()
- For s.QSound=Each QSound
- If s\time=0
- EmitSound(s\snd,s\obj)
- Delete s
- Else
- s\time=s\time-1
- EndIf
- Next
-End Function
-
-
-Function QueueQSound(snd,time,source)
- s.QSound=New QSound
- s\snd=snd
- s\time=time
- s\obj=source
-End Function
-
-
-Function CircleQSound(snd,del)
- For f=0 To 7
- QueueQSound(snd,del*f,snd_emitter(f))
- Next
-End Function
-
-
-
-; ============================================
-; Instruction Data
-; ============================================
-;
-.InstructionData
-Data "THE ALIENS HAVE SELECTED YOU TO REPRESENT THE HUMAN RACE "
-Data "IN SHOCKWAVE. "
-Data "IF YOU FAIL 3 BILLION SOULS WILL BE LOST. MOST IMPORTANTLY, YOURS.... "
-Data "THERE IS A SPANNER IN THE WORKS THOUGH - YOUR SHIP IS BUST. "
-Data "THERE IS NO CONTROL OVER ITS "
-Data "SPEED. ONLY STEERING WORKS AND YOU CAN ONLY DESTROY THE SPHERES WITH YOUR SHOCKWAVE EXHAUST. "
-Data "THE DESTROYED SPHERES MAY ALSO HAVE "
-Data "UNDESIRED EFFECTS ON THE SHIP... OR EVEN GOOD ONES. "
-Data "TO STEER USE THE LEFT AND RIGHT CURSOR KEYS. PRESS P TO PAUSE. PRESS ESCAPE TO QUIT. "
-Data " "
-Data "GOOD LUCK! "
+; 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.13 2006-04-02 00:45:06 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 speed<MAX_SPEED
+ speed=speed+0.02
+ If speed>MAX_SPEED Then speed=MAX_SPEED
+ ElseIf speed>MAX_SPEED
+ speed=speed-0.02
+ If speed<MAX_SPEED Then speed=MAX_SPEED
+ EndIf
+
+ If hit_timer>0
+ 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<tw And yc>=0 And yc<th
+ WritePixelFast xc,yc,c,b
+ EndIf
+ Next
+ Next
+ UnlockBuffer b
+End Function
+
+; ============================================
+; Collisions
+; ============================================
+;
+.Collisions
+
+Function HitSW(e,size)
+ size=size/2
+ ex=EntityX(e)
+ ey=EntityY(e)
+
+ eminx=ex-size
+ emaxx=ex+size
+
+ eminy=ey-size
+ emaxy=ey+size
+
+ Return MeshesIntersect(e,sw\id)
+End Function
+
+
+; ============================================
+; Sprite Text
+; ============================================
+;
+.SpriteTextRoutines
+
+Function ClearSpriteText()
+ For s.SpriteText=Each SpriteText
+ FreeEntity s\id
+ FreeTexture s\txt
+ Delete s
+ Next
+End Function
+
+Function UpdateSpriteText()
+ For s.SpriteText=Each SpriteText
+
+ If s\life=0
+ s\a=s\a-s\ai
+
+ If s\a<0.05
+ FreeEntity s\id
+ FreeTexture s\txt
+ Delete s
+ Else
+ EntityAlpha s\id,s\a
+ MoveEntity s\id,0,0,s\zi
+ EndIf
+ Else
+ s\life=s\life-1
+
+ If s\life=0
+ FreeEntity s\id
+ FreeTexture s\txt
+ Delete s
+ Else
+ MoveEntity s\id,s\xi,s\yi,s\zi
+ EndIf
+ EndIf
+
+ Next
+End Function
+
+Function NewSpriteText(a$,col,x#,y#,z#,zi#,al#,ai#)
+ s.SpriteText=New SpriteText
+ s\txt=CreateTexture(SPRTXTSIZE,SPRTXTSIZE,1+2+16+32)
+ s\id=CreateSprite()
+ s\a=al
+ s\ai=ai
+ s\zi=zi
+ s\xi=0
+ s\yi=0
+ s\life=0
+
+ ScaleSprite s\id,20,20
+ EntityTexture s\id,s\txt
+ PositionEntity s\id,x,y,z
+ EntityAlpha s\id,al
+
+ ClearTexture(s\txt)
+ TextureText(s\txt,a$,col)
+End Function
+
+Function NewCameraSpriteText(a$,col,x#,y#,z#,zi#,al#,ai#)
+ s.SpriteText=New SpriteText
+ s\txt=CreateTexture(SPRTXTSIZE,SPRTXTSIZE,1+2+16+32)
+ s\id=CreateSprite(current_camera)
+ s\a=al
+ s\ai=ai
+ s\zi=zi
+ s\xi=0
+ s\yi=0
+ s\life=0
+
+ ScaleSprite s\id,10,10
+ EntityTexture s\id,s\txt
+ PositionEntity s\id,x,y,z
+ EntityAlpha s\id,al
+
+ ClearTexture(s\txt)
+ TextureText(s\txt,a$,col)
+End Function
+
+Function NewCameraSpriteTextScroll(a$,col,x#,y#,z#,xi#,yi#,zi#,life)
+ s.SpriteText=New SpriteText
+ s\txt=CreateTexture(SPRTXTSIZE,SPRTXTSIZE,1+2+16+32)
+ s\id=CreateSprite(camera)
+ s\a=al
+ s\ai=ai
+ s\zi=zi
+ s\xi=xi
+ s\yi=yi
+ s\life=life
+
+ ScaleSprite s\id,1,1
+ EntityTexture s\id,s\txt
+ PositionEntity s\id,x,y,z
+ EntityAlpha s\id,1
+
+ ClearTexture(s\txt)
+ TextureText(s\txt,a$,col)
+End Function
+
+; ============================================
+; Text
+; ============================================
+;
+.TextRoutines
+
+Function ClearText()
+ b=TextureBuffer(hud)
+ LockBuffer b
+ For x=0 To TXTSIZE-1
+ For y=0 To TXTSIZE-1
+ WritePixelFast x,y,0,b
+ Next
+ Next
+ UnlockBuffer b
+End Function
+
+Function HudText(tx,ty,a$)
+ b=TextureBuffer(hud)
+ LockBuffer b
+
+ For f=1 To Len(a$)
+ c=Asc(Mid$(a$,f,1))-32
+ For x=0 To 7
+ For y=0 To 7
+ WritePixelFast tx+x,ty+y,font_data(c,x,y),b
+ Next
+ Next
+ tx=tx+8
+ Next
+ UnlockBuffer b
+End Function
+
+
+Function HudTextCol(tx,ty,a$,col)
+ b=TextureBuffer(hud)
+ LockBuffer b
+
+ For f=1 To Len(a$)
+ c=Asc(Mid$(a$,f,1))-32
+ For x=0 To 7
+ For y=0 To 7
+ WritePixelFast tx+x,ty+y,(font_data(c,x,y) And $ff000000) Or (font_data(c,x,y) And col),b
+ Next
+ Next
+ tx=tx+8
+ Next
+ UnlockBuffer b
+End Function
+
+
+Function HudTextCentre(ty,a$,col)
+ tx=TXTSIZE/2-Len(a$)*4
+ b=TextureBuffer(hud)
+ LockBuffer b
+
+ For f=1 To Len(a$)
+ c=Asc(Mid$(a$,f,1))-32
+ For x=0 To 7
+ For y=0 To 7
+ WritePixelFast tx+x,ty+y,(font_data(c,x,y) And $ff000000) Or (font_data(c,x,y) And col),b
+ Next
+ Next
+ tx=tx+8
+ Next
+ UnlockBuffer b
+End Function
+
+
+Function TextureText(t,a$,col)
+ ty=TextureHeight(t)/2-4
+ tx=TextureWidth(t)/2-Len(a$)*4
+ b=TextureBuffer(t)
+ LockBuffer b
+
+ For f=1 To Len(a$)
+ c=Asc(Mid$(a$,f,1))-32
+ For x=0 To 7
+ For y=0 To 7
+ WritePixelFast tx+x,ty+y,(font_data(c,x,y) And $ff000000) Or (font_data(c,x,y) And col),b
+ Next
+ Next
+ tx=tx+8
+ Next
+ UnlockBuffer b
+End Function
+
+
+; ============================================
+; Radar
+; ============================================
+;
+.Radar
+
+Function DrawRadar()
+ b=TextureBuffer(radar)
+ LockBuffer b
+ For x=0 To RADSIZE-1
+ For y=0 To RADSIZE-1
+ WritePixelFast x,y,$20ffffff,b
+ Next
+ Next
+
+ x=RADMID+EntityX(ship)/RADSCALE
+
+ If x<0
+ x=0
+ EndIf
+
+ If x>=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<RADSIZE And y>-1 And y<RADSIZE
+ WritePixelFast x,y,c,b
+ EndIf
+ Next
+ UnlockBuffer b
+End Function
+
+
+; ============================================
+; Asteroids
+; ============================================
+;
+.Asteroids
+
+Function InitAsteroids()
+ For a.Asteroid=Each Asteroid
+ FreeEntity a\id
+ Delete a
+ Next
+End Function
+
+
+Function NewAsteroid(size,x#,y#)
+ a.Asteroid=New Asteroid
+
+ If size=ASTLARGE
+ a\id=CopyEntity(large_asteroid)
+ ElseIf size=ASTMEDIUM
+ a\id=CopyEntity(medium_asteroid)
+ Else
+ a\id=CopyEntity(small_asteroid)
+ EndIf
+
+ a\size=size
+
+ EntityTexture a\id,shieldtex
+ PositionEntity a\id,x,y,WAVEZ
+
+ a\colcnt=ASTSHIELD
+
+ a\speed#=Rnd(ASTMINSPEED,ASTMAXSPEED)
+ ang=Rand(360)
+
+ a\dx=Sin(ang)*a\speed
+ a\dy=Cos(ang)*a\speed
+
+ a\power=PowerUp()
+ a\split=False
+
+End Function
+
+
+Function UpdateAsteroids()
+
+ If False
+ sz=32
+ i=CreateImage(sz,sz)
+ CopyRect 0,0,sz,sz-1,0,1,TextureBuffer(shieldtex),ImageBuffer(i)
+ CopyRect 0,sz-1,sz,1,0,0,TextureBuffer(shieldtex),ImageBuffer(i)
+ CopyRect 0,0,sz,sz,0,0,ImageBuffer(i),TextureBuffer(shieldtex)
+ FreeImage i
+ RotateTexture shieldtex,globang
+ EndIf
+
+ do_split=False
+
+ For a.Asteroid=Each Asteroid
+
+ upd=True
+
+ If a\colcnt>0
+ 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 speed<MAX_SPEED
+ speed=speed+0.002
+ EndIf
+
+ MoveEntity ship,0,speed,0
+
+ PositionEntity camera,EntityX(ship),EntityY(ship),0
+ ;PositionEntity camera,0,0,0
+ ;PointEntity camera,ship
+
+ UpdateParticles()
+ UpdateSpriteText()
+
+ UpdateWorld
+
+ RenderWorld
+
+ 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
+
+ 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<p\max
+ p\count=p\count+1
+ Return p\id
+ EndIf
+ Next
+
+ Return POWNONE
+End Function
+
+Function ReturnPowerUp(id)
+ For p.PowerUp=Each PowerUp
+ If p\id=id
+ p\count=p\count-1
+ Return
+ EndIf
+ Next
+End Function
+
+
+; ============================================
+; Queued Sound Routines
+; ============================================
+;
+.QSoundRoutines
+
+Function ProcessQSounds()
+ For s.QSound=Each QSound
+ If s\time=0
+ EmitSound(s\snd,s\obj)
+ Delete s
+ Else
+ s\time=s\time-1
+ EndIf
+ Next
+End Function
+
+
+Function QueueQSound(snd,time,source)
+ s.QSound=New QSound
+ s\snd=snd
+ s\time=time
+ s\obj=source
+End Function
+
+
+Function CircleQSound(snd,del)
+ For f=0 To 7
+ QueueQSound(snd,del*f,snd_emitter(f))
+ Next
+End Function
+
+
+
+; ============================================
+; Instruction Data
+; ============================================
+;
+.InstructionData
+Data "THE ALIENS HAVE SELECTED YOU TO REPRESENT THE HUMAN RACE "
+Data "IN SHOCKWAVE. "
+Data "IF YOU FAIL 3 BILLION SOULS WILL BE LOST. MOST IMPORTANTLY, YOURS.... "
+Data "THERE IS A SPANNER IN THE WORKS THOUGH - YOUR SHIP IS BUST. "
+Data "THERE IS NO CONTROL OVER ITS "
+Data "SPEED. ONLY STEERING WORKS AND YOU CAN ONLY DESTROY THE SPHERES WITH YOUR SHOCKWAVE EXHAUST. "
+Data "THE DESTROYED SPHERES MAY ALSO HAVE "
+Data "UNDESIRED EFFECTS ON THE SHIP... OR EVEN GOOD ONES. "
+Data "TO STEER USE THE LEFT AND RIGHT CURSOR KEYS. PRESS P TO PAUSE. PRESS ESCAPE TO QUIT. "
+Data " "
+Data "GOOD LUCK! "
Data "END" \ No newline at end of file