
InscryptionOnline
Player-versus-player multiplayer for Inscryption. All three acts, Steam lobbies, deck builder.Inscryption Online
Networked player-versus-player for Inscryption, running inside the real game client.
Everything that existed before this was either local hotseat, a Tabletop Simulator table, or a browser/Godot reimplementation of the card game. This is the actual game, over the network, against another person.
A match between two players - the opponent's board, turn indicator, and your hand.
Deck building uses the game's own card table.
What works
- All three acts. Play on Leshy's table, the GBC pixel game, or P03's board. The host picks; both clients load the same act. Each act keeps its own deck.
- Steam lobbies and P2P — host, browse, join. No IPs, no port forwarding, no master server. Verified across two machines on two Steam accounts.
- Direct IP / LAN as a fallback for non-Steam copies.
- Standalone versus mode launched from the main menu. No campaign run required, no map node consumed, and saving is disabled for the duration so a match can never touch your save.
- Real turn order with a turn indicator; cards appear on the opponent's board as they are played.
- Authoritative board sync each turn, so sacrifices and combat deaths stay correct.
- Deck builder using the game's own 3D card table, paged, persisted to disk — one deck per act, each restricted to cards that act can actually draw and pay for.
- Clean match end on both clients, back to the main menu with the result.
Install
- Steam → Library → right-click Inscryption → Manage → Browse local files
- Extract
InscryptionMP-install.zipinto that folder, next toInscryption.exe:Inscryption.exe winhttp.dll doorstop_config.ini BepInEx/plugins/InscryptionMP.dll - Launch the game and press F7.
Both players need the same build. 1.1.0 cannot play against 1.0.x — the act is now negotiated when a match starts, so the protocol changed. Mismatched versions are refused at the handshake with a message naming both, rather than failing halfway into a match.
Playing
- One player clicks Host Lobby, the other clicks Find Games and picks the lobby.
- Pick an act. The host's choice decides the table; the other client follows it and uses its deck for that act.
- Either player clicks START MATCH — both clients enter a match together.
- The host takes the first turn. Ring the bell to pass.
F7 menu · F8 start match · F12 abort out of anything
Deck building
F7 → EDIT DECK. Click a card to add it; View My Deck to remove. Decks are 6–20
cards, stored per act in BepInEx/config/inscryptionmp-deck-act1.txt (and -act2,
-act3).
Each act offers the cards that belong to it: Leshy's creatures in Act 1, all four scrybes in Act 2's GBC game, P03's machines in Act 3. Cards an act can't pay for are left out, so an Act 1 deck can't smuggle in energy costs. Act 2 and Act 3 cards are drawn on Act 1's table while you browse, so their pixel art appears a little blocky there — in a match they render natively.
Each player brings their own deck. Decks are never synchronised — the peer only ever
resolves a card name, which the game's own CardLoader already handles.
The card pool ignores campaign progression on purpose: a versus deck shouldn't be gated behind someone's single-player unlocks.
How it works
Each client runs an ordinary single-player battle in which it is the player and the opponent is driven by the network instead of the AI. A card the peer plays into their slot N materialises in our opponent slot N. The engine's own combat resolution runs untouched.
That is the whole trick, and it falls out of Opponent being abstract with a virtual
QueueNewCards(). It holds for every act, because each act's opponent derives from that
same base — Part1Opponent, PixelOpponent and Part3Opponent are all replaced the
same way.
What differs between acts is everything around the battle: Act 1 and Act 3 are explorable
scenes with a GameFlowManager, while Act 2's GBC_CardBattle has none and is driven
from an overworld we never load. Each act also has its own draw pile reading its own deck
store. Those differences live in MatchAct.cs rather than being special-cased at each
call site.
See NOTES.md for the engine details and the bugs that cost real time.
Not done
- Acts 2 and 3 are newer than Act 1 and have had less play. They run start to finish - the scene, deck, art, sigils, rulebook and match end - but Act 1 remains the most exercised of the three.
- Some rarer card effects may not replicate perfectly on the opponent's screen. Please report anything that looks wrong.
- Play with people you trust — this is built for playing with friends, not for competitive or ranked play.
Building
tools/deploy.sh # build + install into every local copy of the game
tools/peer.py # scripted opponent for testing without a second client
Requires the .NET SDK. BepInEx packages come from https://nuget.bepinex.dev/v3/index.json
(see NuGet.config) — they are not on nuget.org.
AI disclosure
Most of this mod's code was written by Claude Opus 5 (Anthropic), working with the author across a single extended session: the author drove the design, tested every build against a second machine, and found a good number of the bugs.
Disclosed per Thunderstore's policy on LLM and AI-generated files
(https://wiki.thunderstore.io/llms-and-ai-generated-files). The same disclosure is
present in the assembly metadata (AI_Assisted_Creation, AI_Model_Vendor,
AI_Model), and every commit in the repository carries a Co-Authored-By trailer.