# pklucid/lucid-calc architecture

> Architecture diagram of the GitHub repository pklucid/lucid-calc, 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/pklucid/lucid-calc
- Repository: https://github.com/pklucid/lucid-calc

## Overview

EKalc combines a browser damage-calculator UI with the `@smogon/calc` library and its generation-specific Pokémon data. The principal workflow is to choose a generation, attacker, defender, move, and field state; calculate damage using that generation’s mechanics; then present ranges, descriptions, and related results. The README also documents imported Pokémon sets and random-battle options, which support the UI. UI-to-calculator wiring and several internal mechanics links are not shown in the sampled excerpts, so uncertain links are omitted or marked unverified.

Main entry points: [`calc/src/index.ts`](https://github.com/pklucid/lucid-calc/blob/main/calc/src/index.ts) (Calculator API), [`calc/src/adaptable.ts`](https://github.com/pklucid/lucid-calc/blob/main/calc/src/adaptable.ts) (Adaptable API), [`src/js/shared_controls.js`](https://github.com/pklucid/lucid-calc/blob/main/src/js/shared_controls.js) (Calculator controls), [`src/js/data/sets`](https://github.com/pklucid/lucid-calc/tree/main/src/js/data/sets) (Generation sets)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Browser UI"]
  node_ui_controls["Calculator controls<br/>[shared_controls.js]"]
  node_ui_honk["Honkalculate controls"]
  node_ui_random["Random controls"]
  node_ui_import["Moveset import<br/>[moveset_import.js]"]
end

subgraph group_library["Calculator Library"]
  node_api["Calculator API<br/>[index.ts]"]
  node_adaptable["Adaptable API<br/>[adaptable.ts]"]
  node_pokemon["Pokémon state<br/>[pokemon.ts]"]
  node_move["Move state<br/>[move.ts]"]
  node_field["Field state<br/>[field.ts]"]
  node_stats["Stat calculations<br/>[stats.ts]"]
  node_result["Damage result<br/>[result.ts]"]
  node_descriptions["Result descriptions<br/>[desc.ts]"]
end

subgraph group_data["Generation Data"]
  node_species_data[("Species data<br/>[species.ts]")]
  node_moves_data[("Move data<br/>[moves.ts]")]
  node_abilities_data[("Ability data<br/>[abilities.ts]")]
  node_items_data[("Item data<br/>[items.ts]")]
  node_natures_data[("Nature data<br/>[natures.ts]")]
  node_types_data[("Type data<br/>[types.ts]")]
end

subgraph group_mechanics["Damage Mechanics"]
  node_gen12["Gen 1–2 mechanics<br/>[gen12.ts]"]
  node_gen3["Gen 3 mechanics<br/>[gen3.ts]"]
  node_gen4["Gen 4 mechanics<br/>[gen4.ts]"]
  node_gen56["Gen 5–6 mechanics<br/>[gen56.ts]"]
  node_gen789["Gen 7–9 mechanics<br/>[gen789.ts]"]
  node_mechanics_util["Mechanics helpers<br/>[util.ts]"]
end

subgraph group_sets["Sets and Import"]
  node_sets_data["Generation sets"]
  node_import_sets["Set import package<br/>[sets.ts]"]
  node_trainer_import["Trainer name data<br/>[main.py]"]
end

node_user(("Calculator user"))

node_user -->|"sets inputs"| node_ui_controls
node_ui_controls -.->|"requests calculation"| node_api
node_ui_honk -.->|"uses calculator"| node_api
node_ui_random -.->|"uses battle sets"| node_sets_data
node_ui_import -.->|"imports sets"| node_sets_data
node_import_sets -->|"populates sets"| node_sets_data
node_trainer_import -.->|"supports trainer data"| node_ui_controls
node_api -->|"delegates calculation"| node_adaptable
node_adaptable -->|"constructs Pokémon"| node_pokemon
node_adaptable -->|"constructs move"| node_move
node_adaptable -->|"accepts field state"| node_field
node_pokemon -.->|"loads species"| node_species_data
node_move -.->|"loads move data"| node_moves_data
node_api -.->|"applies mechanics"| node_gen12
node_api -.->|"applies mechanics"| node_gen3
node_api -.->|"applies mechanics"| node_gen4
node_api -.->|"applies mechanics"| node_gen56
node_api -.->|"applies mechanics"| node_gen789
node_gen789 -->|"uses helpers"| node_mechanics_util
node_api -.->|"returns result"| node_result
node_result -->|"builds descriptions"| node_descriptions

click node_ui_controls "https://github.com/pklucid/lucid-calc/blob/main/src/js/shared_controls.js"
click node_ui_honk "https://github.com/pklucid/lucid-calc/blob/main/src/js/honkalculate_controls.js"
click node_ui_random "https://github.com/pklucid/lucid-calc/blob/main/src/js/index_randoms_controls.js"
click node_ui_import "https://github.com/pklucid/lucid-calc/blob/main/src/js/moveset_import.js"
click node_sets_data "https://github.com/pklucid/lucid-calc/tree/main/src/js/data/sets"
click node_import_sets "https://github.com/pklucid/lucid-calc/blob/main/import/src/sets.ts"
click node_trainer_import "https://github.com/pklucid/lucid-calc/blob/main/script/main.py"
click node_api "https://github.com/pklucid/lucid-calc/blob/main/calc/src/index.ts"
click node_adaptable "https://github.com/pklucid/lucid-calc/blob/main/calc/src/adaptable.ts"
click node_pokemon "https://github.com/pklucid/lucid-calc/blob/main/calc/src/pokemon.ts"
click node_move "https://github.com/pklucid/lucid-calc/blob/main/calc/src/move.ts"
click node_field "https://github.com/pklucid/lucid-calc/blob/main/calc/src/field.ts"
click node_stats "https://github.com/pklucid/lucid-calc/blob/main/calc/src/stats.ts"
click node_result "https://github.com/pklucid/lucid-calc/blob/main/calc/src/result.ts"
click node_descriptions "https://github.com/pklucid/lucid-calc/blob/main/calc/src/desc.ts"
click node_species_data "https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/species.ts"
click node_moves_data "https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/moves.ts"
click node_abilities_data "https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/abilities.ts"
click node_items_data "https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/items.ts"
click node_natures_data "https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/natures.ts"
click node_types_data "https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/types.ts"
click node_gen12 "https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen12.ts"
click node_gen3 "https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen3.ts"
click node_gen4 "https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen4.ts"
click node_gen56 "https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen56.ts"
click node_gen789 "https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen789.ts"
click node_mechanics_util "https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/util.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_ui_controls,node_ui_honk,node_ui_random,node_ui_import,node_user toneBlue
class node_api,node_adaptable,node_pokemon,node_move,node_field,node_stats,node_result,node_descriptions toneAmber
class node_species_data,node_moves_data,node_abilities_data,node_items_data,node_natures_data,node_types_data toneMint
class node_gen12,node_gen3,node_gen4,node_gen56,node_gen789,node_mechanics_util toneRose
class node_sets_data,node_import_sets,node_trainer_import toneIndigo
```

## Components

### Browser UI

- [Calculator controls](https://github.com/pklucid/lucid-calc/blob/main/src/js/shared_controls.js): `src/js/shared_controls.js`
- [Honkalculate controls](https://github.com/pklucid/lucid-calc/blob/main/src/js/honkalculate_controls.js): `src/js/honkalculate_controls.js`
- [Random controls](https://github.com/pklucid/lucid-calc/blob/main/src/js/index_randoms_controls.js): `src/js/index_randoms_controls.js`
- [Moveset import](https://github.com/pklucid/lucid-calc/blob/main/src/js/moveset_import.js): `src/js/moveset_import.js`

### Calculator Library

- [Calculator API](https://github.com/pklucid/lucid-calc/blob/main/calc/src/index.ts): `calc/src/index.ts`
- [Adaptable API](https://github.com/pklucid/lucid-calc/blob/main/calc/src/adaptable.ts): `calc/src/adaptable.ts`
- [Pokémon state](https://github.com/pklucid/lucid-calc/blob/main/calc/src/pokemon.ts): `calc/src/pokemon.ts`
- [Move state](https://github.com/pklucid/lucid-calc/blob/main/calc/src/move.ts): `calc/src/move.ts`
- [Field state](https://github.com/pklucid/lucid-calc/blob/main/calc/src/field.ts): `calc/src/field.ts`
- [Stat calculations](https://github.com/pklucid/lucid-calc/blob/main/calc/src/stats.ts): `calc/src/stats.ts`
- [Damage result](https://github.com/pklucid/lucid-calc/blob/main/calc/src/result.ts): `calc/src/result.ts`
- [Result descriptions](https://github.com/pklucid/lucid-calc/blob/main/calc/src/desc.ts): `calc/src/desc.ts`

### Generation Data

- [Species data](https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/species.ts): `calc/src/data/species.ts`
- [Move data](https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/moves.ts): `calc/src/data/moves.ts`
- [Ability data](https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/abilities.ts): `calc/src/data/abilities.ts`
- [Item data](https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/items.ts): `calc/src/data/items.ts`
- [Nature data](https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/natures.ts): `calc/src/data/natures.ts`
- [Type data](https://github.com/pklucid/lucid-calc/blob/main/calc/src/data/types.ts): `calc/src/data/types.ts`

### Damage Mechanics

- [Gen 1–2 mechanics](https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen12.ts): `calc/src/mechanics/gen12.ts`
- [Gen 3 mechanics](https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen3.ts): `calc/src/mechanics/gen3.ts`
- [Gen 4 mechanics](https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen4.ts): `calc/src/mechanics/gen4.ts`
- [Gen 5–6 mechanics](https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen56.ts): `calc/src/mechanics/gen56.ts`
- [Gen 7–9 mechanics](https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/gen789.ts): `calc/src/mechanics/gen789.ts`
- [Mechanics helpers](https://github.com/pklucid/lucid-calc/blob/main/calc/src/mechanics/util.ts): `calc/src/mechanics/util.ts`

### Sets and Import

- [Generation sets](https://github.com/pklucid/lucid-calc/tree/main/src/js/data/sets): `src/js/data/sets`
- [Set import package](https://github.com/pklucid/lucid-calc/blob/main/import/src/sets.ts): `import/src/sets.ts`
- [Trainer name data](https://github.com/pklucid/lucid-calc/blob/main/script/main.py): `script/main.py`

### Other components

- **Calculator user**

## Connections

- Calculator user → Calculator controls: sets inputs (evidence: `README.md`)
- Calculator controls → Calculator API: requests calculation
- Honkalculate controls → Calculator API: uses calculator
- Random controls → Generation sets: uses battle sets
- Moveset import → Generation sets: imports sets
- Set import package → Generation sets: populates sets (evidence: `README.md`)
- Trainer name data → Calculator controls: supports trainer data
- Calculator API → Adaptable API: delegates calculation (evidence: `calc/src/index.ts`)
- Adaptable API → Pokémon state: constructs Pokémon (evidence: `calc/src/adaptable.ts`)
- Adaptable API → Move state: constructs move (evidence: `calc/src/adaptable.ts`)
- Adaptable API → Field state: accepts field state (evidence: `calc/src/adaptable.ts`)
- Pokémon state → Species data: loads species
- Move state → Move data: loads move data
- Calculator API → Gen 1–2 mechanics: applies mechanics
- Calculator API → Gen 3 mechanics: applies mechanics
- Calculator API → Gen 4 mechanics: applies mechanics
- Calculator API → Gen 5–6 mechanics: applies mechanics
- Calculator API → Gen 7–9 mechanics: applies mechanics
- Gen 7–9 mechanics → Mechanics helpers: uses helpers (evidence: `calc/src/mechanics/gen789.ts`)
- Calculator API → Damage result: returns result (evidence: `calc/src/index.ts`)
- Damage result → Result descriptions: builds descriptions (evidence: `calc/src/result.ts`)
