Tool-assisted game movies
When human skills are just not enough

Submission #6787: keylie's Linux FTL: Faster Than Light in 03:11.25

Console: Linux
Game name: FTL: Faster Than Light
Game version: 1.5.13
ROM filename:
Emulator: libTAS v1.4.0
Movie length: 03:11.25
FrameCount: 11475
Re-record count: 991
Author's real name: Clément Gallet
Author's nickname: keylie
Submitter: keylie
Submitted at: 2020-06-20 10:26:52
Text last edited at: 2020-07-20 16:01:43
Text last edited by: fsvgm777
Download: Download (5053 bytes)
Status: published
Click to view the actual publication
Submission instructions
Discuss this submission (also rating / voting)
List all submissions by this submitter
List pages on this site that refer to this submission
View submission text history
Back to the submission list

Version info:

libTAS version: 1.4.0

Annotation info:

FTL: Faster Than Light v1.5.13 DRM-free version (taken from Humble Store), 64-bit binary.

Tested on Debian 10 (Buster) 64-bit, linux version 4.19.0-5-amd64 and libTAS v1.4.0. Game executable is "/path/to/game/data/amd64/bin/FTL" You must open "File > Executable Options..." and set "Run path" to "/path/to/game/data/" and "Library path" to directory "/path/to/game/data/amd64/lib".

Default game options are fine. The game has a native resolution of 1280x720.

Commentaries are also provided as a srt subtitle file inside the movie archive (rename with tar.gz extension and decompress it to access this file).

Author's comments and explanations:
FTL: Faster Than Light is a strategy roguelike game released in 2012. This TAS completes a single run with the starting ship (Kestrel A) with the advanced edition and hard mode.

(Link to video)

The above video contains commentaries as subtitles.

Game objectives

  • Emulator used: libTAS v1.4.0
  • Finish the game with the starting ship from a clean savefile
  • Uses hardest difficulty
  • Aims for fastest real time
  • Takes damage to save time
  • Ends inputs early
  • Heavy luck manipulation
  • Genre: Strategy

Game version

This TAS was performed on a former version (1.5.13) of the game. The first reason is that libTAS does not support later versions of the game. The second reason is that starting 1.6 version, the game uses its own PRNG. Before that, the game uses the system's native PRNG ("rand()/srand()" in the case of Linux version). This was much more easy to track these calls in libTAS for making the TAS.

There are only minor differences between these versions, none of which were abused in the present TAS.


About 95% of the work was the retro-engineering of the whole sector generation. I used the savefile editor work from ComaToes and Vhati as a framework, and implemented the sector generation inside it. All game data are stored inside a package that can be decompressed. Data files are xml files, so they can be read and parsed easily.

At the beginning of a run, the sector tree and sector 1 map are generated. Then, each subsequent sector map is generated when entering it.

So, the entire sector map is generated at once. It consists on:

  • sector layout. There are maximum 24 beacons on a grid of 4 rows and 6 columns. Some beacons may be randomly be skipped, making a minimum of 16 beacons. Each beacon is shifted from its grid position by a random horizontal and vertical offset
  • starting and ending beacons. The starting beacon is randomly chosen from the first beacon column. The ending beacon is randomly chosen from the two last columns, except for the last sector.
  • each beacon event. All random parameters of an event are resolved (random events from a list, reward type and quantity, crew race, name and stats, etc.). If the event involves a fight, the game does not generate all the random parameters of the hostile ship layout, but stores a random number that will be used as a seed for when we will enter this beacon.

The only thing that is generated when entering a beacon is the content of stores.

Luck manipulation

The game uses the system time at startup to seed the PRNG, so we can easily manipulate the sector 1 map. For the other sectors, the game pulls random numbers during idle time (20 numbers every 15 frames). To get a finer precision, we can use the crew stances. When a crew is manning an active system (weapons, engine, pilot, doors, camera or shields), it switches from one stance to a random one about 4 times per second. So, by moving crew, activating or deactivating systems, we can make the game pull more or less random numbers.


Sector layout

The goal of the game is to go through seven sectors, and fight the flagship in the eighth sector. The minimum number of jumps to go through a sector is four. The reason is that you can only jump between two beacons if they are from consecutive rows or columns. Because the starting beacon is on column 0, and ending beacon is on columns 4 or 5, it makes a minimum of four jumps.

For the first seven sectors, the strict minimum is to manipulate the layout so that we can reach the ending beacon in four jumps, without any fight or boarders.

The last sector is more complex: the starting beacon is on column 0, the federation base is on column 3 or 4 (hard only, 2 or 3 on normal and easy) and the flagship is on column 4 or 5. Moreover, it must take the flagship between 3 and 5 jumps to reach the federation base. It takes the flagship two turns to jump from one beacon to another.

In the optimal layout, it takes only 3 jumps to each the flagship:

  • turn 1: we jump to column 1, flagship prepares to jump
  • turn 2: we jump to column 2, flagship jumps to column 3
  • turn 3: we jump to column 3

To reach that layout, the optimal path for the flagship to the federation base must start with a jump to column 3, which is rather rare. So there are much more constraints on optimal sector 8 compared to other sectors.

Flagship fight

The last fight consists of three phases. The ship has 4 shields. The relevant differences between the phases are:

  • phase 1 starts with a clocking, that cannot be skipped. Ship has 20 hp
  • phase 2 has 22 hp
  • phase 3 starts with a Zoltan shield of 12 hp, and the ship has 20 hp

The most damaging weapons in this game are the beams. When all the shields are down, the most damage you can deal against this ship are:

  • Glaive Beam: 15 damage, and requires 4 power bars
  • Halberd Beam: 10 damage, and requires 3 power bars
  • Hull Beam: 8-9 damage, and requires 2 power bars

We need a weapon to take out the shields. The best weapons to take out shields are the flaks. Flak 2 fires seven projectiles and only requires 3 power bars. The chosen weapons are Flak 2 and two Hull Beam, for a total of 7 power bars (saving the cost of an eighth bar).

Moreover, we need the Weapon Pre-igniter augment that charges all weapons at the beginning of every fight. No other augment offered by the game would save any time in the run.

Because the credits start after the last phase, without any additional input, we can end inputs early by using the auto-fire feature. I move around crew at the end of phase 2 to manipulate randomness, then I deactivate and reactivate the Flak 2 at the beginning of phase 3 to synchronize the weapons when the Zoltan shield is taken down.

Reward manipulation

Because the first sector can be manipulated by tweaking the system time, I could get a very lucky layout with no time cost. The two rarest items are the Weapon Pre-igniter (5/5) and the Flak 2 (4/5), I built a script to check every seed value for these two drops (in addition to the four jumps/no fight constraint). There was about 10 matching seeds in the first 1 billion I tested (there are 2147483648 possible seeds). I chose the one with a crew reward, so that I had a higher range for manipulating randomness for the next sectors.

There are much less possible seeds for the other sectors (with loosing much time), so the remaining weapons were obtained in shops. Because shop content is generated when entering the beacon, and the Hull Beam has a rarity of 3/5, it was rather easy to manipulate its presence in a shop.

The rest of the manipulation was for scraps and fuel. I also needed one Drone System and a combat drone for one hit on the second phase of Flagship.

Memory: Judging

Memory: jumps into existence

OK so first off thanks to fsvgm for confirming sync.

jumps into talking about optimization

Optimization here appears fairly good even though it can be hard to tell what's going on.

jumps into talking about entertainment

Speaking of not being able to tell what is going on, that was kind of a huge detriment, for the most part all you see is jumping from one place to the next and then suddenly the final boss. While to some that could be kinda funny, for others it was just boring.

jumps into talking about the ending input early

Ending input early results in a long drawn out last phase of the fight but given that there wasn't much entertainment prior, changing it wouldn't change the reception a ton. The double kill was kinda fun though

jumps into verdict

Accepting for Vault.

gets destroyed at the same time along with this game

fsvgm777: Processing.

Similar submissions (by title and categories where applicable):