Wownerogue

A browser-based roguelike synchronized with crypto block timing. A run is a race
against the next block: reach the exit before the block lands, or the house wins.
The same codebase runs the solo dungeon, the social Tavern, and operator-selected
PvP and race rulesets, with separate free and paid leaderboards.

Self-hostable under the MIT License. See README.md to run it, docs/ARCHITECTURE.md
for the design, and docs/DEPLOY.md to operate an instance.
This commit is contained in:
jwinterm
2026-07-27 08:23:01 -04:00
commit fad2a695bd
578 changed files with 102281 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
# Match (multiplayer race) mode configuration
# Add these to src/.env and src/.env.example as needed.
# Enable match mode (free race queues and, if configured, paid race economies)
MATCH_ENABLED=false
# Max players per race (2-32)
MATCH_MAX_PLAYERS=4
# Server tick interval in milliseconds (default 250ms = 4 Hz)
MATCH_TICK_MS=250
# Server-selected ruleset. Built-ins: race, last-alive, score-attack, coop-escape.
# Unknown or solo-only values fail closed to race.
MATCH_RULESET_ID=race
# Paid entrant freezes target H+2 and activate only after the target plus one confirmation.
# Production requires explicit safe integers from 2 through 100 for both settings.
MATCH_PAID_ENTROPY_DELAY_BLOCKS=2
MATCH_PAID_ENTROPY_CONFIRMATIONS=2
# Minimum duration in ms before a race can be ended by the next block (default 20s)
MATCH_MIN_DURATION_MS=20000
# Hard ceiling in ms after which a race is force-ended (default 4 minutes)
MATCH_HARD_CEILING_MS=240000
# Cost in credits to enter a prestige-credit race (default 1)
MATCH_CREDITS_COST=1
# Enable crypto race-entry ticket economy (requires a paid instance)
MATCH_CRYPTO_RACE_ENABLED=false
# Independently stop new on-chain payout matches without affecting accepted liabilities.
MATCH_PAYOUTS_ENABLED=false
# Required outer winner-payout cap (atomic units) when crypto payouts are enabled.
MATCH_PAYOUT_MAX=50000000000
# Explicit crypto economics (required for production preflight when enabled).
MATCH_ENTRY_FEE_ATOMIC=5000000000
MATCH_HOUSE_FEE_PERCENT=5
# Also add a separately priced funded ticket product to COSMETIC_PRODUCTS. Its per-ticket
# backing must equal MATCH_ENTRY_FEE_ATOMIC and its price must cover the full grant.
# COSMETIC_PRODUCTS='[{"id":"race_2","label":"Two race entries","price":"10000000000","grants":{"race_entries":2,"race_entry_value_atomic":"5000000000"}}]'