OpenTyrian: a C port of a DOS shooter with three ways to run it
An open-source port of the scrolling shooter Tyrian.
At a glance
- What is it?
- OpenTyrian is an open source port of the DOS game Tyrian, a vertical scrolling arcade shooter, built in C against SDL2 and distributed as self contained archives for Windows, macOS and Linux. Multiplayer exists, but it has no lobby and both players must start the session by hand at the same moment.
- Who is it for?
- OpenTyrian suits someone who wants to play Tyrian on a current operating system without chasing a DOS emulator, and who is comfortable with a build that depends on C99, GNU make, pkg-config and SDL2. It does not suit a player who expects modern online play, because there is no arena and the session has to be agreed out of band.
- Can I use it commercially?
- Yes, with conditions. GPL-2.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 5 days ago.
- What is it written in?
- Mainly C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A DOS game ported to C and SDL2
OpenTyrian is an open-source port of the DOS game Tyrian, and the repository is written in C. Tyrian is an arcade-style vertical scrolling shooter, and the story is set in 20,031 where you play as Trent Hawkins, a skilled fighter-pilot employed to fight MicroSol and save the galaxy.
The feature set the README names is small and honest. There is a story mode, one-player and two-player arcade modes, and networked multiplayer. For a port of a game from that era, that list is a fair summary of what the original offered, and the repository does not attempt to modernise the game itself.
What the port does modernise is the plumbing. The build uses SDL2 rather than the DOS libraries the original shipped with, the source is laid out for a modern compiler, and the release archives are built for current desktop platforms. The licence is GPL-2.0, with the text in the COPYING file at the repository root.
The tree shows the shape of the port: src/ holds the C sources, there is a doc/ directory, a Doxyfile for documentation generation, a linux/ directory with the application icon referenced by the README, and helper scripts including make_icon.py, make_linux.sh, make_macos.sh, get_data.sh and lower-script.sh, which are the packaging and data preparation scripts for the platform builds.
Three archives, each with the game data inside
The downloads section gives one archive per platform, and the instruction is to download the appropriate build, extract it and run it.
On Windows the archive is named opentyrian with a version, a windows tag and an architecture, and you unzip it and run opentyrian.exe. On macOS the file is the universal build, and you unzip it and open OpenTyrian.app. On Linux it is the tarball with the version, a linux tag and an architecture, and you extract it and run ./opentyrian.
The line that matters for a new user is this one: these builds contain everything needed to run the game, including the freeware Tyrian 2.1 data files. There is no separate data download for a release build, and no separate purchase.
There is one platform caveat. The macOS app is not notarized, so if Gatekeeper refuses to open it, the instruction is to right-click the app, choose Open, and confirm once.
That is a small friction point and a fairly common one for unsigned macOS builds, but it is worth knowing before you conclude the download is broken.
Where configuration and saved games end up
Configuration and saved game files are kept in one of a small number of locations, and the README gives them per platform.
On Windows the path is %APPDATA%\OpenTyrian. On macOS and Linux it is $XDG_CONFIG_HOME/opentyrian or ~/.config/opentyrian.
There is an override that is easy to miss, because it only applies to two of the three platforms. On Windows and Linux, if opentyrian.cfg exists in the same directory as the executable, then the configuration and saved game files will be stored there instead of the platform location.
That behaviour is what makes a portable install work. Put the executable and an opentyrian.cfg next to each other on a USB stick and the game keeps its settings and saves with it, rather than writing into the user profile of whatever machine you happen to be on. It also means that if you want to run two installations with separate settings, the file next to the binary is the switch.
Game data is searched in four places
If you download a release build of OpenTyrian, the freeware Tyrian 2.1 data files are included and do not need to be downloaded separately. Every other case needs the data, and the README is precise about where it goes and in what order the game looks for it.
You download Tyrian v2.1 and extract the archive so that the files, with lowercase filenames, are in one of the following locations, searched in order: the directory given with --data=DIR; a data directory next to the executable, which is inside Contents/Resources for the macOS app; the system directory the build was configured with, which is /usr/local/share/games/tyrian by default and C:\TYRIAN on Windows; and the current directory.
Two details carry the weight. The filenames have to be lowercase, which is why the repository contains a script whose name suggests lowercasing, and the order is a fallback chain rather than a set of alternatives, so a stale copy in the current directory will be picked up before the system directory.
The last entry in that list is also the one that catches people out. Data found in the current directory means the game behaves differently depending on where you launched it from.
Building needs SDL2, and network play is auto-detected
The build requirements are short: a C99 compiler, GNU make, pkg-config, SDL2 and, for network play, SDL2_net. The build itself is one command.
makeNetwork play is enabled automatically when SDL2_net is found, so there is no separate configure step and no flag to remember. The Makefile shows how that detection works. The WITH_NETWORK variable defaults to auto, and in that state it asks pkg-config whether SDL2_net exists, setting the variable to true or false, and when it is false the build prints a message that SDL2_net was not found and that it is building without network support. When it is true, the compiler is given the -DWITH_NETWORK define.
The Makefile also handles the platform split. If the operating system name matches Msys or Cygwin, the platform is WIN32, the target becomes opentyrian.exe, the Tyrian data directory is C:\TYRIAN and a resource object is added for the icon. Otherwise the platform is UNIX and the data directory is derived from the gamesdir variable, which defaults to the share/games directory under the prefix.
The version string is taken from the working tree with git describe --tags, falling back to a short commit hash, and there is a Visual Studio solution in the visualc/ directory for Windows builds that do not use the makefiles.
Command-line options cover data, sound and network
The option list is short enough to read in one go, and it is the only reference the README gives for the command line.
-h, --help Show help about options
-s, --no-sound Disable audio
-j, --no-joystick Disable joystick/gamepad input
-x, --no-xmas Disable Christmas mode
-t, --data=DIR Set Tyrian data directory
-n, --net=HOST[:PORT] Start a networked game
--net-player-name=NAME Set local player name in a networked game
--net-player-number=NUMBER Set local player number in a networked game
(1 or 2)
-p, --net-port=PORT Set local port to bind (default is 1333)
-d, --net-delay=FRAMES Set lag-compensation delay (default is 1)Two of these are worth pausing on. The --data option is the explicit override for the data search order, so if you have the Tyrian 2.1 files somewhere unusual, that is the flag to reach for. The --net-delay option sets a lag-compensation delay in frames and defaults to 1, which is the knob you would turn if a networked game feels unfair rather than laggy.
The --no-xmas option, disabling Christmas mode, is a reminder that this is a faithful port and that seasonal content from the original is still in there.
Multiplayer needs both players to start at the same moment
The network section is where the port's roughest edge is, and the README is straightforward about it. Currently OpenTyrian does not have an arena, so networked games must be initiated manually via the command line simultaneously by both players.
opentyrian --net HOSTNAME --net-player-name NAME --net-player-number NUMBERThe hostname is the IP address of your opponent, the number is either 1 or 2 depending on which ship you intend to pilot, and the name is your alias. The --net option also accepts a port in the form HOST:PORT if you need to change the endpoint, and --net-port sets the local port to bind, with a default of 1333.
The transport is UDP port 1333, and the README notes that in most cases players will not need to open any ports because OpenTyrian makes use of UDP hole punching.
The absence of a lobby is a genuine limitation rather than a missing feature, because it means coordination happens outside the game. Two players have to agree on an address, agree on a moment, and both launch the command at that moment. For two people in the same room, or two people who already have a habit of coordinating, that is a small cost. For a match with somebody you have never met, it is a dealbreaker, and the alternative is to host the session yourself and tell the other person the address.
Editorial conclusion
OpenTyrian suits someone who wants to play Tyrian on a current operating system without chasing a DOS emulator, and who is comfortable with a build that depends on C99, GNU make, pkg-config and SDL2. It does not suit a player who expects modern online play, because there is no arena and the session has to be agreed out of band. Verify first where your game data lives, since a release build ships the freeware Tyrian 2.1 files and a source build has to find them in one of four locations, and check the macOS Gatekeeper note before you conclude the app is broken.
Frequently asked questions
How do I install and run OpenTyrian?
Download the archive for your platform from the latest release, extract it and run it: opentyrian.exe on Windows, OpenTyrian.app on macOS, and ./opentyrian on Linux. The release builds include the freeware Tyrian 2.1 data files, so nothing else has to be downloaded.
Where does OpenTyrian keep its configuration and saved games?
In %APPDATA%\OpenTyrian on Windows, and in $XDG_CONFIG_HOME/opentyrian or ~/.config/opentyrian on macOS and Linux. On Windows and Linux, an opentyrian.cfg file next to the executable overrides that and stores the files there instead.
What do I need to build OpenTyrian from source?
A C99 compiler, GNU make, pkg-config and SDL2, plus SDL2_net if you want network play. The build is a single make invocation, and network support is enabled automatically when SDL2_net is found by pkg-config. A Visual Studio solution is provided in the visualc/ directory.
How does OpenTyrian multiplayer work?
Both players must start the game manually from the command line at the same time, because OpenTyrian does not have an arena. One player runs opentyrian --net HOSTNAME --net-player-name NAME --net-player-number NUMBER with the opponent's IP address. Multiplayer uses UDP port 1333 and UDP hole punching, so in most cases no ports need to be opened.
What licence is OpenTyrian released under?
GPL-2.0, with the licence text in the COPYING file at the root of the repository.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/opentyrian-opentyrian)Was this useful?