Sky: Children of the Light is a beautiful game on all counts. The same thematic, audiovisual artistry that made Journey critically acclaimed has been converted into an accessible multiplayer experience.
Sky was originally released for iOS and won 2019 Apple Game of the Year and the prestigious Apple Design Award, among other mobile game accolades. In April 2020, Sky was released for Android.
Then in May, I learned about the game from a long-lost friend. Needless to say, I highly recommend this game to players who are looking for an immersive artistic experience akin to Ico and Katamari Damacy. But soon, my technical side got the best of me, and I began to drill deep into the technical details behind this masterwork.
“The Art of Sky: Children of the Light,” a talk presented by thatgamecompany at Gnomon (an art school in Hollywood), very comprehensively discusses challenges about TGC’s design and modeling workflow. It’s very inspiring and well worth the two hours:
In short, here’s what we know about their engine:
- Sky uses an in-house engine built from scratch. As a result, some artistic sacrifices had to be made for lack of engine support (and time to add engine support).
- All cross-platform support is built into Sky, meaning native code was painstakingly written for each platform that they intended to release for. (This also explains why Switch support is taking so long.)
- The engineers were very conscious about memory, so they severely limited polycounts and forced modelers to build levels using weight-painted metaballs instead.
- All audio is done by FMOD.
- Engine authoring tools were written in-house as Maya plugins.
As an aside, I also have some observations of my own:
- Considering their reliance on platforms with good hardware security, PC support is improbable. Though there’s not much of a reason to hack online features, hacking of every level is an expectation on such a free platform as PC.
- In the long run, it seems that the artistic minimalism of Sky is beginning to come at odds with TGC’s need to sell season passes with new levels, cosmetics, and emotes. I assume that they will learn to navigate this issue by leaving the core gameplay untouched – the Journey-like experience they want everyone to see – and focusing instead on recurring players who want more social features.
- Interestingly, the developers’ internal names of parts of the game are very different from the names the players have come up. I don’t know a player who would call the rain in the forest level “emo rain.” Moreover, the game experience was intended to be nonverbal, but as the MMO style of the game continues to develop, more and more text seems to be added to the game.
(Because it didn’t seem that Sky would be released to PC anytime soon, I decided to take the time to make an Android desktop setup. This actually took a considerable amount of effort, since Bluestacks does not currently support Android 8, and so a setup with real hardware is needed. Thankfully, Android phones work beautifully as desktop computers with Samsung DeX, though I was surprised to find that it took a 5 A (100 W) USB-C laptop charger to meet the phone’s energy demands. Otherwise, everything just worked – PS4 controller over Bluetooth, mouse over Bluetooth, keyboard dongle over a USB hub, headphones over the headphone jack. Perhaps in the future, I may even buy VR hardware to truly immerse myself in a game like this one.)
Anyway, with this long-winded appraisal of the game, let’s discuss some challenges with taking this game apart.
Sky is a beautiful game – despite this, where is the soundtrack? Where are the tech write-ups? Where is the modding community? (Most successful games have mods, whether the developers like it or not.)
The answer is that the game is technically still in development under the free-to-play model, and most of the company is invested in programming and art. They will probably not have a chance to look back and reminisce until the Switch release. And perhaps once the game breaks even, developers might consider modding or authoring of some sort: the “blob” engine makes it painfully easy to design a personal map that one can invite others to, for instance.
As for the soundtrack, a certain member of the Sky community has taken it upon themselves to record the entire soundtrack by artificially filling an entire server with friends, going to every area in the game, and recording the line output. I applaud the dedication, but in my opinion an audio rip should have been considered before taking such extreme measures.
It’s a phone, what did you expect?
The Android ecosystem has been remarkably locked down over the years. Though you can enumerate apps and view extracts of APKs, you can’t look at another app’s local (or “private”) data. This means that the only way to view an arbitrary app’s data is by rooting the phone or impersonating the app over ADB with run-as. But this only works with apps that have the debug flag enabled (and of course, if you set it to true in the manifest, then the APK signature is broken and the package becomes unsigned.)
However, before succumbing to rooting, there is one more trick. It’s possible to use ADB’s deprecated backup tool to back up the contents of any Android package to desktop. With this, we can obtain access to local data, including downloaded assets.
DRM (or lack thereof)
Most of these protections are completely passive – TGC developers placed no additional effort in encrypting assets. It was already difficult enough to access private app data.
I’m fine with this, and most people ought to be. Asset encryption adds a layer of complexity that will embarrassingly be broken by the same people who prompted its creation, and it hurts everyone else with overhead from decryption. It just doesn’t work.
It was very easy to find the FMOD sample banks for each level. Although initially I believed that this was a state-of-the-art FMOD bank format, after an hour of tinkering with some obscure tools, I was able to extract full audio for Sky.
It’s absolutely stunning! Unfortunately, this orchestral work of beauty was encoded in Vorbis at 24 kHz. Vorbis (as opposed to Opus) is certainly a limitation of FMOD, though I wonder if 24 kHz was a conscious decision to cut audio size in half.
There are tons of unused tracks, and some tracks heard in game are named as if they were “test” tracks. In total, there are about 5 hours worth of music.
All of the meshes use the in-house binary mesh format, which I really have no interest in reverse engineering. Fragment and vertex shaders are in compiled Vulkan format.
It could be possible to add new meshes and levels manually, but considering how tightly bundled everything is, it might be difficult even after successfully deciphering the mesh and level formats.
The game uses Lua for most of its scripting, which is a respectable option. Some scripts in the asset folder were kept in their source form with comments, revealing the existence of “rune duels,” a debug menu, and a full level list including debug levels. What I don’t understand is why only some of these Lua scripts are present; where are the rest?
A deeper dive
Clearly, there is more code to be found. The game uses a multi-step process to trampoline into native platform-specific code, first starting off with a bare-bones Android activity and then invoking a native bootloader library through JNI. Interestingly, not even ProGuard was applied.
I decided to inspect the native binary through Ghidra, and the first thing that popped out to me was a class called AncestorEngine. I was tempted to believe that Ancestor is the name of the in-house engine, but this seems unlikely based on the idea that multiple of these instances belong to an “engine group.”
Perhaps it’s possible that the client streams client-side Lua from the server, akin to Garry’s Mod. But the class hierarchy indicates that game entities and behaviors are written in straight C++, while Lua is just used for dynamic scripts (asset loading, debugging, last-minute patches, etc.) that would be impractical to do directly from native code.
Despite TGC’s blanket ban on modding – this position always relaxes with time – Sky’s engine and architecture are elegant enough to be worth modding. Its odd deployment as a mobile game is no obstacle for tinkering, and I could envision Sky having a thriving (or at least well-intentioned) modding scene in the coming future.