Files
pirats/README.md
2026-06-09 16:21:48 -07:00

4.4 KiB

Rats with Gats Remote Play (pirats)

A web-based remote play companion app for the tabletop roleplaying game Rats with Gats (where players roleplay as space-faring pirate rats, or "Pi-Rats"). The application manages lobbies, character creation, card mechanics, scene phases, obstacles, challenges, and player voting.

It is built with FastAPI, SQLModel (SQLite database), Jinja2 templates, and HTMX for dynamic, real-time page updates.


Features

  • Game Lobby: Create games and join as players via a unique game ID.
  • Character Creation:
    • Fill out the character profile (appearance, smell, catchphrase).
    • Delegate custom "Like/Hate" relationship questionnaire cards to other crewmates (answering them for each other!).
    • Draft three "Secret Pirate Techniques" which are automatically shuffled and swapped among players.
    • Bind swapped techniques to Face Cards (Jack, Queen, King) for play.
  • Dynamic Card Mechanics:
    • Automated 54-card deck shuffling and card drawing.
    • Automatically matches card suits to thematic obstacles (Clubs for combat, Spades for stealth/cunning, Hearts for social/morale, Diamonds for nautical/athletics).
  • Scene Management:
    • Assign roles (Pi-Rats or "The Deep" narrator).
    • Dynamic challenge creation linking multiple active obstacles.
    • Automatically handles card matching colors/values, automatic success when playing Face Card techniques, and Joker card triggers to discard/replace obstacles.
  • Between-Scenes Voting:
    • Vote on crewmates to rank up.
    • Toggle personal objectives (Get a Gat, Earn a Name, Die like a Pirate).

Installation & Running

This project supports standard Python package tools as well as Nix flakes.

Option 1: Standard Python Installation

Prerequisites

  • Python >= 3.9
  • Virtual environment tool (optional but recommended)

1. Setup Virtual Environment (Optional)

python -m venv .venv
source .venv/bin/activate

2. Install Package

Install the package and its dependencies in editable mode:

pip install -e .

3. Run the App

Launch the FastAPI server using the installed package entrypoint:

pirats --host 0.0.0.0 --port 8000 --reload

Alternatively, run it with uvicorn:

uvicorn pirats.main:app --host 0.0.0.0 --port 8000 --reload

Once running, access the web UI at http://localhost:8000.


Option 2: Using Nix Flakes

If you use the Nix package manager, this repository provides a complete environment.

1. Enter the Development Shell

Includes Python, all runtime dependencies, and testing tools (pytest):

nix develop

2. Run the Application

Run the package directly from the flake:

nix run . -- --host 0.0.0.0 --port 8000

3. Build the Application Package

nix build .

The executable will be located in ./result/bin/pirats.


Deploying as a NixOS Service

The Nix flake exposes a NixOS module that configures the application to run as a systemd service with appropriate sandboxing.

Add this flake to your system configuration and configure the service:

services.pirats = {
  enable = true;
  host = "127.0.0.1";
  port = 8000;
  databasePath = "/var/lib/pirats/rats_with_gats.db";
  openFirewall = false; # Set to true to open ports in the firewall
};

Running Tests

Tests are written using pytest.

Running with Pip

pytest

Running with Nix

nix develop --command pytest

Project Structure

pirats/
├── pyproject.toml         # Python package metadata and dependencies
├── flake.nix              # Nix package, dev shell, and NixOS service module
├── tests/                 # Unit and integration tests
│   └── test_game.py       # Game logic and CRUD database test suites
└── src/
    └── pirats/            # Core Python package
        ├── main.py        # FastAPI routes, HTTP endpoints, CLI entrypoint
        ├── crud.py        # Core database CRUD, game mechanics, and transitions
        ├── models.py      # SQLModel database tables (Game, Player, Obstacle, Challenge, Vote)
        ├── cards.py       # Playing card parser, deck setups, and obstacle definitions
        ├── templates/     # Jinja2 HTML pages and HTMX snippets
        └── static/        # CSS styles and frontend assets