From e2623a2ba1b5789ae299c29804697d004a8cd886 Mon Sep 17 00:00:00 2001 From: "chirs241097@gmail.com" Date: Sat, 28 Jun 2014 13:52:21 +0000 Subject: 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? --- ChangeLog | 23 +++- Extras | 133 +++++++++++++++++++++++ FAQ | 88 ++++++++++++---- FAQ.zh | 70 +++++++++---- Levels | 50 ++++++--- Levels.zh | 325 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ VERSION | 2 +- global.h | 2 +- levels.h | 319 ++++++++++++++++++++++++++++--------------------------- main.cpp | 6 +- menus.h | 2 +- towernbullet.h | 5 +- 12 files changed, 806 insertions(+), 219 deletions(-) create mode 100644 Extras create mode 100644 Levels.zh 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;i1) + { + 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;i1) - { - 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())24)cnt=24; for(int i=0;iTimer_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;iRender(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