# joshua-z-luo/cmpt362_project_manhunt architecture

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

- Interactive diagram: https://gitdiagram.com/joshua-z-luo/cmpt362_project_manhunt
- Repository: https://github.com/joshua-z-luo/cmpt362_project_manhunt

## Overview

Manhunt is an Android location-based multiplayer tag game. Players create or join a room, the host configures rules and starts play, and the app assigns roles and synchronizes a countdown before showing role-specific live maps. A match ends when runners are caught or time expires. The README documents the backend and Maps integrations; file names indicate profile and statistics features, but their implementation and wiring were not sampled, so those links are omitted where uncertain.

Main entry points: [`app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnergameActivity.kt`](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnergameActivity.kt) (Runner Game), [`app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HuntergameActivity.kt`](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HuntergameActivity.kt) (Hunter Game), [`app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SyncService.kt`](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SyncService.kt) (Room Sync), [`app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CountdownActivity.kt`](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CountdownActivity.kt) (Countdown)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["App and Lobby"]
  node_main["App Entry<br/>[MainActivity.kt]"]
  node_home["Lobby<br/>[HomeActivity.kt]"]
  node_settings["Game Settings"]
end

subgraph group_match["Match Gameplay"]
  node_sync["Room Sync<br/>[SyncService.kt]"]
  node_countdown["Countdown"]
  node_hunter["Hunter Game"]
  node_runner["Runner Game"]
  node_huntermodel["Hunter State<br/>[HunterViewModel.kt]"]
  node_runnermodel["Runner State<br/>[RunnerViewModel.kt]"]
  node_caught["Caught Screen<br/>[CaughtActivity.kt]"]
  node_end["Match Result<br/>[GameEndActivity.kt]"]
  node_models["Game Models"]
end

subgraph group_account["Player Records"]
  node_profile["Player Profile<br/>[ProfileActivity.kt]"]
  node_profilevm["Profile State"]
  node_history["Match History"]
  node_stats["Player Stats"]
  node_repository["Stats Repository<br/>[StatsRepository.kt]"]
  node_dao["Stats Access<br/>[StatsDao.kt]"]
  node_database[("Local Database<br/>[AppDatabase.kt]")]
end

subgraph group_platform["External Services"]
  node_backend["Rooms Backend"]
  node_maps["Google Maps"]
  node_gps["Device GPS"]
end

node_player(("Player"))

node_player -->|"opens app"| node_main
node_main -->|"opens lobby"| node_home
node_player -->|"creates or joins"| node_home
node_home -->|"room actions"| node_sync
node_sync -.->|"syncs room"| node_backend
node_player -->|"configures rules"| node_settings
node_settings -->|"updates settings"| node_sync
node_home -->|"starts match"| node_countdown
node_countdown -->|"coordinates start"| node_sync
node_countdown -->|"routes hunter"| node_hunter
node_countdown -->|"routes runners"| node_runner
node_hunter -->|"updates state"| node_huntermodel
node_runner -->|"updates state"| node_runnermodel
node_hunter -->|"uses game rules"| node_models
node_runner -->|"uses game rules"| node_models
node_hunter -->|"reads location"| node_gps
node_runner -->|"reads location"| node_gps
node_hunter -.->|"shows live map"| node_maps
node_runner -.->|"shows live map"| node_maps
node_runner -->|"reports caught"| node_caught
node_caught -->|"updates match"| node_sync
node_hunter -->|"finishes match"| node_end
node_runner -->|"finishes match"| node_end
node_player -->|"opens profile"| node_profile
node_profile -->|"loads profile"| node_profilevm
node_profilevm -->|"requests statistics"| node_repository
node_repository -->|"queries records"| node_dao
node_dao -->|"reads and writes"| node_database
node_database -->|"stores history"| node_history
node_database -->|"stores stats"| node_stats

click node_main "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/MainActivity.kt"
click node_home "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HomeActivity.kt"
click node_settings "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SettingsActivity.kt"
click node_sync "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SyncService.kt"
click node_countdown "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CountdownActivity.kt"
click node_hunter "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HuntergameActivity.kt"
click node_runner "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnergameActivity.kt"
click node_huntermodel "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HunterViewModel.kt"
click node_runnermodel "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnerViewModel.kt"
click node_caught "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CaughtActivity.kt"
click node_end "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/GameEndActivity.kt"
click node_models "https://github.com/joshua-z-luo/cmpt362_project_manhunt/tree/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/model"
click node_profile "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/ProfileActivity.kt"
click node_profilevm "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/ProfileViewModel.kt"
click node_history "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/GameHistoryEntity.kt"
click node_stats "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/PlayerStatsEntity.kt"
click node_repository "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/StatsRepository.kt"
click node_dao "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/StatsDao.kt"
click node_database "https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/AppDatabase.kt"

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_main,node_home,node_settings toneBlue
class node_sync,node_countdown,node_hunter,node_runner,node_huntermodel,node_runnermodel,node_caught,node_end,node_models toneAmber
class node_profile,node_profilevm,node_history,node_stats,node_repository,node_dao,node_database toneMint
class node_backend,node_maps,node_gps toneRose
class node_player toneIndigo
```

## Components

### App and Lobby

- [App Entry](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/MainActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/MainActivity.kt`
- [Lobby](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HomeActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HomeActivity.kt`
- [Game Settings](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SettingsActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SettingsActivity.kt`

### Match Gameplay

- [Room Sync](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SyncService.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/SyncService.kt`
- [Countdown](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CountdownActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CountdownActivity.kt`
- [Hunter Game](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HuntergameActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HuntergameActivity.kt`
- [Runner Game](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnergameActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnergameActivity.kt`
- [Hunter State](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HunterViewModel.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/HunterViewModel.kt`
- [Runner State](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnerViewModel.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/RunnerViewModel.kt`
- [Caught Screen](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CaughtActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/CaughtActivity.kt`
- [Match Result](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/GameEndActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/GameEndActivity.kt`
- [Game Models](https://github.com/joshua-z-luo/cmpt362_project_manhunt/tree/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/model): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/model`

### Player Records

- [Player Profile](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/ProfileActivity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/ProfileActivity.kt`
- [Profile State](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/ProfileViewModel.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/ProfileViewModel.kt`
- [Match History](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/GameHistoryEntity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/GameHistoryEntity.kt`
- [Player Stats](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/PlayerStatsEntity.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/PlayerStatsEntity.kt`
- [Stats Repository](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/StatsRepository.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/StatsRepository.kt`
- [Stats Access](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/StatsDao.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/StatsDao.kt`
- [Local Database](https://github.com/joshua-z-luo/cmpt362_project_manhunt/blob/master/app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/AppDatabase.kt): `app/src/main/java/joshua_luo/example/cmpt362projectmanhunt/AppDatabase.kt`

### External Services

- **Rooms Backend**
- **Google Maps**
- **Device GPS**

### Other components

- **Player**

## Connections

- Player → App Entry: opens app
- App Entry → Lobby: opens lobby
- Player → Lobby: creates or joins
- Lobby → Room Sync: room actions
- Room Sync → Rooms Backend: syncs room
- Player → Game Settings: configures rules
- Game Settings → Room Sync: updates settings
- Lobby → Countdown: starts match
- Countdown → Room Sync: coordinates start
- Countdown → Hunter Game: routes hunter
- Countdown → Runner Game: routes runners
- Hunter Game → Hunter State: updates state
- Runner Game → Runner State: updates state
- Hunter Game → Game Models: uses game rules
- Runner Game → Game Models: uses game rules
- Hunter Game → Device GPS: reads location
- Runner Game → Device GPS: reads location
- Hunter Game → Google Maps: shows live map
- Runner Game → Google Maps: shows live map
- Runner Game → Caught Screen: reports caught
- Caught Screen → Room Sync: updates match
- Hunter Game → Match Result: finishes match
- Runner Game → Match Result: finishes match
- Player → Player Profile: opens profile
- Player Profile → Profile State: loads profile
- Profile State → Stats Repository: requests statistics
- Stats Repository → Stats Access: queries records
- Stats Access → Local Database: reads and writes
- Local Database → Match History: stores history
- Local Database → Player Stats: stores stats
