# jettcodey/mapupgrade architecture

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

- Interactive diagram: https://gitdiagram.com/jettcodey/mapupgrade
- Repository: https://github.com/jettcodey/mapupgrade

## Overview

Map Upgrade is a multiplayer game mod that gates the map behind purchasable upgrades and expands its range with each upgrade; it also adds scroll-wheel minimap zoom. The runtime flow is plugin initialization and upgrade registration, player upgrade activation and synchronization, then per-player map enablement and sizing. The README documents these capabilities, while the source excerpts show configuration, registration, map behavior, and networking. The asset bundle and game APIs are external to the listed source tree.

Main entry points: [`MapUpgrade/Upgrader.cs`](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Upgrader.cs) (Map upgrade item), [`MapUpgrade/Plugin.cs`](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs) (Upgrade registration), [`MapUpgrade/MapToolChanges.cs`](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/MapToolChanges.cs) (Map controls and zoom), [`MapUpgrade/Utils.cs`](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Utils.cs) (Shared utilities)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_bootstrap["Plugin setup"]
  node_plugin["Plugin runtime<br/>[Plugin.cs]"]
  node_identity["Plugin identity<br/>[MyPluginInfo.cs]"]
  node_config["Mod configuration<br/>[Plugin.cs]"]
  node_upgrade_registration["Upgrade registration<br/>[Plugin.cs]"]
end

subgraph group_upgrade["Upgrade lifecycle"]
  node_upgrade_item["Map upgrade item<br/>[Upgrader.cs]"]
  node_upgrade_state[("Upgrade statistics<br/>[Upgrader.cs]")]
end

subgraph group_map["Map controls"]
  node_map_update["Player map updates<br/>[Plugin.cs]"]
  node_map_controls["Map controls and zoom<br/>[MapToolChanges.cs]"]
end

subgraph group_internal["Shared utilities"]
  node_utilities["Shared utilities<br/>[Utils.cs]"]
end

node_player(("Player"))
node_game["Game runtime"]
node_rep_lib["REPOLib"]
node_asset_bundle["Upgrade asset bundle"]
node_multiplayer["Photon multiplayer"]

node_plugin -->|"reads identity"| node_identity
node_plugin -->|"binds settings"| node_config
node_plugin -->|"loads and registers"| node_upgrade_registration
node_upgrade_registration -->|"loads assets"| node_asset_bundle
node_upgrade_registration -->|"registers upgrade"| node_rep_lib
node_upgrade_registration -->|"attaches upgrader"| node_upgrade_item
node_upgrade_registration -->|"registers callback"| node_map_update
node_player -->|"activates"| node_upgrade_item
node_upgrade_item -->|"updates stats"| node_upgrade_state
node_upgrade_item -->|"requests and syncs"| node_multiplayer
node_upgrade_item -->|"triggers refresh"| node_map_update
node_plugin -->|"initializes patches"| node_map_controls
node_map_update -->|"reads upgrade count"| node_upgrade_state
node_map_update -->|"sets enabled and zoom"| node_map_controls
node_map_controls -->|"patches player; reads input"| node_game
node_map_controls -->|"traverses map objects"| node_utilities
node_upgrade_item -->|"checks host role"| node_utilities
node_player -.->|"uses minimap"| node_map_controls

click node_plugin "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs"
click node_identity "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/MyPluginInfo.cs"
click node_config "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs"
click node_upgrade_registration "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs"
click node_upgrade_item "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Upgrader.cs"
click node_upgrade_state "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Upgrader.cs"
click node_map_update "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs"
click node_map_controls "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/MapToolChanges.cs"
click node_utilities "https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Utils.cs"

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_plugin,node_identity,node_config,node_upgrade_registration toneBlue
class node_upgrade_item,node_upgrade_state toneAmber
class node_map_update,node_map_controls toneMint
class node_utilities toneRose
class node_player,node_game,node_rep_lib,node_asset_bundle,node_multiplayer toneIndigo
```

## Components

### Plugin setup

- [Plugin runtime](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs): `MapUpgrade/Plugin.cs`
- [Plugin identity](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/MyPluginInfo.cs): `MapUpgrade/MyPluginInfo.cs`
- [Mod configuration](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs): `MapUpgrade/Plugin.cs`
- [Upgrade registration](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs): `MapUpgrade/Plugin.cs`

### Upgrade lifecycle

- [Map upgrade item](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Upgrader.cs): `MapUpgrade/Upgrader.cs`
- [Upgrade statistics](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Upgrader.cs): `MapUpgrade/Upgrader.cs`

### Map controls

- [Player map updates](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Plugin.cs): `MapUpgrade/Plugin.cs`
- [Map controls and zoom](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/MapToolChanges.cs): `MapUpgrade/MapToolChanges.cs`

### Shared utilities

- [Shared utilities](https://github.com/jettcodey/mapupgrade/blob/master/MapUpgrade/Utils.cs): `MapUpgrade/Utils.cs`

### Other components

- **Player**
- **Game runtime**
- **REPOLib**
- **Upgrade asset bundle**
- **Photon multiplayer**

## Connections

- Plugin runtime → Plugin identity: reads identity (evidence: `MapUpgrade/Plugin.cs`)
- Plugin runtime → Mod configuration: binds settings (evidence: `MapUpgrade/Plugin.cs`)
- Plugin runtime → Upgrade registration: loads and registers (evidence: `MapUpgrade/Plugin.cs`)
- Upgrade registration → Upgrade asset bundle: loads assets (evidence: `MapUpgrade/Plugin.cs`)
- Upgrade registration → REPOLib: registers upgrade (evidence: `MapUpgrade/Plugin.cs`)
- Upgrade registration → Map upgrade item: attaches upgrader (evidence: `MapUpgrade/Plugin.cs`)
- Upgrade registration → Player map updates: registers callback (evidence: `MapUpgrade/Plugin.cs`)
- Player → Map upgrade item: activates (evidence: `MapUpgrade/Upgrader.cs`)
- Map upgrade item → Upgrade statistics: updates stats (evidence: `MapUpgrade/Upgrader.cs`)
- Map upgrade item → Photon multiplayer: requests and syncs (evidence: `MapUpgrade/Upgrader.cs`)
- Map upgrade item → Player map updates: triggers refresh (evidence: `MapUpgrade/Upgrader.cs`)
- Plugin runtime → Map controls and zoom: initializes patches (evidence: `MapUpgrade/Plugin.cs`)
- Player map updates → Upgrade statistics: reads upgrade count (evidence: `MapUpgrade/Plugin.cs`)
- Player map updates → Map controls and zoom: sets enabled and zoom (evidence: `MapUpgrade/Plugin.cs`)
- Map controls and zoom → Game runtime: patches player; reads input (evidence: `MapUpgrade/MapToolChanges.cs`)
- Map controls and zoom → Shared utilities: traverses map objects (evidence: `MapUpgrade/MapToolChanges.cs`)
- Map upgrade item → Shared utilities: checks host role (evidence: `MapUpgrade/Upgrader.cs`)
- Player → Map controls and zoom: uses minimap (evidence: `README.md`)
