LDragon uses Chevrotain to define a lexer/parser capable of compiling a League of Legends champion spell description template into an abstract syntax tree (AST).
LDragon can run in the browser, checkout the live demo!
npm install @blakearoberts/ldragon --save
import { ChampionBin, FontConfig, visit } from '@blakearoberts/ldragon';
const f = async <T,>(url: string) => {
const response = await fetch(url, options)
if (!response.ok) {
throw new Error(response.statusText);
}
return (await response.json()) as T;
}
const bin = await f<ChampionBin>(
'https://raw.communitydragon.org/latest/game/data/characters/aatrox/aatrox.bin.json');
const fontConfig = await f<FontConfig>(
'https://raw.communitydragon.org/latest/game/data/menu/main_en_us.stringtable.json');
const championId = 'Aatrox',
spellKey = 'Characters/Aatrox/Spells/AatroxPassiveAbility/AatroxPassive',
tooltip = fontConfig.entries['passive_aatroxpassive_tooltip'];
const ast = visit(championId, spellKey, bin, fontConfig, tooltip);
console.log(ast);
Checkout the example React app for a simple way to render an LDragon AST to the DOM. This example is built into a static site and hosted via this project's GitHub Pages.
The AST returned from parsing a spell is comprised of nodes with relationships demonstrated by the following directed acyclic graph:
graph LR;
D[DescriptionNode]
TX[TextNode]
B[BreakNode]
EL[ElementNode]
EX[ExpressionNode]
TP[TemplateNode]
DV[DataValueIdentifier]
GC[GameCalculationIdentifier]
GM[GameCalculationModifiedIdentifier]
EF[EffectIdentifier]
C[ConstantValue]
A[AbilityLevelValue]
CL[CharLevelValue]
CB[CharLevelBreakpointsValue]
subgraph Nodes
D --> TX & B & EL & EX & TP
EL --> TX & EX & TP
end
subgraph Identifiers
EX --> DV & GC & GM & EF
GC --> DV & EF
GM --> GC
end
subgraph Values
DV --> C & A
EF --> C & A
GC -- part --> C & A & CL & CB
GM -- multiplier --> C
end
Contributions are welcome! There are plenty of edge cases this library fails to parse. Issues and pull requests would be greatly appreciated!
To build and compile the TypeScript sources to JavaScript use:
npm run build
To run the unit tests use:
npm test
This project is licensed under the terms of the MIT license.