# rajexl-sketch/pips-peril architecture

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

- Interactive diagram: https://gitdiagram.com/rajexl-sketch/pips-peril
- Repository: https://github.com/rajexl-sketch/pips-peril

## Overview

Pip’s Peril is a browser-based, procedural 8-bit platform game. A player starts from the title flow, selects or continues a run, and plays through levels assembled from chunk recipes; gameplay coordinates Pip, enemies, hazards, scoring, and transitions to pause, game-over, or victory. Separate scenes provide settings and HUD, while generated graphics and synthesized audio support the experience. The graph reflects documented capabilities and sampled call sites; some scene wiring and unsampled implementations are represented only where README or tree evidence supports the subsystem, not as guessed calls.

Main entry points: [`src/main.ts`](https://github.com/rajexl-sketch/pips-peril/blob/main/src/main.ts) (Phaser entry), [`src/scenes/GameScene.ts`](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/GameScene.ts) (Gameplay scene), [`src/scenes/ui/Menu.ts`](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/ui/Menu.ts) (Menu widget), [`src/audio/Chiptune.ts`](https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/Chiptune.ts) (Chiptune synth)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_gameflow["Game flow"]
  node_main["Phaser entry<br/>[main.ts]"]
  node_boot["Boot scene<br/>[BootScene.ts]"]
  node_title["Title scene<br/>[TitleScene.ts]"]
  node_intro["Level intro<br/>[LevelIntroScene.ts]"]
  node_pause["Pause scene<br/>[PauseScene.ts]"]
  node_settings["Settings scene<br/>[SettingsScene.ts]"]
  node_gameover["Game over<br/>[GameOverScene.ts]"]
  node_victory["Victory scene<br/>[VictoryScene.ts]"]
  node_menu["Menu widget<br/>[Menu.ts]"]
end

subgraph group_gameplay["Gameplay"]
  node_game["Gameplay scene<br/>[GameScene.ts]"]
  node_ui["HUD scene<br/>[UIScene.ts]"]
  node_state["Run state<br/>[GameState.ts]"]
  node_playercode["Pip controller<br/>[Player.ts]"]
  node_enemies["Enemies and boss"]
end

subgraph group_content["Procedural content"]
  node_levels["Level recipes<br/>[levels.ts]"]
  node_chunks["Terrain chunks<br/>[chunks.ts]"]
  node_builder["Level parser<br/>[LevelBuilder.ts]"]
  node_textures["Texture factory<br/>[TextureFactory.ts]"]
  node_render["Grid renderer<br/>[render.ts]"]
  node_art["Pixel art data"]
end

subgraph group_platform["Player services"]
  node_input["Input manager<br/>[InputManager.ts]"]
  node_saves["Save system<br/>[SaveSystem.ts]"]
  node_audio["Chiptune synth<br/>[Chiptune.ts]"]
  node_notes["Music notation<br/>[notes.ts]"]
  node_tracks["Music tracks<br/>[tracks.ts]"]
  node_sfx["Sound effects<br/>[Sfx.ts]"]
end

node_player(("Player"))
node_storage[("Browser storage")]
node_webaudio["Web Audio"]

node_player -->|"starts game"| node_main
node_main -->|"registers scenes"| node_boot
node_main -->|"registers scenes"| node_title
node_main -->|"registers scenes"| node_intro
node_main -->|"registers scenes"| node_game
node_main -->|"registers scenes"| node_ui
node_main -->|"registers scenes"| node_pause
node_main -->|"registers scenes"| node_settings
node_main -->|"registers scenes"| node_gameover
node_main -->|"registers scenes"| node_victory
node_title -->|"uses menu"| node_menu
node_pause -->|"uses menu"| node_menu
node_settings -->|"uses menu"| node_menu
node_gameover -->|"uses menu"| node_menu
node_game -->|"gets recipe"| node_levels
node_game -->|"parses level"| node_builder
node_builder -->|"assembles rows"| node_chunks
node_game -->|"creates player"| node_playercode
node_game -->|"creates enemies"| node_enemies
node_game -->|"polls input"| node_input
node_game -->|"updates run state"| node_state
node_playercode -->|"plays effects"| node_sfx
node_game -->|"plays effects"| node_sfx
node_boot -->|"builds assets"| node_textures
node_textures -->|"renders grids"| node_render
node_textures -->|"reads art"| node_art
node_input -->|"reads bindings"| node_saves
node_saves -->|"persists settings"| node_storage
node_audio -->|"parses notation"| node_notes
node_audio -->|"plays compositions"| node_tracks
node_audio -->|"synthesizes audio"| node_webaudio
node_sfx -->|"synthesizes effects"| node_webaudio

click node_main "https://github.com/rajexl-sketch/pips-peril/blob/main/src/main.ts"
click node_boot "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/BootScene.ts"
click node_title "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/TitleScene.ts"
click node_intro "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/LevelIntroScene.ts"
click node_game "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/GameScene.ts"
click node_ui "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/UIScene.ts"
click node_pause "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/PauseScene.ts"
click node_settings "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/SettingsScene.ts"
click node_gameover "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/GameOverScene.ts"
click node_victory "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/VictoryScene.ts"
click node_menu "https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/ui/Menu.ts"
click node_state "https://github.com/rajexl-sketch/pips-peril/blob/main/src/systems/GameState.ts"
click node_playercode "https://github.com/rajexl-sketch/pips-peril/blob/main/src/entities/Player.ts"
click node_enemies "https://github.com/rajexl-sketch/pips-peril/tree/main/src/entities/enemies"
click node_levels "https://github.com/rajexl-sketch/pips-peril/blob/main/src/levels/levels.ts"
click node_chunks "https://github.com/rajexl-sketch/pips-peril/blob/main/src/levels/chunks.ts"
click node_builder "https://github.com/rajexl-sketch/pips-peril/blob/main/src/levels/LevelBuilder.ts"
click node_textures "https://github.com/rajexl-sketch/pips-peril/blob/main/src/gfx/TextureFactory.ts"
click node_render "https://github.com/rajexl-sketch/pips-peril/blob/main/src/gfx/render.ts"
click node_art "https://github.com/rajexl-sketch/pips-peril/tree/main/src/gfx/art"
click node_input "https://github.com/rajexl-sketch/pips-peril/blob/main/src/systems/InputManager.ts"
click node_saves "https://github.com/rajexl-sketch/pips-peril/blob/main/src/systems/SaveSystem.ts"
click node_audio "https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/Chiptune.ts"
click node_notes "https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/notes.ts"
click node_tracks "https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/tracks.ts"
click node_sfx "https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/Sfx.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_main,node_boot,node_title,node_intro,node_pause,node_settings,node_gameover,node_victory,node_menu toneBlue
class node_game,node_ui,node_state,node_playercode,node_enemies,node_storage toneAmber
class node_levels,node_chunks,node_builder,node_textures,node_render,node_art toneMint
class node_input,node_saves,node_audio,node_notes,node_tracks,node_sfx toneRose
class node_player,node_webaudio toneIndigo
```

## Components

### Game flow

- [Phaser entry](https://github.com/rajexl-sketch/pips-peril/blob/main/src/main.ts): `src/main.ts`
- [Boot scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/BootScene.ts): `src/scenes/BootScene.ts`
- [Title scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/TitleScene.ts): `src/scenes/TitleScene.ts`
- [Level intro](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/LevelIntroScene.ts): `src/scenes/LevelIntroScene.ts`
- [Pause scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/PauseScene.ts): `src/scenes/PauseScene.ts`
- [Settings scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/SettingsScene.ts): `src/scenes/SettingsScene.ts`
- [Game over](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/GameOverScene.ts): `src/scenes/GameOverScene.ts`
- [Victory scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/VictoryScene.ts): `src/scenes/VictoryScene.ts`
- [Menu widget](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/ui/Menu.ts): `src/scenes/ui/Menu.ts`

### Gameplay

- [Gameplay scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/GameScene.ts): `src/scenes/GameScene.ts`
- [HUD scene](https://github.com/rajexl-sketch/pips-peril/blob/main/src/scenes/UIScene.ts): `src/scenes/UIScene.ts`
- [Run state](https://github.com/rajexl-sketch/pips-peril/blob/main/src/systems/GameState.ts): `src/systems/GameState.ts`
- [Pip controller](https://github.com/rajexl-sketch/pips-peril/blob/main/src/entities/Player.ts): `src/entities/Player.ts`
- [Enemies and boss](https://github.com/rajexl-sketch/pips-peril/tree/main/src/entities/enemies): `src/entities/enemies`

### Procedural content

- [Level recipes](https://github.com/rajexl-sketch/pips-peril/blob/main/src/levels/levels.ts): `src/levels/levels.ts`
- [Terrain chunks](https://github.com/rajexl-sketch/pips-peril/blob/main/src/levels/chunks.ts): `src/levels/chunks.ts`
- [Level parser](https://github.com/rajexl-sketch/pips-peril/blob/main/src/levels/LevelBuilder.ts): `src/levels/LevelBuilder.ts`
- [Texture factory](https://github.com/rajexl-sketch/pips-peril/blob/main/src/gfx/TextureFactory.ts): `src/gfx/TextureFactory.ts`
- [Grid renderer](https://github.com/rajexl-sketch/pips-peril/blob/main/src/gfx/render.ts): `src/gfx/render.ts`
- [Pixel art data](https://github.com/rajexl-sketch/pips-peril/tree/main/src/gfx/art): `src/gfx/art`

### Player services

- [Input manager](https://github.com/rajexl-sketch/pips-peril/blob/main/src/systems/InputManager.ts): `src/systems/InputManager.ts`
- [Save system](https://github.com/rajexl-sketch/pips-peril/blob/main/src/systems/SaveSystem.ts): `src/systems/SaveSystem.ts`
- [Chiptune synth](https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/Chiptune.ts): `src/audio/Chiptune.ts`
- [Music notation](https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/notes.ts): `src/audio/notes.ts`
- [Music tracks](https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/tracks.ts): `src/audio/tracks.ts`
- [Sound effects](https://github.com/rajexl-sketch/pips-peril/blob/main/src/audio/Sfx.ts): `src/audio/Sfx.ts`

### Other components

- **Player**
- **Browser storage**
- **Web Audio**

## Connections

- Player → Phaser entry: starts game
- Phaser entry → Boot scene: registers scenes
- Phaser entry → Title scene: registers scenes
- Phaser entry → Level intro: registers scenes
- Phaser entry → Gameplay scene: registers scenes
- Phaser entry → HUD scene: registers scenes
- Phaser entry → Pause scene: registers scenes
- Phaser entry → Settings scene: registers scenes
- Phaser entry → Game over: registers scenes
- Phaser entry → Victory scene: registers scenes
- Title scene → Menu widget: uses menu
- Pause scene → Menu widget: uses menu
- Settings scene → Menu widget: uses menu
- Game over → Menu widget: uses menu
- Gameplay scene → Level recipes: gets recipe
- Gameplay scene → Level parser: parses level
- Level parser → Terrain chunks: assembles rows
- Gameplay scene → Pip controller: creates player
- Gameplay scene → Enemies and boss: creates enemies
- Gameplay scene → Input manager: polls input
- Gameplay scene → Run state: updates run state
- Pip controller → Sound effects: plays effects
- Gameplay scene → Sound effects: plays effects
- Boot scene → Texture factory: builds assets
- Texture factory → Grid renderer: renders grids
- Texture factory → Pixel art data: reads art
- Input manager → Save system: reads bindings
- Save system → Browser storage: persists settings
- Chiptune synth → Music notation: parses notation
- Chiptune synth → Music tracks: plays compositions
- Chiptune synth → Web Audio: synthesizes audio
- Sound effects → Web Audio: synthesizes effects
