Read-only second-screen deck tracker for Vampire Crawlers.
Development launch:
npm install
npm run desktopBuild a Windows installer:
npm run build:winThe desktop app auto-detects the default Steam install and save file, starts the local tracker server internally, and opens the UI in an app window.
Generated art and card-cost data are stored in the user's app data folder:
%APPDATA%\VampireCrawlersDeckTracker\generated
The app should not ship extracted Vampire Crawlers PNGs. Each user rebuilds local art from their own installed copy. A small fallback card-cost map ships with the app and can be regenerated from the installed game.
Current art-cache rebuild requirement:
python -m pip install UnityPy pillowFor distributable builds, bundle the extraction helper first so non-technical users do not need Python installed:
python -m pip install pyinstaller UnityPy fmod_toolkit archspec pillow
npm run build-asset-builder
npm run build:winThe current prototype reads the active save file from:
%USERPROFILE%\AppData\LocalLow\Nosebleed Interactive\Vampire Crawlers\Save\SaveProfile0.save
It watches the serialized card piles already written by the game:
HandPileDrawPileDiscardPileComboPile- any other
cardPileIdblocks found in the save
npm startThen open:
http://127.0.0.1:5177
Open the extracted art browser:
http://127.0.0.1:5177/art.html
python tools\extract_art.py --min-size 16
python tools\build_card_map.py
python tools\build_card_cost_map.pyThe extractor writes PNG sprites to public/assets/art and metadata to public/assets/art-manifest.json.
The mapper reads Unity CardConfig and CardGroup objects and writes public/assets/card-map.json.
The cost mapper reads Unity CardConfig mana fields and writes public/assets/card-costs.json.
Manual overrides can still be added to public/assets/card-map.json:
{
"Card_A_1_MagicWand": "assets/art/WandHoly_e2f29fa6df.png"
}A first large-sprite contact sheet is available at:
http://127.0.0.1:5177/assets/contact-sheet-large.png
This first pass does not edit saves, patch game files, inject code, or read process memory. It polls /api/deck every two seconds and refreshes the browser UI.
If the save only updates at room boundaries or after major events, the next step is a BepInEx IL2CPP plugin that hooks the game-side card pile model and exports a small local JSON file or localhost API for this same dashboard.