Nate Game

A jump'n'shoot side-scroller game targeting JavaScript platforms and using the Impact game engine. I was coding everything in CoffeeScript at the time and Box2D was being used to provide physics. A friend of mine, an artist who goes by Tderek99, was doing the graphics while I was doing the programming.
Details

This game was pitched as: Binding of Isaac, but plays like MegaMan and has a dash of Metroid.
You were to play a dog-boy named Nate who is abducted from his world by a mighty dragon demon and given to his daughter as a pet. This childish dragon girl, Chie, "plays" with Nate by using her reality warping powers to create a pocket dimension full of obstacles, traps, and monsters looking to tear him apart.
She's technically a child, and her treatment of Nate is kind of the demonic equivalent of putting the hamster in the microwave; she just doesn't know better.
She still grants him a simple magical bullet for self-defense when she drops him into this terrifying world, but scatters "dog toys" that can grant him new powers all over the place.
In the same fashion as Binding of Isaac, these powers could combine and interact, giving every play-through the potential for something unexpected and exciting.
The world was gonna rely on procedural generation to make every game different. The map would generate in such a way that some of the items sprinkled in the world would be used as keys for progressing into new areas, adding a little bit of Metroidvania mechanics into the mix.

Each of the four or so areas was going to have a boss fight, and upon defeating all the bosses, Nate would escape the pocket dimension and face Chie herself, who'd try to do the demonic equivalent of smacking his nose with a newspaper for trying to bite.
In order to get the good ending, though, you needed to discover and complete optional goals; if done so, you'd face Chie's father as the final boss, earning your freedom and returning home ...if you manage to beat him.
We'd probably have tuned things so a single run would probably take one to three hours.
Design
This project was my first time utilizing Entity-Component Systems and Action Lists. Impact did not really have support for ECS entities out of the box, so I integrated an open-source ECS library, which I later ported to CoffeeScript so I could understand how it worked better as well as customize it.
Unfortunately, I was not satisfied with Box2D's performance for driving the physics of the game. Nate was using the old "capsule body" trick to make him run smoothly across slopes and other surfaces without getting stuck; this gave him a bit of a slippery feel on the edges of platforms.
Most likely, I would have eventually disabled the physical simulation and only used Box2D for collision detection. I didn't really like the thought of having so much dead weight from Box2D hanging around, though, and it inspired me to instead work on Platter, a collision detection engine specifically for classical feeling 2D games.
At the time we stopped working on the game, I was still building out the basic gameplay mechanics, figuring out how to handle all the power interactions and abilities, as well as laying the foundation for enemy programming. Although I had scribbled out thoughts on how I'd try and do all the proc-gen stuff, I never got started on a prototype.
Interactive Sample
What with not being able to get more than a simple GIF animation together to demonstrate the original game, I put together this neat interactive widget for this website. You can use your cursor to play with Nate, who will chase after and try to shoot it when he sees it.
When he is in his passive state, he will just pace around, showing off his move-set through random actions. But when he sees the cursor, he'll bark at it and switch to his aggressive state.
He'll chase the cursor around and try to shoot at it. If it gets too close, he'll flee, but try and take potshots at it. If the cursor sits still too long or gets to a place he can't reach, he'll stare at it and display frustration in not being able to play anymore.
If he is left bored for too long, he'll make a sad, confused whine and return to his passive behaviors. Be nice and give him some fun! It gets boring on that blue platform...
All of this was made using a combination of HTML, JavaScript (with ESNext features via Babel), and CSS (via styled-jsx). The sounds were created using jsfxr and hopefully the sounds he makes when he changes between his behavior states are recognized as sounds a dog might make.
While the Canvas API would probably have been the more performant option, an HTML-element based solution is fine for such a simple interactive piece. His animations are all driven and controlled by CSS, and an action-list coded in a data-driven style drives his rather complicated behavior, made up of around 50 individual actions spread across 4 major behaviors.
This was actually the most complex AI that I have made to date, in terms of behavioral complexity.