Register a SA Forums Account here!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
  • Locked thread
Nov 9, 2009

The Game

Transistor was released in 2014 by indie developer Supergiant Games, the makers of 2011's Bastion, which it shares a lot with. They're both isometric action games with loadout customization, rpg elements, amazing visuals, great music, silent protagonists, and smooth-voiced companions that narrate throughout the games voiced by the same guy. Despite these similarities they are two very different games that set out to accomplish very different things. Whether Transistor is successful at those things is a question I hope to answer by the end.

Part 1: The Fugitives

Part 2: The Process

Part 3: The Camerata

Part 4: The Traces

Non-EuclideanCat fucked around with this message at 04:44 on Apr 24, 2017


Nov 9, 2009

Click the Function icons for demonstration/explanation videos!

Non-EuclideanCat fucked around with this message at 03:54 on Apr 24, 2017

Nov 9, 2009
Deep Dive 1

As you all have no doubt figured out, the second feature of Part 3 is that I've... modified the game in certain ways, chiefly the names of Functions and enemies. Exactly how I did that and where I got those names will be the subject of another post, but for now I'd like to show you something neat I found while scouring the game's files.

In the Script's folder there's a single folder named "Decks". Inside there's a collection of .txt files with some very zippy names.

Here, for your edification, are links to the text in those files:

All | Initialize

Blaster | Builder | Custom | Drainer | Puller | Randomizer | Scrapper | Sniper | Stalker | Starter | Summoner | Tricky

What we have here is the skeleton of a card game.

We can see references to mechanics similar to the main game: you have WEAPONs, Passives, and Upgrades at your disposal, as well as Meta and Curses. There seem to be two main kinds of moves: attacks, which are named like (sometimes exactly like) Functions, and summoning friendly Processes. For the latter, we can quickly find references to AllyDemolisher, AllySuppressor, and AllyZoner, which we're familiar with, and AllyDeflector and AllyBomber, which we're not.

As for the former, there's lots of names we know and even more we don't. Decks contain Sidearm, Snipe, Blink, etc., but also some pretty wild stuff like Banish, Novaball, Cloudkill, Shrapnel, BlackHole, and ChaosLance. These names don't contain any file references to call card data so I can't tell you what they were supposed to do.

There's also some lines in the game's Utility and Debug Scripts that talk about creating, drawing, and playing cards and the states they can be in (flipped, unflipped, equipped, permanent), respectively.

But wait, there's more! This skeleton has skin!

After investigating the Decks folder I wanted to know just how much of the card game had been finished, so I combed through more files looking for references. It took a while, but I hit paydirt while unpacking the game's texture files. In the "GUI" package there's numerous textures that don't appear in the game but have names that are referenced in the card game files. So here are those, in all their cut glory:

Those first 11 are cutouts from sheets with multiple textures on them. The rest are all individual files. Make sure to check the images' names; I gave them their original file names.

One last thing: You doubtlessly noticed the unfamiliar face in 07. Here he is again:

That's our lovely boyfriend in the sword, Jack.

Speaking of names and Kaz, I mentioned to him that, while he has no official name, he does have an alias in the code: "Boxer". In the scences where his body is present, numerous references are made to "Boxer" and "BoxerPortation". One section in particular is very interesting:

Yep. Once upon a time you could destroy Jack's body.

What a wonderful relationship.

Nov 9, 2009
Deep Dive 2

So I've been going on for a while about how easy Transistor is to modify, and I figure it's time to show just what I mean. Let's head on back to the Content folder, and then into Scripts.

This folder holds all of Transistor's scripts, of which there are three types: .txt, .scripts, and .world_scripts.

The .world_scripts aren't really relevant to us. They control things like camera position. It's the other two we care about.

The .scripts contain all the event triggers. Things like scene transitions, the start and end of fights, designating Use Points for jump pads and elevators, all that good stuff.

They also, notably, contain certain conversation triggers, especially for Royce.

Finally, the .txt files are what the .scripts reference to determine what audio files to play and when.

Now, there's two kinds of speech triggers: continuous and conditional. Continuous Speeches are used for the monologues Royce gives when you talk to his proxy. The conversation is loaded up as a single unit and plays all the way through, uninterruped.

Conditional Speeches exist for when there's a chance a given line might not play. If a line is based on a specific action, like most of Jack's reactions to Red are, could be interrupted, like Asher's speeches if you ditch the terminals quickly, or have a chance of not going off, like much of Royce's dialogue in his studio if you hurry through, the line is queued based on certain conditions being met (or not being met).

Also take note of a few things: first, the programming language Supergiant uses has "--" as a way to dummy lines out. Any lines starting with that aren't read by the game as active lines to be used. This can be used to make notes, as with the in-code subtitles for the voice lines, but also to prevent certain events from firing if the creators deceided they don't want to use them but also want to leave them in for whatever reason. Second, all of the paragraphs for dialogue make reference to "/VO/~", where ~ is some kind of file name. It's these two notes that let us make changes to the game's dialogue.

So let's get to that. Back to Content, then into Audio. A few more files deep and we find 7 files: 5 .bank files, a .bank.strings, and a .fsb. The .banks house all the game's sound effects, and I honestly don't know what the strings file is all about. It's VO.fsb that really matters. Within that file is every single voice clip recorded for this game, even the ones that didn't make it in. It's this file that all the /VO/~ calls are referencing

Using an extractor we can get a look at and copy any of these files into a .ogg file, which can be trivially converted into any playable audio format. The files are broken up first by game level (Fairview, Goldwalk, Elevators, etc.), then numbered (Fairview_1 to Fairview_109), then subdivided by letter if a line is part of a series (Asher_5a to Asher_5i). Extracting these files lets us play them for ourselves so we can find out what's what.

So take, for example, Royce's lines. Royce has 374 voice files, most of which are used but certainly not all. So what do we do if we want to put them in? We've got a couple of options. First is to find lines whose triggers were dummied out and remove the -- to make them active again. Second is to add them into Conditional Speeches and add or adjust the conditions to make it all work. We'll see a lot of this in the finale episode. The final way, as I did here:

is to add in an entire Continous Speech into the .txt and corresponding trigger in the .scripts file. All of this can be done pretty trivially so long as you know the file names you want to play and copy the format excatly (failure to do so with Continuous Speeches will lock Red into an endless, silent staring contest with Royce, forcing you to kill the game via task manager or alt+f4).

Now I'll show you how I changed all the names.

From Content into Game we find files containing unit information and animation data. Units contains all the information for enemy units in easily editable .xml files. Their health, movement data, AI, sound effects, upgrades (including the unused Level 4 forms I mentioned), and display names can all be easily viewed and modified by popping any of those files into any word processor. The information for all of our Functions is on similar .xmls, over in Game/Weapons.

Next, let's take a look at how Transistor does its graphics.

The game does its graphics via a combination of sprites and clips.

The Clips are used for especially complex or flowing items: things like Red, Royce's fight avatar, Fetch animations, etc. Everything else are sprites. The Clips exist in .bik files in Content/Movies: a collection of a given animation played in each of the 32 directions an object can face in this game. Presumably these files are all interchangable, meaning Red could be turned into a dog or a headless Man with a simple find-replace.

The sprites all exist on a series of sprite sheet packages over in Content/Win/Packages. Loading them up into a viewer lets us see how they're laid out.

Everything's in here: the backgrounds, most of the particle effects (including Functions), all the objects, everything. Let's take a look at our humble little chicken friend for an example.

All of the Lobber's textures are here, subdivided by purpose:

Attack animations.

Walking animations and death effects.

They're all sprites called up by the reference bins in the various packages, which are themselves called by the animation code in their Units .xml files.

Finally let's take a look at subtitles.

All the game's subtitles exist in a series of .csv files that are married to their respective level scripts.

Each line is assigned to a matching voice file name and is displayed as the file plays. Since these are all simple spreadsheets, they can be modified as easily as all the others. In fact, you've already seen that. The subtitles for Royce's bit about Sybil that I put in did not match the voiced line. I had to delete a sentence out of the file to make it match properly.

Non-EuclideanCat fucked around with this message at 03:55 on Apr 24, 2017

Nov 9, 2009
Here's the first of the two final videos.

Nov 9, 2009
And here, at longest last, is the conclusion:

Jul 22, 2007

Hail all those who are able,
any mouse can,
any mouse will,
but the Guard prevail.

Clapping Larry
I don't know what it is about a giant monument made out of swords, even if those swords are also circuit boards. it just... speaks to something in my soul, I guess.


Nov 9, 2009
And that's the end of that! Thanks for watching!

  • Locked thread