Playing FNF FPS Plus on Linux

Created on 02/09/2025

Last time I played Friday Knight Funkin was about two or three years ago, so I wanted to give it another try. I felt like nostalgia, but in the short term.

The thing is, I'm using Linux Mint, and FNF and most of its mods are primarily built for Windows. So there are some concessions to do here.

I'm using a potato PC, and I remember that on Windows, FNF was a bit slow, with low FPS, and sometimes crashed for no reason. Also, you cannot edit keybinds (try to play with WASD or arrows) and there is no week 7.

UPDATE: after trying to play it on Linux, I couldn't run it because it needs a specific version of glibc. Awesome.

That's why I prefer playing FNF FPS Plus, which is an engine mod that adds more than welcome features: a new input system, more accurate and closer to ones from other rhythm games, uncapped fps, editable keybinds, ghost tapping as well as week 7.

However, there is no Linux build on gamebanana, so here are the instructions to build the game.

If you don't want to bother compiling the game (which I completely understand), you can download the game files here (warning: has a size of almost 1 GB). I uploaded them on Github instead of Codeberg since the former has a higher storage limit.

Have fun!

Installing Haxe

Haxe is the programming language used to develop FNF. It can be transpiled to other languages (here, JavaScript on Web and C++ on Desktop) to get better performance.

To install Haxe on Ubuntu and its derivatives you have to type these commands (see this page if you're using another distro).

sudo apt add-repository ppa:haxe/releases
sudo apt update
sudo apt install haxe -y
mkdir ~/haxelib && haxelib setup ~/haxelib

I'll explain what each command does :

  1. Apt repository does have a haxe package, but it's a former version. Knowing that the project generates a compile-time error if Haxe's version is too old, it is better to install the latest one. That's why we're using ppa.
  2. update command looks for available updates defined in reference files. With the previous command, the ppa package overwrites the default one.
  3. We install Haxe and its dependencies (neko and haxelib).
  4. haxelib is Haxe's package manager, and it needs a directory to store installed libraries.

Installing VLC libraries

Yep, you read that right. This is because of the cutscenes, which require VLC C libraries to be played.

After some research (i.e. very long trials and errors), I could establish a single command to install all the necessary packages.

sudo apt install libvlccore-dev libvlc-dev vlc

You need those three packages, otherwise you will get compile-time errors, or linker ones if you don't have vlc.

Install more dependencies

Yeah, the game has a complex architecture.

Instructions were taken from the project readme, but I'm writing them here to save you time.

First, you have to type these commands:

haxelib --global install hmm
haxelib --global run hmm setup

hmm install
haxelib run lime setup
lime build linux

  1. We install hmm library, which is able to handle non-haxelib project dependencies.
  2. The setup command creates aliases. Otherwise you'd have to write haxelib --global run hmm [command] [options].
  3. hmm will install all libs from hmm.json file in the project, including lime.
  4. lime is a tool enabling Haxe code to run in various platforms (you can read this tutorial if you want to know more).

You will find the executable and the necessary content inside export/release/linux/bin/. The bin directory has a size of 991.9 MB. Thunar crashed after being done zipping the whole content (:

Result

C++ compilation is too slow. It took 42 minutes for my laptop to compile the project.

Here is the output of time command:

real 42m33,364s
user 76m31,040s
sys 4m4,015s

There are many reasons explaining that:

  1. There are 1832 header files and 1905 source files that the compiler must handle, from the project AND the libraries (Haxe's stdlib, HaxeFlixel, OpenFL, etc.). I even saw some SDL stuff popping. I used the following command to count files: find $DIR_NAME -type f | wc -l where $DIR_NAME was include, then src.
  2. C++ has a complex syntax, so parsing it takes more time than it would for C for example. It depends on context and must disambiguite some situations (think about template syntax, inheritance, metaprogramming).
  3. Optimization may happen, which unfortunately leads to a longer compilation.

Note that my build is in debug mode. I don't even want to know how long it would have taken for release mode.

What to do next

These are advices about the game configuration, but it's a matter of preference. Feel free to tweak more settings, so that you can play comfortably.

On first launch you will be welcomed by a cache settings screen. If like me, you have a low-end PC, disable music and graphics. You can find this setting again on the Misc category.

Video

Input

Bugs

Conclusion

Despite all those annoyments, I like this game, even though I prefer staying far from its community. I have a huge respect for devs caring about improvement, and sharing them. Shoutout to Rozebud for this project and his passion, and this also applies to devs of Kade Engine and Psych Engine.

I hope that you will understand that as well.

— pgmtx