pokemon-showdown/ARCHITECTURE.md
Guangcong Luo 453530d4d1
Some checks are pending
Node.js CI / build (16.x) (push) Waiting to run
Improve ARCHITECTURE.md more
There was some old poorly-phrased text in the loginserver section.
2024-11-05 00:10:39 +09:00

57 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Pokemon Showdown architecture
=============================
At the highest level, PS is split into three parts:
- Game server (**[smogon/pokemon-showdown](https://github.com/smogon/pokemon-showdown)**)
- Client (**[smogon/pokemon-showdown-client](https://github.com/smogon/pokemon-showdown-client)**)
- Login server (**[smogon/pokemon-showdown-loginserver](https://github.com/smogon/pokemon-showdown-loginserver)**)
All three communicate directly with each other.
A user starts by visiting `https://play.pokemonshowdown.com/`. This is handled by an Apache server (in the Client), which serves mostly static files but uses some PHP (legacy, intended to be migrated to Loginserver).
The user's web browser (running Client code) will then communicate with the Login server (mounted at `https://play.pokemonshowdown.com/api/` to handle logins mostly, or otherwise interface with the Client databases one way or another).
The user's web browser will also connect to the Game server, through SockJS. The Game server handles the chat rooms, matchmaking, and actual battle simulation.
The Game server also communicates with the Login server, to handle replay uploads (and, for the main server, ladder updates).
Game server
-----------
The game server is written in TypeScript and runs on Node.js.
Its entry point is [server/index.ts](./server/index.ts), which launches several major components:
- [server/sockets.ts](./server/sockets.ts) sets up a SockJS (abstracted WebSocket) server to accept connections from clients
- [server/users.ts](./server/users.ts) sets up `Users`, which wraps the SockJS connections in a system that handles users
- [server/rooms.ts](./server/rooms.ts) sets up `Rooms`, which handles the individual chat rooms and battle rooms
- [server/chat.ts](./server/chat.ts) sets up `Chat`, which handles chat commands and messages coming in from users (all client-to-server commands are routed through there)
`Rooms` also includes support for battle rooms, which is where the server connects to the game simulator itself. Game simulation code is in [sim/](./sim/).
Client
------
The client is built in a mix of TypeScript and JavaScript, with a mostly hand-rolled framework built on Backbone. Theres a rewrite to migrate it to Preact but its very stalled.
Its entry point is [index.template.html](https://github.com/smogon/pokemon-showdown-client/blob/master/play.pokemonshowdown.com/index.template.html)
It was written long ago, so instead of a single JS entry point, it includes a lot of JS files. Everything important is launched from [js/client.js](https://github.com/smogon/pokemon-showdown-client/blob/master/play.pokemonshowdown.com/js/client.js)
Login server
------------
The clients login server, which handles logins and most database interaction, is written in TypeScript. The backend is currently split between a MySQL InnoDB database (for users, ladder, and most other things) and a Postgres (technically Cockroach) database (for Replays).
Its entry point is [server.ts](https://github.com/smogon/pokemon-showdown-loginserver/blob/master/src/server.ts).
It's intended to replace all of the old PHP code in the Client, but that migration is only halfway done at the moment.