npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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

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-core
import {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.