Skullgirls Mobile is the mobile version of the hit PC and console game! It is a true fighting game experience on your mobile device - one that’s easy to pick up for casual players, but still challenging for seasoned fighting game veterans.
Skullgirls' unique art style harkens back to classic 2D fighting games, while boasting high-fidelity and lush graphics for modern-day hardware. The mobile game’s graphics pack the same punch as the original (spare no expense)!
The mobile game brings a rich fighting system to touch screens with a variety of combos, special moves, and “blockbuster” super attacks. It also introduces RPG elements, such as leveling up, evolving fighters, equipping moves, and applying status effects that can give you the edge in battle.
Skullgirls is available on the Apple App Store and Google Play Stores. <img src="/img/download/200/apple_appstore.png#center" alt="Apple App Store"> <img src="/img/download/200/google_playstore.png#center" alt="Google Play Store">
Skullgirls began development in January 2015, and it was launched in early 2017. We are still actively developing the game, with exciting new features being released every few months!
When we started work on Skullgirls Mobile, we didn’t know whether it would even be feasible for the game’s graphics to decompress and render on mobile platforms, due to both the memory overhead of the high-res art and the CPU overhead required for on-the-fly artwork decompression. My initial responsibility was to implement a “proof of concept” with the 2D art rendering running at 30-60FPS on mobile devices. Fortunately, we found this to be achievable!
I served as the lead programmer on Skullgirls Mobile. After the initial proof of concept, I fully implemented 2D art rendering and loading, fighter state and transition system, hit/hurtbox detection, and a custom scripting language used to implement fight logic.
My goal was to make porting of assets between the console and mobile game fairly simple. This included many assets: art, state machine data, sound and music, 2D art for story/dialogue, and fight stages. I believe we have largely succeeded in defining straightforward pipelines that allow such assets to be easily shared. As a result, bugs fixed and improvements made in the PC/console game can be easily used on mobile and vice-versa.
After the initial proof of concept, several optimizations and efficiencies had to be made to make the game run smoothly on mobile devices. Art decompression is a potentially time consuming task - we initiate decompression as early as possible in a frame, and perform the decompression on a background thread. The actual decompression logic is highly optimized and makes use of C# “unsafe” code to perform operations as quickly as possible. We also use a custom rendering plugin that achieves more efficient uploading of textures to the GPU and avoids unnecessary memory allocations.
The mobile game also has features that weren’t in the console game. Perhaps the most complicated framework I developed was our “ability” system, which allows fighters to react to certain game events, under certain conditions, to apply one of many modifiers (such as bleed, health regen, armor, etc) to one or more fighters in the game. I’m quite proud of this system’s modularity and extensibility - it has been used to implement hundreds of unique behaviors for the game’s fighters and moves.
Skullgirls Mobile is an “always online” experience, where most in-game actions result in network requests being sent to backend servers to validate and actually perform actions. To achieve this, I implemented an efficient HTTP library and network request framework on the client.
To efficiently implement features on Skullgirls, all engineers are “full stack” - meaning they are responsible for implementing a feature’s code on the client (Unity), on the server (Java), in the database (MongoDB), and on the infrastructure (AWS). Because one engineer is capable of doing this all, it means we are able to very quickly and efficiently implement new features with excellent conceptual integrity and fewer bugs during integration.
As a full stack engineer, I’ve been responsible for implementing multiple systems. I implemented a modular authentication framework, which allows users to login to the game using Facebook, Google, LINE, or in-house implementations for email/password login or guest login. I’ve also implemented a modular purchase validation and tracking system that currently supports Apple App Store and Google Play purchases. Other backend systems I’ve worked on: a system to trigger purchase offers for user based on in-game actions, an achievement tracking system, and realtime matchmaking for an async competitive game mode.
One other fun thing we did recently was introduce realtime synchronous PvP gameplay. To do this, we integrated and augmented the GGPO rollback netcode system. We had to ensure that the entire game was deterministic for this to work, so we refactored a lot of our systems to use a fixed-point math system that ensured we wouldn’t get floating point discrepancies or drift. I was responsible for initial integration of these systems and initial implementation of a NAT-punchthrough solution to allow devices to connect to one another on private networks.