miaoda-game-lighting-core
v0.3.0
Published
Engine-agnostic tile-level gameplay lighting on a grid — multi-source light with color mixing and an optional radiosity-style bounce pass. Built on rot-js's Lighting + FOV. Feed it walls + light sources, read back a lit color per tile; pairs with miaoda-g
Downloads
641
Maintainers
Readme
miaoda-game-lighting-core
Engine-independent gameplay lighting on a tile grid. Use it when rules need to know how bright and what color each tile is; it does not create renderer lights or draw anything.
pnpm add miaoda-game-lighting-coreimport {LightMap} from 'miaoda-game-lighting-core';
const lights = new LightMap({width: map.width, height: map.height, isOpaque: (x, y) => map.get(x, y) === 'wall'});
lights.setLight(torch.x, torch.y, [255, 200, 120]);
lights.compute();
const color = lights.colorAt(player.x, player.y); // RGB, each 0..255
const canSee = lights.isLit(player.x, player.y, 40);Coordinates are integer tile coordinates. colorAt returns [r, g, b] and [0, 0, 0] outside the map or in darkness. levelAt returns brightness 0..255; isLit(x, y, threshold?) compares against a threshold.
Configure and update
LightMap requires positive width/height and an isOpaque(x, y) predicate. Optional reflectivity returns 0..1, passes controls bounced light (1 is direct light), and range limits reach in tiles.
Use setLight, setLights, clearLights, and listLights to manage [r,g,b] sources. Call compute() after changes; it is cheap when nothing is dirty. When walls change, call invalidate() (or provide the new opacity predicate) before computing again. LightMap.mix(a, b) additively combines colors and clamps channels to 255.
Pair this with miaoda-game-grid-vision-core: FogMap answers visibility/exploration, while LightMap answers illumination. The game decides how those values affect stealth, rendering, or rules.
