# lucaspef/pangya-mulligan architecture

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

- Interactive diagram: https://gitdiagram.com/lucaspef/pangya-mulligan
- Repository: https://github.com/lucaspef/pangya-mulligan

## Overview

PangYa Mulligan is a fan-maintained golf game rebuilt as a C++ client and C# server. The principal user flow is playing through the client, which connects to server-hosted login and game services; the server handles multiplayer rooms and player state. Supporting branches include course editing and caddie/model editing tools. The sampled files show room dispatch and management, but not the full login, gameplay, persistence, or client startup paths, so those links are limited to documented or directly referenced relationships.

Main entry points: [`server/src/Pangya.Server/Program.cs`](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Server/Program.cs) (Server host), [`server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs`](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs) (Room handler), [`client/src/projectg`](https://github.com/lucaspef/pangya-mulligan/tree/main/client/src/projectg) (PangYa client), [`server/src/Pangya.Domain/Players/Player.cs`](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Players/Player.cs) (Player state)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Game client"]
  node_game_client["PangYa client"]
  node_item_storage["Item storage<br/>[itemstorage.cpp]"]
  node_trajectory_preview["Shot preview control"]
  node_shot_preview["Shot preview actor"]
end

subgraph group_server["Game server"]
  node_server_host["Server host<br/>[Program.cs]"]
  node_login_protocol["Login protocol<br/>[Login]"]
  node_game_protocol["Game protocol<br/>[Game]"]
  node_messenger_protocol["Messenger protocol<br/>[Messenger]"]
  node_room_handler["Room handler"]
end

subgraph group_domain["Game services"]
  node_player_service["Player service<br/>[PlayerService.cs]"]
  node_player_state["Player state<br/>[Player.cs]"]
  node_room_manager["Room manager<br/>[RoomManager.cs]"]
  node_room_state["Room state<br/>[Room.cs]"]
  node_guild_repository[("Guild repository<br/>[GuildRepository.cs]")]
end

subgraph group_tools["Creation tools"]
  node_fairwayed["FairwayED<br/>[main.cpp]"]
  node_caddierig["CaddieRig<br/>[main.cpp]"]
end

node_player(("Player"))
node_course_files["Course files"]
node_puppet_files["Puppet files"]

node_player -->|"plays through"| node_game_client
node_game_client -.->|"connects to"| node_server_host
node_server_host -->|"starts services"| node_login_protocol
node_server_host -->|"starts services"| node_game_protocol
node_server_host -->|"starts services"| node_messenger_protocol
node_server_host -->|"configures"| node_player_service
node_game_protocol -.->|"dispatches to"| node_room_handler
node_room_handler -->|"joins rooms"| node_room_manager
node_room_manager -->|"creates and updates"| node_room_state
node_room_handler -->|"uses player"| node_player_state
node_player_service -.->|"loads player"| node_player_state
node_guild_repository -.->|"references guild data"| node_player_state
node_item_storage -->|"serves inventory UI"| node_game_client
node_trajectory_preview -->|"sends preview messages"| node_shot_preview
node_fairwayed -->|"edits and exports"| node_course_files
node_caddierig -.->|"edits puppets"| node_puppet_files

click node_game_client "https://github.com/lucaspef/pangya-mulligan/tree/main/client/src/projectg"
click node_item_storage "https://github.com/lucaspef/pangya-mulligan/blob/main/client/src/projectg/itemstorage.cpp"
click node_trajectory_preview "https://github.com/lucaspef/pangya-mulligan/blob/main/client/src/projectg/jp/trajectorypreviewcontroller.cpp"
click node_shot_preview "https://github.com/lucaspef/pangya-mulligan/tree/main/client/src/projectg"
click node_server_host "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Server/Program.cs"
click node_login_protocol "https://github.com/lucaspef/pangya-mulligan/tree/main/server/src/Pangya.Protocol.JP983/Login"
click node_game_protocol "https://github.com/lucaspef/pangya-mulligan/tree/main/server/src/Pangya.Protocol.KR645/Game"
click node_messenger_protocol "https://github.com/lucaspef/pangya-mulligan/tree/main/server/src/Pangya.Protocol.KR645/Messenger"
click node_player_service "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Players/PlayerService.cs"
click node_player_state "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Players/Player.cs"
click node_room_handler "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs"
click node_room_manager "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Rooms/RoomManager.cs"
click node_room_state "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Rooms/Room.cs"
click node_guild_repository "https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Data/GuildRepository.cs"
click node_fairwayed "https://github.com/lucaspef/pangya-mulligan/blob/main/tools/fairwayed/src/main.cpp"
click node_caddierig "https://github.com/lucaspef/pangya-mulligan/blob/main/tools/caddierig/src/main.cpp"

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_game_client,node_item_storage,node_trajectory_preview,node_shot_preview toneBlue
class node_server_host,node_login_protocol,node_game_protocol,node_messenger_protocol,node_room_handler toneAmber
class node_player_service,node_player_state,node_room_manager,node_room_state,node_guild_repository toneMint
class node_fairwayed,node_caddierig toneRose
class node_player,node_course_files,node_puppet_files toneIndigo
```

## Components

### Game client

- [PangYa client](https://github.com/lucaspef/pangya-mulligan/tree/main/client/src/projectg): `client/src/projectg`
- [Item storage](https://github.com/lucaspef/pangya-mulligan/blob/main/client/src/projectg/itemstorage.cpp): `client/src/projectg/itemstorage.cpp`
- [Shot preview control](https://github.com/lucaspef/pangya-mulligan/blob/main/client/src/projectg/jp/trajectorypreviewcontroller.cpp): `client/src/projectg/jp/trajectorypreviewcontroller.cpp`
- [Shot preview actor](https://github.com/lucaspef/pangya-mulligan/tree/main/client/src/projectg): `client/src/projectg`

### Game server

- [Server host](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Server/Program.cs): `server/src/Pangya.Server/Program.cs`
- [Login protocol](https://github.com/lucaspef/pangya-mulligan/tree/main/server/src/Pangya.Protocol.JP983/Login): `server/src/Pangya.Protocol.JP983/Login`
- [Game protocol](https://github.com/lucaspef/pangya-mulligan/tree/main/server/src/Pangya.Protocol.KR645/Game): `server/src/Pangya.Protocol.KR645/Game`
- [Messenger protocol](https://github.com/lucaspef/pangya-mulligan/tree/main/server/src/Pangya.Protocol.KR645/Messenger): `server/src/Pangya.Protocol.KR645/Messenger`
- [Room handler](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs): `server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs`

### Game services

- [Player service](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Players/PlayerService.cs): `server/src/Pangya.Domain/Players/PlayerService.cs`
- [Player state](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Players/Player.cs): `server/src/Pangya.Domain/Players/Player.cs`
- [Room manager](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Rooms/RoomManager.cs): `server/src/Pangya.Domain/Rooms/RoomManager.cs`
- [Room state](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Domain/Rooms/Room.cs): `server/src/Pangya.Domain/Rooms/Room.cs`
- [Guild repository](https://github.com/lucaspef/pangya-mulligan/blob/main/server/src/Pangya.Data/GuildRepository.cs): `server/src/Pangya.Data/GuildRepository.cs`

### Creation tools

- [FairwayED](https://github.com/lucaspef/pangya-mulligan/blob/main/tools/fairwayed/src/main.cpp): `tools/fairwayed/src/main.cpp`
- [CaddieRig](https://github.com/lucaspef/pangya-mulligan/blob/main/tools/caddierig/src/main.cpp): `tools/caddierig/src/main.cpp`

### Other components

- **Player**
- **Course files**
- **Puppet files**

## Connections

- Player → PangYa client: plays through (evidence: `README.md`)
- PangYa client → Server host: connects to
- Server host → Login protocol: starts services (evidence: `server/src/Pangya.Server/Program.cs`)
- Server host → Game protocol: starts services (evidence: `server/src/Pangya.Server/Program.cs`)
- Server host → Messenger protocol: starts services (evidence: `server/src/Pangya.Server/Program.cs`)
- Server host → Player service: configures (evidence: `server/src/Pangya.Server/Program.cs`)
- Game protocol → Room handler: dispatches to (evidence: `server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs`)
- Room handler → Room manager: joins rooms (evidence: `server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs`)
- Room manager → Room state: creates and updates (evidence: `server/src/Pangya.Domain/Rooms/RoomManager.cs`)
- Room handler → Player state: uses player (evidence: `server/src/Pangya.Protocol.KR645/Game/GameHandler.Room.cs`)
- Player service → Player state: loads player
- Guild repository → Player state: references guild data
- Item storage → PangYa client: serves inventory UI (evidence: `client/src/projectg/itemstorage.cpp`)
- Shot preview control → Shot preview actor: sends preview messages (evidence: `client/src/projectg/jp/trajectorypreviewcontroller.cpp`)
- FairwayED → Course files: edits and exports (evidence: `tools/fairwayed/src/main.cpp`)
- CaddieRig → Puppet files: edits puppets
