An open-source reimplementation of the engine of Magicka (Arrowhead Game Studios, 2011), in the spirit of OpenMW: you bring the game data from your own copy, OpenMagicka runs it on modern systems.
Status: early beta. The menu, the campaign's chapters, pause and the options work; chapter 1 is being played through. Testers' builds are on the releases page.
OpenMagicka contains no game assets and never will. Buy Magicka on Steam (AppID 42910); OpenMagicka reads the models, levels, textures, sounds and texts from that installation. Nothing is copied into this repository or redistributed.
- run on Windows, Linux, macOS and Steam Deck, 64-bit, modern graphics APIs (Vulkan, D3D12, Metal);
- behave like the original: spells, levels, triggers, co-op;
- fix what breaks on modern PCs: frame-rate dependent logic, controllers, resolutions;
- keep online co-op with our own protocol (no compatibility with the original client).
The original executable is studied only to understand file formats and behaviour. Decompiled code never enters this repository, its wiki or its issues: specifications are written in our own words, tables and constants. See docs/.
Third-party libraries in lib/ (FNA, FNA3D, FAudio, MojoShader) are used as they are, except
for our own FNA3D build for Windows x64: FNA3D with a few MojoShader fixes, kept as patches in
native/. Those fixes were written with AI help, and the libraries'
maintainers do not accept AI-generated contributions: they stay in our fork and are never sent
upstream. Please respect that when reporting issues upstream.
Physics uses Jitter2 (MIT) from NuGet, behind our
own facade in OpenMagicka.Physics (ADR-0003).
Requirements: .NET 10 SDK, Git, GitHub CLI (to fetch the native FNA libraries).
git clone --recursive https://github.com/vogster/OpenMagicka.git
cd OpenMagicka
sh tools/fetch_fnalibs.sh
dotnet build OpenMagicka.slnx
dotnet test tests/OpenMagicka.Tests
dotnet run --project src/OpenMagicka.LauncherOn Windows run the shell scripts from Git Bash. tools/linux_check.sh builds, tests and
smoke-runs the game on Linux inside Docker. On Windows x64 the launcher uses our FNA3D from
native/win-x64 instead of the fetched one; pwsh tools/build_fna3d.ps1 rebuilds it (Visual
Studio's C++ tools and CMake needed).
Tests that need the game files run when MAGICKA_DIR points at a Magicka installation.
Testers' builds for Windows and Linux are on the releases page:
unpack one, run OpenMagicka, and it finds your Magicka (or asks for its folder).
docs/TESTING.md is the testers' guide. Each v* tag builds and publishes a release
(.github/workflows/release.yml): git tag v0.0.2 && git push origin v0.0.2.
The launcher runs the game: the Tome's menu, the campaign's chapters, pause, the options. It finds Magicka itself
(Steam's libraries), or takes its folder from --content "<Magicka folder>" or MAGICKA_DIR. Testers' builds come
from pwsh tools/package_beta.ps1; docs/TESTING.md is their guide. --level <name> plays one
level alone, and --screenshot <file.png> saves a frame (of the menu, or of that level) and exits.
--viewer (or --scene, --game-camera) opens the level viewer instead:
dotnet run --project src/OpenMagicka.Launcher -- --content "<Magicka folder>" --scene wc_s1WASD move, Q/E (or C/Space) go down/up, Shift is faster, the right mouse button looks around,
PageUp/PageDown switch between all scenes and models, Tab jumps between the scenes and the models
(props and characters, in their rest pose), F frames, Escape quits. G switches to the game's
camera (WASD then walk a stand-in player it follows; --game-camera starts with it). Scenes are
drawn with the original shaders; R switches to a simple forward view. --screenshot <file.png>
saves the first frame and exits.
--check-effects loads every original effect on the GPU and reports the result; --placeholder opens a window
that needs none of the game's files (a check of the graphics).
omx reads the game's content with OpenMagicka's readers:
dotnet run --project src/OpenMagicka.Tools -- check "<Magicka folder>"
dotnet run --project src/OpenMagicka.Tools -- dump "<Magicka folder>/Content/Levels/Swamp/sw_s1.xml"
dotnet run --project src/OpenMagicka.Tools -- info "<Magicka folder>/Content/Levels/Swamp/sw_s1.xnb"check reads every XNB file, level, scene, dialog file, visual effect and language and lists
what fails. dump prints an .xnb, .lvl or content .xml file as JSON (lists and dictionaries are cut after
256 items; --full prints them all; byte buffers show their length). info prints an XNB
header and its type readers.
- Engine analysis: stack and content of the original
- Architecture decisions: stack, network
- Risk checks: original shaders on FNA, XACT on FAudio, Linux
- Format and gameplay specifications in docs/formats, docs/gameplay, docs/engine
Most documentation is in Russian.
OpenMagicka is released under the MIT License. Libraries in lib/ keep their own
licenses (FNA: Ms-PL). Magicka and its assets are property of their respective owners;
OpenMagicka is not affiliated with Arrowhead Game Studios or Paradox Interactive.