Stagger territory tile rendering across frames#3973
Conversation
WalkthroughTerritoryPass and TrailPass rendering layers are refactored to split state ownership: TerritoryPass focuses on tiles and introduces drip-bucket buffering for staggered frame uploads, while TrailPass takes full ownership of trail state with CPU storage and dirty-row tracking. Renderer orchestrates the split and manages spawn-phase state. Configuration schema is extended for drip-bucket settings. ChangesTile and Trail Rendering Refactoring
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Suggested labels
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/client/render/CLAUDE.md`:
- Around line 124-128: The doc comment in CLAUDE.md incorrectly states the
default drip bucket count as 12; update the documentation to reflect the actual
default of 9 (tileDrip.bucketCount set in render-settings.json). Edit the
paragraph referencing TerritoryPass, applyLiveDelta, drainDripBucket and
uploadTextures to replace "default 12" with "default 9" and, if present, add a
short note pointing readers to render-settings.json for tuning.
In `@src/client/render/gl/passes/TrailPass.ts`:
- Around line 95-119: setLiveRef and uploadFullState switch the source of trail
data but currently keep previous dirty-row bounds, which can cause only stale
partial ranges to be flushed; reset the dirty-row bounds when switching to a
full or fresh live state. In setLiveRef(trailState: Uint8Array) and
uploadFullState(trailState: Uint8Array) set this.dirtyRowMin to a large sentinel
(e.g. +Infinity or Number.MAX_SAFE_INTEGER) and this.dirtyRowMax to a small
sentinel (e.g. -Infinity or -1) so any queued partial range is cleared before
marking this.trailsDirty = true; ensure applyLiveDelta still updates bounds
normally.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 667b984d-bb1d-49e4-a45e-f61039b46e5e
📒 Files selected for processing (6)
src/client/render/CLAUDE.mdsrc/client/render/gl/RenderSettings.tssrc/client/render/gl/Renderer.tssrc/client/render/gl/passes/TerritoryPass.tssrc/client/render/gl/passes/TrailPass.tssrc/client/render/gl/render-settings.json
| Live tile changes are drip-applied per render frame inside `TerritoryPass` | ||
| (see `applyLiveDelta` + `drainDripBucket` in `gl/passes/TerritoryPass.ts`). | ||
| Each tick's `changedTiles` is hashed by `ref` into N round-robin buckets | ||
| (`tileDrip.bucketCount`, default 12); the renderer drains one bucket per | ||
| 60Hz frame in `uploadTextures()`. The stable per-ref hash guarantees that |
There was a problem hiding this comment.
Fix the documented default bucket count.
Line 127 says default is 12, but this PR sets tileDrip.bucketCount to 9 in render-settings.json. Please align the doc so tuning guidance is accurate.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/client/render/CLAUDE.md` around lines 124 - 128, The doc comment in
CLAUDE.md incorrectly states the default drip bucket count as 12; update the
documentation to reflect the actual default of 9 (tileDrip.bucketCount set in
render-settings.json). Edit the paragraph referencing TerritoryPass,
applyLiveDelta, drainDripBucket and uploadTextures to replace "default 12" with
"default 9" and, if present, add a short note pointing readers to
render-settings.json for tuning.
| setLiveRef(trailState: Uint8Array): void { | ||
| this.liveTrailRef = trailState; | ||
| this.trailsDirty = true; | ||
| } | ||
|
|
||
| /** Live trail delta: update live ref + accept dirty row range from TrailManager. */ | ||
| applyLiveDelta( | ||
| trailState: Uint8Array, | ||
| dirtyRowMin: number, | ||
| dirtyRowMax: number, | ||
| ): void { | ||
| this.liveTrailRef = trailState; | ||
| if (dirtyRowMax >= 0) { | ||
| this.dirtyRowMin = Math.min(this.dirtyRowMin, dirtyRowMin); | ||
| this.dirtyRowMax = Math.max(this.dirtyRowMax, dirtyRowMax); | ||
| } | ||
| this.trailsDirty = true; | ||
| } | ||
|
|
||
| /** Full trail state upload (on seek). */ | ||
| uploadFullState(trailState: Uint8Array): void { | ||
| this.liveTrailRef = null; | ||
| this.cpuTrailState.set(trailState); | ||
| this.trailsDirty = true; | ||
| } |
There was a problem hiding this comment.
Reset dirty-row bounds on full/snapshot trail uploads.
Line 95 and Line 115 switch upload source to full/live state, but keep old dirty-row bounds. If a partial range was queued before this, the next flush can upload only stale rows and leave the rest of trailTex outdated.
Suggested fix
setLiveRef(trailState: Uint8Array): void {
this.liveTrailRef = trailState;
+ this.dirtyRowMin = Infinity;
+ this.dirtyRowMax = -1; // force full upload next flush
this.trailsDirty = true;
}
@@
uploadFullState(trailState: Uint8Array): void {
this.liveTrailRef = null;
this.cpuTrailState.set(trailState);
+ this.dirtyRowMin = Infinity;
+ this.dirtyRowMax = -1; // force full upload next flush
this.trailsDirty = true;
}
@@
clear(): void {
this.cpuTrailState.fill(0);
+ this.dirtyRowMin = Infinity;
+ this.dirtyRowMax = -1; // force full upload next flush
this.trailsDirty = true;
}Also applies to: 127-131
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/client/render/gl/passes/TrailPass.ts` around lines 95 - 119, setLiveRef
and uploadFullState switch the source of trail data but currently keep previous
dirty-row bounds, which can cause only stale partial ranges to be flushed; reset
the dirty-row bounds when switching to a full or fresh live state. In
setLiveRef(trailState: Uint8Array) and uploadFullState(trailState: Uint8Array)
set this.dirtyRowMin to a large sentinel (e.g. +Infinity or
Number.MAX_SAFE_INTEGER) and this.dirtyRowMax to a small sentinel (e.g.
-Infinity or -1) so any queued partial range is cleared before marking
this.trailsDirty = true; ensure applyLiveDelta still updates bounds normally.
commit 513057a Author: VariableVince <24507472+VariableVince@users.noreply.github.com> Date: Wed May 20 03:17:26 2026 +0200 WebGL: show alliance request+duration icon, show ally and team mate targets too, some optimization (#3971) Show nuke icons during replay too (when there's no localPlayer). Show alliance request envelope icon, and duration in alliance icon (weren't calculated yet). Show ally and team mates' targets too (weren't calculated yet). Remove unnecessary allocations. Nukes loop allocated two new sets, transitive targets was a new set and now uses predicate with fallback to localPlayer.targets, localPlayer.allies and localPlayer.embargoes were both put in new set instead of using .includes directly. - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced regression is found: tryout33 commit c82b078 Author: Evan <evanpelle@gmail.com> Date: Tue May 19 17:35:25 2026 -0700 Stagger territory tile rendering across frames (#3973) relates to #893 Territory updates were uploaded in one shot per game tick, producing a 10 Hz tile update which looked choppy. This change drips each tick's tile changes across the ~6 render frames between ticks so the fill flows continuously instead of stepping. Inside TerritoryPass, each changed tile is hashed by ref into one of N buckets (configurable via tileDrip.bucketCount, set to 9 — gives ~50 ms of jitter headroom over the tick period without making attacks feel laggy). One bucket drains per render frame. The stable per-ref hash keeps repeated updates to the same tile in arrival order, so the latest owner always wins. While in there, moved trail state ownership out of TerritoryPass and into TrailPass where it belongs — the territory shader doesn't sample trailTex, so the colocation was just code-reuse drift. - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced regression is found: evan commit 6a8b6a1 Author: RickD004 <realtacoco@gmail.com> Date: Tue May 19 15:40:07 2026 -0600 Changes for Rebalancing the Taiwan Strait map (#3970) Resizes the Taiwan Strait map for v32, to rebalance it for 2 team games: Yesterday the map was tested in a stream and it turned out to be unbalanced due to the size difference of the landmasses: https://youtu.be/gildSwTdd4I?t=2516 Adds Team spawnzones for 2 teams. Also removes and adds new nations , suggested by its map creator crunchybbbbb_59469 on Discord - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced regression is found: tri.star1011 Taiwan Strait map by crunchybbbbb_59469 on Discord, who i worked with in this rebalance --------- Co-authored-by: FloPinguin <25036848+FloPinguin@users.noreply.github.com> commit 0ace428 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon May 18 19:43:28 2026 -0700 Bump the npm_and_yarn group across 1 directory with 3 updates (#3964) Bumps the npm_and_yarn group with 3 updates in the / directory: [protobufjs](https://github.com/protobufjs/protobuf.js), [@opentelemetry/exporter-logs-otlp-http](https://github.com/open-telemetry/opentelemetry-js) and [@opentelemetry/exporter-metrics-otlp-http](https://github.com/open-telemetry/opentelemetry-js). Removes `protobufjs` Updates `@opentelemetry/exporter-logs-otlp-http` from 0.216.0 to 0.218.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js/releases">@opentelemetry/exporter-logs-otlp-http's releases</a>.</em></p> <blockquote> <h2>experimental/v0.218.0</h2> <h2>0.218.0</h2> <h3>:rocket: Features</h3> <ul> <li>feat(otlp-transformer): replace protobufjs metrics serialization with custom implementation <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6629">#6625</a> <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(configuration): show all config validation errors, if there are multiple <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6683">#6683</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>feat(sdk-node): allow startNodeSDK() without an arg <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6688">#6688</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> </ul> <h3>:house: Internal</h3> <ul> <li>refactor(sdk-logs): alias <code>LoggerProviderConfig</code> to <code>LoggerProviderOptions</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6691">#6691</a> <a href="https://github.com/david-luna"><code>@david-luna</code></a></li> <li>refactor(sdk-logs): use <code>Logger.enabled()</code> within <code>Logger.emit()</code> implementation <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6680">#6680</a> <a href="https://github.com/david-luna"><code>@david-luna</code></a></li> </ul> <h2>experimental/v0.217.0</h2> <h2>0.217.0</h2> <h3>:rocket: Features</h3> <ul> <li>feat(otlp-transformer): replace protobufjs trace serialization with custom implementation <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6625">#6625</a> <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(configuration): auto-generate TypeScript types from OTel declarative config JSON schema (stable v1.0.0) using <code>json-schema-to-typescript</code> and <code>ajv</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6533">#6533</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(configuration, sdk-node): <code>startNodeSDK()</code> code path now uses <code>log_level</code> configuration to setup a DiagConsoleLogger <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6668">#6668</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>Note that allowed values for <code>log_level</code> in a configuration YAML file are <em>not</em> the same set as for <code>OTEL_LOG_LEVEL</code>. Use <code>log_level: trace</code> to see <em>all</em> logs (equivalent of <code>OTEL_LOG_LEVEL=ALL</code>). Use <code>log_level: fatal</code> to effectively disable the SDK's internal diagnostic logger (equivalent of <code>OTEL_LOG_LEVEL=NONE</code>).</li> <li>If <code>log_level</code> is not specified, a diagnostic console logger at "info" level will be setup.</li> <li>An invalid YAML config file will now result in a noop OTel SDK.</li> </ul> </li> </ul> <h3>:bug: Bug Fixes</h3> <ul> <li>fix(configuration): do not validate <code>OTEL_CONFIG_FILE</code> value before using it for file config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6643">#6643</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): improve how 'additionalProperties' in JSON schema is translated to TS types <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6650">#6650</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): remove stripMinItems and preprocessNullArrays from validation/parsing <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6657">#6657</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): improve handling of enums in generated types <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6659">#6659</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): improve the technique for removing '| null' on types the JSON Schema <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6662">#6662</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(sampler-jaeger-remote): add missing axios dep <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6656">#6656</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(exporter-prometheus): handle malformed URLs in Prometheus exporter request handler <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6674">#6674</a> <a href="https://github.com/homanp"><code>@homanp</code></a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/06ad0eaaecbd49f5ead871325f852cc2a3454079"><code>06ad0ea</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6703">#6703</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/38ca257e64ebd13f5603d5539f8a48d6d9232037"><code>38ca257</code></a> feat(otlp-transformer): replace protobufjs metrics serialization with custom ...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/013c60085b84351a4c1e4e4f79e3dd67c56661cd"><code>013c600</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6699">#6699</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/b7a0c63bde39d7916fdb73cbb3d64cf1c93282c5"><code>b7a0c63</code></a> feat(semantic-conventions): update semantic conventions to v1.41.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6695">#6695</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/774143b2c6667c6537c000ab48ea5ce998278ca0"><code>774143b</code></a> chore(renovate): add minimumReleaseAge to config (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6697">#6697</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/e0dafe0d9fadaccf7dd8d7b02dd85531356e2ac1"><code>e0dafe0</code></a> fix(otlp-exporter-base): remove brackets from IPv6 hostname in HTTP transport...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/f804c93d1d6d903036b8bf38f8c3713dbbaf0360"><code>f804c93</code></a> chore(deps): update github/codeql-action digest to 68bde55 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6682">#6682</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/95e48e7afcc475ded350b95b43070c54591ecbbb"><code>95e48e7</code></a> refactor(sdk-logs): alias <code>LoggerProviderConfig</code> to <code>LoggerProviderOptions</code> (...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/907b627d9ada25844b0f06551ecd9bbda5c0ea4f"><code>907b627</code></a> feat(sdk-node): allow startNodeSDK() without an arg (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6688">#6688</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/0d1526198fafe7f90078ff353103d0427e6c64d4"><code>0d15261</code></a> docs: Add SIG meeting info and welcoming language (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6689">#6689</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-js/compare/experimental/v0.216.0...experimental/v0.218.0">compare view</a></li> </ul> </details> <br /> Updates `@opentelemetry/exporter-metrics-otlp-http` from 0.216.0 to 0.218.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-js/releases">@opentelemetry/exporter-metrics-otlp-http's releases</a>.</em></p> <blockquote> <h2>experimental/v0.218.0</h2> <h2>0.218.0</h2> <h3>:rocket: Features</h3> <ul> <li>feat(otlp-transformer): replace protobufjs metrics serialization with custom implementation <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6629">#6625</a> <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(configuration): show all config validation errors, if there are multiple <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6683">#6683</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>feat(sdk-node): allow startNodeSDK() without an arg <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6688">#6688</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> </ul> <h3>:house: Internal</h3> <ul> <li>refactor(sdk-logs): alias <code>LoggerProviderConfig</code> to <code>LoggerProviderOptions</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6691">#6691</a> <a href="https://github.com/david-luna"><code>@david-luna</code></a></li> <li>refactor(sdk-logs): use <code>Logger.enabled()</code> within <code>Logger.emit()</code> implementation <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6680">#6680</a> <a href="https://github.com/david-luna"><code>@david-luna</code></a></li> </ul> <h2>experimental/v0.217.0</h2> <h2>0.217.0</h2> <h3>:rocket: Features</h3> <ul> <li>feat(otlp-transformer): replace protobufjs trace serialization with custom implementation <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6625">#6625</a> <a href="https://github.com/pichlermarc"><code>@pichlermarc</code></a></li> <li>feat(configuration): auto-generate TypeScript types from OTel declarative config JSON schema (stable v1.0.0) using <code>json-schema-to-typescript</code> and <code>ajv</code> <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6533">#6533</a> <a href="https://github.com/MikeGoldsmith"><code>@MikeGoldsmith</code></a></li> <li>feat(configuration, sdk-node): <code>startNodeSDK()</code> code path now uses <code>log_level</code> configuration to setup a DiagConsoleLogger <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6668">#6668</a> <a href="https://github.com/trentm"><code>@trentm</code></a> <ul> <li>Note that allowed values for <code>log_level</code> in a configuration YAML file are <em>not</em> the same set as for <code>OTEL_LOG_LEVEL</code>. Use <code>log_level: trace</code> to see <em>all</em> logs (equivalent of <code>OTEL_LOG_LEVEL=ALL</code>). Use <code>log_level: fatal</code> to effectively disable the SDK's internal diagnostic logger (equivalent of <code>OTEL_LOG_LEVEL=NONE</code>).</li> <li>If <code>log_level</code> is not specified, a diagnostic console logger at "info" level will be setup.</li> <li>An invalid YAML config file will now result in a noop OTel SDK.</li> </ul> </li> </ul> <h3>:bug: Bug Fixes</h3> <ul> <li>fix(configuration): do not validate <code>OTEL_CONFIG_FILE</code> value before using it for file config <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6643">#6643</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): improve how 'additionalProperties' in JSON schema is translated to TS types <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6650">#6650</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): remove stripMinItems and preprocessNullArrays from validation/parsing <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6657">#6657</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): improve handling of enums in generated types <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6659">#6659</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(configuration): improve the technique for removing '| null' on types the JSON Schema <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6662">#6662</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(sampler-jaeger-remote): add missing axios dep <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6656">#6656</a> <a href="https://github.com/trentm"><code>@trentm</code></a></li> <li>fix(exporter-prometheus): handle malformed URLs in Prometheus exporter request handler <a href="https://redirect.github.com/open-telemetry/opentelemetry-js/pull/6674">#6674</a> <a href="https://github.com/homanp"><code>@homanp</code></a></li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/06ad0eaaecbd49f5ead871325f852cc2a3454079"><code>06ad0ea</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6703">#6703</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/38ca257e64ebd13f5603d5539f8a48d6d9232037"><code>38ca257</code></a> feat(otlp-transformer): replace protobufjs metrics serialization with custom ...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/013c60085b84351a4c1e4e4f79e3dd67c56661cd"><code>013c600</code></a> chore: prepare next release (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6699">#6699</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/b7a0c63bde39d7916fdb73cbb3d64cf1c93282c5"><code>b7a0c63</code></a> feat(semantic-conventions): update semantic conventions to v1.41.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6695">#6695</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/774143b2c6667c6537c000ab48ea5ce998278ca0"><code>774143b</code></a> chore(renovate): add minimumReleaseAge to config (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6697">#6697</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/e0dafe0d9fadaccf7dd8d7b02dd85531356e2ac1"><code>e0dafe0</code></a> fix(otlp-exporter-base): remove brackets from IPv6 hostname in HTTP transport...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/f804c93d1d6d903036b8bf38f8c3713dbbaf0360"><code>f804c93</code></a> chore(deps): update github/codeql-action digest to 68bde55 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6682">#6682</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/95e48e7afcc475ded350b95b43070c54591ecbbb"><code>95e48e7</code></a> refactor(sdk-logs): alias <code>LoggerProviderConfig</code> to <code>LoggerProviderOptions</code> (...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/907b627d9ada25844b0f06551ecd9bbda5c0ea4f"><code>907b627</code></a> feat(sdk-node): allow startNodeSDK() without an arg (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6688">#6688</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-js/commit/0d1526198fafe7f90078ff353103d0427e6c64d4"><code>0d15261</code></a> docs: Add SIG meeting info and welcoming language (<a href="https://redirect.github.com/open-telemetry/opentelemetry-js/issues/6689">#6689</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-js/compare/experimental/v0.216.0...experimental/v0.218.0">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/openfrontio/OpenFrontIO/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 6591b05 Author: RickD004 <realtacoco@gmail.com> Date: Mon May 18 20:43:02 2026 -0600 Adds map of Venice 🛶 (#3935) Adds map of Venice. A relatively small map (similar land area to World) for heavy trade and lots of boating. Because of the very low difference of elevation of the zone, terrain is instead used to show buildings. Map source from OpenStreetMap, already credited in CREDITS.md Very requested map, with 2 discord posts suggesting it with +15 upvotes each <img width="794" height="569" alt="image" src="https://github.com/user-attachments/assets/ca7d44f2-cfc9-4e93-b7d4-43dbe62f74d4" /> - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced regression is found: tri.star1011 commit 15ac42b Author: Ryan <7389646+ryanbarlow97@users.noreply.github.com> Date: Tue May 19 03:20:29 2026 +0100 streamer mode bugfix (#3953) fixes #3572 streamer mode bufix - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced regression is found: w.o.n commit a2aa782 Author: VariableVince <24507472+VariableVince@users.noreply.github.com> Date: Tue May 19 04:19:02 2026 +0200 Display player flags next to their names again (#3965) Display flags again. - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced regression is found: tryout33 commit 17e3ac4 Author: evanpelle <evanpelle@gmail.com> Date: Mon May 18 19:15:01 2026 -0700 make spawn glow follow the player's currently selected spawn tile Plumb spawnTile through PlayerUpdate / PlayerState / applyStateUpdate so the WebGL spawn overlay can read it directly. The glow was reading nameData.x/y (territory centroid for label placement) which only recomputes every 2 ticks and only when largestClusterBoundingBox has been updated by PlayerExecution — both lag the player's actual spawn click. Using spawnTile updates the same tick setSpawnTile() fires. Also adds spawnTile to diffPlayerUpdate / applyStateUpdate so changes after the initial full snapshot actually propagate (the recent diff-only PlayerUpdate path silently dropped any field not enumerated in those helpers). commit 0eb8578 Author: evanpelle <evanpelle@gmail.com> Date: Mon May 18 17:39:27 2026 -0700 Fix nations not spawning in singleplayer when player picks fast NationExecution gated its first SpawnExecution by the same attackRate/attackTick throttle used for AI actions, so a nation could wait up to ~100 ticks before scheduling its spawn. In singleplayer the human's spawn ends the spawn phase immediately, stranding any nation that hadn't yet reached its attackTick — on the next tick its NationExecution sees inSpawnPhase()=false and isAlive()=false (no tiles), and deactivates itself. First spawn now fires on tick 1, gated by a one-shot flag to avoid queuing duplicates. The attackRate cadence is preserved for subsequent re-spawns so nations still hop locations during the spawn phase.
relates to #893
Description:
Territory updates were uploaded in one shot per game tick, producing a 10 Hz tile update which looked choppy. This change drips each tick's tile changes across the ~6 render frames between ticks so the fill flows continuously instead of stepping.
Inside TerritoryPass, each changed tile is hashed by ref into one of N buckets (configurable via tileDrip.bucketCount, set to 9 — gives ~50 ms of jitter headroom over the tick period without making attacks feel laggy). One bucket drains per render frame. The stable per-ref hash keeps repeated updates to the same tile in arrival order, so the latest owner always wins.
While in there, moved trail state ownership out of TerritoryPass and into TrailPass where it belongs — the territory shader doesn't sample trailTex, so the colocation was just code-reuse drift.
Please complete the following:
Please put your Discord username so you can be contacted if a bug or regression is found:
evan