aboutsummaryrefslogtreecommitdiff
path: root/archive/blr2
diff options
context:
space:
mode:
Diffstat (limited to 'archive/blr2')
-rw-r--r--archive/blr2/COPYING51
-rwxr-xr-xarchive/blr2/ChangeLog728
-rw-r--r--archive/blr2/Extras133
-rw-r--r--archive/blr2/FAQ168
-rw-r--r--archive/blr2/FAQ.zh141
-rw-r--r--archive/blr2/INSTALL29
-rw-r--r--archive/blr2/Levels335
-rw-r--r--archive/blr2/Levels.zh330
-rw-r--r--archive/blr2/Readme288
-rw-r--r--archive/blr2/Readme.zh274
-rwxr-xr-xarchive/blr2/VERSION1
-rwxr-xr-xarchive/blr2/resources/b_diff.pngbin0 -> 849040 bytes
-rw-r--r--archive/blr2/resources/b_inter.pngbin0 -> 673510 bytes
-rwxr-xr-xarchive/blr2/resources/b_leaves.pngbin0 -> 92942 bytes
-rwxr-xr-xarchive/blr2/resources/b_null.pngbin0 -> 256 bytes
-rw-r--r--archive/blr2/resources/bdig.fnt15
-rwxr-xr-xarchive/blr2/resources/blnsns.pngbin0 -> 22038 bytes
-rwxr-xr-xarchive/blr2/resources/charmap.fnt99
-rwxr-xr-xarchive/blr2/resources/credits.pngbin0 -> 444814 bytes
-rwxr-xr-xarchive/blr2/resources/e_leaf.pngbin0 -> 96212 bytes
-rw-r--r--archive/blr2/resources/e_sflake.pngbin0 -> 491254 bytes
-rw-r--r--archive/blr2/resources/e_skyitem.pngbin0 -> 1313643 bytes
-rw-r--r--archive/blr2/resources/help.pngbin0 -> 486996 bytes
-rw-r--r--archive/blr2/resources/menus.pngbin0 -> 68585 bytes
-rwxr-xr-xarchive/blr2/resources/ss.pngbin0 -> 17442 bytes
-rwxr-xr-xarchive/blr2/resources/tap.oggbin0 -> 3626 bytes
-rw-r--r--archive/blr2/resources/title.pngbin0 -> 824146 bytes
-rw-r--r--archive/blr2/resources/vdig.fnt20
-rw-r--r--archive/blr2/src/background.h574
-rw-r--r--archive/blr2/src/effects.h104
-rw-r--r--archive/blr2/src/global.h549
-rw-r--r--archive/blr2/src/hgeft.cpp98
-rw-r--r--archive/blr2/src/hgeft.h75
-rw-r--r--archive/blr2/src/levels.h4305
-rw-r--r--archive/blr2/src/libcgh.h140
-rw-r--r--archive/blr2/src/libcghEx.cpp113
-rw-r--r--archive/blr2/src/loading.h384
-rw-r--r--archive/blr2/src/main.cpp1349
-rw-r--r--archive/blr2/src/menus.h1536
-rw-r--r--archive/blr2/src/music.h34
-rw-r--r--archive/blr2/src/scorec.h258
-rw-r--r--archive/blr2/src/scoresystem.h158
-rw-r--r--archive/blr2/src/towernbullet.h2892
43 files changed, 15181 insertions, 0 deletions
diff --git a/archive/blr2/COPYING b/archive/blr2/COPYING
new file mode 100644
index 0000000..bf98efc
--- /dev/null
+++ b/archive/blr2/COPYING
@@ -0,0 +1,51 @@
+BLRII itself distributes under the terms of the BSD license.
+Varieties of hge-unix and hge included in the source code distribution are still zlib-licensed.
+Here's the text of the BSD license and the zlib license.
+==============================================================================================
+Copyright (c) 2014, Chris Xiong
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of "Chrisoft" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL CHRIS XIONG BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+==============================================================================================
+Copyright (c) 2003-2008 Relish Games
+ 2011 Ryan C. Gordon
+ 2013-2014 Chris Xiong
+
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from
+the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not
+ be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.
diff --git a/archive/blr2/ChangeLog b/archive/blr2/ChangeLog
new file mode 100755
index 0000000..cbd158e
--- /dev/null
+++ b/archive/blr2/ChangeLog
@@ -0,0 +1,728 @@
+===================================================================
+Next version:
+The final release is just there!!
+Todo's:
+Bug fixes.
+Tests.
+
+Known bugs:
+Blue bullets appearing in Vortex of leaves.//don't know why...
+
+Wishlist: <-strikethrough
+~~Now Playing(Music Room)~~
+~~BLR script virtual machine~~(Now working for BLR3)
+
+Releases:
+
+1.0.0-0 (r101)
+Fix a bug in the hgeft library, and try git...
+
+1.0.0-0 (r100)
+Rev. 100!!!
+This is the final release.
+No more major changes will be made.
+Further changes of BLR2 will only be bug fixes (BGM addition
+excluded).
+
+Changes:
+Fix screenshot excluding the info panel.
+Make Lv-2P4 harder (reporter: BLumia).
+If it is the first time you start BLR in Windows, resolution in
+the options menu will be "?". Fixed now.
+Fixed a critical bug in scorec.h.
+
+Pre-Released versions:
+
+0.9.9-0 (r99)
+Rev. 99! WTF?
+THIS IS THE FINAL RELEASE CANDIDATE!!!
+Everything is frozen, that means no more new features will be
+added and no big changes will be made after this revision. Only
+bug fixes will be provided.
+//Again, "frozen" is a term borrowed from the Debian project and
+//is completely unrelated to Cirno!
+
+Tweak bullet9, shrink its removal border.
+Change Multpo texture, add spawning effect.
+Fix stubbed rankings.
+Update sprite sheet.
+Store assessment total elapsed time in the score file. Score
+files from older revisions shouldn't cause any errors but you may
+get "Time elapsed 0.00" in highscore details. If you've got any
+sort of OCD (Obsessive-compulsive disorder), just remove it.
+Document!!!
+
+0.9.8-0 (r98)
+Dear Pre-Release Candidate version(RC-0).
+
+CLR will collect multiplier +1's in range now.
+Multiplier +1's caught by player won't disappear now.
+Add/Move background transitions.
+Add volume control to options. This make the configuration file
+not compatible with older versions. Just delete it!
+Modify hge's API so that it can handle real volume and pan values.
+Volume value varys from 0 to 1, pan value varys from -1 to 1.
+Document...
+
+0.9.7-0 (r97)
+Fix: small semi-coll bullets are collected by clr...
+Add Multpo's for Level 7/-1.
+Do slight changes to level -1...
+Distribute CLRs for level 1~-1.
+
+0.9.6-0 (r96)
+Fix bug that cause you unable to charge if you try to use clr directly
+after your clr's used up.
+Add Multpo's for Level 3/4/5/6, and level 7 partically.
+Fix stupid bug in Level4Part2 and other similiar parts.
+Fix several bugs in level 5/6.
+Reduce given-away score in level "Sine Wave". It wassssSssss too long!
+Fix typo...
+Blinking HangUpText *should* be fixed now...
+
+0.9.5-0 (r95)
+Change configuration and score file names. Files with their names
+begin with "." may be annoying in Windows though...
+If we find a score file during first start up, assume it's valid and
+don't overwrite it.
+Fix the problem that in-game music won't be resumed when back from pause.
+Fix the problem that Multpo's won't be removed if a new game is created.
+Fix the problem that the first tip is not shown correctly if the game
+is restarted.
+(Probably) fixed the problem that the sound is played out of game.
+Prevent Multpo's from "escaping". This happens when fps is extremely low...
+Adding Multpo for Level2.
+Update CanonTechno.
+
+0.9.2-0 (r94)
+Mod, mod, mod...!
+Assessment mode is mostly frozen now.
+I'll make a pre-release at r99 and that revision will be set to
+0.9.9-0.
+Write the document... That's really tiring.
+
+~~0.9.1-4 (r94)~~
+Ooooooooops... I've forgotten to commit this one!
+So this is merged to the revision above, actually.
+=================================================================================
+Modify a couple of levels. (Making them easier...)
+Fix about scene text rendering out of the window.
+(Probably) fixed Level3Part3 by making them temporarily invulnerable...
+Are we bug-free now?
+
+0.9.1-4 (r93)
+Picking it up after almost one month... I'm now lost in my code...
+---------------------------------------------------------------------------------
+Add player position display into debug display.
+Rewrite pinball, adding collision between the balls...
+The collision code is based on Kollision (a game included in KDE SC).
+
+0.9.1-3 (r92)
+I installed Archlinux alongside Debian recently. Now we officially support
+Archlinux and Debian.
+Archlinux doesn't eat my CPU or try to destroy it... So further development will
+be made mainly under archlinux...
+---------------------------------------------------------------------------------
+Content freeze -- nothing will be added or removed any more (music etc excluded).
+Fix build failure in Archlinux.
+Fix font issue in Archlinux.
+realloc may change the base address... That's the cause of the crashes...
+--now removing all Bullet* based implementations.
+Affected parts:
+Assessment: Constant patterns, pinball
+All parts in level 2.
+L4P2, and more
+L5P5~6
+L-1P17
+L-1P19
+L3P3
+L7P12
+L7P14
+L7P25
+Avoid memory leaks... I don't know if they have been really fixed...
+
+0.9.1-2 (r91)
+Add built-in help.
+Now the pause menu should be fixed...
+Compress resources again.
+
+0.9.1-1 (r90)
+Fix a bug in the credit scene.
+Now the pause menu shouldn't be broken now...(It's so hard to reproduce
+that I have to assume it *has* been fixed.(IT STILL HAPPENS!!!)
+Close the "infinity CLR" "bug".
+(Huge) Code cleanup, mainly removing duplicate code.
+Allocate bullets dynamically. The array is freed every time a new game
+is started.
+Add a signal handler, print back trace on error(currently only available
+for linux...).
+
+0.9.1-1 (r89)
+Fix a critical bug in Score_Initailize.
+Modify level pinball.
+Drop "_PR" in version string.
+Partly rewrite the credit scene, displaying accurate version
+details.
+Remove some warnings from hgewin.
+A set of basic tests are done on a Intel+Nvidia desktop computer.
+Add a simple build script(instead of makefile).
+Reduce the Windows version executable size...(local work, recompile
+freetype using reduced features enabled.)
+Current tested (by me) and worked plantforms:
+Debian sid x86_64/Windows 8.1 @Intel core i7-2670QM, 8GiB RAM,
+Intel HD3000.
+Debian sid x86_64 @Intel Core2 Quad Q8300, 8GiB RAM, nvidia GT320.
+Windows XP x64 @VirutalBox, Dualcore Virtual CPU, 1.5GiB RAM, VBox
+Addons installed.
+Windows XP @Intel core i3-3240, 4GiB RAM, Intel HD3000.
+
+0.9.1-1_PR (r88)
+%lld seems to work with mingw-w64(also VS2005+)...
+So let's remove all %I64d.
+Change point bullet behaviour.
+Fix a minor multiplier problem.
+Mark the source code as C++.
+Re-document levels(not done).
+Update wiki.
+
+0.9.1-1_PR (r87)
+Disable screenshot when you're entering your honourable name. It's
+not tested so we could only hope that will work...
+Add crappy sounds to (part of) the menus.
+
+Replace a level in assessment mode. The original one was meanless..
+The menu sounds are too crappy... remove them temporarily. However,
+let's complete the code base so that we won't waste time writing
+it...
+
+0.9.1-1_PR (r86)
+Port highscore view and details menu. Menu rewrite is almost done!
+Disable select key while transferring.
+Fix "typo" caused bugs.
+Hopefully fix small bugs in the new menu system.
+Rename several files. Add some additional files.
+Remove legacy menu components.
+
+0.9.1-0_PR (r85)
+Port death menu, complete menu and new highscore menu to the new
+menu code base.
+Clean up old menu code.
+Update wiki.
+
+0.9.1-0_PR (r84)
+Port player preference menu, pause menu and return to title menu
+to the new menu code base.
+Add shake effect to player preference menu.
+Make effects faster...
+Press esc in a menu will select back/exit now.
+Add several background transfers.
+Fix possible memory leaks in HangUpText.
+Remove some commented statements.
+
+0.9.1-0_PR (r83)
+Now you can change the game resolution.
+Some resources are not re-made so they may look blurred...
+Make font bigger for higher resolution.
+Add command line option for changing the resolution.
+Complete the option menu rewrite.
+
+0.9.1-0_PR (r82)
+Add missing file menus.png...
+Finish the start menu rewrite.
+Modify "Lunatic Lunar", however it's not done...
+Modify resource unpacking of Windows version.
+
+0.9.1-0_PR (r81)
+Start menu rewrite...
+Add information about the built time.
+
+0.9.1-0_PR (r80)
+Remove "high FPS mode", it won't reach 500 FPS on my computer any
+more. Replace it with Vsync mode.
+Add float HGE::Timer_GetFPSf(). The return value will be updated
+every 1000ms.
+
+0.9.0-1_PR (b79/r79)
+Bump version!
+BLR will use revision number instead of build number one day...
+==changelog here==
+New assessment level "density test"...
+New assessment level "pinball"...
+New assessment level "Road blocks"...
+New assessment level "Extreme speeds"...
+New assessment level "Messed up"...
+New assessment level "Bonus - Lunatic Lunar!", finishing assessment
+mode!
+Laser extentions, add LineLaser for two-point laser inheriting all
+Laser interfaces.
+Modify laser collision parameters.
+Level corrections.
+Improve density test.
+Add screen shot. Press S for a screen shot.
+Fix the upside down screen shot output.
+Fix stubbed HGE::System_Launch.
+
+0.9.0-0_PR (b78)
+First two assessment levels.
+Two more assessment levels...
+Tow _more_ assessment levels......
+Another assessment level...
+Yet another level for assessment mode... why don't I bump the
+version?
+Modify player attribute.
+Allow bullet to kill itself at a certain point.
+Add extborder attribute.
+Finish assessment system framework.
+Add circ2pnt.
+
+0.8.1-1_PR (b77)
+All parts from level -1 to 7 are completed!
+Fixed the crash in the mingw-w64 build.
+Switch to mingw-w64 for building Windows version now.
+Complete GUI bring back.
+Fix a bug appeared after the cross-plantform port(when forked
+from BLRI).
+Prepare for assessment mode.
+
+0.8.1-0_PR (b76)
+New level "Sink over the horizon".
+New level "Gravity vortex".
+New level "Double reflective".
+Make point bullet additive blending.
+Allow bullets to pause before being accelerated.
+Modify "Gravity vortex".
+Modify "Achromatopsia". (Thanks to my classmate's advice...)
+Report build and version in the log file.
+Add command line argument support. Use "--help" for usage.
+Add freetype support to hge. It's still pretty buggy. (and make
+the executable extremely big!)
+Add experimental support for cross compiling with mingw-w64.
+(Mingw-w64 build *will* be the official build in the future.)
+Fix blinking HangUpText.
+Fix crashes in mingw-64 build.
+Change numeric characters to monospace.
+Modify player speed settings.
+Beewx still messes up memory... fixed now.
+Exit 1 if not terminated correctly.
+
+0.8.0-1_PR (b75)
+New level Supernova.
+New level (still unnamed).
+Support additive blending bullets(for Supernova).
+Add some additional tips.
+Move levels to level -1.
+Fix blinking of HGE::Gfx_SetTransform in OpenGL.
+Fix includes like " #include "../../include/..." " that would
+cause errors.
+Extend libcgh again. Adding operator ^ and method l().
+Modify clearrange behaviour in level hyper-threading.
+Modify the corresponding score bullet.
+
+0.8.0-0_PR (b74)
+New level Achromatopsia.
+New level hyper-threading.
+Tower8 partly rewritten, dropping tdir.
+Fix a small problem in level 2.
+Move levels to level -1. <-typo fixed
+Modify the semi-coll threshold of laser.
+SCEffect_Attatch now take a optional parameter.
+Global varibles cleanup.
+Fix a bug in bullet8 caused by RandomEngine port.
+Rename "Minesweeper"->"Spiky", add noname2pnt.
+Add achroma2pnt.
+
+0.7.3-0_PR (b73)
+This is a pre-release version of 0.7.2-2_PR.
+This version is released to public for level previewing.
+This release contains level 1~7 (while level -1/-2 are still
+"imaginary")
+Changes:
+Compress several png files.
+Merge code for Windows.
+Fixed compile problems of Windows version.
+Small fixes of level2.
+This build will be short-lived.
+
+0.7.2-2_PR (b72)
+New level "return to void". That's a 3 in 1 class. I used
+particularly many "return(void)(...);" in this level (which I
+always love to use).
+This indicates all "normal" levels are completed.
+Multiplier system was fully adopted into BLR.
+Implement a RandomEngine, replacing all rand().
+Rewrite Leaf_Anim using std::list, won't cause crashes now.
+Fixed: Trypophobia stops if too many CLR's are used.
+Fixed the problem in All2pnt().
+Fixed blinking target.
+Fixed Hexagon loops memory leak (the pointer array is too small...)
+Tests under Windows were done, all gameplay features ran perfectly.
+Make Laser::GetDist() private to avoid misusage.
+Fixed several background problems.
+Remove unused statements:
+DWORD ColTrans(DWORD,DWORD,DWORD): replaced by
+DWORD ColorTransfer(DWORD,DWORD).
+void SaySomethingAndBye(char*): useless.
+void DirectBullet(Bullet&,double): this has been coexisted with
+the same method in the Bullet class for a long time. Now it's
+replaced by Bullet::setdir(double).
+A Small bug in the Windows build is fixed.
+File list in the Windows build is updated.
+
+0.7.2-1_PR (b71)
+(Level7 will be almost twice longer than Level6!)
+I'm extremely tired these days, I can't even keep my eyes open
+while typing...
+Some of my classmates helped testing several levels and found
+some bugs, thanks a lot!
+
+After a short test, I found that the Windows build is almost
+broken... Crashes and misbehaves are everywhere!
+
+Maybe Windows is noble and won't run this garbage:(
+===Real changelog starts from here===
+New level "Trypophobia", however it seems that this level won't
+cause trypophobia at all!
+New level "Photon fusion", using a slightly modified Tower8.
+Rewrote laser distance detection using vector2d calculations,
+extending libcgh and bump its version at the same time.(*2)
+Put the new level to the correct place.
+Bring back "Minesweeper" level, adjust it to the new interfaces.
+Convert Bullet from struct to class.
+Bring back Classic Mode. There are no "easy", "normal" or "hard"
+now, there's only "classic"! Fix problems with the classic mode in
+the new code base.
+Fixed a bug appeared after the levels were put together.
+Other minor changes to the level WOP.
+Minor cleanups and code style adjustments. Add missing free's and
+delete's.
+Remake the credits page, it grows from 350KiB to 6MiB. (And so I'll
+enable PNG compression later.)
+
+0.7.2-0_PR (b70)
+I wasn't willing to bump the build number because I want the svn
+revision to chase the build number.
+However it wouldn't be appropriate to put three new levels into one
+build...
+The real changelog is here:
+New level "interference" (it's another small class "SimpleThing").
+New level "diffraction" (yet another dull class), hopefully fixed a
+memory leak in this level (by using more memory!)
+Rearrange levels to the order they will appear in the final version.
+New background interface, use background pictures easily.
+Make "Tiled" background mode work.
+Add SetScale to background class. Make you dizzy easily...
+Fix a small glitch in Level3Part3-4. This level won't run correctly
+under Low FPS Mode.
+Minor code cleanups.
+Removed more useless comments, my code is still hard to comprehend,
+though.
+Fix the misbehave of modulo with minus numbers...
+Small interface and behaviour changes:
+-If a bullet is effect-attatched and the effect is running, it won't
+die.
+-Bullet::redir now always make dist=1, for some bullet processing
+doesn't use dist now.
+Don't copyleft, it's radical.
+
+0.7.1-6_PR (b69)
+Finish some new levels ("Great Circle" bring back & "rainbow
+appearance").
+Fusion bullet first work draft.
+Fix some of the warnings from the compiler.
+Adjust level difficulty. It was indeed too easy...
+Remake some resources with GIMP.
+Merge great circles and finish it.
+Small code cleanups.
+
+0.7.1-5_PR (b68)
+Draft new level. (Another level threatening you using circles!)
+Update some old interfaces from BLR1.
+
+0.7.1-4_PR (b67)
+New level (name and placement undetermined).
+Fix level transition mismatches.
+Improved accelerated bullets.
+
+0.7.1-3_PR (b66)
+Fix a few glitches. Removing some useless interfaces for BLR I.
+Change "Dangerous Target" for proper difficulty.
+
+0.7.1-2_PR (b65)
+Bullet death effect, applied to Wave of Photon. It seems buggy.
+Fixed something left for debuging in the last commit.
+
+0.7.1-1_PR (b64)
+New level: Wave of Photon. A lazy level again. Despite of a new
+class, it's a copy of "photon school".
+Level improved: Cross threaten. Make it impossible to pass this
+part without crossing those blue bullets.
+libcgh improvement. Added new interfaces to vector2d struct. So the
+libcgh version was bumped. Was it worth doing that?
+
+0.7.1-0_PR (b63)
+New level: Rainbow bullets - nauty photon (in fact it's a lazy
+level! I must have seen the same thing some where else...)
+The last "photon school" level was put to where it should be.
+Rewrite some silly parts of the Changelog.
+I ran out of my AppEngine quota today... So I can't commit that to
+svn as planned...
+
+0.7.0-9_PR (b62)
+Performed a couple of tests, under both full FPS mode and low FPS
+mode.
+New background is used by now.
+
+0.7.0-8_PR (b61)
+Improved the rendering code. More tests are required...
+That made the rendering more efficient. It also eats less RAM then.
+--Okay it's now tested. Another bug in FPS independent bullets
+fixed. No (big) bugs were found in the new rendering code.
+
+0.7.0-7_PR (b60)
+Spring Festival commit...
+One level is rewritten.
+Ready to sync this to svn...
+
+0.7.0-6_PR (b59)
+Fixed 3D clouds background. New background components added.
+Experimental FPS independent bullets.
+
+0.7.0-5_PR (b58)
+Fixed another critical bug in laser collision detection
+implementation... Laser is almost perfect now...//Still, it's
+inefficient.
+
+0.7.0-4_PR (b57)
+Fixed a critical bug in laser implementation and another awful
+memory leak bug...
+
+0.7.0-3_PR (b56)
+A new level is going to be complete...
+
+0.7.0-2_PR (b55)
+Auto pause and do not make game suspend if focus is lost.
+
+0.7.0-1_PR (b54)
+First two parts for level7.
+
+0.7.0-0_PR (b53)
+New background for level7. Preparing interfaces for level7.
+
+0.6.2-2_PR (b52)
+Level6 is frozen now. It's the longest level ever... (in blr!)
+
+0.6.2-1_PR (b51)
+Completing level6!
+Spring is coming? (Well, not really...)
+
+0.6.2-0_PR (b50)
+Completing && improving hexagon.
+Bumped the minor version for the sixth level is almost complete.
+
+0.6.1-4_PR (b49)
+New level hexagon.
+
+0.6.1-3_PR (b48)
+New level...(Avalanche)
+Spotlight: Supporting BGM loop points(using my new hge
+interfaces...)!
+I have no idea on new levels (except "hyper fluid", that's a well-
+planned part...). Maybe I've spent too much time staring at the
+desktop? I feel like void these days.
+The build count is bumped four times a day, you enough!
+
+0.6.1-2_PR (b47)
+New level "Wriggle Nightbug-like"?...
+
+0.6.1-1_PR (b46)
+Implemented several unimplemented audio interfaces of hge (OpenAL).
+A Windows build to check compatibility is planned.
+
+0.6.1-0_PR (b45)
+Now we have 11 parts in level6...
+A BGM called Canon Techno is completed around here...
+
+0.6.0-0_PR (b44)
+Starting level 6!
+//We are in 2014 now. I'm regretful for I didn't have the dates
+recorded.
+
+0.5.3-2_PR (b43)
+Optimizing memory usage... (first step...)[*]
+Borrowed "the unbreakable jail" from old code...
+//[*]Note @ 0.6.1-3 && @ 0.7.0-9:
+//1. I found this useless.
+//2. This may cause SIGSEGV!
+//3. It's completely removed after b61. Because they are not used
+// any longer
+
+0.5.3-1_PR (b42)
+Final(the second last..) level for level 5, fish in a barrel?
+
+0.5.3-0_PR (b41)
+Small fixes and levels as usual...
+
+0.5.2-3_PR (b40)
+New minor parts for level5, fixed a bug in Player_Clear_Rotate.
+
+0.5.2-2_PR (b39)
+Several patches on new clear range.
+Changing interfaces for new levels.
+
+0.5.2-1_PR (b38)
+New trigger method for clear range...
+
+0.4.4-0_PRG (b37a)
+Regression version for releasing...
+-------------------------------------------------------------
+This will be released as a official Preview Release version.<-obsolete
+-------------------------------------------------------------
+
+0.5.2-0_PR (b37)
+New part for level5. Now I'm working on the regression 0.4.x.
+
+0.5.1-1_PR (b36)
+Several fixes including:
+-Fading info panel when approaching.
+-Sending mult. inc. indicator layer up.
+
+0.5.1-0_PR (b35)
+First two levels of level5.
+
+0.5.0-0_PR (b34)
+Starting level5... Crazy Autumn...
+
+A regression is planned to release a 0.4.x-x_PR version as
+official pre-released version. However it's still nowhere in sight
+that if I could use Windows these days.
+
+0.4.3-0_PR (b33)
+Level4 is almost complete. Now I'm using LOW FPS Mode for
+development because I just want to cool my laptop down without
+using my own power. //However I stopped that at the next version...
+
+0.4.2-0_PR (b32)
+A new level... without using *ANY* old code (from level.h).
+
+0.4.1-2_PR (b31)
+Level4 is now 18 parts...
+
+0.4.1-1_PR (b30)
+Transfered sevel old levels here.
+
+0.4.1-0_PR (b29)
+Optimizing old code for level4.
+
+0.4.0-0_PR (b28)
+Now let's move to level4...
+
+0.3.2-0_PR (b27)
+New levels for level3. In fact, it's almost completed now...
+
+0.3.1-2_PR (b26)
+Improved bullet clearing method, avoiding hidden bullets
+completely!(Just by converting them all to score points...)
+
+0.3.1-1_PR (b25)
+A new "big" level for level3.
+Added several new interfaces to tower&bullet section.
+
+0.3.1-0_PR (b24)
+Complete the first two parts of level3.
+
+0.3.0-0_PR (b23)
+Starting the development of level3...
+
+0.2.9-2_PR (b22)
+Completing level2...
+
+0.2.9-1_PR (b21)
+New parts for level2. level2 is almost completed now.
+PlayerLockX/Y implemented.
+-------------------------------------------------------------
+This will be released as a official Preview Release version.<-obsolete
+-------------------------------------------------------------
+BLR will be licensed under WTFPL from now.
+(WTF?)
+.............................................................
+No it's now licensed under the BSD license...
+
+0.2.9_PR (b20)
+Level 2 is frozen "by heart". (How? By heart?)
+
+0.2.5_PR (b19)
+Optimizing the second level to a "realistic" state... Added two
+extra musics(although still remain not used).
+
+0.2.2_PR (b18)
+The main development has been transferred to Linux. Optimizing
+code for Linux.
+//Revision count is not important.
+
+0.2.0_PR (b17)
+Level 2?...
+
+0.1.7-2_PR (b16)
+The first level is almost completed now...
+
+0.1.7-1_PR (b15)
+Fixed several serious bug in Low FPS Mode. Fixed FPS Level option
+code.
+
+0.1.7_PR (b14)
+Updated the only level to synchronize with the In-Game Music.
+Added "Multiplier +1" into the game system. Added an unimportant
+loading screen.//In fact, it's loading nothing. May be unpacking
+resource pack in Windows version...
+
+0.1.4_PR (b13)
+libcghEx has been made independent and can apply to any other
+projects. This is also the first BLR version that includes
+In-Game Music. libcghEx has been extended with LinearProgresser
+and HangUpText.
+
+0.1.1_PR (b12)
+Added auto-multiplier system. libcghEx (Chrisoft Game Helper
+Extras Library) is included in this version with CircleIndicator.
+
+0.1.0_PR (b11)
+Creation of the Pre-Released Version. Removed all old level code.
+Bourne-again!//Can you imagine what I was thinking when deleting
+the result of 3 months' work?...
+=================================================================
+TestBed versions:
+
+TB130907 (b10)
+A "Noname" level. Laser implementation partly rewritten.
+
+TB130903 (b9)
+Additional backgrounds
+
+TB130827 (b8)
+Laser implementation, Cheers!
+
+TB130818 (b7)
+New Levels such as rainbow towers and squashing levels.
+
+TB130802 (b6)
+Discarding old code, rewrite of part of the code.
+
+TB130718 (b5)
+Bullet creation effects, sync code back to BLR1.
+
+TB130714 (b4)
+Target indicator completed.
+
+TB130705 (b3)
+New level and bullet creation code for orange bullets.
+
+TB130703 (b2)
+Completing Orange Towers.
+
+TB130620 (b1)
+Completing Deep Blue Towers.//Well, "Dark Blue" right? Or more formally, "Navy".
+//However, they are all not the real color. I used #0000FF, which is just "Blue",
+//it just seems dark.
+
+TB130610 (b0)
+Creation of Testbed version.
diff --git a/archive/blr2/Extras b/archive/blr2/Extras
new file mode 100644
index 0000000..0368e7e
--- /dev/null
+++ b/archive/blr2/Extras
@@ -0,0 +1,133 @@
+BulletLabRemix II, Extras
+2014-06-06
+
+Content
+------------------------------------------------------------------------------------
+About the source code
+About resources used in the game
+The development
+
+About the source code
+------------------------------------------------------------------------------------
+I'm not a rigorous coder. All sources are written casually.
+You can even find two code chunks in one file with different styles...
+But generally, I:
+ Use tabs (width=4) and indent in Allman style;
+ Don't like extra spaces;
+ Prefer commas if possible;
+ Don't like very long names.
+
+And, the source code is bloated. global.h defined ~200 lines of global variables.
+Imagine that.
+
+Well, the reason is that BLRI start as a huge monolithic source file - main.cpp.
+It's once a ~100KiB file, and have more than 10k lines of code. One day I found it
+impossible to maintain such code and split it into several .h file. BLRII took the
+code base of BLRI. That's why. BLRIII will be a complete rewrite and I hope this
+would fix the problem.
+
+Well, let's observe each source file.
+
+background.h Defines and implies background animation.
+effects.h implement several simple in-game effects.
+global.h Defines global variables and routines.
+hgeft.h Free type interface for HGE. It's considered buggy and
+ incomplete now...
+levels.h implement the levels.
+libcgh.h Chris' Game Helper interfaces.
+loading.h Resources for the loading screen.
+menus.h implement the menus.
+music.h Music playback and looping.
+scorec.h Record highscores.
+scoresystem.h The BLR Multiplier scoring system.
+towernbullet.h implement towers and bullets.
+hgeft.cpp Free type interface for HGE. This is the implementation.
+libcghEx.cpp Extra routines for the CGH.
+main.cpp Contains main(int,char**), and player controls.
+
+About resources used in the game
+------------------------------------------------------------------------------------
+Most resources are self-made...
+
+b_diff.png A café wall illusion background
+b_inter.png A swirl illusion background
+b_leaves.png Taken from a Windows 3.1 desktop background, unused
+b_null.png Simple white background
+blnsns.png Font file. Font name "Berlin sans"
+credits.png Resources used in the credits screen.
+e_leaf.png Texture for leaves background effect. Taken from a Windows 3.1
+ dekstop background.
+e_sflake.png A snow texture for background effect. Taken from public domain.
+e_skyitem.png Sky background resources. Taken from HGE tutorial. Cloud is
+ from public domain.
+help.png Built-in help.
+menus.png Menu textures.
+ss.png Sprite Sheet. Taken from BLRI. Made with inkscape.
+title.png Title sprite. Pre-processed with inkscape.
+All resources are processed or made with GIMP.
+
+menuin.ogg Menu effect. Made with OpenMPT.
+menuout.ogg Ditto.
+tap.ogg Widely used. Taken frome HGE.
+
+BLR2_TR01.ogg Background music for level1. Original by Noby.
+BLR2_TR07.ogg Background music for level7. Original by Chris Jarvis.
+BLR2_TR09.ogg Background music for credits scene. Taken frome BLR2_TR07.
+CanonTechno.ogg Bonus? Made by Chris Xiong.
+Softwares used: OpenMPT, Rosegarden, Cakewalk Sonar 6.
+Syntheis: QSynth+Fluid R3 sf, Roland Groove Synth, Cakewalk TTS-1, Roland
+Super Quartet.
+Proprietary softwares are all cracked. I can't afford them now.
+
+The development
+------------------------------------------------------------------------------------
+As a student, developing such a game will never be supported...
+So, the development is "well hidden".
+The post-0.2.2 development are mostly done under Windows(8/8.1). After that, I
+migrated the main platform to Debian GNU/Linux. I'm using the unstable distribution.
+I'm not a true developer but I'm really one of those who like to like on the edge.
+Recently I installed Archlinux, which has taken me to the "bleeding edge". "Edges"
+are different from "borders", they are more sharp!
+
+Well, I first played BulletLAB when I was 13. It's easy enough and I passed the easy
+levels without any trouble. Then I tried normal and hard, all done without much
+difficulty. Then comes the "Extreme" mode, in which you have to pass the whole game
+without misses. That took me a long time...
+
+In March 2013, I was pretty bored (in fact, preparing a contest). And I found the
+small flash game again. I decompiled it, and started modifing it. Soon I found this
+interesting, and made the game VERY difficult. I even "released" that.
+
+However, flash is really inefficient. As the bullet number grows, FPS falls
+violently. So a rewrite is planned.
+
+First things first, how to draw so many objects on a screen? An STG game that has a
+file "hge.dll" in its directory came to my mind. I could still see the fancy effects
+it has. I googled for hge and found that it's a hardware accelerated game engine.
+
+Well, that's it! I wrote several simple scenes as practices, then BLRI started. I
+found HGE really powerful and can draw 2000 objects in 1000FPS. F***in' awesome!
+
+BLRI's source code growed rapidly. Soon it's almost 100KiB. It's almost impossible
+for me to maintain so big a file. That's why the source code is presented in many
+headers.
+
+When BLRI reached 0.8.6, BLRII was forked from it. BLRII started as a level testbed
+for BLRI. However, BLRI was frozen (this term is borrowed from the debian project, and
+is not at all releated to Cirno) before these levels can be added to it. If they
+*were* added, the source code of BLRI would no longer be human-readable.
+
+As BLRI was released (as 1.0.3SR), I can relax myself a bit. During that I found
+hge-unix, which can port almost any hge-based game to UNIX. I tried it and it works!
+
+Then I started modifing hge: migrating the Windows version to DirectX 9, implement
+stubbed functions in hge-unix, deprecating libbass and migrating to OpenAL...
+
+Soon I completed them all. Then I picked up BLRII (around Oct. 2013), which already
+has free-shaped lasers implemented.
+
+To declare my ambition to change BLR, the whole level.h was removed (with a backup
+of course).
+
+However this didn't change too much. Almost all levels were ported back to the
+current version later. \ No newline at end of file
diff --git a/archive/blr2/FAQ b/archive/blr2/FAQ
new file mode 100644
index 0000000..9935458
--- /dev/null
+++ b/archive/blr2/FAQ
@@ -0,0 +1,168 @@
+===Under Construction===
+In fact, these Q&A's are not asked frequently at all.
+They all came from the messed up mind of the author!
+
+Q: It complains about a missing dll?
+A: The Windows version was built against d3dx9_43.dll, which can
+ only be found in the latest DirectX runtime. Make sure you have the
+ latest DirectX runtime installed.
+ Other dlls required by the default Windows version are all bundled
+ with your Windows installation plus the DirectX runtime. You
+ shouldn't blame me if your system is incomplete.
+
+Q: I JUST CAN'T start it! (I can't see even a window!)
+A: Something must went wrong. There are two general causes.
+ 1. Failed to load a shared library.
+ 2. Initialization Failure.
+ If the first one happened, BLRLOG.TXT will not even be created.
+ To solve it, install the required runtime libs.
+ If the second one happened, you can find out what really happened in
+ BLRLOG.txt. Read the rest part of this document for more information.
+
+ However, the first one is not likely to happen. The official Windows
+ build doesn't have too much external dependencies.
+
+Q: (In Windows)
+ "Can't create D3D interface"
+ "Can't determine desktop video mode"
+ "Can't find appropriate full screen video mode"
+ "Can't create D3D device"
+ and it ends after this...
+A: DirectX initialization failed.
+ If you get this message after changing an option, the cause might
+ be your option is not supported by your computer. You can purge
+ the config file (back up your score and remove .blrrc) and
+ restart the game.
+ If you get this message on the first startup, you are just unlucky.
+ HGE, which is the render engine used in BLR is really low-ended
+ and will even work on a 1998's computer. Again, you are just unlucky!
+
+Q: (In linux or custom Windows builds)
+ "OpenGL implementation must be at least version 1.2"
+A: If you build a custom Windows build with OpenGL, this may occur, for
+ Windows' OpenGL implementation is 1.1. For a work around, see the
+ SDL website or build the DirectX version.
+ If this happens in a Linux build, you are just unlucky. OpenGL 1.2
+ is released in 1998...
+ Similiar problems may also happens if your X display is not a GL visual
+ or you haven't installed drivers properly.
+ It's also possible that you are using OpenGL Soft, which is not
+ supported.
+
+Q: "******** failed, using no sound", and it's silent...
+A: OpenAL initialization failed.
+ Your system may not support OpenAL software version (it's so hard to
+ find such a computer). To dismiss this message, start the game with
+ "--nosound".
+
+Q: The screen suddenly messed up...
+ Something terrible happened...
+ Is the player square screwed?
+ I can't move it!
+A: This might be a internal problem. Please make a bug report if this
+ happened.
+
+Q: It crashed!
+A: This program may crash at any time.
+ If it crashed, you can post your problem with BLRLOG.txt attatched
+ to google code issue tracker. I'll try to fix the problem if I can
+ reproduce it.
+
+Q: "Cannot decompress resources!" (Windows only)
+A: I've compressed the resources of the game for Windows. As the game
+ starts, it will create two folders and decompress the resources
+ into them. If that failed, this problem will be reported.
+ Restarting the game may solve the problem. If it still fails, check
+ if expand.exe exists in your system(It's an essential system file!).
+
+Q: Your code cannot compile!
+A: I'm pretty sure that it CAN compile(on my machine).
+ Check if you have all required sdks installed and if you have
+ configured the project correctly.
+ Additionally, if you checked out an older revision from svn, I
+ cannot guarantee that it can compile!
+
+Q: What are BLRData.dtp and BLRMusic.dtp?
+A: As the name tells, these are archives containing the game data.
+ You can decompress them with expand.exe (which may be found in
+ the mystery folder "system32").
+
+Q: It's blurred?
+A: The game was designed for 800x600, and if you are using a resolution
+ other than 800x600 or running in fullscreen, this problem may occur.
+
+Q: I can't see the bullets when paused?
+A: That depends on the implementation of the level where you are.
+ Some levels are implemented using the silly "SimpleBullet" class
+ which I once think it brilliant. These bullets won't be displayed
+ during the pause.
+ Pause menu was not introduced in BLR I until version 0.8.9 alpha.
+ The reason was I thought a menu for the pause scene was really
+ useless...
+ BTW, if you've ever played the official version of the Touhou series,
+ you might have found the pause scene there more annoying. The author
+ has stated that he made it deliberately (see TH06 FAQ 25).
+
+Q: I don't think the graphics are being rendered correctly.
+A: I don't know much about DirectX, for I left hge DirectX untouched.
+ However it shouldn't differ too much from the OpenGL version.
+ All quads are rendered as triangles, and uses vertex buffer.
+ Maybe there are "graphics driver dependent" contents, I'll correct them
+ later.
+
+Q: It's sssSssso hard!
+A: It's supposed to be hard! The only solution is to practice more.
+ However you can get more CLRs in player preference settings (with
+ a sacrifice of moving speed).
+
+Q: I can't get those "+1"'s...
+A: It's designed to be so! Some of the "+1"'s are only for adventurers!
+
+Q: Tell me the history.
+A: Changelog tracked a full history of this project (Although it's not
+ detailed).
+ By the way, this project started as a fork of BLR I, which is already
+ closed by me now.
+
+Q: Are there command line options?
+A: Yes. It's documented in README.txt.
+ BTW, --start and --fast came up for debug purpose only.
+ However they are a hidden bonus for cheaters.
+ So, I won't remove that in the final version. I promise.
+ (P.S.: misusage of --start may cause severe problems!)
+
+Q: Rankings of this game?
+A: If you can reach level 1~3...
+ --You are not suitable playing this sort of game.
+ If you can reach level 4~6...
+ --You are a normal human-being.
+ If you can pass level 6 or reach level 7...
+ --You are unusual.
+ If you can pass level 7...
+ --Are you "nobody"?
+ If you can pass level -1...
+ --Tell me the reason why you come to Earth...
+
+Q: Why can't I play all levels, it tells me "It Ends Here"! Do I have to pay
+ you for it?
+A: Of course not! 'Cause You just restarted too many times or had too many
+ collisions. The detailed requirements is listed below.
+ Level Restarts allowed Collisions allowed
+ level 2 N/A N/A
+ level 3 1 10
+ level 4 2 40
+ level 5 3 75
+ level 6 5 125
+ level 7 8 200
+ level -1 2 50
+
+ For example, to enter level 6 you can restart 5 times at most (classical
+ mode), or have 125 collisions at most (FreePlay Mode).
+
+ Level -2 can only be accessed in assessment mode or "--start" option.
+
+Q: Are there other awards?
+A: Sorry, no...
+ You won't get anything but the ranking even you've passed level -1 without
+ collisions.
+ So... enjoy it yourself.
diff --git a/archive/blr2/FAQ.zh b/archive/blr2/FAQ.zh
new file mode 100644
index 0000000..f6561f5
--- /dev/null
+++ b/archive/blr2/FAQ.zh
@@ -0,0 +1,141 @@
+===建设中===
+In fact, these Q&A's are not asked frequently at all.
+They all came from the messed up mind of the author!
+
+Q: 它说缺少什么dll?
+A: Windows版本是依赖d3dx9_43.dll的。你只能在最新的DirectX库中找到它。
+ 所以确认你是否已经安装了最新版的DirectX运行库。
+ 其他所有需要的dll都是Windows/DirectX运行库自带的。如果你的系统不完整,
+ 就不要来找我了…
+
+Q: 我就是不能启动它!(我连个窗口都看不见!)
+A: 一定有什么东西出错了。大约是以下两个原因中的一个:
+ 1. 无法加载某个共享库。
+ 2. 初始化失败。
+ 如果发生的情况是第一种,那么BLRLOG.txt甚至都不会被创建。
+ 解决方法是安装所需的运行库。
+ 如果第二种发生了,你可以从BLRLOG.txt中看到到底是什么出了问题。
+
+ 不过,第一种情况发生的可能性非常小。发布的Windows版没有那么多外部依赖。
+
+Q: (Windows中)
+ "Can't create D3D interface"
+ "Can't determine desktop video mode"
+ "Can't find appropriate full screen video mode"
+ "Can't create D3D device"
+ 然后就什么都没有了...
+A: DirectX没能正常初始化。
+ 如果你在修改了一个设置之后出现了这样的问题,原因可能是你的电脑不支持这种设置。
+ 你可以清除配置文件(备份你的分数文件,然后删除BLR.cfg)然后重新启动游戏。
+ 如果第一次启动就出现了这种情况,那就是你太不幸了。BLR的渲染引擎(hge)在1998
+ 年的电脑都可以正常工作。重复一遍,你还是太不幸了…
+
+Q: (linux或者非官方的Windows版本中)
+ "OpenGL implementation must be at least version 1.2"
+A: 如果你自己编译了一个使用OpenGL的Windows版,就有可能发生这种情况。因为Windows的
+ OpenGL版本是1.1的。为了获取一个解决办法,你可以看看SDL的官网或者编译一个使用
+ DirectX的版本。
+ 如果这发生在Linux版上,你还是太不幸了。OpenGL 1.2是1998年发布的标准…
+ 不过如果你的X display没打开OpenGL支持,或者没有正确地安装驱动,该问题可能也会发生。
+ 另有一种可能,就是你正在使用OpenGL Soft,而本游戏不支持它。
+
+Q: "******** failed, using no sound",然后什么声音都没有…
+A: OpenAL初始化失败了。
+ 你的系统可能不支持OpenAL软件版(找到这么一台电脑是何其的不容易啊)。
+ 如果你以后不想再看到这条消息,可以带"--nosound"参数启动游戏。
+
+Q: 屏幕突然花了!
+ 发生了可怕的事情…
+ 那个方块被吃掉了吗?
+ 我没法移动它!
+A: 这应该是个内部问题。如果你遇到了请汇报这个bug.
+
+Q: 它崩溃了!
+A: 这个程序*随时*都可能崩溃。
+ 如果它崩溃了,你可以将你的问题附上BLRLOG.txt一起发到google code的问题
+ 跟踪(大致就是一个类似bugzilla的东西?)上。如果我能重新制造出这个问题,我将会在以后
+ 试着去修正它。
+
+Q: "Cannot decompress resources!" (仅限Windows)
+A: 我将Windows版的游戏资源压缩了。当游戏启动时,它会建立两个文件夹并将数据
+ 解压在其中。如果这失败了,将会弹出这个错误框。
+ 重启游戏大概就能解决了。如果还不行,请检查你的系统中是否包含expand.exe(这是个重要的
+ 系统文件!)。
+
+Q: 你的代码没法编译!
+A: 我非常肯定它(在我的机器上)*能*编译。
+ 检查你是不是已经获取了所有需要的SDK,并且工程设置的是否正确。
+ 另外,如果你使用的是一个从svn获取的较老的版本,我就不能保证它能编译了…
+
+Q: BLRData.dtp和BLRMusic.dtp是什么?
+A: 正如名字说的,他们包含了游戏的数据。
+ 你可以用expand.exe解压这两个文件,expand.exe可以从神秘的system32文件夹
+ 下找到。
+
+Q: 看起来很模糊?
+A: 这个游戏是为800x600分辨率设计的。如果你在用其他的分辨率或者以全屏运行它,
+ 可能会出现这个问题。
+
+Q: 暂停的时候看不到子弹?
+A: 这得看你暂停的时候所在的关的实现方式。有些关是用“SimpleBullet”类来写的。
+ 这些子弹在暂停时无法显示。
+ 暂停功能直到BLR I的0.8.9 alpha才出现。原因是我之前认为暂停菜单没有用…
+ 顺便,如果你玩过东方系列的游戏的话,你会发现那里的暂停界面更加烦人。不过它的作者
+ 已经说明这是故意的了(见TH06的FAQ 25)。
+
+Q: 怎么这么难啊。
+A: 这是故意的!唯一的解决方法是多练…
+ 但是你在游戏设置中可以搞到更多的CLR(需要以降低移动速度为代价)。
+
+Q: 我根本拿不到那些“+1”!
+A: 这也是故意的!一部分“+1”是专门为愿意为它们冒险的人设计的。
+
+Q: 我认为图形绘制的有问题。
+A: 对于DirectX,我了解的不太多,因为我没有修改hge的DirectX版。
+ 但是它不应该和OpenGL版有太大的不同。
+ 四边形都是使用顶点缓冲用三角形绘制的。(好像现在所有显卡都支持顶点缓冲?)
+ 或许还有些跟显卡驱动有关的问题,我将会在以后修正它们。
+
+Q: 请告诉我历史。。。
+A: Changelog里面记录了这个项目的整个历史(虽然不是很完整)。
+ 顺带一说,这个工程起初只是BLR I的一个fork(),而BLR I现在已经完工了。
+
+Q: 有命令行选项吗?
+A: 有,在README.txt中有其说明。
+ 顺便,--start和--fast选项一开始是为调试而设置的。
+ 但是它们也是作弊者的一个隐藏福利…
+ 所以,我在最终版中不会移除它。我保证不会(?)。
+ (错误地使用--start可能会导致严重问题!)
+
+Q: 等级?
+A: 如果你能到Level 1~3...
+ --你不适合玩这种游戏。
+ 如果你能到Level 4~6...
+ --一般的水平。
+ 如果你能通过Level 6或者玩到Level 7...
+ --你不太一般啊…
+ 如果你能通过Level 7...
+ --你是“没有人”吗?
+ 如果你能通过Level -1...
+ --告诉我你来地球的目的…
+
+Q: 为什么我玩不了所有的关卡…它告诉我“It Ends Here!”(到此结束了!)。
+ 我难道还需要付钱吗?
+A: 当然不!还是因为技术太渣了。关于进入下一关的要求,见下表。
+ 关卡 最多重开数 最多撞弹数
+ level 2 N/A N/A
+ level 3 1 10
+ level 4 2 40
+ level 5 3 75
+ level 6 5 125
+ level 7 8 200
+ level -1 2 50
+ 举个例子,为了能够进入第6关你最多重开5次(“经典”模式中),或者最多撞弹
+ 125次(自由模式中)。
+
+ Level -2只能通过评估模式或者"--start"选项玩到。
+
+Q: 有其他奖励吗?
+A: 对不起,没有…
+ 即使你一个没有吃到一个子弹地通了Level -1你也不会得到任何东西。
+ 所以…自娱自乐吧。
diff --git a/archive/blr2/INSTALL b/archive/blr2/INSTALL
new file mode 100644
index 0000000..c48e870
--- /dev/null
+++ b/archive/blr2/INSTALL
@@ -0,0 +1,29 @@
+Installing a game is really useless, isn't it?
+So just compile it!
+
+A brief guide for compiling BLR
+Required SDKs:
+OpenAL
+ogg
+vorbis
+DirectX(Windows only)
+OpenGL(Linux only)
+SDL(Linux only)
+
+Steps to do:
+1. Get the source code.
+ You can choose from svn or the official packaged release.
+ The code from svn will always be newer than the official
+ packaged release.
+2. Get required SDKs mentioned above.
+ Piece of cake.
+3. Use Visual Studio(Windows) or Code::Blocks(Linux), create
+ project. Configure it correctly.
+ If you'd like to do it, you can also write a Makefile
+ yourself.
+4. Hit build (or type make)!
+5. If it failed, check step 2 and 3, then repeat step 4...
+
+Warning:
+Some revisions in the svn repo has noticeable problems.
+Always build the latest svn revision or official release!
diff --git a/archive/blr2/Levels b/archive/blr2/Levels
new file mode 100644
index 0000000..e22e9f4
--- /dev/null
+++ b/archive/blr2/Levels
@@ -0,0 +1,335 @@
+BulletLabRemixII
+Level index/specifications/hints
+
+I'm still working on this document.
+Please don't trouble me if it misled you.
+
+*Trying the levels before reading this is strongly recommended.*
+
+This document is probably NOT suitable for:
+Anybody who isn't insterested in this topic
+Liberal arts students(?...)
+
+This document is suitable for:
+Nobody(?)
+Coders who want to modify this game, or import levels to your game...
+Casual persons who won't care anything
+Someone who is stuck at a part
+
+
+
+
+
+
+======================WARNING, LOTS OF WORDS BELOW!======================
+Level 1 2/180
+River levels 120
+-It's confusing... so much bullets for Level1?
+ However it's fairly easy. Do not seek for death(where those "+1" are
+ leading you to)
+
+Double-directed labyrinth 60
+-Still very easy.
+
+Level 2 4/215
+Polygon-red 60
+-This is not hard...
+ Fake bullets aren't always annoying.
+
+Polygon-white 60
+-Make good use of precise mode.
+
+Polygon-white locked 6
+-You can't move vertically!
+ Find a good position, e.g. near by a line.
+
+Polygon-both 30
+-This part doesn't make sense.
+
+Level 3 4/150
+Reflective 30
+-Just meet them, do not make big movements.
+ They are pretty friendly aren't they?
+
+*4 30
+-It's a little difficult... Keep away from the edges!
+
+Rotate ???? 60
+-Stay away from the rotating bullets.
+
+Wall of blues? 30
+-Rather easy. Do not try to earn too may semi-collisions unless
+ you are really skilled.
+ Looks awesome?
+
+Level 4 5/243
+Orange 30
+-Don't make big movements and stay away from the edges. (why?)
+ Those fast bullets are really annoying.
+
+Orange trap 5+5+4+4+3+3+2+2+5
+-Do NOT press shift!
+
+Double spinner 60
+-An easy part for level 4.
+
+Squash-2 60
+-Enjoy it yourself.
+ I think it may make the situation worse.
+
+Circle-drawing 60
+-Just draw the circle.
+ If you have any problem, try BLR 1.
+
+Level 5 8/338
+CChase 30+30
+-Don't set player move speed to 1!
+ Remark: They are not really faster than you...
+
+Vortex of leaves 60
+-This is another annoying level, looks awesome and hard.
+ Keep away from those 'laser''s!
+ Remark: The lasers may have strange collision detection...
+ Be careful!
+
+Upstream flow 60
+-Rather easy.
+ Looks like something in level 3.
+
+High speed threaten 30
+-It's JUST threaten!
+ Precision is important.
+ Practice makes perfect.
+ If you *can't* move horizonally may be it's easier...
+
+Crossing threaten 30
+-Appears very hard.
+ Choose the correct time to cross those bullets.
+
+Orange trap2 2+2+2+5
+-Just another level from level 4.
+
+Fish in the barrel 60
+-Seems to be faster and faster? NO...
+ Remark: Those bullets are comming directly towards you.
+
+the Unbreakable jail 30
+-This is fairly hard. Use CLR if you need it.
+ Remark: When the 'target' got red, it's about to update its
+ position. If you keep moving when it's updating its position,
+ it will stuck in update mode, or it will stop.
+
+Level 6 7/390
+Snow WHITE 30
+-Incredible fast. Do not treat your CLR as a
+ £100,000,000 cheque.
+ Remark: They are accelerated!
+
+Photokeratitis 10+10+10+10+10
+-This used to be sickly hard...
+ Treat fast bullets and slow bullets separately.
+ Remark: It looks like Wriggle Nightbug's spellcard...
+ As of r94, it's not so hard as it was before. Fast bullets
+ won't hit you *if you don't move*.
+
+Squash-4(?) 60
+-Do not be trapped! You only need ONE CLR!...
+
+Avalanche 60
+-Do not stay at the screen bottom, it's very dangerous...
+
+Dangerous target 60
+-Keep moving!
+ It's a nightmare if you've choose a slow player...
+ Remark: The target follows you as a yellow bullet does,
+ but not in the same manner.
+
+Hexagon loops 10+20+7+7+7+19
+-Step well back and watch the show.
+ Remark: This level will misbehave if FPS dropped...
+
+Hyperfluid 60
+-Also known as Superfluid.
+ In fact, liquid helium is not cold enough. It's still several
+ Kelvin's degrees. I can make it even colder.
+ Remark: The white bullets are not accelerated, which are different
+ from the blue ones. The blue bullets share the same direction: 45 deg.
+ Also will become easier if horizonal movement is restricted...
+
+Level 7 12/930+ Mapped levels
+Spring thunder storm - panic? 60 Thunder storm...
+-Although it's based on something from level 6, they are completely
+ different!
+ And this one is really easy.
+ Remark: Try to get to the top of the screen...
+ Try restricting vertical movement this time...
+
+Rainbow tower - color theory 90 rainbow tower
+-Basic level.
+ Remark: It's taken from the old testbed version of BLRII.
+
+Rainbow bullets - nauty photon 60 Lazy level;)
+-Similar to one part in level1, but *much* harder.
+ Luck is really required.
+ Remark: The generation of bullets is really strange... If the last position
+ on the y axis is taken up... sorry that I started to talk about coding again.
+
+Rainbow effect - appearance 60 draw a rainbow (of bullet)
+-Random bullets. You will remember this part at once when you see the part.
+ If you feel it hard, go to assessment mode.
+ Remark: The bullets forming the rainbow are invincible.
+
+Rainbow effect - interference 120 as the name tells
+-This part is REALLY easy... but why?
+
+Rainbow effect - diffraction 120 as the name tells
+-Pretty hard. Those piles of shit may crash straight into you.
+ The code is pretty ugly too.
+
+Rainbow effect - photon school 60 "particalization"!
+-Pretty hard. Use CLR if necessary.
+ It may be easier if you stay near the edges. (I don't really know.)
+
+Over the Rainbow - infinity challenge - great circles
+-Your goal is to reach the red block...
+ And, this one is also pretty hard...
+ If you're not well-skilled and you are working on FPM, try --suicide--,
+ it worthwhile to do so!
+ Remark: This level will never end if you don't reach the red block...
+
+Trypophobia 120 another two classes: Tail & Pile
+-Very hard. You'll never know where they will go next(neither will they).
+ However, they won't step on the same place twice.
+ Will this cause trypophobia?
+ Remark: This level almost burn my computer...
+ I seem to forget an important thing: Bullets with effects won't collide
+ for a short time after they are created...
+
+Photon fission 90 Use a slightly modified tower8...
+-Directed bullets+random bullets.
+ Find a formula for it.
+
+Wave of Photon 60 class WOP+Lazy of particalization
+-Not very hard at the beginning...
+
+Return to void 90 return (void)(...);
+-VERY HARD!!!
+ I don't know where this came from.
+ CLR is useless but it will give you a short period during which you are invincible.
+ Remark: There are "no solution" cases...
+
+Level -1(Extreme) 7/1020
+unknown circles1 60
+-They slow down as they approach the border. VERY ANNOYING!!!
+
+unknown circles2 60
+-They STUCK at the border!! And they get THICKER and THICKER!!......
+
+Spiky 120
+-Hard. Their behavior is not predictable.
+ Remark: Again, never try to approach lasers! They are harmful to your eyes...
+
+Achromatopsia 120(90+30)
+-There's no way?!
+ Well, mind the name please...
+ Or we should call this "deuteranopia vs protanopia"?
+ Remark: Color change may suddenly happen!!
+
+Quad thread 120
+-Do you humans really support it?
+ Remark: I don't...
+
+Gravity vortex 120
+-It has nothing to do with gravity at all, but it's pretty
+ hard!
+ Seems to be very graceful.
+
+Supernova(additive blending) 120
+-After gathering enough power, they explode --
+ Awesome supernova!
+ I enjoy coding(such easy parts)...
+ Remark: Newly created bullets are... I can't give more clue.
+
+yellow explosive 90
+-There's nothing to code, so I came up with this...
+ --Not deadly at all.--
+
+Sink over the horizon 90
+-Strange. You will be easily trapped.
+
+Incomplete Reflective 120
+-Start in peace, end in mess.
+ Remark: one in four bullets will explode when it hits the wall.
+
+Level -2(Assess) 10/?
+
+You will certainly die. So let me predict your cause of death...
+
+Directed bullet
+-This is actually a copy of...
+ Towers don't collide you, however they should do so.
+ You may end up in... whatever you want.
+
+Random bullet
+-Pure random.
+ Are they getting faster?
+ You may end up in a huge mess.
+
+Constant patterns
+-Pretty awesome.
+ Doesn't look like anything.
+ You may end up in a horror.
+
+Crossing 1(L+R)
+-They started spinning!!!
+ You may end up like a juicy orange in a squeezer.
+
+Crossing 2(C)
+-Used by Moriya Suwako...
+ Round bullets made me dizzy.
+ You may end up like...
+ That scene is really terrible!
+
+Trappy
+-The name is strange...
+ Remark: The lasers created just over you are not created there on purpose...
+ However, one third of the bullets could be directed.
+ You may end up without your awareness.
+
+Sine wave
+-Oscilloscope?
+ Find a good place to vibrate with the graph...
+ Remark: Some positions will cause death instantly!
+ You may end up...
+ Oops! I can't find you on that broken oscilloscope!
+
+Density test
+-Really high density.
+ WTF? There's no way?!
+ You MUST end up in a horrible traffic accident, squeezing every drop of blood
+ out on the left board. That's really a bad image.
+
+"Pinballs"
+-Well... They have collisions since r93!
+ These balls spawn with random velocity!
+ You may end up...
+ just imagine an eXtra-eXtra Large sized bowling ball flying direct towards you.
+
+Road Blocks
+-You'll understand this one day.
+ --Flappy square?...
+ You death cause could be the same as the one in "Density test".
+ Don't ask why. I feel sick now...
+
+Extreme High speed
+-Copy of one part in level 5.
+ You may end up in just *two* seconds.
+
+Laser crosses
+-Only a show off of the Laser class.
+ You might end up like... Coal Dust? (Sorry I'm playing Industrial Craft2 these
+ days)
+
+Bonus test: Lunatic Lunar!
+-May be the legacy of a vintage game...
+ You may end up... sorry, this in not predictable.. \ No newline at end of file
diff --git a/archive/blr2/Levels.zh b/archive/blr2/Levels.zh
new file mode 100644
index 0000000..123b1e6
--- /dev/null
+++ b/archive/blr2/Levels.zh
@@ -0,0 +1,330 @@
+BulletLabRemixII
+关卡列表、说明和提示
+
+此文档仍未完成。
+如果它误导了你,也不要来找我啊。。。
+
+强烈推荐在阅读本文档前先自己玩一下。
+
+不适宜人群:
+?
+
+
+
+适宜人群:
+?
+
+
+
+
+
+
+
+
+
+======================警告:下面有好多好多字!======================
+Level 1 2/180
+River levels 120
+-为什么第一关就这么多子弹…
+ 其实非常简单,别作死就行。(而那些“+1”就是要你这么做。)
+
+Double-directed labyrinth 60
+-还是非常简单。
+
+Level 2 4/215
+Polygon-red 60
+-这个也不难…
+ 外面那一圈没有看上去的那么麻烦。
+
+Polygon-white 60
+-利用好shift键(我的shift键已经卡在键盘里弹不出来了)。
+
+Polygon-white locked 6
+-你不能在竖直方向上移动了!
+ 找一个好的位置呆着。
+
+Polygon-both 30
+-这关毫无意义。
+
+Level 3 4/150
+Reflective 30
+-初次见面,它们看起来还挺友好的是吧?
+
+*4 30
+-稍微有点难…离边框远点!
+
+Rotate ???? 60
+-不要靠近那些旋转的子弹。
+
+Wall of blues? 30
+-相当简单。别刷擦蛋,除非你是大触。
+ 看起来很厉害?
+
+Level 4 5/243
+Orange 30
+-高速子弹非常烦人。
+
+Orange trap 5+5+4+4+3+3+2+2+5
+-别按shift!
+
+Double spinner 60
+-对于第4关来说算是简单的部分。
+
+Squash-2 60
+-好好享受…
+ 我想这可能会让情况变得更坏。
+
+Circle-drawing 60
+-画圈就行了。
+ 如果你有任何问题,去试试BLR 1.
+
+Level 5 8/338
+CChase 30+30
+-不要把移动速度设置为1!
+ 说明:它们不是真的比你快…
+
+Vortex of leaves 60
+-另一个烦人的关卡,看着挺好看,但是也很难。
+ 离那些“激光”远点!
+ 说明:激光的判定可能有点奇怪。
+
+Upstream flow 60
+-相当简单了。
+ 看起来有点像第3关。
+
+High speed threaten 30
+-这只是吓唬人的!
+ 你需要精准的移动。
+ 或许如果你不能水平移动的话这关会简单一点…
+
+Crossing threaten 30
+-看起来非常难。
+ 选择正确的时机穿过它们。
+
+Orange trap2 2+2+2+5
+-第4关?
+
+Fish in the barrel 60
+-好像越来越快了?不…
+ 说明:那些子弹是“自机狙”。
+
+the Unbreakable jail 30
+-相当难…如果感觉到了请使用CLR。
+ 说明:当那个“轮子”变红的时候,它就要更新它的位置了。如果你在它更新位置
+ 的时候一直移动,它将卡在更新模式,否则它会停下来。
+
+Level 6 7/390
+Snow WHITE 30
+-太快了…多用CLR…
+ 说明:它们还被加速了!
+
+Photokeratitis 10+10+10+10+10
+-这关曾经难的丧心病狂…
+ 区别对待快速弹和慢速弹。
+ 说明:看着有点像谁的符卡…
+ 到r94以后,这关没有之前那么难了。如果你不动的话,快速弹根本打不到你。
+
+Squash-4(?) 60
+-别被困在里面!你只需要一个CLR!
+
+Avalanche 60
+-不要呆在屏幕底端,那里非常危险…
+
+Dangerous target 60
+-别停下来!
+ 如果你的移动速度设置的很慢,那这将是一场噩梦…
+ 说明:“轮子”就像黄色子弹一样跟着你,但是姿势不同。
+
+Hexagon loops 10+20+7+7+7+19
+-找个角落停下来然后观看表演。
+ 说明:如果FPS低于55,那么这关可能会变形…
+
+Hyperfluid 60
+-超流体。
+ 其实液氦还不够冷,本来这部分还可以更冷一些的…
+ 说明:蓝色子弹是加速的,而白色的没有。所有蓝色子弹的方向都是相同的。
+ 如果限制水平移动的话会简单一些。
+
+Level 7 12/930+ Mapped levels
+Spring thunder storm - panic? 60 Thunder storm...
+-虽然代码是基于上一关写的(看着也很像),但是它们完全不同!
+ 这个真的很简单…
+ 说明:试着在屏幕顶端躲避…
+ 这次试着限制一下竖直方向的移动…
+
+Rainbow tower - color theory 90 rainbow tower
+-基础的关卡。
+ 说明:这关是从很老的试验版本的BLR2中拿出来的。
+
+Rainbow bullets - nauty photon 60 Lazy level;)
+-看着很像第一关的什么东西,但是难多了!
+ 很拼RP…
+ 说明:生成子弹的过程比较奇怪……
+
+Rainbow effect - appearance 60 draw a rainbow (of bullet)
+-随机弹。你一看到这一关就会记住它的。
+ 如果你感觉太难,试试评估模式吧。
+ 说明:组成彩虹的子弹是不会被消掉的。
+
+Rainbow effect - interference 120 as the name tells
+-*真的*太简单了…但是为什么呢?
+
+Rainbow effect - diffraction 120 as the name tells
+-相当难。那一大坨有可能糊你一脸。
+ 代码也很难看。
+
+Rainbow effect - photon school 60 "particalization"!
+-仍然相当难(某人:这都第几关了你也不看看……)
+ 如果你靠近边缘的话可能会简单一点(其实我不知道)。
+
+Over the Rainbow - infinity challenge - great circles
+-你的目标是冲到红格子上…
+ 并且这个也很难……
+ 如果你技术不过关,并且在玩自由模式,试试“自杀”(<-删除线),这比“好好玩”要经济得多!
+ 说明:如果你不去碰那个红格子,这关永远不会结束……
+
+Trypophobia 120 another two classes: Tail & Pile
+-非常难。你永远不知道它们接下来会进入哪个格子(它们自己也不知道)。
+ 但是它们不会踏上同一个格子两次。
+ 这会引起密集恐惧症吗?
+ 说明:这关几乎要烧掉我的电脑了……
+ 我好像忘了一件重要的事情:刚生成的带生成效果的子弹是没有碰撞判定的…
+
+Photon fission 90 Use a slightly modified tower8...
+-自机狙+随机弹。
+ 这是有公式的…
+
+Wave of Photon 60 class WOP+Lazy of particalization
+-一开始一点也不难…
+
+Return to void 90 return (void)(...);
+-非常难!!!(汉字不能大写真是太遗憾了。)
+ 我不知道这是从哪儿来的。
+ CLR没什么用处,但是它会给你短暂的无敌时间…
+ 说明:有无解的情况…
+
+Level -1(Extreme) 7/1020
+unknown circles1 60
+-它们靠近边缘的时候会慢下来。*实在是太烦人了!!!*
+
+unknown circles2 60
+-它们直接堆积在边缘附近了!而且变得越来越厚!!……
+
+Spiky 120
+-一个字:难!它们的行为是无法预测的。
+ 说明:重复一遍,不要碰激光!会伤害眼睛的…
+
+Achromatopsia 120(90+30)
+-没有路了?
+ 好好看看这关的名字(色盲)……
+ 或者我们可以把这关叫做"绿色盲 vs 红色盲"?
+ 说明:颜色变换是突然发生的!
+
+Quad thread 120
+-人类大脑真的支持这个么?
+ 说明:我的不行…
+
+Gravity vortex 120
+-跟引力什么的一点关系都没有,但是很难!
+ 看着挺好看。
+
+Supernova(additive blending) 120
+-积攒了足够的能量之后,它们爆炸了——超新星!
+ 我非常愿意写这种简单的关卡…
+ 说明:刚生成的子弹…我不能提示更多了。
+
+yellow explosive 90
+-没什么可写的关了,于是我就想到了这个。
+ --一点也不致命。--
+
+Sink over the horizon 90
+-非常奇怪。经常莫名其妙的被封。
+
+Incomplete Reflective 120
+-在平静中开始,一团糟中结束。
+ 说明:有四分之一的子弹会在碰到墙时爆炸。
+ Remark: one in four bullets will explode when it hits the wall.
+
+Level -2(Assess) 10/?
+“评估”关卡
+
+由于你到最后肯定会死,所以我来试着预测一下你的死因吧…
+
+Directed bullet
+定向子弹
+-这其实又是复制的什么……
+ “塔”并不会影响你,但这其实不是我想要的…
+ 你的结局可能是…这关玩成什么样都有可能啊。
+
+Random bullet
+随机子弹
+-彻彻底底的随机。
+ 它们在变快?
+ 你会在一片混乱中结束旅程。(我猜的)
+
+Constant patterns
+固定的图案
+-挺好看的(…)
+ 但是什么都不像。
+ 结局:在恐惧中被干掉?
+
+Crossing 1(L+R)
+交叉1(左右)
+-它们转起来了!
+ 结局:想象一下榨汁机中多汁的橙子。
+
+Crossing 2(C)
+交叉2
+-直接来自泄矢 诹访子的符卡。
+ 圆形的子弹有点令人晕头转向。
+ 结局:你猜?
+
+Trappy
+陷阱(形容词…)
+-名字很奇怪…
+ 说明:激光没有故意被生成在你的位置。
+ 但是,有三分之一的可能性,它们生成的子弹会朝你飞过来。
+ 结局:你在撞上去之前还什么都不知道?
+
+Sine wave
+正弦波
+-示波器?
+ 找一个合适的位置,跟图像一起振动…
+ 说明:有些地方是秒撞的!
+ 结局:喂,我在那个坏掉的示波器上找不到你啊…
+
+Density test
+密度测试
+-这个密度真的很高…
+ ××?!没路了?
+ 结局:
+ 玩家×××
+ 死于一场可怕的车祸,每滴血都被*挤*到了左边的墙上。
+ 这景象真是有点可怕。
+
+"Pinballs"
+“弹球”
+-从r93开始,它们之间也会碰撞了!
+ 这些球生成时速度是随机的。
+ 结局:想象一个大号的保龄球冲你飞了过来。
+
+Road Blocks
+路障
+-最终你还是能理解这个的…
+ --Flappy square?...
+ 结局:可能跟“密度测试”那关很像。
+ 别问为什么,现在我有点想吐……
+
+Extreme High speed
+超高速
+-和第5关某部分类似。
+ 你可能不到两秒就撞了!
+
+Laser crosses
+-炫耀激光class?
+ 结局:煤粉?(对不起,我最近一直在玩工业2…)
+
+Bonus test: Lunatic Lunar!
+奖励:Lunatic Lunar!
+-某个古老游戏的什么遗产?
+ 结局:不能预测。 \ No newline at end of file
diff --git a/archive/blr2/Readme b/archive/blr2/Readme
new file mode 100644
index 0000000..9161aca
--- /dev/null
+++ b/archive/blr2/Readme
@@ -0,0 +1,288 @@
+This text is encoded in UTF-8.
+
+This file is mainly about BulletLabRemix II. BulletLabRemix III is still under
+heavy development and can be found in the 'src' directory. The implementation
+of the script virtual machine is mostly complete, although many functions are
+still unimplemented.
+
+
+BulletLabRemix II readme
+
+Content
+------------------------------------------------------------------------------------
+What's this?
+Story
+Generic Information
+Game Modes
+Command line options
+About the author
+"Black History"
+Brief History
+
+What's this?
+------------------------------------------------------------------------------------
+"As the name tells", it's the continue, or "free" replacement of Bullet LAB from
+Game Boltz, which is a tiny flash game. Having no proprietary software dependences,
+it's goal is making the original game "free" and more challanging.
+
+This is the second work of BulletLabRemix. Compared to the first work, it's much
+more mature. However, it's still far away from a complete "framework". And it may
+be full of bugs...
+
+Story
+------------------------------------------------------------------------------------
+THE STORY OF THE COLOURS
+Once upon a time the colors of the world started to quarrel, all claimed that they
+were the best the most important the most useful the favorite.
+GREEN said:
+「Clearly I am the most important. I am the sign of life and of hope. I was chosen
+for grass and trees leaves. Without me all animals would die. Look over the
+countryside and you will see that I am in the majority.」
+BLUE interrupted...
+「You only think about the earth but consider the sky and the sea. It is the water
+that is the basis of life and drawn up by the clouds from the deep sea. The sky
+gives space and peace and serenity. Without my peace you would all be nothing.」
+YELLOW chuckled:
+「You are all so serious. I bring laughter gaiety and warmth into the world. The
+sun is yellow, the moon is yellow and the stars are yellow. Every time you look at
+a sunflower, the whole world starts to smile. Without me there would be no fun.」
+ORANGE started next to blow her trumpet.
+「I am the color of health and strength. I may be scarce but I am precious, for I
+serve the needs of human life. I carry the most important vitamins. Think of
+carrots, pumpkins, oranges, mangoes and pawpaws. I don't hang around all the time
+but when I fill the sky at sunrise or sunset, my beauty is so striking that no one
+gives another thought to any of you.」
+RED could stand it no longer. He shouted out:
+「I am the ruler of all of you - I am
+blood - lifes blood I am the color of danger and of bravery. I am willing to fight
+for a cause. I bring fire into the blood. Without me the earth would be as empty as
+the moon. I am the color of passion and of love, the red rose, the poinsettia and
+the poppy.」
+PURPLE rose up to his full height. He was very tall and spoke with great pomp:
+「I am the color of royalty and power. Kings chiefs and bishops have always chosen
+me for I am the sign of authority and wisdom. People do not question me - they
+listen and obey.」
+Finally INDIGO spoke much more quietly than all the others but with just as much
+determination:
+「Think of me. I am the color of silence. You hardly notice me but without me you
+all become superficial. I represent thought and reflection twilight and deep water.
+You need me for balance and contrast for prayer and inner peace.」
+And so the colors went on boasting each convinced of his or her own superiority.
+Their quarreling became louder and louder. Suddenly there was a startling flash of
+bright lightening - thunder rolled and boomed. Rain started to pour down
+relentlessly. The colors crouched down in fear drawing close to one another for
+comfort.
+In the midst of the clamor rain began to speak:
+「You foolish colors fighting amongst yourselves, each trying to dominate the rest.
+Don't you know that you were each made for a special purpose, unique and different?
+Join hands with one another and come to me!」
+Doing as they were told, the colors united and joined hands. The rain continued:
+「From now on when it rains each of you will stretch across the sky in a great bow
+of color as a reminder that you can all live in peace. The rainbow is a sign of
+hope for tomorrow. And so whenever a good rain washes the world and a rainbow
+appears in the sky let us remember to appreciate one another.」
+------------------------------------------------------------------------------------
+Well, that was about hundreds of thousand years ago.
+After a catastrophic disaster, they found some of them were missing...
+------------------------------------------------------------------------------------
+
+Generic Information
+------------------------------------------------------------------------------------
+My own comment on this game...
+A "game" filled with the smell of mysterious science and imagination(3:2 approximately).
+(I worked on it for almost 9 months, after all.)
+Others' comments...
+-PIECE OF SHIT!!!
+-The author must be suffering from serious mental problems.(I agree...)
+-(literally translated from Chinese) Revenge on society...
+
+Requirements & Recommends
+Basic environment:
+CPU: 1GHz.
+RAM: 256MiB.
+GPU&VRAM: With DirectX 9+/OpenGL 1.2+ support.
+OS*: Windows XP+ & DirectX 9 / Linux kernel 2.6+ & OpenGL 1.2+
+Recommended environment:
+CPU: Lots of cores.
+GPU&VRAM: Very fast graphic rendering.
+Sound: Ability to run OpenAL software version.
+
+*: According to Micro$oft and MinGW, this game should also run in Windows
+98(SE)/ME**, but who's still using that?
+**: The source code is just there. You can even port it to MS-DOS...
+
+MORE Recommends...
+-SERIOUSLY, NO Trypophobia!
+-CheatEngine(skip levels, obtain more Clear Range's, and more...)
+-Some editors or compilers(If you find this impossible and want to make it easier)
+-(Additionally for the last one)Ability to read non human-readable code.
+-Achromatopsia(<-strikethrough)
+
+How to install&run it...
+Windows:
+Just extract all files in the archive somewhere, then start the only executable
+file in it.
+Linux:
+See INSTALL.
+
+If, suddenly, you can't run it one day...
+Remove .blrrc then restart the game.
+It will ask you for initial settings.
+If this can't solve your problem, read FAQ.TXT for more.
+
+If you think something went wrong...
+Go to FAQ.txt.
+
+To Dear Windows Users
+This game is developed and tested mostly under Linux. The official Windows version is also
+built under Linux(awesome, isn't it?). It's only briefly tested.
+
+How to play it?
+This section has been moved to the built-in help. Select "help" in the main menu to view
+it.
+
+Menus
+-----------------------------------------------------------------------
+Main menu
+
+Start Select a mode and start the game.
+Highscores View highscores
+Options Settings and Options
+About A dull credits list.
+Exit Parents are coming!!
+
+Game Modes
+-----------------------------------------------------------------------
+Classic
+The game ends instantly if you get a collision. However you can choose
+to continue...
+
+This mode kills your time silently.
+
+Assessment Mode
+You are the frog being boiled: all levels get harder as time goes.
+You'll be brought to the next part if you had a collision.
+
+Most levels are designed to be IMPOSSIBLE after the elapsed time have
+exceeded a certain value.
+
+Go for the highest score!
+
+Free Play Mode
+You'll never die! Enjoy!...
+
+Options
+-----------------------------------------------------------------------
+Fullscreen Toggles fullscreen. Requires restart. You can also try Alt+Enter.
+VSync Toggles vsync. If your screen refresh rate is 60Hz, enable it.
+Clear Range Key Select key for calling/charging CLR.
+Resolution Select a resolution. Please note that the native reso. is 800x600.
+Music Volume Change music volume.
+SFX Volume Change SFX volume.
+Player Preference See below.
+
+Player Preference
+------------------------------------------------
+Moving Speed Speed when moving without holding shift.
+Precise Moving Speed Speed when moving holding shift.
+Clear Range Bonus Get more CLR's for each part.
+Clear Range Mode Change CLR mode.
+Ability Point If this value is greater than 10000, you can't save your settings.
+
+Command line options
+------------------------------------------------------------------------------------
+Yes, it accept command line options! (And some of them may be very useful...)
+You can override your settings with them if you can't start it after changing the settings.
+However they may cause strange behavior or crashes. So use with caution.
+Invalid parameters may cause unexpected behavior, (e.g. --start with inappropriate parameters)
+they should be used for debug purpose. But if you use it for cheating, I'm not against it.
+If it's run without arguments, the game will start normally.
+Otherwise... see below.
+--help Print command line usage and exit.
+--version Print version and exit.
+--start=x,y Start free play mode directly from level x part y. The part must be valid.
+--nosound Forcibly use no sound.
+--fullscreen=1/0 Forcibly use fullscreen/windowed. This will override your configuration.
+--vidmode=0~4 Forcibly use specific video mode instead the one in the configuration.
+ 0 800x600 (native resolution)
+ 1 640x480
+ 2 960x720
+ 3 1024x768
+ 4 1280x960
+--firststartup Forcibly run first start up. The score file will be preserved if exist.
+--fast Fast mode. All levels are two times shorter.
+--logfile=... Use an alternate log file name instead of the default "BLRLOG.txt".
+--nohideconsole Do not hide console (Windows version only).
+
+About the author
+------------------------------------------------------------------------------------
+-Senseless(this word has multiple means...)
+-Often know nothing to do next. If I accidently got it, I would do it at once.
+(slowly, though)
+-「The perfect balance of code length and efficiency 」
+-One of those "who (like to) live on the edge". --according to Debian maintainers.
+-Strange (as many people say)
+
+This is my first(or second?) time making so big a project. So, this game is written
+for a "framework" rather than the game itself. However, the "framework" seems to be
+very incomplete till now. Everything is still code...(Maybe this is just the
+"framework"?)
+
+Well, one day textures may also become code... That is, all textures will be drawn
+to the memory during the initialization...
+
+"Black History"
+------------------------------------------------------------------------------------
+This game first started as an simple hge&c++ rewrite of the original game "BulletLab".
+For an unknown reason, it became bigger and bigger, the core of hge is even altered.
+Several months or so after the creation of the project, BLRI(aka "The Creature of
+Colour") released.
+
+As BLRI was being finished, BLRII was forked from the code base of BLRI.
+Several "testbed" version was created over the code base of BLRI.
+Then the pre-release version created. Almost all original code from BLRI is removed.
+Now it has reached a position that I've never expected...
+
+See "The development" in the file "Extras" for more details.
+
+Brief History
+------------------------------------------------------------------------------------
+The file ChangeLog contains the full history of this project.
+Here's a list of released-to-public versions.
+0.9.9-0 (r99)
+The final Release Candidate. Complete the whole game system.
+Fixing most of the bugs.
+
+0.9.1-1_PR (r86)
+Comes with all levels that will appear in the final release.
+Done menu rewrite.
+Make multiplier system functional.
+
+0.7.3-0_PR (b73)
+Comes with all seven "normal" levels.
+Many bug fixes, making the Windows port (almost) stable.
+Huge code changes happened here.
+
+0.4.4-0_PRG (b37a)
+Comes with four levels and some parts of the fifth level.
+Contains several bug fixes.
+
+0.2.9-1_PR (b21)
+First public prerelease version.
+Comes with two levels.
+Introduced multiplier system, not functional yet.
+
+0.1.7-2_PR (b16)
+Level 1 is finished.
+
+TB130907 (b10)
+Laser implementation rev 2.
+
+TB130827 (b8)
+Initial laser implementation.
+
+TB130620~TB130818 (b1~b7)
+New towers and new levels.
+
+TB130610 (b0)
+Creation of the Testbed version. \ No newline at end of file
diff --git a/archive/blr2/Readme.zh b/archive/blr2/Readme.zh
new file mode 100644
index 0000000..f712fca
--- /dev/null
+++ b/archive/blr2/Readme.zh
@@ -0,0 +1,274 @@
+This text is encoded in UTF-8.
+这是一个提前发布的版本,这意味着:
+-它可能会崩溃,甚至导致数据丢失。
+-奇怪的行为。
+-代码都可能编译不了!
+
+BulletLabRemix II Readme - 一个类似机翻的中文版
+
+目录
+------------------------------------------------------------------------------------
+这是什么?
+背景
+概要
+模式
+命令行选项
+关于作者
+历史
+简短的版本历史
+
+
+这是什么?
+------------------------------------------------------------------------------------
+“正如名字告诉你的”,它是GameBoltz的一个小flash游戏——Bullet LAB的延续,或者“自由”替代品。
+它不依赖任何专有的软件。它的目标是让原游戏变得“自由”并且更具挑战性。
+这是BulletLabRemix的第二个版本。与第一个版本比起来,它成熟得多。但是,它离一个完整的“框架”还差得远。
+并且它还有可能到处是bug…
+
+背景
+------------------------------------------------------------------------------------
+//听说已经是高中英语完型填空了,就偷懒不翻译了…
+THE STORY OF THE COLOURS
+Once upon a time the colors of the world started to quarrel, all claimed that they
+were the best the most important the most useful the favorite.
+GREEN said:
+「Clearly I am the most important. I am the sign of life and of hope. I was chosen
+for grass and trees leaves. Without me all animals would die. Look over the
+countryside and you will see that I am in the majority.」
+BLUE interrupted...
+「You only think about the earth but consider the sky and the sea. It is the water
+that is the basis of life and drawn up by the clouds from the deep sea. The sky
+gives space and peace and serenity. Without my peace you would all be nothing.」
+YELLOW chuckled:
+「You are all so serious. I bring laughter gaiety and warmth into the world. The
+sun is yellow, the moon is yellow and the stars are yellow. Every time you look at
+a sunflower, the whole world starts to smile. Without me there would be no fun.」
+ORANGE started next to blow her trumpet.
+「I am the color of health and strength. I may be scarce but I am precious, for I
+serve the needs of human life. I carry the most important vitamins. Think of
+carrots, pumpkins, oranges, mangoes and pawpaws. I don't hang around all the time
+but when I fill the sky at sunrise or sunset, my beauty is so striking that no one
+gives another thought to any of you.」
+RED could stand it no longer. He shouted out:
+「I am the ruler of all of you - I am
+blood - lifes blood I am the color of danger and of bravery. I am willing to fight
+for a cause. I bring fire into the blood. Without me the earth would be as empty as
+the moon. I am the color of passion and of love, the red rose, the poinsettia and
+the poppy.」
+PURPLE rose up to his full height. He was very tall and spoke with great pomp:
+「I am the color of royalty and power. Kings chiefs and bishops have always chosen
+me for I am the sign of authority and wisdom. People do not question me - they
+listen and obey.」
+Finally INDIGO spoke much more quietly than all the others but with just as much
+determination:
+「Think of me. I am the color of silence. You hardly notice me but without me you
+all become superficial. I represent thought and reflection twilight and deep water.
+You need me for balance and contrast for prayer and inner peace.」
+And so the colors went on boasting each convinced of his or her own superiority.
+Their quarreling became louder and louder. Suddenly there was a startling flash of
+bright lightening - thunder rolled and boomed. Rain started to pour down
+relentlessly. The colors crouched down in fear drawing close to one another for
+comfort.
+In the midst of the clamor rain began to speak:
+「You foolish colors fighting amongst yourselves, each trying to dominate the rest.
+Don't you know that you were each made for a special purpose, unique and different?
+Join hands with one another and come to me!」
+Doing as they were told, the colors united and joined hands. The rain continued:
+「From now on when it rains each of you will stretch across the sky in a great bow
+of color as a reminder that you can all live in peace. The rainbow is a sign of
+hope for tomorrow. And so whenever a good rain washes the world and a rainbow
+appears in the sky let us remember to appreciate one another.」
+------------------------------------------------------------------------------------
+Well, that was about hundreds of thousand years ago.
+After a catastrophic disaster, they found some of them were missing...
+------------------------------------------------------------------------------------
+
+概要
+------------------------------------------------------------------------------------
+本人对该游戏的看法
+一个充斥着神秘的科学和想象气息的「游戏」(大约有3:2?)
+(毕竟是9个月的工作啊)
+别人的看法…
+-「一坨屎!!!」
+-「作者有精神疾病?」(我同意…)
+-「报复社会?」
+
+运行环境要求&推荐项目
+必需环境:
+CPU: 1GHz.
+RAM: 256MiB.
+GPU&VRAM: 支持DirectX 9+或者OpenGL 1.2+.
+操作系统*: Windows XP+ & DirectX 9 / Linux kernel 2.6+ & OpenGL 1.2+
+推荐环境:
+CPU: 大量的处理器核心。
+GPU&VRAM: 非常快的渲染速度。
+声音: 能够运行OpenAL软件版。
+
+*: 根据微软和MinGW的说法,本游戏*应该*也能在Windows 98(SE)/ME**下运行。但是谁
+还在用那种东西呢?…
+**: 反正源代码都有。你甚至可以考虑把它移植到MS-DOS…
+
+*更多*推荐项目…:
+-严肃的一项:不能有密集恐惧症!
+-CheatEngine(跳关,获取更多CLR…)
+-编辑器和编译器(如果你发现它太难,想要让它变简单些)
+-(附加在上一条之上)能读懂及其丑陋的代码。
+-全色盲(<-删除线)
+
+如何安装/运行它…
+Windows:
+只需要把压缩包中的所有文件解压到某个地方,然后运行其中唯一的一个可执行程序就行了。
+Linux:
+见INSTALL文件。
+
+如果有一天你突然无法运行它了…
+删掉.blrrc然后重新运行。它会重新进行初始化设定。
+如果这样无法解决你的问题,去看看FAQ.TXT。
+
+如果你认为什么东西出错了…
+->FAQ.TXT
+
+致亲爱的Windows用户
+开发和测试基本是在Linux下进行的。发布的Windows版也是从Linux下编译的(听起来很厉害?)。Windows版
+只进行过简单的测试。
+
+怎么玩?
+这部分已经移动到游戏内的帮助里了,它在主菜单的help选项中。
+如果您看不懂,建议使用机器翻译…
+
+菜单
+------------------------------------------------------------------------------------
+主菜单
+-----------------------------------------------------------------------
+Start 选择一个模式并开始游戏。
+Highscores 浏览高分记录。
+Options 设置和选项。
+About 一个无聊的制作人员名单。
+Exit ××来了!
+
+模式
+-----------------------------------------------------------------------
+Classic 经典模式
+一旦你碰到了任何有判定的东西就立刻结束游戏。不过你可以选择继续…
+
+这种模式非常浪费时间…
+
+Assessment Mode 评分/检测模式
+温水煮青蛙实验:所有的关卡都会随着时间流逝而变难。
+如果你撞到了有判定的东西,就会进入下一关…
+
+大多数的关卡最后都会变成无法通过的…(当时间超过某个设定好的值之后)
+
+试着撑过最长的时间吧!
+
+Free Play Mode 自由模式
+永远不会死的模式!…
+
+选项
+-----------------------------------------------------------------------
+Fullscreen 是否全屏。重启程序后生效。你也可以试试Alt+回车。
+VSync 是否开启垂直同步。如果你的屏幕刷新率是60Hz就启用它。
+Clear Range Key 选择一个用于使用CLR或为CLR“蓄力”的键。
+Resolution 选择分辨率。默认分辨率是800x600。
+Music Volume 更改背景音乐的音量。
+SFX Volume 更改音效的音量。
+Player Preference 见下面。
+
+Player Preference
+------------------------------------------------
+Moving Speed 不按shift时的移动速度。
+Precise Moving Speed 按住shift时的移动速度。
+Clear Range Bonus 在每关开始时获得更多CLR。
+Clear Range Mode 更改CLR的模式。
+Ability Point 如果该数值超过10000,你无法保存此页的设置。
+
+命令行选项
+------------------------------------------------------------------------------------
+是的,它还接受命令行选项!(而且它们中有些还可能比较有用…)
+如果你调整了设置后无法运行了,你可以用它们来覆盖你的设置。
+但是它们中一些可能导致奇怪的行为或者崩溃。所以请小心使用。
+不合法的参数可能会导致不希望得到的结果(例如--start+不合适的参数)
+它们本来只应该用于调试目的。但是如果你要用它们来作弊,也没人反对…
+如果不带任何参数运行,游戏会以正常模式启动。
+其他情况的话。。。:
+--help 输出命令行用法并退出。
+--version 输出版本信息并退出。
+--start=x,y 直接从x关y部分开始自由模式的游戏。这个部分必须合法。
+--nosound 强制无声。
+--fullscreen=1/0 强制使用全屏/窗口模式。指定该选项后,直接无视blr.cfg中的全屏选项。
+--vidmode=0~4 强制使用指定的窗口尺寸。
+ 0 800x600 (原生大小)
+ 1 640x480
+ 2 960x720
+ 3 1024x768
+ 4 1280x960
+--firststartup 假定是第一次运行。如果分数记录文件存在的话它会被保留。
+--fast 「高速」模式。所有关卡都会变短两倍。
+--logfile=... 使用指定的日志文件名。
+--nohideconsole 不隐藏命令行输出窗口。(仅限Windows版本。)
+
+关于作者
+------------------------------------------------------------------------------------
+-Senseless(this word has multiple means...)
+-Often know nothing to do next. If I accidently got it, I would do it at once.
+(slowly, though)
+-「The perfect balance of code length and efficiency 」
+-One of those "who (like to) live on the edge". --according to Debian maintainers.
+-Strange (as many people say)
+
+这是我第一次(或者是第二次?)搞这么大的一个工程。所以这次与其说是写一个游戏,还不如说只是写了一个
+“框架”。但是,这个“框架”到现在看起来还非常不完整。所有东西都还是代码…(或许这样也算是一种「框架」?)
+
+好吧,有一天贴图甚至都会变成代码了…到那时贴图会在初始化时被现画到内存里…
+
+历史
+------------------------------------------------------------------------------------
+这个工程本来只是作为一个BulletLab的hge&C++重写开始的。
+由于未知的原因,它越来越大,甚至都改变了hge的核心。
+工程开始几个月后,BLRI(The Creature of Colour)发布了。
+
+当BLRI快要完成的时候,BLRII从BLRI中fork了出来。
+当时在BLRI代码的基础上建立了几个测试版本。
+后来预发布版建立了,几乎所有来自BLRI的代码都被删掉了。
+现在它达到了一个我从未期望它能达到的阶段…
+
+简短的版本历史
+------------------------------------------------------------------------------------
+ChangeLog包含了该工程的全部历史。
+这里是一个「里程碑」的列表。
+0.9.9-0 (r99)
+最终的候选版本。完成了整个游戏系统。
+修复了大部分的bug。
+
+0.9.1-1_PR (r86)
+当前的公开版本。已经包含了所有会出现在最终版本里的关卡。
+菜单重写完成。
+“倍数系统”终于能正常工作了。
+
+0.7.3-0_PR (b73)
+包含7个关卡。
+众多问题修复,Windows版基本稳定了。
+代码发生了巨大的变化。
+
+0.4.4-0_PRG (b37a)
+包含4个多一点的关卡。
+修正了一部分问题。
+
+0.2.9-1_PR (b21)
+第一个公开版,包含两个完整的关卡。
+初次出现了“倍数”系统,但是没有实际作用。
+
+0.1.7-2_PR (b16)
+第一关完成。
+
+TB130907 (b10)
+激光实现重写。
+
+TB130827 (b8)
+最早的支持“激光”的版本。
+
+TB130620~TB130818 (b1~b7)
+添加新的“塔”和关卡。
+
+TB130610 (b0)
+试验版本建立。
diff --git a/archive/blr2/VERSION b/archive/blr2/VERSION
new file mode 100755
index 0000000..9f8cf97
--- /dev/null
+++ b/archive/blr2/VERSION
@@ -0,0 +1 @@
+1.0.0-0 (r101) \ No newline at end of file
diff --git a/archive/blr2/resources/b_diff.png b/archive/blr2/resources/b_diff.png
new file mode 100755
index 0000000..400cac9
--- /dev/null
+++ b/archive/blr2/resources/b_diff.png
Binary files differ
diff --git a/archive/blr2/resources/b_inter.png b/archive/blr2/resources/b_inter.png
new file mode 100644
index 0000000..00976a5
--- /dev/null
+++ b/archive/blr2/resources/b_inter.png
Binary files differ
diff --git a/archive/blr2/resources/b_leaves.png b/archive/blr2/resources/b_leaves.png
new file mode 100755
index 0000000..6bd4a8b
--- /dev/null
+++ b/archive/blr2/resources/b_leaves.png
Binary files differ
diff --git a/archive/blr2/resources/b_null.png b/archive/blr2/resources/b_null.png
new file mode 100755
index 0000000..7c60dce
--- /dev/null
+++ b/archive/blr2/resources/b_null.png
Binary files differ
diff --git a/archive/blr2/resources/bdig.fnt b/archive/blr2/resources/bdig.fnt
new file mode 100644
index 0000000..453c492
--- /dev/null
+++ b/archive/blr2/resources/bdig.fnt
@@ -0,0 +1,15 @@
+[HGEFONT]
+
+Bitmap=credits.png
+
+Char="-",340,354,23,33,0,0
+Char="0",6,354,30,33,0,0
+Char="1",46,354,14,33,0,0
+Char="2",72,354,29,33,0,0
+Char="3",105,354,29,33,0,0
+Char="4",140,354,26,33,0,0
+Char="5",171,354,28,33,0,0
+Char="6",204,354,29,33,0,0
+Char="7",238,354,27,33,0,0
+Char="8",269,354,31,33,0,0
+Char="9",302,354,31,33,0,0
diff --git a/archive/blr2/resources/blnsns.png b/archive/blr2/resources/blnsns.png
new file mode 100755
index 0000000..ae8f7d4
--- /dev/null
+++ b/archive/blr2/resources/blnsns.png
Binary files differ
diff --git a/archive/blr2/resources/charmap.fnt b/archive/blr2/resources/charmap.fnt
new file mode 100755
index 0000000..f31840d
--- /dev/null
+++ b/archive/blr2/resources/charmap.fnt
@@ -0,0 +1,99 @@
+[HGEFONT]
+
+Bitmap=blnsns.png
+
+Char=" ",1,1,3,36,-1,7
+Char="!",5,1,6,36,1,1
+Char=""",12,1,10,36,0,0
+Char="#",23,1,24,36,0,-1
+Char="$",48,1,15,36,0,-1
+Char="%",64,1,25,36,0,0
+Char="&",90,1,23,36,0,0
+Char="'",114,1,5,36,0,1
+Char="(",120,1,12,36,1,-1
+Char=")",133,1,12,36,-1,1
+Char="*",146,1,13,36,0,-1
+Char="+",160,1,15,36,-1,0
+Char=",",176,1,9,36,-1,0
+Char="-",186,1,13,36,0,0
+Char=".",200,1,7,36,0,0
+Char="/",208,1,10,36,0,0
+Char="0",219,1,20,36,0,0
+Char="1",240,1,9,36,11,0
+Char="2",250,1,16,36,4,0
+Char="3",267,1,16,36,4,0
+Char="4",284,1,18,36,2,0
+Char="5",303,1,17,36,3,0
+Char="6",321,1,17,36,3,0
+Char="7",339,1,17,36,3,0
+Char="8",357,1,17,36,3,0
+Char="9",375,1,17,36,3,0
+Char=":",393,1,7,36,0,0
+Char=";",401,1,9,36,-2,0
+Char="<",411,1,13,36,0,-1
+Char="=",425,1,15,36,0,0
+Char=">",441,1,12,36,0,0
+Char="?",454,1,15,36,-1,0
+Char="@",470,1,20,36,0,1
+Char="A",1,38,24,36,-1,-1
+Char="B",26,38,20,36,1,0
+Char="C",47,38,21,36,0,-1
+Char="D",69,38,22,36,1,0
+Char="E",92,38,17,36,1,0
+Char="F",110,38,17,36,1,0
+Char="G",128,38,23,36,0,0
+Char="H",152,38,22,36,1,1
+Char="I",175,38,6,36,1,1
+Char="J",182,38,9,36,-1,1
+Char="K",192,38,20,36,1,-1
+Char="L",213,38,17,36,1,0
+Char="M",231,38,25,36,1,1
+Char="N",257,38,22,36,1,1
+Char="O",280,38,25,36,0,0
+Char="P",306,38,20,36,1,0
+Char="Q",327,38,25,36,0,0
+Char="R",353,38,19,36,1,0
+Char="S",373,38,15,36,1,0
+Char="T",389,38,18,36,0,-1
+Char="U",408,38,20,36,1,1
+Char="V",429,38,21,36,0,0
+Char="W",451,38,30,36,0,0
+Char="X",482,38,20,36,0,-1
+Char="Y",1,75,20,36,0,0
+Char="Z",22,75,19,36,-1,-1
+Char="[",42,75,11,36,2,-1
+Char="\",54,75,10,36,0,0
+Char="]",65,75,11,36,-1,2
+Char="^",77,75,17,36,-1,0
+Char="_",95,75,17,36,-1,-1
+Char="`",113,75,11,36,0,1
+Char="a",125,75,19,36,0,0
+Char="b",145,75,17,36,1,1
+Char="c",163,75,13,36,0,1
+Char="d",177,75,18,36,0,1
+Char="e",196,75,15,36,0,1
+Char="f",212,75,12,36,-1,-1
+Char="g",225,75,17,36,0,1
+Char="h",243,75,16,36,1,1
+Char="i",260,75,7,36,1,0
+Char="j",268,75,9,36,-2,1
+Char="k",278,75,17,36,1,1
+Char="l",296,75,6,36,1,1
+Char="m",303,75,29,36,0,1
+Char="n",333,75,17,36,0,1
+Char="o",351,75,17,36,0,0
+Char="p",369,75,18,36,0,1
+Char="q",388,75,19,36,0,0
+Char="r",408,75,12,36,0,-1
+Char="s",421,75,9,36,0,1
+Char="t",431,75,12,36,-1,1
+Char="u",444,75,17,36,1,1
+Char="v",462,75,17,36,0,1
+Char="w",480,75,26,36,0,-1
+Char="x",1,112,14,36,0,1
+Char="y",16,112,15,36,0,1
+Char="z",32,112,14,36,0,0
+Char="{",47,112,13,36,0,-1
+Char="|",61,112,5,36,2,1
+Char="}",67,112,12,36,0,0
+Char="~",80,112,18,36,0,-1
diff --git a/archive/blr2/resources/credits.png b/archive/blr2/resources/credits.png
new file mode 100755
index 0000000..d647d86
--- /dev/null
+++ b/archive/blr2/resources/credits.png
Binary files differ
diff --git a/archive/blr2/resources/e_leaf.png b/archive/blr2/resources/e_leaf.png
new file mode 100755
index 0000000..d64d6ca
--- /dev/null
+++ b/archive/blr2/resources/e_leaf.png
Binary files differ
diff --git a/archive/blr2/resources/e_sflake.png b/archive/blr2/resources/e_sflake.png
new file mode 100644
index 0000000..963d85e
--- /dev/null
+++ b/archive/blr2/resources/e_sflake.png
Binary files differ
diff --git a/archive/blr2/resources/e_skyitem.png b/archive/blr2/resources/e_skyitem.png
new file mode 100644
index 0000000..e3e168b
--- /dev/null
+++ b/archive/blr2/resources/e_skyitem.png
Binary files differ
diff --git a/archive/blr2/resources/help.png b/archive/blr2/resources/help.png
new file mode 100644
index 0000000..32718ee
--- /dev/null
+++ b/archive/blr2/resources/help.png
Binary files differ
diff --git a/archive/blr2/resources/menus.png b/archive/blr2/resources/menus.png
new file mode 100644
index 0000000..9ce0aba
--- /dev/null
+++ b/archive/blr2/resources/menus.png
Binary files differ
diff --git a/archive/blr2/resources/ss.png b/archive/blr2/resources/ss.png
new file mode 100755
index 0000000..e34abbb
--- /dev/null
+++ b/archive/blr2/resources/ss.png
Binary files differ
diff --git a/archive/blr2/resources/tap.ogg b/archive/blr2/resources/tap.ogg
new file mode 100755
index 0000000..1ef00b0
--- /dev/null
+++ b/archive/blr2/resources/tap.ogg
Binary files differ
diff --git a/archive/blr2/resources/title.png b/archive/blr2/resources/title.png
new file mode 100644
index 0000000..f0801ef
--- /dev/null
+++ b/archive/blr2/resources/title.png
Binary files differ
diff --git a/archive/blr2/resources/vdig.fnt b/archive/blr2/resources/vdig.fnt
new file mode 100644
index 0000000..6d89742
--- /dev/null
+++ b/archive/blr2/resources/vdig.fnt
@@ -0,0 +1,20 @@
+[HGEFONT]
+
+Bitmap=credits.png
+
+Char=" ",541,279,1,50,33,5
+Char="(",326,278,23,61,0,0
+Char=")",354,278,23,60,0,0
+Char="-",512,279,29,50,0,0
+Char=".",483,279,7,50,13,14
+Char="0",244,222,42,50,0,0
+Char="1",305,222,15,50,0,0
+Char="2",341,222,39,50,0,0
+Char="3",389,222,39,50,0,0
+Char="4",440,222,34,50,0,0
+Char="5",485,222,39,50,0,0
+Char="6",533,222,39,50,0,0
+Char="7",248,279,34,50,0,0
+Char="8",383,279,43,50,0,0
+Char="9",433,279,39,50,0,0
+Char="r",293,279,29,50,0,0
diff --git a/archive/blr2/src/background.h b/archive/blr2/src/background.h
new file mode 100644
index 0000000..849438c
--- /dev/null
+++ b/archive/blr2/src/background.h
@@ -0,0 +1,574 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Background drawing Implementations
+// Copyright Chrisoft 2014
+#include <list>
+const char* BACKGROUND_H_FN="background.h";
+
+double deltaBG;
+//********************************************
+//Full-screen Leaves Background
+//********************************************
+class BG_Leaves
+{
+private:
+ DWORD alpha,alim;
+ bool onfadein,onfadeout;
+ int fadebreak;
+ hgeSprite* BGSpr;
+ HTEXTURE LeafTex;
+ void DoFadeIn()
+ {
+ if (LOWFPS)fadebreak+=17;else ++fadebreak;
+ if (fadebreak>17)fadebreak=0;else return;
+ if (LOWFPS)if(alpha+0x20<=alim)alpha+=0x20;else{}
+ else if (alpha+0x2<=alim)alpha+=2;
+ if (alpha>=alim)onfadein=false;
+ }
+ void DoFadeOut()
+ {
+ if (LOWFPS)fadebreak+=17;else ++fadebreak;
+ if (fadebreak>30)fadebreak=0;else return;
+ if (LOWFPS)
+ if (alpha<0x20)alpha=0;else alpha-=0x20;
+ else
+ if (alpha<0x2)alpha=0;else alpha-=0x2;
+ if (!alpha)onfadeout=0;
+ }
+public:
+ bool IsActive()
+ {
+ return alpha?true:false;
+ }
+ void Init(DWORD limalpha)
+ {
+ LeafTex=hge->Texture_Load("./Resources/b_leaves.png");
+ BGSpr=new hgeSprite(LeafTex,0,0,200,150);
+ BGSpr->SetColor(0x00CCCCCC);
+ onfadein=onfadeout=false;alpha=0x00;alim=limalpha;fadebreak=0;
+
+ }
+ void SetFadeIn()
+ {
+ alpha=0x01;
+ onfadein=true;
+ }
+ void SetFadeOut()
+ {
+ alpha=alim;
+ onfadeout=true;
+ }
+ void Update()
+ {
+ double tx,ty,dt;
+ if (onfadein)DoFadeIn();
+ if (onfadeout)DoFadeOut();
+ dt=hge->Timer_GetDelta();
+ deltaBG+=dt;
+ tx=200*cosf(deltaBG/10);
+ ty=150*sinf(deltaBG/10);
+ BGSpr->SetColor(ARGB(alpha,0xCC,0xCC,0xCC));
+ for (int i=-1;i<5;++i)
+ for (int j=-1;j<5;++j)
+ BGSpr->Render(i*199.0f+tx,j*149.0f+ty);
+ }
+};
+BG_Leaves Leaves;
+//********************************************
+//Animated Leaves Background
+//********************************************
+HTEXTURE TLeaf;
+HTEXTURE TSflake;
+bool LE_Active;
+double lescale;
+HTEXTURE letex;TextureRect letr;
+DWORD lecolor;
+class Leaf_Node
+{
+private:
+ hgeSprite* Leaf;
+ double Rotation,DRotate;
+ double x,y,dx,dy;
+public:
+ void init()
+ {
+ Leaf=new hgeSprite(letex,letr.x,letr.y,letr.w,letr.h);
+ Leaf->SetColor(lecolor);
+ x=rand()%908-108;y=-108;
+ dx=rand()%200/100.0f-1.0f;dx*=0.075;
+ dy=rand()%200/100.0f+0.5f;dy*=0.075;
+ Rotation=0;DRotate=rand()%100/10000.0f;DRotate*=0.1;
+ }
+ bool Update()
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ {
+ Rotation+=DRotate;
+ x+=dx;y+=dy;
+ }
+ if (x>908||x<-108||y>708)return 1;
+ Leaf->RenderEx(x,y,Rotation,lescale);
+ return 0;
+ }
+};
+class Leaf_Anim
+{
+public:
+ std::list<Leaf_Node> llist;
+ double brk;
+ void Init()
+ {
+ llist.clear();
+ brk=rand()%1000/1250.0f;
+ }
+ void Update()
+ {
+ brk-=hge->Timer_GetDelta();
+ if(brk<0)
+ {
+ brk=rand()%1000/1250.0f;
+ Leaf_Node a;a.init();
+ llist.push_back(a);
+ }
+ for(std::list<Leaf_Node>::iterator i=llist.begin();i!=llist.end();++i)
+ {
+ if(i->Update())
+ {
+ std::list<Leaf_Node>::iterator r=i;++r;
+ llist.erase(i);i=--r;
+ }
+ }
+ }
+}Leaf;
+//********************************************
+//3D-sky Background
+//Based on a hge tutorial
+//********************************************
+static const DWORD skyTopColors[3] = {0xFF15092A, 0xFF6C6480, 0xFF89B9D0};
+static const DWORD skyBtmColors[3] = {0xFF303E57, 0xFFAC7963, 0xFFCAD7DB};
+static const DWORD seaTopColors[3] = {0xFF3D546B, 0xFF927E76, 0xFF86A2AD};
+static const DWORD seaBtmColors[3] = {0xFF1E394C, 0xFF2F4E64, 0xFF2F4E64};
+static const int skyseq[9]={0, 0, 1, 2, 2, 2, 1, 0, 0};
+class TDSky
+{
+#define ScreenWidth 800
+#define ScreenHeight 600
+#define Stars 100
+#define SeaDisize 16
+#define SkyHeight (ScreenHeight*0.6f)
+#define StarsHeight (SkyHeight*0.9f)
+#define OrbitRadius (ScreenWidth*0.43f)
+private:
+ HTEXTURE skyitem;
+ hgeQuad skygrad;
+ hgeSprite *sun,*moon,*glow,*seaglow,*star;
+ hgeDistortionMesh *sea,*skylyr;
+ float timet,speed,skya,skylima,seq_residue;
+ int seq_id;
+ float starX[Stars],starY[Stars],starS[Stars],starA[Stars],seaP[SeaDisize];
+ hgeColor colWhite,colSkyTop,colSkyBtm,colSeaTop,colSeaBtm;
+ hgeColor colSun,colSunGlow;
+ hgeColor colMoon,colMoonGlow,colSeaGlow;
+ float sunX,sunY,sunS,sunGlowS;
+ float moonX,moonY,moonS,moonGlowS;
+ float seaGlowX,seaGlowSX,seaGlowSY;
+ bool skyOnFadeIn,skyOnFadeOut;
+ float GetTime()
+ {
+ struct tm *t=0;
+ time_t tt=time(NULL);
+ t=localtime(&tt);
+ float tmp=0;
+ if(t)
+ {
+ tmp=t->tm_sec;
+ tmp=t->tm_min+tmp/60.0f;
+ tmp=t->tm_hour+tmp/60.0f;
+ }
+ return tmp;
+ }
+ void SkyDoFadeIn()
+ {
+ float dlt=1.0f/hge->Timer_GetFPS();
+ if (skya+dlt<skylima)skya+=dlt;
+ else skya=skylima,skyOnFadeIn=false;
+ }
+ void SkyDoFadeOut()
+ {
+ float dlt=1.0f/hge->Timer_GetFPS();
+ if (skya-dlt>0)skya-=dlt;
+ else skya=0.0f,skyOnFadeOut=false;
+ }
+public:
+ bool Init()
+ {
+ skyitem=hge->Texture_Load("./Resources/e_skyitem.png");
+ if(!skyitem) return false;
+ skygrad.tex=0;skygrad.blend=BLEND_DEFAULT;
+ for(int i=0;i<4;++i)skygrad.v[i].z=0.5;
+ skygrad.v[0].tx=0;skygrad.v[0].ty=0;
+ skygrad.v[1].tx=1;skygrad.v[1].ty=0;
+ skygrad.v[2].tx=1;skygrad.v[2].ty=1;
+ skygrad.v[3].tx=0;skygrad.v[3].ty=1;
+ skygrad.v[0].x=0;skygrad.v[0].y=0;
+ skygrad.v[1].x=800;skygrad.v[1].y=0;
+ skygrad.v[2].x=800;skygrad.v[2].y=600;
+ skygrad.v[3].x=0;skygrad.v[3].y=600;
+ sea=new hgeDistortionMesh(SeaDisize, SeaDisize);
+ sea->SetTextureRect(0, 0, ScreenWidth, ScreenHeight-SkyHeight);
+ sun=new hgeSprite(skyitem,81,0,114,114);
+ sun->SetHotSpot(57,57);
+ moon=new hgeSprite(skyitem,0,0,81,81);
+ moon->SetHotSpot(40,40);
+ star=new hgeSprite(skyitem,195,0,9,9);
+ star->SetHotSpot(5,5);
+ glow=new hgeSprite(skyitem,204,0,128,128);
+ glow->SetHotSpot(64,64);
+ glow->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE);
+ seaglow=new hgeSprite(skyitem,204,96,128,32);
+ seaglow->SetHotSpot(64,0);
+ seaglow->SetBlendMode(BLEND_COLORADD | BLEND_ALPHAADD | BLEND_NOZWRITE);
+ skylyr=new hgeDistortionMesh(16, 16);
+ skylyr->SetTexture(skyitem);
+ skylyr->SetTextureRect(0,128,512,512);
+ skylyr->SetBlendMode(BLEND_ALPHAADD);
+ colWhite.SetHWColor(0xFFFFFFFF);
+ timet=GetTime();
+ speed=skya=0.0f;
+ for(int i=0;i<Stars;++i)
+ {
+ starX[i]=rand()%ScreenWidth;
+ starY[i]=rand()%((int)StarsHeight);
+ starS[i]=(rand()%60+10.0f)/100.0f;
+ }
+ for(int i=0;i<SeaDisize;++i)
+ {
+ seaP[i]=i+(rand()%300-150.0f)/10.0f;
+ }
+ return true;
+ }
+ void Deinit()
+ {
+ delete seaglow;delete glow;
+ delete star;delete moon;
+ delete sun;
+ delete sea;delete skylyr;
+ hge->Texture_Free(skyitem);
+ }
+ void SetSpeed(float _speed){speed=_speed;}
+ void SetSkyA(float _skya){skya=_skya;}
+ void SetTime(float _timet){timet=_timet;}
+ void SkySetFadeIn(float _starta=0.0f,float _lima=1.0f)
+ {
+ skya=_starta;skylima=_lima;
+ skyOnFadeIn=true;skyOnFadeOut=false;
+ }
+ void SkySetFadeOut(float _starta=0.0f)
+ {
+ if (_starta>1E-4)skya=_starta;
+ skyOnFadeIn=false;skyOnFadeOut=true;
+ }
+ void Update()
+ {
+ int i, j, k;
+ float zenith,a,dy,fTime;
+ float posX,s1,s2;
+ const float cellw=ScreenWidth/(SeaDisize-1);
+ hgeColor col1,col2;
+ DWORD dwCol1,dwCol2;
+ if(speed==0.0f) timet=GetTime();
+ else
+ {
+ timet+=hge->Timer_GetDelta()*speed;
+ if(timet>=24.0f) timet-=24.0f;
+ }
+ seq_id=(int)(timet/3);
+ seq_residue=timet/3-seq_id;
+ zenith=-(timet/12.0f*pi-pi/2.0f);
+ col1.SetHWColor(skyTopColors[skyseq[seq_id]]);
+ col2.SetHWColor(skyTopColors[skyseq[seq_id+1]]);
+ colSkyTop=col2*seq_residue + col1*(1.0f-seq_residue);
+ col1.SetHWColor(skyBtmColors[skyseq[seq_id]]);
+ col2.SetHWColor(skyBtmColors[skyseq[seq_id+1]]);
+ colSkyBtm=col2*seq_residue + col1*(1.0f-seq_residue);
+ col1.SetHWColor(seaTopColors[skyseq[seq_id]]);
+ col2.SetHWColor(seaTopColors[skyseq[seq_id+1]]);
+ colSeaTop=col2*seq_residue + col1*(1.0f-seq_residue);
+ col1.SetHWColor(seaBtmColors[skyseq[seq_id]]);
+ col2.SetHWColor(seaBtmColors[skyseq[seq_id+1]]);
+ colSeaBtm=col2*seq_residue + col1*(1.0f-seq_residue);
+ if(seq_id>=6 || seq_id<2)
+ for(int i=0; i<Stars; ++i)
+ {
+ a=1.0f-starY[i]/StarsHeight;
+ //a*=hge->Random_Float(0.6f, 1.0f);
+ a*=(rand()%40+60.0f)/100.0f;
+ if(seq_id>=6) a*=sinf((timet-18.0f)/12.0f*pi);
+ else a*=sinf((1.0f-timet/6.0f)*pi/2);
+ starA[i]=a;
+ }
+ if(seq_id==2) a=sinf(seq_residue*pi/2);
+ else if(seq_id==5) a=cosf(seq_residue*pi/2);
+ else if(seq_id>2 && seq_id<5) a=1.0f;
+ else a=0.0f;
+ colSun.SetHWColor(0xFFEAE1BE);
+ colSun=colSun*(1-a)+colWhite*a;
+ a=(cosf(timet/6.0f*pi)+1.0f)/2.0f;
+ if(seq_id>=2 && seq_id<=6)
+ {
+ colSunGlow=colWhite*a;
+ colSunGlow.a=1.0f;
+ }
+ else colSunGlow.SetHWColor(0xFF000000);
+ sunX=ScreenWidth*0.5f+cosf(zenith)*OrbitRadius;
+ sunY=SkyHeight*1.2f+sinf(zenith)*OrbitRadius;
+ sunS=1.0f-0.3f*sinf((timet-6.0f)/12.0f*pi);
+ sunGlowS=3.0f*(1.0f-a)+3.0f;
+ if(seq_id>=6) a=sinf((timet-18.0f)/12.0f*pi);
+ else a=sinf((1.0f-timet/6.0f)*pi/2);
+ colMoon.SetHWColor(0x20FFFFFF);
+ colMoon=colMoon*(1-a)+colWhite*a;
+ colMoonGlow=colWhite;
+ colMoonGlow.a=0.5f*a;
+ moonX=ScreenWidth*0.5f+cosf(zenith-pi)*OrbitRadius;
+ moonY=SkyHeight*1.2f+sinf(zenith-pi)*OrbitRadius;
+ moonS=1.0f-0.3f*sinf((timet+6.0f)/12.0f*pi);
+ moonGlowS=a*0.4f+0.5f;
+ if(timet>19.0f || timet<4.5f)
+ {
+ a=0.2f;
+ if(timet>19.0f && timet<20.0f) a*=(timet-19.0f);
+ else if(timet>3.5f && timet<4.5f) a*=1.0f-(timet-3.5f);
+ colSeaGlow=colMoonGlow;
+ colSeaGlow.a=a;
+ seaGlowX=moonX;
+ seaGlowSX=moonGlowS*3.0f;
+ seaGlowSY=moonGlowS*2.0f;
+ }
+ else if(timet>6.5f && timet<19.0f)
+ {
+ a=0.3f;
+ if(timet<7.5f) a*=(timet-6.5f);
+ else if(timet>18.0f) a*=1.0f-(timet-18.0f);
+ colSeaGlow=colSunGlow;
+ colSeaGlow.a=a;
+ seaGlowX=sunX;
+ seaGlowSX=sunGlowS;
+ seaGlowSY=sunGlowS*0.6f;
+ }
+ else colSeaGlow.a=0.0f;
+ for(i=1; i<SeaDisize-1; ++i)
+ {
+ a=float(i)/(SeaDisize-1);
+ col1=colSeaTop*(1-a)+colSeaBtm*a;
+ dwCol1=col1.GetHWColor();
+ fTime=2.0f*hge->Timer_GetTime();
+ a*=20;
+ for(j=0; j<SeaDisize; ++j)
+ {
+ sea->SetColor(j, i, dwCol1);
+ dy=a*sinf(seaP[i]+(float(j)/(SeaDisize-1)-0.5f)*pi*16.0f-fTime);
+ sea->SetDisplacement(j, i, 0.0f, dy, HGEDISP_NODE);
+ }
+ }
+ float t=0.1*hge->Timer_GetTime();
+ skylyr->SetTextureRect(128+sin(t)*128.0f,256+cos(t)*128.0f,256,128);
+ if (skyOnFadeIn)SkyDoFadeIn();
+ if (skyOnFadeOut)SkyDoFadeOut();
+ for (int i=-8;i<8;++i)
+ for (int j=-8;j<8;++j)
+ {
+ skylyr->SetColor(j+8,i+8,ARGB((int)(skya*((i+9)*16-16)),0xFF,0xFF,0xFF));
+ skylyr->SetDisplacement(j+8,i+8,j*(16.0f*((i+9)/16.0f)+64.0f),i*24,HGEDISP_CENTER);
+ }
+ dwCol1=colSeaTop.GetHWColor();
+ dwCol2=colSeaBtm.GetHWColor();
+ for(j=0; j<SeaDisize; ++j)
+ {
+ sea->SetColor(j, 0, dwCol1);
+ sea->SetColor(j, SeaDisize-1, dwCol2);
+ }
+ if(timet>19.0f || timet<5.0f)
+ {
+ a=0.12f;
+ if(timet>19.0f && timet<20.0f) a*=(timet-19.0f);
+ else if(timet>4.0f && timet<5.0f) a*=1.0f-(timet-4.0f);
+ posX=moonX;
+ }
+ else if(timet>7.0f && timet<17.0f)
+ {
+ a=0.14f;
+ if(timet<8.0f) a*=(timet-7.0f);
+ else if(timet>16.0f) a*=1.0f-(timet-16.0f);
+ posX=sunX;
+ }
+ else a=0.0f;
+ if(a!=0.0f)
+ {
+ k=(int)floorf(posX/cellw);
+ s1=(1.0f-(posX-k*cellw)/cellw);
+ s2=(1.0f-((k+1)*cellw-posX)/cellw);
+ if(s1>0.7f) s1=0.7f;
+ if(s2>0.7f) s2=0.7f;
+ s1*=a;s2*=a;
+ for(i=0; i<SeaDisize; i+=2)
+ {
+ a=sinf(float(i)/(SeaDisize-1)*pi/2);
+ col1.SetHWColor(sea->GetColor(k,i));
+ col1+=colSun*s1*(1-a);
+ col1.Clamp();
+ sea->SetColor(k, i, col1.GetHWColor());
+ col1.SetHWColor(sea->GetColor(k+1,i));
+ col1+=colSun*s2*(1-a);
+ col1.Clamp();
+ sea->SetColor(k+1, i, col1.GetHWColor());
+ }
+ }
+ }
+ void Render()
+ {
+#ifdef WIN32
+ skygrad.tex=0;
+ skygrad.blend=BLEND_DEFAULT;
+#endif
+ skygrad.v[0].col=skygrad.v[1].col=colSkyTop.GetHWColor();
+ skygrad.v[2].col=skygrad.v[3].col=colSkyBtm.GetHWColor();
+ hge->Gfx_RenderQuad(&skygrad);
+ if(seq_id>=6 || seq_id<2)
+ for(int i=0; i<Stars; ++i)
+ {
+ star->SetColor((DWORD(starA[i]*255.0f)<<24) | 0xFFFFFF);
+ star->RenderEx(starX[i], starY[i], 0.0f, starS[i]);
+ }
+ glow->SetColor(colSunGlow.GetHWColor());
+ glow->RenderEx(sunX, sunY, 0.0f, sunGlowS);
+ sun->SetColor(colSun.GetHWColor());
+ sun->RenderEx(sunX, sunY, 0.0f, sunS);
+ glow->SetColor(colMoonGlow.GetHWColor());
+ glow->RenderEx(moonX, moonY, 0.0f, moonGlowS);
+ moon->SetColor(colMoon.GetHWColor());
+ moon->RenderEx(moonX, moonY, 0.0f, moonS);
+ sea->Render(0, SkyHeight);
+ seaglow->SetColor(colSeaGlow.GetHWColor());
+ seaglow->RenderEx(seaGlowX, SkyHeight, 0.0f, seaGlowSX, seaGlowSY);
+ skylyr->Render(ScreenWidth/8*3,ScreenHeight/3*2);
+ }
+};
+TDSky sky;
+bool skyactive;
+
+class PicBack
+{
+public:
+ enum arMode
+ {
+ Centered,
+ Tiled,
+ Stretched
+ };
+private:
+ hgeQuad quad;
+ arMode Mode;
+ DWORD alpha,alim;
+ bool onfadein,onfadeout;
+ int fadebreak;
+ double scale;
+ void DoFadeIn()
+ {
+ if (LOWFPS)fadebreak+=17;else ++fadebreak;
+ if (fadebreak>17)fadebreak=0;else return;
+ if (LOWFPS)if(alpha+0x20<=alim)alpha+=0x20;else alpha=alim;
+ else if (alpha+0x2<=alim)alpha+=2;else alpha=alim;
+ if (alpha>=alim)onfadein=false;
+ }
+ void DoFadeOut()
+ {
+ if (LOWFPS)fadebreak+=17;else ++fadebreak;
+ if (fadebreak>17)fadebreak=0;else return;
+ if (LOWFPS)if (alpha<0x20)alpha=0;else alpha-=0x20;
+ else if (alpha<0x2)alpha=0;else alpha-=0x2;
+ if (!alpha)onfadeout=false;
+ }
+ void RenderCenterAt(vector2d a,double scl)
+ {
+ vector2d s=vector2d(hge->Texture_GetWidth(quad.tex,true)*scl,hge->Texture_GetHeight(quad.tex,true)*scl);
+ for(int i=0;i<4;++i)quad.v[i].col=SETA(0xFFFFFF,alpha);
+ quad.v[0].x=a.x-s.x/2.0f;quad.v[0].y=a.y-s.y/2.0f;
+ quad.v[1].x=a.x+s.x/2.0f;quad.v[1].y=a.y-s.y/2.0f;
+ quad.v[2].x=a.x+s.x/2.0f;quad.v[2].y=a.y+s.y/2.0f;
+ quad.v[3].x=a.x-s.x/2.0f;quad.v[3].y=a.y+s.y/2.0f;
+ hge->Gfx_RenderQuad(&quad);
+ }
+public:
+ bool active(){return alpha;}
+ void SetScale(double _scl){scale=_scl;}
+ void Init(const char *tx,arMode _Mode,DWORD _alim)
+ {
+ quad.tex=hge->Texture_Load(tx);alim=_alim;
+ Mode=_Mode;scale=1;quad.blend=BLEND_DEFAULT;
+#ifdef WIN32
+ vector2d srl=vector2d(hge->Texture_GetWidth(quad.tex,true),
+ hge->Texture_GetHeight(quad.tex,true));
+ vector2d srm=vector2d(hge->Texture_GetWidth(quad.tex,false),
+ hge->Texture_GetHeight(quad.tex,false));
+ srm.x=srl.x/srm.x;srm.y=srl.y/srm.y;
+ quad.v[0].tx=0;quad.v[0].ty=0;
+ quad.v[1].tx=srm.x;quad.v[1].ty=0;
+ quad.v[2].tx=srm.x;quad.v[2].ty=srm.y;
+ quad.v[3].tx=0;quad.v[3].ty=srm.y;
+#else
+ quad.v[0].tx=0,quad.v[0].ty=0;
+ quad.v[1].tx=1,quad.v[1].ty=0;
+ quad.v[2].tx=1,quad.v[2].ty=1;
+ quad.v[3].tx=0,quad.v[3].ty=1;
+#endif
+ onfadein=onfadeout=false;alpha=0;
+ }
+ void Update()
+ {
+ if(onfadein)DoFadeIn();if(onfadeout)DoFadeOut();
+ switch(Mode)
+ {
+ case Centered:
+ RenderCenterAt(vector2d(400,300),scale);
+ break;
+ case Tiled:
+ {
+ vector2d s=vector2d(hge->Texture_GetWidth(quad.tex,true)*scale,hge->Texture_GetHeight(quad.tex,true)*scale);
+ for(int i=0;i*s.x<=800;++i)
+ for(int j=0;j*s.y<=600;++j)
+ RenderCenterAt(vector2d(s.x/2+i*s.x,s.y/2+j*s.y),scale);
+ }
+ break;
+ case Stretched:
+ for(int i=0;i<4;++i)quad.v[i].col=SETA(0xFFFFFF,alpha);
+ quad.v[0].x=0,quad.v[0].y=0;
+ quad.v[1].x=800,quad.v[1].y=0;
+ quad.v[2].x=800,quad.v[2].y=600;
+ quad.v[3].x=0,quad.v[3].y=600;
+ hge->Gfx_RenderQuad(&quad);
+ break;
+ }
+ }
+ void SetFadeIn()
+ {
+ alpha=0x01;
+ onfadein=true;
+ }
+ void SetFadeOut()
+ {
+ alpha=alim;
+ onfadeout=true;
+ }
+}binter,bdiff;
+DWORD ColorTransfer(DWORD a,DWORD t)
+{
+ int r=GETR(a),g=GETG(a),b=GETB(a),sa=GETA(a);
+ int tr=GETR(t),tg=GETG(t),tb=GETB(t),ta=GETA(t);
+ if (sa<ta)++sa;if (sa>ta)--sa;
+ if (r<tr)++r;if (r>tr)--r;
+ if (g<tg)++g;if (g>tg)--g;
+ if (b<tb)++b;if (b>tb)--b;
+ a=SETR(a,r);a=SETG(a,g);a=SETB(a,b);a=SETA(a,sa);
+ return a;
+}
diff --git a/archive/blr2/src/effects.h b/archive/blr2/src/effects.h
new file mode 100644
index 0000000..d71a445
--- /dev/null
+++ b/archive/blr2/src/effects.h
@@ -0,0 +1,104 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Effects Implementations
+// Copyright Chrisoft 2014
+//static const char* EFFECTS_H_FN="effects.h";
+
+void SCEffect_Attatch(vector2d Target=vector2d(-100,-100))
+{
+ int cnt=rand()%8+3;
+ if(Target.x<-50&&Target.y<-50)Target=playerpos;
+ for (int ii=1;ii<=cnt;++ii)
+ {
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].bullettype=254;
+ bullet[i].bulletpos.x=Target.x+3;
+ bullet[i].bulletpos.y=Target.y+3;
+ bullet[i].bulletdir.x=rand()%100-50;
+ bullet[i].bulletdir.y=rand()%100-50;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=rand()%4+2;
+ bullet[i].sccolor=0x80FFFFFF;
+ }
+}
+void SCEffect_Process(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=254)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ ++effskp;
+ if (effskp==7)
+ bullet[i].sccolor=bullet[i].sccolor-0x1F000000,effskp=0;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ ++effskp;
+ if (effskp==7)
+ bullet[i].sccolor=bullet[i].sccolor-0x1000000,effskp=0;
+ }
+ }
+ if (GETA(bullet[i].sccolor)<=0x0A||bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ bulletspr[grey]->SetColor(bullet[i].sccolor);
+ bulletspr[grey]->RenderEx(bullet[i].bulletpos.x+2.4,bullet[i].bulletpos.y+2.4,0,0.2,0);
+ }
+}
+void BulletEffect_Attatch(int n)
+{
+ bullet[n].scale=2;
+ bullet[n].effbrk=17;
+}
+void BulletEffect_Process(int n)
+{
+ if (bullet[n].scale<=1){bullet[n].scale=1;return;}
+ if (LOWFPS)
+ bullet[n].effbrk-=17;
+ else
+ --bullet[n].effbrk;
+ if (bullet[n].effbrk<=0)
+ bullet[n].scale-=0.04,bullet[n].effbrk=17;
+}
+int BulletEffect_Death(Bullet a,DWORD color)
+{
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].bullettype=253;
+ bullet[i].bulletpos.x=a.bulletpos.x;
+ bullet[i].bulletpos.y=a.bulletpos.y;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=bullet[i].dist=0;
+ bullet[i].bulletspeed=0;
+ bullet[i].alterColor=circle;
+ bullet[i].scollable=false;
+ bullet[i].scale=1;
+ bullet[i].sccolor=SETA(color,0x80);
+ bullet[i].effbrk=7;
+ return i;
+}
+void BulletDeath_Process(int i)
+{
+ if (!bullet[i].exist)return;
+ if (LOWFPS)
+ bullet[i].effbrk-=17;
+ else
+ --bullet[i].effbrk;
+ if (GETA(bullet[i].sccolor)<=10)return (void)(bullet[i].exist=false);
+ if (bullet[i].effbrk<=0&&Current_Position==1)
+ bullet[i].effbrk=7,bullet[i].scale+=0.1,bullet[i].sccolor=SETA(bullet[i].sccolor,GETA(bullet[i].sccolor)-6);
+ bulletspr[circle]->SetColor(bullet[i].sccolor);
+ bulletspr[circle]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale);
+}
diff --git a/archive/blr2/src/global.h b/archive/blr2/src/global.h
new file mode 100644
index 0000000..a20c5d1
--- /dev/null
+++ b/archive/blr2/src/global.h
@@ -0,0 +1,549 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Global varibles and implementations
+// Copyright Chrisoft 2014
+#include <hge.h>
+#include <hgefont.h>
+#define MaxRes 80
+#define Resd 20.0f
+#define MaxBulCnt 20000
+HGE *hge=0;
+HEFFECT snd,menuin,menuout,menumov;
+hgeQuad quad;
+hgeFont *fnt,*vdig,*bdig;
+hgeSprite *spr,*titlespr;
+int Current_Position;//Where we are now
+/*Scenes:
+0: main menu
+1: game scene
+2: tip scene
+3: start menu
+4: about scene
+5: death scene
+6: complete scene
+7: new highscore scene
+8: highscore scene
+9: highscore view scene
+10: highscore details scene
+11: Pause scene
+12: BackToTitle Confirmation
+13: Options scene
+14: Player Profile scene
+15: Help scene
+*/
+HTEXTURE SprSheet,TexTitle,TexCredits,MenuTex,HelpTex;
+/*
+Texture Mapping:
+SprSheet:ss.png
+Bullet Blue 0,0,24,24
+Bullet Dark Blue 24,0,24,24
+Bullet Green 48,0,24,24
+Bullet Orange 72,0,24,24
+Bullet Pnt 96,0,24,24
+Bullet Purple 120,0,24,24
+Bullet Red 144,0,24,24
+Bullet White 168,0,24,24
+Bullet Yellow 192,0,24,24
+Cursor 216,0,24,24
+Player 0,24,24,24
+Bullet Circle 24,24,24,24
+Tower Blue 0,48,44,44
+Tower Dark Blue 0,92,44,44
+Tower Green 0,136,44,44
+Tower Orange 0,180,44,44
+Tower Purple 48,24,44,44
+Tower Red 92,24,44,44
+Tower White 136,24,44,44
+Tower Yellow 180,24,44,44
+Target 63,71,193,193
+Laser Module 0,264,248,8
+Ribbon Module 151,264,2,8
+Multiplier"+1" 0,272,48,48
+MultPo spawn efct 48,272,48,48
+Text:blnsns.png
+"Multiplier bonus!" 0,235,163,21
+Menus and titles: menus.png
+Menu items...
+Classic Mode 0,0,256,128
+Assessment Mode 256,0,256,128
+Free Play Mode 0,128,256,128
+Titles...
+Select a Mode 256,128,256,64
+Options 256,192,256,64
+Player Preference 0,256,256,64
+You Are Dead! 256,256,256,64
+It Ends Here! 0,320,256,64
+View Highscore for..0,376,256,64
+Highscore details 0,448,256,64
+Left Arrow 256,320,26,15
+Right Arrow 256,335,26,15
+Ribbon 256,350,64,16
+*/
+enum TColors
+{green=0,blue,yellow,purple,red,white,dblue,orange,grey,circle,COLOR_COUNT};
+hgeSprite *bulletspr[COLOR_COUNT],*towerspr[COLOR_COUNT];
+const double zero=1e-5;
+vector2d playerpos;
+bool playerLockX,playerLockY;
+bool DisableAllTower;
+bool DisablePlayer;
+bool LOWFPS,diffkey,showdebug;
+int VidMode=-1;
+hgeTTFont rbPanelFont;
+inline double GetDist(vector2d,vector2d);
+class Bullet
+{
+public:
+ vector2d bulletpos,bulletdir,limpos;
+ double dist;
+ int bullettype,redexplo,redattrib,oriexplo,whicnt;
+ DWORD sccolor;
+ /*In Orange bullets
+ //redattrib also serves as oraattrib to determine if they will explode or change direction
+ //redexplo also serves as orange explo
+ //yelbrk serves as direction-change timer
+ //whicnt describes how much one will explode into (into an exactly circle)*/
+ double bulletspeed,bulletaccel,limv;
+ int exist,inv,addblend;
+ int whirem,whiskp,yelbrk;
+ int exp1,exp2;
+ double lifetime,rot;
+ bool scollable,collable,extborder;
+ double scale;int effbrk;
+ TColors alterColor,alterColor2;
+ void redir(vector2d targ)
+ {
+ bulletdir.x=bulletpos.x-targ.x;
+ bulletdir.y=bulletpos.y-targ.y;
+ dist=bulletdir.x*bulletdir.x+bulletdir.y*bulletdir.y;
+ dist=sqrt(dist);
+ bulletdir.x/=dist;bulletdir.y/=dist;dist=1;
+ }
+ void setdir(double rad)
+ {
+ bulletdir.x=cos(rad);
+ bulletdir.y=sin(rad);
+ dist=1;
+ }
+}*bullet=NULL;
+/*Something about bullets:
+//bullettype:
+//1: player dir-based green bullet
+//2: degree-based blue bullet (for clocks only)[are they clocks?]
+//3: 12direction-based blue bullet
+//4: yellow chaser bullet
+//5: purple slow down bullet
+//6: red exploding bullet
+//7: white stalled bullet
+//8: Orange Redir bullet
+//9: dark Blue bullet
+//254: Semi-collision effect
+//255: Score point*/
+struct Tower
+{
+ vector2d towerpos;
+ int towertype;
+ int towertimer,curtimer;
+ int towertimer2,curtimer2,shotcount,curshotcount;
+ bool dblstate;
+ double bulletspeed;
+ int redexplo,whicnt,yelbrk;
+ int exp1,exp2;
+ int t3t;
+ bool exist,effect;
+ double offset;
+ DWORD RendColor;
+}tower[250];
+//t3t is for Tower3
+//0:All 12 directions
+//1:four default directions
+//2:random left/right
+//3:random up/down
+struct Target//An annoying circle
+{
+ hgeSprite *targspr;
+ vector2d targpos,targdir;
+ double rot,rotspd;
+ bool isonshow,isonhide,visible;
+ void Init(double _rotspd,vector2d ipos)
+ {
+ targspr=new hgeSprite(SprSheet,63,71,193,193);
+ targspr->SetHotSpot(96.5f,96.5f);
+ rotspd=_rotspd;
+ rot=0;
+ targpos=ipos;
+ }
+ void TargShow()
+ {
+ if (!visible)
+ isonshow=true,isonhide=false,visible=true;
+ }
+ void TargHide()
+ {
+ if (visible)
+ isonhide=true,isonshow=false;
+ }
+ void TargShowProc()
+ {
+ if (LOWFPS)
+ targspr->SetColor(SETA(targspr->GetColor(),GETA(targspr->GetColor())+17));
+ else
+ targspr->SetColor(SETA(targspr->GetColor(),GETA(targspr->GetColor())+1));
+ if (GETA(targspr->GetColor())>=0x80)
+ isonshow=isonhide=false,targspr->SetColor(SETA(targspr->GetColor(),0x80));
+ }
+ void TargHideProc()
+ {
+ if (LOWFPS)
+ if(GETA(targspr->GetColor())<17)
+ targspr->SetColor(SETA(targspr->GetColor(),0));
+ else
+ targspr->SetColor(SETA(targspr->GetColor(),GETA(targspr->GetColor())-17));
+ else
+ targspr->SetColor(SETA(targspr->GetColor(),GETA(targspr->GetColor())-1));
+ if (GETA(targspr->GetColor())==0x00)
+ isonshow=isonhide=visible=false;
+ }
+ void TargFollowPlayer()
+ {
+ double curspd=0.01f;
+ if (GetDist(playerpos,targpos)>1)curspd=0.02f;else targpos=playerpos;
+ if (GetDist(playerpos,targpos)>2)curspd=0.1f;
+ if (GetDist(playerpos,targpos)>5)curspd=0.5f;
+ if (GetDist(playerpos,targpos)>10)curspd=0.75f;
+ if (GetDist(playerpos,targpos)>20)curspd=1.0f;
+ if (GetDist(playerpos,targpos)>30)curspd=2.0f;
+ if (GetDist(playerpos,targpos)>40)curspd=5.0f;
+ targdir.x=targpos.x-playerpos.x;
+ targdir.y=targpos.y-playerpos.y;
+ double dist=sqr(targdir.x)+sqr(targdir.y);
+ dist=sqrt(dist);
+ if (dist<1e-4)return;
+ if (LOWFPS)
+ targpos.x-=targdir.x/dist*curspd*17/20,
+ targpos.y-=targdir.y/dist*curspd*17/20;
+ else
+ targpos.x-=targdir.x/dist*curspd/20,
+ targpos.y-=targdir.y/dist*curspd/20;
+ }
+ void TargGoto(vector2d pos)
+ {
+ double curspd=0.01f;
+ if (GetDist(pos,targpos)>1)curspd=0.25f;else targpos=pos;
+ if (GetDist(pos,targpos)>2)curspd=0.5f;
+ if (GetDist(pos,targpos)>5)curspd=1.0f;
+ if (GetDist(pos,targpos)>10)curspd=2.0f;
+ if (GetDist(pos,targpos)>20)curspd=3.0f;
+ if (GetDist(pos,targpos)>30)curspd=4.0f;
+ if (GetDist(pos,targpos)>40)curspd=5.0f;
+ targdir.x=targpos.x-pos.x;
+ targdir.y=targpos.y-pos.y;
+ double dist=sqr(targdir.x)+sqr(targdir.y);
+ dist=sqrt(dist);
+ if (dist<1e-4)return;
+ if (LOWFPS)
+ targpos.x-=targdir.x/dist*curspd*17/20,
+ targpos.y-=targdir.y/dist*curspd*17/20;
+ else
+ targpos.x-=targdir.x/dist*curspd/20,
+ targpos.y-=targdir.y/dist*curspd/20;
+ }
+ void TargRender()
+ {
+ if (isonshow)TargShowProc();if(isonhide)TargHideProc();
+ targspr->RenderEx(targpos.x+7,targpos.y+7,rot,0.8);
+ if (!DisableAllTower)
+ {
+ if (LOWFPS)
+ rot+=17*rotspd;
+ else
+ rot+=rotspd;
+ }
+ }
+}ATarg,BTarg;
+int bulcnt=0,towcnt=0,linecnt=0;
+double playerrot;
+double playerspeed;
+double playerslospeed;
+double playerfulspd=0.2;
+double playerfulslospd=0.05;
+double clockrot,deltarot,deltadelta;
+double whirot,dwhirot;
+hgeSprite *playerspr;
+DWORD DBGColor;
+int frameleft,infofade;
+int level,part,clrtime,clrbns;
+int coll,semicoll,mode,dsmc,restarts;
+double clrrange,clrrad,clrmaxrange,clrind,assetime,asts;
+hgeSprite *clrcircle;
+bool Dis8ref,t8special;
+int frameskips=0,stepskips=0;
+bool IfCallLevel,IfShowTip,FadeTip,PlayerSplit,charge;
+RandomEngine re;
+hgeFont *TipFont,*MenuFont;
+char lasttip[200];
+int whicnt,whrcnt,shots,clrusg;
+bool yelattrib,Complete;
+double bsscale;
+long long score,scminus;
+double mult,lsc;
+int multbrk,multbat;
+int frms;double averfps;
+int plrspd,plrslospd;
+int TenSeconds=600,TwentySeconds=1200,ThirtySeconds=1800,AMinute=3600;
+int Infinity=1000000000;
+int effskp=0;
+hgeSprite *Credits,*CreditsRail;
+int creditsp;double creditfly,creditacc,credbrk;
+bool credstop,creddone;
+hgeSprite *Helpspr,*NHelpspr,*HlpL,*HlpR;
+double Helpscroll,Hlpyofst;int Helpslide;
+bool hshl;
+bool tfs;
+double scale;
+#ifndef WIN32
+double yos;
+#endif
+int fpslvl,clrmode,sfxvol,bgmvol;
+const vector2d splitData[4]={vector2d(0,0),vector2d(400,0),vector2d(0,300),vector2d(400,300)};
+//options from command line arguments
+bool fNoSound,
+#ifdef WIN32
+noHideConsole,
+#endif
+fFristStartUp,fFast;
+int startLvl,startPrt,fFullScreen;
+char alterLog[64];
+#ifdef WIN32
+static const int arFilecount=23;
+static const char* archive[]={
+"./Resources/b_diff.png",
+"./Resources/b_inter.png",
+"./Resources/b_null.png",
+"./Resources/e_sflake.png",
+"./Resources/e_skyitem.png",
+"./Resources/blnsns.png",
+"./Resources/charmap.fnt",
+"./Resources/vdig.fnt",
+"./Resources/bdig.fnt",
+"./Resources/ss.png",
+"./Resources/help.png",
+"./Resources/menus.png",
+"./Resources/title.png",
+"./Resources/credits.png",
+"./Resources/b_leaves.png",
+"./Resources/e_leaf.png",
+"./Resources/tap.ogg",
+"./Resources/menuin.ogg",
+"./Resources/menuout.ogg",
+"./Resources/Music/BLR2_TR01.ogg",
+"./Resources/Music/BLR2_TR07.ogg",
+"./Resources/Music/BLR2_TR09.ogg",
+"./Resources/Music/CanonTechno.ogg"
+};
+#endif
+//static const char* GLOBAL_H_FN="global.h";
+static const char* BLRVERSION="1.0.0-0 (r100)";
+static const char *months="JanFebMarAprMayJunJulAugSepOctNovDec";
+char *parseDate(const char *date)
+{
+ char ms[8];
+ int y,d,m;sscanf(date,"%s %d %d",ms,&d,&y);
+ m=(strstr(months,ms)-months)/3+1;
+ char *r=new char[16];
+ sprintf(r,"%04d-%02d-%02d",y,m,d);
+ return r;
+}
+static char* BuiltDate=parseDate(__DATE__);
+
+void Throw(char *Filename,char *Info)
+{
+ fprintf(stderr,"%s: %s\n",Filename,Info);
+ hge->System_Log("%s: %s\n",Filename,Info);
+}
+void Error(const char *EC,bool hgecreated=false)
+{
+ hge->System_Log("%s\n",EC);
+#ifdef WIN32
+ MessageBox(NULL,EC,"Error!",MB_ICONERROR);
+#endif
+ if (hgecreated)
+ {
+ hge->System_Shutdown();
+ hge->Release();
+ }
+#ifdef WIN32
+ for(int i=0;i<arFilecount;++i)remove(archive[i]);
+ _rmdir("./Resources/Music");
+ _rmdir("./Resources");
+#endif
+ exit(1);
+}
+void ShowTip(const char *tip)
+{
+ if (strcmp(tip,lasttip)!=0)
+ {
+ TipFont->SetColor(0x00FFFFFF);
+ }
+ memcpy(lasttip,tip,sizeof(lasttip));
+ DisableAllTower=true;
+ DisablePlayer=true;
+ if (hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT)
+ FadeTip=true;
+ double width=TipFont->GetStringWidth(tip);
+ TipFont->printf(400-width/2,400,HGETEXT_LEFT,tip);
+ if (FadeTip)
+ {
+ if (LOWFPS)
+ {
+ if (TipFont->GetColor()>>24>=0x08)
+ TipFont->SetColor(TipFont->GetColor()-0x8000000);
+ else
+ {
+ DisableAllTower=false;
+ DisablePlayer=false;
+ Current_Position=1;
+ }
+ }
+ else
+ {
+ if (TipFont->GetColor()>>24>=0x01)
+ TipFont->SetColor(TipFont->GetColor()-0x1000000);
+ else
+ {
+ DisableAllTower=false;
+ DisablePlayer=false;
+ Current_Position=1;
+ }
+ }
+ return;
+ }
+ if (!LOWFPS)
+ {
+ if (TipFont->GetColor()>>24<=0xFE)
+ TipFont->SetColor(TipFont->GetColor()+0x01000000);
+ }
+ else
+ {
+ if (TipFont->GetColor()>>24<=0xF7)
+ TipFont->SetColor(TipFont->GetColor()+0x08000000);
+ }
+}
+void All2pnt();//forward that...
+
+int AllocBullet()
+{
+ int i;
+ if (bulcnt==0)
+ {
+ bulcnt=i=1;
+ bullet=(Bullet*)malloc(sizeof(Bullet)*(bulcnt+1));
+ }
+ else
+ {
+ for (i=1;i<=bulcnt;++i)
+ if (!bullet[i].exist)break;
+ if (i>bulcnt)
+ {
+ bulcnt=i;
+ Bullet *nblt=(Bullet*)realloc(bullet,sizeof(Bullet)*(bulcnt+1));
+ if(!nblt)Error("Error allocating bullets!",1);
+ bullet=nblt;
+ }
+ }
+ return i;
+}
+void SigHandler(int pm)
+{
+ hge->System_Log("Oops, the application ate a piece of DE AD BE EF!");
+#if defined(__GNUC__) && !defined(MINGW_BUILD)
+ void *strs[64];unsigned cnt;
+ char **str;cnt=backtrace(strs,64);
+ str=backtrace_symbols(strs,cnt);
+ for(unsigned i=0;i<cnt;++i)
+ hge->System_Log("%s",str[i]);
+#endif
+ hge->System_Shutdown();
+ exit(1);
+}
+void ClearAll(bool cbullet=true)
+{
+ DisableAllTower=true;
+ bool none=true;
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)continue;
+ if (LOWFPS)
+ {
+ if (tower[i].RendColor>>24>=0x08)
+ {
+ tower[i].RendColor=tower[i].RendColor-0x8000000;
+ none=false;
+ }
+ }
+ else
+ {
+ if (tower[i].RendColor>>24>=0x01)
+ {
+ tower[i].RendColor=tower[i].RendColor-0x1000000;
+ none=false;
+ }
+ }
+ }
+ if (none)
+ {
+ towcnt=0;
+ memset(tower,0,sizeof(tower));
+ if (cbullet)All2pnt();
+ }
+}
+TextureRect GetTextureRect(int type,TColors color)
+{
+ if (type==0)
+ {
+ switch(color)
+ {
+ case green:return TextureRect(48,0,24,24);
+ case blue:return TextureRect(0,0,24,24);
+ case yellow:return TextureRect(192,0,24,24);
+ case purple:return TextureRect(120,0,24,24);
+ case red:return TextureRect(144,0,24,24);
+ case white:return TextureRect(168,0,24,24);
+ case dblue:return TextureRect(24,0,24,24);
+ case orange:return TextureRect(72,0,24,24);
+ case grey:return TextureRect(96,0,24,24);
+ case circle:return TextureRect(24,24,24,24);
+ default:return TextureRect(0,0,0,0);
+ }
+ }
+ if (type==1)
+ {
+ switch(color)
+ {
+ case green:return TextureRect(0,136,44,44);
+ case blue:return TextureRect(0,48,44,44);
+ case yellow:return TextureRect(180,24,44,44);
+ case purple:return TextureRect(48,24,44,44);
+ case red:return TextureRect(92,24,44,44);
+ case white:return TextureRect(136,24,44,44);
+ case dblue:return TextureRect(0,92,44,44);
+ case orange:return TextureRect(0,180,44,44);
+ default:return TextureRect(0,0,0,0);
+ }
+ }
+ return TextureRect(0,0,0,0);
+}
+DWORD ColorToDWORD(TColors a)
+{
+ switch(a)
+ {
+ case green:return 0xCCFF00;
+ case blue:return 0x33CCFF;
+ case yellow:return 0xFFFF00;
+ case purple:return 0x9966FF;
+ case red:return 0xFFFF3333;
+ case white:return 0xFFFEFEFE;
+ case dblue:return 0xFF0000FF;
+ case orange:return 0xFFFF8800;
+ default:return 0xFF000000;
+ }
+}
diff --git a/archive/blr2/src/hgeft.cpp b/archive/blr2/src/hgeft.cpp
new file mode 100644
index 0000000..479027b
--- /dev/null
+++ b/archive/blr2/src/hgeft.cpp
@@ -0,0 +1,98 @@
+// Freetype2 ext4hge implementations -*- C++ -*-
+#include "hgeft.h"
+static const char* HGEFT_SRC_FN="hgeft.cpp";
+void hgeTTChar::Free(){if(quad.tex)hge->Texture_Free(quad.tex),quad.tex=0;}
+bool hgeTTChar::SetChar(wchar_t ch,FT_Face ttfface)
+{
+ FT_GlyphSlot slot=ttfface->glyph;
+ FT_UInt glyph_index=FT_Get_Char_Index(ttfface,ch);
+ FT_Error err=FT_Load_Glyph(ttfface,glyph_index,FT_LOAD_DEFAULT);
+ if(err){hge->System_Log("%s: Glyph load failed!",HGEFT_SRC_FN);return false;}
+ err=FT_Render_Glyph(ttfface->glyph,FT_RENDER_MODE_NORMAL);
+ if(err){hge->System_Log("%s: Glyph render failed!",HGEFT_SRC_FN);return false;}
+ _w=slot->advance.x>>6;_h=slot->bitmap.rows;//we are one line only.
+ rw=slot->bitmap.width;rh=slot->bitmap.rows;
+ xofst=slot->bitmap_left;
+ yofst=slot->bitmap.rows-slot->bitmap_top;
+ quad.tex=hge->Texture_Create(
+ slot->bitmap.width?slot->bitmap.width:1,
+ slot->bitmap.rows?slot->bitmap.rows:1);
+ DWORD* tx=hge->Texture_Lock(quad.tex,false,0,0,
+ slot->bitmap.width?slot->bitmap.width:1,
+ slot->bitmap.rows?slot->bitmap.rows:1);
+ memset(tx,0,sizeof(DWORD)*(slot->bitmap.width?slot->bitmap.width:1)*(slot->bitmap.rows?slot->bitmap.rows:1));
+ int ptr=0;
+ for(int i=0;i<slot->bitmap.rows;++i)
+ for(int j=0;j<slot->bitmap.width;++j)
+ {
+#ifdef WIN32
+ tx[i*slot->bitmap.width+j]=ARGB(slot->bitmap.buffer[ptr],255,255,255);
+#else
+ tx[(slot->bitmap.rows-i-1)*slot->bitmap.width+j]=ARGB(slot->bitmap.buffer[ptr],255,255,255);
+ //In OpenGL, textures are locked upside down...
+#endif
+ ptr++;
+ }
+ hge->Texture_Unlock(quad.tex);
+ quad.blend=BLEND_ALPHABLEND;
+ quad.v[0].tx=0;quad.v[0].ty=0;quad.v[1].tx=1;quad.v[1].ty=0;
+ quad.v[2].tx=1;quad.v[2].ty=1;quad.v[3].tx=0;quad.v[3].ty=1;
+ return true;
+}
+void hgeTTChar::Render(double x,double y,DWORD col)
+{
+ for(int i=0;i<4;++i)quad.v[i].col=col;
+ quad.v[0].x=x;quad.v[0].y=y-rh+yofst;
+ quad.v[1].x=x+rw;quad.v[1].y=y-rh+yofst;
+ quad.v[2].x=x+rw;quad.v[2].y=y+yofst;
+ quad.v[3].x=x;quad.v[3].y=y+yofst;
+ hge->Gfx_RenderQuad(&quad);
+}
+bool hgeTTFont::Init(const char *ttf,int size)
+{
+ FT_Error err=FT_Init_FreeType(&libft);
+ if(err){hge->System_Log("%s: Failed to initialize freetype",HGEFT_SRC_FN);return false;}
+ err=FT_New_Face(libft,ttf,0,&ttfface);
+ if(err){hge->System_Log("%s: Failed to load font: %s",HGEFT_SRC_FN,ttf);return false;}
+ err=FT_Set_Char_Size(ttfface,0,size*64,96,96);
+ return true;
+}
+void hgeTTFont::UpdateString(const wchar_t *format, ...)
+{
+ for(int i=0;buf[i]!='\0';++i)chars[i].Free();
+ memset(buf,0,sizeof(buf));memset(chars,0,sizeof(chars));
+ va_list vl;
+ va_start(vl,format);
+ vswprintf(buf,1024,format,vl);
+ va_end(vl);
+ buf[1024]='\0';
+ w=h=0;
+ for(int i=0;buf[i]!='\0';++i)
+ {
+ chars[i].SetChar(buf[i],ttfface);
+ w+=chars[i].w();
+ if(chars[i].h()>h)h=chars[i].h();
+ }
+}
+void hgeTTFont::Render(double x,double y,DWORD color,int align)
+{
+ int cur;
+ if(align==0)
+ {
+ cur=x;
+ for(int i=0;buf[i]!='\0';++i)
+ {
+ chars[i].Render(cur,y,color);
+ cur+=chars[i].w();
+ }
+ }
+ if(align==1)
+ {
+ cur=x;
+ for(int i=wcslen(buf)-1;i>=0;--i)
+ {
+ chars[i].Render(cur,y,color);
+ cur-=chars[i].w();
+ }
+ }
+}
diff --git a/archive/blr2/src/hgeft.h b/archive/blr2/src/hgeft.h
new file mode 100644
index 0000000..1badc74
--- /dev/null
+++ b/archive/blr2/src/hgeft.h
@@ -0,0 +1,75 @@
+// Freetype2 ext4hge header -*- C++ -*-
+/*
+ * Freetype2 extention for hge
+ * by Chris Xiong
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of the nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Note: freetype 2.5.2 or newer is required.
+ * This library is somehow buggy, known bugs:
+ * * blinking charcter...
+ * * segmentation fault(fixed now,not a problem of the library)
+ * * Slow... but it's hard to improve...
+ * * Only support a single line...
+ *
+ */
+#ifndef HGEEFT_H
+#define HGEEFT_H
+#include <cstring>
+#include <cwchar>
+#include "./include/hge.h"
+#include <ft2build.h>
+#include FT_FREETYPE_H
+extern HGE* hge;
+class hgeTTChar
+{
+private:
+ hgeQuad quad;
+ int rw,rh,_w,_h,yofst;
+public:
+ double w(){return _w;}
+ double h(){return _h;}
+ void Free();
+ bool SetChar(wchar_t ch,FT_Face ttfface);
+ void Render(double x,double y,DWORD col);
+};
+class hgeTTFont
+{
+protected:
+ FT_Library libft;
+ FT_Face ttfface;
+ wchar_t buf[1025];
+ hgeTTChar chars[1024];
+ double w,h;
+public:
+ bool Init(const char *ttf,int size);
+ double GetWidth(){return w;}
+ double GetHeight(){return h;}
+ void UpdateString(const wchar_t *format, ...);
+ void Render(double x,double y,DWORD color,int align);
+};
+#endif
diff --git a/archive/blr2/src/levels.h b/archive/blr2/src/levels.h
new file mode 100644
index 0000000..58d7505
--- /dev/null
+++ b/archive/blr2/src/levels.h
@@ -0,0 +1,4305 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Level Implementations
+// Copyright Chrisoft 2014
+/*
+How to write a classic level/part...
+Classic parts need only one procedure, like this.
+ frameleft=...;
+ if (towercnt==/!=...)return ClearAll();
+ DisableAllTower=false;bulcnt=0;memset(bullet,0,sizeof(bullet));
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].towerspr->GetColor()==0x80FFFFFF)
+ tower[i].towerspr->SetColor(0x00FFFFFF);
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].towerspr->GetColor()>>24)<=0x80)
+ tower[i].towerspr->SetColor(tower[i].towerspr->GetColor()+0x01FFFFFF);
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+*/
+/*
+How to write an "advanced" part...
+"Advanced" parts usually need two or more parts, ont for initalize and one for things to do every frame.
+Write on your own thought...
+*/
+bool squashrev;
+int posx,posy,fskp,posx2,posy2;
+bool doneredir;
+int pnt1,pnt2;
+//Let's start now!
+double towers[16];int tcnt;
+double dscroll,roll,tbrk;
+bool sout,tendone;bool dmt[16];
+//static const char* LEVEL_H_FN="levels.h";
+void Level1Part0(){++part;}
+void Level1Part1()
+{
+ if(DBGColor!=0xFF888820)
+ {
+ for(int i=0;i<3;++i)
+ DBGColor=ColorTransfer(DBGColor,0xFF888820);
+ return;
+ }
+ CreateTower1(400,300,857,2);
+ frameleft=AMinute*2;clrtime=1;
+ tcnt=1;sout=false;dscroll=-0.025f;memset(dmt,true,sizeof(dmt));
+ for (int i=0;i<tcnt;++i)
+ {
+ towers[i]=600+600.0f/(double)tcnt*i+12;
+ CreateTower3(200,towers[i],428,3,4);
+ CreateTower3(600,towers[i],428,3,4);
+ }
+ ++part;roll=0;tendone=false;
+ ShowTip("\
+Level 1-Down by the Bank\n\
+Everything going on properly?\n\
+");
+ Current_Position=2;
+}
+void Level1Part2()
+{
+ for (int i=0;i<tcnt;++i)
+ {
+ if (LOWFPS)towers[i]+=17*dscroll;else towers[i]+=dscroll;
+ tower[2*(i+1)].towerpos.y=tower[2*(i+1)+1].towerpos.y=towers[i];
+ if (towers[i]<=300&&towers[i]>=290&&dmt[i])
+ {
+ NewMultpo(tower[2*(i+1)+1].towerpos);
+ NewMultpo(tower[2*(i+1)].towerpos);
+ dmt[i]=false;
+ }
+ }
+ if (!sout)
+ {
+ if (towers[tcnt-1]<-12)++roll;
+ for (int i=0;i<tcnt;++i)if (towers[i]<-12)towers[i]=612,dmt[i]=true;
+ if (roll==1)
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].towertype==3)tower[i].t3t=5;
+ if (roll==2)
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].towertype==3)tower[i].t3t=0;
+ if (roll==3&&!tendone)
+ {
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].towertype==3)tower[i].t3t=4;
+ tcnt=10;
+ tendone=true;
+ for (int i=0;i<tcnt;++i)
+ {
+ towers[i]=600+600.0f/(double)tcnt*i+12;
+ CreateTower3(200,towers[i],428,3,4);
+ CreateTower3(600,towers[i],428,3,4);
+ }
+ }
+ }
+}
+void Level1Part3()
+{
+ frameleft=AMinute;clrtime=1;
+ if (towcnt!=50&&towcnt!=0)return ClearAll();
+ DisableAllTower=false;bulcnt=0;free(bullet);bullet=NULL;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Double-directed Labyrinth!");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ for (int i=1;i<=25;++i)
+ CreateTower3(772,i*24-24,1714,2,2),
+ CreateTower3(28,i*24-12,1714,2,2);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ ++part;
+ return;
+ }
+}
+int labyred;
+void Level1Part4()
+{
+ if (frameleft<=TwentySeconds)
+ {
+ if (LOWFPS)labyred+=17;else ++labyred;
+ if (labyred>=1500)CreateBullet6(re.NextDouble(0,800),re.NextDouble(0,600),2,0,1,12,true),labyred=0;
+ }
+ if (frameleft<=TenSeconds&&tower[1].towertimer>857)
+ for (int i=1;i<=towcnt;++i)tower[i].towertimer=857;
+}
+BCircle Level2Circle,Level2Circle2;
+int fakes[12];
+double L2D;
+void Level2Part0()
+{
+ frameleft=50;L2D=0;
+ if (towcnt==50)
+ {
+ ClearAll();
+ return;
+ }
+ bulcnt=0;free(bullet);bullet=NULL;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("\
+Level 2-Polygon Mystery\n\
+Place yourself correctly!\
+");
+ IfCallLevel=false;
+ }
+ if (Current_Position==1)
+ {
+ frameleft=0;
+ return;
+ }
+}
+void Level2Part1()
+{
+ frameleft=AMinute;clrtime=1;
+ Level2Circle.Init(230,pi/12000,96,vector2d(400,300));
+ Level2Circle2.Init(270,-pi/12000,96,vector2d(400,300));
+ CreateTower3_fixeddir(400,50,300,3,-2.0f/3.0f*pi);
+ CreateTower3_fixeddir(400,51,300,3,-1.0f/3.0f*pi);
+ //=======
+ CreateTower3_fixeddir(400,550,300,3,2.0f/3.0f*pi);
+ CreateTower3_fixeddir(400,549,300,3,1.0f/3.0f*pi);
+ //=======
+ CreateTower3_fixeddir(616.51,175,300,3,0);
+ CreateTower3_fixeddir(616.51,176,300,3,-1.0f/3.0f*pi);
+ //=======
+ CreateTower3_fixeddir(183.49,175,300,3,-pi);
+ CreateTower3_fixeddir(183.49,176,300,3,-2.0f/3.0f*pi);
+ //=======
+ CreateTower3_fixeddir(616.51,425,300,3,0);
+ CreateTower3_fixeddir(616.51,424,300,3,1.0f/3.0f*pi);
+ //=======
+ CreateTower3_fixeddir(183.49,425,300,3,-pi);
+ CreateTower3_fixeddir(183.49,424,300,3,2.0f/3.0f*pi);
+ for (int i=0;i<6;++i)fakes[i]=CreateBullet6(400,300,0,999999999,1,1,false),bullet[fakes[i]].inv=true;
+ ++part;tbrk=0;
+}
+void Level2Part2()
+{
+ Level2Circle.Update();
+ Level2Circle2.Update();
+ L2D+=hge->Timer_GetDelta();
+ double base=Level2Circle.GetRad();
+ double r=(Level2Circle.GetRange()+Level2Circle2.GetRange())/2.0f;
+ for (int i=0;i<6;++i)
+ bullet[fakes[i]].bulletpos=vector2d(400+r*cos(base+i*pi/3.0f),300+r*sin(base+i*pi/3.0f));
+ if (L2D>=1.5)
+ {
+ L2D=0;tbrk+=1;
+ for (int i=0;i<6;++i)
+ {
+ CreateBullet6(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f),2,0,1,6,true);
+ clockrot=0;
+ if(tbrk>=5)NewMultpo(vector2d(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f)));
+ }
+ if(tbrk>=5)tbrk=0;
+ }
+}
+void Level2Part3()
+{
+ frameleft=AMinute;clrtime=1;
+ for (int i=0;i<6;++i)bullet[fakes[i]].exist=false;
+ for (int i=0;i<6;++i)fakes[i]=CreateBullet7(400,300,0,999999999,false),bullet[fakes[i]].inv=true;
+ whicnt=3;clockrot=deltarot=0;++part;tbrk=0;
+}
+void Level2Part4()
+{
+ Level2Circle.Update();
+ Level2Circle2.Update();
+ L2D+=hge->Timer_GetDelta();
+ double base=Level2Circle.GetRad();
+ double r=(Level2Circle.GetRange()+Level2Circle2.GetRange())/2.0f;
+ for (int i=0;i<6;++i)
+ bullet[fakes[i]].bulletpos=vector2d(400+r*cos(base+i*pi/3.0f),300+r*sin(base+i*pi/3.0f));
+ if (L2D>=5)
+ {
+ L2D=0;tbrk+=1;
+ for (int i=0;i<6;++i)
+ {
+ CreateBullet7(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f),2,0,true);
+ if(tbrk>=5)NewMultpo(vector2d(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f)));
+ }
+ if(tbrk>=5)tbrk=0;
+ }
+}
+void Level2Part5()
+{
+ frameleft=TenSeconds/2;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("You've got 5 seconds to choose a fine place...");
+ return;
+ }
+ ++part;tbrk=0;
+}
+Laser Lock;
+void Level2Part6()
+{
+ Level2Circle.Update();
+ Level2Circle2.Update();
+ L2D+=hge->Timer_GetDelta();
+ double base=Level2Circle.GetRad();
+ double r=(Level2Circle.GetRange()+Level2Circle2.GetRange())/2.0f;
+ for (int i=0;i<6;++i)
+ bullet[fakes[i]].bulletpos=vector2d(400+r*cos(base+i*pi/3.0f),300+r*sin(base+i*pi/3.0f)),bullet[fakes[i]].inv=true;
+ if (L2D>=5)
+ {
+ L2D=0;tbrk+=1;
+ for (int i=0;i<6;++i)
+ {
+ CreateBullet7(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f),2,0,true);
+ if(tbrk>=5)NewMultpo(vector2d(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f)));
+ }
+ if(tbrk>=5)tbrk=0;
+ }
+ if (frameleft<TenSeconds/20)++part,frameleft=AMinute,clrtime=1;
+}
+void Level2Part7()
+{
+ if (!playerLockY)playerLockY=true;
+ Level2Circle.Update();
+ Level2Circle2.Update();
+ L2D+=hge->Timer_GetDelta();
+ double base=Level2Circle.GetRad();
+ double r=(Level2Circle.GetRange()+Level2Circle2.GetRange())/2.0f;
+ for (int i=0;i<6;++i)
+ bullet[fakes[i]].bulletpos=vector2d(400+r*cos(base+i*pi/3.0f),300+r*sin(base+i*pi/3.0f)),bullet[fakes[i]].inv=true;
+ if (L2D>=5)
+ {
+ L2D=0;tbrk+=1;
+ for (int i=0;i<6;++i)
+ {
+ CreateBullet7(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f),2,0,true);
+ if(tbrk>=5)NewMultpo(vector2d(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f)));
+ }
+ if(tbrk>=5)tbrk=0;
+ }
+}
+double L2D1;
+void Level2Part8()
+{
+ frameleft=ThirtySeconds;L2D1=0;
+ playerLockY=false;clrtime=2;
+ for (int i=6;i<12;++i)fakes[i]=CreateBullet6(400,300,0,999999999,1,1,false),bullet[fakes[i]].inv=true;
+ ++part;tbrk=0;
+}
+void Level2Part9()
+{
+ Level2Circle.Update();
+ Level2Circle2.Update();
+ L2D+=hge->Timer_GetDelta();
+ L2D1+=hge->Timer_GetDelta();
+ double base=Level2Circle.GetRad();
+ double base2=Level2Circle2.GetRad();
+ double r=(Level2Circle.GetRange()+Level2Circle2.GetRange())/2.0f;
+ for (int i=0;i<6;++i)
+ bullet[fakes[i]].bulletpos=vector2d(400+r*cos(base+i*pi/3.0f),300+r*sin(base+i*pi/3.0f));
+ for (int i=6;i<12;++i)
+ bullet[fakes[i]].bulletpos=vector2d(400+r*cos(base2+i*pi/3.0f),300+r*sin(base2+i*pi/3.0f));
+ if (L2D1>=2)
+ {
+ L2D1=0;tbrk+=1;
+ for (int i=0;i<6;++i)
+ {
+ CreateBullet6(403+r*cos(base2+i*pi/3.0f),303+r*sin(base2+i*pi/3.0f),2,0,1,6,true);
+ clockrot=0;
+ if(tbrk>=5)NewMultpo(vector2d(403+r*cos(base2+i*pi/3.0f),303+r*sin(base2+i*pi/3.0f)));
+ }
+ }
+ if (L2D>=5)
+ {
+ L2D=0;tbrk+=1;
+ for (int i=0;i<6;++i)
+ {
+ CreateBullet7(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f),2,0,true);
+ if(tbrk>=5)NewMultpo(vector2d(403+r*cos(base+i*pi/3.0f),303+r*sin(base+i*pi/3.0f)));
+ }
+ }
+ if(tbrk>=5)tbrk=0;
+}
+void Level3Part0()
+{
+ frameleft=50;
+ if (towcnt==50)
+ {
+ ClearAll();
+ return;
+ }
+ bulcnt=0;free(bullet);bullet=NULL;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("\
+Level 3-Missing Colour\n\
+A negative omen...\
+");
+ IfCallLevel=false;
+ }
+ if (Current_Position==1)
+ {
+ frameleft=0;
+ return;
+ }
+}
+void Level3Part1()
+{
+ frameleft=ThirtySeconds;clrtime=0;
+ if (towcnt!=1&&towcnt!=0)return ClearAll();
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Meet my new weapon...Is it cool?");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower8(400,300,857,3,57,30,false);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+void Level3Part2()
+{
+ frameleft=ThirtySeconds;clrtime=0;
+ if (towcnt!=4&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("What about quad reflective towers...?");
+ All2pnt();
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower8(30,10,1250,3,57,15,false);
+ CreateTower8(746,10,1250,3,57,15,false);
+ CreateTower8(30,556,1250,3,57,15,false);
+ CreateTower8(746,556,1250,3,57,15,false);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+TROF fr[6][6];
+int cur;
+double elasped;
+void Level3Part3()
+{
+ frameleft=AMinute;clrtime=1;
+ if (towcnt!=1&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ All2pnt();
+ ShowTip("Precise mode is not so precise as expected...");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower8(400,300,999999999,0,999999999,0,false);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ for (int k=0;k<6;++k)
+ for (int i=0;i<6;++i)
+ {
+ fr[k][i].cnt=10;
+ fr[k][i].drad=(i+1)*pi/3.0f;
+ fr[k][i].srad=i*pi/3.0f;
+ fr[k][i].delay=750;
+ fr[k][i].stage=-1;
+ if (k==0)fr[k][i].init();
+ }
+ ++part;
+ elasped=0;cur=0;
+ return;
+ }
+}
+void Level3Part4()
+{
+ if (frameleft<TwentySeconds&&tower[1].towertimer==999999999)
+ {
+ tower[1].towertimer=tower[1].curtimer=1500;
+ tower[1].towertimer2=100;
+ tower[1].bulletspeed=3;tower[1].shotcount=tower[1].curshotcount=10;
+ }
+ for (int k=0;k<6;++k)
+ for (int i=0;i<6;++i)
+ fr[k][i].update();
+ elasped+=hge->Timer_GetDelta();
+ if (elasped>3)
+ {
+ elasped=0;++cur;
+ if (cur>=6)cur=0;
+ double sr=re.NextInt(0,9)*pi/30.0f;
+ for (int i=0;i<6;++i)
+ {
+ fr[cur][i].drad=(i+1)*pi/3.0f+sr;
+ fr[cur][i].srad=i*pi/3.0f+sr;
+ fr[cur][i].init();
+ }
+ }
+}
+double l3p5brk;
+void Level3Part5()
+{
+ frameleft=ThirtySeconds;clrtime=2;
+ if (towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ All2pnt();BTarg.TargHide();
+ ShowTip("Well, here is a...");
+ return;
+ }
+ ++part;l3p5brk=0;
+}
+void Level3Part6()
+{
+ l3p5brk+=hge->Timer_GetDelta();
+ if (l3p5brk>0.2)
+ {
+ l3p5brk=0;
+ for (int i=1;i<=8;++i)bullet[CreateBullet8(i*100-50,20,2,false)].setdir(-pi/2);
+ }
+}
+void Level4Part0()
+{
+ frameleft=50;All2pnt();towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("\
+Level 4-Reunion\n\
+What was the weather like yesterday?...\n\
+");
+ IfCallLevel=false;
+ }
+ if (Current_Position==1)
+ {
+ frameleft=0;bulcnt=0;BTarg.TargHide();
+ return;
+ }
+}
+void Level4Part1()
+{
+ frameleft=ThirtySeconds;clrtime=0;
+ if (towcnt!=1&&towcnt!=0)return ClearAll();
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Where is this idea from?");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower9(400,300,1000,4,750,36,750);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+int redirs[400];int cred;
+void Level4Part2()
+{
+ frameleft=TenSeconds/2;clrtime=0;
+ if (towcnt==1)
+ {
+ ClearAll();
+ return;
+ }
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("...");
+ }
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ ATarg.TargShow();
+ posx=10,posy=10,doneredir=false;
+ }
+}
+void Level4Part3()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>30)
+ {
+ fskp=0;
+ if (posx<766)
+ {
+ posx+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part4()
+{
+ frameleft=TenSeconds/2;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level4Part5()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>30)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part6()
+{
+ frameleft=TenSeconds/10*4;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ ATarg.TargShow();
+ posx=10,posy=10,doneredir=false;
+ }
+}
+void Level4Part7()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>30)
+ {
+ fskp=0;
+ if (posx<766)
+ {
+ posx+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part8()
+{
+ frameleft=TenSeconds/10*4;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level4Part9()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>30)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part10()
+{
+ frameleft=TenSeconds/10*3;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ ATarg.TargShow();
+ posx=10,posy=10,doneredir=false;
+ }
+}
+void Level4Part11()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx<766)
+ {
+ posx+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part12()
+{
+ frameleft=TenSeconds/10*3;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level4Part13()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part14()
+{
+ frameleft=TenSeconds/10*2;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ ATarg.TargShow();
+ posx=10,posy=10,doneredir=false;
+ }
+}
+void Level4Part15()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx<766)
+ {
+ posx+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part16()
+{
+ frameleft=TenSeconds/10*2;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level4Part17()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level4Part18()
+{
+ frameleft=TenSeconds;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx=10,posy=10,posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level4Part19()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>33)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=24;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=24;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=2,doneredir=true;
+ }
+ if (posx<766)
+ {
+ posx+=24;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=24;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ }
+ }
+
+ }
+}
+double rot1,dta1,rot2,dta2,spd2,elsp1;
+void Level4Part20()
+{
+ frameleft=AMinute;All2pnt();towcnt=0;
+ DisableAllTower=false;clrtime=0;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Double Spinner...?");
+ }
+ if (Current_Position==1)
+ {
+ BTarg.TargHide();ATarg.TargHide();CreateTower3(400,300,999999999,0,0);
+ rot1=dta1=rot2=dta2=elsp1=0;spd2=1;++part;IfCallLevel=true;
+ return;
+ }
+}
+void Level4Part21()
+{
+ elsp1+=hge->Timer_GetDelta();
+ if (elsp1<=0.3)return;
+ elsp1=0;
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ {
+ dta1+=2*pi/180;dta2-=2*pi/180;spd2=1+4.0f*((AMinute-frameleft)/(double)AMinute);
+ rot1+=dta1;rot2+=dta2;
+ }
+ for (int i=0;i<6;++i)CreateBullet2(400,300,4,rot1+i*pi/3);
+ for (int i=0;i<6;++i)CreateBullet2(400,300,spd2,rot2+i*pi/3);
+}
+void Level4Part22()
+{
+ frameleft=AMinute;clrtime=1;
+ if (towcnt==1)
+ {
+ ClearAll();
+ return;
+ }
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Have problem breathing?\n...so try this!");
+ }
+ if (Current_Position==1)
+ {
+ ++part;
+ pnt1=CreateTower3(10,10,50,20,1);
+ pnt2=CreateTower3(790,10,50,20,1);
+ CreateTower9(400,10,2000,2,2000,6,1000);
+ }
+}
+void Level4Part23()
+{
+ if (!LOWFPS)
+ tower[pnt1].towerpos.x+=0.006,tower[pnt2].towerpos.x-=0.006;
+ else
+ tower[pnt1].towerpos.x+=0.006*17,tower[pnt2].towerpos.x-=0.006*17;
+}
+void Level4Part24()
+{
+ frameleft=AMinute;clrtime=0;
+ if (towcnt!=5&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;All2pnt();
+ Current_Position=2;
+ ShowTip("Let's meet a more classical circle-drawing part...\n\
+...as the end of this level...\nCan you draw perfectly?");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower4(400,300,2000,2.5);
+ CreateTower1(9,9,2000,3);
+ CreateTower1(767,11,2000,3);
+ CreateTower1(9,567,2000,3);
+ CreateTower1(767,567,2000,3);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ ++part;
+ return;
+ }
+}
+void Level4Part25()
+{
+ if(re.NextInt(0,599)==10)NewMultpo();
+ for (int i=2;i<=5;++i)
+ tower[i].towertimer=((frameleft)/(double)AMinute)*1800+200;
+}
+void Level5Part0()
+{
+ frameleft=50;All2pnt();towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ LE_Active=true;letex=TLeaf;lescale=0.75;
+ letr=TextureRect(0,0,108,108);lecolor=0xCCCC3333;
+ Leaf.Init();
+ Current_Position=2;
+ ShowTip("\
+Level 5-Crazy Autumn\n\
+Autumn is considered as a miserable season for \n\
+thousands of years...\n\
+This autumn, however, is coming too fast...\
+");
+ IfCallLevel=false;
+ }
+ if (Current_Position==1)
+ {
+ frameleft=0;
+ return;
+ }
+}
+void Level5Part1()
+{
+ frameleft=ThirtySeconds;clrtime=0;
+ if (towcnt!=2&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower9(400,300,2000,3,1000,36,750);
+ CreateTower4(400,50,2000,2.5,0);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+void Level5Part2()
+{
+ frameleft=ThirtySeconds;clrtime=0;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;All2pnt();
+ Current_Position=2;
+ ShowTip("What if your cheaser is faster than you...");
+ return;
+ }
+ tower[2].bulletspeed=4;IfCallLevel=false;
+}
+int pos,lsrbrk;
+bool rev;
+/**********************\
+ * Vortex of Leaves *
+\**********************/
+void Level5Part3()
+{
+ frameleft=AMinute;clrtime=2;
+ if (towcnt!=0)return (void)ClearAll();
+ Lasercnt=12;
+ for (int i=1;i<=12;++i)
+ {
+ laser[i].Init(32);
+ laser[i].SetTexture(SprSheet,0,264,248,8);
+ laser[i].RenCtr.x=406,laser[i].RenCtr.y=306;
+ }
+ ++part;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;All2pnt();
+ Current_Position=2;
+ ShowTip("Vortex of leaves...");
+ return;
+ }
+}
+void Level5Part4()
+{
+ bool shot=false;
+ if (LOWFPS)lsrbrk+=16;
+ if (++lsrbrk>=100)lsrbrk=0,shot=true,++pos;
+ if (pos==32)
+ {
+ pos=0;rev=!rev;
+ for (int i=1;i<=bulcnt;++i)
+ if (bullet[i].bullettype==2&&bullet[i].bulletspeed<1e-5)
+ bullet[i].bulletaccel=0.001,
+ bullet[i].limv=1+1.5*(frameleft/(double)AMinute);
+ }
+ for (int i=1;i<=12;++i)
+ {
+ double initrad=pi/6.0f*(i-1);
+ double dist;
+ for (int j=0;j<32;++j)
+ {
+ dist=j*Resd;
+ double trad;
+ if (rev)trad=initrad-j*pi/36.0f;else trad=initrad+j*pi/36.0f;
+ vector2d t,tt,s;
+ t.x=cos(trad)*dist;
+ t.y=sin(trad)*dist;
+ dist=(j+1)*Resd;
+ if (rev)trad=initrad-(j+1)*pi/36.0f;else trad=initrad+(j+1)*pi/36.0f;
+ tt.x=cos(trad)*dist;tt.y=sin(trad)*dist;
+ tt.x-=t.x;tt.y-=t.y;trad=tt.x;tt.x=tt.y;tt.y=-trad;
+ trad=sqrt(sqr(tt.x)+sqr(tt.y));
+ tt.x/=trad;tt.y/=trad;
+ //pos: 0~8, mult:0~8
+ //pos: 24~32, mult: 8~0
+ if (pos>=24)
+ tt.x*=(32-pos)/1.5f,tt.y*=(32-pos)/1.5f;
+ else
+ if (pos<=8)
+ tt.x*=pos/1.5f,tt.y*=pos/1.5f;
+ else
+ tt.x*=5.33f,tt.y*=5.33f;
+ //We only consider collisions when pos is between 9 and 23.
+ if (pos>9&&pos<23)laser[i].EnableColl=true;else laser[i].EnableColl=false;
+ s.x=t.x+tt.x;s.y=t.y+tt.y;
+ if (j==31)
+ for (int k=31;k<MaxRes;++k)
+ laser[i].Setdata(k,t,s,0xEEFF8800);
+ else
+ laser[i].Setdata(j,t,s,0xEEFF8800);
+ trad=initrad+j*pi/36.0f;
+ if (shot&&j==pos)bullet[CreateBullet2(400+t.x,300+t.y,0.0f,re.NextDouble(0,pi),1)].alterColor=orange;
+ if (shot&&j==pos&&re.NextInt(0,249)==99)NewMultpo(vector2d(400+t.x,300+t.y));
+ }
+ if (pos>8&&pos<23)
+ laser[i].EnableColl=true;
+ else
+ laser[i].EnableColl=false;
+ }
+}
+int tbuls[1000];double lv5brk;
+void Level5Part5()
+{
+ frameleft=AMinute;All2pnt();towcnt=0;Lasercnt=0;
+ memset(tbuls,0,sizeof(tbuls));lv5brk=0;++part;
+ clrtime=1;
+}
+void Level5Part6()
+{
+ lv5brk+=hge->Timer_GetDelta();
+ if (lv5brk<=0.3)return;
+ lv5brk=0;
+ for (int i=1;i<=9;++i)
+ for (int j=0;j<1000;++j)
+ if (!tbuls[j])
+ {
+ tbuls[j]=CreateBullet2(i*80,570,3,0.5*pi);
+ break;
+ }
+ for (int j=0;j<1000;++j)
+ if (tbuls[j]&&bullet[tbuls[j]].bulletpos.y<150)
+ {
+ if (re.NextInt(1,1000)>=800)
+ {
+ if (re.NextInt(1,1000)>=500)
+ CreateBullet6(bullet[tbuls[j]].bulletpos.x,bullet[tbuls[j]].bulletpos.y,3,200,1,18);
+ else
+ if (re.NextInt(1,1000)>=850)
+ CreateBullet9(bullet[tbuls[j]].bulletpos.x,bullet[tbuls[j]].bulletpos.y,3,500,18,300);
+ }
+ BulletEffect_Death(bullet[tbuls[j]],ColorToDWORD(blue));
+ bullet[tbuls[j]].exist=false;
+ tbuls[j]=0;
+ }
+}
+void Level5Part7()
+{
+ frameleft=ThirtySeconds;Dis8ref=true;tbrk=0;clrtime=1;
+ if (towcnt!=33&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;All2pnt();
+ ShowTip("Threatening effect of high speed bullets");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ for (int i=1;i<=33;++i)CreateTower8(i*24-12,12,500,10,20,30);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ ++part;tcnt=0;
+ return;
+ }
+}
+void Level5Part8()
+{
+ tbrk+=hge->Timer_GetDelta();
+ if (tbrk<=3)return;
+ tbrk=0;int tg;++tcnt;
+ if (re.NextInt(1,1000)>=500)tg=CreateBullet9(200,12,8,300,12,200);else tg=CreateBullet9(600,12,8,300,12,200);
+ bullet[tg].redir(playerpos);
+ if (tcnt>4)NewMultpo(),tcnt=0;
+}
+void Level5Part9()
+{
+ frameleft=ThirtySeconds;Dis8ref=true;tbrk=0;clrtime=1;
+ if (towcnt!=66&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;All2pnt();
+ ShowTip("Do not panic!");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ for (int i=1;i<=33;++i)CreateTower8(i*24-12,12,750,1,1,1),CreateTower8(i*24-12,588,750,1,1,1);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ ++part;tcnt=0;
+ return;
+ }
+}
+void Level5Part10()
+{
+ tbrk+=hge->Timer_GetDelta();
+ if (tbrk<=3)return;
+ tbrk=0;++tcnt;
+ if(tcnt>4)NewMultpo(),tcnt=0;
+ for (int i=0;i<6;++i)
+ {
+ int p=CreateBullet2(playerpos.x+cos(i*pi/3.0f)*6,12+sin(i*pi/3.0f)*6,2,-pi/2);
+ bullet[p].alterColor=orange;
+ }
+}
+void Level5Part11()
+{
+ frameleft=TenSeconds/10*2;clrtime=0;Dis8ref=false;
+ if (towcnt==66)
+ {
+ ClearAll();
+ return;
+ }
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("They are getting out of control...\n\
+Have you noticed that strange things are happening?...");
+ }
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;All2pnt();
+ ATarg.TargShow();
+ posx=10,posy=10,doneredir=false;
+ }
+}
+void Level5Part12()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx<766)
+ {
+ posx+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx-400)*0.95+400,(posy-300)*0.95+300,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx-400)*0.95+400,(posy-300)*0.95+300,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level5Part13()
+{
+ frameleft=TenSeconds/10*2;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level5Part14()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx2-400)*0.95+400,(posy2-300)*0.95+300,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx2-400)*0.95+400,(posy2-300)*0.95+300,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level5Part15()
+{
+ frameleft=TenSeconds/10*2;clrtime=0;
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx=10,posy=10,doneredir=false;
+}
+void Level5Part16()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx<766)
+ {
+ posx+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx-400)*0.95+400,(posy-300)*0.95+300,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx-400)*0.9+400,(posy-300)*0.9+300,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy<566)
+ {
+ posy+=12;
+ redirs[++cred]=CreateBullet9(posx,posy,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx-400)*0.95+400,(posy-300)*0.95+300,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx-400)*0.9+400,(posy-300)*0.9+300,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+void Level5Part17()
+{
+ frameleft=TenSeconds/2;clrtime=0;
+ DisableAllTower=false;
+ if (Current_Position==1)
+ {
+ ++part;memset(redirs,0,sizeof(redirs));cred=-1;
+ posx2=766,posy2=566,doneredir=false;
+ }
+}
+void Level5Part18()
+{
+ if (!LOWFPS)++fskp;else fskp+=17;
+ if (fskp>15)
+ {
+ fskp=0;
+ if (posx2>10)
+ {
+ posx2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx2-400)*0.95+400,(posy2-300)*0.95+300,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx2-400)*0.9+400,(posy2-300)*0.9+300,0,999999,1,999999);
+ }
+ else
+ {
+ if (posy2>10)
+ {
+ posy2-=12;
+ redirs[++cred]=CreateBullet9(posx2,posy2,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx2-400)*0.95+400,(posy2-300)*0.95+300,0,999999,1,999999);
+ redirs[++cred]=CreateBullet9((posx2-400)*0.9+400,(posy2-300)*0.9+300,0,999999,1,999999);
+ }
+ else
+ if (!doneredir)
+ for (int i=0;i<=cred;++i)
+ bullet[redirs[i]].redir(ATarg.targpos),bullet[redirs[i]].bulletspeed=4,doneredir=true;
+ }
+ }
+}
+double ntrot,ntbrk;
+int ntcnt;
+void Level5Part19()
+{
+ frameleft=AMinute;clrtime=1;ntrot=ntbrk=0;ntcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("You are the fish in my barrel.");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();
+ ATarg.TargHide();tbrk=0;
+ }
+}
+void Level5Part20()
+{
+ ntbrk+=hge->Timer_GetDelta();tbrk+=hge->Timer_GetDelta();
+ if(LOWFPS)ntrot+=16*pi/960.0f;else ntrot+=pi/960.0f;
+ if(ntbrk<0.01)return;
+ ntbrk=0;++ntcnt;if (ntcnt>15)ntcnt=0;
+ int rtatr;
+ if(frameleft>ThirtySeconds*1.5)rtatr=2;
+ if(frameleft<=ThirtySeconds*1.5&&frameleft>TenSeconds*4.2)rtatr=0;
+ if(frameleft<=TenSeconds*4.2&&frameleft>TenSeconds*2.2)rtatr=3;
+ if(frameleft<=TenSeconds*2.2&&frameleft>TwentySeconds)rtatr=0;
+ if(frameleft<=TwentySeconds)rtatr=4;
+ for(int i=0;i<rtatr;++i)
+ {
+ int a;
+ if(ntcnt==0)
+ a=CreateBullet9(400+250*sin(ntrot+i*2*pi/rtatr),300+250*cos(ntrot+i*2*pi/rtatr),2,500,1,500,true);
+ else
+ a=CreateBullet9(400+250*sin(ntrot+i*2*pi/rtatr),300+250*cos(ntrot+i*2*pi/rtatr),2,999999999,1,999999999,true);
+ bullet[a].redattrib=1;bullet[a].redir(vector2d(400,300));
+ bullet[a].bulletdir.x=-bullet[a].bulletdir.x;
+ bullet[a].bulletdir.y=-bullet[a].bulletdir.y;
+ if(tbrk>5)NewMultpo(vector2d(400+250*sin(ntrot+i*2*pi/rtatr),300+250*cos(ntrot+i*2*pi/rtatr)));
+ }
+ if(tbrk>5)tbrk=0;
+}
+void Level5Part21()
+{
+ frameleft=ThirtySeconds;
+ All2pnt();clrtime=1;
+ Lasercnt=0;
+ CTarg.Init(18,75,5.0f);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("This is the UNBREAKABLE jail.");
+ }
+ if (Current_Position==1)
+ {
+ CreateTower1(30,10,500,2);
+ CreateTower1(746,10,500,2);
+ CreateTower1(30,556,500,2);
+ CreateTower1(746,556,500,2);
+ ++part;
+ }
+}
+void Level5Part22()
+{
+ int times=1;if (LOWFPS)times=16;
+ for (int i=1;i<=times;++i)
+ CTarg.SetRange(CTarg.GetRange()-0.002f);
+ CTarg.Update();
+}
+void Level6Part0()
+{
+ frameleft=TenSeconds;All2pnt();towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ LE_Active=true;letex=TSflake;lescale=0.2;
+ letr=TextureRect(0,0,350,350);lecolor=0xCC3366CC;
+ Leaf.Init();
+ Current_Position=2;
+ ShowTip("\
+Level 6-Peaceful(?) Winter\n\
+Look, there's a question mark in the title...\
+");
+ }
+ if (Current_Position==1)
+ {
+ if (!LOWFPS)
+ DBGColor=ColorTransfer(DBGColor,0xFF60A0FF);
+ else
+ for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFF60A0FF);
+ if(DBGColor==0xFF60A0FF)++part;
+ return;
+ }
+}
+void Level6Part1()
+{
+ //Some component of this level is in towernbullet...
+ frameleft=ThirtySeconds;clrtime=1;
+ DisableAllTower=false;
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ whicnt=10;
+ CreateTower7(400,300,750,3,500);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+int spcnt;double sixrad,sixbrk;
+void Level6Part2()
+{
+ if (towcnt)return ClearAll(false);
+ All2pnt();frameleft=TenSeconds;
+ ++part;spcnt=2;sixrad=sixbrk=0;
+ whicnt=1;DisableAllTower=false;
+ tbrk=0;clrtime=3;
+}
+void Level6Part3()
+{
+ sixbrk+=hge->Timer_GetDelta();
+ if (sixrad>2*pi){if(tbrk<1)NewMultpo(vector2d(400,300)),tbrk=100;return;}
+ if (sixbrk<0.04)return;
+ sixbrk=0;
+ sixrad+=pi/25.0f;
+ for (int i=0;i<spcnt;++i)
+ {
+ int pnt=CreateBullet7(400,300,2,1500);
+ bullet[pnt].setdir(pi/2+sixrad+((double)i/(double)spcnt)*2.0f*pi);
+ }
+}
+void Level6Part4()
+{
+ frameleft=TenSeconds;whrcnt=9;
+ ++part;spcnt=3;sixrad=sixbrk=0;
+ whicnt=1;DisableAllTower=false;
+ tbrk=0;
+}
+void Level6Part5()
+{
+ sixbrk+=hge->Timer_GetDelta();
+ if (sixrad>2*pi){if(tbrk<1)NewMultpo(vector2d(400,300)),tbrk=100;return;}
+ if (sixbrk<0.04)return;
+ sixbrk=0;
+ sixrad+=pi/25.0f;
+ for (int i=0;i<spcnt;++i)
+ {
+ int pnt=CreateBullet7(400,300,2.2,1500);
+ bullet[pnt].setdir(pi/2+sixrad+((double)i/(double)spcnt)*2.0f*pi);
+ }
+}
+void Level6Part6()
+{
+ frameleft=TenSeconds;tbrk=0;
+ ++part;spcnt=4;sixrad=sixbrk=0;
+ whicnt=1;DisableAllTower=false;
+}
+void Level6Part7()
+{
+ sixbrk+=hge->Timer_GetDelta();
+ if (sixrad>2*pi){if(tbrk<1)NewMultpo(vector2d(400,300)),tbrk=100;return;}
+ if (sixbrk<0.04)return;
+ sixbrk=0;
+ sixrad+=pi/25.0f;
+ for (int i=0;i<spcnt;++i)
+ {
+ int pnt=CreateBullet7(400,300,2.4,1500);
+ bullet[pnt].setdir(pi/2+sixrad+((double)i/(double)spcnt)*2.0f*pi);
+ }
+}
+void Level6Part8()
+{
+ frameleft=TenSeconds;whrcnt=6;
+ ++part;spcnt=5;sixrad=sixbrk=0;
+ whicnt=1;DisableAllTower=false;
+ tbrk=0;
+}
+void Level6Part9()
+{
+ sixbrk+=hge->Timer_GetDelta();
+ if (sixrad>2*pi){if(tbrk<1)NewMultpo(vector2d(400,300)),tbrk=100;return;}
+ if (sixbrk<0.04)return;
+ sixbrk=0;
+ sixrad+=pi/25.0f;
+ for (int i=0;i<spcnt;++i)
+ {
+ int pnt=CreateBullet7(400,300,2.6,1500);
+ bullet[pnt].setdir(pi/2+sixrad+((double)i/(double)spcnt)*2.0f*pi);
+ }
+}
+void Level6Part10()
+{
+ frameleft=TenSeconds;whrcnt=6;
+ ++part;spcnt=6;sixrad=sixbrk=0;
+ whicnt=1;DisableAllTower=false;
+ tbrk=0;
+}
+void Level6Part11()
+{
+ sixbrk+=hge->Timer_GetDelta();
+ if (sixrad>2*pi){if(tbrk<1)NewMultpo(vector2d(400,300)),tbrk=100;return;}
+ if (sixbrk<0.04)return;
+ sixbrk=0;
+ sixrad+=pi/25.0f;
+ for (int i=0;i<spcnt;++i)
+ {
+ int pnt=CreateBullet7(400,300,2.6,1500);
+ bullet[pnt].setdir(pi/2+sixrad+((double)i/(double)spcnt)*2.0f*pi);
+ }
+}
+void Level6Part12()
+{
+ frameleft=AMinute;clrtime=1;
+ if (towcnt!=8&&towcnt)
+ {
+ ClearAll(false);
+ return;
+ }
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Get out before you are squashed...");
+ }
+ if (Current_Position==1)
+ {
+ ++part;squashrev=false;All2pnt();
+ tbrk=0;
+ CreateTower3(10,10,400,2,1);
+ CreateTower3(766,10,400,2,1);
+ CreateTower3(10,566,400,2,1);
+ CreateTower3(766,566,400,2,1);
+ CreateTower1(9,9,1000,1.5);
+ CreateTower1(767,11,1000,1.5);
+ CreateTower1(9,567,1000,1.5);
+ CreateTower1(767,567,1000,1.5);
+ }
+}
+void Level6Part13()
+{
+ tbrk+=hge->Timer_GetDelta();
+ if(tbrk>=12)
+ {
+ for(int i=1;i<=4;++i)NewMultpo(tower[i].towerpos);
+ tbrk=0;
+ }
+ if (!squashrev)
+ {
+ if (!LOWFPS)
+ {
+ tower[1].towerpos.x+=0.01;
+ tower[1].towerpos.y+=0.007354;
+ tower[2].towerpos.x-=0.01;
+ tower[2].towerpos.y+=0.007354;
+ tower[3].towerpos.x+=0.01;
+ tower[3].towerpos.y-=0.007354;
+ tower[4].towerpos.x-=0.01;
+ tower[4].towerpos.y-=0.007354;
+ }
+ else
+ {
+ tower[1].towerpos.x+=0.16;
+ tower[1].towerpos.y+=0.117664;
+ tower[2].towerpos.x-=0.16;
+ tower[2].towerpos.y+=0.117664;
+ tower[3].towerpos.x+=0.16;
+ tower[3].towerpos.y-=0.117664;
+ tower[4].towerpos.x-=0.16;
+ tower[4].towerpos.y-=0.117664;
+ }
+ }
+ else
+ {
+ if (!LOWFPS)
+ {
+ tower[1].towerpos.x-=0.01;
+ tower[1].towerpos.y-=0.007354;
+ tower[2].towerpos.x+=0.01;
+ tower[2].towerpos.y-=0.007354;
+ tower[3].towerpos.x-=0.01;
+ tower[3].towerpos.y+=0.007354;
+ tower[4].towerpos.x+=0.01;
+ tower[4].towerpos.y+=0.007354;
+ }
+ else
+ {
+ tower[1].towerpos.x-=0.16;
+ tower[1].towerpos.y-=0.117664;
+ tower[2].towerpos.x+=0.16;
+ tower[2].towerpos.y-=0.117664;
+ tower[3].towerpos.x-=0.16;
+ tower[3].towerpos.y+=0.117664;
+ tower[4].towerpos.x+=0.16;
+ tower[4].towerpos.y+=0.117664;
+ }
+ }
+ if (tower[1].towerpos.x>766||tower[1].towerpos.x<10)squashrev=!squashrev;
+}
+double avabrk,avacurbrk;
+bool dir;
+void Level6Part14()//Avalanche
+{
+ frameleft=AMinute;clrtime=1;
+ if (towcnt)
+ {
+ ClearAll(false);
+ return;
+ }
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Avalanche...");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=1.0f;avacurbrk=tbrk=0;dir=false;
+ }
+}
+void Level6Part15()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ tbrk+=hge->Timer_GetDelta();
+ avabrk=((double)frameleft/(double)AMinute)*0.04f+0.01f;
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ int pnt=CreateBullet2(re.NextDouble(10,790),200,-6.25,3*pi/2.0f);
+ bullet[pnt].limv=re.NextInt(2,8);bullet[pnt].bulletaccel=0.005;
+ }
+ if (tbrk>6)NewMultpo(vector2d(re.NextDouble(20,780),re.NextDouble(20,150))),tbrk=0;
+}
+void Level6Part16()
+{
+ frameleft=AMinute;clrtime=2;
+ if (towcnt)
+ {
+ ClearAll(false);
+ return;
+ }
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("?..");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=1.0f;
+ avacurbrk=0;dir=false;ATarg.TargShow();
+ ATarg.targpos=vector2d(400,300);
+ whicnt=3;avacurbrk=0;
+ }
+}
+void Level6Part17()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ avabrk=((double)frameleft/(double)AMinute)*0.8f+0.2f;
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ int pnt;
+ if (re.NextInt(1,100)<=80)
+ pnt=CreateBullet7(ATarg.targpos.x,ATarg.targpos.y,3,500);
+ else
+ pnt=CreateBullet6(ATarg.targpos.x,ATarg.targpos.y,4,1000);
+ bullet[pnt].dist=1;bullet[pnt].bulletdir=vector2d(0,0);
+ if(re.NextInt(0,19)==14)NewMultpo();
+ }
+}
+//begin hexagon
+Bullet bheader[100],*beewx[1500];
+static int sxcnt,seq,beecnt;
+bool brdir;
+double offset;
+void Level6Part18()
+{
+ DisableAllTower=false;clrtime=3;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Hexagon loops");
+ }
+ if (Current_Position==1)
+ {
+ sxcnt=-1;beecnt=-1;brdir=false;frameleft=TenSeconds;offset=86;
+ memset(bheader,0,sizeof(bheader));
+ memset(beewx,0,sizeof(beewx));
+ avacurbrk=1;avabrk=1;sixbrk=0.1;seq=3;
+ for (int i=1;i<=5;++i)
+ {
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,10,2,-pi/6);
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,10,2,-5*pi/6);
+ }
+ ++part;ATarg.TargHide();All2pnt();
+ }
+}
+void Level6Part19()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ if (frameleft<TenSeconds/10*1&&!brdir)
+ {
+ brdir=true;
+ for (int i=0;i<=beecnt;++i)
+ {
+ beewx[i]->bulletaccel=0.001;beewx[i]->limv=1;
+ beewx[i]->setdir(re.NextDouble(0,pi));
+ }
+ }
+ for (int i=0;i<=sxcnt;++i)ProcessBullet2(bheader[i]);
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;++seq;seq%=4;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ if (i&1)
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(-5*pi/6);break;
+ case 1:bheader[i].setdir(-pi/2);break;
+ case 2:bheader[i].setdir(-pi/6);break;
+ case 3:bheader[i].setdir(-pi/2);break;
+ }
+ }
+ else
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(-pi/6);break;
+ case 1:bheader[i].setdir(-pi/2);break;
+ case 2:bheader[i].setdir(-5*pi/6);break;
+ case 3:bheader[i].setdir(-pi/2);break;
+ }
+ }
+ }
+ }
+ if (sixbrk>0.2&&!brdir)
+ {
+ sixbrk=0;
+ if (bheader[0].bulletpos.y>610)return;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ beewx[++beecnt]=&bullet[CreateBullet2(bheader[i].bulletpos.x,bheader[i].bulletpos.y,0,pi,true)];
+ }
+ }
+}
+void Level6Part20()
+{
+ sxcnt=-1;beecnt=-1;brdir=false;frameleft=TwentySeconds;offset=43;
+ memset(bheader,0,sizeof(bheader));
+ memset(beewx,0,sizeof(beewx));
+ avacurbrk=0.5;avabrk=0.5;sixbrk=0.1;seq=3;
+ for (int i=1;i<=10;++i)
+ {
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,10,2,-pi/6);
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,10,2,-5*pi/6);
+ }
+ ++part;
+}
+void Level6Part21()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ if (frameleft<TenSeconds/10*11&&!brdir)
+ {
+ brdir=true;
+ for (int i=0;i<=beecnt;++i)
+ {
+ beewx[i]->bulletaccel=0.001;beewx[i]->limv=1;
+ beewx[i]->setdir(re.NextDouble(0,pi));
+ }
+ }
+ for (int i=0;i<=sxcnt;++i)ProcessBullet2(bheader[i]);
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;++seq;seq%=4;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ if (i&1)
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(-5*pi/6);break;
+ case 1:bheader[i].setdir(-pi/2);break;
+ case 2:bheader[i].setdir(-pi/6);break;
+ case 3:bheader[i].setdir(-pi/2);break;
+ }
+ }
+ else
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(-pi/6);break;
+ case 1:bheader[i].setdir(-pi/2);break;
+ case 2:bheader[i].setdir(-5*pi/6);break;
+ case 3:bheader[i].setdir(-pi/2);break;
+ }
+ }
+ }
+ }
+ if (sixbrk>0.2&&!brdir)
+ {
+ sixbrk=0;
+ if (bheader[0].bulletpos.y>610)return;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ beewx[++beecnt]=&bullet[CreateBullet2(bheader[i].bulletpos.x,bheader[i].bulletpos.y,0,pi,true)];
+ }
+ }
+}
+void Level6Part22()
+{
+ sxcnt=-1;beecnt=-1;brdir=false;frameleft=TenSeconds/10*7;offset=43;
+ memset(bheader,0,sizeof(bheader));
+ memset(beewx,0,sizeof(beewx));
+ avacurbrk=0.25;avabrk=0.25;sixbrk=0.1;seq=3;
+ for (int i=1;i<=10;++i)
+ {
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,10,4,-pi/6);
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,10,4,-5*pi/6);
+ }
+ ++part;
+}
+void Level6Part23()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ if (frameleft<TenSeconds/10*1&&!brdir)
+ {
+ brdir=true;
+ for (int i=0;i<=beecnt;++i)
+ {
+ beewx[i]->bulletaccel=0.001;beewx[i]->limv=1;
+ beewx[i]->setdir(re.NextDouble(0,pi));
+ }
+ }
+ for (int i=0;i<=sxcnt;++i)ProcessBullet2(bheader[i]);
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;++seq;seq%=4;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ if (i&1)
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(-5*pi/6);break;
+ case 1:bheader[i].setdir(-pi/2);break;
+ case 2:bheader[i].setdir(-pi/6);break;
+ case 3:bheader[i].setdir(-pi/2);break;
+ }
+ }
+ else
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(-pi/6);break;
+ case 1:bheader[i].setdir(-pi/2);break;
+ case 2:bheader[i].setdir(-5*pi/6);break;
+ case 3:bheader[i].setdir(-pi/2);break;
+ }
+ }
+ }
+ }
+ if (sixbrk>0.1&&!brdir)
+ {
+ sixbrk=0;
+ if (bheader[0].bulletpos.y>610)return;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ beewx[++beecnt]=&bullet[CreateBullet2(bheader[i].bulletpos.x,bheader[i].bulletpos.y,0,pi,true)];
+ }
+ }
+}
+void Level6Part24()
+{
+ sxcnt=-1;beecnt=-1;brdir=false;frameleft=TenSeconds/10*7;offset=43;
+ memset(bheader,0,sizeof(bheader));
+ memset(beewx,0,sizeof(beewx));
+ avacurbrk=0.25;avabrk=0.25;sixbrk=0.1;seq=3;
+ for (int i=1;i<=10;++i)
+ {
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,590,4,pi/6);
+ CreateBullet2(bheader[++sxcnt],offset+2*(i-1)*offset,590,4,5*pi/6);
+ }
+ ++part;
+}
+void Level6Part25()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ if (frameleft<TenSeconds/10*1&&!brdir)
+ {
+ brdir=true;
+ for (int i=0;i<=beecnt;++i)
+ {
+ beewx[i]->bulletaccel=0.001;beewx[i]->limv=1;
+ beewx[i]->setdir(re.NextDouble(0,pi));
+ }
+ }
+ for (int i=0;i<=sxcnt;++i)ProcessBullet2(bheader[i]);
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;++seq;seq%=4;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ if (i&1)
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(5*pi/6);break;
+ case 1:bheader[i].setdir(pi/2);break;
+ case 2:bheader[i].setdir(pi/6);break;
+ case 3:bheader[i].setdir(pi/2);break;
+ }
+ }
+ else
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(pi/6);break;
+ case 1:bheader[i].setdir(pi/2);break;
+ case 2:bheader[i].setdir(5*pi/6);break;
+ case 3:bheader[i].setdir(pi/2);break;
+ }
+ }
+ }
+ }
+ if (sixbrk>0.1&&!brdir)
+ {
+ sixbrk=0;
+ if (bheader[0].bulletpos.y<-10)return;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ beewx[++beecnt]=&bullet[CreateBullet2(bheader[i].bulletpos.x,bheader[i].bulletpos.y,0,pi,true)];
+ }
+ }
+}
+void Level6Part26()
+{
+ sxcnt=-1;beecnt=-1;brdir=false;frameleft=TenSeconds/10*7;offset=43;
+ memset(bheader,0,sizeof(bheader));
+ memset(beewx,0,sizeof(beewx));
+ avacurbrk=0.25;avabrk=0.25;sixbrk=0.1;seq=3;
+ for (int i=1;i<=10;++i)
+ {
+ CreateBullet2(bheader[++sxcnt],790,offset+2*(i-1)*offset,4,5*pi/3);
+ CreateBullet2(bheader[++sxcnt],790,offset+2*(i-1)*offset,4,pi/3);
+ }
+ ++part;
+}
+void Level6Part27()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ if (frameleft<TenSeconds/10*1&&!brdir)
+ {
+ brdir=true;
+ for (int i=0;i<=beecnt;++i)
+ {
+ beewx[i]->bulletaccel=0.001;beewx[i]->limv=1;
+ beewx[i]->setdir(re.NextDouble(0,pi));
+ }
+ }
+ for (int i=0;i<=sxcnt;++i)ProcessBullet2(bheader[i]);
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;++seq;seq%=4;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ if (i&1)
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(pi/3);break;
+ case 1:bheader[i].setdir(0);break;
+ case 2:bheader[i].setdir(5*pi/3);break;
+ case 3:bheader[i].setdir(0);break;
+ }
+ }
+ else
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(5*pi/3);break;
+ case 1:bheader[i].setdir(0);break;
+ case 2:bheader[i].setdir(pi/3);break;
+ case 3:bheader[i].setdir(0);break;
+ }
+ }
+ }
+ }
+ if (sixbrk>0.1&&!brdir)
+ {
+ sixbrk=0;
+ if (bheader[0].bulletpos.x<-10)return;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ beewx[++beecnt]=&bullet[CreateBullet2(bheader[i].bulletpos.x,bheader[i].bulletpos.y,0,pi,true)];
+ }
+ }
+}
+void Level6Part28()
+{
+ sxcnt=-1;beecnt=-1;brdir=false;frameleft=TenSeconds+TenSeconds/10*9;offset=43;
+ memset(bheader,0,sizeof(bheader));
+ memset(beewx,0,sizeof(beewx));
+ avacurbrk=0.25;avabrk=0.25;sixbrk=0.1;seq=3;
+ for (int i=1;i<=10;++i)
+ {
+ CreateBullet2(bheader[++sxcnt],10,offset+2*(i-1)*offset,4,pi+5*pi/3);
+ CreateBullet2(bheader[++sxcnt],10,offset+2*(i-1)*offset,4,pi+pi/3);
+ }
+ ++part;
+}
+void Level6Part29()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ if (frameleft<TenSeconds/10*6&&!brdir)
+ {
+ brdir=true;
+ for (int i=0;i<=beecnt;++i)
+ {
+ beewx[i]->bulletaccel=0.001;beewx[i]->limv=1;
+ beewx[i]->setdir(re.NextDouble(0,pi));
+ }
+ }
+ for (int i=0;i<=sxcnt;++i)ProcessBullet2(bheader[i]);
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;++seq;seq%=4;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ if (i&1)
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(pi+pi/3);break;
+ case 1:bheader[i].setdir(pi);break;
+ case 2:bheader[i].setdir(pi+5*pi/3);break;
+ case 3:bheader[i].setdir(pi);break;
+ }
+ }
+ else
+ {
+ switch (seq)
+ {
+ case 0:bheader[i].setdir(pi+5*pi/3);break;
+ case 1:bheader[i].setdir(pi);break;
+ case 2:bheader[i].setdir(pi+pi/3);break;
+ case 3:bheader[i].setdir(pi);break;
+ }
+ }
+ }
+ }
+ if (sixbrk>0.1&&!brdir)
+ {
+ sixbrk=0;
+ if (bheader[0].bulletpos.x>810)return;
+ for (int i=0;i<=sxcnt;++i)
+ {
+ beewx[++beecnt]=&bullet[CreateBullet2(bheader[i].bulletpos.x,bheader[i].bulletpos.y,0,pi,true)];
+ }
+ }
+}
+void Level6Part30()//Hyperfluid!
+{
+ frameleft=AMinute;clrtime=2;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Hyperfluid!");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=0.2f;avacurbrk=0;sixbrk=-1;tbrk=0;
+ }
+}
+void Level6Part999999999()//well this is not an easter egg!
+{
+ avabrk=(frameleft/(double)AMinute)*0.15f+0.05f;
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ tbrk+=hge->Timer_GetDelta();
+ if(tbrk>10)tbrk=0,NewMultpo(vector2d(re.NextDouble(40,100),re.NextDouble(30,75)));
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ for (int i=1;i<=re.NextInt(1,10);++i)
+ if (re.NextInt(1,1000)>500)
+ {
+ int pnt=CreateBullet2(10,re.NextDouble(10,590),0,-3*pi/4);
+ bullet[pnt].bulletaccel=0.0025;bullet[pnt].limv=6;
+ }
+ else
+ {
+ int pnt=CreateBullet2(re.NextDouble(10,790),10,0,-3*pi/4);
+ bullet[pnt].bulletaccel=0.0025;bullet[pnt].limv=6;
+ }
+ }
+ if (sixbrk>0.5)
+ {
+ sixbrk=0;
+ for (int i=1;i<=re.NextInt(1,10);++i)
+ {
+ int pnt=CreateBullet2(re.NextDouble(10,790),590,1,pi/2);
+ bullet[pnt].alterColor=white;
+ }
+ }
+}
+int bgbrk;
+double bgdbbrk;
+void Level7Part0()
+{
+ frameleft=50;All2pnt();towcnt=0;bgbrk=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ LE_Active=false;
+ Current_Position=2;
+ ShowTip("\
+Level 7-Rainbow of Spring\n\
+Will there be a clearer day?\
+");
+ frameleft=TenSeconds;++part;
+ }
+}
+bool skystp;
+void Level7Part1()
+{
+ ++bgbrk;if (LOWFPS)bgbrk+=16;
+ if (bgbrk<30)return;
+ bgbrk=0;
+ if (!LOWFPS)
+ DBGColor=ColorTransfer(DBGColor,0xFF0B0916);
+ else
+ for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFF0B0916);
+ if (DBGColor==0xFF0B0916)
+ {
+ frameleft=AMinute,++part;tbrk=0;clrtime=2;
+ bgdbbrk=re.NextInt(5,20),bgbrk=0;
+ avabrk=0.2f;avacurbrk=0;skystp=false;
+ }
+}
+void Level7Part2()
+{
+ if (bgbrk==1||bgbrk==4)
+ {
+ int times=5;if (LOWFPS)times*=16;
+ for (int i=1;i<=times;++i)DBGColor=ColorTransfer(DBGColor,0xFF23459A);
+ if (DBGColor==0xFF23459A)
+ {
+ if(bgbrk==1)bgbrk=2;
+ if(bgbrk==4)bgbrk=5;
+ }
+ }
+ if (bgbrk==2||bgbrk==5)
+ {
+ int times=1;if (LOWFPS)times*=16;
+ for (int i=1;i<=times;++i)DBGColor=ColorTransfer(DBGColor,0xFF0B0916);
+ if (DBGColor==0xFF0B0916)
+ {
+ if(bgbrk==2)bgbrk=3,bgdbbrk=0.06;
+ if(bgbrk==5)bgbrk=0,bgdbbrk=re.NextInt(5,20);
+ }
+ }
+ if (bgbrk==3||bgbrk==0)
+ {
+ bgdbbrk-=hge->Timer_GetDelta();
+ if (bgdbbrk<=0)
+ {
+ if (bgbrk==0)bgbrk=1;
+ if (bgbrk==3)bgbrk=4;
+ }
+ }
+ avabrk=(frameleft/(double)AMinute)*0.15f+0.15f;
+ avacurbrk+=hge->Timer_GetDelta();
+ sixbrk+=hge->Timer_GetDelta();
+ tbrk+=hge->Timer_GetDelta();
+ if (tbrk>10)tbrk=0,NewMultpo(vector2d(re.NextDouble(200,600),re.NextDouble(500,575)));
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ for (int i=1;i<=re.NextInt(1,10);++i)
+ {
+ if (re.NextInt(1,1000)>=500)
+ {
+ int pnt=CreateBullet2(10,re.NextDouble(10,590),0,-3*pi/4);
+ bullet[pnt].bulletaccel=0.0025;bullet[pnt].limv=6;
+ }
+ else
+ {
+ int pnt=CreateBullet2(re.NextDouble(10,790),10,0,-3*pi/4);
+ bullet[pnt].bulletaccel=0.0025;bullet[pnt].limv=6;
+ }
+ if (re.NextInt(1,1000)>=500)
+ {
+ int pnt=CreateBullet2(780,re.NextDouble(10,590),0,-pi/4);
+ bullet[pnt].bulletaccel=0.0025;bullet[pnt].limv=6;
+ }
+ else
+ {
+ int pnt=CreateBullet2(re.NextDouble(10,790),10,0,-pi/4);
+ bullet[pnt].bulletaccel=0.0025;bullet[pnt].limv=6;
+ }
+ }
+ }
+}
+void Level7Part3()
+{
+ frameleft=TenSeconds;
+ if (!skystp)
+ {
+ ++bgbrk;if (LOWFPS)bgbrk+=16;
+ if (bgbrk<30)return;
+ bgbrk=0;
+ if (!LOWFPS)
+ DBGColor=ColorTransfer(DBGColor,0xFFFFFFFF);
+ else
+ for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFFFFFFFF);
+ if (DBGColor==0xFFFFFFFF)skystp=skyactive=true,sky.SkySetFadeIn(),sky.SetSpeed(0.01);
+ sky.SetTime(9);
+ }
+ else
+ {
+ ++bgbrk;if (LOWFPS)bgbrk+=16;
+ if (bgbrk<30)return;
+ bgbrk=0;
+ if (!LOWFPS)
+ DBGColor=ColorTransfer(DBGColor,0x00FFFFFF);
+ else
+ for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0x00FFFFFF);
+ if (DBGColor==0x00FFFFFF)
+ ++part;
+ }
+}
+void Level7Part4()
+{
+ frameleft=(AMinute+ThirtySeconds);clrtime=3;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Rainbow tower...");
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ towcnt=0;
+ deltadelta=pi/720;
+ CreateTower6(400,300,600,2,1000,3,72);
+ ++part;All2pnt();
+}
+void Level7Part5()
+{
+ ++frameskips;
+ if (tower[1].towertype==6)
+ {
+ if (frameskips>TenSeconds/5)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower9(400,300,600,2,1500,72,1200);
+ }
+ }
+ if (tower[1].towertype==9)
+ {
+ if (frameskips>TenSeconds/5)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower4(400,300,500,1,500);
+ }
+ }
+ if (tower[1].towertype==4)
+ {
+ if (frameskips>TenSeconds/5)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower1(400,300,50,4);
+ }
+ }
+ if (tower[1].towertype==1)
+ {
+ if (frameskips>TenSeconds/5)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower2(400,300,50,4);
+ }
+ }
+ if (tower[1].towertype==2)
+ {
+ if (frameskips>TenSeconds/2)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower8(400,300,500,5,20,50);
+ }
+ }
+ if (tower[1].towertype==8)
+ {
+ BTarg.TargHide();
+ if (frameskips>TenSeconds/5)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower5(400,300,50,5);
+ }
+ }
+ if (tower[1].towertype==5)
+ {
+ if (frameskips>TenSeconds/5)
+ {
+ frameskips=0;
+ towcnt=0;
+ CreateTower6(400,300,600,2,1000,3,72);
+ }
+ }
+}
+void Level7Part6()
+{
+ frameleft=AMinute;clrtime=2;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Hit Z...");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=1.0f;avacurbrk=0;
+ }
+}
+void Level7Part7()
+{
+ avabrk=frameleft/(double)AMinute*0.5f+0.5f;
+ avacurbrk+=hge->Timer_GetDelta();
+ if (avacurbrk>avabrk)
+ {
+ if(re.NextInt(0,4)==0)NewMultpo();
+ avacurbrk=0;
+ bool lasta,lastb;
+ lasta=re.NextInt(1,1000)<500;lastb=re.NextInt(1,1000)<500;
+ for (int i=0;i<31;++i)
+ {
+ int rf=re.NextInt(0,999);
+ if ((lasta&&rf<600)||(!lasta&&rf<250))
+ {
+ int pnt=CreateBullet2(-15,i*20,2,pi);
+ bullet[pnt].alterColor=(TColors)(i%8);
+ bullet[pnt].limv=2+2*(AMinute-frameleft)/(double)AMinute;bullet[pnt].bulletaccel=0.002;
+ lasta=true;
+ }else lasta=false;
+ rf=re.NextInt(0,999);
+ if ((lastb&&rf<600)||(!lastb&&rf<250))
+ {
+ int pnt=CreateBullet2(815,i*20-10,2,0);
+ bullet[pnt].alterColor=(TColors)(i%8);
+ bullet[pnt].limv=2+2*(AMinute-frameleft)/(double)AMinute;bullet[pnt].bulletaccel=0.002;
+ lastb=true;
+ }else lastb=false;
+ }
+ }
+}
+double sntang;
+void Level7Part8()
+{
+ frameleft=AMinute;clrtime=2;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Rainbow!");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=0.03f;avacurbrk=1.0f;sntang=-pi/2;
+ }
+}
+void rainbowCreator(double rl,double rr,double rad,TColors col,double speed,bool invi=false)
+{
+ double r=re.NextDouble(rr,rl);
+ int pnt=CreateBullet2(900+cos(rad)*r,700+sin(rad)*r,speed,re.NextDouble(0,pi),true,invi);
+ bullet[pnt].alterColor=col;
+}
+void Level7Part9()
+{
+ if (sntang>-pi)
+ {
+ avacurbrk+=hge->Timer_GetDelta();
+ if (avacurbrk>avabrk)
+ {
+ sntang-=pi/180;avacurbrk=0;
+ for(int i=0;i<6;++i)rainbowCreator(660,600,sntang,red,0,1);
+ for(int i=0;i<6;++i)rainbowCreator(610,550,sntang,orange,0,1);
+ for(int i=0;i<6;++i)rainbowCreator(560,500,sntang,yellow,0,1);
+ for(int i=0;i<6;++i)rainbowCreator(510,450,sntang,green,0,1);
+ for(int i=0;i<6;++i)rainbowCreator(460,410,sntang,blue,0,1);
+ for(int i=0;i<6;++i)rainbowCreator(420,360,sntang,dblue,0,1);
+ for(int i=0;i<6;++i)rainbowCreator(365,310,sntang,purple,0,1);
+ }
+ }
+ else
+ {
+ avabrk=0.25+(frameleft/(double)AMinute)*0.5f;
+ avacurbrk+=hge->Timer_GetDelta();
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ if(re.NextInt(0,19)==7)NewMultpo();
+ double spd=((AMinute-frameleft)/(double)AMinute)+1;
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(660,600,sntang,red,spd);
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(610,550,sntang,orange,spd);
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(560,500,sntang,yellow,spd);
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(510,450,sntang,green,spd);
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(460,410,sntang,blue,spd);
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(420,360,sntang,dblue,spd);
+ for(int i=0;i<((AMinute-frameleft)/(double)AMinute)*20;++i)
+ sntang=re.NextDouble(-pi,-pi/2),
+ rainbowCreator(365,310,sntang,purple,spd);
+ sntang=-pi-0.1;
+ }
+ }
+}
+SimpleThing aa,bb;
+void Level7Part10()
+{
+ frameleft=AMinute*2;clrtime=1;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Interference(fake)");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();skyactive=false;DBGColor=0xFF000000;
+ binter.Init("./Resources/b_inter.png",PicBack::Centered,0x80);
+ binter.SetFadeIn();aa.Init(vector2d(260,292));bb.Init(vector2d(523,292));
+ }
+}
+void Level7Part11()
+{
+//260,292;523,292
+ aa.Update(true);bb.Update(false);
+}
+diffCreator dfc[200];
+void Level7Part12()
+{
+ frameleft=AMinute*2;clrtime=3;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;bulcnt=0;
+ aa.toPoint();bb.toPoint();
+ Current_Position=2;
+ ShowTip("Diffraction(fake)");
+ }
+ if (Current_Position==1)
+ {
+ ++part;memset(dfc,0,sizeof(dfc));
+ binter.SetFadeOut();bdiff.Init("./resources/b_diff.png",PicBack::Tiled,0x80);
+ bdiff.SetFadeIn();bdiff.SetScale(0.5);
+ avabrk=2.0f;avacurbrk=0;
+ }
+}
+void Level7Part13()
+{
+ avabrk=1.0f+frameleft/(double)AMinute;
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk&&frameleft>=TenSeconds/5)
+ {
+ for(int i=0;i<200;++i)
+ if (!dfc[i].isActive())
+ {
+ if(re.NextInt(1,100)>=75)
+ {
+ if(re.NextInt(1,100)>=50)
+ {
+ vector2d pos=vector2d(playerpos.x,re.NextDouble(0,600));
+ while (GetDist(pos,playerpos)<100)
+ pos=vector2d(playerpos.x,re.NextDouble(0,600));
+ dfc[i].init(pos);
+ }
+ else
+ {
+ vector2d pos=vector2d(re.NextDouble(0,800),playerpos.y);
+ while (GetDist(pos,playerpos)<100)
+ pos=vector2d(re.NextDouble(0,800),playerpos.y);
+ dfc[i].init(pos);
+ }
+ }
+ else
+ {
+ vector2d pos=vector2d(re.NextDouble(0,800),re.NextDouble(0,600));
+ while (GetDist(pos,playerpos)<100)
+ pos=vector2d(re.NextDouble(0,800),re.NextDouble(0,600));
+ dfc[i].init(pos);
+ if(re.NextInt(0,7)==3)NewMultpo(pos);
+ }
+ break;
+ }
+ avacurbrk=0;
+ }
+ for(int i=0;i<200;++i)
+ if(dfc[i].isActive())dfc[i].update();
+}
+BulletSine bnl[100];
+double ykbrk;
+void Level7Part14()//Photon school
+{
+ memset(bnl,0,sizeof(bnl));
+ frameleft=AMinute;clrtime=2;
+ ykbrk=0.5f;skyactive=true;bdiff.SetFadeOut();
+ if((DBGColor=ColorTransfer(DBGColor,0x00000000))==0x0)++part;
+}
+void Level7Part15()
+{
+ ykbrk-=hge->Timer_GetDelta();
+ if (ykbrk<0&&frameleft>TenSeconds/10*3)
+ {
+ ykbrk=(double)frameleft/AMinute*0.75f+0.75f;
+ for (int i=0;i<100;++i)
+ if (!bnl[i].active)
+ {
+ vector2d a,b;
+ if (re.NextInt(1,100)>=50)
+ {
+ if (re.NextInt(1,100)>=50)a=vector2d(re.NextDouble(10,790),610);else a=vector2d(re.NextDouble(10,790),-10);
+ }
+ else
+ {
+ if (re.NextInt(1,100)>=50)a=vector2d(-10,re.NextDouble(10,590));else a=vector2d(810,re.NextDouble(10,590));
+ }
+ if (re.NextInt(1,100)>=50)
+ {
+ if (re.NextInt(1,100)>=50)b=vector2d(re.NextDouble(10,790),610);else b=vector2d(re.NextDouble(10,790),-10);
+ }
+ else
+ {
+ if (re.NextInt(1,100)>=50)b=vector2d(-10,re.NextDouble(10,590));else b=vector2d(810,re.NextDouble(10,590));
+ }
+ bnl[i].Init(a,b);
+ break;
+ }
+ }
+ for (int i=0;i<100;++i)
+ if (bnl[i].active)bnl[i].Update();
+}
+double DTCircle;
+BCircle Circles[20];
+int CCnt,state;
+void Level7Part16()//Great circles
+{
+ towcnt=0;clrtime=0;
+ frameleft=Infinity;All2pnt();
+ Circles[0].Init(444,20*pi/50000.0f,6,vector2d(400,300));
+ Circles[1].Init(444,-20*pi/50000.0f,6,vector2d(400,300));
+ CCnt=1;state=0;
+ DTCircle=0.0f;
+ ++part;playerpos.x=400,playerpos.y=300;
+}
+void Level7Part17()//Great circles-child1
+{
+ frameleft=Infinity;
+ DTCircle+=hge->Timer_GetDelta();
+ if (DTCircle>1&&CCnt<3)
+ {
+ Circles[2].Init(444,10*pi/50000.0f,12,vector2d(400,300));
+ Circles[3].Init(444,-10*pi/50000.0f,12,vector2d(400,300));
+ CCnt=3;
+ }
+ if (DTCircle>2&&CCnt<5)
+ {
+ Circles[4].Init(444,8*pi/50000.0f,18,vector2d(400,300));
+ Circles[5].Init(444,-8*pi/50000.0f,18,vector2d(400,300));
+ CCnt=5;
+ }
+ if (DTCircle>3&&CCnt<7)
+ {
+ Circles[6].Init(444,8*pi/50000.0f,27,vector2d(400,300));
+ Circles[7].Init(444,-8*pi/50000.0f,27,vector2d(400,300));
+ CCnt=7;
+ }
+ if (DTCircle>4&&CCnt<9)
+ {
+ Circles[8].Init(444,6*pi/50000.0f,45,vector2d(400,300));
+ Circles[9].Init(444,-6*pi/50000.0f,45,vector2d(400,300));
+ CCnt=9;
+ }
+ if (DTCircle>5&&CCnt<11)
+ {
+ Circles[10].Init(444,6*pi/50000.0f,60,vector2d(400,300));
+ Circles[11].Init(444,-6*pi/50000.0f,60,vector2d(400,300));
+ CCnt=11;
+ }
+ if (DTCircle>5&&CCnt<13)
+ {
+ Circles[12].Init(444,3*pi/50000.0f,96,vector2d(400,300));
+ Circles[13].Init(444,-3*pi/50000.0f,96,vector2d(400,300));
+ CCnt=13;
+ }
+ if (Circles[0].GetRange()>=50)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[0].SetRange(Circles[0].GetRange()-0.1),
+ Circles[1].SetRange(Circles[1].GetRange()-0.1);
+ }
+ if (Circles[2].GetRange()>=100&&CCnt>=3)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[2].SetRange(Circles[2].GetRange()-0.1),
+ Circles[3].SetRange(Circles[3].GetRange()-0.1);
+ }
+ if (Circles[4].GetRange()>=150&&CCnt>=5)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[4].SetRange(Circles[4].GetRange()-0.1),
+ Circles[5].SetRange(Circles[5].GetRange()-0.1);
+ }
+ if (Circles[6].GetRange()>=210&&CCnt>=7)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[6].SetRange(Circles[6].GetRange()-0.1),
+ Circles[7].SetRange(Circles[7].GetRange()-0.1);
+ }
+ if (Circles[8].GetRange()>=270&&CCnt>=9)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[8].SetRange(Circles[8].GetRange()-0.1),
+ Circles[9].SetRange(Circles[9].GetRange()-0.1);
+ }
+ if (Circles[10].GetRange()>=320&&CCnt>=11)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[10].SetRange(Circles[10].GetRange()-0.1),
+ Circles[11].SetRange(Circles[11].GetRange()-0.1);
+ }
+ if (Circles[12].GetRange()>=420&&CCnt>=13)
+ {
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ Circles[12].SetRange(Circles[12].GetRange()-0.1),
+ Circles[13].SetRange(Circles[13].GetRange()-0.1);
+ }
+ else
+ {
+ if (CCnt>=13)++part;
+ for (int i=1;i<=CCnt;++i)
+ Circles[i].SetDT(i*pi);
+ }
+ for (int i=0;i<=CCnt;++i)Circles[i].Update();
+ state=0;
+ towerspr[red]->RenderStretch(770,0,800,30);
+ towerspr[green]->RenderStretch(380,280,420,320);
+}
+void Level7Part18()//Great circles-child2
+{
+ if(state)
+ {
+ towerspr[green]->RenderStretch(770,0,800,30);
+ towerspr[red]->RenderStretch(380,280,420,320);
+ }
+ else
+ {
+ towerspr[red]->RenderStretch(770,0,800,30);
+ towerspr[green]->RenderStretch(380,280,420,320);
+ }
+ hgeRect col;
+ if (state)
+ {
+ col=hgeRect(380,280,420,320);
+ if (col.TestPoint(playerpos.x,playerpos.y))++part;
+ }
+ else
+ {
+ col=hgeRect(770,0,800,30);
+ if (col.TestPoint(playerpos.x,playerpos.y))state=1;
+ }
+ frameleft=Infinity;
+ for (int i=0;i<=CCnt;++i)
+ {
+ if (i==0||i==1)Circles[i].SetRange(50+10*sin(Circles[i].GetDT()));
+ if (i==2||i==3)Circles[i].SetRange(100+10*sin(Circles[i].GetDT()));
+ if (i==4||i==5)Circles[i].SetRange(150+10*sin(Circles[i].GetDT()));
+ if (i==6||i==7)Circles[i].SetRange(210+20*sin(Circles[i].GetDT()));
+ if (i==8||i==9)Circles[i].SetRange(270+20*sin(Circles[i].GetDT()));
+ if (i==10||i==11)Circles[i].SetRange(320+20*sin(Circles[i].GetDT()));
+ if (i==12||i==13)Circles[i].SetRange(420+30*sin(Circles[i].GetDT()));
+ Circles[i].Update();
+ }
+}
+BTail btails[50];
+void Level7Part19()
+{
+ frameleft=AMinute*2;clrtime=3;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Warning: Trypophobia caution ahead!");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=1.0f;avacurbrk=1.0f;memset(btails,0,sizeof(btails));
+ }
+}
+void Level7Part20()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk)
+ {
+ avacurbrk=0;avabrk=(frameleft/(double)(AMinute*2))*0.7+0.3;
+ for(int i=0;i<50;++i)
+ if(!btails[i].isActive())
+ {btails[i].Create();break;}
+ if(re.NextInt(0,24)==15)NewMultpo();
+ }
+ for(int i=0;i<50;++i)
+ if(btails[i].isActive())btails[i].Update();
+}
+int sttnt;
+void Level7Part21()
+{
+ frameleft=AMinute+ThirtySeconds;All2pnt();clrtime=1;
+ if (towcnt!=1&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ t8special=true;
+ sttnt=CreateTower8(400,300,2000,2,75,20);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ ++part;
+ return;
+ }
+}
+void Level7Part22()
+{
+ tower[sttnt].towertimer=(frameleft/(double)(AMinute+ThirtySeconds))*1250+750;
+}
+WOP wop[100];
+void Level7Part23()//Wave of Photon
+{
+ memset(bnl,0,sizeof(bnl));t8special=false;
+ frameleft=AMinute;All2pnt();towcnt=0;
+ ykbrk=0.5f;++part;clrtime=1;
+}
+void Level7Part24()
+{
+ ykbrk-=hge->Timer_GetDelta();
+ if (ykbrk<0&&frameleft>TenSeconds/10*3)
+ {
+ ykbrk=(double)frameleft/AMinute/2.0f+0.2f;
+ for (int i=0;i<100;++i)
+ if (!wop[i].active)
+ {
+ vector2d a,b;
+ if (re.NextInt(1,100)>=50)
+ {
+ if (re.NextInt(1,100)>=50)a=vector2d(re.NextDouble(10,790),610);else a=vector2d(re.NextDouble(10,790),-10);
+ }
+ else
+ {
+ if (re.NextInt(1,100)>=50)a=vector2d(-10,re.NextDouble(10,590));else a=vector2d(810,re.NextDouble(10,590));
+ }
+ if (re.NextInt(1,100)>=50)
+ {
+ if (re.NextInt(1,100)>=50)b=vector2d(re.NextDouble(10,790),610);else b=vector2d(re.NextDouble(10,790),-10);
+ }
+ else
+ {
+ if (re.NextInt(1,100)>=50)b=vector2d(-10,re.NextDouble(10,590));else b=vector2d(810,re.NextDouble(10,590));
+ }
+ if (re.NextInt(1,100)>=80)
+ {
+ vector2d d=playerpos-a;
+ b=playerpos;
+ while(b.x>-5&&b.x<805&&b.y>-5&&b.y<605)b=b+d;
+ }
+ wop[i].Init(a,b,1+(AMinute-frameleft)/(double)AMinute,0.02);
+ break;
+ }
+ }
+ for (int i=0;i<100;++i)
+ if (wop[i].active)wop[i].Update();
+}
+RTV rtv[100];
+void Level7Part25()
+{
+ frameleft=AMinute+ThirtySeconds;
+ All2pnt();towcnt=Lasercnt=0;
+ ++part;memset(rtv,0,sizeof(rtv));
+ avabrk=1;avacurbrk=0.7;clrtime=1;
+}
+void Level7Part26()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk&&frameleft>TenSeconds/3)
+ {
+ avacurbrk=0;avabrk=frameleft/(double)(AMinute+ThirtySeconds)*1.25+0.75;
+ for(int i=0;i<100;++i)if(!rtv[i].isActive())
+ {
+ int spinner=6;
+ if(frameleft<AMinute)spinner=8;
+ if(frameleft<ThirtySeconds)spinner=12;
+ if(re.NextInt(1,100)>=40)rtv[i].Init(1,(re.NextInt(0,1)?1:-1)*pi/123,spinner,(TColors)(re.NextInt(0,7)),re.NextInt(0,11));
+ else if(re.NextInt(0,1))
+ rtv[i].Init(2,(re.NextInt(0,1)?1:-1)*pi/60,spinner,(TColors)(re.NextInt(0,7)),re.NextInt(0,11));
+ else
+ rtv[i].Init(3,pi/48,spinner,(TColors)(re.NextInt(0,7)),re.NextInt(0,11));
+ break;
+ }
+ }
+ for(int i=0;i<100;++i)if(rtv[i].isActive())rtv[i].Update();
+}
+//Level-1 stats from here
+void Levelm1Part0()
+{
+ frameleft=50;All2pnt();towcnt=0;bgbrk=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ LE_Active=false;
+ Current_Position=2;
+ ShowTip("\
+Level -1-Over the Horizon\n\
+Level -1! Getting ready?\
+");
+ frameleft=TenSeconds;++part;
+ }
+}
+void Levelm1Part1()//3 circles
+{
+ frameleft=AMinute;clrtime=2;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("RGB...");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=1.0f;avacurbrk=0;tbrk=0;
+ }
+}
+void CircCreator(vector2d p,int cnt,TColors col)
+{
+ for (int i=0;i<cnt;++i)
+ {
+ int pnt=CreateBullet2(p.x,p.y,6,frameleft*pi/AMinute+i*(2*pi/cnt));
+ // ^
+ // Nowhere can be safe!
+ bullet[pnt].alterColor=col;
+ bullet[pnt].bulletaccel=-0.003;bullet[pnt].limv=((AMinute-frameleft)/(double)AMinute)+1.0f;
+ }
+}
+void Levelm1Part2()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ tbrk+=hge->Timer_GetDelta();
+ avabrk=(frameleft/(double)AMinute)*0.5f+0.5f;
+ if(tbrk>8)tbrk=0,NewMultpo(vector2d(400,300));
+ if(avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ CircCreator(vector2d(400,250),60,red);
+ CircCreator(vector2d(350,336.6),60,green);
+ CircCreator(vector2d(450,336.6),60,blue);
+ }
+}
+BCircle scircles[200];
+double rspd[200];
+void Levelm1Part3()//circles
+{
+ frameleft=AMinute;clrtime=1;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("??????");
+ }
+ if (Current_Position==1)
+ {
+ ++part;All2pnt();avabrk=1.0f;avacurbrk=1.0f;memset(scircles,0,sizeof(scircles));
+ }
+}
+void Levelm1Part4()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ avabrk=0.1+(frameleft/(double)AMinute)*0.4f;
+ if(avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ for(int i=0;i<200;++i)
+ {
+ if (scircles[i].GetRange()>510||scircles[i].GetRange()<1e-7)
+ {
+ scircles[i].Init(1,(re.NextInt(0,1)?1:-1)*(frameleft<TwentySeconds?0.0003:0.0002),36,vector2d(400,300),(TColors)re.NextInt(0,7),(TColors)re.NextInt(0,7));
+ rspd[i]=0.575+(frameleft/(double)AMinute)*0.1;break;
+ }
+ }
+ }
+ for(int i=0;i<200;++i)
+ {
+ if (scircles[i].GetRange()>1e-7&&scircles[i].GetRange()<510)
+ {
+ scircles[i].SetRange(scircles[i].GetRange()+(LOWFPS?17:1)*rspd[i]);
+ if (rspd[i]>0.002)rspd[i]-=0.0005*(LOWFPS?17:1);
+ if (rspd[i]<=0.002)rspd[i]=0.002;
+ scircles[i].Update();
+ }
+ }
+}
+void Levelm1Part5()//Spiky
+{
+ frameleft=AMinute+ThirtySeconds;
+ for(int i=0;i<200;++i)
+ if (scircles[i].GetRange()>1e-7&&scircles[i].GetRange()<510)
+ scircles[i].circ2pnt();
+ towcnt=0;clrtime=1;
+ Lasercnt=0;
+ ++part;avabrk=1;avacurbrk=0.5;
+}
+void Levelm1Part6()//Spiky-child
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;avabrk=frameleft/(double)(AMinute+ThirtySeconds)*0.4+0.1;
+ for (int i=0;i<1000;++i)
+ {
+ if (!noname[i].Exist())
+ {
+ if (frameleft<TenSeconds)
+ noname[i].Init(re.NextDouble(0,800),4,100,150,60,0x8033CCFF);
+ else if (frameleft<TwentySeconds)
+ noname[i].Init(re.NextDouble(0,800),4,100,150,65,0x8033CCFF);
+ else noname[i].Init(re.NextDouble(0,800),4,100,150,75,0x8033CCFF);
+ break;
+ }
+ }
+ if(re.NextInt(0,19)==8)NewMultpo();
+ }
+ for (int i=0;i<1000;++i)if (noname[i].Exist())noname[i].Process();
+}
+achromaGroup aca,acb;
+void Levelm1Part7()//Achromatopsia1
+{
+ frameleft=AMinute;for(int i=0;i<1000;++i)if(noname[i].Exist())noname[i].noname2pnt();
+ aca.Init(red,0.075);acb.Init(green,0.075);clrtime=1;
+ ++part;avabrk=2.0f;avacurbrk=0;achromab=false;
+}
+void Levelm1Part8()//Achromatopsia1-child
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;avabrk=2;
+ aca.Reverse();acb.Reverse();
+ if(re.NextInt(0,7)==3)NewMultpo(vector2d(re.NextInt(10,790),re.NextInt(500,590)));
+ }
+ aca.Update(1);acb.Update();
+}
+void Levelm1Part9()//Achromatopsia2
+{
+ frameleft=AMinute;clrtime=1;
+ aca.Init(red,1);acb.Init(green,1);
+ ++part;avabrk=1.5f;avacurbrk=0;achromab=true;
+}
+void Levelm1Part10()//Achromatopsia2-child
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ if (avacurbrk>avabrk)
+ {
+ avacurbrk=0;avabrk=2;
+ aca.Reverse();acb.Reverse();
+ }
+ aca.Update();acb.Update();
+}
+void Levelm1Part11()
+{
+ frameleft=AMinute+ThirtySeconds;clrtime=2;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("I've heard that all of you\n\
+support hyper-threading?");
+ return;
+ }
+ ++frameskips;
+ if(!PlayerSplit)playerpos=vector2d(200,150),PlayerSplit=true;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower8(400,300,857,3,57,20,false);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ {
+ aca.achroma2pnt();acb.achroma2pnt();
+ tower[i].RendColor=0x00FFFFFF;
+ }
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+void Levelm1Part12()
+{
+ frameleft=ThirtySeconds;if(tower[towcnt].towertype!=6)towcnt=0;
+ DisableAllTower=false;
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower6(400,300,2500,2,2000,3,12);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;BTarg.TargHide();
+ return;
+ }
+}
+int m19lead[10],m19gen[700];
+double m19rad;
+int m19step,m19cnt;
+bool m19pldir;
+void Levelm1Part13()//Gravity Vortex
+{
+ frameleft=AMinute*2;towcnt=0;PlayerSplit=false;
+ clrtime=2;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Who's collecting such great power here?");
+ return;
+ }
+ if (!LOWFPS)
+ DBGColor=ColorTransfer(DBGColor,0xFF000000);
+ else
+ for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFF000000);
+ if (DBGColor==0xFF000000)
+ {
+ All2pnt();memset(m19lead,0,sizeof(m19lead));
+ memset(m19gen,0,sizeof(m19gen));
+ ++part;m19rad=m19step=m19cnt=0;
+ avabrk=0.05;avacurbrk=0;
+ for(int i=0;i<8;++i)
+ {
+ m19lead[i]=CreateBullet2(400,300,0,0);
+ bullet[m19lead[i]].bulletpos=vector2d(400+250*cos(m19rad+i*pi/4),300+250*sin(m19rad+i*pi/4));
+ bullet[m19lead[i]].alterColor=(TColors)i;
+ bullet[m19lead[i]].inv=true;
+ }
+ m19pldir=false;BTarg.targpos=playerpos;
+ }
+}
+void Levelm1Part20update()
+{
+ if(!m19pldir)BTarg.TargGoto(vector2d(400,300)),playerpos=BTarg.targpos;
+ if(!m19pldir&&GetDist(playerpos,vector2d(400,300))<0.01)m19pldir=true;
+ for(int i=0;i<m19cnt;++i)
+ {
+ if(bullet[m19gen[i]].redattrib)
+ {
+ if(bullet[m19gen[i]].redattrib>1)
+ {
+ double r=re.NextDouble(0,75-50*(frameleft/(double)(AMinute*2))),theta=re.NextDouble(-pi,pi);
+ bullet[m19gen[i]].bulletpos=vector2d(400+r*cos(theta),300+r*sin(theta));
+ bullet[m19gen[i]].bulletspeed=0;
+ }
+ else
+ {
+ if(GetDist(bullet[m19gen[i]].bulletpos,vector2d(400,300))<4)
+ {
+ bullet[m19gen[i]].redattrib=2;
+ bullet[m19gen[i]].setdir(re.NextDouble(-pi,pi));
+ bullet[m19gen[i]].bulletaccel=0.0015;
+ bullet[m19gen[i]].limv=re.NextDouble(1,8-2*(frameleft/(double)(AMinute*2)));
+ }
+ }
+ }
+ }
+}
+void Levelm1Part14()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ m19rad+=pi/(5400.0f+1800.0f*(frameleft/(double)(AMinute*2)))*(1000.0f/hge->Timer_GetFPS());
+ for(int i=0;i<8;++i)bullet[m19lead[i]].bulletpos=vector2d(400+250*cos(m19rad+i*pi/4),300+250*sin(m19rad+i*pi/4));
+ switch(m19step)
+ {
+ case 0:
+ if(avacurbrk>avabrk)
+ {
+ for(int i=0;i<8;++i)
+ {
+ m19gen[m19cnt]=CreateBullet2(bullet[m19lead[i]].bulletpos.x,bullet[m19lead[i]].bulletpos.y,0,0);
+ bullet[m19gen[m19cnt]].redir(vector2d(400,300));
+ bullet[m19gen[m19cnt]].alterColor=(TColors)i;
+ bullet[m19gen[m19cnt]].bulletaccel=0.002;
+ bullet[m19gen[m19cnt]].limv=3;
+ bullet[m19gen[m19cnt]].whirem=1000;
+ bullet[m19gen[m19cnt]].addblend=true;
+ bullet[m19gen[m19cnt++]].redattrib=re.NextInt(0,3)?0:1;
+ }
+ if(m19cnt/8>80-50*(frameleft/(double)(AMinute*2)))m19step=1,avabrk=3,tbrk=0;
+ avacurbrk=0;
+ }
+ Levelm1Part20update();
+ break;
+ case 1:
+ if(avacurbrk>avabrk)
+ {
+ m19step=0;avabrk=0.05;memset(m19gen,0,sizeof(m19gen));m19cnt=0;
+ }
+ tbrk+=hge->Timer_GetDelta();
+ if(tbrk>0.05)
+ {
+ tbrk=0;
+ for(int i=0;i<8;++i)
+ {
+ int pnt=CreateBullet2(bullet[m19lead[i]].bulletpos.x,bullet[m19lead[i]].bulletpos.y,0,0);
+ bullet[pnt].redir(vector2d(400,300));
+ bullet[pnt].alterColor=(TColors)i;
+ bullet[pnt].bulletdir.x=-bullet[pnt].bulletdir.x;
+ bullet[pnt].bulletdir.y=-bullet[pnt].bulletdir.y;
+ bullet[pnt].bulletaccel=0.002;bullet[pnt].limv=2;
+ bullet[pnt].whirem=2500;bullet[pnt].addblend=true;
+ }
+ }
+ Levelm1Part20update();
+ break;
+ }
+}
+vector2d snextarg;
+int snexcnt,snexstep;
+Target snexTarg;
+void Levelm1Part15()//"Supernova"
+{
+ frameleft=AMinute*2;clrtime=1;
+ ++bgbrk;if (LOWFPS)bgbrk+=16;
+ if (bgbrk<30)return;
+ bgbrk=0;towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Super...\n\
+...nova!!");
+ return;
+ }
+ if (Current_Position==1)
+ {
+ snexTarg.Init(0.001,vector2d(400,300));
+ All2pnt();
+ ++part;avabrk=12.0f;avacurbrk=0;tbrk=0;
+ snexstep=0;snexcnt=10;snexTarg.TargShow();
+ }
+}
+void snCircCreator(vector2d p,int cnt,TColors col,bool mode)
+{
+ if(mode)
+ for (int i=0;i<cnt;++i)
+ {
+ int pnt=CreateBullet2(p.x,p.y,6,acos((playerpos-vector2d(400,300))^vector2d(1,0))+(i-0.5f)*(2*pi/cnt));
+ bullet[pnt].redir(playerpos);bullet[pnt].bulletdir.Rotate((i+0.5f)*(2*pi/cnt));
+ bullet[pnt].alterColor=col;bullet[pnt].addblend=true;
+ }
+ else
+ for (int i=0;i<cnt;++i)
+ {
+ int pnt=CreateBullet2(p.x,p.y,2,acos((playerpos-vector2d(400,300))^vector2d(1,0))+i*(2*pi/cnt));
+ bullet[pnt].redir(playerpos);bullet[pnt].bulletdir.Rotate(i*(2*pi/cnt));
+ bullet[pnt].alterColor=col;bullet[pnt].addblend=true;
+ }
+}
+void Levelm1Part16()
+{
+ snexTarg.TargRender();
+ avacurbrk+=hge->Timer_GetDelta();
+ tbrk+=hge->Timer_GetDelta();
+ if((AMinute*2-frameleft)<TenSeconds)
+ {
+ if(tbrk>0.016&&(AMinute*2-frameleft)>TenSeconds/5)
+ {
+ tbrk=0;
+ snCircCreator(vector2d(400,300),144,(TColors)re.NextInt(0,7),true);
+ }
+ }
+ else
+ {
+ if(tbrk>0.5)
+ {
+ tbrk=0;
+ snCircCreator(vector2d(400,300),27,(TColors)re.NextInt(0,7),false);
+ }
+ }
+ switch (snexstep)
+ {
+ case 0:
+ if(avacurbrk>avabrk)snexstep=1,snextarg=playerpos;
+ break;
+ case 1:
+ snexTarg.TargGoto(snextarg);
+ if(GetDist(snexTarg.targpos,snextarg)<0.01)
+ {
+ snexstep=2;
+ avabrk=(frameleft/(double)(AMinute*2))*0.01666+0.01667;
+ avacurbrk=0;
+ snexcnt=40-(frameleft/(double)(AMinute*2))*20;
+ }
+ break;
+ case 2:
+ if(avacurbrk>avabrk)
+ {
+ if(--snexcnt>0)
+ {
+ avacurbrk=0;
+ for(int i=0;i<10;++i)
+ bullet[CreateBullet2(snexTarg.targpos.x,snexTarg.targpos.y,2,re.NextDouble(-pi,pi),true)].addblend=true;
+ }
+ else snexstep=0,avabrk=(frameleft/(double)(AMinute*2))*1+1.5f,avacurbrk=0;
+ }
+ break;
+ }
+}
+yellowGroup fyg[100];
+//Spinner fygs;
+void Levelm1Part17()
+{
+ frameleft=AMinute+ThirtySeconds;clrtime=2;
+ All2pnt();towcnt=0;memset(fyg,0,sizeof(fyg));
+ ++part;avabrk=1;avacurbrk=0.5;//fygs.Init(3,20);
+}
+void Levelm1Part18()
+{
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ for(int i=0;i<100;++i)
+ if(!fyg[i].isActive())
+ {
+ if(frameleft>AMinute)
+ fyg[i].Init(12,2.5-1.5*(frameleft/(double)(AMinute+ThirtySeconds)));
+ else
+ fyg[i].Init(36,2.5-1.5*(frameleft/(double)(AMinute+ThirtySeconds)));
+ break;
+ }
+ CircCreator(vector2d(400,300),36,blue);
+ }
+ for(int i=0;i<100;++i)if(fyg[i].isActive())fyg[i].Update();
+ //fygs.Update(pi/7200*(0.5+frameleft/(double)(AMinute+ThirtySeconds)));
+}
+int m17lead[4];
+void Levelm1Part19()
+{
+ frameleft=AMinute+ThirtySeconds;towcnt=0;clrtime=1;
+ All2pnt();memset(m17lead,0,sizeof(m17lead));
+ ++part;avabrk=0;
+ m17lead[0]=CreateBullet2(10,10,4,0);bullet[m17lead[0]].redir(vector2d(780,10));bullet[m17lead[0]].alterColor=red;
+ m17lead[1]=CreateBullet2(780,10,4,0);bullet[m17lead[1]].redir(vector2d(780,580));bullet[m17lead[1]].alterColor=green;
+ m17lead[2]=CreateBullet2(780,580,4,0);bullet[m17lead[2]].redir(vector2d(10,580));bullet[m17lead[2]].alterColor=dblue;
+ m17lead[3]=CreateBullet2(10,580,4,0);bullet[m17lead[3]].redir(vector2d(10,10));bullet[m17lead[3]].alterColor=white;
+ for(int i=0;i<4;++i)bullet[m17lead[i]].inv=true;snexTarg.Init(0.001,vector2d(400,300));
+ snexstep=0;snexTarg.TargShow();avabrk=5.0f;avacurbrk=0;tbrk=0;
+}
+void Levelm1Part20()
+{
+ snexTarg.TargRender();avacurbrk+=hge->Timer_GetDelta();
+ tbrk+=hge->Timer_GetDelta();avabrk+=hge->Timer_GetDelta();
+ if(avabrk>10)NewMultpo(),avabrk=0;
+ switch (snexstep)
+ {
+ case 0:
+ if(avacurbrk>avabrk)snexstep=1,snextarg=playerpos;
+ break;
+ case 1:
+ snexTarg.TargGoto(snextarg);
+ if(GetDist(snexTarg.targpos,snextarg)<0.01)
+ {
+ snexstep=0;
+ avabrk=(frameleft/(double)(AMinute*2))*3+2;
+ avacurbrk=0;
+ }
+ break;
+ }
+ if(bullet[m17lead[0]].bulletpos.x>780.01f)bullet[m17lead[0]].bulletpos=vector2d(780,10),bullet[m17lead[0]].redir(vector2d(780,580));
+ if(bullet[m17lead[0]].bulletpos.y>580.01f)bullet[m17lead[0]].bulletpos=vector2d(780,580),bullet[m17lead[0]].redir(vector2d(10,580));
+ if(bullet[m17lead[0]].bulletpos.x<9.99f)bullet[m17lead[0]].bulletpos=vector2d(10,580),bullet[m17lead[0]].redir(vector2d(10,10));
+ if(bullet[m17lead[0]].bulletpos.y<9.99f)bullet[m17lead[0]].bulletpos=vector2d(10,10),bullet[m17lead[0]].redir(vector2d(780,10));
+
+ if(bullet[m17lead[1]].bulletpos.x>780.01)bullet[m17lead[1]].bulletpos=vector2d(780,10),bullet[m17lead[1]].redir(vector2d(780,580));
+ if(bullet[m17lead[1]].bulletpos.y>580.01f)bullet[m17lead[1]].bulletpos=vector2d(780,580),bullet[m17lead[1]].redir(vector2d(10,580));
+ if(bullet[m17lead[1]].bulletpos.x<9.99f)bullet[m17lead[1]].bulletpos=vector2d(10,580),bullet[m17lead[1]].redir(vector2d(10,10));
+ if(bullet[m17lead[1]].bulletpos.y<9.99f)bullet[m17lead[1]].bulletpos=vector2d(10,10),bullet[m17lead[1]].redir(vector2d(780,10));
+
+ if(bullet[m17lead[2]].bulletpos.x>780.01f)bullet[m17lead[2]].bulletpos=vector2d(780,10),bullet[m17lead[2]].redir(vector2d(780,580));
+ if(bullet[m17lead[2]].bulletpos.y>580.01f)bullet[m17lead[2]].bulletpos=vector2d(780,580),bullet[m17lead[2]].redir(vector2d(10,580));
+ if(bullet[m17lead[2]].bulletpos.x<9.99f)bullet[m17lead[2]].bulletpos=vector2d(10,580),bullet[m17lead[2]].redir(vector2d(10,10));
+ if(bullet[m17lead[2]].bulletpos.y<9.99f)bullet[m17lead[2]].bulletpos=vector2d(10,10),bullet[m17lead[2]].redir(vector2d(780,10));
+
+ if(bullet[m17lead[3]].bulletpos.x>780.01f)bullet[m17lead[3]].bulletpos=vector2d(780,10),bullet[m17lead[3]].redir(vector2d(780,580));
+ if(bullet[m17lead[3]].bulletpos.y>580.01f)bullet[m17lead[3]].bulletpos=vector2d(780,580),bullet[m17lead[3]].redir(vector2d(10,580));
+ if(bullet[m17lead[3]].bulletpos.x<9.99f)bullet[m17lead[3]].bulletpos=vector2d(10,580),bullet[m17lead[3]].redir(vector2d(10,10));
+ if(bullet[m17lead[3]].bulletpos.y<9.99f)bullet[m17lead[3]].bulletpos=vector2d(10,10),bullet[m17lead[3]].redir(vector2d(780,10));
+ if(tbrk>0.02+(frameleft/(double)(AMinute+ThirtySeconds))*0.08)
+ {
+ for(int i=0;i<4;++i)
+ {
+ int pnt=CreateBullet2(bullet[m17lead[i]].bulletpos.x,bullet[m17lead[i]].bulletpos.y,0,0,true);
+ bullet[pnt].redir(snexTarg.targpos);
+ bullet[pnt].bulletaccel=0.002;bullet[pnt].limv=3;
+ bullet[pnt].whirem=1500-(frameleft/(double)(AMinute+ThirtySeconds))*500;
+ bullet[pnt].alterColor=i==0?red:i==1?green:i==2?dblue:white;
+ }
+ tbrk=0;
+ }
+}
+void Levelm1Part21()
+{
+ //some part of this level is in towernbullet...
+ frameleft=AMinute*1.5;clrtime=1;
+ if (towcnt!=4&&towcnt!=0)return ClearAll(false);
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Zzz...");
+ All2pnt();
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ CreateTower8(30,10,1500,3,20,30,false);
+ CreateTower8(746,10,1500,3,20,30,false);
+ CreateTower8(30,556,1500,3,20,30,false);
+ CreateTower8(746,556,1500,3,20,30,false);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ IfCallLevel=false;
+ return;
+ }
+}
+void Levelm2Part0()
+{
+ frameleft=10;All2pnt();towcnt=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("\
+Level -2-Assessments\n\
+Welcome to assessment mode!\n\
+You won't step to the next level until\n\
+you have a collision.\n\
+Good luck and go for the highest score!\
+");
+ }
+ if (Current_Position==1)
+ {
+ if((DBGColor=ColorTransfer(DBGColor,0xFF1B2065))!=0xFF1B2065)
+ DBGColor=ColorTransfer(DBGColor,0xFF1B2065),frameleft=10;
+ else{++part;IfShowTip=true;bulcnt=0;return;}
+ }
+}
+Tower* dbtows[200];
+double dbroll[10];
+void Levelm2Part1()
+{
+ frameleft=Infinity;tbrk=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 1 - Directed bullet");
+ return;
+ }
+ for(int i=0;i<5;++i)
+ {
+ dbroll[i]=-i*120-20;
+ for(int j=0;j<20;++j)
+ dbtows[i*20+j]=&tower[CreateTower1(j*40+10,dbroll[i],4000,4)];
+ }
+ ++part;
+}
+void Levelm2Part2()
+{
+ frameleft=Infinity;
+ tbrk+=hge->Timer_GetDelta();
+ for(int i=0;i<5;++i)
+ {
+ dbroll[i]+=0.05*(1000.0f/hge->Timer_GetFPS());
+ if(dbroll[i]>600)dbroll[i]=-20;
+ for(int j=0;j<20;++j)
+ {
+ dbtows[i*20+j]->towerpos=vector2d(j*40+10,dbroll[i]);
+ if(tbrk>0.033&&dbtows[i*20+j]->towertimer>2000)dbtows[i*20+j]->towertimer-=2;
+ }
+ }
+ if(tbrk>0.033)tbrk=0;
+}
+void Levelm2Part3()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 2 - Random bullets");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=1&&towcnt!=0)return ClearAll(false);
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ CreateTower2(400,300,999999999,0);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else
+ {
+ ++part;assetime=tbrk=0;
+ return;
+ }
+}
+int rcnt;
+void Levelm2Part4()
+{
+ frameleft=Infinity;
+ tbrk-=hge->Timer_GetDelta();
+ if(tbrk<0)
+ {
+ tbrk=0.5;
+ if(assetime>=5)tbrk=re.NextDouble(0.25,0.5);
+ if(assetime>=10)tbrk=re.NextDouble(0.1,0.2);
+ if(assetime>=20)tbrk=re.NextDouble(0.05,0.08);
+ if(assetime>=30)tbrk=re.NextDouble(0.02,0.035);
+ if(assetime>=60)tbrk=0.02;if(assetime>=90)tbrk=0.01;
+ if(assetime<90)rcnt=1;if(assetime>=90)rcnt=2;
+ if(assetime>=120)rcnt=4;if(assetime>=150)rcnt=8;
+ if(assetime>=180)rcnt=16;
+ double rspeed=re.NextDouble(0.5+3*assetime/180.0f,1+9*assetime/180.0f);
+ for(int i=0;i<rcnt;++i)
+ CreateBullet2(400,300,rspeed,re.NextDouble(-pi,pi));
+ }
+}
+
+expSpinner es;
+void Levelm2Part5()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 3 - Constant patterns");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ if(Current_Position==1)
+ {
+ ++part;avabrk=0;avacurbrk=0;
+ }
+}
+void Levelm2Part6()
+{
+ frameleft=Infinity;
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk)
+ {
+ avacurbrk=0;
+ avabrk=6-2*assetime/120.0f;
+ if(avabrk<3)avabrk=1;
+ es.Init(3+5*assetime/120.0f,10,re.NextInt(-pi,pi));
+ }
+ if(es.isActive())es.Update();
+}
+
+BCircle asscircles[200];
+void Levelm2Part7()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 4 - Crossing 1");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ if(Current_Position==1)
+ {
+ memset(asscircles,0,sizeof(asscircles));
+ ++part;avabrk=0;avacurbrk=0;
+ }
+}
+void Levelm2Part8()
+{
+ frameleft=Infinity;
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk)
+ {
+ shots=1;
+ for(int i=0;i<200;++i)
+ if (asscircles[i].GetRange()>800||asscircles[i].GetRange()<1e-7)
+ {
+ asscircles[i].Init(1,assetime/120.0f*0.00025,36,vector2d(250,300),blue);break;
+ }
+ for(int i=0;i<200;++i)
+ if (asscircles[i].GetRange()>800||asscircles[i].GetRange()<1e-7)
+ {
+ asscircles[i].Init(1,-assetime/120.0f*0.00025,36,vector2d(550,300),blue);break;
+ }
+ avacurbrk=0;
+ avabrk=3-assetime/60;
+ if(avabrk<0.5)avabrk=0.5;
+ }
+ for(int i=0;i<200;++i)
+ {
+ if (asscircles[i].GetRange()>1e-7&&asscircles[i].GetRange()<800)
+ {
+ asscircles[i].SetRange(asscircles[i].GetRange()+(LOWFPS?17:1)*0.05);
+ asscircles[i].Update();
+ }
+ }
+}
+void Levelm2Part9()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 5 - Crossing 2");
+ for(int i=0;i<200;++i)
+ if (asscircles[i].GetRange()>1e-7&&asscircles[i].GetRange()<800)
+ asscircles[i].circ2pnt();
+ return;
+ }
+ if(Current_Position==1)
+ {
+ memset(asscircles,0,sizeof(asscircles));
+ ++part;avabrk=0;avacurbrk=0;
+ }
+}
+void Levelm2Part10()
+{
+ frameleft=Infinity;
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk)
+ {
+ shots=1;
+ for(int i=0;i<200;++i)
+ if (asscircles[i].GetRange()>800||asscircles[i].GetRange()<1e-7)
+ {
+ asscircles[i].Init(1,0.0001,36+(24*assetime/120.0f),vector2d(400,300),blue);break;
+ }
+ for(int i=0;i<200;++i)
+ if (asscircles[i].GetRange()>800||asscircles[i].GetRange()<1e-7)
+ {
+ asscircles[i].Init(1,-0.0001,36+(24*assetime/120.0f),vector2d(400,300),blue);break;
+ }
+ avacurbrk=0;
+ avabrk=2-assetime/60;
+ if(avabrk<0.3)avabrk=0.3;
+ }
+ for(int i=0;i<200;++i)
+ {
+ if (asscircles[i].GetRange()>1e-7&&asscircles[i].GetRange()<800)
+ {
+ asscircles[i].SetRange(asscircles[i].GetRange()+(LOWFPS?17:1)*0.05);
+ asscircles[i].Update();
+ }
+ }
+}
+double assrad;
+SELineLaser trap[100];
+void Levelm2Part11()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 6 - Trappy");
+ for(int i=0;i<200;++i)
+ if (asscircles[i].GetRange()>1e-7&&asscircles[i].GetRange()<800)
+ asscircles[i].circ2pnt();
+ return;
+ }
+ if(Current_Position==1)
+ {
+ memset(asscircles,0,sizeof(asscircles));
+ ++part;avabrk=0;avacurbrk=0;tbrk=0;memset(trap,0,sizeof(trap));
+ }
+}
+void Levelm2Part12()
+{
+ frameleft=Infinity;
+ avacurbrk+=hge->Timer_GetDelta();
+ for(int i=0;i<100;++i)
+ if(trap[i].isActive())trap[i].Update();
+ if(avacurbrk>avabrk)
+ {
+ bool sh=re.NextInt(0,1);
+ for(int c=0;c<(assetime>30?(assetime-30)/30:1);++c,sh^=1)
+ for(int i=0;i<100;++i)
+ if(!trap[i].isActive())
+ {
+ if(sh)trap[i].Init(re.NextInt(10,590),1);
+ else trap[i].Init(re.NextInt(10,790),0);
+ break;
+ }
+ avacurbrk=0;
+ if(assetime<60)avabrk=3-2*assetime/60.0f;
+ else avabrk=2.5-(assetime-60)/120.0f;
+ }
+}
+double asssrd1;
+void Levelm2Part13()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 7 - Sine wave");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ if(Current_Position==1)
+ {
+ ++part;tbrk=asssrd1=avacurbrk=0;
+ }
+}
+void Levelm2Part14()
+{
+ frameleft=Infinity;
+ tbrk+=hge->Timer_GetDelta();
+ if(tbrk>0.075)
+ {
+ tbrk=0;
+ asssrd1+=pi/45;
+ //right
+ for(int i=0;i<5;++i)
+ CreateBullet2(810,120*(i+1)+120*sin(asssrd1),2,0,true);
+ //right2
+ if(assetime>15)
+ {
+ for(int i=0;i<5;++i)
+ CreateBullet2(810,120*(i+1)+120*sin(asssrd1+pi/12),2,0,true);
+ }
+ //left
+ if(assetime>30)
+ {
+ for(int i=0;i<5;++i)
+ CreateBullet2(-10,120*(i+1)+120*sin(asssrd1),2,pi,true);
+ }
+ //left2
+ if(assetime>45)
+ {
+ for(int i=0;i<5;++i)
+ CreateBullet2(-10,120*(i+1)+120*sin(asssrd1+pi/12),2,pi,true);
+ }
+ if(assetime>60)
+ {
+ avacurbrk-=hge->Timer_GetDelta();
+ if(avacurbrk<0)
+ {
+ CreateBullet1(0,0,3,0);CreateBullet1(800,0,3,0);
+ CreateBullet1(0,600,3,0);CreateBullet1(800,600,3,0);
+ avacurbrk=0.5-0.3*(assetime-60.0f)/60.0f;
+ if(avacurbrk<0.1)avacurbrk=0.1;
+ }
+ }
+ }
+}
+int resvpos,rpbcnt;
+double delx;
+void Levelm2Part15()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 8 - Density test");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ if(Current_Position==1)
+ {
+ ++part;tbrk=asssrd1=avacurbrk=0;resvpos=re.NextInt(0,49);rpbcnt=0;
+ }
+}
+void Levelm2Part16()
+{
+ frameleft=Infinity;
+ tbrk-=hge->Timer_GetDelta();
+ if(tbrk<0)
+ {
+ tbrk=0.1-0.05*(assetime/120.0f);if(tbrk<0.05)tbrk=0.05;
+ if(re.NextInt(0,100)==37&&!rpbcnt)
+ {
+ rpbcnt=6;int oldrp=resvpos;
+ for(resvpos=re.NextInt(0,49);abs(resvpos-oldrp)>20||abs(resvpos-oldrp)<5;resvpos=re.NextInt(0,49));
+ delx=re.NextDouble(300,650);
+ }
+ for(int i=0;i<50;++i)
+ {
+ if(abs(i-resvpos)>2)
+ {
+ int pnt=CreateBullet2(810,12*i,1+3*assetime/180.0f,0,true);
+ if(rpbcnt>0)bullet[pnt].limpos=vector2d(delx,12*i);
+ }
+ }
+ if(rpbcnt)--rpbcnt;
+ if(resvpos==0)resvpos+=re.NextInt(0,1);
+ else if(resvpos==49)resvpos+=re.NextInt(-1,0);
+ else resvpos+=re.NextInt(-1,1);
+ }
+}
+CPinBall pinballs[200];
+void Levelm2Part17()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 9 - Pinball");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ if(Current_Position==1)
+ {
+ ++part;tbrk=0;memset(pinballs,0,sizeof(pinballs));
+ }
+}
+void Levelm2Part18()
+{
+ frameleft=Infinity;
+ //Always clean up!
+ for(int i=0;i<200;++i)if(pinballs[i].Getlifetime()>5)pinballs[i].Kill();
+ tbrk-=hge->Timer_GetDelta();
+ if(tbrk<0)
+ {
+ tbrk=1.25-0.5*assetime/120.0f;if(tbrk<0.5)tbrk=0.5;
+ for(int i=0;i<200;++i)
+ if(pinballs[i].Getlifetime()==0)
+ {
+ int lay=4+4*assetime/120.0f;if(lay>8)lay=9;
+ lay=re.NextInt(3,lay);
+ vector2d pos;
+ while(1)
+ {
+ pos=vector2d(re.NextDouble(100,600),re.NextDouble(100,500));
+ bool place=(GetDist(pos,playerpos)>=100);
+ for(int j=0;j<200;++j)
+ if(pinballs[j].Getlifetime()>0&&j!=i)
+ if(GetDist(pinballs[j].Position(),pos)<pinballs[j].Radius()+lay*10.0)
+ {place=false;break;}
+ if(place)break;
+ }
+ pinballs[i].Init(pos,lay);
+ break;
+ }
+ }
+ for(int i=0;i<200;++i)
+ if(pinballs[i].Getlifetime()>0)
+ {
+ vector2d pos=pinballs[i].Position();
+ if(pos.x<pinballs[i].Radius()-5||pos.x>790-pinballs[i].Radius())
+ pinballs[i].Delta().x=-pinballs[i].Delta().x,++pinballs[i].Getlifetime(),pinballs[i].UpdateDelta();
+ if(pos.y<pinballs[i].Radius()-5||pos.y>590-pinballs[i].Radius())
+ pinballs[i].Delta().y=-pinballs[i].Delta().y,++pinballs[i].Getlifetime(),pinballs[i].UpdateDelta();
+ for(int j=i+1;j<200;++j)
+ if(pinballs[j].Getlifetime()>0&&pinballs[j].Getlifetime()<=5)
+ if(GetDist(pinballs[j].Position(),pinballs[i].Position())<pinballs[j].Radius()+pinballs[i].Radius())
+ {
+ double sqrdis=sqr(GetDist(pinballs[j].Position(),pinballs[i].Position()));
+ vector2d colline(pinballs[j].Position().x-pinballs[i].Position().x,
+ pinballs[j].Position().y-pinballs[i].Position().y);
+ double vp=pinballs[i].Delta()|colline;
+ double wp=pinballs[j].Delta()|colline;
+ vector2d ddelta((wp-vp)*colline.x/sqrdis,(wp-vp)*colline.y/sqrdis);
+ pinballs[i].Delta().x+=ddelta.x;pinballs[i].Delta().y+=ddelta.y;
+ pinballs[j].Delta().x-=ddelta.x;pinballs[j].Delta().y-=ddelta.y;
+ //prevent them to stick together...
+ vector2d stkprv=0.05*(pinballs[j].Radius()/sqrt(sqrdis)-1)*colline;
+ pinballs[j].Position()=pinballs[j].Position()-stkprv;
+ pinballs[i].UpdateDelta();pinballs[j].UpdateDelta();
+ }
+ pinballs[i].Update();
+ }
+}
+void Levelm2Part19()
+{
+ frameleft=Infinity;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 10 - Road blocks");
+ All2pnt();
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ if(Current_Position==1)
+ {
+ ++part;tbrk=0;memset(pinballs,0,sizeof(pinballs));
+ }
+}
+void Levelm2Part20()
+{
+ frameleft=Infinity;
+ tbrk-=hge->Timer_GetDelta();
+ if(tbrk<0)
+ {
+ tbrk=2-1*(assetime/120.0f);if(tbrk<0.75)tbrk=0.75;
+ delx=re.NextDouble(350,700);
+ resvpos=re.NextInt(0,49);
+ for(int i=0;i<50;++i)
+ {
+ int pnt=CreateBullet2(810,12*i,1+2*assetime/180.0f,0,true);
+ if(abs(i-resvpos)<=3)bullet[pnt].limpos=vector2d(delx,12*i);
+ }
+ }
+}
+void Levelm2Part21()
+{
+ frameleft=Infinity;Dis8ref=true;tbrk=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 11 - Extreme speeds");
+ All2pnt();towcnt=0;
+ return;
+ }
+ ++frameskips;
+ if (frameskips<10&&!LOWFPS)return;
+ frameskips=0;
+ for (int i=1;i<=33;++i)CreateTower8(i*24-12,12,500,6,20,30);
+ for (int i=1;i<=towcnt;++i)
+ if (tower[i].RendColor==0x80FFFFFF)
+ tower[i].RendColor=0x00FFFFFF;
+ for (int i=1;i<=towcnt;++i)
+ if ((tower[i].RendColor>>24)<=0x80)
+ tower[i].RendColor=tower[i].RendColor+0x01FFFFFF;
+ else{++part;return;}
+}
+void Levelm2Part22()
+{
+ frameleft=Infinity;
+ double nspd=6+4*assetime/120.0f;if(nspd>10)nspd=10;
+ for(int i=1;i<=33;++i)tower[i].bulletspeed=nspd;
+ tbrk-=hge->Timer_GetDelta();
+ if (tbrk>0)return;
+ tbrk=3-2*(assetime/120.0f);
+ if(tbrk<0.5)tbrk=0.5;
+ for (int i=0;i<6;++i)
+ {
+ int p=CreateBullet2(playerpos.x+cos(i*pi/3.0f)*6,12+sin(i*pi/3.0f)*6,2,-pi/2);
+ bullet[p].alterColor=orange;
+ }
+}
+SimpLL SLL[200];
+void Levelm2Part23()
+{
+ frameleft=Infinity;Dis8ref=true;tbrk=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Test 12 - Messed up");
+ All2pnt();towcnt=0;
+ return;
+ }
+ if (towcnt!=0)return ClearAll(false);
+ ++part;tbrk=avacurbrk=avabrk=0;memset(SLL,0,sizeof(SLL));
+}
+void Levelm2Part24()
+{
+ frameleft=Infinity;
+ tbrk-=hge->Timer_GetDelta();
+ if(tbrk<0)
+ {
+ tbrk=3-2.5*(assetime/120.0f);
+ if(tbrk<0.5)tbrk=0.5;
+ /*int cnt=12+12*assetime/120.0f;
+ if(cnt>24)cnt=24;
+ for(int i=0;i<cnt;++i)
+ {
+ vector2d dir=vector2d(400-playerpos.x,300-playerpos.y);
+ dir.ToUnitCircle();dir=50*dir;dir.Rotate(i*2*pi/cnt);
+ int pnt=CreateBullet2(400+dir.x,300+dir.y,0,0,true);
+ bullet[pnt].limv=-2;bullet[pnt].bulletaccel=-0.001;bullet[pnt].whirem=500;
+ bullet[pnt].redir(vector2d(400,300));
+ }*/
+ }
+ avacurbrk+=hge->Timer_GetDelta();
+ if(avacurbrk>avabrk)
+ {
+ avacurbrk=0;avabrk=4-3*assetime/120.0f;if(avabrk<0.5)avabrk=0.5;
+ vector2d a,b;int cnt=re.NextInt(5,10);
+ for (int i=0;i<cnt;++i)
+ {
+ if (re.NextInt(1,100)>=50)
+ {
+ if (re.NextInt(1,100)>=50)a=vector2d(re.NextDouble(10,790),610);else a=vector2d(re.NextDouble(10,790),-10);
+ }
+ else
+ {
+ if (re.NextInt(1,100)>=50)a=vector2d(-10,re.NextDouble(10,590));else a=vector2d(810,re.NextDouble(10,590));
+ }
+ if (re.NextInt(1,100)>=50)
+ {
+ if (re.NextInt(1,100)>=50)b=vector2d(re.NextDouble(10,790),610);else b=vector2d(re.NextDouble(10,790),-10);
+ }
+ else
+ {
+ if (re.NextInt(1,100)>=50)b=vector2d(-10,re.NextDouble(10,590));else b=vector2d(810,re.NextDouble(10,590));
+ }
+ for(int i=0;i<200;++i)
+ if(!SLL[i].active)
+ {
+ SLL[i].InitLine(a,b,0.1,SETA(ColorToDWORD(blue),0x80));
+ SLL[i].active=true;SLL[i].stp=0;SLL[i].brk=0;SLL[i].EnableColl=false;
+ break;
+ }
+ }
+ }
+ for(int i=0;i<200;++i)
+ if(SLL[i].active)
+ {
+ SLL[i].Process();
+ SLL[i].brk+=hge->Timer_GetDelta();
+ if(SLL[i].stp==2)
+ if(SLL[i].brk>0.02)
+ {
+ SLL[i].SetWidth(SLL[i].GetWidth()-0.2);
+ if(SLL[i].GetWidth()<1)SLL[i].EnableColl=false;
+ if(SLL[i].GetWidth()<0.05)SLL[i].active=false;
+ SLL[i].brk=0;
+ }
+ if(SLL[i].stp==0)
+ if(SLL[i].brk>0.02)
+ {
+ SLL[i].SetWidth(SLL[i].GetWidth()+0.2);
+ if(SLL[i].GetWidth()>1)SLL[i].EnableColl=true;
+ if(SLL[i].GetWidth()>4)SLL[i].stp=1;
+ SLL[i].brk=0;
+ }
+ if(SLL[i].stp==1)
+ if(SLL[i].brk>5){SLL[i].brk=0;SLL[i].stp=2;}
+ }
+}
+void Levelm2Part25()
+{
+ frameleft=Infinity;Dis8ref=true;tbrk=0;
+ DisableAllTower=false;
+ if (IfShowTip)
+ {
+ IfShowTip=false;
+ FadeTip=false;
+ Current_Position=2;
+ ShowTip("Bonus test - Lunatic Lunar!");
+ All2pnt();towcnt=0;
+ for(int i=0;i<200;++i)if(SLL[i].active)SLL[i].llsrtopnt(10);
+ return;
+ }
+ ++part;tbrk=0;memset(SLL,0,sizeof(SLL));avabrk=1;
+}
+void Levelm2Part26()
+{
+ frameleft=Infinity;
+ tbrk-=hge->Timer_GetDelta();
+ if(tbrk<0)
+ {
+ tbrk=0.05;
+ int cnt=1;
+ if(!re.NextInt(0,19))avabrk=avabrk?0:1;
+ for(int i=0;i<cnt;++i)
+ {
+ if(avabrk)
+ {
+ int cc=assetime/120.0f*18+18;
+ vector2d centre(re.NextDouble(380,420),re.NextDouble(280,320));
+ double rnd=atan2(playerpos.y-centre.y,playerpos.x-centre.x),spd=assetime/120.0f*4+6;
+ if(re.NextInt(0,3))
+ rnd+=re.NextDouble(-assetime/120.0f*pi/24,assetime/120.0f*pi/24);
+ for(int i=0;i<cc;++i)
+ CreateBullet2(centre.x,centre.y,spd,i*2*pi/cc+rnd,false);
+ }
+ else
+ {
+ vector2d pos=vector2d(400+re.NextDouble(-20,20),300+re.NextDouble(-20,20));
+ double spd=assetime/120.0f*4+6;
+ int cc=assetime/120.0f*18+18;
+ double rnd=atan2(playerpos.y-pos.y,playerpos.x-pos.x);
+ if(re.NextInt(0,3))
+ rnd+=re.NextDouble(-assetime/120.0f*pi/24,assetime/120.0f*pi/24);
+ for(int i=0;i<cc;++i)
+ {
+ double dir=i*2*pi/cc+rnd,ran=re.NextDouble(-pi,pi);
+ for(int i=0;i<6;++i)
+ CreateBullet2(pos.x+6*sin(ran+i*(pi/3)),pos.y+6*cos(ran+i*(pi/3)),spd,dir,false);
+ CreateBullet2(pos.x,pos.y,spd,dir,false);
+ }
+ }
+ }
+ }
+}
diff --git a/archive/blr2/src/libcgh.h b/archive/blr2/src/libcgh.h
new file mode 100644
index 0000000..324ba42
--- /dev/null
+++ b/archive/blr2/src/libcgh.h
@@ -0,0 +1,140 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Chrisoft Game Helper header
+// Copyright Chrisoft 2014
+// libcgh version 0007
+// Last full compatible version 0007
+// ^Modify that when big change is made^
+#include <hge.h>
+#include <hgefont.h>
+#include <hgedistort.h>
+#include <hgecolor.h>
+#include <math.h>
+#ifndef libcgh_H
+#define libcgh_H
+#define pi 3.1415926535
+#define sqr(x) ((x)*(x))
+//static const char* LIBCGH_H_FN="libcgh.h";
+
+struct vector2d
+{
+ double x,y;
+ vector2d(double _x,double _y){x=_x;y=_y;}
+ vector2d(){x=y=0;}
+ double l(){return sqrt(sqr(x)+sqr(y));}
+ void ToUnitCircle(){double len=l();x/=len;y/=len;}
+ void Swap(){double t=x;x=y;y=t;}
+ void Rotate(double rad){double tx=x*cos(rad)+y*sin(rad),ty=y*cos(rad)-x*sin(rad);x=tx,y=ty;}
+ friend vector2d operator -(vector2d a,vector2d b)
+ {
+ return vector2d(a.x-b.x,a.y-b.y);
+ }
+ friend vector2d operator +(vector2d a,vector2d b)
+ {
+ return vector2d(a.x+b.x,a.y+b.y);
+ }
+ friend double operator |(vector2d a,vector2d b)//dot product
+ {
+ return a.x*b.x+a.y*b.y;
+ }
+ friend double operator *(vector2d a,vector2d b)//length of cross product
+ {
+ return a.x*b.y-b.x*a.y;
+ }
+ friend vector2d operator *(double a,vector2d b)
+ {
+ return vector2d(b.x*a,b.y*a);
+ }
+ friend double operator ^(vector2d a,vector2d b)//cosine of angle
+ {
+ return (a|b)/a.l()/b.l();
+ }
+};
+inline vector2d ToUnitCircle(vector2d input)
+{
+ vector2d res=input;
+ res.x=res.x/input.l();
+ res.y=res.y/input.l();
+ return res;
+}
+inline double GetDist(const vector2d a,const vector2d b)
+{
+ return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
+}
+inline double GetDistSeg(const vector2d a,const vector2d b,const vector2d c)
+{
+ double l2=GetDist(a,b)*GetDist(a,b);
+ if (l2==0.0)return GetDist(c,a);
+ double t=((c-a)|(b-a))/l2;
+ if (t<0)return GetDist(c,a);
+ else if (t>1)return GetDist(c,b);
+ vector2d projection=a+t*(b-a);
+ return GetDist(c,projection);
+}
+inline double normalizerad(double a)
+{
+ while (a<0)a+=2*pi;
+ while (a>2*pi)a-=2*pi;
+ return a;
+}
+struct TextureRect
+{
+ double x,y,w,h;
+ TextureRect(){}
+ TextureRect(double _x,double _y,double _w,double _h){x=_x,y=_y,w=_w,h=_h;}
+};
+class RandomEngine
+{
+private:
+ unsigned int cseed;
+public:
+ void SetSeed(unsigned int seed);
+ int NextInt(int min,int max);
+ double NextDouble(double min,double max);
+};
+class CircleIndicator
+{
+private:
+ hgeDistortionMesh *circle;
+ double value,radius,thk;
+ DWORD ccolour;
+ bool gradient;
+ BYTE alpha;
+public:
+ void Init(double _r,double _thk,BYTE _a,bool _gr,HTEXTURE _Texture,TextureRect _TR,DWORD _cc=0);
+ void SetAlpha(BYTE _alpha);
+ void SetValue(double _value);
+ void Render(double x,double y);
+};
+class LinearProgresser
+{
+private:
+ double a,b,val;
+ double Elapsed,Limit;
+public:
+ void Init(double _a,double _b,double _Lim);
+ void Launch();
+ void Update(double DT);
+ double GetA();
+ double GetB();
+ double GetValue();
+ double GetPercentage();
+ double GetDelta();
+ double GetElapsed();
+};
+class HangUpText
+{
+private:
+ hgeFont *TFont;
+ vector2d Position;
+ double Elapsed,Limit,dlim,delta;
+ BYTE alim,alpha;
+ char Text[255];
+ LinearProgresser Progresser,Progalpha;
+ bool done;
+public:
+ bool Active();
+ void Init(const char *Font,const char *_Text,double _tlim,double _alim,double _dlim,DWORD _color=0x00FFFFFF);
+ void Launch(vector2d pos);
+ void Process(double DT);
+};
+#endif
diff --git a/archive/blr2/src/libcghEx.cpp b/archive/blr2/src/libcghEx.cpp
new file mode 100644
index 0000000..a8fa698
--- /dev/null
+++ b/archive/blr2/src/libcghEx.cpp
@@ -0,0 +1,113 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Chrisoft Game Helper Extras implementations
+// Copyright Chrisoft 2014
+#include "libcgh.h"
+#include <cmath>
+#include <cstring>
+//static const char* LIBCGH_SRC_FN="libcghEx.cpp";
+
+void RandomEngine::SetSeed(unsigned int seed){cseed=seed;}
+int RandomEngine::NextInt(int min,int max)
+{
+ if (min>max){int t=min;min=max;max=t;}
+ cseed*=214013;cseed+=2531011;
+ return min+(cseed^cseed>>15)%(max-min+1);
+}
+double RandomEngine::NextDouble(double min,double max)
+{
+ if (min>max){double t=min;min=max;max=t;}
+ cseed*=214013;cseed+=2531011;
+ return min+(cseed>>16)*(1.0f/65535.0f)*(max-min);
+}
+void CircleIndicator::Init(double _r,double _thk,BYTE _a,bool _gr,HTEXTURE _Texture,TextureRect _TR,DWORD _cc)
+{
+ circle=new hgeDistortionMesh(1025,3);
+ circle->SetTexture(_Texture);
+ circle->SetTextureRect(_TR.x,_TR.y,_TR.w,_TR.h);
+ radius=_r;thk=_thk;gradient=_gr;alpha=_a;
+ if (_gr)ccolour=SETA(0x00FF0000,alpha);else ccolour=_cc;
+ for (int i=0;i<=1024;++i)
+ {
+ double tang,tx,ty;
+ tang=(double)i/1024.0f*pi*2-pi/2;
+ tx=-cos(tang)*radius;ty=sin(tang)*radius;
+ circle->SetDisplacement(i,2,tx,ty,HGEDISP_TOPLEFT);
+ tx*=thk;ty*=thk;
+ circle->SetDisplacement(i,1,tx,ty,HGEDISP_TOPLEFT);
+ tx*=thk;ty*=thk;
+ circle->SetDisplacement(i,0,tx,ty,HGEDISP_TOPLEFT);
+ }
+}
+void CircleIndicator::SetAlpha(BYTE _alpha){alpha=_alpha;}
+void CircleIndicator::SetValue(double _value)
+{
+ value=_value;
+ for (int i=0;i<=1024;++i)
+ {
+ int tr=(int)((1.0f-value)*255);
+ int tg=(int)(value*255);
+ DWORD tcolour=ARGB(alpha,tr,tg,0);
+ hgeColorHSV *tc=new hgeColorHSV(tcolour);
+ if (tc->v<0.85)tc->v=0.85;
+ if (gradient)tcolour=SETA(tc->GetHWColor(),alpha);else tcolour=SETA(ccolour,alpha);
+ if ((double)i/1024.0f<=value)
+ {
+ circle->SetColor(i,0,tcolour);
+ circle->SetColor(i,1,SETA(0x00FFFFFF,alpha));
+ circle->SetColor(i,2,tcolour);
+ }
+ else
+ {
+ circle->SetColor(i,0,0x00000000);
+ circle->SetColor(i,1,0x00000000);
+ circle->SetColor(i,2,0x00000000);
+ }
+ delete tc;
+ }
+}
+void CircleIndicator::Render(double x,double y){circle->Render(x,y);}
+
+void LinearProgresser::Init(double _a,double _b,double _Lim){a=_a,b=_b,Limit=_Lim;}
+void LinearProgresser::Launch(){Elapsed=0;val=a;}
+void LinearProgresser::Update(double DT){if (Elapsed+DT>=Limit)return (void)(val=b,Elapsed=Limit);Elapsed+=DT;val=(b-a)*(Elapsed/Limit)+a;}
+double LinearProgresser::GetValue(){return val;}
+double LinearProgresser::GetA(){return a;}
+double LinearProgresser::GetB(){return b;}
+double LinearProgresser::GetPercentage(){return (Elapsed/Limit);}
+double LinearProgresser::GetDelta(){return val-a;}
+double LinearProgresser::GetElapsed(){return Elapsed;}
+
+bool HangUpText::Active(){return TFont&&!done;}
+void HangUpText::Init(const char *Font,const char *_Text,double _tlim,double _alim,double _dlim,DWORD _color)
+{
+ TFont=new hgeFont(Font);
+ TFont->SetScale(0.8);
+ strcpy(Text,_Text);
+ Limit=_tlim;alim=_alim;dlim=_dlim;TFont->SetColor(_color);
+ Progresser.Init(0,dlim,Limit);Progalpha.Init(0,255,Limit/2);
+}
+void HangUpText::Launch(vector2d pos)
+{
+ Position=pos;Elapsed=0;delta=0;Progresser.Launch();Progalpha.Launch();done=false;
+}
+void HangUpText::Process(double DT)
+{
+ Progresser.Update(DT);
+ Position.y-=delta;
+ delta=Progresser.GetDelta();
+ Position.y+=delta;
+ if (Progresser.GetElapsed()>Limit/2&&Progalpha.GetA()<Progalpha.GetB())
+ {
+ Progalpha.Init(255,0,Limit/2);
+ Progalpha.Launch();
+ }
+ if (Progalpha.GetA()>Progalpha.GetB()&&Progresser.GetElapsed()>=Limit)
+ {
+ delete TFont;TFont=0;
+ return (void)(done=true);
+ }
+ Progalpha.Update(DT);
+ if(!TFont)return;
+ TFont->SetColor(SETA(TFont->GetColor(),Progalpha.GetValue()));
+ TFont->printf(Position.x,Position.y,HGETEXT_CENTER,Text);
+}
diff --git a/archive/blr2/src/loading.h b/archive/blr2/src/loading.h
new file mode 100644
index 0000000..acf59aa
--- /dev/null
+++ b/archive/blr2/src/loading.h
@@ -0,0 +1,384 @@
+unsigned char Loading[]=
+{0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x60,
+0x00,0x00,0x00,0x20,0x08,0x06,0x00,0x00,0x00,0xED,0xC0,0x7D,0x54,0x00,0x00,0x00,0x09,0x70,0x48,
+0x59,0x73,0x00,0x00,0x0B,0x13,0x00,0x00,0x0B,0x13,0x01,0x00,0x9A,0x9C,0x18,0x00,0x00,0x0A,0x4D,
+0x69,0x43,0x43,0x50,0x50,0x68,0x6F,0x74,0x6F,0x73,0x68,0x6F,0x70,0x20,0x49,0x43,0x43,0x20,0x70,
+0x72,0x6F,0x66,0x69,0x6C,0x65,0x00,0x00,0x78,0xDA,0x9D,0x53,0x77,0x58,0x93,0xF7,0x16,0x3E,0xDF,
+0xF7,0x65,0x0F,0x56,0x42,0xD8,0xF0,0xB1,0x97,0x6C,0x81,0x00,0x22,0x23,0xAC,0x08,0xC8,0x10,0x59,
+0xA2,0x10,0x92,0x00,0x61,0x84,0x10,0x12,0x40,0xC5,0x85,0x88,0x0A,0x56,0x14,0x15,0x11,0x9C,0x48,
+0x55,0xC4,0x82,0xD5,0x0A,0x48,0x9D,0x88,0xE2,0xA0,0x28,0xB8,0x67,0x41,0x8A,0x88,0x5A,0x8B,0x55,
+0x5C,0x38,0xEE,0x1F,0xDC,0xA7,0xB5,0x7D,0x7A,0xEF,0xED,0xED,0xFB,0xD7,0xFB,0xBC,0xE7,0x9C,0xE7,
+0xFC,0xCE,0x79,0xCF,0x0F,0x80,0x11,0x12,0x26,0x91,0xE6,0xA2,0x6A,0x00,0x39,0x52,0x85,0x3C,0x3A,
+0xD8,0x1F,0x8F,0x4F,0x48,0xC4,0xC9,0xBD,0x80,0x02,0x15,0x48,0xE0,0x04,0x20,0x10,0xE6,0xCB,0xC2,
+0x67,0x05,0xC5,0x00,0x00,0xF0,0x03,0x79,0x78,0x7E,0x74,0xB0,0x3F,0xFC,0x01,0xAF,0x6F,0x00,0x02,
+0x00,0x70,0xD5,0x2E,0x24,0x12,0xC7,0xE1,0xFF,0x83,0xBA,0x50,0x26,0x57,0x00,0x20,0x91,0x00,0xE0,
+0x22,0x12,0xE7,0x0B,0x01,0x90,0x52,0x00,0xC8,0x2E,0x54,0xC8,0x14,0x00,0xC8,0x18,0x00,0xB0,0x53,
+0xB3,0x64,0x0A,0x00,0x94,0x00,0x00,0x6C,0x79,0x7C,0x42,0x22,0x00,0xAA,0x0D,0x00,0xEC,0xF4,0x49,
+0x3E,0x05,0x00,0xD8,0xA9,0x93,0xDC,0x17,0x00,0xD8,0xA2,0x1C,0xA9,0x08,0x00,0x8D,0x01,0x00,0x99,
+0x28,0x47,0x24,0x02,0x40,0xBB,0x00,0x60,0x55,0x81,0x52,0x2C,0x02,0xC0,0xC2,0x00,0xA0,0xAC,0x40,
+0x22,0x2E,0x04,0xC0,0xAE,0x01,0x80,0x59,0xB6,0x32,0x47,0x02,0x80,0xBD,0x05,0x00,0x76,0x8E,0x58,
+0x90,0x0F,0x40,0x60,0x00,0x80,0x99,0x42,0x2C,0xCC,0x00,0x20,0x38,0x02,0x00,0x43,0x1E,0x13,0xCD,
+0x03,0x20,0x4C,0x03,0xA0,0x30,0xD2,0xBF,0xE0,0xA9,0x5F,0x70,0x85,0xB8,0x48,0x01,0x00,0xC0,0xCB,
+0x95,0xCD,0x97,0x4B,0xD2,0x33,0x14,0xB8,0x95,0xD0,0x1A,0x77,0xF2,0xF0,0xE0,0xE2,0x21,0xE2,0xC2,
+0x6C,0xB1,0x42,0x61,0x17,0x29,0x10,0x66,0x09,0xE4,0x22,0x9C,0x97,0x9B,0x23,0x13,0x48,0xE7,0x03,
+0x4C,0xCE,0x0C,0x00,0x00,0x1A,0xF9,0xD1,0xC1,0xFE,0x38,0x3F,0x90,0xE7,0xE6,0xE4,0xE1,0xE6,0x66,
+0xE7,0x6C,0xEF,0xF4,0xC5,0xA2,0xFE,0x6B,0xF0,0x6F,0x22,0x3E,0x21,0xF1,0xDF,0xFE,0xBC,0x8C,0x02,
+0x04,0x00,0x10,0x4E,0xCF,0xEF,0xDA,0x5F,0xE5,0xE5,0xD6,0x03,0x70,0xC7,0x01,0xB0,0x75,0xBF,0x6B,
+0xA9,0x5B,0x00,0xDA,0x56,0x00,0x68,0xDF,0xF9,0x5D,0x33,0xDB,0x09,0xA0,0x5A,0x0A,0xD0,0x7A,0xF9,
+0x8B,0x79,0x38,0xFC,0x40,0x1E,0x9E,0xA1,0x50,0xC8,0x3C,0x1D,0x1C,0x0A,0x0B,0x0B,0xED,0x25,0x62,
+0xA1,0xBD,0x30,0xE3,0x8B,0x3E,0xFF,0x33,0xE1,0x6F,0xE0,0x8B,0x7E,0xF6,0xFC,0x40,0x1E,0xFE,0xDB,
+0x7A,0xF0,0x00,0x71,0x9A,0x40,0x99,0xAD,0xC0,0xA3,0x83,0xFD,0x71,0x61,0x6E,0x76,0xAE,0x52,0x8E,
+0xE7,0xCB,0x04,0x42,0x31,0x6E,0xF7,0xE7,0x23,0xFE,0xC7,0x85,0x7F,0xFD,0x8E,0x29,0xD1,0xE2,0x34,
+0xB1,0x5C,0x2C,0x15,0x8A,0xF1,0x58,0x89,0xB8,0x50,0x22,0x4D,0xC7,0x79,0xB9,0x52,0x91,0x44,0x21,
+0xC9,0x95,0xE2,0x12,0xE9,0x7F,0x32,0xF1,0x1F,0x96,0xFD,0x09,0x93,0x77,0x0D,0x00,0xAC,0x86,0x4F,
+0xC0,0x4E,0xB6,0x07,0xB5,0xCB,0x6C,0xC0,0x7E,0xEE,0x01,0x02,0x8B,0x0E,0x58,0xD2,0x76,0x00,0x40,
+0x7E,0xF3,0x2D,0x8C,0x1A,0x0B,0x91,0x00,0x10,0x67,0x34,0x32,0x79,0xF7,0x00,0x00,0x93,0xBF,0xF9,
+0x8F,0x40,0x2B,0x01,0x00,0xCD,0x97,0xA4,0xE3,0x00,0x00,0xBC,0xE8,0x18,0x5C,0xA8,0x94,0x17,0x4C,
+0xC6,0x08,0x00,0x00,0x44,0xA0,0x81,0x2A,0xB0,0x41,0x07,0x0C,0xC1,0x14,0xAC,0xC0,0x0E,0x9C,0xC1,
+0x1D,0xBC,0xC0,0x17,0x02,0x61,0x06,0x44,0x40,0x0C,0x24,0xC0,0x3C,0x10,0x42,0x06,0xE4,0x80,0x1C,
+0x0A,0xA1,0x18,0x96,0x41,0x19,0x54,0xC0,0x3A,0xD8,0x04,0xB5,0xB0,0x03,0x1A,0xA0,0x11,0x9A,0xE1,
+0x10,0xB4,0xC1,0x31,0x38,0x0D,0xE7,0xE0,0x12,0x5C,0x81,0xEB,0x70,0x17,0x06,0x60,0x18,0x9E,0xC2,
+0x18,0xBC,0x86,0x09,0x04,0x41,0xC8,0x08,0x13,0x61,0x21,0x3A,0x88,0x11,0x62,0x8E,0xD8,0x22,0xCE,
+0x08,0x17,0x99,0x8E,0x04,0x22,0x61,0x48,0x34,0x92,0x80,0xA4,0x20,0xE9,0x88,0x14,0x51,0x22,0xC5,
+0xC8,0x72,0xA4,0x02,0xA9,0x42,0x6A,0x91,0x5D,0x48,0x23,0xF2,0x2D,0x72,0x14,0x39,0x8D,0x5C,0x40,
+0xFA,0x90,0xDB,0xC8,0x20,0x32,0x8A,0xFC,0x8A,0xBC,0x47,0x31,0x94,0x81,0xB2,0x51,0x03,0xD4,0x02,
+0x75,0x40,0xB9,0xA8,0x1F,0x1A,0x8A,0xC6,0xA0,0x73,0xD1,0x74,0x34,0x0F,0x5D,0x80,0x96,0xA2,0x6B,
+0xD1,0x1A,0xB4,0x1E,0x3D,0x80,0xB6,0xA2,0xA7,0xD1,0x4B,0xE8,0x75,0x74,0x00,0x7D,0x8A,0x8E,0x63,
+0x80,0xD1,0x31,0x0E,0x66,0x8C,0xD9,0x61,0x5C,0x8C,0x87,0x45,0x60,0x89,0x58,0x1A,0x26,0xC7,0x16,
+0x63,0xE5,0x58,0x35,0x56,0x8F,0x35,0x63,0x1D,0x58,0x37,0x76,0x15,0x1B,0xC0,0x9E,0x61,0xEF,0x08,
+0x24,0x02,0x8B,0x80,0x13,0xEC,0x08,0x5E,0x84,0x10,0xC2,0x6C,0x82,0x90,0x90,0x47,0x58,0x4C,0x58,
+0x43,0xA8,0x25,0xEC,0x23,0xB4,0x12,0xBA,0x08,0x57,0x09,0x83,0x84,0x31,0xC2,0x27,0x22,0x93,0xA8,
+0x4F,0xB4,0x25,0x7A,0x12,0xF9,0xC4,0x78,0x62,0x3A,0xB1,0x90,0x58,0x46,0xAC,0x26,0xEE,0x21,0x1E,
+0x21,0x9E,0x25,0x5E,0x27,0x0E,0x13,0x5F,0x93,0x48,0x24,0x0E,0xC9,0x92,0xE4,0x4E,0x0A,0x21,0x25,
+0x90,0x32,0x49,0x0B,0x49,0x6B,0x48,0xDB,0x48,0x2D,0xA4,0x53,0xA4,0x3E,0xD2,0x10,0x69,0x9C,0x4C,
+0x26,0xEB,0x90,0x6D,0xC9,0xDE,0xE4,0x08,0xB2,0x80,0xAC,0x20,0x97,0x91,0xB7,0x90,0x0F,0x90,0x4F,
+0x92,0xFB,0xC9,0xC3,0xE4,0xB7,0x14,0x3A,0xC5,0x88,0xE2,0x4C,0x09,0xA2,0x24,0x52,0xA4,0x94,0x12,
+0x4A,0x35,0x65,0x3F,0xE5,0x04,0xA5,0x9F,0x32,0x42,0x99,0xA0,0xAA,0x51,0xCD,0xA9,0x9E,0xD4,0x08,
+0xAA,0x88,0x3A,0x9F,0x5A,0x49,0x6D,0xA0,0x76,0x50,0x2F,0x53,0x87,0xA9,0x13,0x34,0x75,0x9A,0x25,
+0xCD,0x9B,0x16,0x43,0xCB,0xA4,0x2D,0xA3,0xD5,0xD0,0x9A,0x69,0x67,0x69,0xF7,0x68,0x2F,0xE9,0x74,
+0xBA,0x09,0xDD,0x83,0x1E,0x45,0x97,0xD0,0x97,0xD2,0x6B,0xE8,0x07,0xE9,0xE7,0xE9,0x83,0xF4,0x77,
+0x0C,0x0D,0x86,0x0D,0x83,0xC7,0x48,0x62,0x28,0x19,0x6B,0x19,0x7B,0x19,0xA7,0x18,0xB7,0x19,0x2F,
+0x99,0x4C,0xA6,0x05,0xD3,0x97,0x99,0xC8,0x54,0x30,0xD7,0x32,0x1B,0x99,0x67,0x98,0x0F,0x98,0x6F,
+0x55,0x58,0x2A,0xF6,0x2A,0x7C,0x15,0x91,0xCA,0x12,0x95,0x3A,0x95,0x56,0x95,0x7E,0x95,0xE7,0xAA,
+0x54,0x55,0x73,0x55,0x3F,0xD5,0x79,0xAA,0x0B,0x54,0xAB,0x55,0x0F,0xAB,0x5E,0x56,0x7D,0xA6,0x46,
+0x55,0xB3,0x50,0xE3,0xA9,0x09,0xD4,0x16,0xAB,0xD5,0xA9,0x1D,0x55,0xBB,0xA9,0x36,0xAE,0xCE,0x52,
+0x77,0x52,0x8F,0x50,0xCF,0x51,0x5F,0xA3,0xBE,0x5F,0xFD,0x82,0xFA,0x63,0x0D,0xB2,0x86,0x85,0x46,
+0xA0,0x86,0x48,0xA3,0x54,0x63,0xB7,0xC6,0x19,0x8D,0x21,0x16,0xC6,0x32,0x65,0xF1,0x58,0x42,0xD6,
+0x72,0x56,0x03,0xEB,0x2C,0x6B,0x98,0x4D,0x62,0x5B,0xB2,0xF9,0xEC,0x4C,0x76,0x05,0xFB,0x1B,0x76,
+0x2F,0x7B,0x4C,0x53,0x43,0x73,0xAA,0x66,0xAC,0x66,0x91,0x66,0x9D,0xE6,0x71,0xCD,0x01,0x0E,0xC6,
+0xB1,0xE0,0xF0,0x39,0xD9,0x9C,0x4A,0xCE,0x21,0xCE,0x0D,0xCE,0x7B,0x2D,0x03,0x2D,0x3F,0x2D,0xB1,
+0xD6,0x6A,0xAD,0x66,0xAD,0x7E,0xAD,0x37,0xDA,0x7A,0xDA,0xBE,0xDA,0x62,0xED,0x72,0xED,0x16,0xED,
+0xEB,0xDA,0xEF,0x75,0x70,0x9D,0x40,0x9D,0x2C,0x9D,0xF5,0x3A,0x6D,0x3A,0xF7,0x75,0x09,0xBA,0x36,
+0xBA,0x51,0xBA,0x85,0xBA,0xDB,0x75,0xCF,0xEA,0x3E,0xD3,0x63,0xEB,0x79,0xE9,0x09,0xF5,0xCA,0xF5,
+0x0E,0xE9,0xDD,0xD1,0x47,0xF5,0x6D,0xF4,0xA3,0xF5,0x17,0xEA,0xEF,0xD6,0xEF,0xD1,0x1F,0x37,0x30,
+0x34,0x08,0x36,0x90,0x19,0x6C,0x31,0x38,0x63,0xF0,0xCC,0x90,0x63,0xE8,0x6B,0x98,0x69,0xB8,0xD1,
+0xF0,0x84,0xE1,0xA8,0x11,0xCB,0x68,0xBA,0x91,0xC4,0x68,0xA3,0xD1,0x49,0xA3,0x27,0xB8,0x26,0xEE,
+0x87,0x67,0xE3,0x35,0x78,0x17,0x3E,0x66,0xAC,0x6F,0x1C,0x62,0xAC,0x34,0xDE,0x65,0xDC,0x6B,0x3C,
+0x61,0x62,0x69,0x32,0xDB,0xA4,0xC4,0xA4,0xC5,0xE4,0xBE,0x29,0xCD,0x94,0x6B,0x9A,0x66,0xBA,0xD1,
+0xB4,0xD3,0x74,0xCC,0xCC,0xC8,0x2C,0xDC,0xAC,0xD8,0xAC,0xC9,0xEC,0x8E,0x39,0xD5,0x9C,0x6B,0x9E,
+0x61,0xBE,0xD9,0xBC,0xDB,0xFC,0x8D,0x85,0xA5,0x45,0x9C,0xC5,0x4A,0x8B,0x36,0x8B,0xC7,0x96,0xDA,
+0x96,0x7C,0xCB,0x05,0x96,0x4D,0x96,0xF7,0xAC,0x98,0x56,0x3E,0x56,0x79,0x56,0xF5,0x56,0xD7,0xAC,
+0x49,0xD6,0x5C,0xEB,0x2C,0xEB,0x6D,0xD6,0x57,0x6C,0x50,0x1B,0x57,0x9B,0x0C,0x9B,0x3A,0x9B,0xCB,
+0xB6,0xA8,0xAD,0x9B,0xAD,0xC4,0x76,0x9B,0x6D,0xDF,0x14,0xE2,0x14,0x8F,0x29,0xD2,0x29,0xF5,0x53,
+0x6E,0xDA,0x31,0xEC,0xFC,0xEC,0x0A,0xEC,0x9A,0xEC,0x06,0xED,0x39,0xF6,0x61,0xF6,0x25,0xF6,0x6D,
+0xF6,0xCF,0x1D,0xCC,0x1C,0x12,0x1D,0xD6,0x3B,0x74,0x3B,0x7C,0x72,0x74,0x75,0xCC,0x76,0x6C,0x70,
+0xBC,0xEB,0xA4,0xE1,0x34,0xC3,0xA9,0xC4,0xA9,0xC3,0xE9,0x57,0x67,0x1B,0x67,0xA1,0x73,0x9D,0xF3,
+0x35,0x17,0xA6,0x4B,0x90,0xCB,0x12,0x97,0x76,0x97,0x17,0x53,0x6D,0xA7,0x8A,0xA7,0x6E,0x9F,0x7A,
+0xCB,0x95,0xE5,0x1A,0xEE,0xBA,0xD2,0xB5,0xD3,0xF5,0xA3,0x9B,0xBB,0x9B,0xDC,0xAD,0xD9,0x6D,0xD4,
+0xDD,0xCC,0x3D,0xC5,0x7D,0xAB,0xFB,0x4D,0x2E,0x9B,0x1B,0xC9,0x5D,0xC3,0x3D,0xEF,0x41,0xF4,0xF0,
+0xF7,0x58,0xE2,0x71,0xCC,0xE3,0x9D,0xA7,0x9B,0xA7,0xC2,0xF3,0x90,0xE7,0x2F,0x5E,0x76,0x5E,0x59,
+0x5E,0xFB,0xBD,0x1E,0x4F,0xB3,0x9C,0x26,0x9E,0xD6,0x30,0x6D,0xC8,0xDB,0xC4,0x5B,0xE0,0xBD,0xCB,
+0x7B,0x60,0x3A,0x3E,0x3D,0x65,0xFA,0xCE,0xE9,0x03,0x3E,0xC6,0x3E,0x02,0x9F,0x7A,0x9F,0x87,0xBE,
+0xA6,0xBE,0x22,0xDF,0x3D,0xBE,0x23,0x7E,0xD6,0x7E,0x99,0x7E,0x07,0xFC,0x9E,0xFB,0x3B,0xFA,0xCB,
+0xFD,0x8F,0xF8,0xBF,0xE1,0x79,0xF2,0x16,0xF1,0x4E,0x05,0x60,0x01,0xC1,0x01,0xE5,0x01,0xBD,0x81,
+0x1A,0x81,0xB3,0x03,0x6B,0x03,0x1F,0x04,0x99,0x04,0xA5,0x07,0x35,0x05,0x8D,0x05,0xBB,0x06,0x2F,
+0x0C,0x3E,0x15,0x42,0x0C,0x09,0x0D,0x59,0x1F,0x72,0x93,0x6F,0xC0,0x17,0xF2,0x1B,0xF9,0x63,0x33,
+0xDC,0x67,0x2C,0x9A,0xD1,0x15,0xCA,0x08,0x9D,0x15,0x5A,0x1B,0xFA,0x30,0xCC,0x26,0x4C,0x1E,0xD6,
+0x11,0x8E,0x86,0xCF,0x08,0xDF,0x10,0x7E,0x6F,0xA6,0xF9,0x4C,0xE9,0xCC,0xB6,0x08,0x88,0xE0,0x47,
+0x6C,0x88,0xB8,0x1F,0x69,0x19,0x99,0x17,0xF9,0x7D,0x14,0x29,0x2A,0x32,0xAA,0x2E,0xEA,0x51,0xB4,
+0x53,0x74,0x71,0x74,0xF7,0x2C,0xD6,0xAC,0xE4,0x59,0xFB,0x67,0xBD,0x8E,0xF1,0x8F,0xA9,0x8C,0xB9,
+0x3B,0xDB,0x6A,0xB6,0x72,0x76,0x67,0xAC,0x6A,0x6C,0x52,0x6C,0x63,0xEC,0x9B,0xB8,0x80,0xB8,0xAA,
+0xB8,0x81,0x78,0x87,0xF8,0x45,0xF1,0x97,0x12,0x74,0x13,0x24,0x09,0xED,0x89,0xE4,0xC4,0xD8,0xC4,
+0x3D,0x89,0xE3,0x73,0x02,0xE7,0x6C,0x9A,0x33,0x9C,0xE4,0x9A,0x54,0x96,0x74,0x63,0xAE,0xE5,0xDC,
+0xA2,0xB9,0x17,0xE6,0xE9,0xCE,0xCB,0x9E,0x77,0x3C,0x59,0x35,0x59,0x90,0x7C,0x38,0x85,0x98,0x12,
+0x97,0xB2,0x3F,0xE5,0x83,0x20,0x42,0x50,0x2F,0x18,0x4F,0xE5,0xA7,0x6E,0x4D,0x1D,0x13,0xF2,0x84,
+0x9B,0x85,0x4F,0x45,0xBE,0xA2,0x8D,0xA2,0x51,0xB1,0xB7,0xB8,0x4A,0x3C,0x92,0xE6,0x9D,0x56,0x95,
+0xF6,0x38,0xDD,0x3B,0x7D,0x43,0xFA,0x68,0x86,0x4F,0x46,0x75,0xC6,0x33,0x09,0x4F,0x52,0x2B,0x79,
+0x91,0x19,0x92,0xB9,0x23,0xF3,0x4D,0x56,0x44,0xD6,0xDE,0xAC,0xCF,0xD9,0x71,0xD9,0x2D,0x39,0x94,
+0x9C,0x94,0x9C,0xA3,0x52,0x0D,0x69,0x96,0xB4,0x2B,0xD7,0x30,0xB7,0x28,0xB7,0x4F,0x66,0x2B,0x2B,
+0x93,0x0D,0xE4,0x79,0xE6,0x6D,0xCA,0x1B,0x93,0x87,0xCA,0xF7,0xE4,0x23,0xF9,0x73,0xF3,0xDB,0x15,
+0x6C,0x85,0x4C,0xD1,0xA3,0xB4,0x52,0xAE,0x50,0x0E,0x16,0x4C,0x2F,0xA8,0x2B,0x78,0x5B,0x18,0x5B,
+0x78,0xB8,0x48,0xBD,0x48,0x5A,0xD4,0x33,0xDF,0x66,0xFE,0xEA,0xF9,0x23,0x0B,0x82,0x16,0x7C,0xBD,
+0x90,0xB0,0x50,0xB8,0xB0,0xB3,0xD8,0xB8,0x78,0x59,0xF1,0xE0,0x22,0xBF,0x45,0xBB,0x16,0x23,0x8B,
+0x53,0x17,0x77,0x2E,0x31,0x5D,0x52,0xBA,0x64,0x78,0x69,0xF0,0xD2,0x7D,0xCB,0x68,0xCB,0xB2,0x96,
+0xFD,0x50,0xE2,0x58,0x52,0x55,0xF2,0x6A,0x79,0xDC,0xF2,0x8E,0x52,0x83,0xD2,0xA5,0xA5,0x43,0x2B,
+0x82,0x57,0x34,0x95,0xA9,0x94,0xC9,0xCB,0x6E,0xAE,0xF4,0x5A,0xB9,0x63,0x15,0x61,0x95,0x64,0x55,
+0xEF,0x6A,0x97,0xD5,0x5B,0x56,0x7F,0x2A,0x17,0x95,0x5F,0xAC,0x70,0xAC,0xA8,0xAE,0xF8,0xB0,0x46,
+0xB8,0xE6,0xE2,0x57,0x4E,0x5F,0xD5,0x7C,0xF5,0x79,0x6D,0xDA,0xDA,0xDE,0x4A,0xB7,0xCA,0xED,0xEB,
+0x48,0xEB,0xA4,0xEB,0x6E,0xAC,0xF7,0x59,0xBF,0xAF,0x4A,0xBD,0x6A,0x41,0xD5,0xD0,0x86,0xF0,0x0D,
+0xAD,0x1B,0xF1,0x8D,0xE5,0x1B,0x5F,0x6D,0x4A,0xDE,0x74,0xA1,0x7A,0x6A,0xF5,0x8E,0xCD,0xB4,0xCD,
+0xCA,0xCD,0x03,0x35,0x61,0x35,0xED,0x5B,0xCC,0xB6,0xAC,0xDB,0xF2,0xA1,0x36,0xA3,0xF6,0x7A,0x9D,
+0x7F,0x5D,0xCB,0x56,0xFD,0xAD,0xAB,0xB7,0xBE,0xD9,0x26,0xDA,0xD6,0xBF,0xDD,0x77,0x7B,0xF3,0x0E,
+0x83,0x1D,0x15,0x3B,0xDE,0xEF,0x94,0xEC,0xBC,0xB5,0x2B,0x78,0x57,0x6B,0xBD,0x45,0x7D,0xF5,0x6E,
+0xD2,0xEE,0x82,0xDD,0x8F,0x1A,0x62,0x1B,0xBA,0xBF,0xE6,0x7E,0xDD,0xB8,0x47,0x77,0x4F,0xC5,0x9E,
+0x8F,0x7B,0xA5,0x7B,0x07,0xF6,0x45,0xEF,0xEB,0x6A,0x74,0x6F,0x6C,0xDC,0xAF,0xBF,0xBF,0xB2,0x09,
+0x6D,0x52,0x36,0x8D,0x1E,0x48,0x3A,0x70,0xE5,0x9B,0x80,0x6F,0xDA,0x9B,0xED,0x9A,0x77,0xB5,0x70,
+0x5A,0x2A,0x0E,0xC2,0x41,0xE5,0xC1,0x27,0xDF,0xA6,0x7C,0x7B,0xE3,0x50,0xE8,0xA1,0xCE,0xC3,0xDC,
+0xC3,0xCD,0xDF,0x99,0x7F,0xB7,0xF5,0x08,0xEB,0x48,0x79,0x2B,0xD2,0x3A,0xBF,0x75,0xAC,0x2D,0xA3,
+0x6D,0xA0,0x3D,0xA1,0xBD,0xEF,0xE8,0x8C,0xA3,0x9D,0x1D,0x5E,0x1D,0x47,0xBE,0xB7,0xFF,0x7E,0xEF,
+0x31,0xE3,0x63,0x75,0xC7,0x35,0x8F,0x57,0x9E,0xA0,0x9D,0x28,0x3D,0xF1,0xF9,0xE4,0x82,0x93,0xE3,
+0xA7,0x64,0xA7,0x9E,0x9D,0x4E,0x3F,0x3D,0xD4,0x99,0xDC,0x79,0xF7,0x4C,0xFC,0x99,0x6B,0x5D,0x51,
+0x5D,0xBD,0x67,0x43,0xCF,0x9E,0x3F,0x17,0x74,0xEE,0x4C,0xB7,0x5F,0xF7,0xC9,0xF3,0xDE,0xE7,0x8F,
+0x5D,0xF0,0xBC,0x70,0xF4,0x22,0xF7,0x62,0xDB,0x25,0xB7,0x4B,0xAD,0x3D,0xAE,0x3D,0x47,0x7E,0x70,
+0xFD,0xE1,0x48,0xAF,0x5B,0x6F,0xEB,0x65,0xF7,0xCB,0xED,0x57,0x3C,0xAE,0x74,0xF4,0x4D,0xEB,0x3B,
+0xD1,0xEF,0xD3,0x7F,0xFA,0x6A,0xC0,0xD5,0x73,0xD7,0xF8,0xD7,0x2E,0x5D,0x9F,0x79,0xBD,0xEF,0xC6,
+0xEC,0x1B,0xB7,0x6E,0x26,0xDD,0x1C,0xB8,0x25,0xBA,0xF5,0xF8,0x76,0xF6,0xED,0x17,0x77,0x0A,0xEE,
+0x4C,0xDC,0x5D,0x7A,0x8F,0x78,0xAF,0xFC,0xBE,0xDA,0xFD,0xEA,0x07,0xFA,0x0F,0xEA,0x7F,0xB4,0xFE,
+0xB1,0x65,0xC0,0x6D,0xE0,0xF8,0x60,0xC0,0x60,0xCF,0xC3,0x59,0x0F,0xEF,0x0E,0x09,0x87,0x9E,0xFE,
+0x94,0xFF,0xD3,0x87,0xE1,0xD2,0x47,0xCC,0x47,0xD5,0x23,0x46,0x23,0x8D,0x8F,0x9D,0x1F,0x1F,0x1B,
+0x0D,0x1A,0xBD,0xF2,0x64,0xCE,0x93,0xE1,0xA7,0xB2,0xA7,0x13,0xCF,0xCA,0x7E,0x56,0xFF,0x79,0xEB,
+0x73,0xAB,0xE7,0xDF,0xFD,0xE2,0xFB,0x4B,0xCF,0x58,0xFC,0xD8,0xF0,0x0B,0xF9,0x8B,0xCF,0xBF,0xAE,
+0x79,0xA9,0xF3,0x72,0xEF,0xAB,0xA9,0xAF,0x3A,0xC7,0x23,0xC7,0x1F,0xBC,0xCE,0x79,0x3D,0xF1,0xA6,
+0xFC,0xAD,0xCE,0xDB,0x7D,0xEF,0xB8,0xEF,0xBA,0xDF,0xC7,0xBD,0x1F,0x99,0x28,0xFC,0x40,0xFE,0x50,
+0xF3,0xD1,0xFA,0x63,0xC7,0xA7,0xD0,0x4F,0xF7,0x3E,0xE7,0x7C,0xFE,0xFC,0x2F,0xF7,0x84,0xF3,0xFB,
+0x25,0xD2,0x9F,0x33,0x00,0x00,0x00,0x20,0x63,0x48,0x52,0x4D,0x00,0x00,0x7A,0x25,0x00,0x00,0x80,
+0x83,0x00,0x00,0xF9,0xFF,0x00,0x00,0x80,0xE9,0x00,0x00,0x75,0x30,0x00,0x00,0xEA,0x60,0x00,0x00,
+0x3A,0x98,0x00,0x00,0x17,0x6F,0x92,0x5F,0xC5,0x46,0x00,0x00,0x03,0x40,0x49,0x44,0x41,0x54,0x78,
+0xDA,0xEC,0x5A,0xED,0x71,0xE2,0x40,0x0C,0x7D,0x64,0xEE,0x3F,0x7B,0x15,0x9C,0xAF,0x82,0x38,0x15,
+0x9C,0xA9,0xE0,0xA0,0x82,0x90,0x0A,0xC2,0x55,0x00,0x54,0xC0,0xA5,0x02,0xE8,0xC0,0x50,0x81,0x49,
+0x05,0x71,0x07,0xB8,0x03,0x7C,0x15,0xE8,0xFE,0x68,0x27,0x42,0xD1,0x62,0xC2,0x67,0x48,0xF6,0xCD,
+0x78,0x6C,0xCB,0xFB,0xA1,0x5D,0xAD,0xA4,0xB7,0x0B,0x2D,0x22,0x42,0xC4,0xE5,0x70,0x13,0xA7,0x20,
+0x1A,0x20,0x1A,0x20,0x22,0x1A,0x20,0x1A,0x20,0xE2,0x32,0xF8,0xC6,0x77,0x07,0x20,0xE5,0xE7,0x8A,
+0xAF,0x6B,0x80,0xD7,0x3B,0x05,0x50,0x03,0x98,0x5D,0xAB,0x07,0xA4,0x00,0x0A,0xBE,0xEE,0xAF,0x48,
+0x7F,0xAF,0xF7,0x44,0xE9,0xDD,0x07,0x30,0x60,0x03,0x5D,0x85,0x07,0x7C,0x26,0xF4,0x01,0x4C,0xF9,
+0xF9,0x16,0xC0,0x43,0xCC,0x01,0xE7,0x0F,0x4B,0xD6,0x73,0xF4,0x80,0x33,0xE1,0x2F,0xDF,0xDB,0x00,
+0x9E,0xBE,0x8A,0x01,0x64,0x12,0x5F,0x9E,0xA0,0xBC,0x47,0xC6,0xF7,0x92,0x93,0xAE,0x44,0x69,0x18,
+0x61,0x57,0x3D,0x6A,0x55,0x7F,0x17,0x7D,0x53,0x96,0x2F,0x0F,0x9A,0x39,0x22,0x02,0x11,0x65,0xF4,
+0x8A,0x21,0xCB,0x76,0xB9,0x52,0x22,0x2A,0xE8,0x2D,0xA6,0x44,0xE4,0x8C,0xF2,0x09,0x11,0xE5,0xAA,
+0xEC,0x9A,0x88,0x06,0xFC,0x7D,0x25,0xEA,0xFB,0x3A,0x8E,0x88,0x26,0x46,0x1F,0xC3,0x80,0xDE,0x21,
+0x59,0xC1,0x7D,0x65,0xDC,0xE6,0x54,0xB5,0xB7,0xE2,0xF1,0x40,0xF5,0x3D,0x35,0xF4,0xED,0xAA,0x71,
+0x67,0xEF,0x98,0xB3,0x8D,0xEB,0x10,0x0F,0xF0,0x0C,0xC4,0x05,0x12,0x61,0x0A,0xA0,0x23,0x56,0x6A,
+0x02,0xE0,0xC5,0x28,0xEF,0x98,0xC5,0xB4,0xB9,0x0C,0x14,0x0D,0x2E,0xC4,0xEA,0x93,0x18,0x35,0xAC,
+0x5A,0xDD,0x87,0xF7,0x9E,0x47,0x7E,0xD6,0x7A,0x24,0x00,0x72,0x00,0x3F,0x85,0x2C,0x17,0xF5,0x64,
+0x5B,0xF9,0xB1,0xA8,0xFA,0xCD,0x01,0x21,0x27,0xE7,0x7B,0xCD,0x4C,0xA3,0x05,0xE0,0x3B,0x4F,0x8C,
+0x37,0xD0,0x54,0xD4,0x99,0x8A,0x41,0xCF,0x79,0xA0,0x2D,0x36,0x52,0x29,0xEA,0x49,0x0C,0xC5,0xE4,
+0x97,0x5C,0xB6,0xC5,0x75,0xE7,0x01,0xC3,0x58,0x90,0xE1,0xAA,0xCB,0xEF,0x1D,0xD1,0xBF,0x5C,0x24,
+0xA9,0x58,0x44,0x32,0xE4,0xDD,0x71,0xF9,0x3B,0x7E,0x4F,0x8E,0x12,0xBC,0xF7,0x0C,0x41,0x7D,0x51,
+0xBE,0x6B,0x7C,0x97,0x21,0x23,0xE1,0x4B,0xBA,0xBA,0x15,0x9A,0xD6,0x86,0x4B,0xAF,0x55,0x3B,0xBA,
+0xDE,0x6A,0xC7,0x10,0x04,0xD5,0xBF,0xDB,0xA2,0xAF,0xEF,0xBB,0xD8,0xD2,0x77,0xA2,0xC2,0xD2,0xDE,
+0x21,0x68,0x5F,0x0F,0xF8,0x2D,0x42,0xC5,0xDC,0xF8,0xFE,0xA4,0x56,0x5C,0x57,0xBC,0x8F,0x8D,0xF2,
+0x56,0x3B,0xA9,0xF0,0x98,0x59,0xC0,0xE5,0xC7,0x7B,0xE8,0x5E,0x19,0x09,0xBC,0x6E,0x48,0xF8,0x95,
+0xD1,0x46,0xA9,0xDE,0xCF,0xCA,0x82,0x5C,0x43,0xC7,0x52,0xDE,0xDE,0xF2,0x6D,0x9B,0xDC,0xED,0x51,
+0xE7,0x14,0xA8,0x77,0x90,0x57,0xE7,0xCE,0x01,0x4D,0x1B,0x1D,0xF7,0x01,0xEA,0x1C,0x8A,0x4A,0x78,
+0x82,0xDB,0x92,0xD4,0x2F,0x92,0x84,0x17,0x22,0x4C,0x58,0x8A,0x3C,0xAA,0xB2,0xCF,0x81,0x6F,0x72,
+0x40,0x7D,0x25,0x5B,0x2A,0x56,0x65,0x4D,0xF6,0x29,0xCF,0xAD,0x64,0x48,0x9C,0x88,0xFE,0x3D,0x6B,
+0x3B,0xFB,0x51,0x84,0xB7,0x7A,0xC2,0x31,0xB9,0x16,0xCA,0x25,0x2A,0x76,0x0E,0xC4,0x24,0x96,0x7C,
+0xAF,0x8C,0xEF,0x72,0x40,0x72,0x82,0x7F,0x89,0xD8,0xAF,0x59,0x97,0xC7,0x40,0xE5,0x96,0x63,0x63,
+0x2C,0xC6,0xD8,0x07,0xB0,0x62,0x4A,0xBC,0x32,0x16,0x8B,0x64,0x7A,0x64,0xB0,0x3F,0x2D,0xDB,0xCA,
+0x82,0x9A,0x30,0x34,0x98,0x10,0x31,0x6B,0x78,0x51,0x1B,0x96,0x54,0x6D,0xDA,0xF4,0xC6,0xA7,0x10,
+0x4C,0x67,0x6D,0xF4,0xE1,0x94,0x7C,0xCD,0x75,0x56,0xA2,0x0D,0x52,0x9B,0xB7,0x26,0x16,0x54,0x18,
+0x6C,0x64,0x18,0x60,0x34,0xA9,0xEA,0xC3,0x23,0x57,0x63,0xB5,0xE6,0x30,0x0B,0xC8,0x0E,0x66,0x41,
+0xFF,0xC4,0xEA,0x7C,0x10,0xAB,0x24,0xC3,0xE6,0x6F,0x0A,0x1D,0xC5,0x14,0x4A,0x83,0x73,0xFB,0xF8,
+0x3A,0x02,0xD0,0x0B,0x24,0x3A,0xD9,0x8E,0xF6,0xC2,0x3F,0x6A,0x23,0x75,0x6C,0x94,0xBC,0xE7,0xE8,
+0xB1,0x8E,0x23,0xDE,0x07,0xF4,0x8C,0x5C,0x21,0xD9,0x55,0x8D,0xD7,0xDF,0x55,0xB4,0x6C,0x03,0x2D,
+0xFE,0x5B,0x8A,0xDB,0x71,0x53,0x93,0x70,0x6C,0xAC,0x8D,0xD0,0x74,0xCB,0xEF,0xCF,0x0D,0xE7,0x23,
+0x8E,0x43,0xC7,0x0F,0x36,0xE6,0x5C,0x85,0xA7,0x2A,0xC0,0x2A,0xBA,0xA2,0x8F,0x85,0x30,0x4A,0x26,
+0x06,0x58,0x22,0xFC,0xE3,0x92,0x2E,0xA7,0xC7,0x95,0x18,0xE7,0x4C,0x43,0x96,0x2F,0x78,0x4C,0x35,
+0xBF,0xDF,0x8B,0x8D,0xE3,0x4C,0x1C,0x79,0xA7,0x4C,0xD1,0xA5,0x7E,0x96,0xEC,0x8D,0x01,0x22,0x6C,
+0xE4,0x0D,0x79,0xA6,0x66,0x8F,0xB8,0x18,0x0D,0xFD,0xEC,0x18,0x07,0x36,0x9A,0x9E,0x60,0x74,0x0E,
+0xDD,0x8B,0x44,0x0F,0x78,0xFF,0x51,0x78,0xE8,0x38,0x3C,0x1A,0xE0,0x1A,0x11,0x43,0x50,0x34,0x40,
+0x34,0x40,0x44,0x34,0xC0,0xD7,0xC5,0xFF,0x01,0x00,0xCC,0x01,0x97,0x8B,0x00,0x58,0xE9,0x5F,0x00,
+0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82};
+unsigned char LoadCircle[]=
+{0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A,0x00,0x00,0x00,0x0D,0x49,0x48,0x44,0x52,0x00,0x00,0x00,0x30,
+0x00,0x00,0x00,0x2E,0x08,0x06,0x00,0x00,0x00,0x6E,0xDE,0x9A,0x6C,0x00,0x00,0x00,0x09,0x70,0x48,
+0x59,0x73,0x00,0x00,0x0B,0x13,0x00,0x00,0x0B,0x13,0x01,0x00,0x9A,0x9C,0x18,0x00,0x00,0x0A,0x4D,
+0x69,0x43,0x43,0x50,0x50,0x68,0x6F,0x74,0x6F,0x73,0x68,0x6F,0x70,0x20,0x49,0x43,0x43,0x20,0x70,
+0x72,0x6F,0x66,0x69,0x6C,0x65,0x00,0x00,0x78,0xDA,0x9D,0x53,0x77,0x58,0x93,0xF7,0x16,0x3E,0xDF,
+0xF7,0x65,0x0F,0x56,0x42,0xD8,0xF0,0xB1,0x97,0x6C,0x81,0x00,0x22,0x23,0xAC,0x08,0xC8,0x10,0x59,
+0xA2,0x10,0x92,0x00,0x61,0x84,0x10,0x12,0x40,0xC5,0x85,0x88,0x0A,0x56,0x14,0x15,0x11,0x9C,0x48,
+0x55,0xC4,0x82,0xD5,0x0A,0x48,0x9D,0x88,0xE2,0xA0,0x28,0xB8,0x67,0x41,0x8A,0x88,0x5A,0x8B,0x55,
+0x5C,0x38,0xEE,0x1F,0xDC,0xA7,0xB5,0x7D,0x7A,0xEF,0xED,0xED,0xFB,0xD7,0xFB,0xBC,0xE7,0x9C,0xE7,
+0xFC,0xCE,0x79,0xCF,0x0F,0x80,0x11,0x12,0x26,0x91,0xE6,0xA2,0x6A,0x00,0x39,0x52,0x85,0x3C,0x3A,
+0xD8,0x1F,0x8F,0x4F,0x48,0xC4,0xC9,0xBD,0x80,0x02,0x15,0x48,0xE0,0x04,0x20,0x10,0xE6,0xCB,0xC2,
+0x67,0x05,0xC5,0x00,0x00,0xF0,0x03,0x79,0x78,0x7E,0x74,0xB0,0x3F,0xFC,0x01,0xAF,0x6F,0x00,0x02,
+0x00,0x70,0xD5,0x2E,0x24,0x12,0xC7,0xE1,0xFF,0x83,0xBA,0x50,0x26,0x57,0x00,0x20,0x91,0x00,0xE0,
+0x22,0x12,0xE7,0x0B,0x01,0x90,0x52,0x00,0xC8,0x2E,0x54,0xC8,0x14,0x00,0xC8,0x18,0x00,0xB0,0x53,
+0xB3,0x64,0x0A,0x00,0x94,0x00,0x00,0x6C,0x79,0x7C,0x42,0x22,0x00,0xAA,0x0D,0x00,0xEC,0xF4,0x49,
+0x3E,0x05,0x00,0xD8,0xA9,0x93,0xDC,0x17,0x00,0xD8,0xA2,0x1C,0xA9,0x08,0x00,0x8D,0x01,0x00,0x99,
+0x28,0x47,0x24,0x02,0x40,0xBB,0x00,0x60,0x55,0x81,0x52,0x2C,0x02,0xC0,0xC2,0x00,0xA0,0xAC,0x40,
+0x22,0x2E,0x04,0xC0,0xAE,0x01,0x80,0x59,0xB6,0x32,0x47,0x02,0x80,0xBD,0x05,0x00,0x76,0x8E,0x58,
+0x90,0x0F,0x40,0x60,0x00,0x80,0x99,0x42,0x2C,0xCC,0x00,0x20,0x38,0x02,0x00,0x43,0x1E,0x13,0xCD,
+0x03,0x20,0x4C,0x03,0xA0,0x30,0xD2,0xBF,0xE0,0xA9,0x5F,0x70,0x85,0xB8,0x48,0x01,0x00,0xC0,0xCB,
+0x95,0xCD,0x97,0x4B,0xD2,0x33,0x14,0xB8,0x95,0xD0,0x1A,0x77,0xF2,0xF0,0xE0,0xE2,0x21,0xE2,0xC2,
+0x6C,0xB1,0x42,0x61,0x17,0x29,0x10,0x66,0x09,0xE4,0x22,0x9C,0x97,0x9B,0x23,0x13,0x48,0xE7,0x03,
+0x4C,0xCE,0x0C,0x00,0x00,0x1A,0xF9,0xD1,0xC1,0xFE,0x38,0x3F,0x90,0xE7,0xE6,0xE4,0xE1,0xE6,0x66,
+0xE7,0x6C,0xEF,0xF4,0xC5,0xA2,0xFE,0x6B,0xF0,0x6F,0x22,0x3E,0x21,0xF1,0xDF,0xFE,0xBC,0x8C,0x02,
+0x04,0x00,0x10,0x4E,0xCF,0xEF,0xDA,0x5F,0xE5,0xE5,0xD6,0x03,0x70,0xC7,0x01,0xB0,0x75,0xBF,0x6B,
+0xA9,0x5B,0x00,0xDA,0x56,0x00,0x68,0xDF,0xF9,0x5D,0x33,0xDB,0x09,0xA0,0x5A,0x0A,0xD0,0x7A,0xF9,
+0x8B,0x79,0x38,0xFC,0x40,0x1E,0x9E,0xA1,0x50,0xC8,0x3C,0x1D,0x1C,0x0A,0x0B,0x0B,0xED,0x25,0x62,
+0xA1,0xBD,0x30,0xE3,0x8B,0x3E,0xFF,0x33,0xE1,0x6F,0xE0,0x8B,0x7E,0xF6,0xFC,0x40,0x1E,0xFE,0xDB,
+0x7A,0xF0,0x00,0x71,0x9A,0x40,0x99,0xAD,0xC0,0xA3,0x83,0xFD,0x71,0x61,0x6E,0x76,0xAE,0x52,0x8E,
+0xE7,0xCB,0x04,0x42,0x31,0x6E,0xF7,0xE7,0x23,0xFE,0xC7,0x85,0x7F,0xFD,0x8E,0x29,0xD1,0xE2,0x34,
+0xB1,0x5C,0x2C,0x15,0x8A,0xF1,0x58,0x89,0xB8,0x50,0x22,0x4D,0xC7,0x79,0xB9,0x52,0x91,0x44,0x21,
+0xC9,0x95,0xE2,0x12,0xE9,0x7F,0x32,0xF1,0x1F,0x96,0xFD,0x09,0x93,0x77,0x0D,0x00,0xAC,0x86,0x4F,
+0xC0,0x4E,0xB6,0x07,0xB5,0xCB,0x6C,0xC0,0x7E,0xEE,0x01,0x02,0x8B,0x0E,0x58,0xD2,0x76,0x00,0x40,
+0x7E,0xF3,0x2D,0x8C,0x1A,0x0B,0x91,0x00,0x10,0x67,0x34,0x32,0x79,0xF7,0x00,0x00,0x93,0xBF,0xF9,
+0x8F,0x40,0x2B,0x01,0x00,0xCD,0x97,0xA4,0xE3,0x00,0x00,0xBC,0xE8,0x18,0x5C,0xA8,0x94,0x17,0x4C,
+0xC6,0x08,0x00,0x00,0x44,0xA0,0x81,0x2A,0xB0,0x41,0x07,0x0C,0xC1,0x14,0xAC,0xC0,0x0E,0x9C,0xC1,
+0x1D,0xBC,0xC0,0x17,0x02,0x61,0x06,0x44,0x40,0x0C,0x24,0xC0,0x3C,0x10,0x42,0x06,0xE4,0x80,0x1C,
+0x0A,0xA1,0x18,0x96,0x41,0x19,0x54,0xC0,0x3A,0xD8,0x04,0xB5,0xB0,0x03,0x1A,0xA0,0x11,0x9A,0xE1,
+0x10,0xB4,0xC1,0x31,0x38,0x0D,0xE7,0xE0,0x12,0x5C,0x81,0xEB,0x70,0x17,0x06,0x60,0x18,0x9E,0xC2,
+0x18,0xBC,0x86,0x09,0x04,0x41,0xC8,0x08,0x13,0x61,0x21,0x3A,0x88,0x11,0x62,0x8E,0xD8,0x22,0xCE,
+0x08,0x17,0x99,0x8E,0x04,0x22,0x61,0x48,0x34,0x92,0x80,0xA4,0x20,0xE9,0x88,0x14,0x51,0x22,0xC5,
+0xC8,0x72,0xA4,0x02,0xA9,0x42,0x6A,0x91,0x5D,0x48,0x23,0xF2,0x2D,0x72,0x14,0x39,0x8D,0x5C,0x40,
+0xFA,0x90,0xDB,0xC8,0x20,0x32,0x8A,0xFC,0x8A,0xBC,0x47,0x31,0x94,0x81,0xB2,0x51,0x03,0xD4,0x02,
+0x75,0x40,0xB9,0xA8,0x1F,0x1A,0x8A,0xC6,0xA0,0x73,0xD1,0x74,0x34,0x0F,0x5D,0x80,0x96,0xA2,0x6B,
+0xD1,0x1A,0xB4,0x1E,0x3D,0x80,0xB6,0xA2,0xA7,0xD1,0x4B,0xE8,0x75,0x74,0x00,0x7D,0x8A,0x8E,0x63,
+0x80,0xD1,0x31,0x0E,0x66,0x8C,0xD9,0x61,0x5C,0x8C,0x87,0x45,0x60,0x89,0x58,0x1A,0x26,0xC7,0x16,
+0x63,0xE5,0x58,0x35,0x56,0x8F,0x35,0x63,0x1D,0x58,0x37,0x76,0x15,0x1B,0xC0,0x9E,0x61,0xEF,0x08,
+0x24,0x02,0x8B,0x80,0x13,0xEC,0x08,0x5E,0x84,0x10,0xC2,0x6C,0x82,0x90,0x90,0x47,0x58,0x4C,0x58,
+0x43,0xA8,0x25,0xEC,0x23,0xB4,0x12,0xBA,0x08,0x57,0x09,0x83,0x84,0x31,0xC2,0x27,0x22,0x93,0xA8,
+0x4F,0xB4,0x25,0x7A,0x12,0xF9,0xC4,0x78,0x62,0x3A,0xB1,0x90,0x58,0x46,0xAC,0x26,0xEE,0x21,0x1E,
+0x21,0x9E,0x25,0x5E,0x27,0x0E,0x13,0x5F,0x93,0x48,0x24,0x0E,0xC9,0x92,0xE4,0x4E,0x0A,0x21,0x25,
+0x90,0x32,0x49,0x0B,0x49,0x6B,0x48,0xDB,0x48,0x2D,0xA4,0x53,0xA4,0x3E,0xD2,0x10,0x69,0x9C,0x4C,
+0x26,0xEB,0x90,0x6D,0xC9,0xDE,0xE4,0x08,0xB2,0x80,0xAC,0x20,0x97,0x91,0xB7,0x90,0x0F,0x90,0x4F,
+0x92,0xFB,0xC9,0xC3,0xE4,0xB7,0x14,0x3A,0xC5,0x88,0xE2,0x4C,0x09,0xA2,0x24,0x52,0xA4,0x94,0x12,
+0x4A,0x35,0x65,0x3F,0xE5,0x04,0xA5,0x9F,0x32,0x42,0x99,0xA0,0xAA,0x51,0xCD,0xA9,0x9E,0xD4,0x08,
+0xAA,0x88,0x3A,0x9F,0x5A,0x49,0x6D,0xA0,0x76,0x50,0x2F,0x53,0x87,0xA9,0x13,0x34,0x75,0x9A,0x25,
+0xCD,0x9B,0x16,0x43,0xCB,0xA4,0x2D,0xA3,0xD5,0xD0,0x9A,0x69,0x67,0x69,0xF7,0x68,0x2F,0xE9,0x74,
+0xBA,0x09,0xDD,0x83,0x1E,0x45,0x97,0xD0,0x97,0xD2,0x6B,0xE8,0x07,0xE9,0xE7,0xE9,0x83,0xF4,0x77,
+0x0C,0x0D,0x86,0x0D,0x83,0xC7,0x48,0x62,0x28,0x19,0x6B,0x19,0x7B,0x19,0xA7,0x18,0xB7,0x19,0x2F,
+0x99,0x4C,0xA6,0x05,0xD3,0x97,0x99,0xC8,0x54,0x30,0xD7,0x32,0x1B,0x99,0x67,0x98,0x0F,0x98,0x6F,
+0x55,0x58,0x2A,0xF6,0x2A,0x7C,0x15,0x91,0xCA,0x12,0x95,0x3A,0x95,0x56,0x95,0x7E,0x95,0xE7,0xAA,
+0x54,0x55,0x73,0x55,0x3F,0xD5,0x79,0xAA,0x0B,0x54,0xAB,0x55,0x0F,0xAB,0x5E,0x56,0x7D,0xA6,0x46,
+0x55,0xB3,0x50,0xE3,0xA9,0x09,0xD4,0x16,0xAB,0xD5,0xA9,0x1D,0x55,0xBB,0xA9,0x36,0xAE,0xCE,0x52,
+0x77,0x52,0x8F,0x50,0xCF,0x51,0x5F,0xA3,0xBE,0x5F,0xFD,0x82,0xFA,0x63,0x0D,0xB2,0x86,0x85,0x46,
+0xA0,0x86,0x48,0xA3,0x54,0x63,0xB7,0xC6,0x19,0x8D,0x21,0x16,0xC6,0x32,0x65,0xF1,0x58,0x42,0xD6,
+0x72,0x56,0x03,0xEB,0x2C,0x6B,0x98,0x4D,0x62,0x5B,0xB2,0xF9,0xEC,0x4C,0x76,0x05,0xFB,0x1B,0x76,
+0x2F,0x7B,0x4C,0x53,0x43,0x73,0xAA,0x66,0xAC,0x66,0x91,0x66,0x9D,0xE6,0x71,0xCD,0x01,0x0E,0xC6,
+0xB1,0xE0,0xF0,0x39,0xD9,0x9C,0x4A,0xCE,0x21,0xCE,0x0D,0xCE,0x7B,0x2D,0x03,0x2D,0x3F,0x2D,0xB1,
+0xD6,0x6A,0xAD,0x66,0xAD,0x7E,0xAD,0x37,0xDA,0x7A,0xDA,0xBE,0xDA,0x62,0xED,0x72,0xED,0x16,0xED,
+0xEB,0xDA,0xEF,0x75,0x70,0x9D,0x40,0x9D,0x2C,0x9D,0xF5,0x3A,0x6D,0x3A,0xF7,0x75,0x09,0xBA,0x36,
+0xBA,0x51,0xBA,0x85,0xBA,0xDB,0x75,0xCF,0xEA,0x3E,0xD3,0x63,0xEB,0x79,0xE9,0x09,0xF5,0xCA,0xF5,
+0x0E,0xE9,0xDD,0xD1,0x47,0xF5,0x6D,0xF4,0xA3,0xF5,0x17,0xEA,0xEF,0xD6,0xEF,0xD1,0x1F,0x37,0x30,
+0x34,0x08,0x36,0x90,0x19,0x6C,0x31,0x38,0x63,0xF0,0xCC,0x90,0x63,0xE8,0x6B,0x98,0x69,0xB8,0xD1,
+0xF0,0x84,0xE1,0xA8,0x11,0xCB,0x68,0xBA,0x91,0xC4,0x68,0xA3,0xD1,0x49,0xA3,0x27,0xB8,0x26,0xEE,
+0x87,0x67,0xE3,0x35,0x78,0x17,0x3E,0x66,0xAC,0x6F,0x1C,0x62,0xAC,0x34,0xDE,0x65,0xDC,0x6B,0x3C,
+0x61,0x62,0x69,0x32,0xDB,0xA4,0xC4,0xA4,0xC5,0xE4,0xBE,0x29,0xCD,0x94,0x6B,0x9A,0x66,0xBA,0xD1,
+0xB4,0xD3,0x74,0xCC,0xCC,0xC8,0x2C,0xDC,0xAC,0xD8,0xAC,0xC9,0xEC,0x8E,0x39,0xD5,0x9C,0x6B,0x9E,
+0x61,0xBE,0xD9,0xBC,0xDB,0xFC,0x8D,0x85,0xA5,0x45,0x9C,0xC5,0x4A,0x8B,0x36,0x8B,0xC7,0x96,0xDA,
+0x96,0x7C,0xCB,0x05,0x96,0x4D,0x96,0xF7,0xAC,0x98,0x56,0x3E,0x56,0x79,0x56,0xF5,0x56,0xD7,0xAC,
+0x49,0xD6,0x5C,0xEB,0x2C,0xEB,0x6D,0xD6,0x57,0x6C,0x50,0x1B,0x57,0x9B,0x0C,0x9B,0x3A,0x9B,0xCB,
+0xB6,0xA8,0xAD,0x9B,0xAD,0xC4,0x76,0x9B,0x6D,0xDF,0x14,0xE2,0x14,0x8F,0x29,0xD2,0x29,0xF5,0x53,
+0x6E,0xDA,0x31,0xEC,0xFC,0xEC,0x0A,0xEC,0x9A,0xEC,0x06,0xED,0x39,0xF6,0x61,0xF6,0x25,0xF6,0x6D,
+0xF6,0xCF,0x1D,0xCC,0x1C,0x12,0x1D,0xD6,0x3B,0x74,0x3B,0x7C,0x72,0x74,0x75,0xCC,0x76,0x6C,0x70,
+0xBC,0xEB,0xA4,0xE1,0x34,0xC3,0xA9,0xC4,0xA9,0xC3,0xE9,0x57,0x67,0x1B,0x67,0xA1,0x73,0x9D,0xF3,
+0x35,0x17,0xA6,0x4B,0x90,0xCB,0x12,0x97,0x76,0x97,0x17,0x53,0x6D,0xA7,0x8A,0xA7,0x6E,0x9F,0x7A,
+0xCB,0x95,0xE5,0x1A,0xEE,0xBA,0xD2,0xB5,0xD3,0xF5,0xA3,0x9B,0xBB,0x9B,0xDC,0xAD,0xD9,0x6D,0xD4,
+0xDD,0xCC,0x3D,0xC5,0x7D,0xAB,0xFB,0x4D,0x2E,0x9B,0x1B,0xC9,0x5D,0xC3,0x3D,0xEF,0x41,0xF4,0xF0,
+0xF7,0x58,0xE2,0x71,0xCC,0xE3,0x9D,0xA7,0x9B,0xA7,0xC2,0xF3,0x90,0xE7,0x2F,0x5E,0x76,0x5E,0x59,
+0x5E,0xFB,0xBD,0x1E,0x4F,0xB3,0x9C,0x26,0x9E,0xD6,0x30,0x6D,0xC8,0xDB,0xC4,0x5B,0xE0,0xBD,0xCB,
+0x7B,0x60,0x3A,0x3E,0x3D,0x65,0xFA,0xCE,0xE9,0x03,0x3E,0xC6,0x3E,0x02,0x9F,0x7A,0x9F,0x87,0xBE,
+0xA6,0xBE,0x22,0xDF,0x3D,0xBE,0x23,0x7E,0xD6,0x7E,0x99,0x7E,0x07,0xFC,0x9E,0xFB,0x3B,0xFA,0xCB,
+0xFD,0x8F,0xF8,0xBF,0xE1,0x79,0xF2,0x16,0xF1,0x4E,0x05,0x60,0x01,0xC1,0x01,0xE5,0x01,0xBD,0x81,
+0x1A,0x81,0xB3,0x03,0x6B,0x03,0x1F,0x04,0x99,0x04,0xA5,0x07,0x35,0x05,0x8D,0x05,0xBB,0x06,0x2F,
+0x0C,0x3E,0x15,0x42,0x0C,0x09,0x0D,0x59,0x1F,0x72,0x93,0x6F,0xC0,0x17,0xF2,0x1B,0xF9,0x63,0x33,
+0xDC,0x67,0x2C,0x9A,0xD1,0x15,0xCA,0x08,0x9D,0x15,0x5A,0x1B,0xFA,0x30,0xCC,0x26,0x4C,0x1E,0xD6,
+0x11,0x8E,0x86,0xCF,0x08,0xDF,0x10,0x7E,0x6F,0xA6,0xF9,0x4C,0xE9,0xCC,0xB6,0x08,0x88,0xE0,0x47,
+0x6C,0x88,0xB8,0x1F,0x69,0x19,0x99,0x17,0xF9,0x7D,0x14,0x29,0x2A,0x32,0xAA,0x2E,0xEA,0x51,0xB4,
+0x53,0x74,0x71,0x74,0xF7,0x2C,0xD6,0xAC,0xE4,0x59,0xFB,0x67,0xBD,0x8E,0xF1,0x8F,0xA9,0x8C,0xB9,
+0x3B,0xDB,0x6A,0xB6,0x72,0x76,0x67,0xAC,0x6A,0x6C,0x52,0x6C,0x63,0xEC,0x9B,0xB8,0x80,0xB8,0xAA,
+0xB8,0x81,0x78,0x87,0xF8,0x45,0xF1,0x97,0x12,0x74,0x13,0x24,0x09,0xED,0x89,0xE4,0xC4,0xD8,0xC4,
+0x3D,0x89,0xE3,0x73,0x02,0xE7,0x6C,0x9A,0x33,0x9C,0xE4,0x9A,0x54,0x96,0x74,0x63,0xAE,0xE5,0xDC,
+0xA2,0xB9,0x17,0xE6,0xE9,0xCE,0xCB,0x9E,0x77,0x3C,0x59,0x35,0x59,0x90,0x7C,0x38,0x85,0x98,0x12,
+0x97,0xB2,0x3F,0xE5,0x83,0x20,0x42,0x50,0x2F,0x18,0x4F,0xE5,0xA7,0x6E,0x4D,0x1D,0x13,0xF2,0x84,
+0x9B,0x85,0x4F,0x45,0xBE,0xA2,0x8D,0xA2,0x51,0xB1,0xB7,0xB8,0x4A,0x3C,0x92,0xE6,0x9D,0x56,0x95,
+0xF6,0x38,0xDD,0x3B,0x7D,0x43,0xFA,0x68,0x86,0x4F,0x46,0x75,0xC6,0x33,0x09,0x4F,0x52,0x2B,0x79,
+0x91,0x19,0x92,0xB9,0x23,0xF3,0x4D,0x56,0x44,0xD6,0xDE,0xAC,0xCF,0xD9,0x71,0xD9,0x2D,0x39,0x94,
+0x9C,0x94,0x9C,0xA3,0x52,0x0D,0x69,0x96,0xB4,0x2B,0xD7,0x30,0xB7,0x28,0xB7,0x4F,0x66,0x2B,0x2B,
+0x93,0x0D,0xE4,0x79,0xE6,0x6D,0xCA,0x1B,0x93,0x87,0xCA,0xF7,0xE4,0x23,0xF9,0x73,0xF3,0xDB,0x15,
+0x6C,0x85,0x4C,0xD1,0xA3,0xB4,0x52,0xAE,0x50,0x0E,0x16,0x4C,0x2F,0xA8,0x2B,0x78,0x5B,0x18,0x5B,
+0x78,0xB8,0x48,0xBD,0x48,0x5A,0xD4,0x33,0xDF,0x66,0xFE,0xEA,0xF9,0x23,0x0B,0x82,0x16,0x7C,0xBD,
+0x90,0xB0,0x50,0xB8,0xB0,0xB3,0xD8,0xB8,0x78,0x59,0xF1,0xE0,0x22,0xBF,0x45,0xBB,0x16,0x23,0x8B,
+0x53,0x17,0x77,0x2E,0x31,0x5D,0x52,0xBA,0x64,0x78,0x69,0xF0,0xD2,0x7D,0xCB,0x68,0xCB,0xB2,0x96,
+0xFD,0x50,0xE2,0x58,0x52,0x55,0xF2,0x6A,0x79,0xDC,0xF2,0x8E,0x52,0x83,0xD2,0xA5,0xA5,0x43,0x2B,
+0x82,0x57,0x34,0x95,0xA9,0x94,0xC9,0xCB,0x6E,0xAE,0xF4,0x5A,0xB9,0x63,0x15,0x61,0x95,0x64,0x55,
+0xEF,0x6A,0x97,0xD5,0x5B,0x56,0x7F,0x2A,0x17,0x95,0x5F,0xAC,0x70,0xAC,0xA8,0xAE,0xF8,0xB0,0x46,
+0xB8,0xE6,0xE2,0x57,0x4E,0x5F,0xD5,0x7C,0xF5,0x79,0x6D,0xDA,0xDA,0xDE,0x4A,0xB7,0xCA,0xED,0xEB,
+0x48,0xEB,0xA4,0xEB,0x6E,0xAC,0xF7,0x59,0xBF,0xAF,0x4A,0xBD,0x6A,0x41,0xD5,0xD0,0x86,0xF0,0x0D,
+0xAD,0x1B,0xF1,0x8D,0xE5,0x1B,0x5F,0x6D,0x4A,0xDE,0x74,0xA1,0x7A,0x6A,0xF5,0x8E,0xCD,0xB4,0xCD,
+0xCA,0xCD,0x03,0x35,0x61,0x35,0xED,0x5B,0xCC,0xB6,0xAC,0xDB,0xF2,0xA1,0x36,0xA3,0xF6,0x7A,0x9D,
+0x7F,0x5D,0xCB,0x56,0xFD,0xAD,0xAB,0xB7,0xBE,0xD9,0x26,0xDA,0xD6,0xBF,0xDD,0x77,0x7B,0xF3,0x0E,
+0x83,0x1D,0x15,0x3B,0xDE,0xEF,0x94,0xEC,0xBC,0xB5,0x2B,0x78,0x57,0x6B,0xBD,0x45,0x7D,0xF5,0x6E,
+0xD2,0xEE,0x82,0xDD,0x8F,0x1A,0x62,0x1B,0xBA,0xBF,0xE6,0x7E,0xDD,0xB8,0x47,0x77,0x4F,0xC5,0x9E,
+0x8F,0x7B,0xA5,0x7B,0x07,0xF6,0x45,0xEF,0xEB,0x6A,0x74,0x6F,0x6C,0xDC,0xAF,0xBF,0xBF,0xB2,0x09,
+0x6D,0x52,0x36,0x8D,0x1E,0x48,0x3A,0x70,0xE5,0x9B,0x80,0x6F,0xDA,0x9B,0xED,0x9A,0x77,0xB5,0x70,
+0x5A,0x2A,0x0E,0xC2,0x41,0xE5,0xC1,0x27,0xDF,0xA6,0x7C,0x7B,0xE3,0x50,0xE8,0xA1,0xCE,0xC3,0xDC,
+0xC3,0xCD,0xDF,0x99,0x7F,0xB7,0xF5,0x08,0xEB,0x48,0x79,0x2B,0xD2,0x3A,0xBF,0x75,0xAC,0x2D,0xA3,
+0x6D,0xA0,0x3D,0xA1,0xBD,0xEF,0xE8,0x8C,0xA3,0x9D,0x1D,0x5E,0x1D,0x47,0xBE,0xB7,0xFF,0x7E,0xEF,
+0x31,0xE3,0x63,0x75,0xC7,0x35,0x8F,0x57,0x9E,0xA0,0x9D,0x28,0x3D,0xF1,0xF9,0xE4,0x82,0x93,0xE3,
+0xA7,0x64,0xA7,0x9E,0x9D,0x4E,0x3F,0x3D,0xD4,0x99,0xDC,0x79,0xF7,0x4C,0xFC,0x99,0x6B,0x5D,0x51,
+0x5D,0xBD,0x67,0x43,0xCF,0x9E,0x3F,0x17,0x74,0xEE,0x4C,0xB7,0x5F,0xF7,0xC9,0xF3,0xDE,0xE7,0x8F,
+0x5D,0xF0,0xBC,0x70,0xF4,0x22,0xF7,0x62,0xDB,0x25,0xB7,0x4B,0xAD,0x3D,0xAE,0x3D,0x47,0x7E,0x70,
+0xFD,0xE1,0x48,0xAF,0x5B,0x6F,0xEB,0x65,0xF7,0xCB,0xED,0x57,0x3C,0xAE,0x74,0xF4,0x4D,0xEB,0x3B,
+0xD1,0xEF,0xD3,0x7F,0xFA,0x6A,0xC0,0xD5,0x73,0xD7,0xF8,0xD7,0x2E,0x5D,0x9F,0x79,0xBD,0xEF,0xC6,
+0xEC,0x1B,0xB7,0x6E,0x26,0xDD,0x1C,0xB8,0x25,0xBA,0xF5,0xF8,0x76,0xF6,0xED,0x17,0x77,0x0A,0xEE,
+0x4C,0xDC,0x5D,0x7A,0x8F,0x78,0xAF,0xFC,0xBE,0xDA,0xFD,0xEA,0x07,0xFA,0x0F,0xEA,0x7F,0xB4,0xFE,
+0xB1,0x65,0xC0,0x6D,0xE0,0xF8,0x60,0xC0,0x60,0xCF,0xC3,0x59,0x0F,0xEF,0x0E,0x09,0x87,0x9E,0xFE,
+0x94,0xFF,0xD3,0x87,0xE1,0xD2,0x47,0xCC,0x47,0xD5,0x23,0x46,0x23,0x8D,0x8F,0x9D,0x1F,0x1F,0x1B,
+0x0D,0x1A,0xBD,0xF2,0x64,0xCE,0x93,0xE1,0xA7,0xB2,0xA7,0x13,0xCF,0xCA,0x7E,0x56,0xFF,0x79,0xEB,
+0x73,0xAB,0xE7,0xDF,0xFD,0xE2,0xFB,0x4B,0xCF,0x58,0xFC,0xD8,0xF0,0x0B,0xF9,0x8B,0xCF,0xBF,0xAE,
+0x79,0xA9,0xF3,0x72,0xEF,0xAB,0xA9,0xAF,0x3A,0xC7,0x23,0xC7,0x1F,0xBC,0xCE,0x79,0x3D,0xF1,0xA6,
+0xFC,0xAD,0xCE,0xDB,0x7D,0xEF,0xB8,0xEF,0xBA,0xDF,0xC7,0xBD,0x1F,0x99,0x28,0xFC,0x40,0xFE,0x50,
+0xF3,0xD1,0xFA,0x63,0xC7,0xA7,0xD0,0x4F,0xF7,0x3E,0xE7,0x7C,0xFE,0xFC,0x2F,0xF7,0x84,0xF3,0xFB,
+0x25,0xD2,0x9F,0x33,0x00,0x00,0x00,0x20,0x63,0x48,0x52,0x4D,0x00,0x00,0x7A,0x25,0x00,0x00,0x80,
+0x83,0x00,0x00,0xF9,0xFF,0x00,0x00,0x80,0xE9,0x00,0x00,0x75,0x30,0x00,0x00,0xEA,0x60,0x00,0x00,
+0x3A,0x98,0x00,0x00,0x17,0x6F,0x92,0x5F,0xC5,0x46,0x00,0x00,0x03,0x6A,0x49,0x44,0x41,0x54,0x78,
+0xDA,0xD4,0x99,0xDB,0x8B,0x4D,0x51,0x1C,0xC7,0x3F,0x73,0x30,0x33,0xB9,0x1B,0x91,0x26,0xE4,0x96,
+0x41,0x23,0x64,0xBC,0x10,0x21,0x22,0x49,0xE4,0xC1,0x03,0x25,0xA6,0x49,0xE3,0x6F,0xF0,0xE4,0x4D,
+0xA3,0x88,0x72,0x8B,0x79,0x91,0x86,0x22,0x21,0x91,0x68,0x94,0x6B,0x6E,0x33,0xEE,0x23,0x14,0x66,
+0x18,0x53,0x43,0x72,0x3B,0xE3,0xFA,0xF5,0x60,0x4D,0x9D,0x8E,0x73,0xF6,0x59,0x6B,0xED,0x7D,0xCE,
+0x71,0xBE,0xB5,0xDA,0x9D,0xCE,0xDA,0xBF,0xB5,0xBE,0xEB,0xB7,0x7E,0xD7,0x5D,0x24,0x89,0x42,0x46,
+0xCF,0x88,0xE4,0x14,0x03,0x53,0x81,0xF1,0x40,0x15,0x30,0x0E,0x18,0x06,0xF4,0x06,0x3E,0x03,0xED,
+0xC0,0x33,0xE0,0x16,0xF0,0x04,0x68,0x02,0xF4,0x3F,0x10,0x98,0x02,0xD4,0x00,0xCB,0x80,0x11,0x0E,
+0xEF,0x3D,0x07,0x4E,0x00,0x07,0x80,0x47,0xA1,0x76,0x20,0xC9,0x67,0xCC,0x94,0x74,0x51,0xD1,0xE0,
+0xB4,0xA4,0xE9,0x9E,0xFB,0x70,0x26,0x50,0x26,0xE9,0xB0,0xB2,0x83,0x7A,0x49,0xFD,0x5D,0x09,0x14,
+0x39,0x18,0xF1,0x2C,0xA3,0xF6,0xC1,0x59,0xB4,0xC9,0x37,0xC0,0x12,0xE0,0xAE,0xED,0x0B,0x31,0xCB,
+0x79,0x6B,0x81,0xCB,0x59,0xDE,0x3C,0x40,0x39,0x70,0x07,0x58,0x1E,0xA5,0x0D,0x54,0x2B,0x3F,0x58,
+0x15,0xC5,0x15,0x5A,0x09,0x1C,0xCD,0xA3,0x9B,0x5F,0x08,0x9C,0x0F,0x9A,0x10,0x44,0x60,0x0C,0x70,
+0x0D,0x18,0x9A,0x47,0x02,0x6D,0xC6,0xF6,0x5E,0xF9,0xD8,0x40,0x7D,0x9E,0x37,0x0F,0x30,0x1C,0xD8,
+0xE3,0xA3,0x81,0x1A,0x60,0x9F,0xC7,0x82,0x5D,0xE6,0x50,0x9A,0x4C,0x90,0xEA,0x6D,0x22,0xEE,0x67,
+0xA0,0x1A,0x98,0x06,0xFC,0x06,0xFA,0x38,0xCA,0x5D,0x03,0x1C,0xB2,0x35,0xE2,0x52,0x49,0x4F,0x3D,
+0x8C,0xEE,0x8A,0xA4,0x05,0x92,0x7A,0x49,0x2A,0x49,0x21,0xB7,0xD8,0x3C,0xE7,0x48,0x3A,0x22,0xE9,
+0xAB,0x83,0xEC,0xBB,0x2E,0x81,0x6C,0xBD,0xE3,0xC6,0x5B,0x25,0xCD,0xF7,0x88,0xA2,0xF3,0x24,0x7D,
+0x72,0x58,0x67,0xB5,0x2D,0x81,0x46,0x07,0xA1,0xED,0x92,0x26,0xF9,0xA6,0x01,0x46,0x1B,0x3F,0x2D,
+0xD7,0x6A,0xB4,0x21,0x30,0x5A,0x52,0xDC,0x52,0x60,0xA7,0xA4,0x09,0x21,0x36,0xEF,0xAA,0xF1,0xB8,
+0xA4,0x8A,0xE4,0xF7,0x63,0x49,0x6E,0x73,0x05,0x50,0x6A,0x61,0x54,0x1F,0x81,0xB9,0x40,0x4B,0x04,
+0x9E,0xA6,0x1E,0x38,0x65,0x31,0xAF,0x14,0x58,0x14,0xE4,0x46,0x87,0x03,0x63,0x2D,0x17,0xDD,0x05,
+0x3C,0x88,0xD0,0x5D,0xD6,0x59,0xCE,0x9B,0x1C,0x44,0x60,0x06,0x50,0x69,0x21,0xE4,0x3D,0xB0,0x3D,
+0x62,0x7F,0x7F,0x09,0xB8,0x62,0x59,0x7F,0xA4,0x25,0x30,0xD1,0x5C,0xA3,0x4C,0xD8,0x0B,0x74,0x64,
+0x21,0x68,0xD9,0x68,0xB4,0xC2,0x54,0x7A,0x29,0x09,0x94,0x03,0x43,0x32,0x08,0x88,0x03,0xFB,0xB3,
+0x14,0x75,0x6D,0x34,0x50,0x02,0xF4,0x4D,0x47,0xA0,0x9F,0x99,0x10,0x84,0x5F,0xC0,0x97,0x2C,0x11,
+0x68,0xB5,0x98,0xD3,0x03,0xE8,0x95,0x8E,0xC0,0x77,0x13,0xE6,0x03,0xB3,0x6F,0x43,0x22,0x1B,0xB0,
+0xAD,0xAC,0x62,0xE9,0x7E,0xBC,0x05,0xDE,0x65,0x78,0xF9,0x37,0xF0,0xC3,0x63,0x73,0x03,0xCD,0x08,
+0xC2,0x08,0x1F,0xA2,0x89,0x04,0x9E,0x05,0xA5,0xAD,0x21,0xD1,0x60,0x2A,0xAD,0xB2,0x0C,0x25,0x2B,
+0x16,0x57,0xF8,0x5B,0x3A,0x02,0xD7,0x81,0x7B,0x19,0x04,0xF4,0x75,0x6C,0x9F,0x74,0x63,0x14,0x30,
+0x1A,0x38,0x17,0x40,0x62,0xB2,0x25,0x81,0xAE,0x74,0x04,0xDE,0x98,0x91,0xC9,0x88,0x56,0x78,0x10,
+0xF8,0x69,0x9E,0xD3,0x81,0x0B,0xC6,0x61,0x24,0x62,0xB6,0xA5,0x06,0xF4,0x8F,0xAD,0x24,0xE5,0x16,
+0x55,0x16,0x39,0x49,0x9B,0xA4,0x41,0x8E,0xF9,0xCE,0xBD,0x24,0x19,0xF7,0x93,0x5A,0x28,0x27,0x2D,
+0xF3,0xA1,0x17,0x92,0x06,0x04,0x25,0x73,0x3D,0x25,0x3D,0xB4,0x10,0xB4,0xC7,0x91,0x40,0x2A,0x99,
+0xCD,0xE6,0xBF,0xE5,0x0E,0xD9,0xEF,0xA6,0xA0,0x64,0xAE,0x5B,0xD5,0x0D,0x16,0xAA,0xDC,0x00,0x6C,
+0x74,0xB8,0x42,0xB1,0x34,0x69,0xC1,0x7D,0xC7,0xB4,0xE4,0xB6,0x4D,0x45,0x36,0x52,0xD2,0x07,0x8B,
+0xD3,0x78,0x6B,0x3A,0x75,0x36,0x1A,0x78,0x1C,0x41,0x9B,0xE5,0x71,0x2A,0xD9,0xA9,0x4E,0xE6,0x15,
+0xB0,0xDB,0xE2,0x34,0x0E,0x9A,0xC4,0x2E,0x57,0x68,0x70,0xE9,0x4A,0x6C,0x01,0x5E,0x67,0x10,0x78,
+0x35,0x87,0x9B,0xEF,0x30,0x29,0xBC,0x35,0x81,0x0F,0x40,0x6D,0x80,0xC0,0x9D,0xC0,0xF1,0x1C,0x12,
+0xD8,0x01,0x74,0xFA,0xB4,0x16,0x37,0xA7,0xB8,0x8B,0x5B,0x3D,0xCA,0xC6,0x96,0x10,0x77,0xBF,0x2E,
+0x6C,0x7B,0xFD,0x40,0x42,0xE1,0xBD,0xCD,0xB3,0xEE,0xF5,0x25,0xD0,0x6C,0x5C,0x7B,0x5A,0xD9,0x36,
+0xDD,0xE9,0x5A,0xD3,0xA1,0x9B,0x0D,0x6C,0xCA,0x71,0x67,0xEE,0x58,0x42,0x14,0x77,0xEE,0x8D,0x46,
+0x89,0x16,0x53,0x4D,0xB9,0xE2,0x97,0x69,0xF0,0x36,0x86,0xFD,0x3E,0x90,0x2F,0xF4,0x00,0xCE,0x02,
+0x8B,0x0B,0x95,0x00,0xFC,0xFD,0x02,0x7A,0x06,0x58,0x5A,0xA8,0x04,0xBA,0x71,0x0A,0x58,0x97,0x2F,
+0x02,0x37,0x12,0x2A,0xBA,0x30,0xA8,0x74,0x8D,0x03,0x51,0x8D,0x98,0xE9,0x4E,0xD7,0x48,0x7A,0xE9,
+0xE9,0x52,0x8F,0x85,0xFD,0x4A,0x19,0x15,0xCA,0x4D,0xF5,0x15,0xB7,0x98,0x5B,0x64,0x6E,0x49,0x31,
+0x70,0x33,0x55,0xEE,0x95,0x0F,0x02,0x91,0x22,0x46,0x81,0xE3,0xCF,0x00,0xD2,0xF0,0xF4,0x75,0x05,
+0xC1,0xEC,0xA0,0x00,0x00,0x00,0x00,0x49,0x45,0x4E,0x44,0xAE,0x42,0x60,0x82};
diff --git a/archive/blr2/src/main.cpp b/archive/blr2/src/main.cpp
new file mode 100644
index 0000000..3c1bec1
--- /dev/null
+++ b/archive/blr2/src/main.cpp
@@ -0,0 +1,1349 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Main Code
+// Copyright Chrisoft 2014
+//Now that we use BSD license, so let's paste it here.
+//(although it may be awful)
+/*
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of the nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+//#define Debug
+#include <hge.h>
+#include <hgefont.h>
+#include <hgegui.h>
+#include <hgedistort.h>
+#include <hgerect.h>
+#include <cassert>
+#include <cmath>
+#include <ctime>
+#include <cstdlib>
+#include <cstring>
+#include <cstdio>
+#include <csignal>
+#ifdef WIN32
+#include <io.h>
+#include <direct.h>
+#include <shlwapi.h>
+#include <shellapi.h>
+#include <windows.h>
+#include <mmsystem.h>
+#endif
+#if defined(__GNUC__) && !defined(MINGW_BUILD)
+#include <execinfo.h>
+#endif
+#include "libcgh.h"
+#include "hgeft.h"
+#include "global.h"
+#include "music.h"
+#include "scoresystem.h"
+#include "towernbullet.h"
+#include "background.h"
+#include "levels.h"
+#include "scorec.h"
+#include "menus.h"
+static const char* MAIN_SRC_FN="main.cpp";
+#ifdef WIN32
+void Expand(const char *source,const char *dist)
+{
+ char cmd[255];
+ sprintf(cmd,"%s -F:* %s",source,dist);
+ int res=(int)ShellExecuteA(NULL,"open","expand.exe",cmd,NULL,SW_HIDE);
+ if (res<32) Error("Error while decompressing resources!\nCheck if expand.exe works correctly.");
+}
+void firststartup()
+{
+ if (MessageBoxA(NULL,"It seems that you are running BLR for the First time!\nLet's do some \
+basic settings first!\n\nUse vsync?","First Start Up",0x00000024)==6)
+ fpslvl=2;
+ else
+ fpslvl=0;
+ if (MessageBoxA(NULL,"Enable Fullscreen?","First Start Up",0x00000024)==6)
+ tfs=1;
+ else
+ tfs=0;
+ diffkey=false;VidMode=0;
+ plrspd=3;plrslospd=3;clrbns=clrmode=0;bgmvol=15;sfxvol=10;
+ hge->System_Log("%s: Finishing first start up configuraion...",MAIN_SRC_FN);
+ Options_Writeback();
+ Score_Initailize();
+}
+#else
+void firststartup()
+{
+ fpslvl=2;tfs=0;VidMode=0;diffkey=false;
+ plrspd=3;plrslospd=3;clrbns=clrmode=0;bgmvol=15;sfxvol=10;
+ hge->System_Log("%s: Finishing (stubbed) first start up configuraion...",MAIN_SRC_FN);
+ Options_Writeback();
+ Score_Initailize();
+}
+#endif
+void Player_Clear_Expand()
+{
+ if (LOWFPS)
+ clrrange+=13.6;
+ else
+ clrrange+=0.8;
+ int ds;
+ for (int i=1;i<=bulcnt;++i)
+ {
+ if(bullet[i].bullettype>=253)continue;
+ double dis=GetDist(bullet[i].bulletpos,playerpos);ds=0;
+ if(PlayerSplit)
+ for(int j=1;j<4;++j)
+ {
+ if(dis>GetDist(bullet[i].bulletpos,playerpos+splitData[j]))
+ dis=GetDist(bullet[i].bulletpos,playerpos+splitData[j]),ds=j;
+ }
+ if(dis<=clrrange&&bullet[i].exist&&!bullet[i].inv)
+ {
+ CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10,ds);
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ }
+}
+void Player_Clear_Rotate()
+{
+ if (LOWFPS)
+ clrrad+=pi/450*17;
+ else
+ clrrad+=pi/450;
+ for (int i=1;i<=bulcnt;++i)
+ {
+ if(bullet[i].bullettype>=253)continue;
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ double rad=atan2l(bullet[i].bulletpos.y-playerpos.y,bullet[i].bulletpos.x-playerpos.x);
+ hge->Gfx_RenderLine(playerpos.x+8,playerpos.y+8,playerpos.x+cos(clrrad)*clrmaxrange,playerpos.y+sin(clrrad)*clrmaxrange);
+ rad=normalizerad(rad);
+ if(dis<=clrmaxrange&&bullet[i].exist&&!bullet[i].inv&&rad>normalizerad(clrrad)-pi/12&&rad<normalizerad(clrrad)+pi/12)
+ {
+ CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10);
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ if(PlayerSplit)
+ for(int j=1;j<4;++j)
+ {
+ vector2d plsp=playerpos+splitData[j];
+ double dis=GetDist(bullet[i].bulletpos,plsp);
+ double rad=atan2l(bullet[i].bulletpos.y-plsp.y,bullet[i].bulletpos.x-plsp.x);
+ hge->Gfx_RenderLine(plsp.x+8,plsp.y+8,plsp.x+cos(clrrad)*clrmaxrange,plsp.y+sin(clrrad)*clrmaxrange);
+ while (rad<0)rad+=2*pi;
+ if (bullet[i].bullettype!=255&&dis<=clrmaxrange&&bullet[i].exist&&!bullet[i].inv&&rad>normalizerad(clrrad)-pi/12&&rad<normalizerad(clrrad)+pi/12)
+ {
+ CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10,j);
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ }
+ }
+}
+void ProcessPlayer()
+{
+ if (!clrcircle)
+ {
+ clrcircle=new hgeSprite(SprSheet,63,71,193,193);
+ clrcircle->SetHotSpot(96.5f,96.5f);
+ clrcircle->SetBlendMode(BLEND_ALPHAADD);
+ }
+ if(clrmode)clrcircle->SetColor(0x30008080);else clrcircle->SetColor(0x30800000);
+ if (playerLockX)
+ {
+ Lock.Setdata(0,vector2d(playerpos.x-1,0),vector2d(playerpos.x-1,600),0xC0FFFFFF);
+ for (int i=1;i<80;++i)
+ Lock.Setdata(i,vector2d(playerpos.x+1,0),vector2d(playerpos.x+1,600),0xC0FFFFFF);
+ Lock.Render();
+ }
+ if (playerLockY)
+ {
+ Lock.Setdata(0,vector2d(0,playerpos.y+5),vector2d(800,playerpos.y+5),0xC0FFFFFF);
+ for (int i=1;i<80;++i)
+ Lock.Setdata(i,vector2d(0,playerpos.y+7),vector2d(800,playerpos.y+7),0xC0FFFFFF);
+ Lock.Render();
+ }
+ if(!PlayerSplit)
+ playerspr->RenderEx(playerpos.x+8.4,playerpos.y+8.4,playerrot,0.7,0);
+ else
+ {
+ for(int i=0;i<4;++i)
+ playerspr->RenderEx(playerpos.x+splitData[i].x+8.4,playerpos.y+splitData[i].y+8.4,playerrot,0.7,0);
+ }
+ if (DisablePlayer)return;
+ playerrot+=0.00174533*17;
+ double realspd;
+ if (hge->Input_GetKeyState(HGEK_SHIFT))
+ realspd=playerslospeed*(1000.0f/hge->Timer_GetFPS());
+ else
+ realspd=playerspeed*(1000.0f/hge->Timer_GetFPS());
+ if (hge->Input_GetKeyState(HGEK_LEFT)&&!playerLockX)
+ if (playerpos.x>10)playerpos.x-=realspd;
+ if (hge->Input_GetKeyState(HGEK_RIGHT)&&!playerLockX)
+ if ((playerpos.x<770&&!PlayerSplit)||(playerpos.x<370&&PlayerSplit))playerpos.x+=realspd;
+ if (hge->Input_GetKeyState(HGEK_UP)&&!playerLockY)
+ if (playerpos.y>10)playerpos.y-=realspd;
+ if (hge->Input_GetKeyState(HGEK_DOWN)&&!playerLockY)
+ if ((playerpos.y<570&&!PlayerSplit)||(playerpos.y<270&&PlayerSplit))playerpos.y+=realspd;
+ if(mode==2)return;
+ if (!clrmode)
+ {
+ if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_HIT&&clrmaxrange==0)
+ {clrind=0;charge=1;}
+ if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_KEEP&&charge)
+ {
+ if (clrmaxrange<=400)
+ {if (LOWFPS)clrmaxrange+=1.6;else clrmaxrange+=0.1;}
+ if (!LOWFPS)clrind+=0.001*pi;else clrind+=0.016*pi;
+ clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*clrmaxrange/193.0f);
+ if(PlayerSplit)for(int i=1;i<4;++i)
+ clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*clrmaxrange/193.0f);
+ }
+ if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_RELEASE&&charge)
+ {
+ charge=0;
+ if (clrmaxrange<=50)
+ {
+ if (clrtime+clrbns>0)
+ {--clrtime;clrmaxrange=350;Player_Clear_Expand();++clrusg;}
+ else clrmaxrange=0;
+ }
+ else{Player_Clear_Expand();++clrusg;}
+ }
+ if (clrrange!=0)
+ {
+ Player_Clear_Expand();
+ clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*(clrmaxrange-clrrange)/193.0f);
+ if(PlayerSplit)for(int i=1;i<4;++i)
+ clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*(clrmaxrange-clrrange)/193.0f);
+ clrind+=(LOWFPS?0.016*pi:0.001*pi);
+ }
+ if (clrrange>=clrmaxrange)clrrange=clrmaxrange=0;
+ }
+ else
+ {
+ if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_HIT&&clrmaxrange==0)
+ {clrind=0;charge=1;}
+ if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_KEEP&&charge)
+ {
+ if (clrmaxrange<=400)
+ {if (LOWFPS)clrmaxrange+=1.6;else clrmaxrange+=0.1;}
+ if (!LOWFPS)clrind+=0.001*pi;else clrind+=0.016*pi;
+ clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*clrmaxrange/193.0f);
+ if(PlayerSplit)for(int i=1;i<4;++i)
+ clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*clrmaxrange/193.0f);
+ }
+ if (hge->Input_GetKeyStateEx(diffkey?HGEK_X:HGEK_Z)==HGEKST_RELEASE&&charge)
+ {
+ charge=0;
+ if (clrmaxrange<=50)
+ {
+ if(clrtime+clrbns>0)
+ {--clrtime;clrmaxrange=350;Player_Clear_Rotate();++clrusg;}
+ else clrmaxrange=0;
+ }else{Player_Clear_Rotate();++clrusg;}
+ }
+ if (clrrad-pi/2>1e-7)
+ {
+ Player_Clear_Rotate();
+ clrcircle->RenderEx(playerpos.x+7.2,playerpos.y+7.2,clrind,2*clrmaxrange/193.0f*(5*pi/2.0f-clrrad)/(2*pi));
+ if(PlayerSplit)for(int i=1;i<4;++i)
+ clrcircle->RenderEx(playerpos.x+splitData[i].x+7.2,playerpos.y+splitData[i].y+7.2,clrind,2*clrmaxrange/193.0f*(5*pi/2.0f-clrrad)/(2*pi));
+ clrind+=(LOWFPS?0.016*pi:0.001*pi);
+ }
+ if (5*pi/2-clrrad<1e-7)clrrad=pi/2,clrmaxrange=0;
+ }
+}
+void RefreshScore()
+{
+ Mult_FrameFunc();
+ if(DisablePlayer)return;
+ mult+=0.01f*dsmc;
+ score+=16*mult;
+ if(scminus){if(mult/2>0.1)mult/=2;else mult=0.1;}
+ score+=100*shots*mult;
+ score-=scminus*mult;
+ score+=2000*dsmc*mult;
+ ++frms;
+ averfps=(averfps*(frms-1)+hge->Timer_GetFPSf())/(double)frms;
+}
+void CallLevels()
+{
+ //Use this to call level procedures.
+ if((mode==1)&&coll!=0){deathMenu.Init(-200);return;}
+ if((mode==2)&&coll!=0){asts+=assetime;assetime=0;++part;coll=0;IfCallLevel=IfShowTip=true;return;}
+ if(!IfCallLevel) return;
+ if(mode==2)assetime+=hge->Timer_GetDelta();
+ //Check Complete here
+ if(level==1&&part==0)Level1Part0();
+ if(level==1&&part==1)Level1Part1();
+ if(level==1&&part==2)Level1Part2();
+ if(level==1&&part==3)Level1Part3();
+ if(level==1&&part==4)Level1Part4();
+ if(level==2&&part==0)Level2Part0();
+ if(level==2&&part==1)Level2Part1();
+ if(level==2&&part==2)Level2Part2();
+ if(level==2&&part==3)Level2Part3();
+ if(level==2&&part==4)Level2Part4();
+ if(level==2&&part==5)Level2Part5();
+ if(level==2&&part==6)Level2Part6();
+ if(level==2&&part==7)Level2Part7();
+ if(level==2&&part==8)Level2Part8();
+ if(level==2&&part==9)Level2Part9();
+ if(level==3&&part==0)Level3Part0();
+ if(level==3&&part==1)Level3Part1();
+ if(level==3&&part==2)Level3Part2();
+ if(level==3&&part==3)Level3Part3();
+ if(level==3&&part==4)Level3Part4();
+ if(level==3&&part==5)Level3Part5();
+ if(level==3&&part==6)Level3Part6();
+ if(level==4&&part==0)Level4Part0();
+ if(level==4&&part==1)Level4Part1();
+ if(level==4&&part==2)Level4Part2();
+ if(level==4&&part==3)Level4Part3();
+ if(level==4&&part==4)Level4Part4();
+ if(level==4&&part==5)Level4Part5();
+ if(level==4&&part==6)Level4Part6();
+ if(level==4&&part==7)Level4Part7();
+ if(level==4&&part==8)Level4Part8();
+ if(level==4&&part==9)Level4Part9();
+ if(level==4&&part==10)Level4Part10();
+ if(level==4&&part==11)Level4Part11();
+ if(level==4&&part==12)Level4Part12();
+ if(level==4&&part==13)Level4Part13();
+ if(level==4&&part==14)Level4Part14();
+ if(level==4&&part==15)Level4Part15();
+ if(level==4&&part==16)Level4Part16();
+ if(level==4&&part==17)Level4Part17();
+ if(level==4&&part==18)Level4Part18();
+ if(level==4&&part==19)Level4Part19();
+ if(level==4&&part==20)Level4Part20();
+ if(level==4&&part==21)Level4Part21();
+ if(level==4&&part==22)Level4Part22();
+ if(level==4&&part==23)Level4Part23();
+ if(level==4&&part==24)Level4Part24();
+ if(level==4&&part==25)Level4Part25();
+ if(level==5&&part==0)Level5Part0();
+ if(level==5&&part==1)Level5Part1();
+ if(level==5&&part==2)Level5Part2();
+ if(level==5&&part==3)Level5Part3();
+ if(level==5&&part==4)Level5Part4();
+ if(level==5&&part==5)Level5Part5();
+ if(level==5&&part==6)Level5Part6();
+ if(level==5&&part==7)Level5Part7();
+ if(level==5&&part==8)Level5Part8();
+ if(level==5&&part==9)Level5Part9();
+ if(level==5&&part==10)Level5Part10();
+ if(level==5&&part==11)Level5Part11();
+ if(level==5&&part==12)Level5Part12();
+ if(level==5&&part==13)Level5Part13();
+ if(level==5&&part==14)Level5Part14();
+ if(level==5&&part==15)Level5Part15();
+ if(level==5&&part==16)Level5Part16();
+ if(level==5&&part==17)Level5Part17();
+ if(level==5&&part==18)Level5Part18();
+ if(level==5&&part==19)Level5Part19();
+ if(level==5&&part==20)Level5Part20();
+ if(level==5&&part==21)Level5Part21();
+ if(level==5&&part==22)Level5Part22();
+ if(level==6&&part==0)Level6Part0();
+ if(level==6&&part==1)Level6Part1();
+ if(level==6&&part==2)Level6Part2();
+ if(level==6&&part==3)Level6Part3();
+ if(level==6&&part==4)Level6Part4();
+ if(level==6&&part==5)Level6Part5();
+ if(level==6&&part==6)Level6Part6();
+ if(level==6&&part==7)Level6Part7();
+ if(level==6&&part==8)Level6Part8();
+ if(level==6&&part==9)Level6Part9();
+ if(level==6&&part==10)Level6Part10();
+ if(level==6&&part==11)Level6Part11();
+ if(level==6&&part==12)Level6Part12();
+ if(level==6&&part==13)Level6Part13();
+ if(level==6&&part==14)Level6Part14();
+ if(level==6&&part==15)Level6Part15();
+ if(level==6&&part==16)Level6Part16();
+ if(level==6&&part==17)Level6Part17();
+ if(level==6&&part==18)Level6Part18();
+ if(level==6&&part==19)Level6Part19();
+ if(level==6&&part==20)Level6Part20();
+ if(level==6&&part==21)Level6Part21();
+ if(level==6&&part==22)Level6Part22();
+ if(level==6&&part==23)Level6Part23();
+ if(level==6&&part==24)Level6Part24();
+ if(level==6&&part==25)Level6Part25();
+ if(level==6&&part==26)Level6Part26();
+ if(level==6&&part==27)Level6Part27();
+ if(level==6&&part==28)Level6Part28();
+ if(level==6&&part==29)Level6Part29();
+ if(level==6&&part==30)Level6Part30();
+ if(level==6&&part==31)Level6Part999999999();
+ if(level==7&&part==0)Level7Part0();
+ if(level==7&&part==1)Level7Part1();
+ if(level==7&&part==2)Level7Part2();
+ if(level==7&&part==3)Level7Part3();
+ if(level==7&&part==4)Level7Part4();
+ if(level==7&&part==5)Level7Part5();
+ if(level==7&&part==6)Level7Part6();
+ if(level==7&&part==7)Level7Part7();
+ if(level==7&&part==8)Level7Part8();
+ if(level==7&&part==9)Level7Part9();
+ if(level==7&&part==10)Level7Part10();
+ if(level==7&&part==11)Level7Part11();
+ if(level==7&&part==12)Level7Part12();
+ if(level==7&&part==13)Level7Part13();
+ if(level==7&&part==14)Level7Part14();
+ if(level==7&&part==15)Level7Part15();
+ if(level==7&&part==16)Level7Part16();
+ if(level==7&&part==17)Level7Part17();
+ if(level==7&&part==18)Level7Part18();
+ if(level==7&&part==19)Level7Part19();
+ if(level==7&&part==20)Level7Part20();
+ if(level==7&&part==21)Level7Part21();
+ if(level==7&&part==22)Level7Part22();
+ if(level==7&&part==23)Level7Part23();
+ if(level==7&&part==24)Level7Part24();
+ if(level==7&&part==25)Level7Part25();
+ if(level==7&&part==26)Level7Part26();
+ if(level==-1&&part==0)Levelm1Part0();
+ if(level==-1&&part==1)Levelm1Part1();
+ if(level==-1&&part==2)Levelm1Part2();
+ if(level==-1&&part==3)Levelm1Part3();
+ if(level==-1&&part==4)Levelm1Part4();
+ if(level==-1&&part==5)Levelm1Part5();
+ if(level==-1&&part==6)Levelm1Part6();
+ if(level==-1&&part==7)Levelm1Part7();
+ if(level==-1&&part==8)Levelm1Part8();
+ if(level==-1&&part==9)Levelm1Part9();
+ if(level==-1&&part==10)Levelm1Part10();
+ if(level==-1&&part==11)Levelm1Part11();
+ if(level==-1&&part==12)Levelm1Part12();
+ if(level==-1&&part==13)Levelm1Part13();
+ if(level==-1&&part==14)Levelm1Part14();
+ if(level==-1&&part==15)Levelm1Part15();
+ if(level==-1&&part==16)Levelm1Part16();
+ if(level==-1&&part==17)Levelm1Part17();
+ if(level==-1&&part==18)Levelm1Part18();
+ if(level==-1&&part==19)Levelm1Part19();
+ if(level==-1&&part==20)Levelm1Part20();
+ if(level==-1&&part==21)Levelm1Part21();
+ if(level==-2&&part==0)Levelm2Part0();
+ if(level==-2&&part==1)Levelm2Part1();
+ if(level==-2&&part==2)Levelm2Part2();
+ if(level==-2&&part==3)Levelm2Part3();
+ if(level==-2&&part==4)Levelm2Part4();
+ if(level==-2&&part==5)Levelm2Part5();
+ if(level==-2&&part==6)Levelm2Part6();
+ if(level==-2&&part==7)Levelm2Part7();
+ if(level==-2&&part==8)Levelm2Part8();
+ if(level==-2&&part==9)Levelm2Part9();
+ if(level==-2&&part==10)Levelm2Part10();
+ if(level==-2&&part==11)Levelm2Part11();
+ if(level==-2&&part==12)Levelm2Part12();
+ if(level==-2&&part==13)Levelm2Part13();
+ if(level==-2&&part==14)Levelm2Part14();
+ if(level==-2&&part==15)Levelm2Part15();
+ if(level==-2&&part==16)Levelm2Part16();
+ if(level==-2&&part==17)Levelm2Part17();
+ if(level==-2&&part==18)Levelm2Part18();
+ if(level==-2&&part==19)Levelm2Part19();
+ if(level==-2&&part==20)Levelm2Part20();
+ if(level==-2&&part==21)Levelm2Part21();
+ if(level==-2&&part==22)Levelm2Part22();
+ if(level==-2&&part==23)Levelm2Part23();
+ if(level==-2&&part==24)Levelm2Part24();
+ if(level==-2&&part==25)Levelm2Part25();
+ if(level==-2&&part==26)Levelm2Part26();
+
+ if(level==1&&part==5)level=2,part=0;
+ if(level==2&&part==10)
+ {
+ if(mode==3&&coll>10){completeMenu.Init(-200);return;}
+ if(mode==1&&restarts>1){completeMenu.Init(-200);return;}
+ level=3,part=0;
+ }
+ if(level==3&&part==7)
+ {
+ if(mode==3&&coll>40){completeMenu.Init(-200);return;}
+ if(mode==1&&restarts>2){completeMenu.Init(-200);return;}
+ level=4,part=0;
+ }
+ if(level==4&&part==26)
+ {
+ if(mode==3&&coll>75){completeMenu.Init(-200);return;}
+ if(mode==1&&restarts>3){completeMenu.Init(-200);return;}
+ level=5,part=0;
+ }
+ if(level==5&&part==23)
+ {
+ if(mode==3&&coll>125){completeMenu.Init(-200);return;}
+ if(mode==1&&restarts>5){completeMenu.Init(-200);return;}
+ level=6,part=0;
+ }
+ if(level==6&&part==32)
+ {
+ if(mode==3&&coll>200){completeMenu.Init(-200);return;}
+ if(mode==1&&restarts>8){completeMenu.Init(-200);return;}
+ level=7,part=0;
+ }
+ if(level==7&&part==27)
+ {
+ if(mode==3&&coll>50){completeMenu.Init(-200);return;}
+ if(mode==1&&restarts>2){completeMenu.Init(-200);return;}
+ level=-1,part=0;
+ }
+ if(level==-1&&part==22){completeMenu.Init(-200);return;}
+ if(level==-2&&part>26){completeMenu.Init(-200);return;}
+}
+bool ProcessCurCred()
+{
+ CreditsRail->RenderEx(400,300,0,4,1);
+ if(creditsp!=1)
+ Credits->Render(creditfly,300);
+ else
+ {
+ Credits->SetTextureRect(4,209,230,76);
+ Credits->Render(creditfly-30,330);
+ Credits->SetTextureRect(9,290,140,47);
+ Credits->Render(creditfly-30,400);
+ vdig->printf(creditfly-50,240,HGETEXT_LEFT,"%s",BLRVERSION);
+ bdig->printf(creditfly-50,310,HGETEXT_LEFT,"%s",BuiltDate);
+ }
+ if (credstop)credbrk+=hge->Timer_GetDelta();
+ if (credbrk>=4.5&&!creddone)creddone=true,credstop=false,creditacc=0,credbrk=0;
+ if (!credstop)for (int i=1;i<=17;++i)creditfly-=creditacc;
+ if (creditfly<-300)return true;
+ for (int i=1;i<=17;++i)if (creditacc<2)creditacc+=0.015;
+ if (abs(creditfly-400)<5&&!creddone&&!credstop)credstop=true;
+ return false;
+}
+void AboutScene()
+{
+ if (ProcessCurCred())
+ creditfly=1200,creditacc=0,credstop=creddone=false,++creditsp,
+ Credits->SetTextureRect(0,creditsp*200,600,200),
+ Credits->SetHotSpot(300,100);
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT||creditsp>11)
+ {
+ Current_Position=0;
+ mainMenu.Init(850);
+ Music_Stop();
+ }
+}
+void HelpScene(bool fake=false)
+{
+ if(!fake)if(Hlpyofst>0)Hlpyofst-=40;else Hlpyofst=0;
+ else if(Hlpyofst<400)Hlpyofst+=40;else Hlpyofst=400,hshl=0;
+ if(Helpslide>1)MenuFont->Render(30,80+Hlpyofst,HGETEXT_LEFT,"Last"),
+ HlpL->Render(0,85+Hlpyofst);
+ if(Helpslide<6)MenuFont->Render(770,80+Hlpyofst,HGETEXT_RIGHT,"Next"),
+ HlpR->Render(775,85+Hlpyofst);
+ if(Helpscroll==0)Helpspr->Render(0,100+Hlpyofst);
+ else
+ {
+ Helpspr->Render(Helpscroll,100+Hlpyofst);
+ if(Helpscroll>0)NHelpspr->Render(Helpscroll-800,100+Hlpyofst);
+ else NHelpspr->Render(Helpscroll+800,100+Hlpyofst);
+ if(Helpscroll>0)Helpscroll+=30;else Helpscroll-=30;
+ if(fabs(Helpscroll)>=800)
+ {
+ Helpscroll=0;Helpspr->SetTextureRect(0,400*(Helpslide-1),800,400);
+ }
+ }
+ if(fake)return;
+ if(Helpscroll==0)
+ {
+ if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT&&Helpslide>1)
+ {
+ --Helpslide;NHelpspr->SetTextureRect(0,400*(Helpslide-1),800,400);
+ Helpscroll=1;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&Helpslide<6)
+ {
+ ++Helpslide;NHelpspr->SetTextureRect(0,400*(Helpslide-1),800,400);
+ Helpscroll=-1;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)
+ {
+ Current_Position=0;mainMenu.Init(1000);hshl=1;
+ }
+ }
+}
+bool Foclost()
+{
+ if(Current_Position==1)pauseMenu.Init(-200);
+ return false;
+}
+bool FrameFunc()
+{
+ float dt=hge->Timer_GetDelta();
+ static float t=0.0f;
+ float tx,ty;
+ if (Current_Position==1&&hge->Input_GetKeyState(HGEK_ESCAPE))pauseMenu.Init(-200);
+ int MMR=-1,SMR=-1,OMR=-1,PPMR=-1,PMR=-1,RTTMR=-1,DMR=-1,CMR=-1,HSMR=-1,HSVMR=-1,HSDMR=-1;
+ if (mainMenu.isActive())MMR=mainMenu.Update();
+ if (startMenu.isActive())SMR=startMenu.Update();
+ if (optionMenu.isActive())OMR=optionMenu.Update();
+ if (playerPreferenceMenu.isActive())PPMR=playerPreferenceMenu.Update();
+ if (pauseMenu.isActive())PMR=pauseMenu.Update();
+ if (returnToTitleMenu.isActive())RTTMR=returnToTitleMenu.Update();
+ if (deathMenu.isActive())DMR=deathMenu.Update();
+ if (completeMenu.isActive())CMR=completeMenu.Update();
+ if (newHighScoreGUI.isActive())newHighScoreGUI.Update();
+ if (highScoreMenu.isActive())HSMR=highScoreMenu.Update();
+ if (highScoreViewMenu.isActive())HSVMR=highScoreViewMenu.Update();
+ if (highScoreDetailsMenu.isActive())HSDMR=highScoreDetailsMenu.Update();
+ if (Current_Position==0)
+ {
+ if(!mainMenu.isActive())return true;
+ if(~MMR)
+ {
+ switch(MMR)
+ {
+ case 0:Current_Position=3;startMenu.Init();mainMenu.Leave();break;
+ case 1:Current_Position=8;highScoreMenu.Init(-200);mainMenu.Leave();break;
+ case 2:
+ Current_Position=13;
+ optionMenu.Init(-200);
+ break;
+ case 3:
+ Current_Position=15;
+ Helpspr->SetTextureRect(0,0,800,400);
+ NHelpspr->SetTextureRect(0,400,800,400);
+ Helpslide=1;Hlpyofst=400;Helpscroll=0;
+ break;
+ case 4:
+ Credits->SetHotSpot(300,100);
+ CreditsRail->SetHotSpot(300,100);
+ creditsp=0;
+ Music_Init("./Resources/Music/BLR2_TR09.ogg");
+ lpst=lped=0;Music_Play();
+ creditfly=1200;creditacc=0;credstop=creddone=false;
+ Credits->SetTextureRect(0,0,600,200);
+ Current_Position=4;
+ mainMenu.Leave();
+ break;
+ case 5:break;
+ }
+ mainMenu.Leave();
+ return false;
+ }
+ }
+ if (Current_Position==3)
+ {
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)
+ {
+ startMenu.Leave();mainMenu.Init(800);Current_Position=0;
+ }
+ if(~SMR)
+ {
+ startMenu.Leave();
+ switch(SMR)
+ {
+ case 0:
+ playerpos.x=400,playerpos.y=400,playerrot=0;
+ frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
+ level=1,part=1;frms=0,averfps=0.0;bsscale=1;
+ if(bullet){free(bullet);bullet=NULL;}
+ towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
+ score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
+ lpst=4607901;lped=9215893;//Music_Play();
+ coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
+ Lock.Init(2);IfShowTip=true;lsc=0;
+ clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
+ FadeTip=false;memset(lasttip,0,sizeof(lasttip));
+ memset(tower,0,sizeof(tower));
+ Complete=false;
+ Current_Position=1;
+ Level1Part1();
+ IfCallLevel=true;
+ mode=1;
+ break;
+ case 1:
+ playerpos.x=400,playerpos.y=400,playerrot=0;
+ frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
+ level=-2,part=0;frms=0,averfps=0.0;bsscale=1;assetime=asts=0;
+ if(bullet){free(bullet);bullet=NULL;}
+ towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
+ score=0;Mult_Init();Music_Init("./Resources/Music/CanonTechno.ogg");
+ lpst=4607901;lped=9215893;Music_Play();
+ coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
+ Lock.Init(2);IfShowTip=true;lsc=0;
+ clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
+ FadeTip=false;memset(lasttip,0,sizeof(lasttip));
+ memset(tower,0,sizeof(tower));
+ Complete=false;
+ Current_Position=1;
+ IfCallLevel=true;
+ mode=2;
+ break;
+ case 2:
+ playerpos.x=400,playerpos.y=400,playerrot=0;
+ frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
+ level=1,part=1;frms=0,averfps=0.0;bsscale=1;
+ if(bullet){free(bullet);bullet=NULL;}
+ towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
+ score=0;Mult_Init();//Music_Init("./Resources/Music/CanonTechno.ogg");
+ lpst=4607901;lped=9215893;//Music_Play();
+ coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
+ Lock.Init(2);IfShowTip=true;lsc=0;
+ clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
+ FadeTip=false;memset(lasttip,0,sizeof(lasttip));
+ memset(tower,0,sizeof(tower));
+ Complete=false;
+ Current_Position=1;
+ Level1Part1();
+ IfCallLevel=true;
+ mode=3;
+ break;
+ }
+ return false;
+ }
+ }
+ if (Current_Position==5)
+ {
+ if(~DMR)
+ {
+ if(DMR==1)
+ {
+ IfCallLevel=true;
+ IfShowTip=true;
+ Current_Position=1;
+ score=-abs(score);
+ mult=1;multbat=1;multbrk=TenSeconds;
+ ++restarts;part=0;
+ clockrot=deltarot=0;
+ coll=towcnt=bulcnt=0;
+ DisableAllTower=DisablePlayer=false;
+ }
+ if(DMR==2)
+ {Current_Position=0;mainMenu.Init(-200);}
+ deathMenu.Leave();
+ return false;
+ }
+ }
+ if (Current_Position==6)
+ {
+ if(~CMR)
+ {
+ if(CMR==1)
+ {Current_Position=7;newHighScoreGUI.Init();}
+ if(CMR==2)
+ {Current_Position=0;mainMenu.Init(-200);}
+ completeMenu.Leave();
+ return false;
+ }
+ }
+ if (Current_Position==8)
+ {
+ if(~HSMR)
+ {
+ if(HSMR<=2)
+ {Current_Position=9;highScoreViewMenu.Init(-200,HSMR);}
+ if(HSMR==3)
+ {Current_Position=0;mainMenu.Init(-200);}
+ highScoreMenu.Leave();
+ return false;
+ }
+ }
+ if (Current_Position==9)
+ {
+ if(~HSVMR)
+ {
+ if(HSVMR<=highScoreViewMenu.GetViewCount()&&HSVMR)
+ {Current_Position=10;highScoreDetailsMenu.Init(-200,highScoreViewMenu.View(),HSVMR);}
+ if(HSVMR==6)
+ {Current_Position=8;highScoreMenu.Init(-200);}
+ if(HSVMR&&(HSVMR<=highScoreViewMenu.GetViewCount()||HSVMR==6))
+ highScoreViewMenu.Leave();
+ return false;
+ }
+ }
+ if (Current_Position==10)
+ {
+ if(~HSDMR)
+ {
+ highScoreViewMenu.Init(-200,highScoreDetailsMenu.View());
+ highScoreDetailsMenu.Leave();Current_Position=9;
+ return false;
+ }
+ }
+ if (Current_Position==11)
+ {
+ //I am cornered!!
+ if(!pauseMenu.isActive())Current_Position=1,DisableAllTower=DisablePlayer=0;
+ if(~PMR)
+ {
+ pauseMenu.Leave();
+ if(PMR==2)returnToTitleMenu.Init(-200),Current_Position=12;
+ else Music_Resume();
+ return false;
+ }
+ }
+ if (Current_Position==12)
+ {
+ if(~RTTMR)
+ {
+ returnToTitleMenu.Leave();
+ if(RTTMR==1)pauseMenu.Init(-200);
+ if(RTTMR==2)mainMenu.Init(-200),Current_Position=0;
+ }
+ }
+ if (Current_Position==13)
+ {
+ if(~OMR)
+ {
+ if(OMR==6||OMR==7)optionMenu.Leave();
+ if(OMR==6)
+ {
+ playerPreferenceMenu.Init(-200);
+ Current_Position=14;
+ }
+ if(OMR==7)
+ {
+ Options_Writeback();
+ mainMenu.Init(-200);
+ Current_Position=0;
+ }
+ return false;
+ }
+ }
+ if (Current_Position==14)
+ {
+ if(~PPMR)
+ {
+ if(PPMR==5)
+ {
+ if(AP_Update(plrspd,plrslospd,clrbns)<=10000)
+ optionMenu.Init(850),
+ Current_Position=13,
+ playerPreferenceMenu.Leave();
+ else playerPreferenceMenu.Shake();
+ }
+ return false;
+ }
+ }
+ t+=dt;
+ tx=50*cosf(t/60);
+ ty=50*sinf(t/60);
+ quad.v[0].tx=tx; quad.v[0].ty=ty;
+ quad.v[1].tx=tx+800/64; quad.v[1].ty=ty;
+ quad.v[2].tx=tx+800/64; quad.v[2].ty=ty+600/64;
+ quad.v[3].tx=tx; quad.v[3].ty=ty+600/64;
+ //Rendering***********************************************************************************
+ //Super Spliter!*****Super Spliter!*****Super Spliter!*****Super Spliter!*****Super Spliter!**
+ //******Super Spliter!*****Super Spliter!*****Super Spliter!*****Super Spliter!***************
+ hge->Gfx_BeginScene();
+#ifndef WIN32
+ hge->Gfx_SetTransform(0,0,0,yos,0,scale,scale);
+#else
+ hge->Gfx_SetTransform(0,0,0,0,0,scale,scale);
+#endif
+ for(int i=0;i<4;i++)quad.v[i].col=DBGColor;
+ hge->Gfx_Clear(SETA(DBGColor,0xFF));
+ if (skyactive)sky.Update(),sky.Render();
+ hge->Gfx_RenderQuad(&quad);
+ int bulinuse=0;
+ if (Current_Position==1||Current_Position==2||Current_Position==5||Current_Position==11||Current_Position==12)
+ {
+ //If we are at the main scene or tip scene(which towers and bullets should still appear..)
+ //Render towers, bullets and player.
+ if (Leaves.IsActive())Leaves.Update();
+ if (binter.active())binter.Update();
+ if (bdiff.active())bdiff.Update();
+ if (LE_Active)Leaf.Update();
+ shots=0;
+ dsmc=scminus=0;
+ Music_Update();
+ ProcessTower1();
+ ProcessTower2();
+ ProcessTower3();
+ ProcessTower4();
+ ProcessTower5();
+ ProcessTower6();
+ ProcessTower7();
+ ProcessTower8();
+ ProcessTower9();
+ ProcessLaser();
+ for (int i=1;i<=bulcnt;++i)
+ {
+ if(bullet[i].exist)++bulinuse;
+ switch (bullet[i].bullettype)
+ {
+ case 1:ProcessBullet1(i);break;
+ case 2:ProcessBullet2(i);break;
+ case 4:ProcessBullet4(i);break;
+ case 5:ProcessBullet5(i);break;
+ case 6:ProcessBullet6(i);break;
+ case 7:ProcessBullet7(i);break;
+ case 8:ProcessBullet8(i);break;
+ case 9:ProcessBullet9(i);break;
+ case 253:BulletDeath_Process(i);break;
+ case 254:SCEffect_Process(i);break;
+ case 255:ProcessBullet255(i);break;
+ }
+ }
+ if (Current_Position==1)CallLevels();
+ ProcessPlayer();
+ RefreshScore();
+ {
+ if (ATarg.visible)ATarg.TargFollowPlayer(),ATarg.TargRender();
+ }
+ {
+ if (BTarg.visible)BTarg.TargRender();
+ }
+ if (!DisablePlayer)--frameleft;
+ if (!LOWFPS)
+ {
+ if (playerspeed<playerfulspd)playerspeed+=playerfulspd/400;
+ if (playerslospeed<playerfulslospd)playerslospeed+=playerfulslospd/400;
+ }
+ else
+ {
+ if (playerspeed<playerfulspd)playerspeed+=playerfulspd/25;
+ if (playerslospeed<playerfulslospd)playerslospeed+=playerfulslospd/25;
+ }
+ }
+ if (frameleft==0&&Current_Position==1)
+ {
+ IfCallLevel=true;
+ ++part;
+ IfShowTip=true;
+ }
+ if(Current_Position==1&&shots)hge->Effect_PlayEx(snd,sfxvol/15.0,0,1,false);
+ if(mainMenu.isActive())mainMenu.Render();
+ if(startMenu.isActive())startMenu.Render();
+ if(optionMenu.isActive())optionMenu.Render();
+ if(playerPreferenceMenu.isActive())playerPreferenceMenu.Render();
+ if(pauseMenu.isActive())pauseMenu.Render();
+ if(returnToTitleMenu.isActive())returnToTitleMenu.Render();
+ if(deathMenu.isActive())deathMenu.Render();
+ if(completeMenu.isActive())completeMenu.Render();
+ if(newHighScoreGUI.isActive())newHighScoreGUI.Render();
+ if(highScoreMenu.isActive())highScoreMenu.Render();
+ if(highScoreViewMenu.isActive())highScoreViewMenu.Render();
+ if(highScoreDetailsMenu.isActive())highScoreDetailsMenu.Render();
+ if(Current_Position==15)HelpScene();if(hshl)HelpScene(1);
+ if(Current_Position==0||Current_Position==3||Current_Position==8||
+ Current_Position==9||Current_Position==10||Current_Position==13||Current_Position==14)
+ {
+ titlespr->Render(160,0);
+ }
+ if (Current_Position==2)ShowTip(lasttip);
+ if (Current_Position==4)AboutScene();
+ fnt->SetColor(0xFFFFFFFF);
+ rbPanelFont.UpdateString(L" FPS: %.2f",hge->Timer_GetFPSf());
+ rbPanelFont.Render(785,595,0xFFFFFFFF,1);
+ if (Current_Position==1||Current_Position==2)
+ {
+ rbPanelFont.UpdateString(L"AF: %.2f",averfps);
+ rbPanelFont.Render(785,575,0xFFFFFFFF,1);
+ if (playerpos.x<220&&playerpos.y<200)
+ {
+ if (!LOWFPS&&infofade>=0x33)--infofade;
+ if (LOWFPS&&infofade>0x33)infofade-=16;
+ }
+ else
+ {
+ if (!LOWFPS&&infofade<0xFF)++infofade;
+ if (LOWFPS&&infofade<=0xEF)infofade+=16;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_A)==HGEKST_HIT)showdebug^=1;
+ if(showdebug)
+ {
+ fnt->SetColor(0xFFFFFFFF);
+ fnt->printf(795, 0, HGETEXT_RIGHT, "Allocated bullets %d",bulcnt);
+ fnt->printf(795, 25, HGETEXT_RIGHT, bulcnt?"%d in use (%.2f%%)":"%d in use (?%)",bulinuse,(double)bulinuse/bulcnt);
+ fnt->printf(795, 50, HGETEXT_RIGHT, "Player pos (%.2f,%.2f)",playerpos.x,playerpos.y);
+ }
+ fnt->SetColor(SETA(0xFFFFFF,infofade));
+ fnt->printf(5, 0, HGETEXT_LEFT, "Frames to go: %d",frameleft);
+ fnt->printf(5, 25, HGETEXT_LEFT, "Score: %lld",score);
+ fnt->printf(5, 50, HGETEXT_LEFT, "Level %d",level);
+ if (mode==3)
+ fnt->printf(5, 75, HGETEXT_LEFT, "Collisions: %d",coll);
+ else if (mode==2)
+ fnt->printf(5, 75, HGETEXT_LEFT, "Elapsed Time: %.2lf",assetime);
+ else
+ fnt->printf(5, 75, HGETEXT_LEFT, "Restarts: %d",restarts);
+ fnt->printf(5, 100, HGETEXT_LEFT, "Semi-Collisions: %d",semicoll);
+ if(mode==2)
+ fnt->printf(5, 125, HGETEXT_LEFT, "Multiplier: %.2lf",mult);
+ else
+ {
+ fnt->printf(5, 125, HGETEXT_LEFT, "Clear Range Left: %d",clrtime+clrbns);
+ fnt->printf(5, 150, HGETEXT_LEFT, "Multiplier: %.2lf",mult);
+ }
+ }
+ hge->Gfx_EndScene();
+ if(hge->Input_GetKeyStateEx(HGEK_S)==HGEKST_HIT&&Current_Position!=7)hge->System_Snapshot();
+ return false;
+}
+void printHelp(char *exec,const char* str="")
+{
+ printf("Usage: %s [options]...\n",exec);
+ puts("To run the game normally, just start without arguments.");
+ puts("Options:");
+ puts("--help Print this help and exit.");
+ puts("--version Print version and exit.");
+ puts("--start=x,y Start free play mode directly from level x part y. The part must be valid.");
+ puts("--nosound Forcibly use no sound.");
+ puts("--fullscreen=1/0 Forcibly use fullscreen/windowed. This will override your configuration.");
+ puts("--vidmode=0~4 Forcibly use specific video mode instead the one in the configuration.");
+ puts(" 0 800x600 (native resolution)");
+ puts(" 1 640x480");
+ puts(" 2 960x720");
+ puts(" 3 1024x768");
+ puts(" 4 1280x960");
+ puts("--firststartup Forcibly run first start up. The score file will be preserved if exist.");
+ puts("--fast Fast mode. All levels are two times shorter.");
+ puts("--logfile=... Use an alternate log file name instead of the default \"BLRLOG.txt\".");
+#ifdef WIN32
+ puts("--nohideconsole Do not hide console.\n");
+#endif
+ if(strcmp(str,""))printf("%s\n",str);
+ exit(0);
+}
+void parseArgs(int argc,char *argv[])
+{
+ for(int i=1;i<argc;++i)
+ {
+ if(!strcmp(argv[i],"--help"))printHelp(argv[0]);
+ if(!strcmp(argv[i],"--version"))
+ {
+ printf("Bullet Lab Remix II %s\n",BLRVERSION);
+ printf("Built Date: %s\n",BuiltDate);
+ exit(0);
+ }
+ bool valid=false;
+ if(!strcmp(argv[i],"--nosound"))fNoSound=true,valid=true;
+ if(!strcmp(argv[i],"--fast"))fFast=true,valid=true;
+ if(!strcmp(argv[i],"--firststartup"))fFristStartUp=true,valid=true;
+ if(!strncmp(argv[i],"--fullscreen",12))
+ {
+ char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
+ if(!*ptr)printHelp(argv[0],"--fullscreen need a parameter!\n");
+ ++ptr;
+ int para=strtol(ptr,&ptr,10);
+ if(*ptr||(para!=1&&para!=0))printHelp(argv[0],"Invalid parameter for --fullscreen!\n");
+ if(para)fFullScreen=2;else fFullScreen=1;
+ valid=true;
+ }
+ if(!strncmp(argv[i],"--vidmode",9))
+ {
+ char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
+ if(!*ptr)printHelp(argv[0],"--vidmode need a parameter!\n");
+ ++ptr;
+ int para=strtol(ptr,&ptr,10);
+ if(*ptr||(para<0||para>4))printHelp(argv[0],"Invalid parameter for --vidmode!\n");
+ if(para)VidMode=para;
+ valid=true;
+ }
+ if(!strncmp(argv[i],"--start",7))
+ {
+ char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
+ if(!*ptr)printHelp(argv[0],"--start need two parameters!");
+ ++ptr;startLvl=strtol(ptr,&ptr,10);
+ if(*ptr!=',')printHelp(argv[0],"Invalid parameter for --start!\n");
+ ++ptr;startPrt=strtol(ptr,&ptr,10);
+ if(*ptr)printHelp(argv[0],"Invalid parameter for --start!\n");
+ valid=true;
+ }
+ if(!strncmp(argv[i],"--logfile",9))
+ {
+ char *ptr=argv[i];while(*ptr!='='&&*ptr)++ptr;
+ if(!*ptr)printHelp(argv[0],"--logfile need a parameter!");
+ ++ptr;strcpy(alterLog,ptr);
+ valid=true;
+ }
+#ifdef WIN32
+ if(!strncmp(argv[i],"--nohideconsole",15))noHideConsole=true,valid=true;
+#endif
+ if(!valid)
+ {
+ char err[256];sprintf(err,"Unknown option: %s\n",argv[i]);
+ printHelp(argv[0],err);
+ }
+ }
+}
+int main(int argc,char *argv[])
+{
+ signal(SIGSEGV,SigHandler);
+ parseArgs(argc,argv);
+#ifdef WIN32
+ if(!noHideConsole)FreeConsole();
+#endif
+ srand(time(NULL));
+ hge=hgeCreate(HGE_VERSION);
+ if(alterLog[0])
+ hge->System_SetState(HGE_LOGFILE, alterLog);
+ else
+ hge->System_SetState(HGE_LOGFILE, "BLRLOG.txt");
+ hge->System_Log("%s: Bullet Lab Remix Log File",MAIN_SRC_FN);
+#ifdef WIN32
+#ifdef MINGW_BUILD
+ hge->System_Log("%s: Build: MinGW_w64 cross build",MAIN_SRC_FN);
+#else
+ hge->System_Log("%s: Build: Win32 build",MAIN_SRC_FN);
+#endif
+#else
+ hge->System_Log("%s: Build: Unix build",MAIN_SRC_FN);
+#endif
+ hge->System_Log("%s: Version: %s",MAIN_SRC_FN,BLRVERSION);
+ hge->System_Log("%s: Built Date: %s",MAIN_SRC_FN,BuiltDate);
+#ifdef WIN32
+ if (_mkdir("./Resources")!=0||_mkdir("./Resources/Music")!=0)
+ Error("Cannot decompress resources!\nDetailed Information: An error occured while creating folder.\n\nTry restarting the game.");
+ hge->System_Log("%s: Folders created successfully.",MAIN_SRC_FN);
+ Expand("BLRData.dtp","Resources");
+ Expand("BLRMusic.dtp","Resources/Music");
+ hge->System_Log("%s: Resources decompressed successfully.",MAIN_SRC_FN);
+#endif
+ hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
+ hge->System_SetState(HGE_FOCUSLOSTFUNC, Foclost);
+ hge->System_SetState(HGE_DONTSUSPEND, true);
+ hge->System_SetState(HGE_TITLE, "Bullet Lab Remix");
+ hge->System_SetState(HGE_WINDOWED, true);
+ hge->System_SetState(HGE_SCREENWIDTH, 800);
+ hge->System_SetState(HGE_SCREENHEIGHT, 600);
+ hge->System_SetState(HGE_SCREENBPP, 32);
+ if(fNoSound)hge->System_SetState(HGE_USESOUND,false);
+#ifdef WIN32
+ hge->System_SetState(HGE_ICON, MAKEINTRESOURCE(1));
+#endif
+ if((access(".blrrc",R_OK))==-1)
+ {
+ hge->System_Log("%s: Config file not found. Calling first startup.",MAIN_SRC_FN);
+ firststartup();
+ }
+ if(fFristStartUp)firststartup();
+ hge->System_Log("%s: Loading config file",MAIN_SRC_FN);
+ freopen(".blrrc","r",stdin);
+ char tch=getchar();
+ if (tch!=';'){}
+ tch=getchar();
+ if (tch!='C'){}
+ tch=getchar();
+ if (tch!='B'){}
+ tch=getchar();
+ if (tch!='L'){}
+ fpslvl=0;
+ LOWFPS=true;//always LowFPS, deprecate 1000 FPS mode...
+ hge->System_SetState(HGE_FPS,61);
+ tch=getchar();//VSync
+ if (tch==1)
+ {
+ hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
+ fpslvl=2;
+ }
+ if(fFast)TenSeconds/=2,TwentySeconds/=2,ThirtySeconds/=2,AMinute/=2;
+ tch=getchar();//FULLSCRREEN
+ tfs=false;
+ if (tch==1)
+ hge->System_SetState(HGE_WINDOWED, false),tfs=true;
+ if(fFullScreen==2)hge->System_SetState(HGE_WINDOWED, false),tfs=true;
+ if(fFullScreen==1)hge->System_SetState(HGE_WINDOWED, true),tfs=false;
+ tch=getchar();//resolution
+ if(VidMode==-1)VidMode=tch;
+ switch(VidMode)
+ {
+ case 0:break;
+ case 1:
+ hge->System_SetState(HGE_SCREENWIDTH, 640);
+ hge->System_SetState(HGE_SCREENHEIGHT, 480);
+ break;
+ case 2:
+ hge->System_SetState(HGE_SCREENWIDTH, 960);
+ hge->System_SetState(HGE_SCREENHEIGHT, 720);
+ break;
+ case 3:
+ hge->System_SetState(HGE_SCREENWIDTH, 1024);
+ hge->System_SetState(HGE_SCREENHEIGHT, 768);
+ break;
+ case 4:
+ hge->System_SetState(HGE_SCREENWIDTH, 1280);
+ hge->System_SetState(HGE_SCREENHEIGHT, 960);
+ break;
+ }
+ scale=VidMode?VidMode==1?0.8:VidMode==2?1.2:VidMode==3?1.28:VidMode==4?1.6:0:1;
+#ifndef WIN32
+ yos=VidMode?VidMode==1?120:VidMode==2?-120:VidMode==3?-168:VidMode==4?-360:0:0;
+#endif
+ tch=getchar();//Key binding
+ if (tch==1)diffkey=true;
+ bgmvol=getchar();sfxvol=getchar();
+ plrspd=tch=getchar();
+ playerfulspd=(tch)*0.08f;
+ playerspeed=playerfulspd;
+ plrslospd=tch=getchar();
+ playerfulslospd=(tch)*0.02f;
+ playerslospeed=playerfulslospd;
+ tch=getchar();
+ clrbns=tch;
+ tch=getchar();
+ clrmode=tch;
+ fclose(stdin);
+ if (AP_Update(plrspd,plrslospd,clrbns)>10000)Error("Invalid configuration!\nTry removing .blrrc and run the game again.");
+ hge->System_Log("%s: Loading Score file",MAIN_SRC_FN);
+ Score_Init();
+#ifdef Debug
+ playerspeed=playerfulspd=0.2;
+ playerslospeed=playerfulslospd=0.05;
+#endif
+ Current_Position=0;
+ LE_Active=false;
+ if(hge->System_Initiate())
+ {
+ hge->System_Log("%s: Loading Resources...",MAIN_SRC_FN);
+ quad.tex=hge->Texture_Load("./Resources/b_null.png");
+ SprSheet=hge->Texture_Load("./Resources/ss.png");
+ TLeaf=hge->Texture_Load("./Resources/e_leaf.png");
+ TSflake=hge->Texture_Load("./Resources/e_sflake.png");
+ TexTitle=hge->Texture_Load("./Resources/title.png");
+ TexCredits=hge->Texture_Load("./Resources/credits.png");
+ MenuTex=hge->Texture_Load("./Resources/menus.png");
+ HelpTex=hge->Texture_Load("./Resources/help.png");
+ sky.Init();
+ snd=hge->Effect_Load("./Resources/tap.ogg");
+ menumov=hge->Effect_Load("./Resources/tap.ogg");
+ menuin=hge->Effect_Load("./Resources/tap.ogg");
+ menuout=hge->Effect_Load("./Resources/tap.ogg");
+ if(!quad.tex||!SprSheet||!TexTitle||!TexCredits)
+ Error("Error Loading Resources!",true);
+ titlespr=new hgeSprite(TexTitle,0,0,640,320);
+ playerspr=new hgeSprite(SprSheet,0,24,24,24);
+ playerspr->SetHotSpot(12,12);
+ playerspr->SetColor(0xC0FFFFFF);
+ ATarg.Init(-0.001,vector2d(400,300));
+ BTarg.Init(-0.001,vector2d(400,300));
+ BTarg.targspr->SetColor(0xFFC00000);
+ quad.blend=BLEND_ALPHABLEND | BLEND_COLORMUL | BLEND_NOZWRITE;
+ DBGColor=0xFFFFFFFF;
+ for(int i=0;i<4;i++)
+ {
+ quad.v[i].z=0.5f;
+ quad.v[i].col=DBGColor;
+ }
+ quad.v[0].x=0; quad.v[0].y=0;
+ quad.v[1].x=800; quad.v[1].y=0;
+ quad.v[2].x=800; quad.v[2].y=600;
+ quad.v[3].x=0; quad.v[3].y=600;
+ hge->System_Log("%s: Loading Fonts...",MAIN_SRC_FN);
+#ifdef WIN32
+ if(!rbPanelFont.Init("C:/Windows/Fonts/cour.ttf",18))return 1;
+#else
+ if(!rbPanelFont.Init("/usr/share/fonts/truetype/freefont/FreeMono.ttf",18))
+ if(!rbPanelFont.Init("/usr/share/fonts/TTF/FreeMono.ttf",18))return 1;
+#endif
+ fnt=new hgeFont("./Resources/charmap.fnt");
+ MenuFont=new hgeFont("./Resources/charmap.fnt");
+ TipFont=new hgeFont("./Resources/charmap.fnt");
+ MultFnt=new hgeFont("./Resources/charmap.fnt");
+ vdig=new hgeFont("./Resources/vdig.fnt");
+ bdig=new hgeFont("./Resources/bdig.fnt");
+ fnt->SetScale(0.8);
+ MenuFont->SetScale(0.8);
+ TipFont->SetScale(0.8);
+ MultFnt->SetScale(0.8);
+ spr=new hgeSprite(SprSheet,216,0,24,24);
+ Credits=new hgeSprite(TexCredits,0,0,600,200);
+ CreditsRail=new hgeSprite(TexCredits,0,2400,600,200);
+ Helpspr=new hgeSprite(HelpTex,0,0,800,400);
+ NHelpspr=new hgeSprite(HelpTex,0,0,800,400);
+ HlpL=new hgeSprite(MenuTex,256,320,26,15);
+ HlpR=new hgeSprite(MenuTex,256,335,26,15);
+ for (int ii=0;ii<COLOR_COUNT;++ii)
+ {
+ TColors i=(TColors)ii;
+ TextureRect a=GetTextureRect(0,i);
+ bulletspr[i]=new hgeSprite(SprSheet,a.x,a.y,a.w,a.h);
+ bulletspr[i]->SetHotSpot(12,12);bulletspr[i]->SetColor(0x80FFFFFF);
+ }
+ for (int ii=0;ii<grey;++ii)
+ {
+ TColors i=(TColors)ii;
+ TextureRect a=GetTextureRect(1,i);
+ towerspr[i]=new hgeSprite(SprSheet,a.x,a.y,a.w,a.h);
+ towerspr[i]->SetHotSpot(22,22);bulletspr[i]->SetColor(0x80FFFFFF);
+ }
+ mainMenu.Init_Once();if(!startLvl)mainMenu.Init(-200);
+ startMenu.Init_Once();optionMenu.Init_Once();
+ pauseMenu.Init_Once();returnToTitleMenu.Init_Once();
+ deathMenu.Init_Once();completeMenu.Init_Once();
+ playerPreferenceMenu.Init_Once();highScoreMenu.Init_Once();
+ highScoreViewMenu.Init_Once();highScoreDetailsMenu.Init_Once();
+ if(fNoSound)hge->System_Log("%s: Sound is disabled.",MAIN_SRC_FN);
+ if(startLvl)
+ {
+ hge->System_Log("%s: Starting from Level%dPart%d",MAIN_SRC_FN,startLvl,startPrt);
+ playerpos.x=400,playerpos.y=400,playerrot=0;
+ frameleft=ThirtySeconds;infofade=0xFF;Dis8ref=t8special=false;
+ level=startLvl,part=startPrt;frms=0,averfps=0.0;bsscale=1;DBGColor=0xFF000000;
+ if(bullet){free(bullet);bullet=NULL;}
+ towcnt=bulcnt=0;whrcnt=12;skyactive=false;PlayerSplit=false;
+ score=0;Mult_Init();Music_Init("./Resources/Music/BLR2_TR07.ogg");
+ lpst=0;lped=0;Music_Play();
+ coll=semicoll=clrusg=0;playerLockX=playerLockY=false;
+ Lock.Init(2);IfShowTip=true;lsc=0;
+ clrrad=pi/2;clrrange=0;re.SetSeed(time(NULL));
+ memset(tower,0,sizeof(tower));
+ Complete=false;Current_Position=1;
+ IfCallLevel=true;
+ mode=3;
+ }
+ hge->System_Start();
+ delete titlespr;delete fnt;
+ delete playerspr;delete spr;
+ for (int ii=0;ii<COLOR_COUNT;++ii)
+ {
+ TColors i=(TColors)ii;
+ delete bulletspr[i];
+ if(i<grey)delete towerspr[i];
+ }
+ hge->Effect_Free(snd);hge->Effect_Free(menuin);
+ hge->Effect_Free(menuout);hge->Effect_Free(menumov);
+ hge->Texture_Free(SprSheet);hge->Texture_Free(TLeaf);
+ hge->Texture_Free(quad.tex);hge->Texture_Free(TSflake);
+ hge->Texture_Free(TexTitle);hge->Texture_Free(TexCredits);
+ if(bullet){free(bullet);bullet=NULL;}
+ }
+ hge->System_Shutdown();
+ hge->Release();
+#ifdef WIN32
+ for(int i=0;i<arFilecount;++i)remove(archive[i]);
+ _rmdir("./Resources/Music");
+ _rmdir("./Resources");
+#endif
+ return 0;
+}
diff --git a/archive/blr2/src/menus.h b/archive/blr2/src/menus.h
new file mode 100644
index 0000000..30d8b0a
--- /dev/null
+++ b/archive/blr2/src/menus.h
@@ -0,0 +1,1536 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Menu Implementations
+// Copyright Chrisoft 2014
+// The menu rewrite is almost complete...
+//static const char* MENUS_H_FN="menus.h";
+void TriggerSound(int type)
+{
+ switch(type)
+ {
+ case 0:hge->Effect_PlayEx(menumov,sfxvol/15.0,0,1,false);break;
+ case 1:hge->Effect_Play(menuin);break;
+ case 2:hge->Effect_Play(menuout);break;
+ }
+}
+void ConfigureQuad(hgeQuad *quad,double x,double y,double w,double h)
+{
+ quad->tex=0;quad->blend=BLEND_ALPHABLEND;
+ quad->v[0].tx=0;quad->v[0].ty=0;
+ quad->v[1].tx=1;quad->v[1].ty=0;
+ quad->v[2].tx=1;quad->v[2].ty=1;
+ quad->v[3].tx=0;quad->v[3].ty=1;
+ quad->v[0].x=x;quad->v[0].y=y;
+ quad->v[1].x=x+w;quad->v[1].y=y;
+ quad->v[2].x=x+w;quad->v[2].y=y+h;
+ quad->v[3].x=x;quad->v[3].y=y+h;
+}
+int AP_Update(int plrspd,int plrslospd,int clrbns)
+{
+ int res=0;
+ if (plrspd<=4)res+=plrspd*1200;else res+=5000;
+ switch (plrslospd)
+ {
+ case 1:res+=4000;break;
+ case 2:res+=3200;break;
+ case 3:res+=2000;break;
+ case 4:res+=1500;break;
+ case 5:res+=700;break;
+ }
+ switch (clrbns)
+ {
+ case 0:break;
+ case 1:res+=1500;break;
+ case 2:res+=2700;break;
+ case 3:res+=4000;break;
+ case 4:res+=5500;break;
+ }
+ return res;
+}
+void Options_Writeback()
+{
+ freopen(".blrrc","w",stdout);
+ printf(";CBL");
+ printf("%c",fpslvl==2?1:0);
+ printf("%c",tfs?1:0);
+ printf("%c",VidMode);
+ printf("%c",diffkey?1:0);
+ printf("%c%c",bgmvol,sfxvol);
+ printf("%c%c%c%c",plrspd,plrslospd,clrbns,clrmode);
+ fclose(stdout);
+}
+char *getRank()
+{
+ static char retval[256];
+ //sprintf something to retval
+ if(mode!=2)
+ {
+ if(level<=6)sprintf(retval,"Still need more effort!");
+ if(level<=3)sprintf(retval,"Try more...");
+ if(level==7)sprintf(retval,"You've done it!");
+ if(level==-1)sprintf(retval,"Why do you come to Earth?");
+ }
+ else
+ {
+ if(asts>900)sprintf(retval,"Contact me immediately!!");
+ if(asts<=900)sprintf(retval,"Perfect player.");
+ if(asts<=600)sprintf(retval,"That's awesome.");
+ if(asts<=450)sprintf(retval,"Not so bad...");
+ if(asts<=120)sprintf(retval,"Are you kidding?");
+ }
+ return retval;
+}
+static const char* MMStr[]={
+ "Start",
+ "Highscore",
+ "Options",
+ "Help",
+ "About",
+ "Exit"
+};
+static const char* OMStr[]={
+ "Fullscreen",
+ "VSync",
+ "Clear Range Key",
+ "Resolution",
+ "Music Volume",
+ "SFX Volume",
+ "Player Preference",
+ "Save and Exit",
+ "On",
+ "Off",
+ "X",
+ "Z",
+ "800x600",
+ "640x480",
+ "960x720",
+ "1024x768",
+ "1280x960",
+ "?"
+};
+static const char *PPMStr[]={
+ "Moving Speed",
+ "Precise Moving Speed",
+ "Clear Range Bonus",
+ "Clear Range Mode",
+ "Ability Point",
+ "Back",
+ "Expand",
+ "Rotate"
+};
+static const char *PMStr[]={
+ "Paused...",
+ "Return to Game",
+ "Return to Title"
+};
+static const char *RTTMStr[]={
+ "Really?",
+ "I've pressed the wrong key...",
+ "Do return to title!"
+};
+static const char *DMStr[]={
+ "Continue? You score will be set to minus!",
+ "Continue!",
+ "No thanks..."
+};
+static const char *CMStr[]={
+ "Keep this in your highscore record?",
+ "Yes",
+ "No thanks..."
+};
+static const char *HSMStr[]={
+ "Classic Mode",
+ "Assessment Mode",
+ "Free Play Mode",
+ "Back"
+};
+class MainMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ xoffset=start;onIn=true;active=true;
+ selected=0;dyoffset=yoffset=-selected*30;
+ ConfigureQuad(&UpperGradient,xoffset-140,250,320,100);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,420,320,110);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ if(DBGColor!=0xFF0A0A0A)
+ {
+ for(int i=0;i<6;++i)DBGColor=ColorTransfer(DBGColor,0xFF0A0A0A);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ if(onIn)
+ {
+ if(fabs(xoffset-650)<hge->Timer_GetDelta()*1600)return xoffset=650,onIn=false,-1;
+ if(xoffset<650)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,250,320,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,420,320,110);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<6-1)++selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)selected=5,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(selected==4?2:1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<6;++i)
+ {
+ double calcy=i*30+dyoffset+360;
+ if(calcy>249.9&&calcy<500.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,MMStr[i]);
+ }
+ Ribb->RenderEx(xoffset-50,355,0,3,1);
+ Ribb->RenderEx(xoffset-50,382,0,3,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ }
+}mainMenu;
+class StartMenu
+{
+private:
+ bool active,onIn,onOut;
+ double xoffset,yoffset,moffset;
+ int selected;
+ hgeQuad LeftGradient,RightGradient,LowerGradient;
+ hgeSprite *clzk,*azmt,*fpmd,*msel;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ clzk=new hgeSprite(MenuTex,0,0,256,128);
+ azmt=new hgeSprite(MenuTex,256,0,256,128);
+ fpmd=new hgeSprite(MenuTex,0,128,256,128);
+ msel=new hgeSprite(MenuTex,256,128,256,64);
+ clzk->SetHotSpot(128,64);
+ azmt->SetHotSpot(128,64);
+ fpmd->SetHotSpot(128,64);
+ }
+ void Init()
+ {
+ active=true;onIn=true;yoffset=275;
+ selected=0;xoffset=-selected*300;moffset=450;
+ ConfigureQuad(&LowerGradient,0,400+yoffset,800,120);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ ConfigureQuad(&LeftGradient,0,320+yoffset,100,200);
+ LeftGradient.v[0].col=LeftGradient.v[3].col=SETA(DBGColor,0xFF);
+ LeftGradient.v[1].col=LeftGradient.v[2].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&RightGradient,700,320+yoffset,100,200);
+ RightGradient.v[0].col=RightGradient.v[3].col=SETA(DBGColor,0x00);
+ RightGradient.v[1].col=RightGradient.v[2].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ LeftGradient.v[0].col=LeftGradient.v[3].col=SETA(DBGColor,0xFF);
+ LeftGradient.v[1].col=LeftGradient.v[2].col=SETA(DBGColor,0x00);
+ RightGradient.v[0].col=RightGradient.v[3].col=SETA(DBGColor,0x00);
+ RightGradient.v[1].col=RightGradient.v[2].col=SETA(DBGColor,0xFF);
+ if(onIn)
+ {
+ bool alldone=true;
+ if(fabs(yoffset-0)<hge->Timer_GetDelta()*800)
+ yoffset=0;
+ else
+ alldone=false,yoffset-=hge->Timer_GetDelta()*800;
+ if(fabs(moffset-0)<hge->Timer_GetDelta()*1200)
+ moffset=0;
+ else alldone=false,moffset-=hge->Timer_GetDelta()*1200;
+ if(alldone)onIn=false;
+ }
+ if(onOut)
+ {
+ bool alldone=true;
+ if(fabs(yoffset-275)<hge->Timer_GetDelta()*800)
+ yoffset=275;
+ else
+ alldone=false,yoffset+=hge->Timer_GetDelta()*800;
+ if(fabs(moffset-450)<hge->Timer_GetDelta()*1200)
+ moffset=450;
+ else alldone=false,moffset+=hge->Timer_GetDelta()*800;
+ if(alldone)onOut=active=false;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT&&selected>0)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&selected<3-1)++selected,TriggerSound(0);
+ if(fabs(xoffset-(-selected*300))<hge->Timer_GetDelta()*1000)
+ xoffset=-selected*300;
+ else
+ {
+ if(xoffset<-selected*300)xoffset+=hge->Timer_GetDelta()*1000;
+ if(xoffset>-selected*300)xoffset-=hge->Timer_GetDelta()*1000;
+ }
+ ConfigureQuad(&LowerGradient,0,400+yoffset,800,120);
+ ConfigureQuad(&LeftGradient,0,320+yoffset,100,200);
+ ConfigureQuad(&RightGradient,700,320+yoffset,100,200);
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)TriggerSound(2);
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ clzk->Render(400+xoffset,fabs((xoffset+0))*0.075+400+yoffset);
+ azmt->Render(700+xoffset,fabs((xoffset+300))*0.075+400+yoffset);
+ fpmd->Render(1000+xoffset,fabs((xoffset+600))*0.075+400+yoffset);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ hge->Gfx_RenderQuad(&LeftGradient);
+ hge->Gfx_RenderQuad(&RightGradient);
+ msel->Render(0,moffset+200);
+ }
+}startMenu;
+class OptionsMenu
+{
+private:
+ bool active,onIn,onOut,onSwitch,onSwitchi;
+ int selected;
+ double xoffset,yoffset,dyoffset,swoffset,moffset;
+ hgeSprite *Ribb,*optt;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ optt=new hgeSprite(MenuTex,256,192,256,64);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ xoffset=start;onIn=active=true;onSwitch=onSwitchi=false;
+ selected=0;dyoffset=yoffset=-selected*30;moffset=350;
+ ConfigureQuad(&UpperGradient,xoffset-140,250,500,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,430,500,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ if(onIn)
+ {
+ bool alldone=true;
+ if(fabs(xoffset-450)<hge->Timer_GetDelta()*1600)xoffset=450;else
+ {
+ alldone=false;
+ if(xoffset<450)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(fabs(moffset-0)<hge->Timer_GetDelta()*1200)
+ moffset=0;
+ else alldone=false,moffset-=hge->Timer_GetDelta()*1200;
+ if(alldone)return onIn=false,-1;
+ }
+ if(onOut)
+ {
+ bool alldone=true;
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset<850)alldone=false;
+ if(fabs(moffset-450)<hge->Timer_GetDelta()*1200)
+ moffset=450;
+ else alldone=false,moffset+=hge->Timer_GetDelta()*800;
+ if(alldone)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,250,500,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,430,500,100);
+ if(!onSwitch)
+ {
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<8-1)++selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)selected=7,TriggerSound(0);
+ }
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ {
+ if(selected==7&&!(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT))
+ return -1;
+ TriggerSound(selected==7?2:0);
+ if(onSwitch||onSwitchi)return -1;
+ if(selected<=5)
+ {
+ onSwitch=true;
+ swoffset=100;
+ }
+ if(selected==0)tfs=!tfs;
+ if(selected==1)
+ {
+ fpslvl=fpslvl==2?0:2;
+ if(fpslvl==2)hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
+ if(fpslvl==0)hge->System_SetState(HGE_FPS,61);
+ }
+ if(selected==2)diffkey=!diffkey;
+ if(selected==3)
+ {
+ ++VidMode;
+ if(VidMode>4)VidMode=0;
+ }
+ if(selected==4)
+ {
+ ++bgmvol;
+ if(bgmvol>15)bgmvol=0;
+ }
+ if(selected==5)
+ {
+ ++sfxvol;
+ if(sfxvol>15)sfxvol=0;
+ }
+ return selected;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT)
+ {
+ if(onSwitch||onSwitchi)return -1;
+ TriggerSound(0);
+ if(selected<=5){onSwitchi=true;swoffset=0;}
+ if(selected==0)tfs=!tfs;
+ if(selected==1)
+ {
+ fpslvl=fpslvl==2?0:2;
+ if(fpslvl==2)hge->System_SetState(HGE_FPS,HGEFPS_VSYNC);
+ if(fpslvl==0)hge->System_SetState(HGE_FPS,61);
+ }
+ if(selected==2)diffkey=!diffkey;
+ if(selected==3)
+ {
+ --VidMode;
+ if(VidMode<0)VidMode=4;
+ }
+ if(selected==4)
+ {
+ --bgmvol;
+ if(bgmvol<0)bgmvol=15;
+ }
+ if(selected==5)
+ {
+ --sfxvol;
+ if(sfxvol<0)sfxvol=15;
+ }
+ return selected;
+ }
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<8;++i)
+ {
+ double calcy=i*30+dyoffset+360;
+ if(calcy>249.9&&calcy<500.1)
+ {
+ MenuFont->SetColor(0xFFFFFFFF);
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,OMStr[i]);
+ if(i==0)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=0)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[tfs?8:9]);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?9:8]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?8:9]);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?8:9]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?9:8]);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==1)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=1)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?8:9]);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?9:8]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?8:9]);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?8:9]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?9:8]);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==2)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=2)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[diffkey?10:11]);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?11:10]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?10:11]);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?10:11]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?11:10]);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==3)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=3)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+12]:OMStr[17]);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode==0?16:VidMode+11]:OMStr[17]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+12]:OMStr[17]);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+12]:OMStr[17]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode==4?12:VidMode+13]:OMStr[17]);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==4)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=4)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,"%d",bgmvol);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",bgmvol==0?15:bgmvol-1);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",bgmvol);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",bgmvol);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",bgmvol==15?0:bgmvol+1);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==5)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=5)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,"%d",sfxvol);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",sfxvol==0?15:sfxvol-1);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",sfxvol);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",sfxvol);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",sfxvol==15?0:sfxvol+1);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ }
+ }
+ Ribb->RenderEx(xoffset-50,353,0,6,1);
+ Ribb->RenderEx(xoffset-50,380,0,6,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ optt->Render(300,moffset+300);
+ }
+}optionMenu;
+class PlayerPreferenceMenu
+{
+private:
+ bool active,onIn,onOut,onSwitch,onSwitchi;
+ int selected;
+ double xoffset,yoffset,dyoffset,swoffset,moffset;
+ double shaketime,shakeoffset,shakedelay;
+ hgeSprite *Ribb,*optt;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ optt=new hgeSprite(MenuTex,0,256,256,64);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ xoffset=start;onIn=active=true;onSwitch=onSwitchi=false;
+ selected=0;dyoffset=yoffset=-selected*30;moffset=350;shaketime=0;
+ ConfigureQuad(&UpperGradient,xoffset-140,250,520,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,430,520,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ void Shake(){shaketime=0.2;shakeoffset=10;shakedelay=0.033;}
+ int Update()
+ {
+ if(onIn)
+ {
+ bool alldone=true;
+ if(fabs(xoffset-430)<hge->Timer_GetDelta()*1600)xoffset=430;else
+ {
+ alldone=false;
+ if(xoffset<430)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(fabs(moffset-0)<hge->Timer_GetDelta()*1200)
+ moffset=0;
+ else alldone=false,moffset-=hge->Timer_GetDelta()*1200;
+ if(alldone)return onIn=false,-1;
+ }
+ if(onOut)
+ {
+ bool alldone=true;
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset<850)alldone=false;
+ if(fabs(moffset-450)<hge->Timer_GetDelta()*1200)
+ moffset=450;
+ else alldone=false,moffset+=hge->Timer_GetDelta()*800;
+ if(alldone)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,250,520,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,430,520,100);
+ if(!onSwitch)
+ {
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)
+ TriggerSound(0),--selected==4?--selected:0;
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<6-1)
+ TriggerSound(0),++selected==4?++selected:0;
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)TriggerSound(0),selected=5;
+ }
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT&&hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_RIGHT)==HGEKST_HIT)
+ {
+ TriggerSound(1);
+ if(onSwitch||onSwitchi)return -1;
+ if(selected<=3)
+ {
+ onSwitch=true;
+ swoffset=100;
+ }
+ if(selected==0)++plrspd>5?plrspd=1:0;
+ if(selected==1)++plrslospd>5?plrslospd=1:0;
+ if(selected==2)++clrbns>4?clrbns=0:0;
+ if(selected==3)clrmode=!clrmode;
+ if(selected<=3)return selected;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_LEFT)==HGEKST_HIT)
+ {
+ TriggerSound(1);
+ if(onSwitch||onSwitchi)return -1;
+ if(selected<=3){onSwitchi=true;swoffset=0;}
+ if(selected==0)--plrspd<1?plrspd=5:0;
+ if(selected==1)--plrslospd<1?plrslospd=5:0;
+ if(selected==2)--clrbns<0?clrbns=4:0;
+ if(selected==3)clrmode=!clrmode;
+ if(selected<=3)return selected;
+ }
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(selected==5?2:1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<6;++i)
+ {
+ double calcy=i*30+dyoffset+360;
+ if(calcy>249.9&&calcy<500.1)
+ {
+ MenuFont->SetColor(0xFFFFFFFF);
+ MenuFont->printf(xoffset-50,calcy,HGETEXT_LEFT,PPMStr[i]);
+ if(i==0)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=0)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,"%d",plrspd);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",plrspd==1?5:plrspd-1);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",plrspd);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",plrspd);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",plrspd==5?1:plrspd+1);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==1)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=1)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,"%d",plrslospd);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",plrslospd==1?5:plrslospd-1);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",plrslospd);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",plrslospd);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",plrslospd==5?1:plrslospd+1);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==2)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=2)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,"%d",clrbns);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",clrbns==0?4:clrbns-1);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",clrbns);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,"%d",clrbns);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,"%d",clrbns==4?0:clrbns+1);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==3)
+ {
+ if(!(onSwitch||onSwitchi)||selected!=3)
+ MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,PPMStr[clrmode?7:6]);
+ else
+ {
+ if(onSwitch)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,PPMStr[clrmode?6:7]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,PPMStr[clrmode?7:6]);
+ swoffset-=hge->Timer_GetDelta()*400;
+ if(swoffset<0)swoffset=0,onSwitch=false;
+ }
+ if(onSwitchi)
+ {
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+100+swoffset,calcy,HGETEXT_LEFT,PPMStr[clrmode?7:6]);
+ MenuFont->SetColor(SETA(0xFFFFFF,255.0f-255.0f*(swoffset/100.0f)));
+ MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,PPMStr[clrmode?6:7]);
+ swoffset+=hge->Timer_GetDelta()*400;
+ if(swoffset>100)swoffset=0,onSwitchi=false;
+ }
+ }
+ }
+ if(i==4)
+ {
+ if(shaketime>0)
+ {
+ shaketime-=hge->Timer_GetDelta();
+ shakedelay-=hge->Timer_GetDelta();
+ if(shakedelay<0)
+ {shakeoffset=-shakeoffset;shakedelay=0.033;}
+ if(shaketime<=0)shaketime=shakeoffset=0;
+ }
+ MenuFont->printf(xoffset+200+shakeoffset,calcy,HGETEXT_LEFT,"%d/10000",AP_Update(plrspd,plrslospd,clrbns));
+ }
+ }
+ }
+ Ribb->RenderEx(xoffset-80,355,0,7,1);
+ Ribb->RenderEx(xoffset-80,382,0,7,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ optt->Render(125,moffset+300);
+ }
+}playerPreferenceMenu;
+class PauseMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ //special things to do..
+ Music_Pause();
+ Current_Position=11;
+ DisableAllTower=DisablePlayer=true;
+ xoffset=start;onIn=true;active=true;
+ selected=1;dyoffset=yoffset=-selected*30;
+ ConfigureQuad(&UpperGradient,xoffset-140,190,320,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,340,320,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){if(!onIn)onOut=true;}
+ int Update()
+ {
+ if(onIn)
+ {
+ if(fabs(xoffset-350)<hge->Timer_GetDelta()*1600)return xoffset=350,onIn=false,-1;
+ if(xoffset<350)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)
+ {
+ active=onOut=false;
+ if(selected==1)Current_Position=1,DisableAllTower=DisablePlayer=false;
+ return -1;
+ }
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,190,320,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,340,320,110);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>1)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<3-1)++selected,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(1),selected;
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT&&!onIn)return TriggerSound(1),1;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<3;++i)
+ {
+ double calcy=i*30+dyoffset+300;
+ if(calcy>189.9&&calcy<440.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,PMStr[i]);
+ }
+ Ribb->RenderEx(xoffset-50,295,0,4,1);
+ Ribb->RenderEx(xoffset-50,322,0,4,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ }
+}pauseMenu;
+class ReturnToTitleMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ xoffset=start;onIn=true;active=true;
+ selected=1;dyoffset=yoffset=-selected*30;
+ ConfigureQuad(&UpperGradient,xoffset-140,190,320,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,340,320,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ //The background color is likely on a change here...
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ if(onIn)
+ {
+ if(fabs(xoffset-350)<hge->Timer_GetDelta()*1600)return xoffset=350,onIn=false,-1;
+ if(xoffset<350)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,190,320,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,340,320,110);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>1)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<3-1)++selected,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<3;++i)
+ {
+ double calcy=i*30+dyoffset+300;
+ if(calcy>189.9&&calcy<440.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,RTTMStr[i]);
+ }
+ Ribb->RenderEx(xoffset-50,295,0,6.5,1);
+ Ribb->RenderEx(xoffset-50,322,0,6.5,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ }
+}returnToTitleMenu;
+class DeathMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb,*DeathTitle;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ DeathTitle=new hgeSprite(MenuTex,256,256,256,64);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ //Magical things, again...
+ Current_Position=5;Music_Stop();
+ DisableAllTower=true;DisablePlayer=true;
+ xoffset=start;onIn=true;active=true;
+ selected=1;dyoffset=yoffset=-selected*30;
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ //The background color is likely on a change here...
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ if(onIn)
+ {
+ if(fabs(xoffset-300)<hge->Timer_GetDelta()*1600)return xoffset=300,onIn=false,-1;
+ if(xoffset<300)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,110);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>1)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<3-1)++selected,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<3;++i)
+ {
+ double calcy=i*30+dyoffset+400;
+ if(calcy>289.9&&calcy<540.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,DMStr[i]);
+ }
+ Ribb->RenderEx(xoffset-50,395,0,3.75,1);
+ Ribb->RenderEx(xoffset-50,422,0,3.75,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ MenuFont->printf(xoffset-100,250,HGETEXT_LEFT,"You scored %lld at level %d",score,level);
+ MenuFont->printf(xoffset-100,280,HGETEXT_LEFT,"Average FPS: %lf\n",averfps);
+ DeathTitle->Render(xoffset-200,200);
+ }
+}deathMenu;
+class CompleteMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb,*CompleteTitle;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ CompleteTitle=new hgeSprite(MenuTex,0,320,256,64);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ //Magical things, again...
+ Current_Position=6;Music_Stop();
+ DisableAllTower=true;DisablePlayer=true;
+ xoffset=start;onIn=true;active=true;
+ selected=1;dyoffset=yoffset=-selected*30;
+ ConfigureQuad(&UpperGradient,xoffset-140,390,600,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,540,600,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ //The background color is likely on a change here...
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ if(onIn)
+ {
+ if(fabs(xoffset-300)<hge->Timer_GetDelta()*1600)return xoffset=300,onIn=false,-1;
+ if(xoffset<300)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,390,600,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,540,600,110);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>1)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<3-1)++selected,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<3;++i)
+ {
+ double calcy=i*30+dyoffset+500;
+ if(calcy>389.9&&calcy<640.1)
+ MenuFont->printf(xoffset-100,calcy,HGETEXT_LEFT,CMStr[i]);
+ }
+ Ribb->RenderEx(xoffset-150,495,0,3.75,1);
+ Ribb->RenderEx(xoffset-150,522,0,3.75,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ if(~CheckHighScore())
+ MenuFont->printf(xoffset-100,250,HGETEXT_LEFT,"New Highscore %lld!",score);
+ else
+ MenuFont->printf(xoffset-100,250,HGETEXT_LEFT,"Score %lld",score);
+ MenuFont->printf(xoffset-100,280,HGETEXT_LEFT,"Your Ranking: %s",getRank());
+ if(mode==2)
+ {
+ MenuFont->printf(xoffset-100,310,HGETEXT_LEFT,"Time elapsed: %.2fs",((int)(asts*100))/100.0);
+ MenuFont->printf(xoffset-100,340,HGETEXT_LEFT,"Semi-collisions %d",semicoll);
+ MenuFont->printf(xoffset-100,370,HGETEXT_LEFT,"Average FPS: %.2f",averfps);
+ }
+ else
+ {
+ if(mode==1)
+ MenuFont->printf(xoffset-100,310,HGETEXT_LEFT,"Restarts %d",restarts);
+ else
+ MenuFont->printf(xoffset-100,310,HGETEXT_LEFT,"Collisions %d",coll);
+ MenuFont->printf(xoffset-100,340,HGETEXT_LEFT,"Semi-collisions %d",semicoll);
+ MenuFont->printf(xoffset-100,370,HGETEXT_LEFT,"CLR Usage %d",clrusg);
+ MenuFont->printf(xoffset-100,400,HGETEXT_LEFT,"Average FPS: %.2f",averfps);
+ }
+ CompleteTitle->Render(xoffset-200,200);
+ }
+}completeMenu;
+class NewHighScoreGUI
+{
+private:
+ bool active,onIn,onOut,toogleundl;
+ double xoffset;
+ void nameins(char a)
+ {
+ if (newlen<=14)
+ newname[newlen++]=a;
+ }
+ void namedel()
+ {
+ if (newlen>0)newname[--newlen]=0;
+ }
+public:
+ bool isActive(){return active;}
+ void Init()
+ {
+ Current_Position=7;active=true;
+ memset(newname,0,sizeof(newname));newlen=0;tbframebrk=0;toogleundl=false;
+ TipFont->SetColor(0xFFFFFFFF);xoffset=-500;onIn=true;onOut=false;
+ }
+ void Leave(){onOut=true;}
+ void Update()
+ {
+ if(onIn)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>0)xoffset=0,onIn=false;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>650)onOut=active=false;
+ }
+ int key=hge->Input_GetKey();
+ if (key>=0x30&&key<=0x39)nameins('0'+key-0x30);
+ #ifdef WIN32
+ if (key>=0x41&&key<=0x5A)
+ if (GetKeyState(VK_CAPITAL)&1)nameins('A'+key-0x41);else nameins('a'+key-0x41);
+ #else
+ if (key>=0x41&&key<=0x5A)
+ nameins('A'+key-0x41);
+ #endif
+ if (key==HGEK_SPACE)nameins('_');
+ if (key==HGEK_BACKSPACE)namedel();
+ if (key==HGEK_ENTER)
+ {
+ TriggerSound(1);
+ InsertHighScore();Leave();
+ Current_Position=0;mainMenu.Init(-200);
+ /*switch (mode)
+ {
+ case 4:view=1;HSViewGUI_Init();break;
+ case 1:view=2;HSViewGUI_Init();break;
+ case 2:view=3;HSViewGUI_Init();break;
+ case 3:view=4;HSViewGUI_Init();break;
+ }*/
+ }
+ }
+ void Render()
+ {
+ if (LOWFPS)tbframebrk+=17;else ++tbframebrk;
+ if (tbframebrk>=500)toogleundl=!toogleundl,tbframebrk=0;
+ TipFont->printf(200+xoffset,200,HGETEXT_LEFT,"Please Enter Your Honorable Name...");
+ if (!toogleundl)
+ TipFont->printf(200+xoffset,240,HGETEXT_LEFT,"%s",newname);
+ else
+ TipFont->printf(200+xoffset,240,HGETEXT_LEFT,"%s_",newname);
+ }
+}newHighScoreGUI;
+class HighScoreMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb,*HSTitle;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ HSTitle=new hgeSprite(MenuTex,0,376,256,64);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start)
+ {
+ xoffset=start;onIn=true;active=true;
+ selected=0;dyoffset=yoffset=-selected*30;
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,100);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ if(onIn)
+ {
+ if(fabs(xoffset-500)<hge->Timer_GetDelta()*1600)return xoffset=500,onIn=false,-1;
+ if(xoffset<500)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,110);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<4-1)++selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)selected=4-1,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(selected==4-1?2:1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ for(int i=0;i<4;++i)
+ {
+ double calcy=i*30+dyoffset+400;
+ if(calcy>289.9&&calcy<540.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,HSMStr[i]);
+ }
+ Ribb->RenderEx(xoffset-50,395,0,4.5,1);
+ Ribb->RenderEx(xoffset-50,422,0,4.5,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ HSTitle->Render(xoffset-250,300);
+ }
+}highScoreMenu;
+class HighScoreViewMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected,view;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ int View(){return view;}
+ int GetViewCount(){return view==0?Ncnt:view==1?Excnt:view==2?FPMcnt:0;}
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start,int _v)
+ {
+ xoffset=start;onIn=true;active=true;
+ selected=1;dyoffset=yoffset=-selected*30;view=_v;
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,120);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ if(onIn)
+ {
+ if(fabs(xoffset-400)<hge->Timer_GetDelta()*1600)return xoffset=400,onIn=false,-1;
+ if(xoffset<400)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,120);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>1)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<7-1)++selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)selected=7-1,TriggerSound(0);
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(selected==7-1?2:1),selected;
+ return -1;
+ }
+ void Render()
+ {
+ if(dyoffset+400>289.9)
+ MenuFont->printf(xoffset,dyoffset+400,HGETEXT_LEFT,"Highscore - %s",HSMStr[view]);
+#define WrapCnt \
+ (view==0?Ncnt:view==1?Excnt:view==2?FPMcnt:0)
+#define WrapRec\
+ (view==0?NRec:view==1?ExRec:view==2?FPMRec:FPMRec)
+ for(unsigned i=1;i<=5;++i)
+ {
+ double calcy=i*30+dyoffset+400;
+ if(calcy>289.9&&calcy<540.1)
+ {
+ if(i<=WrapCnt)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,"%u. %s - %lld",i,WrapRec[i].name,WrapRec[i].score);
+ else MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,"%u. ----------",i);
+ }
+ }
+ double calcy=6*30+dyoffset+400;
+ if(calcy>289.9&&calcy<540.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,"back");
+ Ribb->RenderEx(xoffset-50,395,0,7,1);
+ Ribb->RenderEx(xoffset-50,422,0,7,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ }
+}highScoreViewMenu;
+class HighScoreDetailsMenu
+{
+private:
+ bool active,onIn,onOut;
+ int selected,view,no;
+ double xoffset,yoffset,dyoffset;
+ hgeSprite *Ribb,*HSTitle;
+ hgeQuad UpperGradient,LowerGradient;
+public:
+ int View(){return view;}
+ bool isActive(){return active;}
+ void Init_Once()
+ {
+ Ribb=new hgeSprite(MenuTex,256,350,64,16);
+ HSTitle=new hgeSprite(MenuTex,0,448,256,64);
+ Ribb->SetColor(0xCCFFFFFF);
+ }
+ void Init(double start,int _v,int _n)
+ {
+ xoffset=start;onIn=true;active=true;no=_n;
+ selected=0;dyoffset=yoffset=-selected*30;view=_v;
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,50);
+ UpperGradient.v[0].col=UpperGradient.v[1].col=SETA(DBGColor,0xFF);
+ UpperGradient.v[2].col=UpperGradient.v[3].col=SETA(DBGColor,0x00);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,130);
+ LowerGradient.v[0].col=LowerGradient.v[1].col=SETA(DBGColor,0x00);
+ LowerGradient.v[2].col=LowerGradient.v[3].col=SETA(DBGColor,0xFF);
+ }
+ void Leave(){onOut=true;}
+ int Update()
+ {
+ if(onIn)
+ {
+ if(fabs(xoffset-400)<hge->Timer_GetDelta()*1600)return xoffset=400,onIn=false,-1;
+ if(xoffset<400)
+ xoffset+=hge->Timer_GetDelta()*1600;
+ else
+ xoffset-=hge->Timer_GetDelta()*1600;
+ }
+ if(onOut)
+ {
+ xoffset+=hge->Timer_GetDelta()*1600;
+ if(xoffset>=850)active=onOut=false;
+ }
+ ConfigureQuad(&UpperGradient,xoffset-140,290,600,100);
+ ConfigureQuad(&LowerGradient,xoffset-140,440,600,130);
+ if(hge->Input_GetKeyStateEx(HGEK_UP)==HGEKST_HIT&&selected>0)--selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_DOWN)==HGEKST_HIT&&selected<(view==1?6:7)-1)++selected,TriggerSound(0);
+ if(hge->Input_GetKeyStateEx(HGEK_ESCAPE)==HGEKST_HIT)TriggerSound(0),selected=(view==1?6:7)-1;
+ yoffset=-selected*30;
+ if(fabs(dyoffset-yoffset)<7)dyoffset=yoffset;
+ if(dyoffset<yoffset)dyoffset+=hge->Timer_GetDelta()*400;
+ if(dyoffset>yoffset)dyoffset-=hge->Timer_GetDelta()*400;
+ if(onIn||onOut)return -1;
+ if(hge->Input_GetKeyStateEx(HGEK_Z)==HGEKST_HIT||hge->Input_GetKeyStateEx(HGEK_ENTER)==HGEKST_HIT)
+ return TriggerSound(selected==(view==1?5:7)-1?2:1),selected;
+ return -1;
+ }
+ void Render()
+ {
+#define WrapCnt \
+ (view==0?Ncnt:view==1?Excnt:view==2?FPMcnt:0)
+#define WrapRec\
+ (view==0?NRec:view==1?ExRec:view==2?FPMRec:FPMRec)
+ if(dyoffset+400>289.9)
+ MenuFont->printf(xoffset,dyoffset+400,HGETEXT_LEFT,"No. %d of %s",no,HSMStr[view]);
+ if(view==1)
+ {
+ if(dyoffset+430>289.9&&dyoffset+430<540.1)
+ MenuFont->printf(xoffset,dyoffset+430,HGETEXT_LEFT,"Scored %lld by %s",WrapRec[no].score,WrapRec[no].name);
+ if(dyoffset+460>289.9&&dyoffset+460<540.1)
+ MenuFont->printf(xoffset,dyoffset+460,HGETEXT_LEFT,"Time elapsed %.2fs",WrapRec[no].rescol/100.0);
+ if(dyoffset+490>289.9&&dyoffset+490<540.1)
+ MenuFont->printf(xoffset,dyoffset+490,HGETEXT_LEFT,"Semi-Collisions %d",WrapRec[no].scoll);
+ if(dyoffset+520>289.9&&dyoffset+520<540.1)
+ MenuFont->printf(xoffset,dyoffset+520,HGETEXT_LEFT,"Average FPS %d.%d",WrapRec[no].af_int,WrapRec[no].af_fric);
+ }
+ else
+ {
+ if(dyoffset+430>289.9&&dyoffset+430<540.1)
+ MenuFont->printf(xoffset,dyoffset+430,HGETEXT_LEFT,"Scored %lld by %s",WrapRec[no].score,WrapRec[no].name);
+ if(dyoffset+460>289.9&&dyoffset+460<540.1)
+ {
+ if(view==0)
+ MenuFont->printf(xoffset,dyoffset+460,HGETEXT_LEFT,"Restarts %d",WrapRec[no].rescol);
+ else
+ MenuFont->printf(xoffset,dyoffset+460,HGETEXT_LEFT,"Collisions %d",WrapRec[no].rescol);
+ }
+ if(dyoffset+490>289.9&&dyoffset+490<540.1)
+ MenuFont->printf(xoffset,dyoffset+490,HGETEXT_LEFT,"Semi-Collisions %d",WrapRec[no].scoll);
+ if(dyoffset+520>289.9&&dyoffset+520<540.1)
+ MenuFont->printf(xoffset,dyoffset+520,HGETEXT_LEFT,"CLR Usage %d",WrapRec[no].clrusg);
+ if(dyoffset+550>289.9&&dyoffset+550<540.1)
+ MenuFont->printf(xoffset,dyoffset+550,HGETEXT_LEFT,"Average FPS %d.%d",WrapRec[no].af_int,WrapRec[no].af_fric);
+ }
+ double calcy=(view==1?5:6)*30+dyoffset+400;
+ if(calcy>289.9&&calcy<540.1)
+ MenuFont->printf(xoffset,calcy,HGETEXT_LEFT,"back");
+ Ribb->RenderEx(xoffset-50,395,0,6,1);
+ Ribb->RenderEx(xoffset-50,422,0,6,1);
+ hge->Gfx_RenderQuad(&UpperGradient);
+ hge->Gfx_RenderQuad(&LowerGradient);
+ HSTitle->Render(xoffset-250,300);
+ }
+}highScoreDetailsMenu;
diff --git a/archive/blr2/src/music.h b/archive/blr2/src/music.h
new file mode 100644
index 0000000..ef09c41
--- /dev/null
+++ b/archive/blr2/src/music.h
@@ -0,0 +1,34 @@
+//Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+//In Game Music Implementations
+//Copyright Chrisoft 2014
+HEFFECT Mus;
+HCHANNEL Muc;
+int lpst,lped;
+//static const char* MUSIC_H_FN="music.h";
+
+void Music_Init(const char* file)
+{
+ Mus=hge->Effect_Load(file);
+}
+void Music_Play()
+{
+ Muc=hge->Effect_PlayEx(Mus,bgmvol/15.0,0,1.0,true);
+}
+void Music_Update()
+{
+ if (!lpst||!lped)return;
+ int Mucpos=hge->Channel_GetPos_BySample(Muc);
+ if (Mucpos>=lped)hge->Channel_SetPos_BySample(Muc,lpst);
+}
+void Music_Stop()
+{
+ hge->Channel_Stop(Muc);
+}
+void Music_Pause()
+{
+ hge->Channel_Pause(Muc);
+}
+void Music_Resume()
+{
+ hge->Channel_Resume(Muc);
+}
diff --git a/archive/blr2/src/scorec.h b/archive/blr2/src/scorec.h
new file mode 100644
index 0000000..abca9c6
--- /dev/null
+++ b/archive/blr2/src/scorec.h
@@ -0,0 +1,258 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Score Recording Implementations
+// Copyright Chrisoft 2014
+//static const char* SCOREC_H_FN="scorec.h";
+
+struct TRecord
+{
+ long long score;
+ int len,rescol,scoll,clrusg;
+ int af_int,af_fric;
+ char name[16];
+}ERec[10],NRec[10],ExRec[10],FPMRec[10];
+unsigned int Ecnt,Ncnt,Excnt,FPMcnt;
+unsigned int header,seprt;
+char newname[16];
+int newlen,tbframebrk;
+unsigned int Getuint()
+{
+ unsigned int c1,c2,c3,c4,res;
+ c1=c2=c3=c4=0;
+ c1=getchar();c2=getchar();c3=getchar();c4=getchar();
+ res=(c1<<24)+(c2<<16)+(c3<<8)+c4;
+ return res;
+}
+int Getint()
+{
+ return (int)Getuint();
+}
+long long Getll()
+{
+ long long c1,c2,c3,c4,c5,c6,c7,c8,res;
+ c1=c2=c3=c4=c5=c6=c7=c8=0;
+ c1=getchar();c2=getchar();c3=getchar();c4=getchar();
+ c5=getchar();c6=getchar();c7=getchar();c8=getchar();
+ res=(c1<<56)+(c2<<48)+(c3<<40)+(c4<<32)+(c5<<24)+(c6<<16)+(c7<<8)+c8;
+ return res;
+}
+void Putuint(unsigned int a)
+{
+ unsigned int c1,c2,c3,c4;
+ c1=a&0xFF000000;c1>>=24;c2=a&0x00FF0000;c2>>=16;
+ c3=a&0x0000FF00;c3>>=8;c4=a&0x000000FF;
+ printf("%c%c%c%c",c1,c2,c3,c4);
+}
+void Putint(int a)
+{
+ Putuint((unsigned int)a);
+}
+void Putll(unsigned long long a)
+{
+ unsigned long long c1,c2,c3,c4,c5,c6,c7,c8;
+ c1=a&0xFF00000000000000LL;c1>>=56LL;
+ c2=a&0x00FF000000000000LL;c2>>=48LL;
+ c3=a&0x0000FF0000000000LL;c3>>=40LL;
+ c4=a&0x000000FF00000000LL;c4>>=32LL;
+ c5=a&0x00000000FF000000LL;c5>>=24LL;
+ c6=a&0x0000000000FF0000LL;c6>>=16LL;
+ c7=a&0x000000000000FF00LL;c7>>=8LL;
+ c8=a&0x00000000000000FFLL;
+ printf("%c%c%c%c%c%c%c%c",(int)c1,(int)c2,(int)c3,(int)c4,(int)c5,(int)c6,(int)c7,(int)c8);
+}
+TRecord GetTRecord()
+{
+ TRecord res;
+ res.len=Getint();
+ memset(res.name,0,sizeof(res.name));
+ for (int i=0;i<res.len;++i)scanf("%c",&res.name[i]);
+ res.score=Getll();
+ res.rescol=Getint();
+ res.scoll=Getint();
+ res.clrusg=Getint();
+ res.af_int=Getint();res.af_fric=Getint();
+ return res;
+}
+void PutTRecord(TRecord a)
+{
+ Putint(a.len);
+ for (int i=0;i<a.len;++i)printf("%c",a.name[i]);
+ Putll(a.score);
+ Putint(a.rescol);
+ Putint(a.scoll);
+ Putint(a.clrusg);
+ Putint(a.af_int);Putint(a.af_fric);
+}
+void Score_Init()
+{
+ freopen(".blrscore","r",stdin);
+ header=Getuint();
+ if (header!=0x3b424c53)//0x3b424c53=";BLS"
+ {
+ fclose(stdin);
+ Error("Error when loading score file!");
+ }
+ seprt=Getuint();
+ if (seprt!=0xd1ffa0c0)
+ {
+ fclose(stdin);
+ Error("Error when loading score file!");
+ }
+ Ecnt=Getuint();
+ for (unsigned int i=1;i<=Ecnt;++i)ERec[i]=GetTRecord();
+ seprt=Getuint();
+ if (seprt!=0xd1ffa0c1)
+ {
+ fclose(stdin);
+ Error("Error when loading score file!");
+ }
+ Ncnt=Getuint();
+ for (unsigned int i=1;i<=Ncnt;++i)NRec[i]=GetTRecord();
+ seprt=Getuint();
+ if (seprt!=0xd1ffa0c2)
+ {
+ fclose(stdin);
+ Error("Error when loading score file!");
+ }
+ Excnt=Getuint();
+ for (unsigned int i=1;i<=Excnt;++i)ExRec[i]=GetTRecord();
+ seprt=Getuint();
+ if (seprt!=0xd1ffa0c3)
+ {
+ fclose(stdin);
+ Error("Error when loading score file!");
+ }
+ FPMcnt=Getuint();
+ for (unsigned int i=1;i<=FPMcnt;++i)FPMRec[i]=GetTRecord();
+ fclose(stdin);
+}
+int CheckHighScore()
+{
+ unsigned i;
+ switch (mode)
+ {
+ case 4:
+ for (i=1;i<=Ecnt;++i)
+ if (ERec[i].score<score)break;
+ if (i==5&&ERec[i].score>score)return -1;
+ if (Ecnt<5&&ERec[Ecnt].score>score)return Ecnt+1;
+ return i;
+ break;
+ case 1:
+ for (i=1;i<=Ncnt;++i)
+ if (NRec[i].score<score)break;
+ if (i==5&&NRec[i].score>score)return -1;
+ if (Ncnt<5&&NRec[Ncnt].score>score)return Ncnt+1;
+ return i;
+ break;
+ case 2:
+ for (i=1;i<=Excnt;++i)
+ if (ExRec[i].score<score)break;
+ if (i==5&&ExRec[i].score>score)return -1;
+ if (Excnt<5&&ExRec[Ncnt].score>score)return Excnt+1;
+ return i;
+ break;
+ case 3:
+ for (i=1;i<=FPMcnt;++i)
+ if (FPMRec[i].score<score)break;
+ if (i==5&&FPMRec[i].score>score)return -1;
+ if (FPMcnt<5&&FPMRec[Ncnt].score>score)return FPMcnt+1;
+ return i;
+ break;
+ }
+ return 100;
+}
+void Score_Write()
+{
+ freopen(".blrscore","w",stdout);
+ Putuint(0x3b424c53);
+ Putuint(0xd1ffa0c0);
+ Putint(Ecnt);
+ for (unsigned i=1;i<=Ecnt;++i)
+ PutTRecord(ERec[i]);
+ Putuint(0xd1ffa0c1);
+ Putint(Ncnt);
+ for (unsigned i=1;i<=Ncnt;++i)
+ PutTRecord(NRec[i]);
+ Putuint(0xd1ffa0c2);
+ Putint(Excnt);
+ for (unsigned i=1;i<=Excnt;++i)
+ PutTRecord(ExRec[i]);
+ Putuint(0xd1ffa0c3);
+ Putint(FPMcnt);
+ for (unsigned i=1;i<=FPMcnt;++i)
+ PutTRecord(FPMRec[i]);
+ fclose(stdout);
+}
+void Score_Initailize()
+{
+ if(access(".blrscore",R_OK)==0)return;
+ freopen(".blrscore","w",stdout);
+ Putuint(0x3b424c53);
+ Putuint(0xd1ffa0c0);Putuint(0);
+ Putuint(0xd1ffa0c1);Putuint(0);
+ Putuint(0xd1ffa0c2);Putuint(0);
+ Putuint(0xd1ffa0c3);Putuint(0);
+ fclose(stdout);
+}
+void InsertHighScore()
+{
+ unsigned pos=CheckHighScore();
+ switch (mode)
+ {
+ case 4:
+ //deprecated...
+ if (pos<=Ecnt)
+ for (unsigned i=5;i>pos;--i)
+ ERec[i]=ERec[i-1];
+ else ++Ecnt;
+ if (Ecnt<5)++Ecnt;
+ ERec[pos].score=score;
+ ERec[pos].len=newlen;
+ memcpy(ERec[pos].name,newname,sizeof(newname));
+ ERec[pos].clrusg=clrusg;
+ ERec[pos].rescol=restarts;ERec[pos].scoll=semicoll;
+ ERec[pos].af_int=(int)averfps;
+ ERec[pos].af_fric=(int)(averfps*10)%10*10+(int)(averfps*100)%10;
+ break;
+ case 1:
+ if (pos<=Ncnt)
+ for (unsigned i=5;i>pos;--i)
+ NRec[i]=NRec[i-1];
+ if (Ncnt<5)++Ncnt;
+ NRec[pos].score=score;
+ NRec[pos].len=newlen;
+ memcpy(NRec[pos].name,newname,sizeof(newname));
+ NRec[pos].clrusg=clrusg;
+ NRec[pos].rescol=restarts;NRec[pos].scoll=semicoll;
+ NRec[pos].af_int=(int)averfps;
+ NRec[pos].af_fric=(int)(averfps*10)%10*10+(int)(averfps*100)%10;
+ break;
+ case 2:
+ if (pos<=Excnt)
+ for (unsigned i=5;i>pos;--i)
+ ExRec[i]=ExRec[i-1];
+ if (Excnt<5)++Excnt;
+ ExRec[pos].score=score;
+ ExRec[pos].len=newlen;
+ memcpy(ExRec[pos].name,newname,sizeof(newname));
+ ExRec[pos].clrusg=clrusg;
+ ExRec[pos].rescol=asts*100;ExRec[pos].scoll=semicoll;
+ ExRec[pos].af_int=(int)averfps;
+ ExRec[pos].af_fric=(int)(averfps*10)%10*10+(int)(averfps*100)%10;
+ break;
+ case 3:
+ if (pos<=FPMcnt)
+ for (unsigned i=5;i>pos;--i)
+ FPMRec[i]=FPMRec[i-1];
+ if (FPMcnt<5)++FPMcnt;
+ FPMRec[pos].score=score;
+ FPMRec[pos].len=newlen;
+ memcpy(FPMRec[pos].name,newname,sizeof(newname));
+ FPMRec[pos].clrusg=clrusg;
+ FPMRec[pos].rescol=coll;FPMRec[pos].scoll=semicoll;
+ FPMRec[pos].af_int=(int)averfps;
+ FPMRec[pos].af_fric=(int)(averfps*10)%10*10+(int)(averfps*100)%10;
+ break;
+ }
+ Score_Write();
+}
diff --git a/archive/blr2/src/scoresystem.h b/archive/blr2/src/scoresystem.h
new file mode 100644
index 0000000..c8efc79
--- /dev/null
+++ b/archive/blr2/src/scoresystem.h
@@ -0,0 +1,158 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Multiplier implementations
+// Copyright Chrisoft 2014
+CircleIndicator MultTimer;
+hgeFont *MultFnt;
+hgeSprite *MB;
+int valbrk;
+//static const char* SCORESYSTEM_H_FN="scoresystem.h";
+
+//Multiplier Indicator
+
+HangUpText MT[255];
+void NewMT()
+{
+ int i=0;while (MT[i].Active())++i;
+ char ttext[10];sprintf(ttext,"x%.2lf",mult);
+ MT[i].Init("./Resources/charmap.fnt",ttext,1.0f,200,-50);
+ MT[i].Launch(vector2d(playerpos.x,playerpos.y-25));
+}
+void ProcessMT()
+{
+ for (int i=0;i<=255;++i)if (MT[i].Active())MT[i].Process(hge->Timer_GetDelta());
+}
+
+//Multiplier +1
+class MultPo
+{
+private:
+ hgeSprite *Mult,*SpwnEfx;
+ double Lifetime,LifeLim,speed;
+ vector2d position,direction;
+ int blinkbrk;
+ bool Active,blnkshow,followplyr;
+public:
+ bool IsActive(){return Active;}
+ void Init(double _lt,double _speed,vector2d _pos,vector2d _dir)
+ {
+ Lifetime=0;LifeLim=_lt;speed=_speed;position=_pos;direction=_dir;
+ Mult=new hgeSprite(SprSheet,0,272,48,48);Active=true;blinkbrk=0;blnkshow=true;
+ Mult->SetHotSpot(24,24);followplyr=false;SpwnEfx=new hgeSprite(SprSheet,48,272,48,48);
+ SpwnEfx->SetHotSpot(24,24);
+ }
+ void Process()
+ {
+ if(GetDist(playerpos,position)<=64)followplyr=true;
+ if(!clrmode)
+ {
+ if(clrrange!=0&&GetDist(playerpos,position)<=clrmaxrange)followplyr=true;
+ }
+ else
+ {
+ if(clrrad-pi/2>1e-7&&GetDist(playerpos,position)<=clrmaxrange)followplyr=true;
+ }
+ if(followplyr)
+ {
+ direction=ToUnitCircle(playerpos-position);
+ speed=0.4;
+ }else Lifetime+=hge->Timer_GetDelta();
+ if(GetDist(playerpos,position)<=9)
+ {
+ ++mult,NewMT(),Active=false;
+ delete Mult;delete SpwnEfx;return;
+ }
+ if(Lifetime>LifeLim)
+ {
+ delete Mult;delete SpwnEfx;
+ return (void)(Active=false);
+ }
+ if(Lifetime<LifeLim*0.03)
+ {
+ double siz=(LifeLim*0.03-Lifetime)/(LifeLim*0.03)*3;
+ SpwnEfx->SetColor(SETA(SpwnEfx->GetColor(),Lifetime/(LifeLim*0.03)*255));
+ SpwnEfx->RenderEx(position.x,position.y,0,siz);
+ }
+ if(Lifetime>LifeLim*0.8)
+ {
+ if (!LOWFPS)++blinkbrk;else blinkbrk+=17;
+ if (blinkbrk>200)blinkbrk=0,blnkshow=!blnkshow;
+ if (blnkshow)
+ Mult->RenderEx(position.x,position.y,0,0.8);
+ }
+ else
+ Mult->RenderEx(position.x,position.y,0,0.8);
+ if(!followplyr)
+ {
+ if (position.x>780||position.x<20)direction.x=-direction.x;
+ if (position.y>780||position.y<20)direction.y=-direction.y;
+ }
+ int times=1;if (LOWFPS)times=17;
+ for (int i=1;i<=times;++i)
+ position.x+=direction.x*speed,position.y+=direction.y*speed;
+ }
+};
+MultPo Multpo[255];
+void NewMultpo(vector2d pos=vector2d(-99,-99))
+{
+ int i=0;while (Multpo[i].IsActive())++i;
+ if (pos.x+99<=1e-6&&pos.y+99<=1e-6)
+ pos.x=re.NextInt(20,770),pos.y=re.NextInt(20,570);
+ vector2d dir=ToUnitCircle(vector2d(rand()%1000-500,rand()%1000-500));
+ Multpo[i].Init(7.5,0.02,pos,dir);
+}
+void ProcessMultpo()
+{
+ for (int i=0;i<=255;++i)if(Multpo[i].IsActive())Multpo[i].Process();
+}
+//Auto Multipliers
+
+void Mult_Init()
+{
+ MultTimer.Init(50,0.95,0xC0,false,SprSheet,TextureRect(151,264,2,8),0x00FF0000);
+ multbrk=TenSeconds;multbat=mult=1;valbrk=0;
+ MB=new hgeSprite(MultFnt->GetTexture(),0,235,163,21);
+ MB->SetHotSpot(81.5,10.5);
+ memset(Multpo,0,sizeof(Multpo));
+}
+double GetHscle()
+{
+ if (multbrk<=TenSeconds/10.0f*0.2f)return (TenSeconds/10.0f*0.3f-multbrk)/(TenSeconds/10.0f)*10;
+ if (multbrk<=TenSeconds/10.0f*4.5f)return 1.0f;
+ return (multbrk-TenSeconds/10.0f*4.15f)/(multbrk-TenSeconds/10.0f)*10;
+}
+int GetAlpha()
+{
+ if (multbrk<=TenSeconds/10.0f*0.2f)return (int)(255-255*(TenSeconds/10.0f*0.2f-multbrk)/(TenSeconds/50.0f));
+ if (multbrk<=TenSeconds/10.0f*4.5f)return 0xFF;
+ return (int)(255*(TenSeconds/2-multbrk)/(TenSeconds/10));
+}
+void Mult_FrameFunc()
+{
+ if (Current_Position!=1)return;
+ ProcessMT();ProcessMultpo();
+ --multbrk;
+ if(!dsmc)lsc+=hge->Timer_GetDelta();else lsc=0;
+ if(lsc>1&&mult>1.0f)mult-=hge->Timer_GetDelta()/20.0f;
+ if (multbrk<0)
+ {
+ multbrk=ThirtySeconds;
+ mult+=multbat;lsc=0;
+ NewMT();
+ if (multbat<5)++multbat;
+ }
+ if (multbrk<TenSeconds/2)
+ {
+ ++valbrk;
+ if (LOWFPS||valbrk>30)
+ MultTimer.SetValue((double)multbrk/((double)TenSeconds/2.0f));
+ if (valbrk>30)valbrk=0;
+ MultTimer.Render(playerpos.x+8.4,playerpos.y+8.4);
+ MB->SetColor(SETA(0x00FFFFFF,0.8*GetAlpha()));
+ MB->RenderEx(playerpos.x+8.4,playerpos.y-26.4,0,GetHscle(),1.0f);
+ }
+}
+void Mult_BatClear()
+{
+ multbrk=ThirtySeconds;
+ multbat=1;
+}
diff --git a/archive/blr2/src/towernbullet.h b/archive/blr2/src/towernbullet.h
new file mode 100644
index 0000000..8acf516
--- /dev/null
+++ b/archive/blr2/src/towernbullet.h
@@ -0,0 +1,2892 @@
+// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
+// Towers and Bullets Implementations
+// Copyright Chrisoft 2014
+#include "effects.h"
+//static const char* TOWERNBULLET_H_FN="towernbullet.h";
+
+void RenderAlter(vector2d p,TColors ca,TColors cb,double rot=0,double scl=1)
+{
+ float x,y,w,h;
+ bulletspr[ca]->GetTextureRect(&x,&y,&w,&h);
+ bulletspr[ca]->SetTextureRect(x,y,12,h);
+ bulletspr[ca]->SetHotSpot(12,12);
+ bulletspr[ca]->RenderEx(p.x,p.y,rot,scl);
+ bulletspr[ca]->SetTextureRect(x,y,w,h);
+ bulletspr[ca]->SetHotSpot(12,12);
+
+ bulletspr[cb]->GetTextureRect(&x,&y,&w,&h);
+ bulletspr[cb]->SetTextureRect(x,y,12,h);
+ bulletspr[cb]->SetHotSpot(12,12);
+ bulletspr[cb]->RenderEx(p.x,p.y,rot+pi,scl);
+ bulletspr[cb]->SetTextureRect(x,y,w,h);
+ bulletspr[cb]->SetHotSpot(12,12);
+}
+int CreateBullet1(double x,double y,double bs,bool eff=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=1;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=x-playerpos.x;
+ bullet[i].bulletdir.y=y-playerpos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].alterColor=green;bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;
+ if (eff)BulletEffect_Attatch(i);
+ return i;
+}
+int CreateBullet2(double x,double y,double bs,double rad,bool eff=false,bool invi=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].addblend=false;
+ bullet[i].extborder=false;
+ bullet[i].inv=invi;
+ bullet[i].bullettype=2;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir=vector2d(cos(rad),sin(rad));
+ bullet[i].limpos=vector2d(-999,-999);
+ bullet[i].bulletspeed=bs;
+ bullet[i].alterColor=blue;
+ bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].lifetime=0;
+ bullet[i].whirem=0;
+ bullet[i].scollable=true;
+ bullet[i].collable=true;
+ bullet[i].bulletaccel=bullet[i].limv=0;
+ bullet[i].scale=1;bullet[i].rot=0;
+ if (eff)BulletEffect_Attatch(i);
+ return i;
+}
+void CreateBullet3(double x,double y,double bs,int dir,bool eff=false)
+{
+ CreateBullet2(x,y,bs,dir*0.5235987756,eff,false);
+}
+void CreateBullet4(double x,double y,double bs,int yelbrk=0,bool eff=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=4;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=x-playerpos.x;
+ bullet[i].bulletdir.y=y-playerpos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].yelbrk=yelbrk;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;bullet[i].lifetime=0;
+ bullet[i].alterColor=yellow;bullet[i].alterColor2=COLOR_COUNT;
+ if (eff)BulletEffect_Attatch(i);
+}
+void CreateBullet5(double x,double y,double bs,bool eff=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=5;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=x-playerpos.x;
+ bullet[i].bulletdir.y=y-playerpos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].alterColor=purple;bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;
+ if (eff)BulletEffect_Attatch(i);
+}
+int CreateBullet6(double x,double y,double bs,int explo,int exp1=8,int exp2=12,bool eff=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=6;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=re.NextDouble(-1,1);
+ bullet[i].bulletdir.y=re.NextDouble(-1,1);
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].alterColor=red;bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].redattrib=0;
+ bullet[i].exp1=exp1;
+ bullet[i].exp2=exp2;
+ bullet[i].oriexplo=bullet[i].redexplo=explo;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;
+ if (eff)BulletEffect_Attatch(i);
+ return i;
+}
+int CreateBullet7(double x,double y,double bs,int explo,bool eff=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=7;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=re.NextDouble(-1,1);
+ bullet[i].bulletdir.y=re.NextDouble(-1,1);
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].alterColor=white;bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].oriexplo=bullet[i].redexplo=explo;
+ bullet[i].redattrib=0;
+ bullet[i].whirem=whicnt;
+ bullet[i].whiskp=0;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;
+ if (eff)BulletEffect_Attatch(i);
+ return i;
+}
+int CreateBullet8(double x,double y,double bs,bool eff=false)
+{
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=8;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=x-playerpos.x;
+ bullet[i].bulletdir.y=y-playerpos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].alterColor=dblue;bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;
+ if (eff)BulletEffect_Attatch(i);
+ return i;
+}
+int CreateBullet9(double x,double y,double bs,int explo,int cnt,int brk,bool eff=false)
+{
+ //This creates bullet9 in random direction and as attrib 0
+ //change them if necessary.
+ ++shots;
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].inv=false;
+ bullet[i].bullettype=9;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].bulletdir.x=re.NextDouble(-1,1);
+ bullet[i].bulletdir.y=re.NextDouble(-1,1);
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].oriexplo=bullet[i].redexplo=explo;
+ bullet[i].redattrib=0;
+ bullet[i].whicnt=cnt;
+ bullet[i].yelbrk=brk;
+ bullet[i].alterColor=orange;bullet[i].alterColor2=COLOR_COUNT;
+ bullet[i].scollable=true;
+ bullet[i].scale=1;
+ if (eff)BulletEffect_Attatch(i);
+ return i;
+}
+void CreateBullet255(double x,double y,double bs,int spno=0)
+{
+ int i=AllocBullet();
+ bullet[i].exist=true;
+ bullet[i].bullettype=255;
+ bullet[i].bulletpos.x=x;
+ bullet[i].bulletpos.y=y;
+ bullet[i].redattrib=spno;
+ vector2d spos=playerpos+splitData[spno];
+ bullet[i].bulletdir.x=x-spos.x;
+ bullet[i].bulletdir.y=y-spos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ bullet[i].bulletspeed=bs;
+ bullet[i].exp1=re.NextInt(0,9)?0:1;
+}
+void All2pnt()
+{
+ for (int i=1;i<=bulcnt;++i)
+ {
+ if(bullet[i].bullettype<200&&bullet[i].exist)
+ {
+ CreateBullet255(bullet[i].bulletpos.x,bullet[i].bulletpos.y,10);
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ }
+}
+void ProcessBullet1(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=1)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ BulletEffect_Process(i);
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (dis<=6||bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7)++coll,scminus+=10000,Mult_BatClear();
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+}
+void ProcessBullet2(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=2)return;
+ if (Current_Position==1)bullet[i].lifetime+=hge->Timer_GetDelta();
+ if (!DisablePlayer)
+ {
+ //experimental new coor processing code, FPS independent
+ if (bullet[i].whirem<=0)
+ {
+ if (bullet[i].bulletaccel>0&&bullet[i].bulletspeed<bullet[i].limv)bullet[i].bulletspeed+=bullet[i].bulletaccel*(1000.0f/hge->Timer_GetFPS());
+ if (bullet[i].bulletaccel<0&&bullet[i].bulletspeed>bullet[i].limv)bullet[i].bulletspeed+=bullet[i].bulletaccel*(1000.0f/hge->Timer_GetFPS());
+ }
+ else
+ bullet[i].whirem-=1000.0f/hge->Timer_GetFPS();
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x)/20*(1000.0f/hge->Timer_GetFPS());
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y)/20*(1000.0f/hge->Timer_GetFPS());
+ if(GetDist(bullet[i].bulletpos,bullet[i].limpos)<1)
+ {
+ BulletEffect_Death(bullet[i],ColorToDWORD(bullet[i].alterColor));
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=-999;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;return;
+ }
+ }
+ BulletEffect_Process(i);
+ if(PlayerSplit)
+ {
+ bool rndr=true;
+ for(int j=0;j<4;++j)
+ {
+ double dis=GetDist(bullet[i].bulletpos,playerpos+splitData[j]);
+ if (bullet[i].bulletpos.x<=-25||bullet[i].bulletpos.x>=825||bullet[i].bulletpos.y<=-25||bullet[i].bulletpos.y>=625)
+ {
+ bullet[i].exist=false;rndr=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=-999;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ return;
+ }
+ if (bullet[i].scale<1.2&&dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7&&bullet[i].collable)
+ {
+ ++coll,scminus+=10000,Mult_BatClear();bullet[i].collable=false;rndr=false;
+ if(!bullet[i].inv)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ return;
+ }
+ else
+ {
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch(playerpos+splitData[j]);
+ }
+ }
+ if(rndr)
+ {
+ if(bullet[i].alterColor2==COLOR_COUNT)
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ else
+ RenderAlter(vector2d(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2),bullet[i].alterColor,bullet[i].alterColor2,bullet[i].rot,0.6*bullet[i].scale),
+ Current_Position==1?bullet[i].rot+=(i&1?1:-1)*(1000/hge->Timer_GetFPS())*pi/1000:0;
+ }
+ }
+ else
+ {
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if ((!bullet[i].extborder&&(bullet[i].bulletpos.x<=-25||bullet[i].bulletpos.x>=825||bullet[i].bulletpos.y<=-25||bullet[i].bulletpos.y>=625))||
+ (bullet[i].extborder&&(bullet[i].bulletpos.x<=-225||bullet[i].bulletpos.x>=1025||bullet[i].bulletpos.y<=-225||bullet[i].bulletpos.y>=825)))
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=-999;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ return;
+ }
+ if (bullet[i].scale<1.2&&dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7&&bullet[i].collable)
+ {
+ ++coll,scminus+=10000,Mult_BatClear();bullet[i].collable=false;
+ if(!bullet[i].inv)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ return;
+ }
+ else
+ {
+ if(bullet[i].alterColor2==COLOR_COUNT)
+ {
+ if(bullet[i].addblend)bulletspr[bullet[i].alterColor]->SetBlendMode(0);
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ if(bullet[i].addblend)bulletspr[bullet[i].alterColor]->SetBlendMode(2);
+ }
+ else
+ RenderAlter(vector2d(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2),bullet[i].alterColor,bullet[i].alterColor2,bullet[i].rot,0.6*bullet[i].scale),
+ Current_Position==1?bullet[i].rot+=(i&1?1:-1)*(1000/hge->Timer_GetFPS())*pi/1000:0;
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+ }
+}
+//There is no need for ProcessBullet3() because they are in fact bullet2
+void ProcessBullet4(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=4)return;
+ if (Current_Position==1)bullet[i].lifetime+=hge->Timer_GetDelta();
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ bullet[i].whirem+=17;
+ else
+ ++bullet[i].whirem;
+ if ((yelattrib&&bullet[i].whirem>=bullet[i].yelbrk)||!yelattrib)
+ {
+ bullet[i].whirem=0;
+ bullet[i].bulletdir.x=bullet[i].bulletpos.x-playerpos.x;
+ bullet[i].bulletdir.y=bullet[i].bulletpos.y-playerpos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ }
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ BulletEffect_Process(i);
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (dis<=6||bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7)++coll,scminus+=10000,Mult_BatClear();
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+}
+void ProcessBullet5(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=5)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ BulletEffect_Process(i);
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (dis<=6||bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7)playerspeed*=0.9,playerslospeed*=0.9;
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ }
+}
+void ProcessBullet6(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=6)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ if (!LOWFPS)
+ {
+ if (bullet[i].redattrib==0)
+ --bullet[i].redexplo;
+ else
+ bullet[i].redexplo-=2;
+ }
+ else
+ {
+ if (bullet[i].redattrib==0)
+ bullet[i].redexplo-=17;
+ else
+ bullet[i].redexplo-=34;
+ }
+ if (bullet[i].redexplo<=0&&!DisableAllTower)
+ {
+ if (bullet[i].redattrib==0)
+ {
+ for (int j=1;j<=bullet[i].exp1;++j)
+ {
+ int pnt=CreateBullet6(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,bullet[i].oriexplo,bullet[i].exp1,bullet[i].exp2,bullet[i].scale>1.5?true:false);
+ bullet[pnt].setdir(2*pi/(double)bullet[i].exp1*j);
+ bullet[pnt].redattrib=1;
+ }
+ }
+ else
+ {
+ for (int j=1;j<=bullet[i].exp2;++j)
+ CreateBullet2(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,2*pi/(double)bullet[i].exp2*j+clockrot,bullet[i].scale>1.5?true:false);
+ clockrot+=deltarot;
+ deltarot+=0.004363322313;
+ }
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ BulletEffect_Process(i);
+ if(PlayerSplit)
+ {
+ bool rndr=true;
+ for(int j=0;j<4;++j)
+ {
+ double dis=GetDist(bullet[i].bulletpos,playerpos+splitData[j]);
+ if (bullet[i].bulletpos.x<=-25||bullet[i].bulletpos.x>=825||bullet[i].bulletpos.y<=-25||bullet[i].bulletpos.y>=625)
+ {
+ bullet[i].exist=false;rndr=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=-999;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ return;
+ }
+ if (bullet[i].scale<1.2&&dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7&&bullet[i].collable)
+ {
+ ++coll,scminus+=10000,Mult_BatClear();bullet[i].collable=false;rndr=false;
+ if(!bullet[i].inv)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ return;
+ }
+ else
+ {
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch(playerpos+splitData[j]);
+ }
+ }
+ if(rndr)
+ {
+ if(bullet[i].alterColor2==COLOR_COUNT)
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ else
+ RenderAlter(vector2d(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2),bullet[i].alterColor,bullet[i].alterColor2,bullet[i].rot,0.6*bullet[i].scale),
+ Current_Position==1?bullet[i].rot+=(i&1?1:-1)*(1000/hge->Timer_GetFPS())*pi/1000:0;
+ }
+ }
+ else
+ {
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (bullet[i].bulletpos.x<=-25||bullet[i].bulletpos.x>=825||bullet[i].bulletpos.y<=-25||bullet[i].bulletpos.y>=625)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=-999;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ return;
+ }
+ if (bullet[i].scale<1.2&&dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7&&bullet[i].collable)
+ {
+ ++coll,scminus+=10000,Mult_BatClear();bullet[i].collable=false;
+ if(!bullet[i].inv)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ return;
+ }
+ else
+ {
+ if(bullet[i].alterColor2==COLOR_COUNT)
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ else
+ RenderAlter(vector2d(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2),bullet[i].alterColor,bullet[i].alterColor2,bullet[i].rot,0.6*bullet[i].scale),
+ Current_Position==1?bullet[i].rot+=(i&1?1:-1)*(1000/hge->Timer_GetFPS())*pi/1000:0;
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+ }
+}
+void ProcessBullet7(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=7)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bsscale*bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ if (!LOWFPS)
+ {
+ if (bullet[i].redattrib==0)
+ --bullet[i].redexplo;
+ else
+ bullet[i].redexplo-=2;
+ }
+ else
+ {
+ if (bullet[i].redattrib==0)
+ bullet[i].redexplo-=17;
+ else
+ bullet[i].redexplo-=34;
+ }
+ if (bullet[i].redexplo<=0&&!DisableAllTower)
+ {
+ if (bullet[i].redattrib==0)
+ {
+ int pnt=CreateBullet7(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,bullet[i].oriexplo,bullet[i].scale>1.5?true:false);
+
+ bullet[pnt].bulletdir.x=0;
+ bullet[pnt].bulletdir.y=0;
+ bullet[pnt].dist=1;
+ bullet[pnt].redattrib=1;
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ if (!LOWFPS)
+ ++bullet[i].whiskp;
+ else
+ bullet[i].whiskp+=17;
+ if (bullet[i].whiskp>50)
+ {
+ for (int j=1;j<=whrcnt;++j)
+ {
+ int pnt=CreateBullet2(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,j*2.0f*pi/(double)whrcnt+whirot,bullet[i].scale>1.5?true:false);
+ if(level==6&&part==1)
+ {
+ bullet[pnt].limv=8;
+ bullet[pnt].bulletaccel=0.005;
+ bullet[pnt].bulletspeed=0;
+ }
+ if (level==6&&part>=2&&part<=11&&(j&1))
+ {
+ bullet[pnt].limv=5;
+ bullet[pnt].bulletaccel=0.005;
+ bullet[pnt].bulletspeed=0;
+ bullet[pnt].redir(playerpos);
+ bullet[pnt].bulletdir.Rotate((j>>1&1?1:-1)*pi/72);
+ }
+ }
+ whirot+=dwhirot;
+ dwhirot+=0.004363322313;
+ bullet[i].whiskp=0;
+ --bullet[i].whirem;
+ }
+ if (bullet[i].whirem<=0)
+ {
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ }
+ }
+ BulletEffect_Process(i);
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (dis<=6||bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7)++coll,scminus+=10000,Mult_BatClear();
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+}
+void ProcessBullet8(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=8)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ BulletEffect_Process(i);
+ if(bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ int cnt=re.NextInt(2,5);if (Dis8ref)cnt=0;
+ if(PlayerSplit)cnt=re.NextInt(0,2);
+ if(bullet[i].redattrib)
+ {
+ if(re.NextInt(0,3))//more possibility to reflect
+ {
+ if(bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800)bullet[i].bulletdir.x=-bullet[i].bulletdir.x;
+ if(bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)bullet[i].bulletdir.y=-bullet[i].bulletdir.y;
+ }
+ else//vanish or reflect?...
+ {
+ cnt=4-4*(frameleft/(double)(AMinute*1.5));
+ for (int ii=1;ii<=cnt;++ii)
+ CreateBullet2(bullet[i].bulletpos.x,bullet[i].bulletpos.y,2,re.NextDouble(-pi,pi));
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ return;
+ }
+ }
+ else
+ {
+ for (int ii=1;ii<=cnt;++ii)
+ {
+ int pnt=CreateBullet2(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,re.NextDouble(-pi,pi));
+ if (t8special)
+ {
+ bullet[pnt].alterColor=(TColors)(re.NextInt(0,7));
+ bullet[pnt].alterColor2=(TColors)(re.NextInt(0,7));
+ if(re.NextInt(0,3)==3)bullet[pnt].redir(vector2d(400,300));
+ if(re.NextInt(0,1))++ii;
+ }
+ }
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ return;
+ }
+ }
+ if(PlayerSplit)
+ {
+ for(int j=0;j<4;++j)
+ {
+ double dis=GetDist(bullet[i].bulletpos,playerpos+splitData[j]);
+ if (dis<=6)
+ {
+ if (dis<=6){if(clrrange<1e-5&&clrrad-pi/2<1e-7)++coll,scminus+=10000,Mult_BatClear();}
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch(playerpos+splitData[j]);
+ }
+ }
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ }
+ else
+ {
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (dis<=6)
+ {
+ if (dis<=6){if(clrrange<1e-5&&clrrad-pi/2<1e-7)++coll,scminus+=10000,Mult_BatClear();}
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;return;
+ }
+ else
+ {
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+ }
+}
+void ProcessBullet9(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=9)return;
+ if (!DisablePlayer)
+ {
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ if (bullet[i].redattrib==0)
+ {
+ bullet[i].redexplo-=17;
+ if (bullet[i].redexplo<=0)
+ {
+ for (int ii=0;ii<bullet[i].whicnt;++ii)
+ {
+ int pnt=CreateBullet9(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,0,0,bullet[i].yelbrk);
+ bullet[pnt].setdir(2*pi/(double)bullet[i].whicnt*ii);
+ bullet[pnt].redattrib=1;
+ }
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ }
+ if (bullet[i].redattrib==1)
+ {
+ bullet[i].yelbrk-=17;
+ if (bullet[i].yelbrk<=0)
+ {
+ bullet[i].redir(playerpos);
+ bullet[i].redattrib=2;
+ }
+ }
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ if (bullet[i].redattrib==0)
+ {
+ --bullet[i].redexplo;
+ if (bullet[i].redexplo<=0)
+ {
+ for (int ii=0;ii<bullet[i].whicnt;++ii)
+ {
+ int pnt=CreateBullet9(bullet[i].bulletpos.x,bullet[i].bulletpos.y,bullet[i].bulletspeed,0,0,bullet[i].yelbrk);
+ bullet[pnt].setdir(2*pi/(double)bullet[i].whicnt*ii);
+ bullet[pnt].redattrib=1;
+ }
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ }
+ if (bullet[i].redattrib==1)
+ {
+ --bullet[i].yelbrk;
+ if (bullet[i].yelbrk<=0)
+ {
+ bullet[i].redir(playerpos);
+ bullet[i].redattrib=2;
+ }
+ }
+ }
+ }
+ BulletEffect_Process(i);
+ double dis=GetDist(bullet[i].bulletpos,playerpos);
+ if (dis<=6||bullet[i].bulletpos.x<=-100||bullet[i].bulletpos.x>=900||bullet[i].bulletpos.y<=-100||bullet[i].bulletpos.y>=700)
+ {
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7)++coll,scminus+=10000,Mult_BatClear();
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ bulletspr[bullet[i].alterColor]->RenderEx(bullet[i].bulletpos.x+7.2,bullet[i].bulletpos.y+7.2,0,0.6*bullet[i].scale,0);
+ if (dis<=16&&bullet[i].scollable)++semicoll,++dsmc,bullet[i].scollable=false,SCEffect_Attatch();
+ }
+}
+void ProcessBullet255(int i)
+{
+ if (!bullet[i].exist||bullet[i].bullettype!=255)return;
+ if (!DisablePlayer)
+ {
+ bullet[i].bulletspeed=10;
+ vector2d spos=playerpos+splitData[bullet[i].redattrib];
+ bullet[i].bulletdir.x=bullet[i].bulletpos.x-spos.x;
+ bullet[i].bulletdir.y=bullet[i].bulletpos.y-spos.y;
+ bullet[i].dist=bullet[i].bulletdir.x*bullet[i].bulletdir.x+bullet[i].bulletdir.y*bullet[i].bulletdir.y;
+ bullet[i].dist=sqrt(bullet[i].dist);
+ if (LOWFPS)
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20*17;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20*17;
+ }
+ else
+ {
+ bullet[i].bulletpos.x-=bullet[i].bulletspeed*(bullet[i].bulletdir.x/bullet[i].dist)/20;
+ bullet[i].bulletpos.y-=bullet[i].bulletspeed*(bullet[i].bulletdir.y/bullet[i].dist)/20;
+ }
+ }
+ double dis=GetDist(bullet[i].bulletpos,playerpos+splitData[bullet[i].redattrib]);
+ if (dis<=6||bullet[i].bulletpos.x<=-10||bullet[i].bulletpos.x>=800||bullet[i].bulletpos.y<=-10||bullet[i].bulletpos.y>=600)
+ {
+ if(bullet[i].exp1)score+=mult*100;else mult+=0.01;
+ bullet[i].exist=false;
+ bullet[i].bulletpos.x=bullet[i].bulletpos.y=0;
+ bullet[i].bulletdir.x=bullet[i].bulletdir.y=0;
+ bullet[i].dist=0;
+ bullet[i].bullettype=0;
+ }
+ else
+ {
+ if(bullet[i].exp1)
+ {
+ bulletspr[green]->SetColor(0x40FFFFFF);
+ bulletspr[green]->SetBlendMode(BLEND_ALPHAADD);
+ bulletspr[green]->RenderEx(bullet[i].bulletpos.x+6,bullet[i].bulletpos.y+6,0,0.5,0);
+ bulletspr[green]->SetBlendMode(BLEND_ALPHABLEND);
+ bulletspr[green]->SetColor(0x80FFFFFF);
+ }
+ else
+ {
+ bulletspr[grey]->SetColor(0x20FFFFFF);
+ bulletspr[grey]->SetBlendMode(BLEND_ALPHAADD);
+ bulletspr[grey]->RenderEx(bullet[i].bulletpos.x+6,bullet[i].bulletpos.y+6,0,0.5,0);
+ bulletspr[grey]->SetBlendMode(BLEND_ALPHABLEND);
+ }
+ }
+}
+int CreateTower1(double x,double y,int timer,double bs,double offset=0,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=1;
+ tower[i].bulletspeed=bs;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ tower[i].offset=offset;
+ return i;
+}
+int CreateTower2(double x,double y,int timer,double bs,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)return i;
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=2;
+ tower[i].bulletspeed=bs;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower3(double x,double y,int timer,double bs,int t3t,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)return i;
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=3;
+ tower[i].bulletspeed=bs;
+ tower[i].t3t=t3t;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower3_fixeddir(double x,double y,int timer,double bs,double rad,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)return i;
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=3;
+ tower[i].bulletspeed=bs;
+ tower[i].offset=rad;tower[i].t3t=999;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower4(double x,double y,int timer,double bs,int yelbrk=0,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=4;
+ tower[i].bulletspeed=bs;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].yelbrk=yelbrk;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower5(double x,double y,int timer,double bs,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=5;
+ tower[i].bulletspeed=bs;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower6(double x,double y,int timer,double bs,int redexplo,int exp1=8,int exp2=12,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=6;
+ tower[i].bulletspeed=bs;
+ tower[i].redexplo=redexplo;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].exp1=exp1;tower[i].exp2=exp2;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower7(double x,double y,int timer,double bs,int redexplo,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=7;
+ tower[i].bulletspeed=bs;
+ tower[i].redexplo=redexplo;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].whicnt=whicnt;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower8(double x,double y,int timer,double bs,int timer2,int scnt,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=8;
+ tower[i].bulletspeed=bs;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towertimer2=tower[i].curtimer2=timer2;
+ tower[i].shotcount=tower[i].curshotcount=scnt;
+ tower[i].dblstate=false;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+int CreateTower9(double x,double y,int timer,double bs,int explo,int cnt,int brk,bool eff=false)
+{
+ int i;
+ if (towcnt==0)
+ towcnt=i=1;
+ else
+ {
+ for (i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist)break;
+ if (abs(tower[i].towerpos.x-x)<=zero&&abs(tower[i].towerpos.y-y)<=zero)
+ {
+ return i;
+ }
+ }
+ if (i>towcnt)
+ towcnt=i;
+ }
+ tower[i].exist=true;
+ tower[i].towertype=9;
+ tower[i].bulletspeed=bs;
+ tower[i].redexplo=explo;
+ tower[i].whicnt=cnt;
+ tower[i].yelbrk=brk;
+ tower[i].towertimer=tower[i].curtimer=timer;
+ tower[i].towerpos.x=x,tower[i].towerpos.y=y;
+ tower[i].RendColor=0x80FFFFFF;
+ tower[i].effect=eff;
+ return i;
+}
+void ProcessTower1()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=1)continue;
+ towerspr[green]->SetColor(tower[i].RendColor);
+ towerspr[green]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ if (fabs(tower[i].offset)>1e-7)
+ {
+ double trad=atan2l(tower[i].towerpos.y-playerpos.y,tower[i].towerpos.x-playerpos.x)+tower[i].offset;
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,trad,tower[i].effect);
+ }
+ else
+ CreateBullet1(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].effect);
+ }
+ }
+}
+void ProcessTower2()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=2)continue;
+ towerspr[blue]->SetColor(tower[i].RendColor);
+ towerspr[blue]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ for (int j=1;j<=12;++j)
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,j*0.5236+clockrot,tower[i].effect);
+ clockrot+=deltarot;
+ deltarot+=deltadelta;
+ }
+ }
+}
+void ProcessTower3()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=3)continue;
+ towerspr[blue]->SetColor(tower[i].RendColor);
+ towerspr[blue]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ if (tower[i].t3t==999)
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].offset,tower[i].effect);
+ if (tower[i].t3t==0)
+ for (int j=1;j<=12;++j)
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,j,tower[i].effect);
+ if (tower[i].t3t==1)
+ {
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,12,tower[i].effect);
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,3,tower[i].effect);
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,6,tower[i].effect);
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,9,tower[i].effect);
+ }
+ if (tower[i].t3t==4)
+ {
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*3/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*5/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*7/4.0f,tower[i].effect);
+ }
+ if (tower[i].t3t==5)
+ {
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*3/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*5/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*7/4.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,0,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi/2.0f,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi,tower[i].effect);
+ CreateBullet2(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,pi*3/2.0f,tower[i].effect);
+ }
+ if (tower[i].t3t==2)
+ {
+ if (re.NextInt(0,1))
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,12,tower[i].effect);
+ else
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,6,tower[i].effect);
+ }
+ if (tower[i].t3t==3)
+ {
+ if (re.NextInt(0,1))
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,3,tower[i].effect);
+ else
+ CreateBullet3(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,9,tower[i].effect);
+ }
+ }
+ }
+}
+void ProcessTower4()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=4)continue;
+ towerspr[yellow]->SetColor(tower[i].RendColor);
+ towerspr[yellow]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ CreateBullet4(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].yelbrk,tower[i].effect);
+ }
+ }
+}
+void ProcessTower5()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=5)continue;
+ towerspr[purple]->SetColor(tower[i].RendColor);
+ towerspr[purple]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ CreateBullet5(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].effect);
+ }
+ }
+}
+void ProcessTower6()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=6)continue;
+ towerspr[red]->SetColor(tower[i].RendColor);
+ towerspr[red]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ CreateBullet6(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].redexplo,tower[i].exp1,tower[i].exp2,tower[i].effect);
+ }
+ }
+}
+void ProcessTower7()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=7)continue;
+ towerspr[white]->SetColor(tower[i].RendColor);
+ towerspr[white]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ CreateBullet7(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].redexplo,tower[i].effect);
+ }
+ }
+}
+void ProcessTower8()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=8)continue;
+ towerspr[dblue]->SetColor(tower[i].RendColor);
+ towerspr[dblue]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (!tower[i].dblstate)
+ {
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ tower[i].dblstate=true;
+ tower[i].curtimer2=tower[i].towertimer2;
+ tower[i].curshotcount=tower[i].shotcount;
+ if (!Dis8ref&&!t8special)BTarg.TargShow();
+ if (!Dis8ref)BTarg.targpos=playerpos;
+ if (PlayerSplit)
+ {
+ int r=0;
+ for(int i=1;i<4;++i)
+ if(GetDist(playerpos+splitData[r],vector2d(400,300))>
+ GetDist(playerpos+splitData[i],vector2d(400,300)))r=i;
+ BTarg.targpos=playerpos+splitData[r];
+ }
+ }
+ }
+ else
+ {
+ if (LOWFPS)
+ tower[i].curtimer2-=17;
+ else
+ --tower[i].curtimer2;
+ if (tower[i].curtimer2<=0)
+ {
+ if (tower[i].curshotcount<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ tower[i].dblstate=false;
+ tower[i].curtimer2=tower[i].towertimer2;
+ tower[i].curshotcount=tower[i].shotcount;
+ if (!Dis8ref)BTarg.TargHide();
+ continue;
+ }
+ if (!t8special)
+ {
+ int pnt=CreateBullet8(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].effect);
+ if(level==-1&&part==21)bullet[pnt].redattrib=1;else bullet[pnt].redattrib=0;
+ if (Dis8ref)
+ {
+ if (tower[i].towerpos.y<300)
+ bullet[pnt].setdir(-pi/2);else bullet[pnt].setdir(pi/2);
+ }
+ else bullet[pnt].redir(BTarg.targpos);
+ }
+ else
+ {
+ for(int j=0;j<5;++j)
+ {
+ int pnt=CreateBullet8(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].effect);
+ bullet[pnt].alterColor=white;
+ bullet[pnt].redir(BTarg.targpos);
+ bullet[pnt].bulletdir.Rotate(j*2*pi/5);
+ }
+ }
+ tower[i].curtimer2=tower[i].towertimer2;
+ --tower[i].curshotcount;
+ }
+ }
+ }
+}
+void ProcessTower9()
+{
+ for (int i=1;i<=towcnt;++i)
+ {
+ if (!tower[i].exist||tower[i].towertype!=9)continue;
+ towerspr[orange]->SetColor(tower[i].RendColor);
+ towerspr[orange]->RenderEx(tower[i].towerpos.x+7.2,tower[i].towerpos.y+7.2,0,0.545);
+ if (DisableAllTower)continue;
+ if (LOWFPS)
+ tower[i].curtimer-=17;
+ else
+ --tower[i].curtimer;
+ if (tower[i].curtimer<=0)
+ {
+ tower[i].curtimer=tower[i].towertimer;
+ CreateBullet9(tower[i].towerpos.x,tower[i].towerpos.y,tower[i].bulletspeed,tower[i].redexplo,tower[i].whicnt,tower[i].yelbrk,tower[i].effect);
+ }
+ }
+}
+//Laser Implementation
+int Lasercnt;
+class Laser
+{
+private:
+ hgeDistortionMesh *graphic;
+ int Res;
+ vector2d data1[MaxRes],data2[MaxRes];
+ double GetDist()
+ {
+ double res=99999.9999f,tres;
+ static vector2d correction=vector2d(8.4,8.4);
+ for (int i=0;i<Res-1;++i)
+ {
+ vector2d sa,sb;
+ sa=data1[i]+RenCtr;sb=data1[i+1]+RenCtr;
+ tres=GetDistSeg(sa,sb,playerpos+correction);
+ sa=data2[i]+RenCtr;sb=data2[i+1]+RenCtr;
+ if(GetDistSeg(sa,sb,playerpos+correction)<tres)
+ tres=GetDistSeg(sa,sb,playerpos+correction);
+ if (tres<res)res=tres;
+ }
+ return res;
+ }
+public:
+ bool EnableColl;
+ vector2d RenCtr;
+ int collbrk,scollbrk;
+ void SetRes(int _Res){Res=_Res;}
+ void Render()
+ {
+ graphic->Render(RenCtr.x,RenCtr.y);
+ }
+ void Init(int _Res=0)
+ {
+ graphic=new hgeDistortionMesh(MaxRes,2);
+ graphic->Clear(0x00000000);
+ collbrk=scollbrk=0;
+ Res=_Res;
+ EnableColl=false;
+ }
+ void SetTexture(HTEXTURE Texture,double x=0.0f,double y=0.0f,double w=0.0f,double h=0.0f)
+ {
+ graphic->SetTexture(Texture);
+ if (x||y||w||h)graphic->SetTextureRect(x,y,w,h);
+ }
+ void Setdata(int x,vector2d pa,vector2d pb,DWORD color)
+ {
+ data1[x]=pa;data2[x]=pb;
+ graphic->SetDisplacement(x,0,data1[x].x,data1[x].y,HGEDISP_TOPLEFT);
+ graphic->SetDisplacement(x,1,data2[x].x,data2[x].y,HGEDISP_TOPLEFT);
+ graphic->SetColor(x,0,color);graphic->SetColor(x,1,color);
+ }
+ bool InsPoint(vector2d pa,vector2d pb,DWORD color)
+ {
+ if (Res==MaxRes)return false;
+ data1[++Res-1]=pa;data2[Res-1]=pb;
+ graphic->SetDisplacement(Res-1,0,data1[Res].x,data1[Res].y,HGEDISP_TOPLEFT);
+ graphic->SetDisplacement(Res-1,1,data2[Res].x,data2[Res].y,HGEDISP_TOPLEFT);
+ graphic->SetColor(Res-1,0,color);graphic->SetColor(Res-1,1,color);
+ return true;
+ }
+ void RemoveLastPoint(DWORD color)
+ {
+ for (int i=2;i<=Res;++i)
+ {
+ data1[i-1]=data1[i];
+ data2[i-1]=data2[i];
+ graphic->SetDisplacement(i-1,0,data1[i-1].x,data1[i-1].y,HGEDISP_TOPLEFT);
+ graphic->SetDisplacement(i-1,1,data2[i-1].x,data2[i-1].y,HGEDISP_TOPLEFT);
+ graphic->SetColor(i-1,0,color);graphic->SetColor(i-1,1,color);
+ }
+ graphic->SetDisplacement(Res-1,0,data1[Res].x,data1[Res].y,HGEDISP_TOPLEFT);
+ graphic->SetDisplacement(Res-1,1,data2[Res].x,data2[Res].y,HGEDISP_TOPLEFT);
+ graphic->SetColor(Res-1,0,color);graphic->SetColor(Res-1,1,color);
+ --Res;
+ }
+ void Process()
+ {
+ Render();
+ if (EnableColl)
+ {
+ if (GetDist()<3.0f&&clrrange<1e-5&&clrrad-pi/2<1e-7)
+ {
+ if (!LOWFPS)++collbrk;else collbrk+=17;
+ if (collbrk>200)
+ ++coll,scminus+=10000,collbrk=0,Mult_BatClear();
+ }
+ }
+ if (GetDist()<9.0f)
+ {
+ if (!LOWFPS)++scollbrk;else scollbrk+=17;
+ if (scollbrk>200)
+ ++semicoll,scollbrk=0,++dsmc,SCEffect_Attatch();
+ }
+
+ }
+}laser[200];
+void ProcessLaser()
+{
+ //Well, I only cares rendering and collision checking..
+ //Change laser data in the level code.
+ for (int i=1;i<=Lasercnt;++i)laser[i].Process();
+}
+//Special bullet creation and processing code for some level...
+void CreateBullet2(Bullet &Tar,double x,double y,double bs,double rad,bool eff=false)
+{
+ Tar.exist=true;
+ Tar.bullettype=2;
+ Tar.bulletpos.x=x;
+ Tar.bulletpos.y=y;
+ Tar.bulletdir.x=cos(rad);
+ Tar.bulletdir.y=sin(rad);
+ Tar.bulletspeed=bs;
+ Tar.alterColor=blue;
+ Tar.scale=1;
+ Tar.scollable=true;
+ Tar.bulletaccel=0;
+}
+void ProcessBullet2(Bullet &xbul,bool colchk=true)
+{
+ if (!xbul.exist||xbul.bullettype!=2)return;
+ if (!xbul.dist)xbul.dist=1;
+ if (xbul.bulletaccel>0&&xbul.bulletspeed<xbul.limv)xbul.bulletspeed+=xbul.bulletaccel*(1000.0f/hge->Timer_GetFPS());
+ if (xbul.bulletaccel<0&&xbul.bulletspeed>xbul.limv)xbul.bulletspeed+=xbul.bulletaccel*(1000.0f/hge->Timer_GetFPS());
+ xbul.bulletpos.x-=xbul.bulletspeed*(xbul.bulletdir.x/xbul.dist)/20*(1000.0f/hge->Timer_GetFPS());
+ xbul.bulletpos.y-=xbul.bulletspeed*(xbul.bulletdir.y/xbul.dist)/20*(1000.0f/hge->Timer_GetFPS());
+ double dis=GetDist(xbul.bulletpos,playerpos);
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7&&colchk&&xbul.collable)
+ {
+ ++coll,scminus+=10000,Mult_BatClear();xbul.collable=false;
+ return;
+ }
+ if (dis<=16&&xbul.scollable)++semicoll,++dsmc,xbul.scollable=false,SCEffect_Attatch();
+ if (colchk)bulletspr[xbul.alterColor]->RenderEx(xbul.bulletpos.x+7.2,xbul.bulletpos.y+7.2,0,0.6*xbul.scale);
+}
+//"Noname"
+class Noname01dotpas
+{
+private:
+ Laser untitledlas;
+ Bullet untitledbul;
+ double x,y,range1,range2;
+ double r1lim,r2lim;
+ bool las,reverse,done;
+ int PMod,pos,boomlim;
+ DWORD color;
+public:
+ bool Exist()
+ {
+ return (fabs(y)>1e-6);
+ }
+ void Init(int x,int pmd,double _r1lim,double _r2lim,int _boomlim,DWORD _color)
+ {
+ untitledlas.Init();
+ this->x=x,this->y=2;color=_color;
+ CreateBullet2(untitledbul,x,2,0,3*pi/2);
+ untitledbul.bulletaccel=0.0005;
+ untitledbul.limv=2;untitledbul.collable=true;
+ las=false;
+ reverse=false;
+ done=false;
+ PMod=pmd;
+ r1lim=_r1lim;r2lim=_r2lim;boomlim=_boomlim;
+ if (re.NextInt(0,100)>boomlim)
+ pos=re.NextInt(0,600);
+ else
+ pos=999;
+ untitledlas.SetTexture(SprSheet,0,264,248,8);
+ }
+ void noname2pnt()
+ {
+ if(!las)
+ CreateBullet255(untitledbul.bulletpos.x,untitledbul.bulletpos.y,10);
+ else
+ {
+ for (int i=0;i<60;++i)
+ {
+ double trad=(i/60.0f)*pi*2;
+ vector2d a;
+ if (!(i%PMod))
+ {
+ a.x=cos(trad)*range2;a.y=sin(trad)*range2;
+ }
+ else
+ {
+ a.x=cos(trad)*range1;a.y=sin(trad)*range1;
+ }
+ a=a+untitledbul.bulletpos;
+ CreateBullet255(a.x,a.y,10);
+ }
+ }
+ }
+ void Process()
+ {
+ if (!las)
+ ProcessBullet2(untitledbul),x=untitledbul.bulletpos.x,y=untitledbul.bulletpos.y;
+ else
+ untitledlas.EnableColl=true,
+ untitledlas.Process();
+ if (!untitledbul.exist)y=-1;
+ if (y>pos&&!done&&!las)
+ {
+ las=true;
+ range1=range2=2;
+ for (int i=0;i<60;++i)
+ {
+ double trad=(i/60.0f)*pi*2;
+ vector2d a,b;
+ a.x=cos(trad)*range1;a.y=sin(trad)*range1;
+ b.x=cos(trad)*(range1-10);b.y=sin(trad)*(range1-10);
+ untitledlas.InsPoint(a,b,color);
+ }
+ int i=60;
+ double trad=1.0f/60*pi*2;
+ vector2d a,b;
+ if (!(i%PMod))
+ {
+ a.x=cos(trad)*range2;a.y=sin(trad)*range2;
+ b.x=cos(trad)*(range2-10);b.y=sin(trad)*(range2-10);
+ }
+ else
+ {
+ a.x=cos(trad)*range1;a.y=sin(trad)*range1;
+ b.x=cos(trad)*(range1-10);b.y=sin(trad)*(range1-10);
+ }
+ for (int i=60;i<MaxRes;++i)untitledlas.InsPoint(a,b,color);
+ }else
+ if (las)
+ {
+ untitledlas.RenCtr=vector2d(x+7.2,y+7.2);
+ untitledlas.Render();untitledlas.EnableColl=true;
+ untitledlas.Process();
+ if (!reverse)
+ {
+ if (range1<r1lim)range1+=0.2*(1000.0/hge->Timer_GetFPS()),range2=range1;
+ if (range1>=r1lim&&range2<r2lim)range2+=0.1*(1000.0/hge->Timer_GetFPS());
+ if (range2>=r2lim)reverse=true;
+ }
+ else
+ {
+ if (range2>=r1lim)range2-=0.1*(1000.0/hge->Timer_GetFPS());else range1-=0.2*(1000.0/hge->Timer_GetFPS()),range2=range1;
+ if (range1<=2)las=false,done=true;
+ }
+ for (int i=0;i<60;++i)
+ {
+ double trad=(i/60.0f)*pi*2;
+ vector2d a,b;
+ if (!(i%PMod))
+ {
+ a.x=cos(trad)*range2;a.y=sin(trad)*range2;
+ b.x=cos(trad)*(range2-10);b.y=sin(trad)*(range2-10);
+ }
+ else
+ {
+ a.x=cos(trad)*range1;a.y=sin(trad)*range1;
+ b.x=cos(trad)*(range1-10);b.y=sin(trad)*(range1-10);
+ }
+ untitledlas.Setdata(i,a,b,color);
+ }
+ int i=60;
+ double trad=pi*2;
+ vector2d a,b;
+ if (!(i%PMod))
+ {
+ a.x=cos(trad)*range2;a.y=sin(trad)*range2;
+ b.x=cos(trad)*(range2-10);b.y=sin(trad)*(range2-10);
+ }
+ else
+ {
+ a.x=cos(trad)*range1;a.y=sin(trad)*range1;
+ b.x=cos(trad)*(range1-10);b.y=sin(trad)*(range1-10);
+ }
+ for (int i=60;i<MaxRes;++i)
+ untitledlas.Setdata(60,a,b,color);
+ }
+ }
+}noname[1000];
+//"CTarg"
+class SimpleBullet
+{
+public:
+ TColors aC,aC2;
+ vector2d bulletpos;
+ int scollable,lastcoll;
+ double rot;
+ bool Update_SimpBul()
+ {
+ if (lastcoll)
+ {
+ ++lastcoll;
+ if (LOWFPS)lastcoll+=16;
+ }
+ if (scollable)
+ {
+ ++scollable;
+ if (LOWFPS)scollable+=16;
+ }
+ if (lastcoll>=200)lastcoll=0;
+ if (scollable>=200)scollable=0;
+ if (aC2==COLOR_COUNT)bulletspr[aC]->RenderEx(bulletpos.x+7.2,bulletpos.y+7.2,0,0.6,0);//blink hack
+ else RenderAlter(vector2d(bulletpos.x+7.2,bulletpos.y+7.2),aC,aC2,rot,0.6);
+ double dis=GetDist(bulletpos,playerpos);
+ if (dis<=6&&clrrange<1e-5&&clrrad-pi/2<1e-7&&!lastcoll)
+ {
+ ++coll,scminus+=10000;lastcoll=1;Mult_BatClear();
+ return true;//Collision
+ }
+ else
+ {
+ if (dis<=16&&!scollable)++semicoll,++dsmc,scollable=1,SCEffect_Attatch();
+ return false;
+ }
+ }
+};
+class TCTarg
+{
+private:
+ Target Targ;
+ SimpleBullet CircBul[37];
+ int BulLim,bul;
+ double radian,range;
+ double Ubrk,Ulim;
+public:
+ void Init(int _BulLim,double _InitRange,double _Ulim)
+ {
+ Targ.Init(-0.01,playerpos);
+ Targ.TargShow();
+ BulLim=_BulLim;
+ Ulim=_Ulim;
+ bul=BulLim;
+ radian=0;
+ range=_InitRange;
+ for (int i=1;i<=BulLim;++i)
+ {
+ CircBul[i].bulletpos=vector2d(3+Targ.targpos.x+range*sin(radian-i*(2*pi/BulLim)),
+ 3+Targ.targpos.y-range*cos(radian-i*(2*pi/BulLim)));
+ CircBul[i].aC=blue;CircBul[i].aC2=COLOR_COUNT;CircBul[i].rot=0;
+ CircBul[i].scollable=0;
+ }
+ }
+ double GetRange()
+ {
+ return range;
+ }
+ void SetRange(double _range)
+ {
+ range=_range;
+ }
+ void Update()
+ {
+ Targ.TargRender();
+ if (LOWFPS)radian+=17*60*pi/50000.0f;else radian+=60*pi/50000.0f;
+ Ubrk+=hge->Timer_GetDelta();
+ hgeColorRGB tcol;
+ tcol.a=tcol.r=1;
+ tcol.b=tcol.g=Ubrk>Ulim?0.0f:(Ulim-Ubrk)/Ulim;
+ Targ.targspr->SetColor(tcol.GetHWColor());
+ if (Ubrk>Ulim)
+ {
+ Targ.TargFollowPlayer();
+ if (GetDist(Targ.targpos,playerpos)<4.0f)Ubrk=0.0f;
+ }
+ for (int i=1;i<=bul;++i)
+ {
+ CircBul[i].bulletpos=vector2d(3+Targ.targpos.x+range*sin(radian-i*(2*pi/BulLim))-6,
+ 3+Targ.targpos.y-range*cos(radian-i*(2*pi/BulLim))-6);
+ CircBul[i].Update_SimpBul();
+ }
+ }
+};
+TCTarg CTarg;
+#undef rad1
+#undef rad2
+class TROF
+{
+public:
+ int Bul[64];
+ double rad1,rad2,drad,srad,dtrad,dtrad2;
+ double range,drange,dtrange,cdtrange;
+ int stage,cnt,ccnt,delay,cf;
+ double elasp;
+ void init()
+ {
+ stage=0;rad1=rad2=srad;elasp=0.0f;ccnt=0;
+ for (int i=0;i<cnt;++i)Bul[i]=CreateBullet8(400,300,0,false),bullet[Bul[i]].setdir(srad),bullet[Bul[i]].scale=0.01,bullet[Bul[i]].inv=true;
+ bullet[Bul[0]].bulletspeed=2;bullet[Bul[0]].scale=1;
+ }
+ void stage0()
+ {
+ elasp+=hge->Timer_GetDelta();
+ if ((int)(elasp/0.15f)>ccnt&&ccnt<cnt-1)
+ {
+ ccnt=(int)(elasp/0.2f);
+ if (ccnt==1)dtrange=GetDist(bullet[Bul[0]].bulletpos,bullet[Bul[1]].bulletpos);
+ bullet[Bul[ccnt]].bulletspeed=2;bullet[Bul[ccnt]].scale=1;
+ }
+ if (elasp>2)
+ {
+ stage=1;NewMultpo(vector2d(400,300));
+ drange=GetDist(bullet[Bul[ccnt-1]].bulletpos,vector2d(400,300));
+ dtrad=(drad-srad);while (dtrad>pi/6.0f)dtrad-=pi/6.0f;dtrad/=delay;
+ dtrad2=(2*pi-drad+srad);while (dtrad2>pi/6.0f)dtrad2-=pi/6.0f;dtrad2/=delay;
+ for (int i=0;i<cnt;++i)bullet[Bul[i]].bulletspeed=0;
+ cf=0;
+ }
+ }
+ void stage1()
+ {
+ cf+=(LOWFPS?17:1);
+ rad1=srad+dtrad*cf;rad2=srad-dtrad2*cf;
+ for (int i=0;i<cnt;++i)
+ if (bullet[Bul[i]].bullettype==8)
+ {
+ if (i&1)
+ bullet[Bul[i]].bulletpos=vector2d(400+(drange+(cnt-i)*dtrange)*cos(rad1-pi),300+(drange+(cnt-i)*dtrange)*sin(rad1-pi));
+ else
+ bullet[Bul[i]].bulletpos=vector2d(400+(drange+(cnt-i)*dtrange)*cos(rad2-pi),300+(drange+(cnt-i)*dtrange)*sin(rad2-pi));
+ }
+ if (cf>delay)
+ {
+ cf=delay;
+ rad1=srad+dtrad*cf;rad2=srad-dtrad2*cf;
+ for (int i=0;i<cnt;++i)
+ if (bullet[Bul[i]].bullettype==8)
+ {
+ if (i&1)
+ bullet[Bul[i]].bulletpos=vector2d(400+(drange+(cnt-i)*dtrange)*cos(rad1-pi),300+(drange+(cnt-i)*dtrange)*sin(rad1-pi));
+ else
+ bullet[Bul[i]].bulletpos=vector2d(400+(drange+(cnt-i)*dtrange)*cos(rad2-pi),300+(drange+(cnt-i)*dtrange)*sin(rad2-pi));
+ bullet[Bul[i]].bulletspeed=2,bullet[Bul[i]].redir(vector2d(400,300)),
+ bullet[Bul[i]].bulletdir=vector2d(-bullet[Bul[i]].bulletdir.x,-bullet[Bul[i]].bulletdir.y);
+ bullet[Bul[i]].inv=false;
+ }
+ stage=2;
+ }
+ }
+ void stage2(){}
+ void update()
+ {
+ switch(stage)
+ {
+ case 0:stage0();break;
+ case 1:stage1();break;
+ case 2:stage2();break;
+ }
+ }
+};
+class BCircle
+{
+private:
+ SimpleBullet Bullets[360];
+ int BCnt;
+ double radian,range,DT,drad;
+ vector2d Centre;
+public:
+ void Init(double _irange,double _drad,int _Cnt,vector2d _Centre,TColors _Col=blue,TColors _Col2=COLOR_COUNT)
+ {
+ range=_irange;
+ BCnt=_Cnt;
+ radian=0;
+ DT=0.0f;
+ drad=_drad;
+ Centre=_Centre;
+ for (int i=1;i<=BCnt;++i)
+ {
+ Bullets[i].bulletpos=vector2d(3+Centre.x+range*sin(radian-i*(2*pi/BCnt))-6,
+ 3+Centre.y-range*cos(radian-i*(2*pi/BCnt))-6);
+ Bullets[i].aC=_Col;Bullets[i].aC2=_Col2;
+ Bullets[i].rot=0;
+ }
+ }
+ double GetRange(){return range;}
+ void SetRange(double _range){range=_range;}
+ void SetDT(double _DT){DT=_DT;}
+ double GetDT(){return DT;}
+ double GetRad(){return radian;}
+ void circ2pnt()
+ {
+ for(int i=1;i<=BCnt;++i)
+ CreateBullet255(Bullets[i].bulletpos.x,Bullets[i].bulletpos.y,10);
+ }
+ void Update()
+ {
+ DT+=hge->Timer_GetDelta();
+ if (LOWFPS)radian+=17*drad;else radian+=drad;
+ for (int i=1;i<=BCnt;++i)
+ {
+ Bullets[i].bulletpos=vector2d(3+Centre.x+range*sin(radian-i*(2*pi/BCnt))-6,
+ 3+Centre.y-range*cos(radian-i*(2*pi/BCnt))-6);
+ Bullets[i].rot+=(LOWFPS?17:1)*pi/1000;
+ Bullets[i].Update_SimpBul();
+ }
+ }
+};
+class BulletSine
+{
+private:
+ Bullet headb;
+ vector2d a,b,lastgenerated;
+ int generated[400];
+ int gencnt;
+ bool OutOfBound()
+ {
+ if (headb.bulletpos.x<=-25||headb.bulletpos.x>=825||headb.bulletpos.y<=-25||headb.bulletpos.y>=625)
+ return true;return false;
+ }
+public:
+ bool active;
+ void Init(vector2d _a,vector2d _b)
+ {
+ a=_a;b=_b;lastgenerated=_a;
+ CreateBullet2(headb,a.x,a.y,6,0);
+ headb.redir(b);
+ active=true;memset(generated,0,sizeof(generated));
+ gencnt=0;
+ }
+ void Update()
+ {
+ if (GetDist(lastgenerated,headb.bulletpos)>4.0f)
+ {
+ ++gencnt;
+ double rad=(gencnt&1)?(gencnt+1)/2*pi/18.0f:-gencnt/2*pi/18.0f;
+ generated[gencnt]=CreateBullet2(headb.bulletpos.x,headb.bulletpos.y,0,rad,true);
+ bullet[generated[gencnt]].inv=true;
+ lastgenerated=headb.bulletpos;
+ }
+ if (OutOfBound())
+ {
+ active=false;
+ for (int i=1;i<=gencnt;++i)
+ if (generated[i])
+ bullet[generated[i]].bulletaccel=0.005,bullet[generated[i]].limv=2,
+ bullet[generated[i]].inv=false,bullet[generated[i]].collable=true;
+ memset(generated,0,sizeof(generated));
+ }
+ ProcessBullet2(headb);
+ }
+};
+class WOP
+{
+private:
+ int trail[200];
+ double brk,blim,rad,k,ml;
+ vector2d a,b;
+ Bullet hbul;
+ bool OutOfBound()
+ {
+ if (hbul.bulletpos.x<=-25||hbul.bulletpos.x>=825||hbul.bulletpos.y<=-25||hbul.bulletpos.y>=625)
+ {
+ for (int i=0;i<200;++i)if (trail[i])return false;
+ return true;
+ }return false;
+ }
+public:
+ bool active;
+ void Init(vector2d _a,vector2d _b,double _ml,double _bl)
+ {
+ a=_a,b=_b,ml=_ml,blim=_bl;rad=0;
+ if (fabs(b.x-a.x)<1e-6)return;k=(b.y-a.y)/(b.x-a.x);
+ CreateBullet2(hbul,a.x,a.y,7,0);hbul.redir(b);
+ active=true;memset(trail,0,sizeof(trail));
+ }
+ void Update()
+ {
+ if (Current_Position!=1)return;
+ ProcessBullet2(hbul,false);
+ brk+=hge->Timer_GetDelta();
+ if (brk>blim)
+ {
+ brk=0;
+ for (int i=0;i<200;++i)
+ {
+ if (trail[i])
+ if (bullet[trail[i]].lifetime>ml)BulletEffect_Death(bullet[trail[i]],0x8000CCFF),bullet[trail[i]].exist=false,trail[i]=0;
+ }
+ rad+=pi/16.0f;
+ vector2d uv=ToUnitCircle(vector2d(1,-k));uv.Swap();
+ int pnt=0;while (trail[pnt])++pnt;
+ trail[pnt]=CreateBullet2(hbul.bulletpos.x+uv.x*50*sin(rad),hbul.bulletpos.y+uv.y*50*sin(rad),0,0,true);
+ pnt=0;while (trail[pnt])++pnt;
+ trail[pnt]=CreateBullet2(hbul.bulletpos.x-uv.x*50*sin(rad),hbul.bulletpos.y-uv.y*50*sin(rad),0,0,true);
+ }
+ if (OutOfBound())active=false;
+ }
+};
+class BTail
+{
+//devide the screen into a 16*12 matrix, put random colored bullets, arranged
+//in the shape of the snake, on to it.
+//^Maybe this description is too bad to understand. See the code.
+//Partly based on class WOP
+private:
+ class Pile
+ {
+ private:
+ int pb[200];
+ int matrixx,matrixy,progress,cnt;
+ double brk;TColors color;
+ public:
+ int getProgress(){return progress;}
+ void create(int _x,int _y,TColors _col)
+ {
+ matrixx=_x;matrixy=_y;color=_col;
+ progress=1;cnt=0;
+ }
+ void kill()
+ {
+ for(int i=0;i<cnt;++i)
+ {
+ if(pb[i])
+ {
+ if(bullet[pb[i]].bullettype==2)
+ {
+ bullet[pb[i]].exist=false;pb[i]=0;
+ }
+ }
+ }
+ }
+ void update()
+ {
+ if(!progress)return;
+ if(progress<10)
+ {
+ brk+=hge->Timer_GetDelta();
+ if(brk>0.03)
+ {
+ brk=0;if(progress++>5)return (void)(progress=10);
+ for(int i=0;i<10;++i)
+ {
+ vector2d ran=vector2d(re.NextDouble(0,50)+matrixx*50,re.NextDouble(0,50)+matrixy*50);
+ pb[cnt++]=CreateBullet2(ran.x,ran.y,0,0,true);
+ bullet[pb[cnt-1]].alterColor=color;
+ }
+ }
+ }
+ else
+ {
+ brk+=hge->Timer_GetDelta();
+ if(brk>0.03)
+ {
+ bool alldone=true;
+ for(int i=0;i<cnt;++i)
+ {
+ if(pb[i])
+ {
+ if(bullet[pb[i]].bullettype==2&&bullet[pb[i]].lifetime>1)
+ {
+ BulletEffect_Death(bullet[pb[i]],ColorToDWORD(color));
+ bullet[pb[i]].exist=false;pb[i]=0;
+ }
+ else alldone=false;
+ }
+ }
+ if(alldone)progress=0;
+ }
+ }
+ }
+ };
+ Pile piles[30];
+ bool tactive;
+ int listx[30],listy[30],cnt;
+ TColors pcolor;double tlifetime;
+ bool check(int x,int y)
+ {
+ if(x<0||x>15)return false;
+ if(y<0||y>12)return false;
+ for(int i=0;i<cnt;++i)
+ if(x==listx[i]&&y==listy[i])return false;
+ return true;
+ }
+public:
+ bool isActive(){return tactive;}
+ void Create()
+ {
+ pcolor=(TColors)re.NextInt(0,7);tactive=true;
+ cnt=0;memset(listx,0,sizeof(listx));
+ memset(listy,0,sizeof(listy));tlifetime=0;
+ listx[cnt++]=re.NextInt(0,15);listy[cnt-1]=re.NextInt(0,11);
+ piles[cnt-1].create(listx[cnt-1],listy[cnt-1],pcolor);
+ }
+ void Update()
+ {
+ tlifetime+=hge->Timer_GetDelta();
+ if(tlifetime>15)
+ {
+ tactive=false;
+ for(int i=0;i<30;++i)
+ if(piles[i].getProgress())piles[i].kill();
+ }
+ if(piles[cnt-1].getProgress()==10)
+ {
+ int dlx[4],dly[4],dcnt=0;
+ if(check(listx[cnt-1]+1,listy[cnt-1]))
+ dlx[dcnt]=listx[cnt-1]+1,dly[dcnt++]=listy[cnt-1];
+ if(check(listx[cnt-1]-1,listy[cnt-1]))
+ dlx[dcnt]=listx[cnt-1]-1,dly[dcnt++]=listy[cnt-1];
+ if(check(listx[cnt-1],listy[cnt-1]+1))
+ dlx[dcnt]=listx[cnt-1],dly[dcnt++]=listy[cnt-1]+1;
+ if(check(listx[cnt-1],listy[cnt-1]-1))
+ dlx[dcnt]=listx[cnt-1],dly[dcnt++]=listy[cnt-1]-1;
+ if(dcnt&&cnt<30)
+ {
+ int rd=re.NextInt(0,dcnt-1);
+ listx[cnt++]=dlx[rd];listy[cnt-1]=dly[rd];
+ piles[cnt-1].create(listx[cnt-1],listy[cnt-1],pcolor);
+ }
+ }
+ bool none=true;
+ for(int i=0;i<30;++i)
+ if(piles[i].getProgress())none=false,piles[i].update();
+ if(none)tactive=false;
+ }
+};
+class SimpleThing
+{
+private:
+ vector2d center;
+ int step,cnt;
+ double rad,dly,lr,ra;
+ SimpleBullet b[500];
+ double r[500],mr[500];
+ bool create,rot;
+public:
+ void Init(vector2d _ctr)
+ {
+ center=_ctr;step=cnt=dly=lr=ra=0;
+ create=true;rot=false;
+ }
+ void Update(bool rv)
+ {
+ dly+=hge->Timer_GetDelta();
+ if(dly>0.2&&create)
+ {
+ dly=0;
+ for(int i=0;i<10;++i)
+ {
+ b[cnt].bulletpos=center;
+ b[cnt].aC=blue;b[cnt].aC2=COLOR_COUNT;
+ r[cnt/10]=0;mr[cnt/10]=(lr+=2);
+ if (lr>620)create=false;
+ ++cnt;
+ }
+ }
+ bool all=!create;
+ if(!rot)
+ for(int i=0;i<cnt;++i)
+ {
+ b[i].bulletpos=vector2d(center.x+r[i/10]*cos(i/10*pi/12+pi/5*(i%10)),center.y+r[i/10]*sin(i/10*pi/12+pi/5*(i%10)));
+ if(r[i/10]<mr[i/10])r[i/10]+=(LOWFPS?17:1)*0.01,all=false;
+ else r[i/10]=mr[i/10];
+ b[i].Update_SimpBul();
+ }
+ if(all||rot)
+ {
+ rot=true;
+ rv?rad+=(LOWFPS?17:1)*ra:rad-=(LOWFPS?17:1)*ra;
+ if(ra<pi/7200)ra+=(LOWFPS?17:1)*pi/630000000.0f;
+ for(int i=0;i<cnt;++i)
+ {
+ b[i].bulletpos=vector2d(center.x+r[i/10]*cos(i/10*pi/12+rad+pi/5*(i%10)),center.y+r[i/10]*sin(i/10*pi/12+rad+pi/5*(i%10)));
+ b[i].Update_SimpBul();
+ }
+ }
+ }
+ void toPoint()
+ {
+ for(int i=0;i<cnt;++i)
+ CreateBullet255(b[i].bulletpos.x,b[i].bulletpos.y,10);
+ }
+};
+class diffCreator
+{
+protected:
+ bool active;
+ double range;
+ int cnt;
+ vector2d center;
+ int C;
+ int target[200];
+ vector2d created[200];
+private:
+ TColors rbGetColor(int a)
+ {
+ switch (a)
+ {
+ case 2:return orange;
+ case 3:return yellow;
+ case 4:return green;
+ case 5:return blue;
+ case 6:return dblue;
+ case 7:return purple;
+ default:return circle;
+ }
+ }
+ bool test(vector2d a)
+ {
+ for(int i=0;i<cnt;++i)
+ if(GetDist(a,created[i])<12)return false;
+ return true;
+ }
+public:
+ void init(vector2d _ctr)
+ {
+ active=true;
+ cnt=0;range=0;
+ center=_ctr;
+ C=CreateBullet2(center.x,center.y,0,0,true);
+ bullet[C].alterColor=red;
+ }
+ bool isActive(){return active;}
+ void update()
+ {
+ range+=hge->Timer_GetDelta()*400;
+ vector2d a;bool all=true;
+ for(a=vector2d(center.x-15,center.y);a.x>-25;a.x-=15)
+ if(GetDist(a,center)<=range)
+ {
+ if(test(a))
+ target[cnt++]=CreateBullet2(a.x,a.y,0,0,true),
+ created[cnt-1]=vector2d(a.x,a.y),
+ bullet[target[cnt-1]].inv=true,
+ bullet[target[cnt-1]].alterColor=red;
+ }
+ else all=false;
+ for(a=vector2d(center.x+15,center.y);a.x<825;a.x+=15)
+ if(GetDist(a,center)<=range)
+ {
+ if(test(a))
+ target[cnt++]=CreateBullet2(a.x,a.y,0,pi,true),
+ created[cnt-1]=vector2d(a.x,a.y),
+ bullet[target[cnt-1]].inv=true,
+ bullet[target[cnt-1]].alterColor=red;
+ }
+ else all=false;
+ for(a=vector2d(center.x,center.y-15);a.y>-25;a.y-=15)
+ if(GetDist(a,center)<=range)
+ {
+ if(test(a))
+ target[cnt++]=CreateBullet2(a.x,a.y,0,pi/2,true),
+ created[cnt-1]=vector2d(a.x,a.y),
+ bullet[target[cnt-1]].inv=true,
+ bullet[target[cnt-1]].alterColor=red;
+ }
+ else all=false;
+ for(a=vector2d(center.x,center.y+15);a.y<625;a.y+=15)
+ if(GetDist(a,center)<=range)
+ {
+ if(test(a))
+ target[cnt++]=CreateBullet2(a.x,a.y,0,-pi/2,true),
+ created[cnt-1]=vector2d(a.x,a.y),
+ bullet[target[cnt-1]].inv=true,
+ bullet[target[cnt-1]].alterColor=red;
+ }
+ else all=false;
+ a=center;
+#define _bat \
+ bullet[target[cnt-1]].redir(center),\
+ created[cnt-1]=bullet[target[cnt-1]].bulletpos,\
+ bullet[target[cnt-1]].bulletdir.x=-bullet[target[cnt-1]].bulletdir.x,\
+ bullet[target[cnt-1]].bulletdir.y=-bullet[target[cnt-1]].bulletdir.y,\
+ bullet[target[cnt-1]].inv=true,\
+ bullet[target[cnt-1]].alterColor=rbGetColor(i+j);
+ for(int i=1;i<=6;++i)
+ for(int j=1;j<=7-i;++j)
+ if(GetDist(vector2d(a.x+i*15,a.y+j*15),center)<=range){
+ if(test(vector2d(a.x+i*15,a.y+j*15)))
+ target[cnt++]=CreateBullet2(a.x+i*15,a.y+j*15,0,0,true),_bat;}
+ else all=false;
+ for(int i=1;i<=6;++i)
+ for(int j=1;j<=7-i;++j)
+ if(GetDist(vector2d(a.x-i*15,a.y+j*15),center)<=range){
+ if(test(vector2d(a.x-i*15,a.y+j*15)))
+ target[cnt++]=CreateBullet2(a.x-i*15,a.y+j*15,0,0,true),_bat;}
+ else all=false;
+ for(int i=1;i<=6;++i)
+ for(int j=1;j<=7-i;++j)
+ if(GetDist(vector2d(a.x+i*15,a.y-j*15),center)<=range){
+ if(test(vector2d(a.x+i*15,a.y-j*15)))
+ target[cnt++]=CreateBullet2(a.x+i*15,a.y-j*15,0,0,true),_bat;}
+ else all=false;
+ for(int i=1;i<=6;++i)
+ for(int j=1;j<=7-i;++j)
+ if(GetDist(vector2d(a.x-i*15,a.y-j*15),center)<=range){
+ if(test(vector2d(a.x-i*15,a.y-j*15)))
+ target[cnt++]=CreateBullet2(a.x-i*15,a.y-j*15,0,0,true),_bat;}
+ else all=false;
+#undef _bat
+ if(all)
+ {
+ BulletEffect_Death(bullet[C],0x80FF3333);
+ bullet[C].exist=false;
+ for(int i=0;i<cnt;++i)
+ {
+ bullet[target[i]].bulletspeed=-0.5;
+ bullet[target[i]].bulletaccel=0.0005;
+ bullet[target[i]].limv=3;
+ bullet[target[i]].inv=false;
+ bullet[target[i]].collable=true;
+ }
+ active=false;
+ }
+ };
+};
+class RTV
+{
+private:
+ int mode,cnt,stage,spnr,dcorr;
+ bool active;TColors col;
+ double drad,rad,brk;
+ int targ[600];
+public:
+ bool isActive(){return active;}
+ void Init(int _mode,double _drad,int _spnr,TColors _c,int _dcorr)
+ {
+ mode=_mode;drad=_drad;rad=0;spnr=_spnr;
+ brk=0;active=true;cnt=0;stage=0;col=_c;
+ memset(targ,0,sizeof(targ));dcorr=_dcorr;
+ }
+ void Update()
+ {
+ switch(mode)
+ {
+ case 1:
+ {
+ brk+=hge->Timer_GetDelta();
+ bool dchk=(stage==1);
+ for(int i=0;i<cnt;++i)
+ {
+ if(bullet[targ[i]].bulletspeed>1&&GetDist(vector2d(400,300),bullet[targ[i]].bulletpos)>=200)
+ bullet[targ[i]].bulletspeed=0;
+ if(bullet[targ[i]].bulletspeed>1)dchk=false;
+ }
+ if(dchk)
+ {
+ for(int i=0;i<cnt;++i)
+ {
+ double rad=atan2(bullet[targ[i]].bulletdir.y,bullet[targ[i]].bulletdir.x);
+ int cc=(int)(rad/drad);
+ if((cc/6+dcorr)&1)
+ bullet[targ[i]].bulletaccel=0.005,
+ bullet[targ[i]].limv=3;
+ else
+ bullet[targ[i]].bulletaccel=-0.005,
+ bullet[targ[i]].limv=-3;
+ }
+ return(void)(active=false);
+ }
+ if(stage==0)
+ {
+ if(brk>0.05)
+ {
+ brk=0;rad+=drad;
+ if(fabs(rad)>2*pi/spnr+pi/180)return(void)(stage=1);
+ for(int i=0;i<spnr;++i)
+ {
+ targ[cnt]=CreateBullet2(400,300,2,rad+i*2*pi/spnr),
+ bullet[targ[cnt]].inv=true,
+ bullet[targ[cnt++]].alterColor=col;
+ }
+ }
+ }
+ }
+ break;
+ case 2:
+ {
+ brk+=hge->Timer_GetDelta();
+ bool dchk=(stage==1);
+ for(int i=0;i<cnt;++i)
+ {
+ if(bullet[targ[i]].bulletspeed>1&&GetDist(vector2d(400,300),bullet[targ[i]].bulletpos)>=200)
+ bullet[targ[i]].bulletspeed=0;
+ if(bullet[targ[i]].bulletspeed>1)dchk=false;
+ }
+ if(dchk)
+ {
+ if(re.NextInt(0,1))
+ for(int i=0;i<cnt;++i)
+ bullet[targ[i]].bulletaccel=-0.005,
+ bullet[targ[i]].limv=-3;
+ else
+ for(int i=0;i<cnt;++i)
+ bullet[targ[i]].bulletaccel=0.005,
+ bullet[targ[i]].limv=3;
+ return(void)(active=false);
+ }
+ if(stage==0)
+ {
+ if(brk>0.05)
+ {
+ brk=0;rad+=drad;
+ if(fabs(rad)>2*pi/spnr+pi/180)return(void)(stage=1);
+ for(int i=0;i<spnr;++i)
+ {
+ targ[cnt]=CreateBullet2(400,300,2,rad+i*2*pi/spnr),
+ bullet[targ[cnt]].inv=true;
+ bullet[targ[cnt++]].alterColor=col;
+ }
+ }
+ }
+ }
+ break;
+ case 3:
+ {
+ brk+=hge->Timer_GetDelta();
+ if(brk>0.05)
+ {
+ brk=0;rad+=drad;
+ if(fabs(rad)>2*pi/spnr+pi/180)return(void)(active=false);
+ for(int i=0;i<spnr;++i)
+ {
+ targ[cnt]=CreateBullet2(400,300,2,rad+i*2*pi/spnr);
+ bullet[targ[cnt]].inv=true;
+ bullet[targ[cnt++]].alterColor=col;
+ targ[cnt]=CreateBullet2(400,300,2,-rad+i*2*pi/spnr);
+ bullet[targ[cnt]].inv=true;
+ bullet[targ[cnt++]].alterColor=col;
+ }
+ }
+ }
+ break;
+ }
+ }
+};
+bool achromab,achromaB[100];
+class achromaGroup
+{
+private:
+ class achromaBullet:public SimpleBullet
+ {
+ private:
+ bool active;
+ double spd,acc,lim;
+ public:
+ bool isActive(){return active;}
+ void achromaInit(vector2d pos,TColors initcol,double _lim)
+ {
+ bulletpos=pos;spd=0;acc=0.0005;lim=_lim;rot=0;
+ lastcoll=0;aC=initcol;aC2=COLOR_COUNT;
+ active=true;
+ }
+ void Reverse()
+ {
+ spd=0;
+ if(aC==green)aC=red;
+ else if(aC==red)aC=green;
+ }
+ void achromaUpdate()
+ {
+ if(aC==red)lastcoll=1;//ignore coll for red.
+ bulletpos.y+=spd*(1000.0f/hge->Timer_GetFPS());
+ if(spd+acc*(1000.0f/hge->Timer_GetFPS())<lim)spd+=acc*(1000.0f/hge->Timer_GetFPS());
+ if(bulletpos.y>610)active=false;
+ Update_SimpBul();
+ }
+ }bullets[1000];
+public:
+ double crbrk,llim;TColors col;
+ void Init(TColors initcol,double _llim)
+ {
+ col=initcol;llim=_llim;
+ crbrk=re.NextDouble(0,frameleft/(double)(AMinute+ThirtySeconds))*(part==36?0.07:0.02)+0.03;
+ }
+ void Reverse()
+ {
+ if(col==red)col=green;
+ else if(col==green)col=red;
+ for(int i=0;i<1000;++i)if(bullets[i].isActive())bullets[i].Reverse();
+ }
+ void achroma2pnt()
+ {
+ for(int i=0;i<1000;++i)if(bullets[i].isActive())CreateBullet255(bullets[i].bulletpos.x,bullets[i].bulletpos.y,10);
+ }
+ void Update(int msk=0)
+ {
+ crbrk-=hge->Timer_GetDelta();
+ if(achromab)
+ {
+ if(crbrk<=0)
+ {
+ crbrk=re.NextDouble(0,frameleft/(double)AMinute)*(part==36?0.07:0.02)+0.03;
+ for(int i=0;i<1000;++i)
+ if(!bullets[i].isActive())
+ {
+ bullets[i].achromaInit(vector2d(re.NextDouble(10,790),-5),col,llim);
+ break;
+ }
+ }
+ for(int i=0;i<1000;++i)if(bullets[i].isActive())bullets[i].achromaUpdate();
+ }
+ else
+ {
+ if(crbrk<=0)
+ {
+ crbrk=1;
+ if(msk)
+ {
+ memset(achromaB,0,sizeof(achromaB));
+ for(int i=0;i<80;++i)achromaB[i]=re.NextInt(0,1);
+ }
+ for(int i=0;i<80;++i)
+ {
+ if(achromaB[i]&&col==green)
+ {
+ for(int j=0;j<1000;++j)
+ if(!bullets[j].isActive())
+ {
+ bullets[j].achromaInit(vector2d(i*10,-5),col,llim);
+ break;
+ }
+ }
+ if(!achromaB[i]&&col==red)
+ {
+ for(int j=0;j<500;++j)
+ if(!bullets[j].isActive())
+ {
+ bullets[j].achromaInit(vector2d(i*10,-5),col,llim);
+ break;
+ }
+ }
+ }
+ }
+ for(int i=0;i<500;++i)if(bullets[i].isActive())bullets[i].achromaUpdate();
+ }
+ }
+};
+class yellowGroup
+{
+private:
+ int ylw[100];
+ bool dirdone[100];
+ bool active;
+public:
+ bool isActive(){return active;}
+ void Init(int _cnt,double _yv)
+ {
+ memset(ylw,0,sizeof(ylw));active=true;
+ memset(dirdone,0,sizeof(dirdone));
+ for (int i=0;i<_cnt;++i)
+ {
+ int pnt=CreateBullet2(400,300,_yv,frameleft*pi/AMinute+i*(2*pi/_cnt));
+ bullet[pnt].alterColor=yellow;
+ ylw[i]=pnt;
+ }
+ }
+ void Update()
+ {
+ bool done=true;
+ for (int i=0;i<100;++i)
+ {
+ if(ylw[i]&&bullet[ylw[i]].lifetime>2&&!dirdone[i]&&bullet[ylw[i]].alterColor==yellow)
+ bullet[ylw[i]].redir(playerpos),dirdone[i]=true;
+ if(ylw[i]&&bullet[ylw[i]].lifetime>5&&bullet[ylw[i]].alterColor==yellow)
+ {
+ int cc=re.NextInt(0,5);
+ for(int j=0;j<cc;++j)
+ {
+ int pnt=CreateBullet2(bullet[ylw[i]].bulletpos.x,bullet[ylw[i]].bulletpos.y,0,re.NextDouble(-pi,pi));
+ if(!re.NextInt(0,3))bullet[pnt].redir(playerpos);
+ bullet[pnt].bulletaccel=0.002;bullet[pnt].limv=3;
+ }
+ BulletEffect_Death(bullet[ylw[i]],ColorToDWORD(yellow));
+ bullet[ylw[i]].exist=false;
+ bullet[ylw[i]].bullettype=0;
+ ylw[i]=0;
+ }
+ else done=false;
+ }
+ if(done)active=false;
+ }
+};
+class Spinner
+{
+private:
+ SimpleBullet abullet[40][100];
+ int arms;
+ double rad,rstep;
+public:
+ void Init(int _arms,double _rstep)
+ {
+ memset(abullet,0,sizeof(abullet));
+ arms=_arms;rstep=_rstep;rad=0;
+ for(int i=0;i<arms;++i)
+ for(int j=0;j*rstep<505;++j)
+ {
+ abullet[i][j].aC=blue;abullet[i][j].aC2=COLOR_COUNT;
+ }
+ }
+ void Update(double delta)
+ {
+ for(int i=0;i<arms;++i)
+ for(int j=0;j*rstep<505;++j)
+ {
+ double crad=rad+i*(2*pi/arms);
+ abullet[i][j].bulletpos=vector2d(400+j*rstep*cos(crad),300+j*rstep*sin(crad));
+ abullet[i][j].Update_SimpBul();
+ }
+ rad+=hge->Timer_GetDelta()*1000*delta;
+ }
+};
+class expSpinner
+{
+private:
+ int bullets[1000];
+ int arms,cnt,lc;
+ double brk,len,dr,da;
+ bool active;
+ bool InBound(vector2d pos)
+ {
+ if (pos.x<=-25||pos.x>=825||pos.y<=-25||pos.y>=625)
+ return false;return true;
+ }
+public:
+ void Init(int _arms,double _drange,double _drad)
+ {
+ arms=_arms;lc=cnt=len=0;dr=_drange;da=_drad;active=true;
+ }
+ bool isActive(){return active;}
+ void Update()
+ {
+ brk+=hge->Timer_GetDelta();
+ if(brk<0.03)return;brk=0;
+ bool none=true;
+ for(int i=0;i<arms;++i)
+ {
+ double rad=da+i*2*pi/(double)arms,drad=rad+lc*pi/15;int c=(lc&1)?1:-1;
+ if(InBound(vector2d(400+len*cos(rad),300+len*sin(rad))))
+ {
+ bullets[cnt++]=CreateBullet2(
+ 400+len*cos(rad),300+len*sin(rad),0,c*drad,true);
+ c=-c;none=false;
+ }
+ }
+ len+=dr;++lc;
+ if(none)
+ {
+ active=false;
+ for(int i=0;i<cnt;++i)bullet[bullets[i]].bulletaccel=0.002,bullet[bullets[i]].limv=2;
+ }
+ }
+};
+class CPinBall
+{
+private:
+ int center;
+ int circles[10][30];
+ int layer,lifetime;double rot,drt;
+ vector2d delta;
+public:
+ vector2d& Delta(){return delta;}
+ vector2d& Position(){return bullet[center].bulletpos;}
+ double Radius(){return layer*10.0-5;}
+ void Init(vector2d pos,int _lay)
+ {
+ center=0;memset(circles,0,sizeof(circles));double speed=re.NextDouble(2,5);
+ center=CreateBullet2(pos.x,pos.y,speed,re.NextInt(-pi,pi),true);
+ delta=speed*bullet[center].bulletdir;
+ layer=_lay;rot=0;lifetime=1;drt=re.NextDouble(-0.5*pi,0.5*pi);
+ for(int i=0;i<layer;++i)
+ {
+ for(int j=0;j<(i+1)*3;++j)
+ {
+ circles[i][j]=CreateBullet2(pos.x,pos.y,0,0,true);
+ bullet[circles[i][j]].bulletpos=vector2d(pos.x+10*i*cos(rot+j*2*pi/((i+1)*3)),pos.y+10*i*sin(rot+j*2*pi/((i+1)*3)));
+ }
+ }
+ }
+ void Kill()
+ {
+ BulletEffect_Death(bullet[center],ColorToDWORD(blue));
+ bullet[center].exist=bullet[center].bullettype=0;
+ for(int i=0;i<layer;++i)
+ for(int j=0;j<(i+1)*3;++j)
+ {
+ BulletEffect_Death(bullet[circles[i][j]],ColorToDWORD(blue));
+ bullet[circles[i][j]].exist=bullet[circles[i][j]].bullettype=0;
+ }
+ lifetime=0;
+ }
+ int& Getlifetime(){return lifetime;}
+ void UpdateDelta()
+ {
+ vector2d tdt=ToUnitCircle(delta);
+ bullet[center].bulletdir=tdt;bullet[center].bulletspeed=delta.l();
+ }
+ void Update()
+ {
+ vector2d pos=bullet[center].bulletpos;
+ rot+=hge->Timer_GetDelta()*drt;
+ for(int i=0;i<layer;++i)
+ for(int j=0;j<(i+1)*3;++j)
+ bullet[circles[i][j]].bulletpos=vector2d(pos.x+10*i*cos(rot+j*2*pi/((i+1)*3)),pos.y+10*i*sin(rot+j*2*pi/((i+1)*3)));
+ }
+};
+class LineLaser:public Laser
+{
+protected:
+ double width;
+ vector2d a,b;
+ DWORD color;
+public:
+ void SetColl(bool col){EnableColl=col;}
+ void InitLine(vector2d _a,vector2d _b,double _w,DWORD _c)
+ {
+ a=_a;b=_b;color=_c;Init(2);
+ SetTexture(SprSheet,151,264,2,8);
+ SetWidth(_w);RenCtr=vector2d(0,0);
+ }
+ void SetWidth(double _w)
+ {
+ width=_w;
+ vector2d dir(a-b);dir.ToUnitCircle();
+ vector2d pd=dir;pd.Rotate(pi/2);
+ Setdata(0,a-width*pd,a+width*pd,color);
+ for(int i=1;i<MaxRes;++i)Setdata(i,b-width*pd,b+width*pd,color);
+ }
+ double GetWidth(){return width;}
+ void llsrtopnt(double dis)
+ {
+ vector2d dir=a-b;dir.ToUnitCircle();dir=dis*dir;
+ vector2d x=b;
+ while(!(x.x<=-25||x.x>=825||x.y<=-25||x.y>=625))
+ {
+ CreateBullet255(x.x,x.y,10);
+ x=x+dir;
+ }
+ }
+ //use Laser::Process...
+};
+class SimpLL:public LineLaser
+{
+public:
+ bool active;
+ int stp;
+ double brk;
+};
+class SELineLaser
+{
+private:
+ LineLaser lsr;
+ bool active,h;
+ double brk,x;
+public:
+ bool isActive(){return active;}
+ void Init(int _x,bool _h)
+ {
+ x=_x;h=_h;
+ if(h)
+ lsr.InitLine(vector2d(0,x),vector2d(800,x),0,SETA(ColorToDWORD(blue),0x80));
+ else
+ lsr.InitLine(vector2d(x,0),vector2d(x,600),0,SETA(ColorToDWORD(blue),0x80));
+ active=true;brk=0.05;
+ }
+ void Update()
+ {
+ lsr.Process();
+ brk-=hge->Timer_GetDelta();
+ if(brk<0)
+ {
+ brk=0.05;
+ lsr.SetWidth(lsr.GetWidth()+0.2);
+ if(lsr.GetWidth()>1)lsr.SetColl(true);
+ if(lsr.GetWidth()>6)
+ {
+ int t=0;
+ if(!re.NextInt(0,2))
+ {
+ if(h?playerpos.y>x:playerpos.x>x)t=1;
+ vector2d px;
+ vector2d dir=h?vector2d(-1,0):vector2d(0,-1);dir=18*dir;
+ for(int c=0,tt=t;c<2;++c,dir=-1*dir,tt=t^1)
+ {
+ px=h?vector2d(playerpos.x,x):vector2d(x,playerpos.y);
+ if(c)px=px+dir;
+ while(!(px.x<=-25||px.x>=825||px.y<=-25||px.y>=625))
+ {
+ tt^=1;
+ int pnt=CreateBullet2(px.x,px.y,0,0);
+ bullet[pnt].bulletdir=(tt?1:-1)*(h?vector2d(0,1):vector2d(1,0));
+ bullet[pnt].limv=3;bullet[pnt].bulletaccel=0.001;
+ px=px+dir;
+ }
+ }
+ }
+ else
+ {
+ vector2d dir=h?vector2d(-1,0):vector2d(0,-1);dir=18*dir;
+ vector2d px=h?vector2d(800+re.NextInt(-18,0),x):vector2d(x,600+re.NextInt(-18,0));
+ while(!(px.x<=-25||px.x>=825||px.y<=-25||px.y>=625))
+ {
+ t^=1;
+ int pnt=CreateBullet2(px.x,px.y,0,0);
+ bullet[pnt].bulletdir=(t?1:-1)*(h?vector2d(0,1):vector2d(1,0));
+ bullet[pnt].limv=3;bullet[pnt].bulletaccel=0.001;
+ px=px+dir;
+ }
+ }
+ active=false;
+ }
+ }
+ }
+};