# GRAVEBRIDE — an online soulbinding RPG (Acts I–II of five) A grimdark soulbinding RPG. Pokémon-style taming and turn-based battles, Diablo-rooted world — and the souls you bind are gothic anime revenants. Nine days ago, the bells of Emberfall began to toll. They have not stopped. You are a Binder of the Covenant of the Last Candle: leash the restless dead, grow your covenant, and carry your vows through the Ashwood and the Weeping Catacombs to the Cathedral of Cinders — where Mother Calvaria is singing something awake. ## Run ``` pip install pygame python main.py ``` ## Controls | Input | Action | |---|---| | **Left click** on the map | Walk there (auto-pathing). Click an NPC, shrine or door to walk up and interact. | | **Left click** in menus/battle | Choose (hover highlights). Click anywhere to skip dialogue. | | **Right click** | Cancel / stop walking | | HUD buttons (bottom right) | Souls · Satchel · Quests · Codex · Menu — progress syncs to the server automatically | | Arrows / WASD | Move / navigate | | **Hold Shift** | Run (also speeds up click-to-walk) | | **Left Alt** / HUD *Ride* | Mount or dismount the Sexton's Mare (once Olt lends you the Bone Whistle) | | **M** / HUD *Map* | Map of the area, exits, shrines, other players | | **T** | Chat (tabs All / Global / Regional / whispers; right-click a name to whisper; `^` cycles visibility) | | Z / Enter / Space | Confirm, interact, talk | | X / Backspace | Cancel | | Esc / Tab | Pause menu | | F11 / drag the window edge | Fullscreen / resize (pixels stay crisp) | ## How it plays - **Quests**: the people of Emberfall (grave-digger, widow, Mother Ashwyn) swear vows with you. Track them under **Quests** in the HUD. - **Soul-embers** drop from every victory and quest. Offer them at a candle-shrine for the **Rite of Summoning**: 10 embers for one soul, 90 for ten. Tiers: **Common 55% · Uncommon 28% · Rare 12% · SR 4% · UR 1%**. An SR-or-better is guaranteed every 10th rite, a UR every 50th. - **Specials** are as strong as UR but appear only in **Event Rites** (15 embers) while their event runs: Night of the Long Candle (Dec 15–Jan 6), Procession of All Souls (Oct 25–Nov 3), the Blood Moon (13th–15th of every month), Maypole Eve, the Last Reaping, Stormtide and the Founding of the Last Candle (Aug 23–30). Force one with `GRAVEBRIDE_EVENT=bloodmoon`. - **Codex of Souls** (Menu → Codex): all 153 revenants, seen and bound. - Your covenant walks six strong; everyone else waits in the **Crypt** (Souls → Crypt) and can be swapped in any time. - **Bind souls**: weaken a wild revenant in the ash-drifts (the pale swirls), then press a **Vow Sigil** on her. Ailments and low HP tighten the vow. - **Types (8)**: Ember, Rime, Iron, Umbral, Sanguine, Storm, Venom, Radiant. The starter triangle: **Ember melts Iron, Iron shatters Rime, Rime snuffs Ember.** - **Ailments**: Burn, Poison, Stun, Chill — they tick, halve stats, steal turns. - **Ascension**: your starter transforms at level 18. - **Candle Shrines** heal your party. The Chandlery in Emberfall sells sigils, salves and Last Candles. - **Record Vows** in the pause menu to save. Falling in battle costs half your silver and returns you to Emberfall's shrine. ## Act I content **153 revenants** across six tiers (Common, Uncommon, Rare, SR, UR, Special), 3 starters, 4 areas, 6 cultist duels, a rival who thinks your leashes are heresy (she'll test them twice), and one Mother Superior who must be stopped before the Second Pyre is lit. Everything you see and hear — sprites, tiles, UI, sound — is generated by code at runtime. Sprites are rasterised at 52x72 (HD) and the world is drawn on a 2x layer with Scale2x-smoothed tiles; text renders at native window resolution. ## Rechnerwechsel / neuer PC Siehe **[docs/WEITERARBEITEN.md](docs/WEITERARBEITEN.md)** — Einrichtung, was nicht im Repo liegt (SSH-Schlüssel!), täglicher Git-Ablauf, Veröffentlichen, offene Punkte. Projektentscheidungen: **[docs/PROJEKT-KONTEXT.md](docs/PROJEKT-KONTEXT.md)**. ## Wo ist was (für den Besitzer) | Thema | Ort | |---|---| | Eigene Bilder / Videos der Kämpferinnen | `assets/species/.png` (Vorlagen mit Namen: `assets/_vorlagen/`, Anleitung `assets/README.txt`) | | Skins (kaufbar für Blut) | Katalog `game/skins.py`; Dateien `assets/skins//.png|mp4` | | Story-Akte | `game/acts.py` (Rahmen, 5 Akte + Lange Wache), Inhalt je Akt: `game/maps.py` (Akt I), `game/act2.py` (Akt II) — neue Akte nach dem Muster von `act2.py` | | Kämpferinnen-Daten (153) | `game/species_data.py` (Tabelle) + `game/species.py` | | Gegenstände / Laden | `game/inventory.py` (Preise `price` = Silber, `crowns` = Blut) | | Aufträge, Tagesschwüre, Beschwörung | `game/quests.py`, `game/daily.py` | | Titel, Zirkel | `game/titles.py` | | Übersetzung Deutsch | `game/i18n_de.py` | | Server (Konten, Spielstände, Chat, Presence, Shop) | `server/app.py`, Regeln in `server/validate.py`, läuft als Docker auf dem VPS | | Website + News | `site/`, `site/news.json` (Status, Beiträge, Roadmap) | | Veröffentlichen (Client + Installer + Website) | `bash tools/publish.sh ` — Installer braucht Inno Setup (`winget install JRSoftware.InnoSetup`) | | Mailversand (Passwort-Reset) | Platzhalter `/docker/gravebride/.env` auf dem VPS ausfüllen (SMTP-Daten), dann `docker compose up -d api`. Bis dahin: Admin-Werkzeuge → „Reset-Code für Spieler“ | | Server neu ausrollen | `scp server/app.py server/game/*.py` nach `/docker/gravebride/server/`, dann `docker compose up -d --build api` | ## Your own art Drop Photoshop exports into `assets/` and they replace the procedural graphics automatically (see `assets/README.txt`): - `assets/species/.png` — a battle sprite (transparent PNG, any size) - `assets/species/_strip8.png` or a folder `assets/species//000.png…` — a looping animation (8 fps; a 1–5 s loop is 8–40 frames) - `assets/species/.gif` — animated GIF (`pip install pillow`) - `assets/tiles/.png` (32x32), `assets/actors/__.png` (24x32) Video files (mp4/webm) are not supported by pygame — export loops as PNG sequences instead. ## Dev ``` python tests_smoke.py # headless data/logic/render test suite ``` ## Accounts, saves & anti-tamper - Sign in with e-mail + password (title screen). One save per account in `saves/`, autosaved on every map change, after every battle, every 60 s and on quit. Passwords are stored only as salted PBKDF2 hashes. - Saves are **sealed** (HMAC): an edited file is refused. Currencies run through a **ledger**; a runtime watchdog reverts memory edits (Cheat Engine style) and flags the account; impossible levels/items are clamped. - `python tools/build_manifest.py` records hashes of the game modules; modified files are reported on the title screen and in `saves/guard.log`. - Honest limit: a client alone cannot *prevent* cheating. The online version keeps the authoritative state on the server (same rules, same ledger); these checks are the server's rules running early. ## Launcher & updates `launcher.py` (the desktop shortcut / `Start Gravebride.bat`) checks `launcher_config.json` -> `update_url` for a `release.json`, downloads only changed files (sha256-verified, atomic), updates itself, then starts the game. Offline or no URL: it simply plays the installed version. Publish an update: ``` python tools/build_release.py 0.2.0 --url https://your-domain/gravebride bash tools/deploy_release.sh 0.2.0 user@your-vps # rsync to /var/www/gravebride ``` nginx config: `tools/nginx-gravebride.conf`. Set the same URL in every player's `launcher_config.json` (ship it inside the installer). On Steam the Steam client handles updates instead; the launcher is for standalone builds.