Omakase 5: Bullet Dance

This month was a return to form. Ever since Rain Project, I've always had this urge to make a true boss battler, combining platforming and bullet hell. With November's Omakase, I finally took the dive with Bullet Dance.

I'm super proud of this month's Omakase game, and it's probably the most time I've spent on a month game since I started this schedule. I made it a clear priority to focus only on the boss patterns and not worry about anything else, and it felt great to finally put out some real content.

As of now, Bullet Dance is fully playable with four bosses, each with 5-7 stages each. It's a bit of a journey, but in this post I'll walk through how Bullet Dance came to life from start to finish!

NOTE: There are spoilers below. Download the game here for a clean experience!

The Movement

The first thing I really worked on was the movement. It was super important for the second-to-second control of our main character to feel smooth and satisfying, since that's what the player will be doing the entire game!

As a base, I re-used the custom PlatformerController2D script that I had created for Ropeman. I made sure to have the player's horizontal acceleration and deceleration be instant, so that the player could easily move around precisely. In addition, the player can control how high they jump by holding down the button, and can jump one additional time in the air. As a rule of thumb, I wanted to make the player feel as light and flexible as possible -- the more freedom I give the player in movement, the harder I can make the boss patterns!

The big design choice here is in the dash. In Rain Project, I gave the player an instant dash in straight line, which granted invincibility. The problem with that approach, I've learned, is it can turn the gameplay into a very reaction-based timing problem where the player just waits until bullets are about to arrive and dashes through them all. In Bullet Dance, I wanted players to plan ahead and learn the patterns, rather than just clearing everything with microsecond-level timing.

To accomplish this, I removed the invincibility during the player's dash. Instead, I allowed the player to pick a direction for their dash, so that they could dash between the bullets rather than through them (which is a very satisfying experience).

In early playtests, people still found it hard to line up the dash angles, so I also added a time slow when choosing the dash direction. This ended up being a super helpful design choice -- by slowing down time, players started treating the dash more as a precise positioning tool rather than a quick escape to the side.

The Bullets

While Bullet Dance isn't a Touhou game, it definitely takes inspiration from the series. One thing I really like about the bullet patterns in Touhou is that while they look intimidating, there's actually a lot of leeway that the player is given.

Purple = hitbox

For example, the hitboxes for bullets are always smaller than the bullet's sprite, so the player never feels cheated when a bullet hits that seems like it shouldn't have. Our main heroine herself also has a way smaller hitbox for bullet collisions than for physics, for the same reasons.

On the opposite end of things are the player's bullets. For bosses attacks, we want the bullets to be obvious and slow. For player attacks, we want the opposite -- I don't want the player to have to think too hard about attacking, since I want to let them focus on dodging. For that reason, the player's bullets are auto-aimed at the boss, and are almost impossible to miss due to their speed.

To encourage more risky gameplay, however, I put some details in the player's attacks. The bullets only travel about 1/3 of the screen, so the player needs to stand relatively close to the boss to hit them. In addition, the player fires a spread shot of five bullets every attack, with random angles. If the player is closer to the boss, more of the bullets will hit, and the player will do more damage. This encourages players to go in as close as they can to the bosses without getting hit, creating a risk/reward tradeoff with juicy implications.

Attacking

The Bosses

Another Touhou design choice I adopted -- multi-stage bosses! In most games, bosses consist of a few patterns that repeat over and over. Usually this makes sense, as in most contexts bosses are used as a way of testing the player after they have learned skills throughout the level.

In pure bossfighting games, however, the boss itself should be a learning experience! The first stages should be easier, showing off a certain kind of attack pattern that the player will have to learn to clear. The next stages then ramp up the difficulty, introducing variations and new gimmicks, and the final stage of every boss is a final test of everything so far.

I think the idea of "spellcards" from Touhou are a really helpful tool here, and I put them into Bullet Dance without a second thought. In Bullet Dance, bosses are a sequence of non-spells and spellcards, with the non-spells being easier patterns, and the spellcards being trickier patterns with more to think about. Ideally, there is a progression between the stages of each boss -- the non-spells should start easy and gradually build up difficulty, while the spellcards throw the player some curveballs and challenge.

I use this "progression" idea a lot more in the seven-stage Shadow Eye and War Relic bosses, so jump ahead to those sections for some good examples!

The Graphics

Finally, before we get into the actual boss content, I want to touch on the graphics in Bullet Dance. To put it simply, I wanted to put in as little effort into the graphics as I could while getting away with it.

For the camera, I used the technique I developed with SuwaPond of a pixel camera. Instead of rendering at full resolution, the game first renders to a 360x205 canvas, and then upscales it with nearest-neighbor to create a pixelated effect. This lets me use things like flat circles and squares and still end up with cool pixel effects!

Left: Default rendering. Right: Pixel rendering.

In fact, I was able to build almost all the bosses out of only a few basic shapes. This saved a lot of time as usually I would spend 80% of my development time on pixel art, but I could not create satisfying-enough graphics almost entirely in code.

The Bosses

If you've read up to here, then thanks for sticking with me! In the section, I'm going to go over each of the four bosses and what kind of thoughts went into designing their patterns. If you don't want to spoil the game, I would advise to stop here and try to playthrough the game yourself! The content below is mostly just to point out some obscure thoughts and what led to the various design choices I made along the way.

Boss 1: Light in the Lantern

The first boss is based off the many wooden lanterns found inside Japanese shrines. The Light in the Lantern serves as a warning to those who wish to enter the shrine's strong spiritual zone.

Nonspell 1

This first nonspell is just a simple introduction to bullets -- the boss fires in four directions while slowly moving.

Intimidation Sign ~Dancing Flames~

This spellcard represents the Light in the Lantern attempting to scare off visitors through a fire dance. The boss begins moving a lot quicker, and bullets explode to intimidate anyone nearby.

Nonspell 2

The second nonspell is just three waves of bullets aimed at the player. The player must learn to stream (move back-and-forth) in order to beat this stage without damage, which probably isn't that great of a design choice for this early of a boss.

Lighthouse Sign ~Shore of Stars~

This was my attempt at a spellcard where the boss leaves the screen completely, and bullets just spawn wherever they want to. Shore of Stars in particular is based off the lights you see when viewing an island from off sea, hence the title "Lighthouse Sign".

Fire Sign ~Radiance of Lone Light~

The final spellcard of this first boss is Radiance of Lone Light, which represents the bright shine when the Light in the Lantern finally decides to unleash its full glow.

In this spellcard is a great example of "effect bullets" -- bullets that don't really affect the player's strategy that much, but make the spellcard look a lot cooler. In this case, the outer ring of bullets could have been a simple static barrier, but I made it move in a spiral for that extra oomph.

Movement

As a quick aside, the movement for all the bosses in the game are pretty simple when broken down as well. I didn't want the bosses to just stay in one place, but I also didn't want any kind of weird pre-set path. Instead, every few seconds, the boss picks a new "target" location which is in a random circle above the player.

if (changeTargetPositionTimer.time <= 0) {  
    changeTargetPositionTimer.time = changeTargetPositionCooldown; 
    targetPosition = new Vector3(GameFlow.Instance.player.position.x, 
         bossStage.position.y + 13, 0);
    targetPosition += Custom.RandomInUnitCircle() * 4;
}

Then, in every update, the boss will add a force moving itself towards a desired radius from the target point. Of course, the boss will overshoot the desired position, which leads to a dynamic equilibrium where the boss is always somewhat chasing the player, but also constantly moving in a smooth but hard-to-predict manner.

Vector3 delta = transform.position - targetPosition;  
if (delta.magnitude < targetPositionRadius) {  
    rb.AddForce(-(Vector2) normalized * speed);
}
else {  
    rb.AddForce((Vector2) normalized * speed);
}
Boss 2: Architect

The second boss takes the form of the architect of the shrine. Armed with a chisel and hammer, the Architect is the designer and builder of the shrine as a whole, and his spellcards revolve around this theme of woodworking.

Nonspell 1

As a first warmup, this first nonspell has the Architect face the player, then one second layer shoot towards their position, kicking up bullets in the direction of impact. This is kind of themed around the Architect being a more "physical" being than, say, the light in the lantern.

Cedar Sign ~Woodwork Arrangement~

The first spellcard of the Architect! This is kind of just a generic bullet rain pattern, but with some large wood cedars that appear periodically on the bottom forcing the player to jump, so they can't just dodge side to side on the ground. The themeing here is that the Architect is moving around huge wooden cedars used in traditional Japanese shrine construction, and the cedars colliding at the top of the screen produce the bullets on hit.

Nonspell 2

This is a nonspell, but it could have been a spellcard of its own with some more components. The idea here is a "chisel and hammer": the first spread of bullets represents a chisel placed slowly down, and the circle that launches the bullets is a hammer delivering a strong blow.

Gate Sign ~Four Corners of the World~

What's a classic piece in Japanese shrine architecture? The gate! This spellcard is a little fantasy of mine, where the Architect builds up these wooden gates and they become portals transporting spirits to and from the world. In the spellcard, the boss himself dashes through the gates he has created and comes in and out in different spaces. The name "Four Corners of the World" is mostly because of the four gates in the corner, but it's also a very slight reference to the world being round and loop-able, which the gates let the stage become.

Architect Sign ~The Temple That Stretches to the Sky~~

The final spellcard, which I actually came up with first when designing this boss, involves the Architect building up the shrine in real-time. Every few seconds, a new platform is built, and the screen scrolls up so the player has to keep climbing this new temple which "stretches to the sky".

The cedars that make a return from earlier in the fight are again some effect bullets that don't really serve a purpose other than to make the fight seem cooler and discourage players from staying too low on the screen.

Boss 2: Shadow Eye

This third boss is based off a theme I've been playing with in my head for a while, of the eye monsters that are always looking in from the darkness. I wanted to make a fight with more "terror" and otherworldly aspects than the typical human boss.

Inspirations from the phantoms in Noragami, and Pride from Fullmetal Alchemist

Nonspell 1

With the Eye boss, I began playing with the idea of a repeated nonspell, similar to certain extra bosses in Touhou (e.x, Mokou always throws cards in some circle-like pattern for her nonspells). This first nonspell has the Eye shoot out bullets in a curved eyelid pattern, which then turn towards the player after a 2 second delay.

Curtain Sign ~Watching from the Shadows~

Here, I just wanted to design a spellcard that embodied the idea of many eyes opening in the darkness. Aesthetics wise the eyes definitely stand out against the black background of the spellcard and I am quite happy with it. Gameplay-wise, the eyes simply shoot a sequence of three bullets when opening, but this creates a pretty dynamic dodging pattern that requires some quick jumps to survive.

Nonspell 2

Here's the repeated nonspell in action. The bullets here follow the exact same pattern in Nonspell 1 of turning to the player after two seconds, but the circle patterns make dodging a bit harder as the bullets pose aa bigger formation.

Fright Sign ~A Lurking Feeling in Side Vision~

This is probably the most controversial spellcard in the game at the moment, because it's not a bullet hell. I actually came up with the look first, of a giant eye opening up in the background. But I struggled with coming up with an appropriate gameplay element, since black bullets were very hard to see. I ended up going with a sort of quick-dodging sequence but I'm not super satisfied with it.

Nonspell 3

The repeating nonspell becomes harder! Here, the Eye shoots in a spiral stream, which then turn towards the player. I do give a gap between streams every couple of seconds to let the player dodge through, but this is definitely the hardest of the nonspells, and figuring out how to lead the bullets where you want would be tricky if not for the previous nonspell experiences.

Anxiety Sign ~All the World is Watching~

I kind of came up with this by pure luck -- I was imagining a scene where the player is surrounded by a circle of eyes, so I just dropped in the eye turrets from Curtain Sign. It turns out that the circling eyes with periodic shots makes for a pretty interesting gameplay loop -- there are a sequence of tight dodges, but since the bullets are aimed at the player, it's entirely up to the player how to "aim" the next set of bullets depending on where they are.

Nil Sign ~Alone Against the Sky of Darkness~

The final spellcard! Here's where I make the greatest use of the repeating nonspells for a grand finale. Aesthetically, I wanted to make the final spellcards as awe-inspiring as I could, so the Eye boss transforms into a huge red eye overlooking the player. I also completely fade away the background and the ground itself to black, creating the "sky of darkness".

Gameplay wise, this entire spellcard is actually just a rehash of the nonspells! There are a lot more bullets, but they all follow the well-established pattern of turning toward the player after 2 seconds. Playtesting this spellcard was great -- while the players were struck by the impact of the boss transformation, they were able to immediately understand the spellcard since they had practice with so many similar patterns through nonspells. As players won't be going in blind, this lets me increase the difficulty to a much higher level fitting of a final spellcard!

Boss 2: Embodiment of War Relics

The fourth and final boss in Bullet Dance is the Embodiment of War Relics, based off the many enshrined spears and swords often found in Japanese memorials. The gameplay feel here is especially inspired from Gate of Babylon and Unlimited Blade Works from Fate, and that tension of having a thousand blades pointed at you.

Nonspell 1

Here's the repeating nonspell for War Relics. Golden blades fall from the sky, while the boss himself occasionally shoots a sequence of shots directly at the player.

Ancient Relic ~Scythe and Sickle~

The spellcards for War Relics are all based off of various weapons throughout history. Starting from the ancient age where agriculture was a way of life, this spellcard embodies a scythe and sickle cutting wheat, with the fast slice followed by a circular cut. Gameplay-wise, the swords here are mostly for effect, although they will hit a player who jumps too high.

Nonspell 2

Second variation on the repeating nonspell has the swords fall from the sky at a spread angle, in classic bullet hell style. The direct boss shots also appear at a faster rate.

Medieval Relic ~Two Blades of Iron~

We've entered the age of knights! The imagery here should be obvious -- two huge blades form in the air and come crashing down. The real challenge is in continuously moving horizontally to avoid the swords, while not touching any of the trail bullets left behind.

Nonspell 3

A third variation on the repeating nonspell, where the swords fall from above the boss and towards the player. The boss also moves a lot faster and closer to the player.

Modern Relic ~Sub-machine Gun~

If we're facing the Embodiment of War Relics, surely that means modern warfare as well! This spellcard is just a fun idea of the spellcard being a literal gun, which fires directly at the player after a short delay. By itself, this would just be a typical move-horizontally challenge, but the circles emanating make moving tricky and also add to the "charging" effect of the machine gun.

Relic Sign ~All Whom Have Fallen to History~

Final spellcard! Again, I'm using the final spellcard as a climax of what the player has been learning in the nonspells. This time, the swords all appear at the same time, with differing sizes and locations all across the top of the screen. Of course, the boss still fires directly at you, at a highly increased rate. At this point, however, the player should be accustomed to dodging two bullet types at the same time and be able to clear the pattern.

Lore-wise, this is honestly just a huge Fate reference. The gears are just taken from Unlimited Blade Works, and even the naming scheme is a bit of an inside joke -- in Fate, Archer/Gilgamesh seem like they have a ton of weapons, but really they only have one skill: to open up a world with unlimited weapons. That's why in the boss fight, only the final spellcard is called "Relic Sign", with the rest being named "[xxxx] Relic" as they are not really spellcards but just weapons created from the real, final spellcard.

Conclusions

Bullet Dance was a ton of fun to work with, and it's definitely something I might revisit in the future! If I were to keep going and make Bullet Dance a real game, I think I would revisit some of the first two bosses -- right now, they have a bit too much variation in their spellcards and could benefit for a more streamlined design like the repeating nonspells in the last two bosses.

For now, feel free to download a build and try out the game! For keyboard and mouse, move with WASD and attack/dodge with the mouse. Bullet Dance also has controller support (which could merit a whole post on its own), and plays very smoothly on a PS4 or Gamecube controller.

As a disclaimer, the music in this build is shamelessly stolen from Demon Slayer (great show) and some of the sound effects are ripped from Touhou -- if I ever release a real version of the game, these will be replaced!