CompactAI's picture
Upload 126 files
f6b8770 verified
|
Raw
History Blame Contribute Delete
4.28 kB

NEONSTRIKE — ray-traced arena FPS with online multiplayer

Fast-paced CS-style shooter where the entire frame is ray traced in a WebGL2 fragment shader. No triangles are rasterized: every pixel casts a primary ray against the analytic scene (level AABBs + multi-sphere humanoid characters), then shadow rays, ambient-occlusion rays, and up to 3 reflection bounces. Per-map themes tint the sky, fog, haze, and neon emissives.

Run

cd app && npm install && npm start    # serves game + WebSocket rooms on :3002

Or launch from the AI Archives hub, which starts it automatically.

Game

  • Maps: pick on the main menu.
    • VECTOR — neon night three-lane arena (mid + long A + long B), two sites.
    • FOUNDRY — ember-lit furnace hall, raised central platform, ring corridor.
    • CANOPY — violet dusk rooftops: islands, bridges, a lower street level.
  • Solo: CS rounds vs bots — buy phase → live → end, first to 8. Economy: $800 start, +$300/kill, +$3250 win, +$1400 loss.
  • Multiplayer: free-for-all deathmatch, first to 15 kills. Create a room, share the 4-letter code, friends join from the MULTIPLAYER menu. The Node WebSocket server is authoritative for damage, kills, scores, and respawns; clients hit-test locally and report, positions sync at 15 Hz with interpolation (on a timer, so backgrounded tabs keep syncing). TAB shows the scoreboard.
  • Characters: humanoid sphere rigs (head, emissive visor, torso, hips, gun hand) with per-player tint colors, fully ray traced like the world.
  • Bots: waypoint-graph patrol, distance + view-cone + ray-traced LOS spotting, reaction delay, strafing return fire. 4 difficulty tiers.
  • Settings (Esc): 36 options across graphics (resolution scale, RT bounces, shadow mode/samples, AO, fog, frame cap…), audio, controls, crosshair (style/size/gap/color/dynamic), game (bot count, difficulty, radar, damage numbers…). Quality presets potato→ultra. Persisted to localStorage.

Everything is generated at runtime: textures are procedural GLSL (triplanar brick/planks/brushed metal/hazard), all 21 SFX are synthesized Float32Array DSP (verifiable headlessly), the ambient loop included.

Visuals

  • Ray tracing: primary + shadow + AO + reflection rays per pixel; characters are sphere/capsule rigs intersected analytically, with walk-cycle limb animation driven by movement.
  • HDR bloom: the scene renders linear HDR to a half-float framebuffer; a bright-pass + separable gaussian blur (quarter res) builds the glow and a composite pass applies ACES tonemapping and vignette. Off/low/high setting.
  • Blender Cycles assets (blender/): all 7 weapons are modeled procedurally in Python and path-traced into transparent viewmodel sprites and buy-card art (assets/weapons/); each map is rebuilt from its real geometry and rendered as an isometric diorama for the map picker (assets/maps/). Re-render with: blender -b -P blender/weapons.py -- app/public/assets/weapons
  • FX: 3D impact sparks with gravity, muzzle flash anchored to the sprite barrel, inertial weapon sway, nebula sky with theme-tinted haze.

Playtest

test/playtest.mjs runs the real game in headless Chrome (SwiftShader WebGL2) and verifies:

  1. boot with zero JS errors
  2. menu + 5 in-game vantage screenshots (pixel variance, not-black, sky≠floor)
  3. every procedural material renders a distinct swatch
  4. every SFX buffer has sane duration/peak/RMS
  5. gameplay: hitscan damage, ammo, bot navigation, bots engaging the player, round win on elimination, money payouts, buy-phase purchase flow
  6. settings: bounces visibly change pixels, resolution scale resizes the RT target, persistence
  7. perf snapshot per quality preset (software-rendering floor)
  8. maps: all three render, are >90% pixel-distinct from each other, bots navigate each; character close-up renders
  9. multiplayer: two real browser clients — create room, join by code, see each other, cross-client hit applies server damage, kill credits the scoreboard, victim respawns at full hp
cd test && npm install && npm run playtest

Latest result: 86/86 checks passed — see playtest/report.md and screenshots in playtest/.