Stardew Valley on OpenBSD and on Raspbian
The last few days I lost a lot of time that could have been spent
productively by playing Stardew Valley instead. If you are into gaming, you most
likely know about it: It is a modern Harvest Moon, i.e. a farming simulation
that also has some dating simulation and (diverging from the normal
Harvest Moon formula) even action rpg parts.
My wife and I play it in co-op mode - I run it on OpenBSD, she plays on our main
computer, the Raspberry Pi 4 running Linux (Raspbian). I want to use this
article to document what I had to do before we could play together. Stardew
Valley is, regrettably, a closed-source game, so "just recompile it" was not an
option. But at least it has a Linux port that you can get on GOG.
The easy part: OpenBSD
The bad news is: OpenBSD cannot run Linux programs anymore. The support for
Linux binaries was removed a few years ago, as no one was interested in doing the
necessary work to maintain it. This has the upside of reducing the attack
surface on OpenBSD, but it reduces your gaming options even more than on Linux.
The good news: Thanks to folks like Thomas Frohwein (thfr@), there is an easy
way to play some modern, closed source games. And it works flawlessly for
Stardew Valley.
* Install fnaify(1) * Get the Linux installer from GOG * Use unzip(1) on it to extract the game * cd to the data/noarch/game subdirectory * Execute fnaify there * Start the game by running ./StardewValley
You might have to increase your data limit via "ulimit -d 8000000" or similar -
with that number, the game works on my system, but a lower limit will most
certainly work too.
You should now be able to play.
Playing on Raspberry Pi
On Raspbian, things are not exactly that simple, as there is no fnaify(1) in the
repository. Theoretically speaking, the script should work fine if you prepare
all necessary dependencies and create the directory structure it expects. I did
not go that route, but instead fixed it manually.
I cannot give you the complete package list that needs to be installed in order
to play, as most packages were already installed on my system. Some packages
will be obvious, but you will have to find out for yourself.
As a word of warning: I am using the 4GB variant of Raspberry Pi 4. Stardew
Valley runs fine, but without swap I cannot even run Firefox at the same time
(well, maybe I could if it were not for the many open tabs). The reason for that
seems to be, according to the folks who made it playable on the OpenPandora,
that Stardew Valley loads all music into RAM at program start. You can use
scripts for the OpenPandora that down-sample the music files so that you can run
the game with less memory usage. This is most likely the reason you need to
use ulimit on OpenBSD. As my systems have enough RAM, I did not try any
down-sampling.
I did not try the game with an unzipped installer on Linux. I don't see why it
should change anything, but for my system I executed the installer on my desktop
pc first and copied the install directory to my Raspberry Pi after that. You
will find the game directory from before directly below the install directory.
Stardew Valley is a .Net program, so we will have to install mono first to run
it. You can find a version of mono in the default Raspbian repository, but I
choose to install the most recent one (currently 6.12.0.90).
sudo apt install apt-transport-https dirmngr gnupg ca-certificates sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF echo "deb https://download.mono-project.com/repo/debian stable-raspbianbuster main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list sudo apt update sudo apt install mono-runtime
You can try to run the game now via
mono StardewValley.exe
but you won't have sound and also joining a game hosted on my OpenBSD notebook
made the game crash, so we still have work to do.
I fixed the sound issue first by changing the MonoGame.Framework.dll.config to
this:
<?xml version="1.0" encoding="utf-8"?> <configuration> <dllmap dll="SDL2.dll" os="osx" target="libSDL2.dylib"/> <dllmap dll="soft_oal.dll" os="osx" target="libopenal.dylib" /> <dllmap dll="SDL2.dll" os="linux" cpu="x86" target="./lib/libSDL2-2.0.so.0"/> <dllmap dll="soft_oal.dll" os="linux" cpu="x86" target="./lib/libopenal.so.1" /> <dllmap dll="SDL2.dll" os="linux" cpu="x86-64" target="./lib64/libSDL2-2.0.so.0"/> <dllmap dll="soft_oal.dll" os="linux" cpu="x86-64" target="./lib64/libopenal.so.1" /> <dllmap dll="SDL2.dll" os="linux" cpu="arm" target="/usr/lib/arm-linux-gnueabihf/libSDL2-2.0.so.0"/> <dllmap dll="soft_oal.dll" os="linux" cpu="arm" target="/usr/lib/arm-linux-gnueabihf/libopenal.so.1" /> </configuration>
The original version contains no definition for Linux on ARM cpus. With that
fix, sound was working.
To fix the crashes, I had to make sure that Stardew Valley uses the System
assemblies of my mono version. The easiest way to achieve that was to copy them
to the game directory:
cp /usr/lib/mono/4.5/System.* .
And this was the last fix that kept us from playing. Happy farming!