github openfrontio/OpenFrontIO v0.34.0-beta1

2 hours ago

v0.34.0

OpenFront goes to Steam. Plus an in-game tutorial, trusted lobbies, a rebuilt attack meta, a cosmetics inventory, and the engine got 39% faster.

Overview

Steam
Sign in with Steam on the web, link Steam to your existing account, and full desktop-shell support: Steam rich presence, invites through Steam, and subscriptions and plutonium purchases on the Steam rail.

** MIRV Update (test) **
Mirvs don't increase in price, instead there is a 60 second cooldown before another player can launch a MIRV

In-game tutorial
A 20-step guided panel walks new players through their first game (spawn, attack, build, ally, nuke), driven by real sim state and adapting to the game's settings.

Trusted lobbies & player reporting
Every 4th scheduled public game is now trusted-only, gated on account trust tier. And there's a Report button in the player panel (botting, teaming, bad names, griefing), feeding straight into the moderation tools.

Attack rebalance
Attack combat rebuilt around two ratios: your troop ratio and the defender's troop density. Big pushes pay less per tile, turtles on dense land are expensive, and late games keep moving.

Cosmetics inventory
A proper inventory locker for everything you own, a redesigned store built around shared cosmetic cards, live in-game previews for skins and effects, and cosmetic bundles.

Clans
Donate currency to your clan treasury, clan tags as team names in team games, and Map and Donations tabs in the clan modal.

Detailed View
A full lobby browser on the homepage: every advertised lobby, tabbed by mode, with deep links.

Performance
−39% tick cost on a full World game, behaviour-preserving, so your late game just got smoother.

New maps
Yangtze River is new, and China got modern borders; the classic map lives on as Qing China.

Gameplay & Balance

  • Rebuilt attack loss around two ratios (troop ratio × defender density), so overwhelming stacks stop paying the full turtle tax and dense land stays expensive to take — Evan
  • Smoothed the large-territory bonus with a log-space sigmoid, capped it, and anchored the density weight at a 3/4 stack; nothing under 100k tiles moves — Evan
  • Pinned attack balance with golden tests and extreme-case scenario coverage, and made Config.attackLogic pure — Evan
  • Pinned the trade-ship and train economy with golden tests — Evan
  • Replaced Math.exp/log/pow/atan2 in the core with deterministic DetMath — Evan
  • New nation attack strategy, juicy(): Hard and Impossible nations now hunt the most valuable bordering rival they can safely beat — FloPinguin
  • Fixed Hard/Impossible nations ignoring the troop cap when attacking TerraNullius or fallout — FloPinguin
  • SAMs get dynamic range scaling on upgrade, with WebGL radius previews — JB940
  • Normalized MIRV warhead speed and removed MIRV map-edge benefits — JB940
  • Blocked nuke launches in the half-second after accepting an alliance — JB940
  • Cancel in-flight MIRVs and warheads on alliance acceptance — Berk
  • Fixed SAMs being unable to target warheads spawned too close — JB940
  • Fixed the nuke-interception indicator when the target is inside SAM range — JB940
  • Only annex territory that is actually enclosed: no more losing your whole empire in one tick to a neighbour without an attack landing — Jish
  • Team games now use the same 80% win threshold as FFA (was 95%) — Ryan
  • Normalized attack troops to the amount actually deducted — 김준혁
  • Rejected spawn intents based on when they were issued, not when they land, closing the remaining spawn-teleport hole — Jish
  • Fixed duo/trio/quad team forming so humans get placed together instead of scattered across bot teams — Sam J Gunner
  • Fixed one-player teams on small public maps — Aotumuri
  • Impassable terrain now acts like the map edge — TKTK123456
  • Rails can no longer cross impassable terrain — TKTK123456
  • Fixed water-nuke pathfinding — FloPinguin
  • Trade ship spawn rate is recalculated on each port level roll — Berk
  • Fixed trains despawning when a track splits — JB940
  • The game winner now deactivates the Doomsday Clock — JB940
  • Fixed edge cases in awarding wins and losses — JB940
  • Fixed various disconnect / desync issues — JB940
  • Fixed the factory rail preview path direction — Nicolas Giuliani
  • Preserved null gold in DonateGoldExecution, and cleaned up dead-defender handling with a converge-until-stable loop — Berk
  • Relaxed the minimum spawn distance after 750 retries on crowded maps — FloPinguin
  • Re-tally winner votes when the electorate shrinks — Evan
  • Added per-mode map rotation weights and per-map modifier overrides — FloPinguin
  • Reduced Labyrinth's public rotation frequency and removed Luna from public rotations — Evan

Steam & Desktop

  • Sign in with Steam on the web, and link Steam from the website — Jish
  • Steam account linking: browser side, /link serving, and pending-link expiry — Jish
  • Steam rich presence and invite handling for the Electron build — Jish
  • Added an Invite Friends button to the desktop lobby, and gave the web lobby host one too — Jish
  • Navigate on a mid-match Steam invite instead of leaving the lobby in place — Jish
  • The Steam rail on the subscription panel and the store — Jish
  • Custom plutonium amounts on Steam, seeded with the shortfall — Jish
  • Client checkout on the rail-agnostic endpoint, and an honest subscription panel — Jish
  • Stopped the subscription panel destroying a granted month — Jish
  • Let Steam-only accounts through every identity gate, and keep Steam personas instead of discarding them — Jish
  • Tell Steam players why they cannot sign in, instead of a Turnstile error — Jish
  • Route desktop Discord/Google login through the browser link flow — Jish
  • Publish the client capability level in the release descriptor, and make unrecognised update errors gate multiplayer — Jish
  • Gate every join path (including Detailed View) while a Steam update is pending — Jish
  • Steam rich presence status frames and map translation keys — Jish
  • Show the Steam shell version beside the game version, and move the full version string to the footer — Jish
  • Show the build's commit when it has no tagged version — Jish

Trust, Safety & Moderation

  • Added trusted-only lobbies gated on account trust tier, with lock indicators on lobby cards — Evan
  • Every 4th scheduled public game is trusted-only, spaced so open lobbies are always available — Evan
  • Tell signed-out players to sign in when blocked from a trusted lobby — Evan
  • Added a Report Player button to the player panel, feeding the moderation tools — Evan
  • Show the ban reason to the banned player — iamlewis
  • Updated the Terms of Service: purchases, subscriptions, consumer rights, refunds, chargebacks and fraudulent refund claims — iamlewis

Lobby & Social

  • Added the Detailed View lobby browser: every advertised lobby, tabbed by mode, deep-linkable — Ryan
  • Put the upcoming lobbies in a column under a heading on the homepage — Ryan
  • Lobby card polish: map zoom on hover, no rim, aligned pills, and no map leaking past rounded corners — Ryan
  • Made public lobby listing one-way for the host — Evan
  • Standardized WebSocket close codes and stopped reconnect loops — Neon
  • Close loudly on worker mismatch instead of hanging the client — Evan
  • Reap games that have no connected clients — Jish
  • Restored the menu after leaving a started game in place — Jish
  • Show a spectator-specific message during the spawn phase — FloPinguin
  • Optional territory sorting in the quick-chat player list — Komyak
  • Focus the other player when a chat message is clicked — Oscar Robert-Besle
  • Respect Anonymous Names in event messages that name another player — Berk
  • Clan tags as team names: majority clan, hybrid two-clan names, or normal teams — JB940

Clans

  • Donate player currency to the clan treasury — Evan
  • Show clan currency balances inline — Evan
  • Added Map and Donations tabs to the clan modal, with fullscreen clan map and signed-out UX — Evan
  • A clan tag picker so you stop guessing your own tag, plus a clearer verified name — Ryan
  • Fixed clan member search pagination — Ryan

Accounts & Profiles

  • Support a Creator: a profile panel and openfront.io/c/CODE share links that survive every sign-in flow — iamlewis
  • Self-service account deletion in account settings, queued for 24 hours so you can change your mind — Evan
  • Profile dropdown menu in the nav, a bell news button, and a mobile account icon — Ryan
  • Verified name defaults on for eligible subscribers — Jish
  • Warn players when their reserved name is running out — Jish
  • Explain the suffixed name when a bare claim is unavailable — Jish
  • Shrunk the verified badge and moved it to the name's top-right corner — Evan
  • Click the player name to copy it, and paste a full profile URL anywhere an ID is expected — Ryan
  • Restored game ID copying and added a game link button to history cards — Aotumuri
  • Toast notifications for copy feedback, including on game cards — Aotumuri
  • Capture transport stats — Ryan
  • Nudge long-time players to make a purchase; any purchase makes you ad-free for life — Evan

Cosmetics & Store

  • Added a cosmetic inventory locker for everything you own, and redesigned the store around shared cosmetic cards — Ryan
  • Live skin & effects preview: a stripped-down in-game scene right in the store — JB940
  • Cosmetic packs are now sold as store bundles, and bundle pattern items can name the colour palette they grant — Evan
  • Effect previews drawn as in-game scenes — Evan
  • Train and railroad cosmetic effects (gradient/transition recolor) — Evan
  • New "embers" nuke-explosion effect style — iamlewis
  • Cosmetic selections are keyed by player id, so they're restored on login — Evan
  • Numbered loadout slots and an Unequip All button — Ryan
  • Deep-link the store cosmetics tab from inventory actions — Ryan, ItsTimeTooSleep
  • An Effect Editor in the Render Debug GUI for live cosmetic-effect tuning — Evan
  • Stopped rendering the logged-out store state while auth is pending — Jish
  • Matched the custom amount card to the pack card layout — Ryan
  • Clear the inventory search when switching category tabs — Ryan
  • Fixed effects being out of view and unscrollable on mobile — VariableVince
  • Removed the dead USD purchase path for cosmetics — Evan

Maps

  • Yangtze River: upside-down-U-shaped pipe river map — crunchybbb
  • China updated to modern borders (with the Amur river mouth); the classic map lives on as Qing Chinacrunchybbb
  • Milky Way map update — RickD004
  • Small modifications to Sol and Archipelago — RickD004
  • Connected the Rhine to the sea and added Germany to the countries section — RickD004
  • Fixed the US states of Minnesota and Georgia — RickD004
  • Fixed river pixel errors in Hecate Strait and Baltics — RickD004
  • Fixed typos in Baltics nation names — Juhan Oskar Hennoste
  • Took v33 maps out of the New category — RickD004
  • Map generator: per-layer alpha slider with manifest defaults — FloPinguin
  • Map generator: use the majority neighbor type when removing small islands and lakes, and auto-format output with Prettier — FloPinguin
  • Switched the map generator webp library to drop the C compiler requirement — Juhan Oskar Hennoste
  • Added a map background color override — Evan

Performance

  • Engine perf pass: −39% tick cost on a full 30k-tick World game, behaviour-preserving and hash-identical — Josh Bradley
  • Batched water-nuke terrain deltas into row-span GPU uploads, and optimized the terrain finalize and water graph rebuild — Evan
  • Reduced water-nuke terrain update spikes — Aotumuri
  • Preload the map during the lobby so game start reuses it — ItsTimeTooSleep
  • Nuke trajectory visuals perf — JB940
  • Fixed nuke jitter and rubber-banding with lerped unit updates — JB940
  • Fixed WebGL context loss detection in shader compilation — Jish

Graphics, UI & Quality of Life

  • Added an in-game tutorial panel: 20 steps from spawn to MIRV, driven by real sim state — Evan
  • Added the "Evan's Pick" built-in graphics preset — Evan
  • Alt view now fills territory with translucent relation colors, and colors trade ships by self/ally involvement on either end — Evan
  • Distinguished tribes from nations by territory color — Panindhra Tallapudi
  • Gave tribes the same flat team-game color in free-for-all — Evan
  • Fixed nation flags colliding when two nations share a display name — Panindhra Tallapudi
  • Show team name and territory share on spawn timer hover — ItsTimeTooSleep
  • Show an alliance expiry countdown in the player panel's alliances list — FloPinguin
  • Leaderboard: live gold rate columns and a player type column — FloPinguin
  • Replaced native browser dialogs with in-game UI — Evan
  • Made the PlayerInfoPanel available in replays — Mike Zaugg
  • Added F, R and box-select-warship to customizable keybinds, and let F/Escape cancel warship selection — JB940
  • Fixed the "keybind already bound" display — JB940
  • Fixed the loading bar on SAMs and silos at 0 ammo — JB940
  • Player info name font scaling — JB940
  • Added a border to the spawn timer — JB940
  • Made the end-timer warnings more visible — Rami Kronbi
  • Prevented iOS double-tap page zoom from softlocking the HUD — Rami Kronbi
  • Blocked ctrl+wheel page zoom over HUD panels — 김준혁
  • Fixed the context menu blocking building — Sam J Gunner
  • Play the build sound for Missile Silos like other buildings — VariableVince
  • Converted trading icons from PNGs to SVGs — VariableVince
  • Fixed the flag display in the player panel — yanir
  • Fixed map hover in the create-lobby screen — yanir
  • Treated account deletion as queued for 24 hours in the client — Evan
  • Added missing multi-tab translation keys — Berk
  • Fixed the loading screen copyright translation, deduplicated shared translations, and collapsed duplicate en.json strings — Aotumuri, Ryan
  • Translation updates (mls v5.11-v5.14) and Polish localization — Aotumuri, Tomasz

Server, Infra & Tooling

  • Multi-server groundwork: an implementation plan in docs/MultiServer.md, cluster.json fleet topology, letter-prefixed game ids minted per server, and 8-10 char game id acceptance — Evan
  • Keep mid-game tabs on their deployment across blue/green flips — Evan
  • Deploy nightly builds to green and blue dev subdomains — Jish, Evan
  • Broke GameServer apart behind tests: socket ingress, client roster, intent guards, lobby listing, match telemetry, desync detection, votes, name visibility and config patching each extracted, pinned by a golden wire transcript harness — Evan
  • Released stale websocket references on the server — Thomas Tschinkel
  • Deploy subdomain fixes for slash and underscore branch names, and stopped branch pushes evicting queued main deploys — Evan, Jish
  • Check text files out as LF on every platform — Jish
  • Added the Claude multi-agent code review to CI — Evan
  • Fixed CI to install Claude Code from npm — Evan
  • Updated the deprecated GitHub app-token action — VariableVince
  • Dependency security bumps — dependabot

Translators

TODO: pull the v34 translator credits from Crowdin (the per-language list can't be derived from git history).

Contributors

v34 took 27 people. Code, maps, perf, translations, the lot. Thank you:

Aotumuri · Berk · crunchybbb · Evan · FloPinguin · iamlewis · ItsTimeTooSleep · JB940 · Jish · Josh Bradley · Juhan Oskar Hennoste · Komyak · Mike Zaugg · Neon · Nicolas Giuliani · Oscar Robert-Besle · Panindhra Tallapudi · Rami Kronbi · RickD004 · Ryan · Sam J Gunner · Thomas Tschinkel · TKTK123456 · Tomasz · VariableVince · yanir · 김준혁

Don't miss a new OpenFrontIO release

NewReleases is sending notifications on new releases.