# rurouni88/pc3-d20-devlife architecture

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

- Interactive diagram: https://gitdiagram.com/rurouni88/pc3-d20-devlife
- Repository: https://github.com/rurouni88/pc3-d20-devlife

## Overview

d20().devLife is a browser roguelike about surviving a software-engineering career. The player configures a character and difficulty, then resolves randomized career events through stat checks and choices; the engine updates the run, presents level-ups and outcomes, and supports continuing or starting another run. Content and progression systems supply archetypes, events, items, perks, and achievements, while save and meta stores preserve run and cross-run state. The graph follows documented imports and composition; unsampled UI and storage details are represented only where the index or README supports them.

Main entry points: [`src/js/engine/game.ts`](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/game.ts) (Run engine), [`src/js/ui/ui.ts`](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui.ts) (UI composition), [`src/js/engine/meta.ts`](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/meta.ts) (Career meta store), [`src/js/app.ts`](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/app.ts) (Application entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_play["Play flow"]
  node_app["Application entry<br/>[app.ts]"]
end

subgraph group_rules["Game rules"]
  node_game["Run engine<br/>[game.ts]"]
  node_special["SPECIAL stats<br/>[special.ts]"]
  node_perks["Perk system<br/>[perks.ts]"]
  node_config["Game configuration<br/>[config.ts]"]
  node_rng["Seeded random<br/>[seeded-rng.ts]"]
  node_utils["Dice and utilities<br/>[utils.ts]"]
end

subgraph group_content["Game content"]
  node_archetypes["Character archetypes<br/>[archetypes.ts]"]
  node_events["Career events"]
  node_eventdata["Event selection<br/>[events.ts]"]
  node_items["Equipment and consumables<br/>[items.ts]"]
  node_achievements["Achievements<br/>[achievements.ts]"]
end

subgraph group_state["Progress and state"]
  node_save["Run save system<br/>[save.ts]"]
  node_meta["Career meta store<br/>[meta.ts]"]
  node_localstorage[("Browser local storage")]
end

subgraph group_presentation["Player interface"]
  node_ui["UI composition<br/>[ui.ts]"]
  node_uicore["Screens and shared UI<br/>[ui-core.ts]"]
  node_characterui["Character creation<br/>[ui-character.ts]"]
  node_eventui["Event choices<br/>[ui-event.ts]"]
  node_diceui["Dice display<br/>[ui-dice.ts]"]
  node_levelui["Level-up screen<br/>[ui-levelup.ts]"]
  node_endui["Run-end screen<br/>[ui-endofrun.ts]"]
  node_settingsui["Settings screen<br/>[ui-settings.ts]"]
  node_achievementui["Achievement screen<br/>[ui-achievements.ts]"]
  node_leaderboardui["Leaderboard screen<br/>[ui-leaderboard.ts]"]
  node_statisticsui["Statistics screen<br/>[ui-statistics.ts]"]
end

node_player(("Player"))

node_player -->|"starts play"| node_app
node_app -->|"controls run"| node_game
node_app -->|"uses career state"| node_meta
node_app -->|"uses run saves"| node_save
node_app -->|"updates interface"| node_ui
node_app -->|"seeds runs"| node_rng
node_app -->|"reads settings"| node_config
node_game -->|"selects events"| node_eventdata
node_game -->|"rolls items"| node_items
node_game -->|"uses stat rules"| node_archetypes
node_game -->|"checks achievements"| node_achievements
node_game -->|"uses run progression"| node_meta
node_game -->|"updates stats"| node_special
node_game -->|"applies perks"| node_perks
node_game -->|"rolls outcomes"| node_rng
node_game -->|"uses dice helpers"| node_utils
node_eventdata -.->|"loads event content"| node_events
node_save -.->|"persists run"| node_localstorage
node_meta -.->|"persists career"| node_localstorage
node_save -->|"restores random state"| node_rng
node_save -.->|"restores stats"| node_special
node_save -.->|"restores perks"| node_perks
node_meta -->|"records run result"| node_game
node_meta -->|"coordinates run state"| node_save
node_ui -->|"composes"| node_uicore
node_ui -->|"composes"| node_characterui
node_ui -->|"composes"| node_eventui
node_ui -->|"composes"| node_diceui
node_ui -->|"composes"| node_levelui
node_ui -->|"composes"| node_endui
node_ui -->|"composes"| node_settingsui
node_ui -->|"composes"| node_achievementui
node_ui -->|"composes"| node_leaderboardui
node_ui -->|"composes"| node_statisticsui
node_eventui -->|"uses dice display"| node_diceui
node_uicore -->|"reads career statistics"| node_meta
node_uicore -->|"clears unlocks"| node_achievements
node_characterui -->|"presents builds"| node_archetypes
node_levelui -->|"uses run state"| node_game
node_endui -->|"uses run saves"| node_save
node_leaderboardui -->|"reads run records"| node_meta
node_statisticsui -->|"reads career statistics"| node_meta
node_achievementui -->|"reads achievements"| node_achievements

click node_app "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/app.ts"
click node_game "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/game.ts"
click node_special "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/special.ts"
click node_perks "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/perks.ts"
click node_config "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/core/config.ts"
click node_rng "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/core/seeded-rng.ts"
click node_utils "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/core/utils.ts"
click node_archetypes "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/archetypes.ts"
click node_events "https://github.com/rurouni88/pc3-d20-devlife/tree/main/src/data/events"
click node_eventdata "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/events.ts"
click node_items "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/items.ts"
click node_achievements "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/achievements.ts"
click node_save "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/save.ts"
click node_meta "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/meta.ts"
click node_ui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui.ts"
click node_uicore "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-core.ts"
click node_characterui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-character.ts"
click node_eventui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-event.ts"
click node_diceui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-dice.ts"
click node_levelui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-levelup.ts"
click node_endui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-endofrun.ts"
click node_settingsui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-settings.ts"
click node_achievementui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-achievements.ts"
click node_leaderboardui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-leaderboard.ts"
click node_statisticsui "https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-statistics.ts"

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_app toneBlue
class node_game,node_special,node_perks,node_config,node_rng,node_utils toneAmber
class node_archetypes,node_events,node_eventdata,node_items,node_achievements toneMint
class node_save,node_meta,node_localstorage toneRose
class node_ui,node_uicore,node_characterui,node_eventui,node_diceui,node_levelui,node_endui,node_settingsui,node_achievementui,node_leaderboardui,node_statisticsui,node_player toneIndigo
```

## Components

### Play flow

- [Application entry](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/app.ts): `src/js/app.ts`

### Game rules

- [Run engine](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/game.ts): `src/js/engine/game.ts`
- [SPECIAL stats](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/special.ts): `src/js/engine/special.ts`
- [Perk system](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/perks.ts): `src/js/data/perks.ts`
- [Game configuration](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/core/config.ts): `src/js/core/config.ts`
- [Seeded random](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/core/seeded-rng.ts): `src/js/core/seeded-rng.ts`
- [Dice and utilities](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/core/utils.ts): `src/js/core/utils.ts`

### Game content

- [Character archetypes](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/archetypes.ts): `src/js/data/archetypes.ts`
- [Career events](https://github.com/rurouni88/pc3-d20-devlife/tree/main/src/data/events): `src/data/events`
- [Event selection](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/events.ts): `src/js/data/events.ts`
- [Equipment and consumables](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/items.ts): `src/js/data/items.ts`
- [Achievements](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/data/achievements.ts): `src/js/data/achievements.ts`

### Progress and state

- [Run save system](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/save.ts): `src/js/engine/save.ts`
- [Career meta store](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/engine/meta.ts): `src/js/engine/meta.ts`
- **Browser local storage**

### Player interface

- [UI composition](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui.ts): `src/js/ui/ui.ts`
- [Screens and shared UI](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-core.ts): `src/js/ui/ui-core.ts`
- [Character creation](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-character.ts): `src/js/ui/ui-character.ts`
- [Event choices](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-event.ts): `src/js/ui/ui-event.ts`
- [Dice display](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-dice.ts): `src/js/ui/ui-dice.ts`
- [Level-up screen](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-levelup.ts): `src/js/ui/ui-levelup.ts`
- [Run-end screen](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-endofrun.ts): `src/js/ui/ui-endofrun.ts`
- [Settings screen](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-settings.ts): `src/js/ui/ui-settings.ts`
- [Achievement screen](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-achievements.ts): `src/js/ui/ui-achievements.ts`
- [Leaderboard screen](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-leaderboard.ts): `src/js/ui/ui-leaderboard.ts`
- [Statistics screen](https://github.com/rurouni88/pc3-d20-devlife/blob/main/src/js/ui/ui-statistics.ts): `src/js/ui/ui-statistics.ts`

### Other components

- **Player**

## Connections

- Player → Application entry: starts play (evidence: `README.md`)
- Application entry → Run engine: controls run (evidence: `src/js/app.ts`)
- Application entry → Career meta store: uses career state (evidence: `src/js/app.ts`)
- Application entry → Run save system: uses run saves (evidence: `src/js/app.ts`)
- Application entry → UI composition: updates interface (evidence: `src/js/app.ts`)
- Application entry → Seeded random: seeds runs (evidence: `src/js/app.ts`)
- Application entry → Game configuration: reads settings (evidence: `src/js/app.ts`)
- Run engine → Event selection: selects events (evidence: `src/js/engine/game.ts`)
- Run engine → Equipment and consumables: rolls items (evidence: `src/js/engine/game.ts`)
- Run engine → Character archetypes: uses stat rules (evidence: `src/js/engine/game.ts`)
- Run engine → Achievements: checks achievements (evidence: `src/js/engine/game.ts`)
- Run engine → Career meta store: uses run progression (evidence: `src/js/engine/game.ts`)
- Run engine → SPECIAL stats: updates stats (evidence: `src/js/engine/game.ts`)
- Run engine → Perk system: applies perks (evidence: `src/js/engine/game.ts`)
- Run engine → Seeded random: rolls outcomes (evidence: `src/js/engine/game.ts`)
- Run engine → Dice and utilities: uses dice helpers (evidence: `src/js/engine/game.ts`)
- Event selection → Career events: loads event content
- Run save system → Browser local storage: persists run
- Career meta store → Browser local storage: persists career
- Run save system → Seeded random: restores random state (evidence: `src/js/engine/save.ts`)
- Run save system → SPECIAL stats: restores stats (evidence: `src/js/engine/save.ts`)
- Run save system → Perk system: restores perks (evidence: `src/js/engine/save.ts`)
- Career meta store → Run engine: records run result (evidence: `src/js/engine/meta.ts`)
- Career meta store → Run save system: coordinates run state (evidence: `src/js/engine/meta.ts`)
- UI composition → Screens and shared UI: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Character creation: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Event choices: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Dice display: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Level-up screen: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Run-end screen: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Settings screen: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Achievement screen: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Leaderboard screen: composes (evidence: `src/js/ui/ui.ts`)
- UI composition → Statistics screen: composes (evidence: `src/js/ui/ui.ts`)
- Event choices → Dice display: uses dice display (evidence: `src/js/ui/ui-event.ts`)
- Screens and shared UI → Career meta store: reads career statistics (evidence: `src/js/ui/ui-core.ts`)
- Screens and shared UI → Achievements: clears unlocks (evidence: `src/js/ui/ui-core.ts`)
- Character creation → Character archetypes: presents builds (evidence: `src/js/ui/ui-character.ts`)
- Level-up screen → Run engine: uses run state (evidence: `src/js/ui/ui-levelup.ts`)
- Run-end screen → Run save system: uses run saves (evidence: `src/js/ui/ui-endofrun.ts`)
- Leaderboard screen → Career meta store: reads run records (evidence: `src/js/ui/ui-leaderboard.ts`)
- Statistics screen → Career meta store: reads career statistics (evidence: `src/js/ui/ui-statistics.ts`)
- Achievement screen → Achievements: reads achievements (evidence: `src/js/ui/ui-achievements.ts`)
