Skip to content

Web parity: reconcile June web branches into main - #266

Merged
Vodkadav merged 4 commits into
mainfrom
feat/web-parity-reconcile
Jul 17, 2026
Merged

Web parity: reconcile June web branches into main#266
Vodkadav merged 4 commits into
mainfrom
feat/web-parity-reconcile

Conversation

@Vodkadav

Copy link
Copy Markdown
Owner

Audited all 9 commits on the four old web branches (feat/web-export, web-export-deploy, web-reconcile, web-reconcile-256): 4 ported, 5 already-in-main/superseded — full audit table in the plan/branch commits.

Ported so the arcade WASM export ships from main alone:

  • csproj/Program.cs/sln web bits + Bootstrap web guards (Sentry + GoDotTest excluded on GODOT_WEB)
  • EntityId: crypto-free monotonic ids on web (Guid.NewGuid is constant under WASM — silently broke all combat), Guid.NewGuid elsewhere; post-July call sites (NetPowerup, PowerupDirector) covered
  • SfxPool/TranslationLoader GD.Load fallbacks for exported builds
  • Deterministic web arena seed (HashCode.Combine(EntityId.Next(), UtcNow.Ticks))
  • The quiet 4.4 KB cartoon-pew fire.ogg; FireOffsetDb re-levelled −20 → −6 dB (owner-ear-gated)
  • docs/web-export.md rewritten to match main

Web export smoke-built: 53.7 MB index.wasm + 51.2 MB index.pck (managed C# present). All four xUnit suites + 195 headless GoDotTest green (verified independently by orchestrator).

🤖 Generated with Claude Code

DM-unit and others added 4 commits July 17, 2026 15:38
…ision)

Rebuild p8/web-export-refresh cleanly on top of origin/main (e138c1e) so the
WASM build carries the modern multiplayer lobby (#245/#246), the slimmed title
menu / in-lobby map picking (#248), the fixed-timestep swept-collision combat
(#243), and the 2026-07-04 gameplay + leaderboard batches — none of which were
on the old web branch.

The prior branch had diverged with parallel refactors (a time-less
KillStreakTracker, an inline sim-timestep loop, ShowEnemyNames=true) that main
superseded; those are dropped. Only the genuinely web-essential layer is
re-applied on top of pristine main, all GODOT_WEB-gated or additive so desktop /
Android / test builds are byte-identical to main:

- Build config: Program.cs (WASM entry point), TankGame.sln, and the csproj web
  PropertyGroup/ItemGroup (OutputType=Exe, WasmEnableThreads, GODOT_WEB define,
  Sentry + GoDotTest excluded on web, trimmer roots).
- export_presets.cfg: the [preset.1] Web export preset.
- EntityId.Next() replaces Guid.NewGuid() for entity ids + ArenaSeed — the WASM
  runtime's crypto RNG is unavailable, so Guid.NewGuid() returns a constant there
  (colliding ids break combat; a frozen ArenaSeed kills the random-map feature).
- Web resource fallbacks (not #if-gated, harmless on desktop): TranslationLoader
  loads imported .translation resources, SfxPool loads the imported AudioStream,
  Bootstrap skips Sentry/the test runner on web.
- fire.ogg recompressed (40 KB -> 4 KB) for the web bundle.

Verified: dotnet build 0/0; pure suite Architecture 14 / Domain 57 /
GameLogic 456 / Infrastructure 48; headless GoDotTest 172 — all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

# Conflicts:
#	client/export_presets.cfg
EntityId's web counter restarts at 0 every page load, so seeding the arena
from EntityId.Next().GetHashCode() alone rolled the identical "random"
arena (layout, AI names, personalities) every web session. Mix in wall-clock
ticks via HashCode.Combine — desktop stays effectively random, web now
varies per session.

Also update docs/web-export.md status header (branch is web-reconcile-256,
reconciled onto main — no longer the unmerged feat/web-export).

No regression test: the bug is cross-session determinism of a static seed
rolled from a process-lifetime counter + wall clock; not observable within
one in-process test run.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…efresh doc

Finish reconciling the June/July web branches onto main (on top of the two
cherry-picks e418ee0 + fc1e4e7):

- NetPowerup / PowerupDirector ids go through EntityId.Next() — both were added
  to main after the web branch diverged and still used Guid.NewGuid(), which is
  constant on the WASM runtime (colliding ids).
- SfxPool.FireOffsetDb −20 → −6 dB: the −20 was tuned for the old loud 40 KB
  fire clip; the 4.4 KB cartoon pew this branch restores is intrinsically much
  quieter. −6 keeps fire (the most frequent SFX) just under the other gameplay
  sounds; final level is owner-ear-gated.
- docs/web-export.md rewritten to match main: web layer lives on main, old
  branches superseded list, multiplayer milestone delivered (ADR-0019/0021),
  canvas_resize_policy + lobby HTTP + slot carry + name labels already on main.

Verified: Architecture 14 / Domain 69 / GameLogic 562 / Infrastructure 54;
headless GoDotTest 195 — all green. Web export smoke-built with the ComplexRobot
editor: index.wasm 53.7 MB + index.pck 51.2 MB (managed C# present).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Vodkadav
Vodkadav merged commit 51aa74e into main Jul 17, 2026
8 checks passed
@Vodkadav
Vodkadav deleted the feat/web-parity-reconcile branch July 17, 2026 13:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants