Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1,076 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽฎ Evolution Server

A Yu-Gi-Oh! game server built with TypeScript
Host duels for EDOPro, Koishi, and YGO Mobile โ€” all from one server.

PR Pipeline

Evolution Server runs two independent game engines side by side, so you can support both ecosystems from a single server โ€” or pick just one.

Engine Clients Protocol Port
๐Ÿ–ฅ๏ธ EDOPro EDOPro desktop client EDOPro protocol 7911
๐Ÿ“ฑ YGOPro Koishi, YGO Mobile, YGOPro YGOPro-compatible (srvpro2) 7711

โœจ What can it do?

  • ๐Ÿฐ Room creation through the EDOPro lobby or YGOPro-compatible clients
  • ๐Ÿ”€ Cross-client duels between different platforms (experimental)
  • ๐Ÿ”Œ Automatic reconnection after disconnection or crash
  • ๐Ÿ“Š Match data collection for rankings and analytics
  • ๐Ÿงช Isolated duel cores โ€” each match runs in its own process

๐Ÿš€ Quick Start (Docker)

The fastest way to get running. Three commands and you're dueling:

git clone https://github.com/diangogav/EDOpro-server-ts
cd EDOpro-server-ts
docker compose -f docker-compose.prod.yaml up -d

That's it! ๐ŸŽ‰ Both engines start automatically with PostgreSQL and Valkey included.

๐Ÿ’ก Connect with EDOPro on port 7911 or with Koishi/YGO Mobile on port 7711.


๐Ÿ› ๏ธ Manual Installation

For when you want full control, or Docker isn't an option.

๐Ÿ“‹ Prerequisites

  • Node.js >= 24
  • CMake >= 3.18
  • A C++ compiler (g++ or clang++)
  • jq >= 1.6 โ€” required by scripts/clone_repositories.sh and scripts/setup_resources.sh to read the resource manifest

On Ubuntu/Debian, the provided script installs everything you need:

sudo bash scripts/install_dependencies.sh

๐Ÿ’ก To install jq manually: sudo apt-get install -y jq (Debian/Ubuntu) or brew install jq (macOS).

๐Ÿ“ฆ Step by step

# 1๏ธโƒฃ Clone the project
git clone https://github.com/diangogav/EDOpro-server-ts
cd EDOpro-server-ts

# 2๏ธโƒฃ Clone card scripts, databases, and banlists
bash scripts/clone_repositories.sh

# 3๏ธโƒฃ Organize everything into resources/
bash scripts/setup_resources.sh

# 4๏ธโƒฃ Build the C++ duel core (used by the EDOPro engine)
bash scripts/build_core_integrator.sh

# 5๏ธโƒฃ Install Node.js dependencies
npm install

# 6๏ธโƒฃ Configure environment
cp .env.example .env

๐Ÿ“ scripts/setup_resources.sh assembles each run into resources/releases/<id>/ and points resources/current (a symlink) at it. Everything is read through resources/current/โ€ฆ, so refreshing resources is an atomic symlink swap โ€” no restart needed. In Docker the container runs this refresh loop in the background (see scripts/entrypoint.sh + scripts/resources-updater.sh), so card/banlist updates are picked up live.

Now choose which engine(s) you want to run ๐Ÿ‘‡


๐Ÿ–ฅ๏ธ Running the EDOPro engine only

Players connect using the EDOPro desktop client.

What you need:

  • โœ… The CoreIntegrator binary (built in step 4)
  • โœ… Card databases and scripts from ProjectIgnis
  • โœ… Banlists from ProjectIgnis and/or Evolution

Minimum .env configuration:

HOST_PORT=7911
HTTP_PORT=7922
WEBSOCKET_PORT=4000

Resource structure used:

๐Ÿ“‚ resources/current/edopro/
โ”œโ”€โ”€ ๐Ÿ“œ scripts/            # ProjectIgnis/CardScripts
โ”œโ”€โ”€ ๐Ÿ—„๏ธ databases/          # ProjectIgnis/BabelCDB
โ”œโ”€โ”€ ๐Ÿ“‹ banlists-ignis/     # ProjectIgnis/LFLists
โ””โ”€โ”€ ๐Ÿ“‹ banlists-evolution/ # Evolution community banlists
npm run dev

๐ŸŽฏ Connect with EDOPro to your-server-ip:7911


๐Ÿ“ฑ Running the YGOPro engine only

The YGOPro engine uses srvpro2-compatible protocol. Players connect using Koishi, YGO Mobile, or any YGOPro-compatible client.

What you need:

  • โœ… Card scripts and databases from ygopro-scripts
  • โœ… Ban lists and alternative format resources
  • โœ… resources.manifest.json at repo root (already present โ€” the server derives card paths from it automatically)

Minimum .env configuration:

YGOPRO_PORT=7711
HTTP_PORT=7922
WEBSOCKET_PORT=4000
RESOURCES_DIR=./resources/current

Resource structure used:

๐Ÿ“‚ resources/current/ygopro/
โ”œโ”€โ”€ ๐Ÿ“œ base/                    # Core scripts + lflist + cards.cdb (loaded by all modes)
โ”œโ”€โ”€ ๐ŸŒ formats/ocg/             # OCG-specific banlist
โ”œโ”€โ”€ ๐Ÿƒ formats/<name>/          # Format variants (Edison, HAT, JTP, MD, Tengu, World, Genesys, โ€ฆ)
โ”œโ”€โ”€ ๐Ÿ†• extensions/prereleases/  # Pre-release card databases + scripts (extra folder)
โ””โ”€โ”€ ๐ŸŽจ extensions/custom-cards/  # Custom card art databases (extra folder)

Standard card pool (base + all served formats) is loaded for all rooms. Extended pool (standard + extension dirs) is only available in rooms that use PRE or ART formats. Standard rooms cannot use those cards.

Both pools are derived automatically from resources.manifest.json (runtime.ygopro.standard / .extended). No environment variable is needed or supported for pool membership โ€” the manifest is the sole source.

npm run dev

๐ŸŽฏ Connect with Koishi or YGO Mobile to your-server-ip:7711


๐Ÿ”ฅ Running both engines

Just set both ports in your .env:

HOST_PORT=7911
YGOPRO_PORT=7711
HTTP_PORT=7922
WEBSOCKET_PORT=4000
RESOURCES_DIR=./resources/current
npm run dev

Both engines run in the same process, sharing the HTTP API and WebSocket server. ๐Ÿ’ช


๐Ÿ—‚๏ธ Card Database Architecture

The YGOPro engine maintains two separate card pools in memory:

Pool Loaded from Available to
Standard runtime.ygopro.standard in resources.manifest.json All rooms
Extended standard + runtime.ygopro.extended in resources.manifest.json PRE/ART rooms only

When a player creates a room with a format like PRE, TCGPRE, OCGPRE, TCGART, or OCGART, the server uses the extended card pool for both deck validation and the duel engine. Standard rooms (M, TCG, OT, GOAT, etc.) use only the standard pool โ€” any card not in that pool is rejected as unknown.

Both pools are loaded at startup and refreshed every 10 minutes if the underlying .cdb files change.


โš™๏ธ Environment Variables

Variable Description Default
HOST_PORT EDOPro server port 7911
YGOPRO_PORT YGOPro server port 7711
HTTP_PORT HTTP API port 7922
WEBSOCKET_PORT WebSocket port 4000
RESOURCES_DIR Root of the assembled resource tree (symlink target) ./resources/current
MANIFEST_PATH Path to resources.manifest.json used for pool derivation ./resources.manifest.json
RANK_ENABLED Enable ranking system (requires PostgreSQL) false
POSTGRES_HOST PostgreSQL host localhost
POSTGRES_PORT PostgreSQL port 5432
POSTGRES_DB PostgreSQL database name evolution
POSTGRES_USER PostgreSQL username evolution
POSTGRES_PASSWORD PostgreSQL password (required if ranking enabled)
USE_REDIS Enable Redis/Valkey for session management false
REDIS_URI Redis/Valkey connection URI (required if redis enabled)

๐Ÿ”ฅ Pre-deploy Smoke Check (RFD-008)

Run this manually before deploying to production to confirm the derived pools match the expected baselines (network required):

# 1. Assemble resources (must be done at least once)
bash scripts/clone_repositories.sh && bash scripts/setup_resources.sh

# 2. Start the server (RESOURCES_DIR and MANIFEST_PATH use their defaults)
npm run dev

Watch the startup log for lines like:

Merged standard database from N databases with M cards
Merged extended database from N databases with M cards
Total LFLists loaded: K

These counts should match the pre-change production baseline. Any significant difference (e.g. M cards drops to 0) indicates a pool derivation or container manifest issue.

You can also inspect the derived paths at any time:

node -e "
const { resolvePools } = require('./dist/src/ygopro/ygopro/ResourcePoolResolver');
const { config } = require('./dist/src/config');
const pools = resolvePools({ manifestPath: config.resources.manifestPath, resourcesDir: config.resources.dir, env: process.env, logger: console });
console.log('standard paths:', pools.standard.length);
console.log('extended paths:', pools.extended.length);
pools.standard.forEach(p => console.log(' S', p));
pools.extended.slice(pools.standard.length).forEach(p => console.log(' E', p));
"

๐Ÿ—๏ธ Project Architecture

src/
โ”œโ”€โ”€ ๐Ÿ–ฅ๏ธ edopro/             # EDOPro engine (EDOPro protocol)
โ”œโ”€โ”€ ๐Ÿ“ฑ ygopro/             # YGOPro engine (srvpro2-compatible)
โ”œโ”€โ”€ ๐Ÿค shared/             # Shared domain logic (rooms, decks, cards, clients)
โ”œโ”€โ”€ ๐Ÿ”Œ socket-server/      # TCP socket servers for both engines
โ”œโ”€โ”€ ๐ŸŒ http-server/        # REST API
โ””โ”€โ”€ ๐Ÿ“ก web-socket-server/  # WebSocket server for real-time updates

Both engines share the same room management, player handling, and match lifecycle โ€” but use different protocols, card databases, and deck validation rules.


๐Ÿ™ Acknowledgments


Made with โค๏ธ by the Evolution community

About

Welcome to Evolution Server, a versatile platform for creating Yu-Gi-Oh! matches, fully compatible with EDOPro, Koishi, and YGO Mobile! But this time, we focus on the scalability of the code, allowing for easy implementation of new features related to the data generated during the duels.

Topics

Resources

Code of conduct

Contributing

Stars

25 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages