# c-h-a-n-a/vanilla-2d-rpg-engine architecture

> Architecture diagram of the GitHub repository c-h-a-n-a/vanilla-2d-rpg-engine, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/c-h-a-n-a/vanilla-2d-rpg-engine
- Repository: https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine

## Overview

This is a Java 2D RPG: the player moves through maps, interacts with NPCs or nearby monsters, and can enter turn-based battles. The runtime starts a window and loop, updates central game state, then renders the active mode. The map/entity branch covers collision, camera, tiles and NPC dialogue; the battle branch covers party setup, command selection, round resolution and battle display. Relationships are based on the supplied excerpts and SOURCE INDEX references; several implementation details are unsampled, so uncertain links are omitted.

Main entry points: [`src/game/state/Game.java`](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/Game.java) (Game State), [`src/game/battle/BattleState.java`](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleState.java) (Battle State), [`src/game/render/GameRenderer.java`](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/GameRenderer.java) (Game Renderer), [`src/game/Main.java`](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/Main.java) (Application Entry)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Runtime and Rendering"]
  node_main["Application Entry<br/>[Main.java]"]
  node_loop["Game Loop<br/>[GameLoop.java]"]
  node_canvas["Game Canvas<br/>[GameCanvas.java]"]
  node_renderer["Game Renderer<br/>[GameRenderer.java]"]
  node_entityrender["Entity Renderer"]
  node_dialoguerender["Dialogue Renderer"]
  node_battlerender["Battle Renderer"]
  node_debug["Debug Overlay<br/>[DebugOverlay.java]"]
end

subgraph group_world["World and Entities"]
  node_entity["World Entity<br/>[Entity.java]"]
  node_npc["NPC<br/>[Npc.java]"]
  node_map["Game Map<br/>[GameMap.java]"]
  node_maps["Map Definitions<br/>[Maps.java]"]
  node_tilemap["Tile Map<br/>[TileMap.java]"]
  node_tiles["Tile Manager<br/>[TileManager.java]"]
  node_camera["Camera<br/>[Camera.java]"]
end

subgraph group_interaction["Interaction and State"]
  node_input["Keyboard Input<br/>[KeyboardInput.java]"]
  node_game["Game State<br/>[Game.java]"]
  node_dialogue["Dialogue Manager"]
  node_controller["Battle Controller"]
end

subgraph group_battle["Battle System"]
  node_party["Battle Party<br/>[BattleParty.java]"]
  node_battlemonster["Battle Monster<br/>[BattleMonster.java]"]
  node_battle["Battle State<br/>[BattleState.java]"]
  node_factory["Battle Factory<br/>[BattleFactory.java]"]
  node_turns["Turn Manager"]
  node_ai["Enemy AI<br/>[EnemyAI.java]"]
  node_moves["Battle Moves<br/>[BattleMove.java]"]
end

node_player(("Player"))

node_player -->|"starts"| node_main
node_main -->|"starts"| node_loop
node_main -->|"creates"| node_canvas
node_main -->|"registers"| node_input
node_loop -->|"updates"| node_game
node_loop -->|"renders through"| node_canvas
node_canvas -->|"delegates rendering"| node_renderer
node_renderer -->|"renders entities"| node_entityrender
node_renderer -->|"renders dialogue"| node_dialoguerender
node_renderer -->|"renders battle"| node_battlerender
node_renderer -->|"renders overlay"| node_debug
node_game -->|"reads controls"| node_input
node_game -->|"updates world"| node_map
node_game -->|"manages dialogue"| node_dialogue
node_game -->|"creates encounters"| node_factory
node_game -->|"creates battle state"| node_battle
node_game -->|"creates controller"| node_controller
node_game -->|"uses party"| node_party
node_game -->|"updates camera"| node_camera
node_game -->|"owns manager"| node_tiles
node_maps -->|"builds maps"| node_tilemap
node_maps -->|"loads tiles"| node_tiles
node_tilemap -->|"implements"| node_map
node_entity -->|"checks collision"| node_map
node_npc -->|"extends"| node_entity
node_npc -->|"moves on"| node_map
node_dialogue -->|"reads dialogue"| node_npc
node_controller -->|"consumes keys"| node_input
node_controller -->|"issues commands"| node_battle
node_battle -->|"resolves party"| node_party
node_battle -->|"requests enemy choices"| node_ai
node_battle -->|"orders actions"| node_turns
node_battle -->|"applies damage"| node_battlemonster
node_battlemonster -->|"holds moves"| node_moves
node_party -->|"stores members"| node_battlemonster
node_factory -->|"builds party"| node_party
node_factory -->|"creates monsters"| node_battlemonster
node_battlerender -->|"reads menu state"| node_controller
node_battlerender -->|"reads battle"| node_battle
node_entityrender -->|"uses camera"| node_camera
node_dialoguerender -->|"renders state"| node_dialogue

click node_main "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/Main.java"
click node_loop "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/core/GameLoop.java"
click node_canvas "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/core/GameCanvas.java"
click node_renderer "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/GameRenderer.java"
click node_entityrender "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/EntityRenderer.java"
click node_dialoguerender "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/DialogueRenderer.java"
click node_battlerender "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/BattleRenderer.java"
click node_debug "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/DebugOverlay.java"
click node_input "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/input/KeyboardInput.java"
click node_game "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/Game.java"
click node_dialogue "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/DialogueManager.java"
click node_controller "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/BattleController.java"
click node_entity "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/entity/Entity.java"
click node_npc "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/entity/Npc.java"
click node_map "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/GameMap.java"
click node_maps "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/Maps.java"
click node_tilemap "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/TileMap.java"
click node_tiles "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/tile/TileManager.java"
click node_camera "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/Camera.java"
click node_party "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleParty.java"
click node_battlemonster "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleMonster.java"
click node_battle "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleState.java"
click node_factory "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleFactory.java"
click node_turns "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleTurnManager.java"
click node_ai "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/EnemyAI.java"
click node_moves "https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleMove.java"

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_loop,node_canvas,node_renderer,node_entityrender,node_dialoguerender,node_battlerender,node_debug toneBlue
class node_entity,node_npc,node_map,node_maps,node_tilemap,node_tiles,node_camera toneAmber
class node_input,node_game,node_dialogue,node_controller toneMint
class node_party,node_battlemonster,node_battle,node_factory,node_turns,node_ai,node_moves toneRose
class node_player toneIndigo
```

## Components

### Runtime and Rendering

- [Application Entry](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/Main.java): `src/game/Main.java`
- [Game Loop](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/core/GameLoop.java): `src/game/core/GameLoop.java`
- [Game Canvas](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/core/GameCanvas.java): `src/game/core/GameCanvas.java`
- [Game Renderer](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/GameRenderer.java): `src/game/render/GameRenderer.java`
- [Entity Renderer](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/EntityRenderer.java): `src/game/render/EntityRenderer.java`
- [Dialogue Renderer](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/DialogueRenderer.java): `src/game/render/DialogueRenderer.java`
- [Battle Renderer](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/BattleRenderer.java): `src/game/render/BattleRenderer.java`
- [Debug Overlay](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/render/DebugOverlay.java): `src/game/render/DebugOverlay.java`

### World and Entities

- [World Entity](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/entity/Entity.java): `src/game/entity/Entity.java`
- [NPC](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/entity/Npc.java): `src/game/entity/Npc.java`
- [Game Map](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/GameMap.java): `src/game/world/GameMap.java`
- [Map Definitions](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/Maps.java): `src/game/world/Maps.java`
- [Tile Map](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/TileMap.java): `src/game/world/TileMap.java`
- [Tile Manager](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/tile/TileManager.java): `src/game/tile/TileManager.java`
- [Camera](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/world/Camera.java): `src/game/world/Camera.java`

### Interaction and State

- [Keyboard Input](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/input/KeyboardInput.java): `src/game/input/KeyboardInput.java`
- [Game State](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/Game.java): `src/game/state/Game.java`
- [Dialogue Manager](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/DialogueManager.java): `src/game/state/DialogueManager.java`
- [Battle Controller](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/state/BattleController.java): `src/game/state/BattleController.java`

### Battle System

- [Battle Party](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleParty.java): `src/game/battle/BattleParty.java`
- [Battle Monster](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleMonster.java): `src/game/battle/BattleMonster.java`
- [Battle State](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleState.java): `src/game/battle/BattleState.java`
- [Battle Factory](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleFactory.java): `src/game/battle/BattleFactory.java`
- [Turn Manager](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleTurnManager.java): `src/game/battle/BattleTurnManager.java`
- [Enemy AI](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/EnemyAI.java): `src/game/battle/EnemyAI.java`
- [Battle Moves](https://github.com/c-h-a-n-a/vanilla-2d-rpg-engine/blob/main/src/game/battle/BattleMove.java): `src/game/battle/BattleMove.java`

### Other components

- **Player**

## Connections

- Player → Application Entry: starts (evidence: `src/game/Main.java`)
- Application Entry → Game Loop: starts (evidence: `src/game/Main.java`)
- Application Entry → Game Canvas: creates (evidence: `src/game/Main.java`)
- Application Entry → Keyboard Input: registers (evidence: `src/game/Main.java`)
- Game Loop → Game State: updates (evidence: `src/game/core/GameLoop.java`)
- Game Loop → Game Canvas: renders through (evidence: `src/game/core/GameLoop.java`)
- Game Canvas → Game Renderer: delegates rendering (evidence: `src/game/core/GameCanvas.java`)
- Game Renderer → Entity Renderer: renders entities (evidence: `src/game/render/GameRenderer.java`)
- Game Renderer → Dialogue Renderer: renders dialogue (evidence: `src/game/render/GameRenderer.java`)
- Game Renderer → Battle Renderer: renders battle (evidence: `src/game/render/GameRenderer.java`)
- Game Renderer → Debug Overlay: renders overlay (evidence: `src/game/render/GameRenderer.java`)
- Game State → Keyboard Input: reads controls (evidence: `src/game/state/Game.java`)
- Game State → Game Map: updates world (evidence: `src/game/state/Game.java`)
- Game State → Dialogue Manager: manages dialogue (evidence: `src/game/state/Game.java`)
- Game State → Battle Factory: creates encounters (evidence: `src/game/state/Game.java`)
- Game State → Battle State: creates battle state (evidence: `src/game/state/Game.java`)
- Game State → Battle Controller: creates controller (evidence: `src/game/state/Game.java`)
- Game State → Battle Party: uses party (evidence: `src/game/state/Game.java`)
- Game State → Camera: updates camera (evidence: `src/game/state/Game.java`)
- Game State → Tile Manager: owns manager (evidence: `src/game/state/Game.java`)
- Map Definitions → Tile Map: builds maps (evidence: `src/game/world/Maps.java`)
- Map Definitions → Tile Manager: loads tiles (evidence: `src/game/world/Maps.java`)
- Tile Map → Game Map: implements (evidence: `src/game/world/TileMap.java`)
- World Entity → Game Map: checks collision (evidence: `src/game/entity/Entity.java`)
- NPC → World Entity: extends (evidence: `src/game/entity/Npc.java`)
- NPC → Game Map: moves on (evidence: `src/game/entity/Npc.java`)
- Dialogue Manager → NPC: reads dialogue (evidence: `src/game/state/DialogueManager.java`)
- Battle Controller → Keyboard Input: consumes keys (evidence: `src/game/state/BattleController.java`)
- Battle Controller → Battle State: issues commands (evidence: `src/game/state/BattleController.java`)
- Battle State → Battle Party: resolves party (evidence: `src/game/battle/BattleState.java`)
- Battle State → Enemy AI: requests enemy choices (evidence: `src/game/battle/BattleState.java`)
- Battle State → Turn Manager: orders actions (evidence: `src/game/battle/BattleState.java`)
- Battle State → Battle Monster: applies damage (evidence: `src/game/battle/BattleState.java`)
- Battle Monster → Battle Moves: holds moves (evidence: `src/game/battle/BattleMonster.java`)
- Battle Party → Battle Monster: stores members (evidence: `src/game/battle/BattleParty.java`)
- Battle Factory → Battle Party: builds party (evidence: `src/game/battle/BattleFactory.java`)
- Battle Factory → Battle Monster: creates monsters (evidence: `src/game/battle/BattleFactory.java`)
- Battle Renderer → Battle Controller: reads menu state (evidence: `src/game/render/BattleRenderer.java`)
- Battle Renderer → Battle State: reads battle (evidence: `src/game/render/BattleRenderer.java`)
- Entity Renderer → Camera: uses camera (evidence: `src/game/render/EntityRenderer.java`)
- Dialogue Renderer → Dialogue Manager: renders state (evidence: `src/game/render/DialogueRenderer.java`)
