summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xChangeLog23
-rw-r--r--Extras133
-rw-r--r--FAQ88
-rw-r--r--FAQ.zh70
-rw-r--r--Levels50
-rw-r--r--Levels.zh325
-rwxr-xr-xVERSION2
-rw-r--r--global.h2
-rw-r--r--levels.h319
-rw-r--r--main.cpp6
-rw-r--r--menus.h2
-rw-r--r--towernbullet.h5
12 files changed, 806 insertions, 219 deletions
diff --git a/ChangeLog b/ChangeLog
index 9bcf684..b844a97 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,7 +9,7 @@ Tests.
Wishlist?
Known bugs:
-One part of Level 3 fails randomly (really randomly?).
+?
Wishlist:
Make more data stored in score.cfg.
@@ -19,6 +19,22 @@ In-game music bring back.
of next BLR.)
Pre-Released versions:
+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...
---------------------------------------------------------------------------------
@@ -78,8 +94,9 @@ 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 @Intel core i7-2670QM, 8GiB RAM, Intel HD3000 &
-@Intel Core2 Quad Q8300, 8GiB RAM, nvidia GT320.
+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.
diff --git a/Extras b/Extras
new file mode 100644
index 0000000..7796883
--- /dev/null
+++ b/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't even find two files in the same style...
+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 single source file - main.cpp. It's
+once a ~100KiB file, and have more than 10k lines of code. One day I found it hard
+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(7/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/FAQ b/FAQ
index a2638db..516ebb1 100644
--- a/FAQ
+++ b/FAQ
@@ -2,17 +2,63 @@
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.
+ 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 BLR.cfg) 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!
-However, the first one is not likely to happen. The official Windows
-build doesn't have too much external dependencies.
+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.
+
+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 is *pretty unstable* and may crash at any time.
@@ -44,6 +90,18 @@ 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.
@@ -81,17 +139,3 @@ A: Sorry, no...
You won't get anything but the ranking even you've passed level -1 without
collisions.
So... enjoy it yourself.
-
-Q: What hardwares/softwares do you use?
-A: I'm using a Lenovo Ideapad Y570 with Intel Core i7-2670QM CPU.
- It has 8GiB of RAM and HD3000+Nvidia GT 555M. However I've disabled
- GT 555M in BIOS so that it won't heat too much. Additionally,
- I've got a 256GiB Crucial M4 SSD (That's useless, uh?).
- This game is mainly developed under GNU/Linux.
- I use Debian sid as my main system. (Yes, that's one of the reasons why
- I like to "live on the edge".) KDE is my current desktop environent.
- Usually, I use Code::Blocks IDE. Sometimes I use vim/geany+gdb.
- For windows version compile, I use Visual Studio 2013 express.
- The game graphic resources are made with GIMP.
- Musics are made with Rosegarden, synthed with fluidsynth(qsynth frontend),
- recorded with jack.record.
diff --git a/FAQ.zh b/FAQ.zh
index f66b7a8..78a19fa 100644
--- a/FAQ.zh
+++ b/FAQ.zh
@@ -2,15 +2,52 @@
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中看到到底是什么出了问题。
+ 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支持,或者没有正确地安装驱动,该问题可能也会发生。
-不过,第一种情况发生的可能性非常小。发布的Windows版没有那么多外部依赖。
+Q: "******** failed, using no sound",然后什么声音都没有…
+A: OpenAL初始化失败了。
+ 你的系统可能不支持OpenAL软件版(找到这么一台电脑是何其的不容易啊)。
+ 如果你以后不想再看到这条消息,可以带"--nosound"参数启动游戏。
+
+Q: 屏幕突然花了!
+ 发生了可怕的事情…
+ 那个方块被吃掉了吗?
+ 我没法移动它!
+A: 这应该是个内部问题。如果你遇到了请汇报这个bug.
Q: 它崩溃了!
A: 这个程序还处于「非常不稳定的阶段」并且*随时*都可能崩溃。
@@ -40,6 +77,13 @@ Q: 看起来很模糊?
A: 这个游戏是为800x600分辨率设计的。如果你在用其他的分辨率或者以全屏运行它,
可能会出现这个问题。
+Q: 暂停的时候看不到子弹?
+A: 这得看你暂停的时候所在的关的实现方式。有些关是用“SimpleBullet”类来写的。
+ 这些子弹在暂停时无法显示。
+ 暂停功能直到BLR I的0.8.9 alpha才出现。原因是我之前认为暂停菜单没有用…
+ 顺便,如果你玩过东方系列的游戏的话,你会发现那里的暂停界面更加烦人。不过它的作者
+ 已经说明这是故意的了(见TH06的FAQ 25)。
+
Q: 我认为图形绘制的有问题。
A: 对于DirectX,我了解的不太多,因为我没有修改hge的DirectX版。
但是它不应该和OpenGL版有太大的不同。
@@ -73,17 +117,3 @@ Q: 有其他奖励吗?
A: 对不起,没有…
即使你一个没有吃到一个子弹地通了Level -1你也不会得到任何东西。
所以…自娱自乐吧。
-
-Q: What hardwares/softwares do you use?
-A: I'm using a Lenovo Ideapad Y570 with Intel Core i7-2670QM CPU.
- It has 8GiB of RAM and HD3000+Nvidia GT 555M. However I've disabled
- GT 555M in BIOS so that it won't heat too much. Additionally,
- I've got a 256GiB Crucial M4 SSD (That's useless, uh?).
- This game is mainly developed under GNU/Linux.
- I use Debian sid as my main system. (Yes, that's one of the reasons why
- I like to "live on the edge".) KDE is my current desktop environent.
- Usually, I use Code::Blocks IDE. Sometimes I use vim/geany+gdb.
- For windows version compile, I use Visual Studio 2013 express.
- The game graphic resources are made with GIMP.
- Musics are made with Rosegarden, synthed with fluidsynth(qsynth frontend),
- recorded with jack.record. \ No newline at end of file
diff --git a/Levels b/Levels
index a1a7b8c..3ac34d6 100644
--- a/Levels
+++ b/Levels
@@ -1,13 +1,16 @@
BulletLabRemixII
Level index/specifications/hints
+I'm still working on this document.
+Please don't trouble me if it misled you.
+
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
+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
@@ -190,7 +193,7 @@ Trypophobia 120 another two classes: Tail & Pile
Remark: I seem to forget an important thing: Bullets with effects won't collide
for a short time after they are created...
-Photon fusion 90 Use a slightly modified tower8...
+Photon fission 90 Use a slightly modified tower8...
-Directed bullets+random bullets.
Find a formula for it.
@@ -218,71 +221,94 @@ 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.
+
Supernova(additive blending) 120
--Awesome supernova!
- I enjoy coding(easy parts)...
+-After gathering enough power, they explode --
+ Awesome supernova!
+ I enjoy coding(such easy parts)...
yellow explosive 90
--Yellow explosive are poisonous? IDK.
+-There's nothing to code, so I came up with this...
+ Not deadly at all.
Sink over the horizon 90
-Strange. You might be trapped without noticing it.
-Gravity vortex 120
--It has nothing to do with gravity at all.
-
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
--A copy of a spellcard from someone...
+-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?!
- Pleaz.. don't be hopeless...
+ You MUST end up in a horrible traffic accident, squeezing every drop of blood
+ out on the left board. That's a bad image.
"Pinballs"
--Why these pinballs don't collide each other?
- --Because I don't know about the physics...
+-Well... They have collisions since r93!
+ These balls spawn with random velocity!
+ You may end up...
+ just imagine a enlarged 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/Levels.zh b/Levels.zh
new file mode 100644
index 0000000..0647885
--- /dev/null
+++ b/Levels.zh
@@ -0,0 +1,325 @@
+BulletLabRemixII
+关卡列表、说明和提示
+
+此文档仍未完成。
+如果它误导了你,也不要来找我啊。。。
+
+不适宜人群:
+Anybody who isn't insterested in this topic
+Liberal arts students(?...)
+
+适宜人群:
+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
+
+
+
+
+
+
+======================警告:下面有好多好多字!======================
+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.
+
+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
+-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 and you'll pass this level.
+
+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.
+
+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.
+
+Crossing threaten 30
+-Appears very hard.
+ Choose the correct time to cross those bullets.
+
+Orange trap2 2+2+2+2
+-Just another level from level 4.
+
+Fish in the barrel 60
+-Where have I seen this...
+ 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.
+
+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 is sickly hard...
+ Treat fast bullets and slow bullets separately.
+ Remark: It looks like Wriggle Nightbug's spellcard...
+
+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.
+
+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.
+ Designed to be a spellcard(?) of someone who has the ability
+ to manipulate ice...
+ 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.
+ This part was designed as 「my」 「spellcard」 at first...
+
+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...
+
+Rainbow tower - color theory 90 rainbow tower
+-Basic level.
+ Remark: It's taken from the testbed version of BLRII.
+Rainbow bullets - nauty photon 60 Lazy level;)
+-Similar to one part in level1, but a lot 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 - timeless 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--!
+ 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.
+ However, they won't step on the same place twice.
+ Will this cause trypophobia?
+ Remark: 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 circles*2 60*2
+-Pretty easy as they are only the beginning of nightmare...
+
+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)
+-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.
+
+Supernova(additive blending) 120
+-After gathering enough power, they explode --
+ Awesome supernova!
+ I enjoy coding(such easy parts)...
+
+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 might be trapped without noticing it.
+
+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/?
+“评估”关卡
+
+由于你到最后肯定会死,所以我来试着预测一下你的死因吧…
+
+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/VERSION b/VERSION
index 4ed675e..57cb6f3 100755
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.9.1-4 (r93) \ No newline at end of file
+0.9.2-0 (r94) \ No newline at end of file
diff --git a/global.h b/global.h
index fa91328..e6ebb0a 100644
--- a/global.h
+++ b/global.h
@@ -341,7 +341,7 @@ static const char* archive[]={
};
#endif
//static const char* GLOBAL_H_FN="global.h";
-static const char* BLRVERSION="0.9.1-4 (r93)";
+static const char* BLRVERSION="0.9.2-0 (r94)";
static const char *months="JanFebMarAprMayJunJulAugSepOctNovDec";
char *parseDate(const char *date)
{
diff --git a/levels.h b/levels.h
index 2ca2e66..97d1801 100644
--- a/levels.h
+++ b/levels.h
@@ -1187,6 +1187,7 @@ void Level5Part6()
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]],blue);
bullet[tbuls[j]].exist=false;
tbuls[j]=0;
}
@@ -1453,23 +1454,26 @@ void Level5Part19()
void Level5Part20()
{
ntbrk+=hge->Timer_GetDelta();
- if (LOWFPS)ntrot+=16*pi/960.0f;else ntrot+=pi/960.0f;
- if (ntbrk<0.01)return;
+ 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 a;if (ntcnt==0)
- a=CreateBullet9(400+250*sin(ntrot),300+250*cos(ntrot),2,500,1,500,true);
- else
- a=CreateBullet9(400+250*sin(ntrot),300+250*cos(ntrot),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 (ntcnt==0)
- a=CreateBullet9(400+250*sin(ntrot+pi),300+250*cos(ntrot+pi),2,500,1,500,true);
- else
- a=CreateBullet9(400+250*sin(ntrot+pi),300+250*cos(ntrot+pi),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;
+ 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;
+ }
}
void Level5Part21()
{
@@ -3196,12 +3200,109 @@ void Levelm1Part12()
return;
}
}
+int m19lead[10],m19gen[700];
+double m19rad;
+int m19step,m19cnt;
+bool m19pldir;
+void Levelm1Part13()//Gravity Vortex
+{
+ frameleft=AMinute*2;towcnt=0;PlayerSplit=false;
+ 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 Levelm1Part13()//"Supernova"
+void Levelm1Part15()//"Supernova"
{
- frameleft=AMinute*2;PlayerSplit=false;
+ frameleft=AMinute*2;
++bgbrk;if (LOWFPS)bgbrk+=16;
if (bgbrk<30)return;
bgbrk=0;towcnt=0;
@@ -3244,7 +3345,7 @@ void snCircCreator(vector2d p,int cnt,TColors col,bool mode)
bullet[pnt].alterColor=col;bullet[pnt].addblend=true;
}
}
-void Levelm1Part14()
+void Levelm1Part16()
{
snexTarg.TargRender();
avacurbrk+=hge->Timer_GetDelta();
@@ -3296,13 +3397,13 @@ void Levelm1Part14()
}
yellowGroup fyg[100];
Spinner fygs;
-void Levelm1Part15()
+void Levelm1Part17()
{
frameleft=AMinute+ThirtySeconds;
All2pnt();towcnt=0;memset(fyg,0,sizeof(fyg));
++part;avabrk=1;avacurbrk=0.5;fygs.Init(3,20);
}
-void Levelm1Part16()
+void Levelm1Part18()
{
avacurbrk+=hge->Timer_GetDelta();
if(avacurbrk>avabrk)
@@ -3322,7 +3423,7 @@ void Levelm1Part16()
fygs.Update(pi/7200*(0.5+frameleft/(double)(AMinute+ThirtySeconds)));
}
int m17lead[4];
-void Levelm1Part17()
+void Levelm1Part19()
{
frameleft=AMinute+ThirtySeconds;towcnt=0;
All2pnt();memset(m17lead,0,sizeof(m17lead));
@@ -3334,7 +3435,7 @@ void Levelm1Part17()
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 Levelm1Part18()
+void Levelm1Part20()
{
snexTarg.TargRender();avacurbrk+=hge->Timer_GetDelta();
tbrk+=hge->Timer_GetDelta();
@@ -3385,103 +3486,6 @@ void Levelm1Part18()
tbrk=0;
}
}
-int m19lead[10],m19gen[700];
-double m19rad;
-int m19step,m19cnt;
-bool m19pldir;
-void Levelm1Part19()
-{
- frameleft=AMinute*2;towcnt=0;
- 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 Levelm1Part20()
-{
- 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[i]].redir(vector2d(400,300));
- bullet[m19gen[i]].alterColor=(TColors)i;
- bullet[m19gen[i]].bulletaccel=0.002;
- bullet[m19gen[i]].limv=3;
- bullet[m19gen[i]].whirem=1000;
- bullet[m19gen[i]].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;
- }
-}
void Levelm1Part21()
{
//some part of this level is in towernbullet...
@@ -3863,9 +3867,10 @@ void Levelm2Part14()
avacurbrk-=hge->Timer_GetDelta();
if(avacurbrk<0)
{
- CreateBullet6(re.NextDouble(10,790),re.NextDouble(10,590),2,0,1,12,true);
- avacurbrk=1-0.75*(assetime-120.0f)/60.0f;
- if(avacurbrk<0.2)avacurbrk=0.2;
+ 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-120.0f)/60.0f;
+ if(avacurbrk<0.1)avacurbrk=0.1;
}
}
}
@@ -3977,22 +3982,20 @@ void Levelm2Part18()
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())
{
- 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();
- }
+ 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();
}
@@ -4097,7 +4100,7 @@ void Levelm2Part24()
{
tbrk=3-2.5*(assetime/120.0f);
if(tbrk<0.5)tbrk=0.5;
- int cnt=12+12*assetime/120.0f;
+ /*int cnt=12+12*assetime/120.0f;
if(cnt>24)cnt=24;
for(int i=0;i<cnt;++i)
{
@@ -4106,7 +4109,7 @@ void Levelm2Part24()
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)
@@ -4135,7 +4138,7 @@ void Levelm2Part24()
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].active=true;SLL[i].stp=0;SLL[i].brk=0;SLL[i].EnableColl=false;
break;
}
}
@@ -4157,7 +4160,7 @@ void Levelm2Part24()
if(SLL[i].brk>0.02)
{
SLL[i].SetWidth(SLL[i].GetWidth()+0.2);
- if(SLL[i].GetWidth()>2)SLL[i].EnableColl=true;
+ if(SLL[i].GetWidth()>1)SLL[i].EnableColl=true;
if(SLL[i].GetWidth()>4)SLL[i].stp=1;
SLL[i].brk=0;
}
@@ -4179,7 +4182,7 @@ void Levelm2Part25()
for(int i=0;i<200;++i)if(SLL[i].active)SLL[i].llsrtopnt(10);
return;
}
- ++part;tbrk=0;memset(SLL,0,sizeof(SLL));
+ ++part;tbrk=0;memset(SLL,0,sizeof(SLL));avabrk=1;
}
void Levelm2Part26()
{
@@ -4187,29 +4190,35 @@ void Levelm2Part26()
tbrk-=hge->Timer_GetDelta();
if(tbrk<0)
{
- tbrk=re.NextDouble(0.05,0.125);
- int cnt=re.NextInt(5,15);
+ tbrk=0.05;
+ int cnt=1;
+ if(!re.NextInt(0,19))avabrk=avabrk?0:1;
for(int i=0;i<cnt;++i)
{
- if(re.NextInt(0,100))
+ if(avabrk)
{
- int cc=assetime/120.0f*12+12;
- double rnd=re.NextDouble(-pi,pi),spd=re.NextDouble(4,7);
+ 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(400+re.NextDouble(-50,50),300+re.NextDouble(-50,50),spd,i*2*pi/cc+rnd,true);
+ CreateBullet2(centre.x,centre.y,spd,i*2*pi/cc+rnd,false);
}
else
{
- vector2d pos=vector2d(400+re.NextDouble(-50,50),300+re.NextDouble(-50,50));
- double spd=re.NextDouble(4,7);
- int cc=assetime/120.0f*24+24;
- double rnd=re.NextDouble(-pi,pi);
+ 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+10*sin(ran+i*(pi/3)),pos.y+10*cos(ran+i*(pi/3)),spd,dir,true);
- CreateBullet2(pos.x,pos.y,spd,dir,true);
+ 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/main.cpp b/main.cpp
index 910a030..f84d193 100644
--- a/main.cpp
+++ b/main.cpp
@@ -535,8 +535,8 @@ bool ProcessCurCred()
Credits->Render(creditfly,330);
Credits->SetTextureRect(9,290,140,47);
Credits->Render(creditfly,400);
- vdig->printf(creditfly,240,HGETEXT_LEFT,"%s",BLRVERSION);
- bdig->printf(creditfly,310,HGETEXT_LEFT,"%s",BuiltDate);
+ vdig->printf(creditfly-20,240,HGETEXT_LEFT,"%s",BLRVERSION);
+ bdig->printf(creditfly-20,310,HGETEXT_LEFT,"%s",BuiltDate);
}
if (credstop)credbrk+=hge->Timer_GetDelta();
if (credbrk>=4.5&&!creddone)creddone=true,credstop=false,creditacc=0,credbrk=0;
@@ -978,7 +978,7 @@ bool FrameFunc()
{
fnt->SetColor(0xFFFFFFFF);
fnt->printf(795, 0, HGETEXT_RIGHT, "Allocated bullets %d",bulcnt);
- fnt->printf(795, 25, HGETEXT_RIGHT, "%d in use",bulinuse);
+ 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));
diff --git a/menus.h b/menus.h
index 699f1a6..5a27c82 100644
--- a/menus.h
+++ b/menus.h
@@ -164,7 +164,7 @@ public:
{
if(DBGColor!=0xFF0A0A0A)
{
- for(int i=0;i<4;++i)DBGColor=ColorTransfer(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);
diff --git a/towernbullet.h b/towernbullet.h
index e0998e8..a79fb61 100644
--- a/towernbullet.h
+++ b/towernbullet.h
@@ -657,6 +657,8 @@ void ProcessBullet7(int i)
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;
@@ -1870,7 +1872,7 @@ public:
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;
+ 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()
@@ -1917,6 +1919,7 @@ public:
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;
}