# chudooder/femultiplayer architecture

> Architecture diagram of the GitHub repository chudooder/femultiplayer, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/chudooder/femultiplayer
- Repository: https://github.com/chudooder/femultiplayer

## Overview

FEMultiplayer is an online, turn-based Fire Emblem tactics game. A player connects to a multiplayer session, joins a lobby (including as a spectator), builds or drafts a team, waits for match setup, and issues tactical map commands; attacks lead into combat resolution and then match results. The README also describes custom maps and Rout, rescue-the-flag, and throne-capture objectives. The graph reflects the sampled client, server, and gameplay code; several capability links rely on README documentation because their implementation was not sampled.

Main entry points: [`src/net/fe/overworldStage/ClientOverworldStage.java`](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/ClientOverworldStage.java) (Tactical Map), [`src/net/fe/network/Client.java`](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Client.java) (Network Client), [`src/net/fe/lobbystage/ClientLobbyStage.java`](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/lobbystage/ClientLobbyStage.java) (Lobby), [`src/net/fe/overworldStage/context/AttackPreview.java`](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/context/AttackPreview.java) (Map Actions)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_session["Session and Lobby"]
  node_connection["Connect<br/>[ConnectStage.java]"]
  node_lobby["Lobby"]
  node_chat["Lobby Chat<br/>[LobbyChatBox.java]"]
  node_sessiondata["Session Setup<br/>[Session.java]"]
end

subgraph group_teams["Team Setup"]
  node_team["Team Builder"]
  node_draft["Team Draft"]
  node_pick["Pick Modes<br/>[PickMode.java]"]
  node_wait["Match Setup"]
  node_party["Player Party<br/>[Party.java]"]
end

subgraph group_tactics["Tactical Match"]
  node_map["Tactical Map"]
  node_grid["Map and Terrain<br/>[Grid.java]"]
  node_contexts["Map Actions<br/>[AttackPreview.java]"]
  node_units["Units and Items<br/>[Unit.java]"]
  node_objectives["Objectives<br/>[Objective.java]"]
  node_combat["Combat<br/>[FightStage.java]"]
  node_combatcalc["Combat Rules"]
  node_results["Match Results<br/>[EndGameStage.java]"]
  node_leveleditor["Level Editor"]
end

subgraph group_network["Networking"]
  node_client["Network Client<br/>[Client.java]"]
  node_server["Game Server<br/>[Server.java]"]
  node_messages["Game Messages<br/>[Message.java]"]
end

subgraph group_engine["Game Engine"]
  node_engine["Game Runtime<br/>[Game.java]"]
  node_renderer["Rendering and Audio<br/>[Renderer.java]"]
end

node_player(("Player"))
node_remote(("Other Players"))

node_player -->|"connects"| node_connection
node_connection -->|"connects through"| node_client
node_lobby -->|"sends requests"| node_client
node_lobby -->|"uses"| node_chat
node_lobby -->|"displays setup"| node_sessiondata
node_lobby -->|"starts picking"| node_team
node_team -->|"edits"| node_party
node_draft -->|"uses mode"| node_pick
node_wait -->|"applies party data"| node_party
node_wait -->|"starts match"| node_map
node_map -->|"loads map state"| node_grid
node_map -->|"controls"| node_units
node_map -->|"dispatches actions"| node_contexts
node_contexts -->|"updates"| node_units
node_map -->|"sends commands"| node_client
node_sessiondata -->|"configures objective"| node_objectives
node_contexts -->|"initiates battle"| node_combat
node_combat -->|"calculates combat"| node_combatcalc
node_map -->|"opens on completion"| node_results
node_client -->|"exchanges messages"| node_server
node_client -->|"processes"| node_messages
node_server -->|"broadcasts"| node_messages
node_remote -->|"plays through"| node_server
node_engine -->|"runs stage"| node_map
node_map -->|"renders"| node_renderer
node_leveleditor -.->|"edits map data"| node_grid

click node_connection "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/ConnectStage.java"
click node_lobby "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/lobbystage/ClientLobbyStage.java"
click node_chat "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/lobbystage/LobbyChatBox.java"
click node_sessiondata "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/Session.java"
click node_team "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/builderStage/TeamBuilderStage.java"
click node_draft "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/builderStage/TeamDraftStage.java"
click node_pick "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/pick/PickMode.java"
click node_wait "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/builderStage/ClientWaitStage.java"
click node_party "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/Party.java"
click node_map "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/ClientOverworldStage.java"
click node_grid "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/Grid.java"
click node_contexts "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/context/AttackPreview.java"
click node_units "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/unit/Unit.java"
click node_objectives "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/objective/Objective.java"
click node_combat "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/fightStage/FightStage.java"
click node_combatcalc "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/fightStage/CombatCalculator.java"
click node_results "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/EndGameStage.java"
click node_client "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Client.java"
click node_server "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Server.java"
click node_messages "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Message.java"
click node_engine "https://github.com/chudooder/femultiplayer/blob/master/src/chu/engine/Game.java"
click node_renderer "https://github.com/chudooder/femultiplayer/blob/master/src/chu/engine/anim/Renderer.java"
click node_leveleditor "https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/editor/LevelEditorStage.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_connection,node_lobby,node_chat,node_sessiondata toneBlue
class node_team,node_draft,node_pick,node_wait,node_party toneAmber
class node_map,node_grid,node_contexts,node_units,node_objectives,node_combat,node_combatcalc,node_results,node_leveleditor toneMint
class node_client,node_server,node_messages toneRose
class node_engine,node_renderer,node_player,node_remote toneIndigo
```

## Components

### Session and Lobby

- [Connect](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/ConnectStage.java): `src/net/fe/ConnectStage.java`
- [Lobby](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/lobbystage/ClientLobbyStage.java): `src/net/fe/lobbystage/ClientLobbyStage.java`
- [Lobby Chat](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/lobbystage/LobbyChatBox.java): `src/net/fe/lobbystage/LobbyChatBox.java`
- [Session Setup](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/Session.java): `src/net/fe/Session.java`

### Team Setup

- [Team Builder](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/builderStage/TeamBuilderStage.java): `src/net/fe/builderStage/TeamBuilderStage.java`
- [Team Draft](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/builderStage/TeamDraftStage.java): `src/net/fe/builderStage/TeamDraftStage.java`
- [Pick Modes](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/pick/PickMode.java): `src/net/fe/pick/PickMode.java`
- [Match Setup](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/builderStage/ClientWaitStage.java): `src/net/fe/builderStage/ClientWaitStage.java`
- [Player Party](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/Party.java): `src/net/fe/Party.java`

### Tactical Match

- [Tactical Map](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/ClientOverworldStage.java): `src/net/fe/overworldStage/ClientOverworldStage.java`
- [Map and Terrain](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/Grid.java): `src/net/fe/overworldStage/Grid.java`
- [Map Actions](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/context/AttackPreview.java): `src/net/fe/overworldStage/context/AttackPreview.java`
- [Units and Items](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/unit/Unit.java): `src/net/fe/unit/Unit.java`
- [Objectives](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/objective/Objective.java): `src/net/fe/overworldStage/objective/Objective.java`
- [Combat](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/fightStage/FightStage.java): `src/net/fe/fightStage/FightStage.java`
- [Combat Rules](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/fightStage/CombatCalculator.java): `src/net/fe/fightStage/CombatCalculator.java`
- [Match Results](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/overworldStage/EndGameStage.java): `src/net/fe/overworldStage/EndGameStage.java`
- [Level Editor](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/editor/LevelEditorStage.java): `src/net/fe/editor/LevelEditorStage.java`

### Networking

- [Network Client](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Client.java): `src/net/fe/network/Client.java`
- [Game Server](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Server.java): `src/net/fe/network/Server.java`
- [Game Messages](https://github.com/chudooder/femultiplayer/blob/master/src/net/fe/network/Message.java): `src/net/fe/network/Message.java`

### Game Engine

- [Game Runtime](https://github.com/chudooder/femultiplayer/blob/master/src/chu/engine/Game.java): `src/chu/engine/Game.java`
- [Rendering and Audio](https://github.com/chudooder/femultiplayer/blob/master/src/chu/engine/anim/Renderer.java): `src/chu/engine/anim/Renderer.java`

### Other components

- **Player**
- **Other Players**

## Connections

- Player → Connect: connects
- Connect → Network Client: connects through
- Lobby → Network Client: sends requests
- Lobby → Lobby Chat: uses
- Lobby → Session Setup: displays setup
- Lobby → Team Builder: starts picking
- Team Builder → Player Party: edits
- Team Draft → Pick Modes: uses mode
- Match Setup → Player Party: applies party data
- Match Setup → Tactical Map: starts match
- Tactical Map → Map and Terrain: loads map state
- Tactical Map → Units and Items: controls
- Tactical Map → Map Actions: dispatches actions
- Map Actions → Units and Items: updates
- Tactical Map → Network Client: sends commands
- Session Setup → Objectives: configures objective
- Map Actions → Combat: initiates battle
- Combat → Combat Rules: calculates combat
- Tactical Map → Match Results: opens on completion
- Network Client → Game Server: exchanges messages
- Network Client → Game Messages: processes
- Game Server → Game Messages: broadcasts
- Other Players → Game Server: plays through
- Game Runtime → Tactical Map: runs stage
- Tactical Map → Rendering and Audio: renders
- Level Editor → Map and Terrain: edits map data
