Rapid Prototying Session 14

The archived Session 14 board includes the announcement and all entries, minus attachments.


As the winner of the thirteenth session, Edge chose the theme for the fourteenth session: Canceling Bullets

Start Date : September 1st, 2009
End Date : September 15th, 2009
Theme : Cancel the Bullets

Many shmups feature smart bombs that cancel enemy bullets. However there are a lot of other possibilities to make good use of this feature. i.e. destroying big ships to cancel enemy bullets. Or turning enemy bullets into score items like in ESP Galuda. The option in Death Smiles that absorbs enemy suicide bullets.

I think bullet canceling can add a lot to a shmup's gameplay. However it is sad to see it seldom applied in freeware and homebrew games. So let's experiment with the possibilities of this feature.


Have at it!


Korenn won with his entry Bullet Crave

The player ship is extremely powerful (as always), but it has only limited ammo. To replenish the ammo, the player's ship has a field generator that cancels the enemy bullets around it and draws them in as ammo. The generator has cooldown time between each use.

The player has several options of firing his ammo, including an everything-at-once mode in a shotgun-like style.

Rave Gun

My entry into the session was Rave Gun, and arena shooter where the player ship has a bullet-canceling "Beat Field" synchronized with the music.


Competition Build (2009-09-16)


This game requires the Visual C++ 2008 Redistributable Package but is otherwise self-contained. Just unpack the archive into a folder of your choice and run RaveGun.exe


Music: F90 by Psychopatic NerD


Maneuver using WADS
Aim using the mouse
Fire main weapon using left mouse button
Launch missile using right-mouse button


Destroy enemies to turn their bullets into pickups (purple diamonds)
Catch enemy bullets with the Beat Field to backlash against the firer (purple sparks)

Collecting 10 pickups upgrades main weapon power
Levels 1 through 3 add spread-fire
Levels 4 through 8 add options

Missile costs 1 pickup per shot
Missile homes towards the cursor and explodes on contact

Note: the game features a prominent strobe effect that might bother some people.


Session 14 Finished


2009-09-01 3:02 PM

I'm going to use this as an incentive to get my project rolling again. ;)

My application framework became progressively more difficult to work with as it accumulated overly-generic functionality, so this might be a good time to rebuild, reorganize, and simplify the project. I need to figure out what to do with the GoogleCode project at some point, since it's in dire need of reorganization. I've been putting that off for months now.

2009-09-02 8:03 PM

I haven't yet decided how I want to use bullet cancel, but I'm going with an arena shooter this time since that's what my game engine is best at and I haven't seen bullet cancel used with that style. I'm open to suggestions otherwise. :D

2009-09-02 9:42 PM

2009-09-02 9:02 PM

You comment on your game engine quite often.(as a matter of fact, when I see 'kdmiller3' the next thing that pops into my mind is your engine.)

Hmmmm, it sounds like you're due to make a new engine, to me. :X

I've always had the idea a game engine was much like a car engine. That's probably why it's called 'engine' in the first place.

I've kept this idea in mind while making any engine I ever have.(even in game maker)

Because an engine, while it should provide the components to let a mechanic build off of, and make a full fledged car. I don't think an engine should come as an already-completed car that you're free to customize and change layouts.

I think you should take some time to start programming a new engine. Something sleek, something shiny, something fast. :D

I can imagine, due to the complexity of your current engine(as you imply). It would mostly be filtering out the excess that you don't need. But, I don't know how your engine works exactly, so I'll leave that to you!

For your consideration. :eyeroll:

Haha, true :D

Starting from scratch would be tough since I only have a few hours a night, so I'd have to restrict myself to a few strategic components. Most of the framework is game-independent (sometimes overly so), but the player controller and ship physics are the components most heavily geared towards "dual-analog" controls. My real weakness is level sequencing, and I'm not sure what to do about that.

2009-09-02 10:41 PM

2009-09-02 10:18 PM

Hmmm, well, I did a tutorial on level sequencing a while ago.

It's a pretty tedious process if you're doing it my way, though. But, one way or another, if you want to specifically lay out your sequence, it'll get pretty tedious.

Or, since I just happen to have my C::B open with my projects, I'll just show you some straight code on how I do it.

I could probably snip out a lot for you, but it shouldn't get in the way of understanding the methods I use.



#include "meanie_manager.h"
#include "haterpiller.h"

double stage_progress = 0;

void update_stage_progress_1(meanie_manager<haterpillar>* haterpillar_queen, meanie_manager<antiant>* antiant_queen, SAMPLE* sfx_spawn, SAMPLE* sfx_die)
  double stage_var = stage_progress/60;
  if (stage_var == 3)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    haterpillar_queen->spawn_bug(-25, 50, 2, 0, sfx_die);
    haterpillar_queen->spawn_bug(-40, 50, 2, 0, sfx_die);
    haterpillar_queen->spawn_bug(-55, 50, 2, 0, sfx_die);
    haterpillar_queen->spawn_bug(-70, 50, 2, 0, sfx_die);
    haterpillar_queen->spawn_bug(-85, 50, 2, 0, sfx_die);
    haterpillar_queen->spawn_bug(-100, 50, 2, 0, sfx_die);
  if (stage_var == 5)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(240, -10, 300, 240, sfx_die);
  if (stage_var == 5.5)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(480, -20, 300, 150, sfx_die);
  if (stage_var == 6)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    int i;
    for(i = 0; i <= 15; i++)
      haterpillar_queen->spawn_bug(480+(15*i), 180, -4, 0, sfx_die);
      haterpillar_queen->spawn_bug(-100-(15*i), 90, 3, 0, sfx_die);
  if (stage_var == 7.25)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(240, -20, 240, 240, sfx_die);
  if (stage_var == 8)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(0, -50, 180, 120, sfx_die);
  if (stage_var == 8.25)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(300, -50, 215, 135, sfx_die);
    int i;
    for(i = 0; i <= 5; i++)
      haterpillar_queen->spawn_bug(-10-(15*i), 140, 3, 0, sfx_die);
      haterpillar_queen->spawn_bug(300-(10*i), -10-(10*i), 0, 3, sfx_die);
  if (stage_var == 10)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(0, -25, 300, 180, sfx_die);
  if (stage_var == 10.25)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(50, -25, 350, 180, sfx_die);
  if (stage_var == 11.5)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(480, -25, 180, 180, sfx_die);
  if (stage_var == 11.75)
    play_sample(sfx_spawn, 255, 0, 1000, 0);
    antiant_queen->spawn_bug(430, -25, 130, 180, sfx_die);


Sorry if I kind of misunderstood what you said when you said level sequencing, but I can only assume it's that since your games seem to have non-specific procedurally-generated sequencing, and such.

The way I'm doing it is fairly similar to the way you're doing it, though driven by XML files instead of pure code. The main problem is that I don't have a good sense for how to make good shmup levels. The timer-based scheduling I use really isn't cutting it...

2009-09-02 11:22 PM

2009-09-02 10:51 PM

I would probably be better off using XML, it would certainly save the compile time after compile time. :P

TinyXML For The Win! :D

2009-09-02 10:51 PM

Oh, and. I just take things one step at a time. Test the game again after each time I add in a new set of enemies. then I just add in what feels right. I try to constantly keep throwing something unexpected or challenging at the player, so it doesn't get monotonous. Or at worst, predictable.(of course, if you've played the level 500 times over, there's no real surprise element anymore.)

It seems like it comes down to iteration. Things turn out a lot better whenever I implement the core play mechanic early on and leave myself plenty of time for design iteration. Rocket Bomb was probably the best example of that.

Whenever I end up grinding through a lot of engine tech and only have a day or two to work on the actual content, the result tends to be really dry and uninteresting. InterXept failed for that reason, though I did build up bunch of neat infrastructure along the way. :)

2009-09-03 12:00 AM

2009-09-02 11:28 PM

I'll have to look into that. XML sounds like a much better alternative to hardcode-style.

It leads to a different way of thinking about things—data-driven instead of code-driven.

TinyXML itself is fairly easy to use, though putting it to good use does take some planning.

You can go take a peek at how I use it over at VideoVenture. The source code and data for InterXept is over there, though it gets pretty gnarly in places. (I wish I had kept full snapshots of previous projects, since they were a lot simpler then.)

2009-09-02 11:28 PM

And, funny how you mention InterXept, as I was playing it earlier. And I did notice the enemy sequence got kind of... Overwhelming after the battleships started coming in.

The Carrier ships are real bastards when you can't get away from them. :D

It'd be a lot better if I actually scheduled things instead of just turning on the enemy spigots.

2009-09-03 10:59 PM

Progress report time!

My idea is to emphasize the "tethered" nature of bullets, making that a central theme of the game. I plan to show the "tethers" as lines, which might make the game look like something Linley Henzell would make. :D

2009-09-03 11:54 PM

2009-09-03 11:27 PM

I'm looking forward to this already.

I don't know if I can pull off Mr. Henzell's style, but I hope to at least make something different from my usual.

2009-09-04 1:38 PM

2009-09-04 1:30 PM

Very interesting... I'm slowly getting interested in even dusting off my engine :)

2009-09-04 1:37 PM

It would be nice for you to join us again 2bears. :O

"Jooooin usssssss...!"

2009-09-04 3:08 PM

2009-09-04 2:19 PM

Oh my gosh you just gave me a crazy idea... I wonder if this might be something like you're planning. :O

I'm not doing an airburst weapon this time if that's what you'e wondering. :)

(I'd certainly make sense for an updated version of Rocket Bomb, though.)

2009-09-04 3:30 PM

2009-09-04 3:24 PM

I don't know what that is... =/
My idea was related to "tethers." Kinda weird. ><

Edit: Is that what you call Missile Command weapons? :P

In my case, the tethers would be a graphical representation to explain why destroying an enemy unit canceled any bullets it owned. It did give me the idea to have canceled bullets causing damage to the parent craft, though. :)

2009-09-07 2:08 PM

I'm finally starting to impose a theme on my game, and extended exposure to "Dance/Electronica" on MusicChoice pushed me do a kind of "techno" musical theme. I'm currently adding a beat-based bullet-cancel field emanating from the player ship. It's very flashy. :D

2009-09-07 2:20 PM

That sounds fun.

I love a game with a good beat. :D

2009-09-07 2:44 PM

I've always wanted to create some funky, music-themed gameplay (I am a music major). But really I don't even know how, nor am I sure it would even be possible within GM. =/

Anyways, sounds crazy for sure.

The idea I thought of earlier was maybe a bit out there, but it was basically being able to "break" the tethers to cancel the bullets. :)

If that inspires anything feel free to go with it.

2009-09-07 2:46 PM

When I think of 'breaking' the tethers, I think of cutting them. When I think of cutting them, I think of a sword.

It could be interesting.

2009-09-07 3:07 PM

I had thought of that too. :) Can only incorporate so many mechanics into one shmup though...

2009-09-07 4:08 PM

2009-09-07 3:32 PM

The idea of force-field destroying everything in sight to the beat of some insane techno tune sounds great. Definitely good idea.

I dunno about "insane techno" since I'm not a musician, but I'll do what I can. :D

I did think of making the tethers vulnerable (and the bullets not), but that would be a collision system nightmare so I'm going to keep the tethers purely visual if I include them at all. The idea I'm working with so far is that the player ship's "beat field" cancels bullets within a short distance, and the severed tether snaps back to damage the parent unit. I'm not sure what to do about the shooting aspect, since I'd like that to have something musical going on as well.

2009-09-07 5:01 PM

2009-09-07 4:17 PM

You could have the bullets fire in a rhythmical manner, to a beat, like in Go Beryllium!

That's what I was thinking, too. Once I get bullet cancel "backlash" working, I'm going to try to add beat sync to the player weapon.

2009-09-07 8:24 PM

2009-09-07 7:24 PM

I'd offer to work with you on some cool backing rhythms and such, but as it is I'm way behind on getting my own entry anywhere...

If your entry goes anywhere after the session though, I'd be happy to lend whatever musical talents I can.

Thanks for the offer :D

I'm currently using a rhythm loop I hear a lot on Dance/Electronica: [B__|H|H|S__|H|H] (where B is bass drum, H is hi-hat, and S is snare). It's not particularly techno-ish, but it works pretty well for now. I suspect I'll end up snagging a tune off Aminet and trying to sync to that.

2009-09-08 12:13 AM

Canceled bullets now turn into pickups that add a small amount to the combined weapon/bomb meter, meaning you now have to work for your upgrades instead of accumulating them over time like in InterXept. Pickups become score items after you max out your weapon upgrades.

2009-09-10 2:40 PM

Things are slowly moving along. I starting applying a somewhat different visual style from the usual "bold colors against a black background", setting the background to a desaturated color and giving everything a distinct outline. I also have bullets leaving very Linley-ish line trails. So far the look isn't wildly different but I think it adds a certain something.

I accidentally discovered that the momentum on the pickups led to a degenerate strategy. After nodding off late last night, I woke up to the player ship parked in the lower right corner happily canceling enemy bullets and collecting the tokens that sailed straight into it. It had clearly been there for a while since the arena was literally packed with mines dropped by one of the units.

2009-09-10 10:33 PM

2009-09-10 10:23 PM

Haha nice. I wish I slept at night.

Considering how late I've been staying up lately, so do I. :/

I presume it's not as voluntary in your case, though.

2009-09-11 2:37 AM

2009-09-11 12:51 AM

Yes and no...

OK. I think I can sympathize there.

(Note the time stamp on this message...)

2009-09-11 8:23

It seems I've fallen into my old habit of polishing things before I actually finish core game elements. The spiffiest thing is that the rhythm track and "light show" effect change with the player ship's power level so you don't have to look up at the gauge.

On the plus side, all units now have outlines so they stand out against the background. I even managed to clean up the drawlists for some of them to take advantage of new features that I added since I first created them.

(One of these days I'll post a WIP screenshot...)

2009-09-11 9:27 AM

Heh, tell me about it.

But then again, if you can actually finish your game, some extra 'flash' is always good. Especially in a game with techno theme.

2009-09-11 12:05 PM

I've definitely got my work cut out for me... :D

Also: come up with music beyond the simple one-measure rhythm track.

2009-09-11 6:37 PM

2009-09-11 5:07 PM

Just an idea:

Maybe you could add more beats to your background music, as more enemies enter the screen and things get harder, etc.

Could be a fun way to escape having to have a full music track, and have less repetition. It also reinforces the concept of a rhythm based style. :)

Dynamic soundtrack would be a lot harder to pull off, if undeniably spiffy. :)

2009-09-11 9:14 PM

2009-09-11 8:35 PM

Would it?

I don't think it would take much more than an hour to come up with 3-6 beats to use throughout the game. But then again, how well those beats blend together is an entirely different story. Which I can imagine where the difficulty would come in.

It's more a matter of building out the infrastructure for it, though it might not be as hard as I originally thought. I'll look into it if I have time.

2009-09-12 4:20 AM

2009-09-11 11:46 PM

If you feel like studying a little more into this type of thing, I suggest you take a look at Electroplankton and Bit.Trip Beat.

I'm familiar with those games, though I don't own the game systems they run on. :(

By the way, I got beat synchronization working. It took a lot more effort than I had planned because I had to track down several timing errors in the weapon simulation code. On the plus side, the only new code feature I had to add was an expression evaluator returning world time. The expression computing synchronization delay is a bit awkward, so I may need to add a dedicated "sync" action.

2009-09-13 9:51 PM

Man, I didn't get nearly as much done this weekend as I had planned. :(

2009-09-14 7:52 PM

2009-09-14 6:42 PM

Hey, don't worry about it too much. I would consider this an ambitious concept. Just making sound effects for games takes me a sizable amount of time. :)

The main problem is that the rhythm element consumed all my development time and upstaged the bullet cancel theme. That amount of effort and focus would have been completely justified if the theme were rhythm, but it's not so it ended up being a huge distraction. I'm still my stock enemies (with a new outline effect) and sound effects, and I haven't even touched the level design yet. :P

2009-09-14 10:24 PM

Maybe this won't be a debacle after all. I managed to add a "fuse" effect when a bullet gets canceled or its parent unit dies, and that makes the connection obvious enough without the need for a tangled mess of lines. I'm cautiously optimistic, though I have a busy day ahead of me tomorrow...

2009-09-15 8:27 PM

Well, it looks like I'm pretty much out of time, so I'll just have to update the title screen and call it done. I wasn't able to put in rave track I found on The Mod Archive, build any new enemies, or sequence out new attack waves, but it's fun enough in its own way. Those two weeks went by really fast... :/

2009-09-15 10:21 PM

I was able to put in the rave track and synchronize to the 144 BPM tempo. Hurrah!

September 16, 2009: Release

Well, I think this is as done as it's going to get.


2009-09-16 2:15 AM

2009-09-16 12:38 AM

I think there's something wrong with your host...

I was hosting it on my network-attached storage device, so I may have port-forwarding set up wrong. I put it on my GoogleCode project downloads and updated the link.

2009-09-16 4:29 PM

2009-09-16 4:06 PM

This is fun, but it would be a lot nicer if there was a way to get your POWERUPS back after dying. The way it is, you more or less have to win in one life.

Hm. Good point. I could probably come up with a way to dump out some upgrade pickups when you die, though it's a bit late for that now. I'll definitely keep that in mind.

2009-09-16 8:51 PM

2009-09-16 8:27 PM

This is definitely fun. I love some of the visual effects. Combined with the music, it's very "rave-y."

Too bad it had little if anything to do with the session theme... ;)

2009-09-16 8:27 PM

The biggest problem I find I have with this is the bullet cancelling. I just find it very difficult at this point to intentionally use the cancelling mechanic to good effect. Just flying around blasting is cool, but the cancelling itself doesn't seem to work so great in its current form. I'll play it some more to see if I might get the hang of it or something though.

I think the biggest problem is that the enemies and shots are really fast. I slowed them down a lot from their VideoVenture counterparts, but they're still hard to wrangle in a confined space like that.

2009-09-16 8:27 PM

As a smaller note, the cancelling strobe seems in sync, but the flashes fall between the kicks in the track, which doesn't seem quite right.

I noticed that too, but the synchronization is a giant hack so that doesn't surprise me. I imported the .mod file into a music program (Psycle) to get the tempo (144 BPM), converted it to "seconds per beat" (0.416666...), and then synchronized all weapons to various multiples of that using the world timer. It would have worked a lot better if I could get timing information directly from the music file, but I don't think SDL_Mixer allows that.

2009-09-16 8:27 PM

I hope you will continue to work with this concept!

Oh, I will. :D

I need to revisit other entries as well, at the very least getting them to function with the latest codebase.

2009-09-16 8:27 PM

By the way, too bad I didn't think of this earlier, but as it turns out Cactus has put out a little rhythm-based shooter. You should look it up.

Hm. I'll have to go look for that. The games I could think of with rhythm-synchronized weapons were Rez, Garden of Coloured Lights (for the enemies), and Go Beryllium.

2009-09-16 9:00 PM

2009-09-16 8:56 PM

I recommend using FMOD for music, it's brilliant.

I plan on using it myself, with the new engine I'm going to be making. (since I'll no longer have audio support included... And all that)

FMOD might be a bit heavyweight for what I'm doing, but I'll take a peek.

2009-09-16 10:00 PM

2009-09-16 9:02 PM

Okay, here's my idea. Ditch the shooting altogether, focus on manually controlled, timing based, and tempo-synced bullet cancelling elements, and then make it DDR pad compatible. XDD

Seriously, though, I'm going to try replacing the primary spread-fire weapon with the missile weapon and the secondary missile weapon with a smart bomb. It would elevate the importance of catching enemy shots, though I'd have to make sure the difficulty stayed sane.

2009-09-16 9:02 PM

By the way, I used an FMOD dll extension for GM in my last entry to run the sounds.

Ah, okay. FMOD is definitely popular. :)

Right now, sound support is the only thing keeping me with SDL. I was originally going to try using OpenAL, but I may give FMOD a shot.

2009-09-17 3:09 PM

2009-09-16 11:50 PM

Well you'd have to counter the shots to fire them back and destroy enemies. X]

Seriously, I think the shooting in your game may be competing with the bullet cancelling element.

I totally agree. It's too easy to go on a "mow-fest" with the primary weapon.

2009-09-17 1:14 AM

Edit: I just realized what you said. I've been thinking that having to cancel bullets to get ammo for your shots might work well too.

I had toyed with an explosive shot—the titular Rave Gun—earlier in the design process, but hadn't hit upon having it cost energy. I'll revisit it to see how it turns out.

2009-09-18 8:01 AM

2009-09-17 10:54 PM

wow I really like the bullet canceling to the rhythm ! I agree with what has been said about having the shooting, it just feels a bit too crowded to me, if you could emphasize more the canceling to the rhythm, maybe even having some slight additional "shockwave" that dampens the speed of bullets approaching just at the edges of the cancel-radius, it might start making the canceling feel as more of the focus. and it would definitely be cool to throw in some alternate kick drum patterns, maybe even a short bonus phase where it goes into some fast double kick with a huge swarm of enemies just closing in for fun..

Ooh, I'll have to try that!

2009-09-19 7:33 AM

2009-09-18 10:15 PM

I've been thinking about this a lot. I've always had a deep-rooted interest in both game design and music, so music/rhythm gameplay is something I've often dreamed about. And, of course, with my interest in shmups, this concept kind of tickles my fancy.

Cool. I like this combination as well, though I have zero experience actually making music.

I'd be totally set if "rhythm" had been the theme. Too bad I pretty much ignored the actual one. :)

2009-09-18 10:15 PM

I have some ideas but I'm too lazy at the moment to describe them. ^ ^

Heh. I'll be around, so I'll see them whenever you post them. This entry joins Rocket Bomb (session 3) and Nova Core (session 9) as project branches I very much want to keep active so I'm definitely open to new ideas.