Yes. I must let it go. I am giving up on one of my bigger projects, Slush Dungeon.
I am writing this post to settle my thoughts on the game, as well as give those who were watching this game some insight. Also, I’m giving away the project files, assets, and brainstorming materials to the internet for free. Why not.
This is going to be a long write-up.
Slush Dungeon was supposed to be a squad-based rogue-like. The player takes control of up to 3 Slush fighters, who can jump and attack enemies together, as they try to get to the end of the dungeon. Inspiration for the idea came from several sources, but there were 2 that stick out the most.
Firstly, the idea for a rogue-like game stemmed from my personal addiction to The Binding of Isaac. I was really intrigued by its game mechanics. It was a game that I found fun to play over and over again, which is hard for me nowadays. I’ve played a good share of game genres, but the rogue-like was new to me. For those who are unfamiliar, the basic features of rogue-likes are:
- Single-player, the game’s fun comes from its challenge
- Randomized item and player attributes
- Permanent death, you gotta start from scratch when you lose
- Randomized levels, usually room-based
- High difficulty, but the game highly rewards experienced players
Binding of Isaac is a brilliantly streamlined version of the traditional rogue-like. And it was made in Flash.
A second, equally as powerful inspiration was the Tales series. I’ve played Tales of Vesperia, Xillia, Xillia 2, and Abyss.
My Slusher friend in college, Omar, introduced me to the series. I’m not a Japanese RPG guy. When I think of JRPGs, I think of menu screens. The rather dull game play of navigating a menu, selecting an attack, and watching an attack animation deal some numbered amount of damage.
But when I watched Omar play Tales, I was pleasantly surprised at its storytelling power. I’m not saying the actual plot of the game was good. Rather, it was the way the team members interacted with each other. The game featured “skits”, that would interrupt game-play with some banter between the characters. These skits would slowly reveal more about the party’s dynamic. And they were context sensitive too! That is, if you used one character’s special attack frequently, a skit would pop-up about that character being praised about it.
I felt very connected to the characters, like a good book. It was delightful.
I also loved the super-cinematic special moves that each character has (this is where Ultra Attacks come from).
So, years later, I really wanted to try out the team skit mechanic and bring it to the Slush Defenders.
Technically, I began development of a fighting platformer on October 21, 2013, called “Vertical Boon“. It was also a dungeon-based game, and was supposed to feature Gildedguy as the protagonist. As Gildedguy progressed through the in-game world, he would acquire power-ups called “boons” in an attempt to reach the after-life. Kinda nerdy. Although I eventually abandoned this game, I realized I had some very nice platformer code (months of hard work!).
So when I wanted to continue the Slush Invaders series in Jan 2014, I knew I wanted to salvage the platforming engine. Thus began the coding grind. This was my most ambitious game by far. I wrote many design notes detailing various aspects of the game play, as well as how I would implement them. Here are some coding feats I’m particularly proud of.
Randomized Dungeon Generator
The dungeon generator I wrote produces a 2D top down map of a random floor-plan. The rooms dimensions can be configured from skinny corridors to fat squares. All rooms are randomly connected via doors, which can sometimes lead to interesting routes and loops. Later on, I would give certain routes special attribute weights. That is, a long isolated route filled with many enemies would yield a higher reward weight. This resulted in great level variety. I learned to respect and appreciate recursion while writing this generator.
2D Physics Engine
I would like to think I am a connoisseur of 2D physics engines. I’m always amazed at how well supported these frameworks are. The engines are well optimized, documented, and updated to suit everyone’s needs. But the api’s…I just didn’t want to deal with other people’s code any longer. A giant project like this one needed to be flexible, and I needed to understand the code inside and out. Not easy to do with an external library.
So I wrote my own! For the first time, I present:
Gildedguy’s Plain Platformer Engine Features:
- Awesome triangle-rectangle based hit detection
- Drag and drop art-based terrain design!
- Amazing physics parameters, like wallFriction, groundFriction, airFriction, and Bounce!
- Superior support for dynamic cameras (like Vcam!)
- Supports an astronomical 100 Objects at once
- Cloud-style platforms that you can jump through, yet land on!
Yeah…it’s no Box2D. BUT if you have a simple platforming game in plain old Actionscript 3, this framework will do you fine. Sometimes all you want is a MovieClip that stops moving when it hits a wall. If a couple coders adopt it, I may do a tutorial or two on it in the future. Just let me know!
Dynamic Skit Selection
Like I said before, I wanted to create different scripted conversations that appear depending on party members and their actions.
To make this work, I did some research on dynamic dialogue. I found this really cool GDC talk by the developers of Left 4 Dead. They coded their AI’s to talk to each other based on the situation at hand. I found out that “tagging” is an effective way to assign contexts to your skits. So I could group all skits about “Leveling Up” together, but separate them further by who the main talker is.
I wrote a giant XML file full of tags and descriptors. This file was the holy script of all skits in the game. It included dialogue, who would talk at what time, as well as their facial expressions and gestures. To get the skits to pop-up, I would trigger a “query” on the XML file. During this query, variables like team composition, dungeon type, and “situation tags” would be compared against skits in the XML, and assigned a score (depending on appropriateness). The skit with the best “score” would be loaded up and made available to the player to view!
I gotta say, it’s one of the most convoluted systems I’ve coded, but it was super cool to see it work. The actual script writing was very weird for me. I had to come up with dialogue for these Slush Fighters, who were based off my friends in college. So it was awkward to come up with banter they would say. I don’t want to project my own thoughts of them too publicly. Plus, the Slush Fighters had never talked before (except for that one cut scene).
“Build-a-combo” Combo System and Synergy
This ties back to the “boon” mechanic I had for Vertical Boon. I wanted to add the ability for players to construct their own attack styles. So I added a “build your own combo”. When a fighter picks up a special power-up, their attack chain increases by one. The style of the new attack comes in two flavors: C+ (for combo plus) and F+ (for finisher plus). This can result in some very long combos, which are fun as hell.
To further augment the team-building aspect of Slush Dungeon, I implemented a Synergy system. Instead of leveling up and gaining stats, fighters become more “in-synch” with each other. That is, the attack timings of the secondary fighters increasingly lines up with the primary fighter as they gain XP together.
One small aesthetic improvement I added was the “muffled” filter applied on the background music when you’re in the Pause menu. To be honest, I completely forgot how I implemented this. I believe it was a combination of Googling and experimenting with bit-rates. I believe I spent a month straight trying to get this effect to work. It’s a nice effect, but totally not worth the effort.
Why did I Stop?
After writing all those cool development milestones, I’m thinking to myself:
“Damn, this game could’ve been a hit. Why did I stop?”
Upon reflection, my response is:
“Eh. In the moment, life takes priority.”
I was in the latter half of university, and that’s usually when big events occur. When I thought about my “platformer game”, all I saw was heaps of functional (yet messy) code. So instead I worked on “smaller” projects, with clearer visions. Stuff like Multiplayer Monkeys, Slush Invaders Duel, and Slush Tile Rush. Slush Dungeon was a passion project , but I didn’t work on it consistently. I did enjoy my time with it; I would use up winter/spring/summer breaks coding this thing.
But during college, you kinda want to have fun with your friends.
I’m a Computer Science major, and in-between school assignments, exams, and career planning, do you really want to do more programming? Or do you just want to chill with your roommates? I picked the 2nd one, and I think that was the right decision.
After graduation, I had enough time to work on 1 project. I had to decide between Slush Dungeon and Slush Tile Rush. Slush Tile Rush was smaller. Naturally, it got priority.
A couple months later, when STR was done, motivation for Slush Dungeon was completely extinguished.
The project folder for Slush Dungeon continued to sit in my Dropbox this entire time, but I’ve gotten used to ignoring it. I thought about archiving it with all my other unfinished games, but that seems like such a waste of hard work…
Argh! Take it away from me. Just take it. I don’t want to look at it anymore!
Why give it away? I do not fear anyone coming in to “steal my game” because, honestly, my rogue-like platformer idea has been implemented multiple times already. My code is all over the place. No one is going to be able to figure out how it all works without my help.
I do have two conditions:
- I keep the right to use the title “Slush Dungeon”. It’s pretty catchy.
- Please credit me if you do use my code/assets.
I don’t expect anyone to finish my game, but I think it would be interesting to peruse my code and game assets. There’s also a folder in there called “Ideas”, which will be very interesting to fans curious about the future of Slush Invaders.
Also, I feel I owe it to those who were eagerly anticipating release, but didn’t get many updates from me. I received a lot of positive feedback on my prototype, which is always uplifting.
Thanks for reading.