KayceePvP
BETA: online 2-player PvP for Kaycee's Mod - shared prep maps, room invites, best-of-three duels. Looking for card/sigil bugs - see README.
| Date uploaded | 3 weeks ago |
| Version | 0.1.3 |
| Download link | InscryptionModCreators-KayceePvP-0.1.3.zip |
| Downloads | 40 |
| Dependency string | InscryptionModCreators-KayceePvP-0.1.3 |
This mod requires the following mods to function
API_dev-API
The de-facto standard core API for all Inscryption mods. This lets you create new cards, abilities, challenges, map nodes, starter decks, and more.
Preferred version: 2.24.0README
KayceePvP
KayceePvP turns Kaycee's Mod into a two-player experience: each player prepares their deck on a shared map, then both duel head-to-head over a real network connection instead of playing solo against the game's AI.
Public Beta. The core online flow, best-of-three duels, and match-to-match transitions have been tested and work. This stage exists to widen coverage of specific card/sigil interactions with more players and real reports. See Known limitations below, and use F10 in-game (or the link in Support and source) to send feedback.
Installing
- In the Thunderstore Mod Manager (or r2modman), search for KayceePvP and choose Install with dependencies - this pulls in the required BepInEx/API packages automatically.
- Both players must install the exact same KayceePvP version. A version or protocol mismatch is rejected with a clear message before a match starts, rather than starting a broken one.
- Always launch the game through the Mod Manager, not the Steam client directly.
How a match works
- Both players install the same KayceePvP version (see Installing above).
- One player hosts and the other joins:
- Online room (recommended): the host creates a room and gets a one-shot invite code, then sends it directly to the other player through any private channel (chat, DM, voice call) - never post an invite code publicly, treat it like a temporary password. The other player pastes the code to join.
- LAN (advanced / trusted local network only): host by IP/port for two machines on the same local network. There's no authentication on this path, so only use it on a network you trust.
- The host picks a preparation map for the match; both players see the same choice.
- Both players walk their own copy of that map independently - drafting/trading for cards, fighting the map's own preparation encounters, and (in the maps that use it) picking a rare reward and creating a Death Card - then send their finished deck.
- Once both decks are in, the duel begins: each side plays from behind a shared "scale" that tips toward whichever side is winning, using a two-candle life system. Matches are best-of-three.
- After a match, either side can request a rematch without restarting the whole run.
Preparation maps
The host chooses one of these before starting:
| Map | What it is |
|---|---|
| COM BATALHAS | The closest to a normal Kaycee's Mod run: a 3-lane branching map with recurring battles, drafts, and a rare reward + Death Card at the end. |
| SEM BATALHAS | The same 3-lane branching shape, but with zero combat - only drafting/refinement events. |
| FORJA SIMÉTRICA | A single linear path both players walk identically, with two non-final bosses and a rare reward + Death Card at the end. |
| DRAFT DE PELES | A short, linear pelt-trading draft with no combat, no boss, and no Death Card. |
| TRIBE FIGHT | A linear tribe-focused draft ending in a direct rare reward (no boss fight required) and no Death Card. |
| CAMINHO BALANCEADO | A linear route selected from a large simulated search for balance between two mirrored players, ending in a direct rare reward and no Death Card. |
Every preparation map caps itself at one shared test battle at most and never forces a mandatory boss fight - a boss-style encounter, where present, only ever grants a direct rare-card reward. Only the two maps that end in a boss-style flow (COM BATALHAS and FORJA SIMÉTRICA) go through Death Card creation before the duel; every other map hands off straight to the duel after its own ending event.
A seventh mode (DRAFT ABERTO, a full card-pool draft) exists in the code but is hidden from the lobby - its selection screen isn't finished yet, so it isn't offered as an option.
Language
KayceePvP follows whatever language Inscryption itself is set to - English and Brazilian Portuguese are both fully supported (lobby, maps, dialogue, duel HUD, results screen, and every card this mod renames), with English as the fallback for any other language. Switching the game's language option updates KayceePvP's own text immediately, without restarting.
Requirements
- Both players need the exact same KayceePvP build (version and internal protocol are checked before a match can start; a mismatch is rejected with a clear message instead of silently starting a broken match).
- Windows, Inscryption, BepInEx and InscryptionAPI (see dependencies below) on both machines.
- For LAN play: both machines reachable over the same local network. For online play: no router configuration or port forwarding is required - the relay connection uses a one-shot room invite over TLS.
Known limitations
- The public online relay has not yet completed a full two-machine, two-network validation pass; treat online play as still being hardened.
- DRAFT ABERTO is present in the build but intentionally not selectable from the lobby yet.
- KayceePvP does not claim competitive anti-cheat protection against a modified client on the other side of a match.
- Activated abilities (cards with a manually-triggered effect, e.g. dealing damage on demand) are blocked during the PvP duel - they have no network sync yet, so allowing one to fire unsynced would let the two sides' boards disagree. They remain fully usable everywhere else (solo content, if any is reachable outside the duel).
- As a Beta, specific card/sigil interactions may not have been played out yet - please report anything that looks wrong.
Security and privacy
The online connection uses TLS to a relay. Room invites are temporary, one-shot secrets - send an invite directly to the intended opponent and don't post it publicly. The relay forwards game frames and does not arbitrate gameplay. Operational logs are not intended to contain invite tokens, card payloads or deck contents.
Feedback
Press F10 in-game to open the feedback panel (still configurable in the BepInEx Configuration Manager if F10 doesn't suit you). From there:
- ENTER opens the issue tracker's "new issue" page in your browser, where you can report a bug, share a suggestion, or ask a question.
- ESC closes the panel; nothing happens automatically either way.
Nothing is ever collected or sent automatically. The same issue tracker link is under Support and source below.
Logs
If something goes wrong, BepInEx/LogOutput.log in your Mod Manager profile has the details. Remove any invite code or IP address before sharing a log in a bug report. For a bug that only shows up online (desync, disconnect, a card behaving differently for each player), please attach a log from both players if you can.
Troubleshooting
- "Divergência de modo de mapa" / a match refuses to start: both players picked or received different map selections - have the host reselect the map after both are connected.
- A player's build/version is rejected before the duel begins: the two installs are running different KayceePvP versions or protocol revisions - reinstall the same version on both sides.
- The match seems stuck on "AGUARDANDO OPONENTE": the wait is bounded, not infinite - if the peer's connection actually drops, a recoverable error screen replaces the wait instead of a permanent blank screen. If it never resolves, check that both instances are still connected.
Versioning
0.1.0 is the first public Beta. Bug fixes ship as patch versions (0.1.1, 0.1.2, ...) without changing anything players need to redo; both players should always be on the latest version.
Support and source
Source, issues, and contribution guide: https://github.com/Ynastra/act1pvpkayceesmod
Licensed under the MIT License. KayceePvP is an unofficial community mod and is not affiliated with Daniel Mullins Games.
CHANGELOG
Changelog
0.1.6
Public rooms, and a map-mode sync bug the room browser exposed, plus two visual-only fixes with no gameplay change.
- Added: public online rooms. The host can mark a room public when creating it, and any player can browse open public rooms and join one directly (Find Match), with no invite code to share. A room only appears in that list while it is open and waiting for a peer.
- Fixed: a peer joining without ever seeing the host's own map selection (the invite-code flow usually avoided this by coincidence, or players agreed on a map out loud beforehand) could end up mismatched with the host's actual choice, since the host only ever resent its map selection on an explicit change, never on a fresh connection. The host now always sends its current map selection the moment a new peer connects, regardless of whether it changed since the room was created.
- Fixed: Lammergeier's and Stinky Deer's attack number displayed as their old ability icon instead of a plain number (their power has been fixed at 3 since 0.1.5, this was purely visual). Both now show a plain number like any other card.
- Fixed (real root cause, confirmed): the PELES and COBAIAS starter deck icons rendered fully blank on the Ascension deck select screen. Texture2D.LoadImage was decoding these two embedded PNGs as ARGB32 instead of RGBA32, and the icon's SpriteMask shader reads alpha assuming RGBA order, masking the icon out entirely.
- Changed: the feedback link behind F10's ENTER now opens a short web form instead of a GitHub issue page (the source repository is no longer public).
0.1.5
Another real bilateral playtesting round, focused on the duel's shared damage scale never actually reaching its own real threshold - several fixes below only became reachable/visible once the first one landed, since the old bug was hiding them.
- Fixed: a battle could run forever with one side's board completely empty and the other side still attacking, because the shared damage scale's REAL value (not just its on-screen display) was capped at the same limit as vanilla's single-player scale, well short of this duel's own higher win/loss threshold - neither side could ever detect the battle was actually over.
- Fixed: once the fix above let the losing side's scale move correctly, the winning side's own on-screen damage counter still stayed capped at the old limit, understating how far ahead they actually were.
- Fixed: a third, separate spot in the game's own turn-resolution logic had the exact same old cap baked in, and could end a rematch's very first battle after a single turn with nobody having actually lost - only became visible after the two fixes above let the scale move past that old cap for the first time.
- Fixed: the card offers on the Cost/Tribe/Trader nodes of the "Caminho Balanceado" (Balanced Route), Tribe Fight, and Pelt Draft maps were identical every single match - the two sides agreeing on the same offers within one match was intentional, but they were also supposed to change from match to match, which an unrelated fixed value silently prevented since the maps' current layouts were finalized. Same offers within a match, different every match now.
- Fixed: a creature that scales its own power from the local player's own bone count read the WRONG player's bones on the side mirroring its true owner, making it show a completely different (and completely wrong) power for whichever side didn't actually own it.
- Fixed: an internal log line could report a valid, correctly-sized deck on the Balanced Route as "invalid" - a false alarm only, never a real gameplay issue, now compared against the right expected size for that map.
0.1.4
A real two-player playtesting session found and fixed a series of board-desync bugs - several of them permanent (the two sides' boards never resynced on their own once triggered), confirmed against real bilateral logs rather than only local testing.
- Fixed: a creature that materializes for free mid-combat (e.g. CorpseEater reviving an ally the instant another creature of yours dies) could permanently desync the two sides' boards. The automatic play now has its own dedicated network path (no longer requires the turn-ownership window a manual play needs), waits for that combat/TurnEnd cycle to fully settle before being broadcast, and is now correctly excluded from the surrounding turn's own state checksum until it's independently confirmed on both sides - closing several related
STATE HASH MISMATCH/PROTOCOL_DESYNC_FATALreports. - Fixed: Evolve (a creature that transforms into a stronger form after enough turns in play) could evolve for its real owner but never for the opponent watching it, whenever the evolving creature had just entered play automatically (e.g. via CorpseEater) - a permanent, non-self-correcting divergence that could change who actually wins a later fight. The transformation is now always decided by the card's real owner and applied identically on the other side, instead of each side trying to compute it independently.
- Fixed: a creature that hits two lanes at once (e.g. Grizzly with SplitStrike) could push the shared damage scale past its visible limit differently for each player, letting the two sides' scores silently drift apart over several battles.
- Fixed: the Death Card (created after defeating the first boss) was being silently stripped from the deck before it was ever sent to the match, so it never actually appeared in play.
- Fixed: a dropped connection that only one side detected could leave the other side waiting forever with no error shown, and starting a new match afterward could mix leftover state from the dead one into the new one, producing a confusing desync error.
- Fixed: a turn-ownership counter that resets at the start of each best-of-three battle could occasionally lose progress already made if the other side closed a turn quickly enough, causing a spurious "connection error" on turn 2.
- Fixed: false-positive network-timeout desyncs during long or resource-constrained sessions (two full game instances competing for one machine, or a genuinely slow connection) - the relay's partial-frame timeout and the combat/TurnEnd settle window are both more generous now.
- Fixed: the starter deck "PELTS" was shipping with 5 cards (an extra rabbit pelt by mistake) instead of the intended 3.
- Fixed: the shared preparation map could stay visible over the duel board in rare timing cases.
- Removed 4 placeholder joke card renames (Mayonnaise, Stepfather, Blue Pen, Cannabis) left over from an earlier build.
- Replaced the old TVFsStarterDecks-dependent "PELTS" starter deck with a native equivalent - that mod is no longer a KayceePvP dependency (see Known limitations for what this means if it's still enabled on your profile).
- Added: KayceePvP now refuses to let you ready up if any mod outside its own known-safe dependency set is enabled on your profile, after a real report of third-party cards leaking into the shared PvP pool - it tells you exactly which mod to remove.
0.1.3
- Removed the feedback panel's local diagnostics generation entirely (the D option, its ZIP/log capture, and the sanitizer that cleaned it) - the panel now only offers ENTER (open the issue tracker) and ESC (close). 0.1.1 was rejected by Thunderstore's community review (
Invalid submission, no reason given) and 0.1.2's narrower fix (removing just theProcess.Startcall that opened Explorer) was still rejected after re-upload, so this drops the whole file-generation surface rather than guess again at what a moderation heuristic is reacting to. No networking, balance, or protocol changes.
0.1.2
- Fixed: the feedback panel's diagnostics option (D) no longer launches Explorer as an external process to open the diagnostics folder - it now copies the diagnostics file's full path to the clipboard instead, so the player can open it themselves. 0.1.1 was rejected by Thunderstore's community review (
Invalid submission); this was the only new external-process launch introduced in that version and is the most likely cause, though moderators gave no explicit reason. No other behavior changes.
0.1.1
- Replaced the simple "F10 opens the browser" feedback shortcut with a full in-game feedback panel: F10 (still configurable) now opens a modal, bilingual (English/Portuguese) panel instead of immediately opening anything. Inside it, ENTER opens the public issue tracker's "new issue" chooser in the browser, D creates a sanitized diagnostics file and opens its folder, and ESC closes the panel with no side effect if nothing was created. Nothing is ever uploaded automatically, and the panel blocks board/menu input (and the underlying screen's own Escape/Enter/Space handling) while it's open, restoring the exact previous input state on close.
- New local diagnostics file (
BepInEx/KayceePvP/Diagnostics/KayceePvP-diagnostics-<timestamp>-<role>.zip): a smalldiagnostics.txt(mod/assembly/protocol version, a hash of the loaded DLL, language, Host/Peer role, LAN-vs-online with no address or room code, map/mode, match/battle/turn/score, detected BepInEx/InscryptionAPI/dependency versions, and any desync/connection-lost flag) plus a sanitized copy of the localLogOutput.logtail and a short bilingual README - never the save, full config, deck contents, a memory dump, the other process' log, a screenshot, or any DLL/PDB/certificate/key. The log copy has invite/room codes, IPv4/IPv6 addresses, Windows user paths, tokens/passwords/authorization values and similar secrets automatically replaced with clearly-labeled placeholders before it ever touches the ZIP; the player reviews the file before attaching it anywhere. - Fixed a pre-existing hotkey collision: a developer-only debug shortcut (also bound to F10, "start a random duel") could fire on the exact same key press as the feedback shortcut's own default. The debug hotkey now yields automatically whenever the feedback shortcut is actually bound to F10.
- Hiding the creator credit (
ShowCreatorCredit=false) no longer also hides feedback access - the F10 hint is now its own independent line, shown regardless of that setting.
0.1.0
- Initial Thunderstore packaging candidate.
- LAN lobby and synchronized PvP duel flow, plus an online room/relay client and server staging implementation (TLS, one-shot invites, lifecycle deadlines and abuse limits).
- Strict message type/role/sequence validation and bounded network queues.
- Two-candle life system and best-of-three match orchestration, with rematch support and a final result screen.
- Six selectable preparation maps (COM BATALHAS, SEM BATALHAS, FORJA SIMÉTRICA, DRAFT DE PELES, TRIBE FIGHT, CAMINHO BALANCEADO), plus a seventh (DRAFT ABERTO) present in the build but hidden pending a finished selection screen.
- Global preparation-combat rule applied across every map: at most one shared test battle, and no mandatory boss fight - boss-style encounters grant a direct rare-card reward instead. Death Card creation only happens on the two maps that end in a boss-style flow (COM BATALHAS, FORJA SIMÉTRICA); every other map hands off straight to the duel.
- Central forbidden-card filter (Great Kraken and its tentacle transformations, Frozen Opossum, Hrokkall) enforced across every card pool, Trader/pelt offer, and starter deck path, mod-wide.
- Custom map-node icons for battle, campfire, rare reward, Death Card and PvP-exit nodes.
- Several cross-process ownership/sync fixes: Totem effects apply only to their real owner's cards; QuadrupleBones, Tutor, DrawCreatedCard-family abilities and Morsel no longer double-apply or crash when replaying the opponent's mirrored actions.
- Release-hardening pass: a malformed or unrecognized card name arriving over the network is now rejected explicitly (whole deck refused with a clear protocol error, or the duel ends via the same fail-closed screen used for other protocol violations) instead of crashing or silently substituting blank data. A dropped connection mid-duel now fails closed with a recoverable "connection lost" screen instead of one side silently continuing alone. The ready/countdown wait before a duel now has the same disconnect/timeout handling as the deck-exchange wait next to it. Activated abilities (manually-triggered card effects) are blocked during the duel - not yet synced over the network - as a release-scope limitation.
- Fixed: the online relay connection could be silently dropped ("Connection reset by peer") after a long idle stretch (confirmed in a real session, ~27 minutes of both players independently walking their maps) - the relay client now sends a small periodic keep-alive frame while connected, invisible to gameplay, to prevent idle-connection timeouts from network infrastructure between the two players.
- Full English/Brazilian Portuguese localization: the lobby, every preparation map/mode name, dialogue overrides, the duel HUD, the waiting/ready/final/rematch screens, and every card this mod renames now follow whichever language Inscryption itself is set to, with English as the fallback for any other language and immediate text updates on a language switch (no restart needed). A mandatory notice next to the online room controls explains, in the active language, that a room's invite code must be sent directly to the other player.
- In-game feedback: pressing a configurable key (default F10) opens the issue tracker in the browser so players can report a bug or suggestion directly; it only opens a page and never collects, attaches, or sends any data automatically. The same link is documented as a fallback in the Thunderstore README.
- Card sync stability: Ijiraq is removed from every pool (its Shapeshifter disguise never had a network-sync path). Amorphous-style random-ability rolls are replaced with deterministic, PvP-safe abilities on the card templates that support it; the remaining cards that still roll a real RandomAbility (e.g. PackRat's kit) now only roll it once, on its true owner's client - a remote-mirrored replay of the same card no longer rolls its own, independent result.
- Fixed: TurnEnd's trigger now dispatches correctly after a SetupPhase-mirrored combat resolution, and a couple of stale combat-resolution gates plus a leftover release-only debug dialogue are cleaned up.
Online mode remains pre-release until the production relay and two-network runtime validation are complete.