diff options
-rwxr-xr-x | ChangeLog | 17 | ||||
-rw-r--r-- | FAQ | 3 | ||||
-rw-r--r-- | FAQ.zh | 3 | ||||
-rw-r--r-- | Levels | 63 | ||||
-rw-r--r-- | Levels.zh | 45 | ||||
-rw-r--r-- | Readme | 6 | ||||
-rw-r--r-- | Readme.zh | 35 | ||||
-rwxr-xr-x | VERSION | 2 | ||||
-rw-r--r-- | global.h | 4 | ||||
-rw-r--r-- | hge/CxImage/ximapng.cpp | 2 | ||||
-rw-r--r-- | hge/hge_impl.h | 6 | ||||
-rw-r--r-- | hge/sound.cpp | 26 | ||||
-rwxr-xr-x | hgewin/hge_impl.h | 6 | ||||
-rw-r--r-- | hgewin/sound.cpp | 27 | ||||
-rw-r--r-- | include/hge.h | 6 | ||||
-rw-r--r-- | levels.h | 44 | ||||
-rw-r--r-- | main.cpp | 21 | ||||
-rw-r--r-- | menus.h | 131 | ||||
-rw-r--r-- | music.h | 2 | ||||
-rw-r--r-- | scoresystem.h | 22 |
20 files changed, 314 insertions, 157 deletions
@@ -5,8 +5,9 @@ Todo's: *Adjust difficulty!*//almost done? *Add multpo's.*//almost done? *Distribute CLRs.*//almost done? +Ranking rewrite. Bug fixes. -Tests. +Tests.*//done?... Wishlist? Known bugs: @@ -21,6 +22,18 @@ In-game music bring back. of next BLR.) Pre-Released versions: +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. @@ -40,6 +53,8 @@ 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 @@ -113,6 +113,9 @@ 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 @@ -88,6 +88,9 @@ Q: 怎么这么难啊。 A: 这是故意的!唯一的解决方法是多练… 但是你在游戏设置中可以搞到更多的CLR(需要以降低移动速度为代价)。 +Q: 我根本拿不到那些“+1”! +A: 这也是故意的!一部分“+1”是专门为愿意为它们冒险的人设计的。 + Q: 我认为图形绘制的有问题。 A: 对于DirectX,我了解的不太多,因为我没有修改hge的DirectX版。 但是它不应该和OpenGL版有太大的不同。 @@ -4,6 +4,8 @@ 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(?...) @@ -23,7 +25,8 @@ 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. + However it's fairly easy. Do not seek for death(where those "+1" are + leading you to) Double-directed labyrinth 60 -Still very easy. @@ -34,10 +37,11 @@ Polygon-red 60 Fake bullets aren't always annoying. Polygon-white 60 --Make good use of precise mode +-Make good use of precise mode. Polygon-white locked 6 --Find a good position, e.g. near by a line +-You can't move vertically! + Find a good position, e.g. near by a line. Polygon-both 30 -This part doesn't make sense. @@ -51,7 +55,7 @@ Reflective 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. +-Stay away from the rotating bullets. Wall of blues? 30 -Rather easy. Do not try to earn too may semi-collisions unless @@ -95,22 +99,24 @@ 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+2 +Orange trap2 2+2+2+5 -Just another level from level 4. Fish in the barrel 60 --Where have I seen this... +-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. + 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 @@ -122,6 +128,8 @@ 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... + 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!... @@ -132,7 +140,8 @@ Avalanche 60 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. + 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. @@ -147,6 +156,7 @@ Hyperfluid 60 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... + Also will become easier if horizonal movement is restricted... Level 7 12/930+ Mapped levels Spring thunder storm - panic? 60 Thunder storm... @@ -154,12 +164,14 @@ Spring thunder storm - panic? 60 Thunder storm... 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 testbed version of BLRII. + 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 a lot harder. +-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. @@ -183,14 +195,16 @@ Rainbow effect - photon school 60 "particalization"! 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--! + 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. 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 + 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... @@ -205,16 +219,22 @@ Return to void 90 return (void)(...); 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... +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) --Or we should call this "deuteranopia vs protanopia"? +-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 @@ -222,19 +242,22 @@ Quad thread 120 Remark: I don't... Gravity vortex 120 --It has nothing to do with gravity at all. +-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. + --Not deadly at all.-- Sink over the horizon 90 --Strange. You might be trapped without noticing it. +-Strange. You will be easily trapped. Incomplete Reflective 120 -Start in peace, end in mess. @@ -286,13 +309,13 @@ 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 a bad image. + 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 a enlarged bowling ball flying direct towards you. + just imagine an eXtra-eXtra Large sized bowling ball flying direct towards you. Road Blocks -You'll understand this one day. @@ -4,6 +4,8 @@ BulletLabRemixII 此文档仍未完成。 如果它误导了你,也不要来找我啊。。。 +强烈推荐在阅读本文档前先自己玩一下。 + 不适宜人群: Anybody who isn't insterested in this topic Liberal arts students(?...) @@ -23,7 +25,8 @@ 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. + However it's fairly easy. Do not seek for death(where those "+1" are + leading you to) Double-directed labyrinth 60 -Still very easy. @@ -34,10 +37,11 @@ Polygon-red 60 Fake bullets aren't always annoying. Polygon-white 60 --Make good use of precise mode +-Make good use of precise mode. Polygon-white locked 6 --Find a good position, e.g. near by a line +-You can't move vertically! + Find a good position, e.g. near by a line. Polygon-both 30 -This part doesn't make sense. @@ -51,7 +55,7 @@ Reflective 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. +-Stay away from the rotating bullets. Wall of blues? 30 -Rather easy. Do not try to earn too may semi-collisions unless @@ -95,22 +99,24 @@ 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+2 +Orange trap2 2+2+2+5 -Just another level from level 4. Fish in the barrel 60 --Where have I seen this... +-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. + 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 @@ -122,6 +128,8 @@ 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... + 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!... @@ -132,7 +140,8 @@ Avalanche 60 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. + 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. @@ -147,6 +156,7 @@ Hyperfluid 60 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... + Also will become easier if horizonal movement is restricted... Level 7 12/930+ Mapped levels Spring thunder storm - panic? 60 Thunder storm... @@ -154,12 +164,14 @@ Spring thunder storm - panic? 60 Thunder storm... 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 testbed version of BLRII. + 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 a lot harder. +-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. @@ -183,14 +195,16 @@ Rainbow effect - photon school 60 "particalization"! 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--! + 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. 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 + 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... @@ -205,6 +219,7 @@ Return to void 90 return (void)(...); 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... @@ -286,7 +301,7 @@ Sine wave -示波器? 找一个合适的位置,跟图像一起振动… 说明:有些地方是秒撞的! - 结局:喂,我在那个示波器上找不到你啊… + 结局:喂,我在那个坏掉的示波器上找不到你啊… Density test 密度测试 @@ -294,8 +309,8 @@ Density test 卧×?没路了? 结局: 玩家××× - 死于一场可怕的车祸,身体中每滴血都被*挤*到了左边的墙上。 - 这景象真是可怕。 + 死于一场可怕的车祸,每滴血都被*挤*到了左边的墙上。 + 这景象真是有点可怕。 "Pinballs" “弹球” @@ -135,6 +135,10 @@ 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 @@ -165,7 +169,7 @@ Go for the highest score! Free Play Mode You'll never die! Enjoy!... - +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. @@ -132,6 +132,10 @@ GPU&VRAM: 非常快的渲染速度。 开发和测试基本是在Linux下进行的。发布的Windows版也是从Linux下编译的(听起来很厉害?)。Windows版 只进行过简单的测试。 +怎么玩? +这部分已经移动到游戏内的帮助里了,它在主菜单的help选项中。 +如果您看不懂,建议使用机器翻译… + 菜单 ------------------------------------------------------------------------------------ 主菜单 @@ -216,35 +220,34 @@ ChangeLog包含了该工程的全部历史。 这里是一个「里程碑」的列表。 0.9.1-1_PR (r86) -Current public release. 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. +包含7个关卡。 +众多问题修复,Windows版基本稳定了。 +代码发生了巨大的变化。 0.4.4-0_PRG (b37a) -Comes with four levels and some parts of the fifth level. -Contains several bug fixes. +包含4个多一点的关卡。 +修正了一部分问题。 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. +试验版本建立。 @@ -1 +1 @@ -0.9.7-0 (r97)
\ No newline at end of file +0.9.8-0 (r98)
\ No newline at end of file @@ -302,7 +302,7 @@ double scale; #ifndef WIN32 double yos; #endif -int fpslvl,clrmode; +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, @@ -341,7 +341,7 @@ static const char* archive[]={ }; #endif //static const char* GLOBAL_H_FN="global.h"; -static const char* BLRVERSION="0.9.7-0 (r97)"; +static const char* BLRVERSION="0.9.8-0 (r98)"; static const char *months="JanFebMarAprMayJunJulAugSepOctNovDec"; char *parseDate(const char *date) { diff --git a/hge/CxImage/ximapng.cpp b/hge/CxImage/ximapng.cpp index 2e39d1b..db2f636 100644 --- a/hge/CxImage/ximapng.cpp +++ b/hge/CxImage/ximapng.cpp @@ -85,7 +85,7 @@ bool CxImagePNG::Decode(CxFile *hFile) png_read_info(png_ptr, info_ptr);
png_uint_32 _width,_height;
- int _bit_depth,_color_type,_interlace_type/*,_compression_type,_filter_type*/;
+ int _bit_depth,_color_type,_interlace_type,_compression_type,_filter_type;
#if PNG_LIBPNG_VER > 10399
png_get_IHDR(png_ptr,info_ptr,&_width,&_height,&_bit_depth,&_color_type,
&_interlace_type,&_compression_type,&_filter_type);
diff --git a/hge/hge_impl.h b/hge/hge_impl.h index 26cb850..bf42c2f 100644 --- a/hge/hge_impl.h +++ b/hge/hge_impl.h @@ -156,7 +156,7 @@ public: virtual HEFFECT CALL Effect_Load(const char *filename, DWORD size=0); virtual void CALL Effect_Free(HEFFECT eff); virtual HCHANNEL CALL Effect_Play(HEFFECT eff); - virtual HCHANNEL CALL Effect_PlayEx(HEFFECT eff, int volume=100, int pan=0, float pitch=1.0f, bool loop=false); + virtual HCHANNEL CALL Effect_PlayEx(HEFFECT eff, float volume=1.0, float pan=0.0, float pitch=1.0f, bool loop=false); virtual HMUSIC CALL Music_Load(const char *filename, DWORD size=0); virtual void CALL Music_Free(HMUSIC mus); @@ -175,8 +175,8 @@ public: virtual void CALL Stream_Free(HSTREAM stream); virtual HCHANNEL CALL Stream_Play(HSTREAM stream, bool loop, int volume = 100); - virtual void CALL Channel_SetPanning(HCHANNEL chn, int pan); - virtual void CALL Channel_SetVolume(HCHANNEL chn, int volume); + virtual void CALL Channel_SetPanning(HCHANNEL chn, float pan); + virtual void CALL Channel_SetVolume(HCHANNEL chn, float volume); virtual void CALL Channel_SetPitch(HCHANNEL chn, float pitch); virtual void CALL Channel_Pause(HCHANNEL chn); virtual void CALL Channel_Resume(HCHANNEL chn); diff --git a/hge/sound.cpp b/hge/sound.cpp index 9f6869c..9024652 100644 --- a/hge/sound.cpp +++ b/hge/sound.cpp @@ -217,23 +217,23 @@ HEFFECT CALL HGE_Impl::Effect_Load(const char *filename, DWORD size) HCHANNEL CALL HGE_Impl::Effect_Play(HEFFECT eff) { - return Effect_PlayEx(eff, 100, 0, 1.0f, false); + return Effect_PlayEx(eff, 1.0f, 0, 1.0f, false); } -HCHANNEL CALL HGE_Impl::Effect_PlayEx(HEFFECT eff, int volume, int pan, float pitch, bool loop) +HCHANNEL CALL HGE_Impl::Effect_PlayEx(HEFFECT eff, float volume, float pan, float pitch, bool loop) { if(hOpenAL) { const ALuint sid = get_source(); // find an unused sid, or generate a new one. if (sid != 0) { - if (volume < 0) volume = 0; else if (volume > 100) volume = 100; - if (pan < -100) pan = -100; else if (pan > 100) pan = 100; + if (volume < 0) volume = 0; else if (volume > 1.0) volume = 1.0; + if (pan < -1.0) pan = -1.0; else if (pan > 1.0) pan = 1.0; alSourceStop(sid); alSourcei(sid, AL_BUFFER, (ALint) eff); - alSourcef(sid, AL_GAIN, ((ALfloat) volume) / 100.0f); + alSourcef(sid, AL_GAIN, volume); alSourcef(sid, AL_PITCH, pitch); - alSource3f(sid, AL_POSITION, ((ALfloat) pan) / 100.0f, 0.0f, 0.0f); + alSource3f(sid, AL_POSITION, pan, 0.0f, 0.0f); alSourcei(sid, AL_LOOPING, loop ? AL_TRUE : AL_FALSE); alSourcePlay(sid); } @@ -281,22 +281,22 @@ void CALL HGE_Impl::Stream_Free(HSTREAM stream){} HCHANNEL CALL HGE_Impl::Stream_Play(HSTREAM stream, bool loop, int volume){return 0;} -void CALL HGE_Impl::Channel_SetPanning(HCHANNEL chn, int pan) +void CALL HGE_Impl::Channel_SetPanning(HCHANNEL chn, float pan) { - assert(pan >= -100); - assert(pan <= 100); + if(pan>1.0)pan=1.0; + if(pan<-1.0)pan=-1.0; if(hOpenAL) { - alSource3f((ALuint) chn, AL_POSITION, ((ALfloat) pan) / 100.0f, 0.0f, 0.0f); + alSource3f((ALuint) chn, AL_POSITION, pan, 0.0f, 0.0f); } } -void CALL HGE_Impl::Channel_SetVolume(HCHANNEL chn, int volume) +void CALL HGE_Impl::Channel_SetVolume(HCHANNEL chn, float volume) { if(hOpenAL) { - if (volume < 0) volume = 0; else if (volume > 100) volume = 100; - alSourcef((ALuint) chn, AL_GAIN, ((ALfloat) volume) / 100.0f); + if (volume < 0) volume = 0; else if (volume > 1.0f) volume = 1.0f; + alSourcef((ALuint) chn, AL_GAIN, volume); } } diff --git a/hgewin/hge_impl.h b/hgewin/hge_impl.h index 5acdcd4..244dafc 100755 --- a/hgewin/hge_impl.h +++ b/hgewin/hge_impl.h @@ -123,7 +123,7 @@ public: virtual HEFFECT CALL Effect_Load(const char *filename, DWORD size=0); virtual void CALL Effect_Free(HEFFECT eff); virtual HCHANNEL CALL Effect_Play(HEFFECT eff); - virtual HCHANNEL CALL Effect_PlayEx(HEFFECT eff, int volume=100, int pan=0, float pitch=1.0f, bool loop=false); + virtual HCHANNEL CALL Effect_PlayEx(HEFFECT eff, float volume=1.0, float pan=0.0, float pitch=1.0f, bool loop=false); virtual HMUSIC CALL Music_Load(const char *filename, DWORD size=0); virtual void CALL Music_Free(HMUSIC mus); @@ -142,8 +142,8 @@ public: virtual void CALL Stream_Free(HSTREAM stream); virtual HCHANNEL CALL Stream_Play(HSTREAM stream, bool loop, int volume = 100); - virtual void CALL Channel_SetPanning(HCHANNEL chn, int pan); - virtual void CALL Channel_SetVolume(HCHANNEL chn, int volume); + virtual void CALL Channel_SetPanning(HCHANNEL chn, float pan); + virtual void CALL Channel_SetVolume(HCHANNEL chn, float volume); virtual void CALL Channel_SetPitch(HCHANNEL chn, float pitch); virtual void CALL Channel_Pause(HCHANNEL chn); virtual void CALL Channel_Resume(HCHANNEL chn); diff --git a/hgewin/sound.cpp b/hgewin/sound.cpp index 2bde29e..9024652 100644 --- a/hgewin/sound.cpp +++ b/hgewin/sound.cpp @@ -16,7 +16,6 @@ // Channel functions are fully supported now. However music and streaming are // still not supported. Some APIs changed for OpenAL is different from BA$$. -#include <cassert> #include "hge_impl.h" #include "AL/al.h" @@ -218,23 +217,23 @@ HEFFECT CALL HGE_Impl::Effect_Load(const char *filename, DWORD size) HCHANNEL CALL HGE_Impl::Effect_Play(HEFFECT eff) { - return Effect_PlayEx(eff, 100, 0, 1.0f, false); + return Effect_PlayEx(eff, 1.0f, 0, 1.0f, false); } -HCHANNEL CALL HGE_Impl::Effect_PlayEx(HEFFECT eff, int volume, int pan, float pitch, bool loop) +HCHANNEL CALL HGE_Impl::Effect_PlayEx(HEFFECT eff, float volume, float pan, float pitch, bool loop) { if(hOpenAL) { const ALuint sid = get_source(); // find an unused sid, or generate a new one. if (sid != 0) { - if (volume < 0) volume = 0; else if (volume > 100) volume = 100; - if (pan < -100) pan = -100; else if (pan > 100) pan = 100; + if (volume < 0) volume = 0; else if (volume > 1.0) volume = 1.0; + if (pan < -1.0) pan = -1.0; else if (pan > 1.0) pan = 1.0; alSourceStop(sid); alSourcei(sid, AL_BUFFER, (ALint) eff); - alSourcef(sid, AL_GAIN, ((ALfloat) volume) / 100.0f); + alSourcef(sid, AL_GAIN, volume); alSourcef(sid, AL_PITCH, pitch); - alSource3f(sid, AL_POSITION, ((ALfloat) pan) / 100.0f, 0.0f, 0.0f); + alSource3f(sid, AL_POSITION, pan, 0.0f, 0.0f); alSourcei(sid, AL_LOOPING, loop ? AL_TRUE : AL_FALSE); alSourcePlay(sid); } @@ -282,22 +281,22 @@ void CALL HGE_Impl::Stream_Free(HSTREAM stream){} HCHANNEL CALL HGE_Impl::Stream_Play(HSTREAM stream, bool loop, int volume){return 0;} -void CALL HGE_Impl::Channel_SetPanning(HCHANNEL chn, int pan) +void CALL HGE_Impl::Channel_SetPanning(HCHANNEL chn, float pan) { - assert(pan >= -100); - assert(pan <= 100); + if(pan>1.0)pan=1.0; + if(pan<-1.0)pan=-1.0; if(hOpenAL) { - alSource3f((ALuint) chn, AL_POSITION, ((ALfloat) pan) / 100.0f, 0.0f, 0.0f); + alSource3f((ALuint) chn, AL_POSITION, pan, 0.0f, 0.0f); } } -void CALL HGE_Impl::Channel_SetVolume(HCHANNEL chn, int volume) +void CALL HGE_Impl::Channel_SetVolume(HCHANNEL chn, float volume) { if(hOpenAL) { - if (volume < 0) volume = 0; else if (volume > 100) volume = 100; - alSourcef((ALuint) chn, AL_GAIN, ((ALfloat) volume) / 100.0f); + if (volume < 0) volume = 0; else if (volume > 1.0f) volume = 1.0f; + alSourcef((ALuint) chn, AL_GAIN, volume); } } diff --git a/include/hge.h b/include/hge.h index ce5badd..18d57b9 100644 --- a/include/hge.h +++ b/include/hge.h @@ -366,7 +366,7 @@ public: virtual HEFFECT CALL Effect_Load(const char *filename, DWORD size=0) = 0; virtual void CALL Effect_Free(HEFFECT eff) = 0; virtual HCHANNEL CALL Effect_Play(HEFFECT eff) = 0; - virtual HCHANNEL CALL Effect_PlayEx(HEFFECT eff, int volume=100, int pan=0, float pitch=1.0f, bool loop=false) = 0; + virtual HCHANNEL CALL Effect_PlayEx(HEFFECT eff, float volume=1.0, float pan=0.0, float pitch=1.0f, bool loop=false) = 0; virtual HMUSIC CALL Music_Load(const char *filename, DWORD size=0) = 0; virtual void CALL Music_Free(HMUSIC mus) = 0; @@ -385,8 +385,8 @@ public: virtual void CALL Stream_Free(HSTREAM stream) = 0; virtual HCHANNEL CALL Stream_Play(HSTREAM stream, bool loop, int volume = 100) = 0; - virtual void CALL Channel_SetPanning(HCHANNEL chn, int pan) = 0; - virtual void CALL Channel_SetVolume(HCHANNEL chn, int volume) = 0; + virtual void CALL Channel_SetPanning(HCHANNEL chn, float pan) = 0; + virtual void CALL Channel_SetVolume(HCHANNEL chn, float volume) = 0; virtual void CALL Channel_SetPitch(HCHANNEL chn, float pitch) = 0; virtual void CALL Channel_Pause(HCHANNEL chn) = 0; virtual void CALL Channel_Resume(HCHANNEL chn) = 0; @@ -1418,7 +1418,7 @@ void Level5Part16() } void Level5Part17() { - frameleft=TenSeconds/10*2;clrtime=0; + frameleft=TenSeconds/2;clrtime=0; DisableAllTower=false; if (Current_Position==1) { @@ -1532,7 +1532,7 @@ void Level5Part22() } void Level6Part0() { - frameleft=50;All2pnt();towcnt=0; + frameleft=TenSeconds;All2pnt();towcnt=0; DisableAllTower=false; if (IfShowTip) { @@ -1546,11 +1546,14 @@ void Level6Part0() Level 6-Peaceful(?) Winter\n\ Look, there's a question mark in the title...\ "); - IfCallLevel=false; } if (Current_Position==1) { - frameleft=0; + if (!LOWFPS) + DBGColor=ColorTransfer(DBGColor,0xFF60A0FF); + else + for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFF60A0FF); + if(DBGColor==0xFF60A0FF)++part; return; } } @@ -3277,18 +3280,25 @@ void Levelm1Part13()//Gravity Vortex ShowTip("Who's collecting such great power here?"); return; } - 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) + if (!LOWFPS) + DBGColor=ColorTransfer(DBGColor,0xFF000000); + else + for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFF000000); + if (DBGColor==0xFF000000) { - 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; + 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; } - m19pldir=false;BTarg.targpos=playerpos; } void Levelm1Part20update() { @@ -3386,11 +3396,7 @@ void Levelm1Part15()//"Supernova" ...nova!!"); return; } - if (!LOWFPS) - DBGColor=ColorTransfer(DBGColor,0xFF000000); - else - for (int i=1;i<=17;++i)DBGColor=ColorTransfer(DBGColor,0xFF000000); - if (DBGColor==0xFF000000) + if (Current_Position==1) { snexTarg.Init(0.001,vector2d(400,300)); All2pnt(); @@ -86,7 +86,7 @@ basic settings first!\n\nUse vsync?","First Start Up",0x00000024)==6) else tfs=0; diffkey=false; - plrspd=3;plrslospd=3;clrbns=clrmode=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(); @@ -95,7 +95,7 @@ basic settings first!\n\nUse vsync?","First Start Up",0x00000024)==6) void firststartup() { fpslvl=2;tfs=0;VidMode=0;diffkey=false; - plrspd=3;plrslospd=3;clrbns=clrmode=0; + 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(); @@ -824,13 +824,13 @@ bool FrameFunc() { if(~OMR) { - if(OMR==4||OMR==5)optionMenu.Leave(); - if(OMR==4) + if(OMR==6||OMR==7)optionMenu.Leave(); + if(OMR==6) { playerPreferenceMenu.Init(-200); Current_Position=14; } - if(OMR==5) + if(OMR==7) { Options_Writeback(); mainMenu.Init(-200); @@ -941,7 +941,7 @@ bool FrameFunc() ++part; IfShowTip=true; } - if (Current_Position==1&&shots)hge->Effect_Play(snd); + 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(); @@ -955,8 +955,8 @@ bool FrameFunc() 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) + 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); } @@ -1202,6 +1202,7 @@ int main(int argc,char *argv[]) #endif tch=getchar();//Key binding if (tch==1)diffkey=true; + bgmvol=getchar();sfxvol=getchar(); plrspd=tch=getchar(); playerfulspd=(tch)*0.08f; playerspeed=playerfulspd; @@ -1310,8 +1311,8 @@ int main(int argc,char *argv[]) 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/CanonTechno.ogg"); - lpst=4607901;lped=9215893;Music_Play(); + score=0;Mult_Init();Music_Init("./Resources/Music/st05.ogg"); + lpst=346222;lped=5539039;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)); @@ -7,7 +7,7 @@ void TriggerSound(int type) { switch(type) { - case 0:hge->Effect_Play(snd);break; + case 0:hge->Effect_PlayEx(snd,sfxvol/15.0,0,1,false);break; //case 1:hge->Effect_Play(menuin);break; //case 2:hge->Effect_Play(menuout);break; } @@ -54,6 +54,7 @@ void Options_Writeback() 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); } @@ -84,6 +85,8 @@ static const char* OMStr[]={ "VSync", "Clear Range Key", "Resolution", + "Music Volume", + "SFX Volume", "Player Preference", "Save and Exit", "On", @@ -368,8 +371,8 @@ public: if(!onSwitch) { 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); + 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; @@ -379,11 +382,11 @@ public: 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==5&&!(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==5?2:1); + TriggerSound(selected==7?2:1); if(onSwitch||onSwitchi)return -1; - if(selected<=3) + if(selected<=5) { onSwitch=true; swoffset=100; @@ -401,13 +404,23 @@ public: ++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(1); - if(selected<=3){onSwitchi=true;swoffset=0;} + if(selected<=5){onSwitchi=true;swoffset=0;} if(selected==0)tfs=!tfs; if(selected==1) { @@ -421,13 +434,23 @@ public: --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<6;++i) + for(int i=0;i<8;++i) { double calcy=i*30+dyoffset+360; if(calcy>249.9&&calcy<500.1) @@ -437,24 +460,24 @@ public: if(i==0) { if(!(onSwitch||onSwitchi)||selected!=0) - MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[tfs?6:7]); + 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?7:6]); + 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?6:7]); + 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?6:7]); + 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?7:6]); + MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[tfs?9:8]); swoffset+=hge->Timer_GetDelta()*400; if(swoffset>100)swoffset=0,onSwitchi=false; } @@ -463,24 +486,24 @@ public: if(i==1) { if(!(onSwitch||onSwitchi)||selected!=1) - MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[fpslvl==2?6:7]); + 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?7:6]); + 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?6:7]); + 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?6:7]); + 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?7:6]); + 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; } @@ -489,24 +512,24 @@ public: if(i==2) { if(!(onSwitch||onSwitchi)||selected!=2) - MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,OMStr[diffkey?8:9]); + 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?9:8]); + 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?8:9]); + 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?8:9]); + 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?9:8]); + MenuFont->printf(xoffset+200+swoffset,calcy,HGETEXT_LEFT,OMStr[diffkey?11:10]); swoffset+=hge->Timer_GetDelta()*400; if(swoffset>100)swoffset=0,onSwitchi=false; } @@ -515,24 +538,76 @@ public: if(i==3) { if(!(onSwitch||onSwitchi)||selected!=3) - MenuFont->printf(xoffset+200,calcy,HGETEXT_LEFT,VidMode>=0&&VidMode<=4?OMStr[VidMode+10]:OMStr[15]); + 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,VidMode>=0&&VidMode<=4?OMStr[VidMode==0?14:VidMode+9]:OMStr[15]); + 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,VidMode>=0&&VidMode<=4?OMStr[VidMode+10]:OMStr[15]); + 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,VidMode>=0&&VidMode<=4?OMStr[VidMode+10]:OMStr[15]); + 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,VidMode>=0&&VidMode<=4?OMStr[VidMode==4?10:VidMode+11]:OMStr[15]); + 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; } @@ -12,7 +12,7 @@ void Music_Init(const char* file) } void Music_Play() { - Muc=hge->Effect_PlayEx(Mus,100,0,1.0,true); + Muc=hge->Effect_PlayEx(Mus,bgmvol/15.0,0,1.0,true); } void Music_Update() { diff --git a/scoresystem.h b/scoresystem.h index 31bd62b..ff7e4b7 100644 --- a/scoresystem.h +++ b/scoresystem.h @@ -42,13 +42,20 @@ public: 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.3; - } + speed=0.4; + }else Lifetime+=hge->Timer_GetDelta(); if(GetDist(playerpos,position)<=9)++mult,NewMT(),Active=false; - Lifetime+=hge->Timer_GetDelta(); if(Lifetime>LifeLim)return (void)(Active=false); if(Lifetime>LifeLim*0.8) { @@ -59,8 +66,11 @@ public: } else Mult->RenderEx(position.x,position.y,0,0.8); - if (position.x>780||position.x<20)direction.x=-direction.x; - if (position.y>780||position.y<20)direction.y=-direction.y; + 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; @@ -71,7 +81,7 @@ 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=rand()%750+20,pos.y=rand()%550+20; + 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); } |