The Godot client is organized around runtime ownership boundaries, not around Godot scene inheritance. Each directory corresponds to a clear area of responsibility — transport, session state, screen flow, actor presentation, or world rendering — so that features can be added to one boundary without entangling others. The only tight coupling that is intentional is betweenDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/TaylorZaneKirk/MMO-Project/llms.txt
Use this file to discover all available pages before exploring further.
GameScreen and its controllers, which are collocated under screens/game/controllers/ precisely because they are scoped to that scene.
Directory layout
| Path | Responsibility |
|---|---|
screens/ | Scene-level UI flows: LoginScreen and GameScreen |
screens/game/controllers/ | Controllers scoped to GameScreen.tscn: HUD, movement, inventory, equipment, NPCs, remote players, context menus, ground items, and tooltips |
screens/game/state/ | game_session_presenter.gd (message routing) and game_state_store.gd (authoritative state ownership) |
network/ | WebSocket transport — session_client.gd |
session/ | Autoloaded client session state — session_state.gd |
actors/ | Reusable actor scenes: PlayerComposite (layered player sprite) and StaticNpc |
world/ | Map-view and movement-boundary scaffolds; intended to become reusable world-presentation code as the prototype matures |
tools/ | Local asset-preparation helpers (Python scripts). Not runtime code. |
assets/ | Extracted game assets (tiles, actor sprites, UI icons). Git-ignored. |
Design rules
GameScreen stays thin
GameScreen is responsible for session wiring and server-response application only. It connects controller signals to WebSocket send calls and routes incoming server messages to the correct controller. It does not interpret clicks or build menus.
All player input — world left-click, world right-click, inventory clicks, and pending interactions such as move-to-pickup — lives exclusively in player_interaction_controller.gd.
Transport flow
Raw WebSocket frames travel through four layers before reaching the render surface:GameStateStore signals. They do not parse raw WebSocket payloads directly.
Context menu ownership
The client owns displaying context-menu actions and reporting the player’s selection. The server owns deciding what an action does. Inventory item menus are built from thecontext_actions array in the authoritative inventory snapshot — the client renders whatever the server describes and never hardcodes action names or effects.
Expanding the client
When adding new interactions — attack, talk, trade, examine, or drop-quantity — add the input orchestration and menu building toplayer_interaction_controller.gd. Emit intent signals from that controller back to GameScreen, which issues the corresponding WebSocket requests. Do not add new input branches directly to game_screen.gd.
If world, actor, or movement behavior starts being reused outside GameScreen, move those pieces into world/ or actors/ rather than growing GameScreen further.
The
assets/ directory is git-ignored. Extracted game assets must be placed
there locally and are never committed to the repository. The client will fail
to render tiles and actors if this directory is empty or missing.