mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-21 10:53:31 +00:00
6c8ce958b2e94de2849015c2a2d7b58dd487101b
4036 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e938e5936b |
Add Graphics Settings name color toggle and unit tests
Adds a single "Name color" toggle (Colored / Black) to the Graphics Settings modal, backed by a `darkNames` boolean in the override schema that derives the five underlying name-rendering fields (fill/outline player-color flags + static outline RGB). Forcing the outline RGB to 0 in dark mode is what makes the shader's defaultFill ramp actually render black — flipping the boolean uniforms alone wasn't enough because the fill is derived from uOutlineColor when fillUsePlayerColor is false. Flips the render-settings.json defaults so black names are the renderer baseline; the modal's no-override state follows the JSON source of truth. Adds tests covering schema parse behavior and the generateRenderSettings derivation for each override field. |
||
|
|
4cee61c7d1 |
fix(render): keep build-cost chip a fixed screen size
Chip used a world-space scale and y-offset, so it shrank as the camera zoomed out and slid under the cursor. Now both the scale and the downward offset are divided by zoom each frame, mirroring the existing attack-troop-label pattern. Tunable via ghostCost in render-settings. |
||
|
|
20bc311caf |
Add Graphics Settings modal with live name-label tuning (#4065)
## Description:
- Add a user-facing **Graphics Settings** modal accessible from the
in-game Settings menu, with live preview as sliders change.
- First two knobs: **Name Scale** and **Minimum Name Size** (the
name-cull threshold).
- Overrides stored as a single JSON blob in `localStorage` under
`settings.graphics`, validated by a Zod schema
(`GraphicsOverridesSchema`). Future graphics knobs just extend the
schema + slider list.
## How it fits together
- `generateRenderSettings(overrides)` (`RenderSettings.ts`) — pure
function: clones `render-settings.json` defaults, layers overrides on
top, returns a fresh `RenderSettings`.
- `UserSettings.graphicsOverrides()` / `setGraphicsOverrides()` —
read/write the blob; falls back to `{}` on a missing/corrupt entry.
- `ClientGameRunner` listens for
`USER_SETTINGS_CHANGED_EVENT:settings.graphics`, regenerates, and
`Object.assign`s each category into the live `view.getSettings()` slice
so passes pick up the new values on the next frame (no renderer
reconstruction).
- Modal reads defaults straight from `render-settings.json` so there's
no duplication.
<img width="599" height="515" alt="Screenshot 2026-05-28 at 11 18 43 AM"
src="https://github.com/user-attachments/assets/263d7d91-10d8-4a66-a069-10015c735d60"
/>
## Please complete the following:
- [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
## Please put your Discord username so you can be contacted if a bug or
regression is found:
evan
|
||
|
|
8142bc1070 |
Add Render Debug GUI toggle to settings modal
The lil-gui render-settings panel (createDebugGui) has been an orphaned export since the WebGL renderer landed — no caller, no hotkey, no menu entry. Wire it to a button in SettingsModal that toggles the panel on and off, and group it with the existing Performance Overlay toggle under a new "Development Only" section above the Exit Game block. |
||
|
|
a5e28d81d2 |
fix(render): turn nuke range circle red when launch would break alliance
Wire targetingAlly through GhostPreviewData.rangeWarning so RangeCirclePass can color the blast-radius circle red instead of white when the ghosted nuke would trigger a traitor penalty. Restores behavior lost in the canvas→WebGL migration. |
||
|
|
21e42ce461 |
fix(render): only fire conquest FX for the local player's conquests
Skip ConquestEvent updates whose conquerorId isn't the local player so the gold popup + sword sprite only triggers on your own captures. |
||
|
|
9bf6b5af74 |
fix(render): only show transport attack rings for the local player's boats
Filter extractAttackRings to the local player's smallID so FxAttackRingPass only draws rings on the player's own transports. Drop the unused extractAttackRingsFromIds variant and the dead frame/index.ts barrel re-exports. |
||
|
|
23fbc3114a |
feat(render): fade railroad overlay near min zoom
Replace the hard zoom cutoff in RailroadPass with a linear alpha fade controlled by a new `railFadeRange` setting. Rails (and bridge pixels) ramp from invisible at `railMinZoom - railFadeRange` to fully opaque at `railMinZoom`, instead of popping in. Adds a uRailFade shader uniform and a debug slider. |
||
|
|
aa3959bffe |
feat: territory png based skins (#4006)
## Description: Add image-based territory skins as a new cosmetic type, rendered alongside the existing 1-bit patterns. Skins render a single PNG centered on each player's spawn tile — opaque pixels show the skin (multiplied by team color in team games, raw colors in FFA), transparent pixels and tiles outside the image bounds fall through to the regular player palette color. **Cosmetic plumbing** - `SkinSchema` in `CosmeticSchemas.ts`, optional `skins` map on `CosmeticsSchema` - `PlayerSkin`, `PlayerCosmetics.skin`, `PlayerCosmeticRefs.skinName` in `Schemas.ts` - Server-side resolution: `PrivilegeCheckerImpl.isSkinAllowed` (gated by `skin:*` / `skin:<name>` flares) - Client persistence: stored under `PATTERN_KEY` (`pattern:` and `skin:` share one slot — they're mutually exclusive) - `getPlayerCosmeticsRefs` only emits a `skinName` when cosmetics are loaded, the skin exists in the catalog, and the user has the right flare — otherwise drops the ref and clears storage **Renderer** - `SkinAtlasArray` — fixed `TEXTURE_2D_ARRAY`, 1024×1024 per layer, exact layer count allocated once at game start from the locked-in player set. No resize, no callbacks, no retained `HTMLImageElement`. Zero GPU cost when no players have skins (1×1 placeholder). - `skinLayerTex` (R8UI 4096×1) — per-player `layer + 1` (`0` = no skin) - `skinAnchorTex` (RG16UI 4096×1) — per-player spawn tile, so the PNG center anchors at each player's spawn (re-uploads when the player re-picks during spawn phase) - `WebGLFrameBuilder.syncPlayers` collects unique skin URLs on first sync and calls `view.initSkinAtlas(urls)` once; `clearCaches()` resets so seek/replay re-initializes - `territory.frag.glsl`: skin branch is mutually exclusive with patterns; bounds-checks UVs against `[0, 1]` so the image is a single stamp, not tiled; alpha-blends against the player palette color so transparent pixels and out-of-bounds tiles render as the regular player color **Hover highlight (global UX change, not skin-scoped)** - Existing hover highlight changed from "brighten toward white" to "saturation boost." Applies to all players regardless of skin/pattern/flat-color — looks better across the board. **UI** - `CosmeticButton` renders skins as a single `<img>` (object-contain) - `TerritoryPatternsModal` merges patterns + skins into one grid; single "default" tile clears both - Selecting a pattern clears the skin and vice versa (mutually exclusive) - `Store` pattern tab includes skin entries (purchasable, not-yet-owned) - `PatternInput` lobby button previews the active skin when one is set **Memory** - 0 skin players → ~4 bytes (placeholder) + ~40 KB fixed per-player tables - 1 skin player → ~5.6 MB GPU - 5 skin players → ~28 MB GPU - 10 skin players → ~56 MB GPU **Tests** - `tests/Privilege.test.ts`: 13 new cases covering `isSkinAllowed` (wildcard, exact-match, missing flare, missing skin, forged refs) and `isAllowed` integration (allowed/forbidden paths, short-circuit when invalid skin is paired with valid other cosmetics) ## Please complete the following: - [ ] I have added screenshots for all UI updates - [ ] 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 - [ ] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
ddf63066fa |
fix(game): patch Desync DoS vulnerability with strict majority consensus (#3956)
Resolves #3959 ## Description: This PR fixes a Denial of Service (DoS) vulnerability in 1v1 matches related to desync reporting. The `findOutOfSyncClients` logic previously forced a game-ending desync if half or more players reported conflicting hashes (`outOfSyncClients.length >= Math.floor(this.activeClients.length / 2)`). In a 1v1, this meant a single malicious player sending a bad hash could trigger a global desync, crashing their opponent's game session. The logic has been corrected to require a **strict majority** (`> Math.floor(this.activeClients.length / 2)`) to declare a lobby-wide desync. In a 1v1 game, a single malicious actor will now simply be flagged as the out-of-sync client and disconnected, allowing the honest player to continue their session uninterrupted. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: barfires Co-authored-by: Josh Harris <josh@wickedsick.com> |
||
|
|
172113193f |
Add May Labyrinth (#4002)
## Description: Labyrinth is a maze type map. My attempt at making a more chess style board for play. Games with bots appear stable at over 45min average run times. The map has been setup for team spawn zones for 2, 3, 4, 5, 6, and 7 teams. Some of the team spawns for odd numbers are experimental and I would like to see how they play out with live players. Additional nation names included. There are other design factors like each of the large squares being within the blast radius of a hydro; small islands are within the blast radius of nukes. This is meant as a slower playing game. My intentions are to get some sort of literal rotation of the map in the future if easily implemented. That way every time players load the game there would be some randomization. As an additional note one of my last edit to the map was the "+" shape to the islands to allow train passage. Zooming out I can see now that the pattern is squares and + through out. Did not fully intend on that, but it felt like good vibes. https://discord.com/channels/1284581928254701718/1293201128858587207/threads/1497062552784605316 https://www.youtube.com/watch?v=e8c-TylT4hs https://www.youtube.com/watch?v=0-yqrfr3nv0 ## Please complete the following: - [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 ## Please put your Discord username PlaysBadly --------- Co-authored-by: RickD004 <realtacoco@gmail.com> |
||
|
|
1551de8ee3 |
Standarize map names across info and manifest jsons (#4011)
## Description: Just a text change. 4 maps had inconsistencies in their names in their info.json (and by consequence the manifest). If sites extracted map names from one of these they would appear with an inconsistent name. The south america map for example was named "Americas", and appeared as such in the pathfinding playground (thats where i noticed these inconsistencies) ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tri.star1011 |
||
|
|
c35355a490 |
fix(client): silence noisy LangSelector not found console warning (#4021)
## Description: Silence noisy console warnings of `LangSelector not found in DOM` on page hydration. Previously, `translateText()` queried the DOM very early in the client rendering/hydration phase before Lit Element had mounted the `<lang-selector>` element. This resulted in hundreds of noisy warnings in the browser developer console on page load. This fix resolves the issue gracefully in Utils.ts: it queries `getCachedLangSelector()` and immediately returns the key if not found without polluting the console log with warnings. Once the element is fully mounted, normal translation and cache updates resume. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: barfires |
||
|
|
b086881a4e |
Add Korea Map (#3977)
## Description: Add map of korean peninsula. Size 1092x2149 Nations: 35 based on provinces ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: DISCORD_USERNAME crunchybbbbb @crunchybbbbb_59469 <img width="1092" height="2149" alt="Korea-2" src="https://github.com/user-attachments/assets/874100e8-4a68-4f57-b2f7-49aa87b8194d" /> two teams nations war video https://www.youtube.com/watch?v=n4h7GAfAHTM --------- Co-authored-by: Ricky G.P. <realtacoco@gmail.com> |
||
|
|
10776c1948 |
fix(render): prevent trade-friendly ships from visually rendering as angry red warships (#3843) (#4017)
## Description: The unit fragment shader (unit.frag.glsl) checked vFlags > 1.5 to colorize warships in their attacking/angry solid red territory band (FLAG_ANGRY = 2.0). However, trade-friendly ships use FLAG_TRADE_FRIENDLY = 3.0 which also matched this condition, causing friendly/trade-allied ships to incorrectly render as hostile/angry warships in normal camera view. This fix refactors unit.frag.glsl to use precise float range queries via abs() to verify FLAG_ANGRY and FLAG_FLICKER flags specifically, preventing the trade-friendly flag from triggering the angry-red colorization. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: barfires |
||
|
|
38f0709e53 |
fix(core): destroy defense posts on tile capture instead of downgrading and transferring ownership (#1563) (#4016)
## Description: Capturing defense posts previously demoted their level by 1, and transferred ownership to the invading player if their level was still above 0. The expected strategic behavior is that defense posts should always be destroyed (deleted) upon capture. This fix updates PlayerExecution.ts's structure tick loop to immediately destroy the Defense Post unit via u.delete(true, captor) instead of transferring ownership. It also rewrites the corresponding unit tests in PlayerExecution.test.ts to verify the complete destruction of Defense Posts of all levels (including level 2+) when the tile owner changes. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: barfires |
||
|
|
2d6342cd22 |
Add stale-if-error to app shell Cache-Control (#4009)
## Description: Adds `stale-if-error=86400` to the `Cache-Control` header set on the rendered app shell (`/`) in [src/server/RenderHtml.ts](src/server/RenderHtml.ts). This lets shared caches (CloudFlare, nginx `proxy_cache`) keep serving the last good `index.html` for up to 24h if origin returns a 5xx, alongside the existing `stale-while-revalidate` window. Pairs with enabling HTML caching for the `/` route on CloudFlare in "respect origin headers" mode — it already honors `s-maxage` (5 min edge TTL) and `stale-while-revalidate`; this just extends the same safety net to origin-error cases. No behavior change for successful responses; browsers still revalidate every load via `max-age=0`. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: jish --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
2b45813ce0 |
Use spawn tile for name placement during spawn phase
Names now follow the player's currently-selected spawn tile each tick instead of going through placeName, which read a cluster bounding box that only refreshed every cluster-calc cycle and was further throttled to every other tick. Adds placeSpawnName and switches the spawn-phase branch in GameRunner to use it. |
||
|
|
3a3b43b642 |
Bump qs from 6.15.0 to 6.15.2 in the npm_and_yarn group across 1 directory (#3995)
Bumps the npm_and_yarn group with 1 update in the / directory: [qs](https://github.com/ljharb/qs). Updates `qs` from 6.15.0 to 6.15.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/ljharb/qs/blob/main/CHANGELOG.md">qs's changelog</a>.</em></p> <blockquote> <h2><strong>6.15.2</strong></h2> <ul> <li>[Fix] <code>stringify</code>: skip null/undefined entries in <code>arrayFormat: 'comma'</code> + <code>encodeValuesOnly</code> instead of crashing in <code>encoder</code></li> <li>[Fix] <code>stringify</code>: use configured <code>delimiter</code> after <code>charsetSentinel</code> (<a href="https://redirect.github.com/ljharb/qs/issues/555">#555</a>)</li> <li>[Fix] <code>stringify</code>: apply <code>formatter</code> to encoded key under <code>strictNullHandling</code> (<a href="https://redirect.github.com/ljharb/qs/issues/554">#554</a>)</li> <li>[Fix] <code>stringify</code>: skip null/undefined filter-array entries instead of crashing in <code>encoder</code> (<a href="https://redirect.github.com/ljharb/qs/issues/551">#551</a>)</li> <li>[Fix] <code>parse</code>: handle nested bracket groups and add regression tests (<a href="https://redirect.github.com/ljharb/qs/issues/530">#530</a>)</li> <li>[readme] fix grammar (<a href="https://redirect.github.com/ljharb/qs/issues/550">#550</a>)</li> <li>[Dev Deps] update <code>@ljharb/eslint-config</code></li> <li>[Tests] add regression tests for keys containing percent-encoded bracket text</li> </ul> <h2><strong>6.15.1</strong></h2> <ul> <li>[Fix] <code>parse</code>: <code>parameterLimit: Infinity</code> with <code>throwOnLimitExceeded: true</code> silently drops all parameters</li> <li>[Deps] update <code>@ljharb/eslint-config</code></li> <li>[Dev Deps] update <code>@ljharb/eslint-config</code>, <code>iconv-lite</code></li> <li>[Tests] increase coverage</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/ljharb/qs/commit/9aca4076fe788338c67cf7e115f0be6bc58d85a8"><code>9aca407</code></a> v6.15.2</li> <li><a href="https://github.com/ljharb/qs/commit/5e33d33447ed0bf1ddab9abc41d27dea4687d992"><code>5e33d33</code></a> [Dev Deps] update <code>@ljharb/eslint-config</code></li> <li><a href="https://github.com/ljharb/qs/commit/21f80b33e5c8b3f7eba1034fff0da4a4a37a1d41"><code>21f80b3</code></a> [Fix] <code>stringify</code>: skip null/undefined entries in <code>arrayFormat: 'comma'</code> + `e...</li> <li><a href="https://github.com/ljharb/qs/commit/a0a81ea2071acce3eff41a040f719ac8f5c4f64c"><code>a0a81ea</code></a> [Fix] <code>stringify</code>: use configured <code>delimiter</code> after <code>charsetSentinel</code></li> <li><a href="https://github.com/ljharb/qs/commit/e3062f78f5233b338ceeb8e8dfa5a07dea4b32a8"><code>e3062f7</code></a> [Fix] <code>stringify</code>: apply <code>formatter</code> to encoded key under <code>strictNullHandling</code></li> <li><a href="https://github.com/ljharb/qs/commit/0c180a40adb8c6703fffc85b2ff06ca209f5c1e0"><code>0c180a4</code></a> [Fix] <code>stringify</code>: skip null/undefined filter-array entries instead of crashi...</li> <li><a href="https://github.com/ljharb/qs/commit/3a8b94aec19bd664720f6f6b1e66c4a0dfe4b656"><code>3a8b94a</code></a> [Tests] add regression tests for keys containing percent-encoded bracket text</li> <li><a href="https://github.com/ljharb/qs/commit/96755abd357c0e534dd3442a84a04d08864bfe0d"><code>96755ab</code></a> [readme] fix grammar</li> <li><a href="https://github.com/ljharb/qs/commit/a419ce5bbfcdb98a299f1a0bb47ea055baef20e6"><code>a419ce5</code></a> [Fix] <code>parse</code>: handle nested bracket groups and add regression tests</li> <li><a href="https://github.com/ljharb/qs/commit/3f5e1c528c967d915096787efbffa73cf6044170"><code>3f5e1c5</code></a> v6.15.1</li> <li>Additional commits viewable in <a href="https://github.com/ljharb/qs/compare/v6.15.0...v6.15.2">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) 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> |
||
|
|
3811d3cd89 |
Hide clan tags in public FFA games to prevent teaming (#4000)
## Description: - Added optional `disableClanTags` to `GameConfig`. When set, the server strips clan tags from `gameInfo` (lobby broadcasts/HTTP) and `gameStartInfo` (start payload) before sending to clients. Archive keeps the originals. - Enabled `disableClanTags` for public FFA games (both the regular FFA playlist and special when randomized to FFA). No UI; clients still see their own clan tag via local input state. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
b4a14f9b9d |
Move attack troop overlay to WebGL (#3996)
## Description: Replaces the DOM-based `AttackingTroopsOverlay` with `AttackingTroopsController`, rendering attack troop counts through `WorldTextPass` instead of a separate fixed-position DOM container. ## Summary - New `AttackingTroopsController` polls `attackClusteredPositions()` every 200ms and pushes labels to the WebGL view each frame, lerping cluster positions over 250ms for smooth front-line movement (replaces the old CSS `transform 0.25s` transition). - `WorldTextPass` gains `setAttackTroopLabels()` and renders them at a fixed on-screen size (zoom-independent) using `screenScale / zoom`. - World text now draws on top of `NamePass` so attack callouts aren't hidden behind centered player names. - Fragment shader adds a soft quadratic dark halo around every world-text label; extent uses the remaining SDF range after the hard outline so it fades smoothly to zero (no rectangular clipping). - Deletes `AttackingTroopsOverlay.ts`; existing unit tests repointed to the controller's exported `alignClusterOrder`. <img width="369" height="395" alt="Screenshot 2026-05-24 at 4 43 51 PM" src="https://github.com/user-attachments/assets/4dbffe20-77f9-4c0f-b956-ecf543538f8d" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
5a2c0504eb |
adds map of the Balkans (using Additional nations feature) (#3998)
## Description: Adds map of the Balkan Peninsula and surroundings. Heavily requested map with multiple posts on the Discord all with over 10 or 20 upvotes. 23 NPC/Nations based on countries and relevant regions of the area. Adds an extra 39 nations for crowded Humans vs Nations gamemode for a total of 62 NPCs, based on regions of multiple countries. Also some flags for some regions. Source from NASA DEM, already credited Photo of base map, and 62 HvN: <img width="614" height="588" alt="Captura de pantalla 2026-05-24 030105" src="https://github.com/user-attachments/assets/5742a4c3-1b1f-4ca7-858d-91529861dd81" /> <img width="548" height="547" alt="image" src="https://github.com/user-attachments/assets/758d8ad0-1515-41b8-8d42-14e76cdd54ed" /> This map completes the quartet row of "polemic" maps for v32 <img width="678" height="119" alt="image" src="https://github.com/user-attachments/assets/9e6f4ef1-f0cc-48ea-a59f-b7ff69033b73" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tri.star1011 |
||
|
|
cbf38ffb81 |
Fix destroyed cooldown structures reappearing in game (#3997)
## Description: Stop deleted missile silos from reappearing after cooldown expiry before https://github.com/user-attachments/assets/714d3580-b60d-479e-8e45-6ee065b79d54 ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: aotumuri |
||
|
|
14f2e36d15 | set dev public lobby time back to 5 seconds v0.31.12-beta | ||
|
|
0e9ff93a84 |
Add team-grouping hint to friends panel
Surface why a player would want to add friends: a small info card at the top of the panel noting that friends are placed on the same team. |
||
|
|
8f982ce123 |
Extend friend grouping to the lobby team preview
The preview was calling assignTeams without friend data, so the team layout shown in the lobby could differ from the layout the game actually started with. Wire friends through ClientInfo so the preview matches. Extract the publicId→clientID translation used by both start() and gameInfo() into buildFriendsLookup() to remove the duplicate. |
||
|
|
db501c68d2 |
Put friends on the same team (#3994)
Fixes #3911 ## Description: - Server captures `publicId` and `friends` from `getUserMe()` and includes each player's in-game friend `clientID`s in `PlayerSchema` on game start - Team assignment treats friends as a **soft preference** (best-effort): a non-clan player goes to the team where the most of their friends already are; if that team is full they spill to the next-emptiest team rather than getting kicked - Clans remain strict (kick overflow) since clan membership is an explicit opt-in; friends are implicit, so a friend-of-friend chain that doesn't fit shouldn't bench anyone - Friendship is symmetric — an edge from either direction counts, which keeps things working when one side's `getUserMe` is stale - Lobby preview unchanged — friend grouping only takes effect once the game actually starts (avoids exposing friend lists in the lobby payload) ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
db0ec97dc4 |
Bump ws from 8.20.0 to 8.20.1 in the npm_and_yarn group across 1 directory (#3969)
Bumps the npm_and_yarn group with 1 update in the / directory: [ws](https://github.com/websockets/ws). Updates `ws` from 8.20.0 to 8.20.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/websockets/ws/releases">ws's releases</a>.</em></p> <blockquote> <h2>8.20.1</h2> <h1>Bug fixes</h1> <ul> <li>Fixed an uninitialized memory disclosure issue in <code>websocket.close()</code> (c0327ec1).</li> </ul> <p>Providing a <code>TypedArray</code> (e.g. <code>Float32Array</code>) as the <code>reason</code> argument for <code>websocket.close()</code>, rather than the supported string or <code>Buffer</code> types, caused uninitialized memory to be disclosed to the remote peer.</p> <pre lang="js"><code>import { deepStrictEqual } from 'node:assert'; import { WebSocket, WebSocketServer } from 'ws'; <p>const wss = new WebSocketServer( { port: 0, skipUTF8Validation: true }, function () { const { port } = wss.address(); const ws = new WebSocket(<code>ws://localhost:${port}</code>, { skipUTF8Validation: true });</p> <pre><code>ws.on('close', function (code, reason) { deepStrictEqual(reason, Buffer.alloc(80)); }); </code></pre> <p>} );</p> <p>wss.on('connection', function (ws) { ws.close(1000, new Float32Array(20)); }); </code></pre></p> <p>The issue was privately reported by <a href="https://github.com/ChALkeR">Nikita Skovoroda</a>.</p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/websockets/ws/commit/5d9b316230ea931532a6671cc450f18c11edd02f"><code>5d9b316</code></a> [dist] 8.20.1</li> <li><a href="https://github.com/websockets/ws/commit/c0327ec15a54d701eb6ccefaa8bef328cfc03086"><code>c0327ec</code></a> [security] Fix uninitialized memory disclosure in <code>websocket.close()</code></li> <li><a href="https://github.com/websockets/ws/commit/ce2a3d62437995a47e6056d485a33d21b6a8f867"><code>ce2a3d6</code></a> [ci] Test on node 26</li> <li><a href="https://github.com/websockets/ws/commit/58e45b872bb0f35a3edd553c27e105300a4f5bd0"><code>58e45b8</code></a> [ci] Do not test on node 25</li> <li><a href="https://github.com/websockets/ws/commit/5f26c245231a4b018479a9269e8c3da4773fe42f"><code>5f26c24</code></a> [ci] Run the lint step on node 24</li> <li>See full diff in <a href="https://github.com/websockets/ws/compare/8.20.0...8.20.1">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) 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> |
||
|
|
b1ec3ac70f |
Adds Indian Subcontinent map (#3975)
## Description: Adds Map of the Indian Subcontinent, with indian and pakistani states and surrounding countries, important rivers like the Ganges, Brahmaputra and Indus, and Tibet/ theHimalayas 2M land pixels and 52 Nations (i think its fitting that India has the most nations of a regional map, only continental maps have more) Should be nice to boost whatever indian playerbase this game might have. This region also doesnt have any representation aside from continental maps <img width="584" height="598" alt="image" src="https://github.com/user-attachments/assets/4089049a-800b-4e37-ab34-2afc5de821e8" /> <img width="418" height="462" alt="image" src="https://github.com/user-attachments/assets/a68e2424-5972-4105-86c9-0312ab095024" /> Elevation data from NASA DEM, already credited in CREDITS.md No reference test is needed, the test suite automatically iterates over all GameMapType enum values — no map is hardcoded by name in the tests ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tri.star1011 |
||
|
|
fd6cd762e6 |
feat: friends panel (#3990)
## Description: # Add Friends tab to Account modal ## Summary - Adds a "Friends" tab to the Account modal, alongside Account / Stats / Games. - New `<friends-list>` Lit component covering the full friend lifecycle: send request, accept / deny incoming, withdraw outgoing, remove friend, paginated list with "Load more". - New `FriendsApi.ts` wrapping `GET/POST/DELETE /friends*` endpoints with typed error codes (`not_found` / `conflict` / `bad_request` / `request_failed`). - Zod schemas for the friend API responses in `core/ApiSchemas.ts`. - Translations under a new `friends.*` block in `en.json`. Friends and pending requests are displayed by public ID via `copy-button`, matching the existing clan convention. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
545ad313e3 |
cleanup: drop unused disposer return from installSafariPinchZoomBlocker (#3992)
Follow-up to #3901 (cc @evanpelle). ## Description: In the review on #3901, evanpelle pointed out that the disposer returned by `installSafariPinchZoomBlocker` is never called at the call site in `Main.ts`, and asked whether there's any reason to return it. There isn't — the listeners live for the document's lifetime and the browser releases them on teardown — so this PR drops the disposer. ### Changes - `installSafariPinchZoomBlocker` now returns `void`. Removed the `return () => { ... }` block and the `@returns` JSDoc line. Added a sentence explaining why no disposer is needed. - Tests: dropped the disposer-removal test, switched the behavior tests to use fresh detached `<div>` elements (no document state leak across tests), and verified the default-target = `document` case with `vi.spyOn(document, 'addEventListener').mockImplementation(() => {})` so no real listener actually attaches to the shared jsdom document. Net diff: -23 lines (30 insertions, 53 deletions). ### What I tested - `npm test` — 1245 + 65 tests pass, including the 4 surviving tests for this helper - `npm run build-prod` — succeeds (tsc + vite) - `npx eslint` — clean - `npx prettier --check` on the touched files — clean ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: @vansszh |
||
|
|
a14cf0edc1 |
Clan Game History (#3988)
## Description: Adds <img width="1046" height="901" alt="image" src="https://github.com/user-attachments/assets/930b0d27-4707-4836-b068-620346e7e3a7" /> continuation of infra https://github.com/openfrontio/infra/pull/345 ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: w.o.n |
||
|
|
b486caa6f4 |
Wire view-mode toggles (alt-view + coordinate grid) via new ViewModeController
Moves the AlternateViewEvent / ToggleCoordinateGridEvent subscriptions out of ClientGameRunner into a dedicated controller in src/client/controllers/. Also wires ToggleCoordinateGridEvent (M keybind) — previously emitted with no listener — so the persistent coordinate-grid toggle works. Grid + alt-view hide names only under alt-view; M keeps names visible. |
||
|
|
ee04a19d3c |
unit price (#3989)
## Description: # Ghost structure cost label Renders the gold cost of the currently-selected build under the ghost structure cursor, with color-coded affordability/placement state. Honors the existing `cursorCostLabel` user setting (legacy name `ghostPricePill`, already shipping ON by default). ## Behavior | State | Color | |---|---| | Can afford + valid placement | white | | Can afford + can't place here (port on land, overlap, …) | gray | | Can't afford | red | The number is formatted via `renderNumber` (project-wide convention — `1.5K`, `1.23M`, etc.) and rendered as MSDF text at a fixed world-space scale, centered under the ghost icon. ## Implementation The cost was already plumbed end-to-end on [`GhostPreviewData.cost`](src/client/render/types/Renderer.ts) but never visualized. This PR: - Extends [`GhostPreviewData`](src/client/render/types/Renderer.ts) with `showCost` (from setting) and `canAfford` (gold vs. cost check, computed in [BuildPreviewController](src/client/controllers/BuildPreviewController.ts)). - Adds a `setGhostCostLabel(...)` channel to the MSDF text pass — one persistent, non-animated text instance alongside the existing ephemeral popups. No new pass, no new shader. - Wires [`Renderer.updateGhostPreview`](src/client/render/gl/Renderer.ts) to push the label whenever a ghost is active. - Renames `ConquestPopupPass` → [`WorldTextPass`](src/client/render/gl/passes/WorldTextPass.ts) (and its shader dir `conquest-popup/` → `world-text/`) since it now handles conquest popups, bonus popups, and the ghost cost label. Done with `git mv` so history is preserved. https://github.com/user-attachments/assets/c5b21bf3-f440-4c28-9b94-843df9bf6a37 ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
458d04e278 |
split account modal into multiple tabs (#3986)
## Description: The account modal was getting too large, too much scrolling. <img width="1091" height="779" alt="Screenshot 2026-05-22 at 2 23 23 PM" src="https://github.com/user-attachments/assets/9553c80d-7d17-4cfd-8992-88bb335a972e" /> <img width="970" height="781" alt="Screenshot 2026-05-22 at 2 23 33 PM" src="https://github.com/user-attachments/assets/847e70eb-57b7-440b-adb6-bb7c18ada43c" /> <img width="1100" height="718" alt="Screenshot 2026-05-22 at 2 23 42 PM" src="https://github.com/user-attachments/assets/5b08d44c-743a-4245-86a3-bf62e01008e9" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
42feb36825 |
Highlight matching structures on UnitDisplay hover
Wires the existing ToggleStructureEvent (emitted on UnitDisplay button mouseenter/leave) to view.setHighlightStructureTypes via a small StructureHighlightController. StructurePass + StructureLevelPass already implement the highlight visual — this just connects the two ends. |
||
|
|
19beab9a70 |
flags (#3985)
# Dynamic flag atlas (runtime TEXTURE_2D_ARRAY) Replaces the build-time `flag-atlas.png` with a runtime `TEXTURE_2D_ARRAY` populated on demand from each player's server-resolved flag URL. Layers are deduped by URL (every "Mercia" bot shares one slot), so the per-game working set is bounded by unique flags, not player count. ## Why The store will eventually ship hundreds of custom flags fetched from the CDN, which can't be baked into a static atlas. Moving to a runtime array also lets the catalog grow without bloating the client bundle. ## Side effect (bonus) Human players' country flags (`country:US`, etc.) now display next to their names in-game. The old atlas only contained nation names, so non-nation flags were silently dropped. ## Notes - Cell size is fixed at 128×85; loaded images are aspect-fit and centered. - Layer cap is 512 (clamped to `MAX_ARRAY_TEXTURE_LAYERS`). Past the cap, further flag requests render no icon. - Mipmaps are regenerated after each layer upload. - Recommend store pipeline caps custom flag uploads at SVG or PNG ≤ 256×170, ≤ 50 KB (decode-time RAM and bandwidth, not VRAM). ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
fe6581e3fe |
update webgl nuke effects (#3984)
## Description: Reworks the visual look of nuked tiles to read uniformly green (no more brown/black bleed-through), and moves the ember "particle" effect out of the border passes — where it lived as a storage-sharing hack — into the fallout system where it belongs. ## What changed visually - **Fresh fallout**: bright uniform bloom with a hint of flickering green particles dampened on fresh tiles, ramping up as heat decays (`particleFreshScale` controls the fresh-tile dampening). - **Stale fallout**: dark-green ground (was near-black charcoal), with full-strength flickering particles in dark-green ↔ light-green. - **Particles**: per-tile flicker is now de-synced (each tile pulses at its own rate, 0.4×–1.6× base speed) so the eye can't lock onto a global rhythm. - **No more brown/black pixels** in fallout zones. Two root causes were fixed: - The territory pass now renders stale-nuke ground for **all** fallout tiles, not just unowned ones — so an owned player's color can't show through where the bloom is dim/transparent. - The ember stamp (which fully replaced tile color with orange) is gone; particle render is now additive and color-tuned green. ## Architecture cleanup The ember effect was conceptually fallout-domain, but lived in `BorderComputePass` (writing intensity into `borderTex.g`) and `BorderStampPass` (stamping orange dots), just because the border pass already had an RGBA8 texture with a free G channel. Two consumers read from it (`BorderStampPass`, `FalloutLightPass`), and the per-tile flicker math used no border data at all. This PR relocates the math inline into the two passes that actually need it (`FalloutBloomPass.extract.frag.glsl` and `FalloutLightPass.fallout-light.frag.glsl`), drops the ember code from both border passes, and renames `mapOverlay.ember*` → `falloutBloom.particle*` so the settings live with their pass. Side benefits: - **Animation correctness**: the old setup only updated ember intensity when `BorderComputePass`'s dirty flag flipped (highlight change, relations update, etc.), so the supposed flicker was actually a frozen snapshot between border events. The new inline path runs every frame as intended. - **Slightly cheaper per-frame compute**: removed a per-dirty-event full-map writeback to `borderTex.g`; added a few cheap ALU ops (1 sin + 2 hashes) per fallout tile in shaders that were already running. Same texture memory. ## Other small changes - Renamed `mapOverlay.charcoal*` → `mapOverlay.staleNuke*` (charcoal was a misnomer now that the ground is green). - Added `staleNukeR/G/B` for the ground color (was hardcoded grey). - `intensityHot` bumped 0.6 → 1.8 for a brighter fresh-nuke glow. - Raised `railroad.railMinZoom` 2 → 4 and `railDetailZoom` 4 → 6 so rails pop in later (separate small commit). <img width="354" height="371" alt="Screenshot 2026-05-22 at 10 37 34 AM" src="https://github.com/user-attachments/assets/03b46c45-c617-41b3-b3e4-9934f064bfe1" /> <img width="335" height="358" alt="Screenshot 2026-05-22 at 10 37 43 AM" src="https://github.com/user-attachments/assets/af370b19-8f22-4694-9859-1ad52aa755a7" /> <img width="651" height="613" alt="Screenshot 2026-05-22 at 10 38 09 AM" src="https://github.com/user-attachments/assets/e06e5101-8529-49f6-b29a-ce0563eb52d6" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
a2b3db616b |
WebGL: re-upload structures when owner changes (capture)
The structure dirty flag missed ownership changes, so captured buildings kept rendering in the previous owner's color until another structure event (level/active/construction) forced a re-upload. |
||
|
|
2ee2fb97e3 |
WebGL: return of factory/defence post radii, and railroad highlighting when placing city/port right on top (#3981)
## Description: Show factory and defence post radius for ghost structure when placing structures from build bar (unitdisplay). Show when city/port is placed directly over existing railroad, by highlighting the railroad green. The railroad is not highlighted when instead a city/port nearby the ghost structure will be upgraded instead of placing it on the railroad. This works with the existing code in buildableUnits in PlayerImpl: it would already return an empty array [] for overlappingRailroads and for ghostRailPaths when canUpgrade is false. So the old checks for uiState for Canvas2D in BuildPreviewController weren't even needed per se, they followed the same logic as buildableUnits in PlayerImpl already did. Both changes emulate how it worked before the move to WebGL. - OverlappingRailroads now returns TileRefs instead of a railroad ID, and it does so with less allocations than the previous code. It's a determistic outcome, sorted and deduplicated. In doubt about this a bit, because it's better also in case we ever do desync checks using this data, but for the rendering it isn't needed per se and could be more performant without allocations. - Also: Cleanup obsolete Canvas2D rail highlighting state (UIState) that was superseded by GhostPreviewData. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33 |
||
|
|
ff11d6b8d1 |
WebGL: show status icons closer above names again and emoji on top (#3983)
## Description: In the WebGL implementation, room was reserved for emoji icon between the status icons and the name.. This is a regression from the HTML NameLayer and it looks weird having that space sit there unused the majority of the time when no emoji is shown. Show status icons closer above names again. And when emoji icon is shown shortly, display it in place of the other icons (with the HTML NameLayer it would be drawn on top of the other icons but that could look messy and it's only for a short time anyway). Not addressed in this PR: icon size is different from before WebGL implementation, they seem smaller. **BEFORE (after initial WebGL implementation):** <img width="1007" height="577" alt="Icons too high up because room is kept for emoji while on canvas they where stacked" src="https://github.com/user-attachments/assets/ca6937c8-e265-467d-a8f5-1424540da1c1" /> **AFTER:** <img width="816" height="538" alt="Icons closer and stacked again just their size needs attention later on" src="https://github.com/user-attachments/assets/8a700d23-ea82-4b61-b897-109dbd0e3a32" /> <img width="1878" height="758" alt="Icons closer and stacked again just their size needs attention later on B" src="https://github.com/user-attachments/assets/f6502ad1-8a6a-4dd8-80a1-7f0f2ed590a3" /> <img width="443" height="335" alt="Emoji replaces normal status icons this was after emoji was just shown" src="https://github.com/user-attachments/assets/a8b35385-08d1-4c00-9881-9607d880048e" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33 |
||
|
|
40c23ed5dc | Raise railroad zoom thresholds so rails pop in later | ||
|
|
7acf1aebc2 |
Restore on webgl context loss (#3968)
## Description: When WebGL context is lost, restore context and all elements. In GameView, handle potentially transient undefined states during context loss gracefully. Test with chrome://gpucrash from another tab, then return to the game tab to see it being restored (This fake gpucrash only works once sometimes. Because the second time the browser might reject the tab it thinks caused the gpu crash, access to hardware acceleration. And after even more tries even disables it browser-wide. A browser restart resets it in that case.) ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33 |
||
|
|
41ef675e98 |
Improve Notification Panel (#3913)
Resolves #3910 ## Description: - Split the events HUD into two components: a new **`<actionable-events>`** that owns alliance prompts (request / renew) and a slimmed-down **`<events-display>`** for everything else. - Reworked `<events-display>` into two visual tiers: dim/scrolling tier 2 on top (trade results, unit losses, donations, alliance status), prominent tier 1 anchored at the bottom (inbound nukes, naval invasion, attack requests, alliance broken, conquered player, chat). Tier 2 caps at the 4 newest entries; events expire after 8s. - Added a transient **+gold pip** above the gold pill in `<control-panel>`, animated with a small fade-in. Fires for trade ships, trains, donations, and conquest. Trade-ship and train arrivals are removed from the events scroll since they're surfaced here instead. - New `MessageType.NUKE_DETONATED` and a server-side emission in `NukeExecution.detonate` — once an inbound nuke lands or gets intercepted, the inbound warning vanishes and a "detonated" entry takes its place. - `displayMessage` gained optional `unitID` and `focusPlayerID` params so events can link to a unit or a player. Unit captures and destructions now navigate to the unit's last tile when clicked; donations navigate to the other player. - ActionableEvents card width matches `<events-display>`; cards persist until the user clicks Accept/Reject/Renew/Ignore or the server-side request timeout expires. - Removed the in-events category filter UI and the gold-amount banner — `<events-display>` is now a lightweight log that hides entirely when empty. <img width="570" height="444" alt="Screenshot 2026-05-21 at 1 42 30 PM" src="https://github.com/user-attachments/assets/f103efb3-0e11-4b72-a11b-91ff6896177c" /> <img width="430" height="296" alt="Screenshot 2026-05-21 at 1 41 34 PM" src="https://github.com/user-attachments/assets/ae58475a-b252-4aa6-9ce5-99dea7575ce3" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
513057a62c |
WebGL: show alliance request+duration icon, show ally and team mate targets too, some optimization (#3971)
## Description: 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. ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33 |
||
|
|
c82b078dab |
Stagger territory tile rendering across frames (#3973)
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: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: evan |
||
|
|
6a8b6a1b2f |
Changes for Rebalancing the Taiwan Strait map (#3970)
## Description: 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 ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or 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> |
||
|
|
0ace428a41 |
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>🚀 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>🏠 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>🚀 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 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>🚀 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>🏠 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>🚀 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 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> |
||
|
|
6591b055c3 |
Adds map of Venice 🛶 (#3935)
## Description: 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" /> ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: tri.star1011 |
||
|
|
15ac42b4c1 |
streamer mode bugfix (#3953)
## Description: fixes https://github.com/openfrontio/OpenFrontIO/issues/3572 streamer mode bufix ## Please complete the following: - [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 ## Please put your Discord username so you can be contacted if a bug or regression is found: w.o.n |