Skip to content

Known Gaps

Arnel Robles edited this page Oct 2, 2026 · 5 revisions

Known Gaps

Things the code does not do, or does differently from what a name or a type suggests. Checked against 2.4.0. Each pairs with the page that covers the feature.

Type declarations

types/index.d.ts is written by hand. A test checks which names it declares, and the engine shapes fixed in 2.3.1 are pinned by a runtime test. Other member shapes are not checked against the runtime, so report a mismatch if you find one.

Physics

  • Box against circle is never detected.
  • onCollisionEnter on a component fires every fixed step while two colliders overlap, not once on entry, and components get no exit callback. For once per overlap, listen for collision_enter and collision_exit on the kernel event bus (2.4.0). See Engine.
  • raycast returns null. setGravity does nothing.
  • Every pair of colliders is tested each step.

Themes do not restyle the overlay

dopaminejs-themes sets --dopamine-* variables. The core stylesheet reads none of them. See Themes.

Sound

  • preloadSounds called before the audio context exists (before the first play or playTone) resolves without fetching anything. Since 2.4.0 it registers its keys, so the files load when the context starts. See Sound.
  • Sound packs are tone definitions. Nothing in the core consumes them, and SoundManager has no setSoundPack. See Plugin: Sound Packs.

Plugins

  • plugins.remove(name) unregisters the systems the plugin registered during init() (2.4.0). Two cases are not tracked: a system registered after init(), and one registered while two useAsync() inits overlapped. Those stay the plugin's to unregister in destroy().
  • WebGLParticlePlugin registers nothing when WebGL is missing. There is no canvas fallback.
  • Removing HowlerAudioPlugin does not bring back an audio system it replaced.
  • The WebGL particle system has no sprites, no fire and no starBurst, so it cannot be passed to GameUI.
  • BattlePassPlugin keeps announced tiers in memory. They fire again after a reload.
  • RewardMiddleware is not connected to RewardSystem. You call it yourself.
  • WebhookIntegration does not retry a failed request.

React

dopaminejs-react ships no TypeScript declarations. Its actions return undefined until the provider's effect has run. See React.

Rewards

  • One player per storage prefix. For several profiles on one device, give each its own DataService prefix.
  • Levels never go down, even when XP is removed.
  • addXP gets no streak multiplier. Only recordGame does.
  • Progress is stored on the device. Nothing syncs between devices unless you supply a storage adapter that does.

Docs in the repo

docs/MIGRATION.md on main is corrected, and the themes README on npm (dopaminejs-themes 1.0.2) says that the core stylesheet does not read the theme variables. See Themes.

Clone this wiki locally