NEON RUNNER / SPRITEPILOT
Every sprite is vector art drawn in code. Every sound effect is synthesized in code.

DELIVERY
pack.json is the full inventory: dimensions, frames, fps, loop, anchor, and paths. Each asset has transparent 1x/2x PNG strips, lossless APNG preview, and frame-zero SVG. Tiles are 32/64 px. Anchors are normalized; use the anchor in pack.json for each asset. Characters face right; sprite padding/glow is not a collision boundary.
Loops sample t=i/N; one-shots sample t=i/(N-1), then hide on completion. fps=0 denotes static/indexed frames (buttons: normal/hover/pressed; digits: 0-9).

IMPORT
For the Phaser examples, copy the extracted kit contents (the folder containing pack.json) into a served folder named pack/.
Phaser 3: this.load.atlas('neon','pack/atlas-1x.png','pack/atlas-1x.json'); frame names are 'hero-run/000'. Create animations from pack.json, repeat=-1 only for loops. See every asset working in the playable demo: https://spritepilot.com/game-kits/neon-runner
Godot 4: SpriteFrames > Add frames from sprite sheet; horizontal cells=frames. Use listed fps and loop. CanvasItemMaterial Unshaded retains colors.
Unity: Texture Type Sprite, Multiple, Grid By Cell Size from manifest; pivot center (digits top left). Disable compression for neon edges; create clips at manifest fps, Loop Time only for loops.
Tiled: open tiles/neon-runner.tsj or maps/level-1.tmj / level-2.tmj. Tileset uses tiles.png, 32px cells, collision/property hints, animation references for mechanisms (32px palette thumbnails; native strips retain full dimensions), terrain edge masks (top=1,right=2,bottom=4,left=8), and object types. Both maps embed an identical TSJ definition for Phaser's standard JSON loader, while retaining the external tileset path in properties. Each map has its own embedded tileset; edits to the standalone TSJ do not automatically update those copies. Keep their tile definitions in sync when editing in Tiled. Object-layer mechanisms/enemies/collectibles use the included atlas animations. One-way platforms collide only from above; ladder regions are climbable. Import TMJ into Phaser with load.tilemapTiledJSON and addTilesetImage('Neon Runner','tiles').
Godot/Unity: Tiled maps require your chosen importer or custom object-layer translation; the PNG/JSON assets work independently of a Tiled importer.

ALPHA / ATLAS
PNG is straight RGBA; allow the engine to premultiply on upload. Do not premultiply the files twice. Normal alpha for characters/terrain, optional additive blend for sparks. Atlases are TexturePacker JSON Hash, unrotated, trimmed, original source sizes, 2px transparent gutters, maximum 4096. Disable mipmaps or use separate padded strips for mipmapped assets. Backgrounds repeat horizontally, not vertically.

LICENSE
Free use in personal and commercial projects; standalone redistribution and resale are prohibited. See LICENSE.txt.

SOUND EFFECTS
Every sound is synthesized in code.
30 sound families / 44 recordings. WAV: mono, 44.1 kHz, signed 16-bit PCM. OGG: Opus 96 kbps. MP3: 192 kbps. sfx/sfx.json lists files, durations, loop flags, suggested relative gain, concurrency and variants. EBU R128 integrated loudness, silence padded to 500 ms only for events shorter than 500 ms; target -20 LUFS (+/- 3 LU), source true peak <= -2.5 dBTP and all delivery codecs <= -1 dBTP.
The one-second laser-hum WAV has an exact periodic boundary. Loop laser-hum.wav for a seamless hum (Phaser: { loop: true }). Use WAV for sample-accurate loops (MP3 encoder padding and engine decoding can disrupt looping).
Phaser 3: with Phaser loaded and the kit contents served from pack/, this complete example plays jump on click or tap:
new Phaser.Game({
  type: Phaser.AUTO,
  width: 320,
  height: 180,
  scene: {
    preload() {
      this.load.audio('jump', ['pack/sfx/jump.ogg', 'pack/sfx/jump.mp3', 'pack/sfx/jump.wav']);
    },
    create() {
      this.add.text(20, 70, 'Click or tap to play');
      const cue = this.sound.add('jump', { volume: 0.55 });
      this.input.on('pointerdown', () => {
        if (!cue.isPlaying) cue.play();
      });
    }
  }
});
Start audio after the first click/tap so the browser can unlock it. Cap simultaneous copies of each sound using the concurrency value in sfx/sfx.json; this example allows one copy at a time.
Godot 4: import WAV as AudioStreamWAV, use AudioStreamPlayer, volume_db = linear_to_db(suggestedVolume). Enable forward loop only on laser-hum.wav, loop begin=0/end=44100; keep one-shots nonlooping.
Unity: import WAV as AudioClip (Decompress On Load for short cues); AudioSource.PlayOneShot(clip, suggestedVolume); use a dedicated AudioSource with loop=true for laser hum. Start/stop with a short volume ramp.
Shard levels 1/2/3 rise in pitch; variants stay close to each base pitch. Use suggestedVolume for quieter UI and weapon cues; the files themselves are level matched.

Music
-----
Three original tracks performed with software instruments, supplied as stereo OGG and MP3.
Runner Menu Loop: menu, 69.818 seconds, 110 BPM, G major, loop.
Runner Level Loop: gameplay, 109.714 seconds, 140 BPM, G major, loop.
Runner Level Complete Sting: sting, 4.600 seconds, 140 BPM, G major, one-shot.
music/music.json lists exact sample counts, loop points in seconds and suggested volumes.
OGG files are Ogg Vorbis — Godot, Unity and Phaser import them directly; use OGG for seamless loops. Some browsers need the MP3 fallback; some engines ignore MP3 gapless headers.
Phaser: use Web Audio (noAudio is false, disableWebAudio is false); supply OGG first and MP3 as a browser fallback, then play with loop: true. For explicit loop points, decode into an AudioBufferSourceNode, set loopStart = 0 and loopEnd from music.json, then loop = true. Never restart from an ended callback.
Godot: import the OGG directly as AudioStreamOggVorbis, enable loop with loop_offset = 0 for the two full-clip loops, and play through AudioStreamPlayer. Leave loop disabled for the sting.
Unity: import the OGG directly as AudioClip with Decompress On Load, disable Load In Background and enable Preload Audio Data. Use AudioSource.loop for the two full-clip loops; leave it off for the sting.
Keep a separate music volume, fade between menu and gameplay over about 0.8 seconds, and stop or duck gameplay for the one-shot sting.
