← Blogs

Playing Win-based Galgame in GNU/Linux

This article is constructed and refined by me, sketched by Deepseek V4 Pro, reviewed by Gemini 3.1 Pro Preview.


Just a blog documenting how I managed to play galgames running on windows in GNU/Linux systems (more specifically, Fedora 44) — nothing novel except for some hard-won experience.

If you want to set up an environment with Lutris to play Galgame in GNU/Linux, I would recommend you to read this Lutris guide instead of this article.

Source material

Nearly everything below comes from the Visual Novel Wiki, a small community wiki about running visual novels. The pages I followed, in order:

  • Lutris — installation and terminal setup
  • ProtonUp — where to obtain Wine and Proton runners
  • Wineprefixes — the main course, one prefix per kind of game

The wiki is written with the Steam Deck in mind, so a few small adaptations were needed on a normal desktop. Those adaptations are the only part of this post that is not “just following instructions”.

My environment

  • Fedora 44
  • Niri, a Wayland compositor – no desktop environment, hence no KDE apps
  • Ghostty as the terminal emulator
  • GUI software installed through Flatpak wherever possible

The wiki’s terminal setup assumes Konsole, which I do not have. More on that below.

Installation

The Lutris page offers a flatpak install:

flatpak install flathub net.lutris.Lutris

For the flatpak build, runners live in ~/.var/app/net.lutris.Lutris/data/lutris/runners/, not the native ~/.local/share/lutris/runners/.

Host a Ghostty termianl

For TUI games — old engines that dump their text into a console — the wiki has Lutris launch a terminal. A flatpak cannot spawn a host terminal on its own, so the wiki ships a tiny launcher script:

#!/bin/bash
flatpak-spawn --host /usr/bin/konsole "$@"

I use Ghostty instead of Konsole, so mine is:

#!/bin/bash
flatpak-spawn --host /usr/bin/ghostty -e "$@"

saved as ~/.local/bin/host-ghostty and made executable, then in Lutris: PreferencesGlobal options → toggle AdvancedTerminal, and point it to the script.

It’s worth noting on VNWiki, the instruction let you save the script at /home/deck/Desktop/host-konsole – obviously a user friendly, but not wise choice.

Japanese locale

The JP Locale page stresses that flatpak apps do not inherit the host’s locale, so Japanese support must be enabled both on the host and inside Flatpak. On Fedora:

languages 'en;ja' flatpak config --user --set languages 'en;ja' flatpak update

After this, a Locale dropdown appears in Lutris game configurations. (A spoiler: ja alone will not suffice for a Chinese-patched game, as the end of this post shows.)

Runners via ProtonUp-Qt

The Wineprefixes page maps each prefix to a runner:

Both can be installed with ProtonUp-Qt, which also has an official flatpak (net.davidotek.pupgui2). Its manifest grants precisely the filesystem access needed to drop runners into the Lutris flatpak’s runners/ directory — no Flatseal surgery required.

In ProtonUp-Qt: pick Lutris, Add version, choose GE-Proton and install; then choose Kron4ek Wine-Builds Vanilla and install; then restart Lutris as the app suggests. I ended up with wine-11.16-amd64-wow64 — newer than the wiki’s recommended 10.4, and it works.

Wineprefixes

A wineprefix is a folder holding a whole fake Windows install. The wiki’s idea: one prefix per kind of game, so breaking one does not break the others. Two basic prefixes cover most visual novels:

  • proton_ge — first choice for newer engines
  • vanilla — for older engines, e.g. kirikiri or BGI

For flatpak Lutris these two need zero components installed — the flatpak bundles GStreamer and umu-launcher, which a native install would demand separately. Just create the folders:

mkdir -p ~/Games/wineprefixes/{proton_ge,vanilla}

The wiki also lists a zoo of media prefixes for codec-heavy games (lavfilters, wmp11quartz, xact, …). I created those folders too, and I hope I never need them.

Game installation

素晴らしき日々 〜不連続存在〜 (Subarashiki Hibi ~Furenzoku Sonzai~), a BGI engine visual novel with a Chinese fan patch (v0.99 by 冥月·凌雪汉化组). My copy came from a Mac, so every file arrived with an AppleDouble ._ sibling, and the whole tree was owned by root. The patch’s readme contributed two warnings of its own:

  • run BGI_CHS.exe for the patched Chinese version;
  • install 字体文件/font.ttf before playing, or the game will show no text.

Adding the game to Lutris

The Wineprefixes page says to “visit any game’s config” — which silently assumes a game already exists in Lutris. To add one: the + button, Add locally installed game, runner Wine. Then Configure:

  • Game options → Wine prefix: ~/Games/wineprefixes/vanilla (the wiki recommends vanilla for older engines like BGI), prefix architecture 64bit
  • Runner options → Wine version: the Kron4ek wow64 build
  • System options → Locale: ja_JP.utf8 (this choice comes back to bite me later)

First run

The game booted straight into a mojibake dialog, with one intelligible line:

[system.arc ; ipl._bp]

That is a BGI engine error: it could not load ipl._bp from system.arc at startup. Yet system.arc sat right there in the game folder, and strings confirmed ipl._bp was inside it. So the engine simply failed to open system.arc -— it looks for its archives in the working directory, and the working directory was wrong; or the path itself broke the engine’s ANSI path handling. The patch’s readme mentioned that the Japanese original cannot tolerate non-ASCII paths, so I also doubted the full-width characters in 素晴らしき日々 〜不連続存在〜.

Following the instructions from Deepseek V4 Pro, I applied all candidate fixes at once, so I cannot honestly say which one was the killer:

  1. set Working directory to the game folder;
  2. renamed the folder to a plain-ASCII path, /home/flandre/Games/Subarashiki_Hibi;
  3. sudo chown -R-ed the folder back to my user — BGI writes its save file BGI.gdb directly into the game folder, and a root-owned folder is not writable.

It booted. (The mojibake in that dialog was a separate symptom — the prefix had no Japanese locale or fonts yet — which the JP Locale section above addresses.)

Gamescope for window rescaling

The window also needed rescaling, and that is what gamescope is for. Lutris has a built-in Gamescope section under System options: enable it, keep the game rendering at its native resolution, and let the window display at whatever size fits the screen. Done, no manual wrapping needed.

Garble in dialog window

The game now ran, and the settings page rendered Chinese perfectly. I was very excited, until I actually started the game and found out the character dialog was mojibake… What a curious combination.

The Chinese patch stores its text as GBK. Wine decodes ANSI text according to the locale you configure for the game — and I had configured ja_JP.utf8, telling it the game speaks Shift-JIS. So every GBK byte pair was misread as a Shift-JIS character: 乱码, in the most literal sense. The settings page survived because it renders through Unicode paths; the dialog does not.

The fix was to teach flatpak Chinese, and then to say so in the game config:

flatpak config --user --set languages 'en;ja;zh' sudo flatpak config
--system --set languages 'en;ja;zh' flatpak update

then set the game’s Locale to zh_CN.utf8, and finally honor the readme by dropping the patch’s font into the prefix:

cp ~/Games/Subarashiki_Hibi/字体文件/font.ttf \
    ~/Games/wineprefixes/vanilla/drive_c/windows/Fonts/

And then everything rendered correctly.

Closing

Three BGI-engine quirks, now recorded for the next old engine:

  1. archives are opened from the working directory, and the path must be ASCII-friendly;
  2. saves are written into the game folder itself;
  3. text encoding follows the locale — GBK text with ja locale ends up garbled.