LASER LEAGUE REVIVAL

THE REVIVAL / DEVELOPMENT HISTORY

Dev Log.

Development history through October 30, 2026. Latest verified public release: Windows83 / Linux38.

Laser League Revival has grown from restoring a playable game into a project covering online servers, offline play, custom maps, tools, accessibility, distribution, and community support. This is the consolidated record of that work.

I have grouped related changes together rather than repeating them every time they appeared in a new build. The sections below describe the functionality that reached the project’s releases. Community maps remain credited to their creators.

Restoring the game and its multiplayer foundation

  • Direct-connect multiplayer: Restored hosting and joining through IP-based sessions without relying on the unavailable original matchmaking services. This became the foundation for private games and the official Revival servers.
  • Correct player registration: Repaired the order in which connected players enter the native roster, receive player state, join a team, and spawn. Added readiness checks so match setup does not race ahead of a client that is still loading.
  • Working match progression: Corrected the practice-state behavior that prevented normal scoring, and restored the flow through rounds, victory, results, rematches, and map changes.
  • Larger and uneven matches: Expanded the initial two-player work to support the game’s larger team configurations, up to eight active players. Corrected explicit team assignment, odd player counts, and remote players joining either side instead of depending on connection order.
  • Correct spawns and player ownership: Fixed team-specific spawn placement and ownership handling. Replaced fragile assumptions about player-object addresses with native lifetime checks where required.
  • Class and modifier synchronization: Fixed cases where a chosen class was overwritten by Smash, the host and client disagreed about the selection, or the visuals did not match the actual ability. The host now receives the intended native class/modifier choice.
  • Class-menu stability: Repaired invalid or stale team references that could crash class selection during direct-connect setup.
  • Actual map patterns: Restored the native pattern-loading path that direct-connect sessions had skipped. Nodes, lasers, movement paths, transforms, rotations, and powerup data could then behave as authored instead of being absent, stacked, or incorrectly initialized.
  • Remote team colors: Corrected the order of team ownership and activation updates so captured nodes and lasers did not remain white for remote players.
  • Stadium context: Restored the correct stadium association for a loaded layout, including the team presentation, arena context, and relevant music selection.
  • Announcer and effects: Restored missing native speech-bank and event initialization, including announcer audio and the Divide effect that had been absent during early direct-connect tests.
  • Intro and replay transitions: Added reliable skipping with the required native cleanup, and made shared transitions host/server controlled. A remote client should not be able to unexpectedly advance everyone’s scene.
  • Network throughput: Increased the configured per-connection ceiling from 10,000 to 100,000 bytes per second to reduce throttling in online sessions. This did not change the native 30 Hz server tick rate or promise a lower Internet round-trip time.

Offline play, customization, and the native menus

  • Online and offline in one installation: Combined the two play paths around the same game files, avoiding a second full copy of the game just to play locally.
  • One main game entry point: Added Laser League Revival.exe with an Online / Offline selector, while retaining PlayOffline.exe for a direct launch into the native menu, including controller-focused Steam Big Picture setups.
  • Accessible customization: Made the native customization flow usable without the original online progression service. Saved appearances can be used for Revival matches.
  • Content catalogue and progression: Added access to the game’s existing classes, modifiers, kits, portraits, avatars, laser styles, and emotes, with class mastery and the base level-30 profile setup used by the Revival builds.
  • New Motion content: Corrected the availability flag that hid the New Motion catalogue content. This included the Curapira and Boitata kit variants and the associated avatars, laser styles, portraits, and emotes.
  • Removed dead-end menus: Hid Quick Match, the Laser Store, and the native matchmaking-dependent mode entries and Quick Match settings. Local Match and Custom Level remain available. The crashing store path is no longer presented as a usable option.
  • Controller focus fixes: Fixed the initial selection state as well as the appearance of those menus. Immediately pressing A, or A twice, no longer invokes a hidden Quick Match or matchmaking mode simply because it retained the default focus.
  • Faster startup cards: Shortened the five introductory cards from five seconds each to roughly one second each. Normal game loading still takes its own time.
  • One-button random map: Added an X-button shortcut in offline stadium selection that chooses a built-in stadium, chooses a map within it, and moves straight to team selection.
  • Visible random-map prompt: Added the circled X / “Random Map” instruction alongside the normal native controller prompts. The selection covers all seven built-in stadiums and their 28 layouts; it chooses stadium first, then a map in that stadium.

Browser launcher and everyday usability

  • A graphical host/join flow: Replaced the early console-led process with a local browser interface for joining official servers, entering a private address, hosting, choosing maps, and managing a session.
  • Cleaner navigation: Reorganized the growing interface into Play, Settings, and Tools tabs. Advanced options and multiplayer-only controls are collapsed or hidden when they are not relevant, reducing scrolling for a normal solo player.
  • Official-server selection: Added convenient US-East and EU-UK choices alongside manual-IP joining and a short history of successful private-server addresses.
  • Useful map previews: Added native arena preview images, readable stadium/layout names, and custom-map descriptions and author information instead of relying on raw asset names or placeholder diagrams.
  • A readable lobby: Added the player list, teams, readiness, countdowns, current rules, and the distinction between connected, loading, waiting, and in-match players.
  • Session controls: Added the relevant ready/unready, team-change, start, rematch, leave, stop, and diagnostic actions. Team changes invalidate readiness where necessary rather than silently starting with stale choices.
  • Focus handling: Added automatic movement between the browser lobby and the game at the appropriate stages, with an opt-out. Adjusted it to avoid unnecessary focus changes during replays and class-selection transitions.
  • Polish and clarity: Fixed crowded Tools & Help spacing, made the customization action easier to find, removed redundant server-summary clutter, and corrected the broken punctuation in “Checking for updates…” text.
  • Closing the application: Added browser-tab tracking and a short shutdown grace period once the game and launcher/editor tabs are closed. A lost close notification or browser crash has a fallback timeout.
  • Safe handling of an active match: Closing the lobby tab during play does not terminate the game. An open editor also keeps the local launcher alive, allowing a map project to be saved.
  • Fewer leftover-process errors: Improved ownership and cleanup of game/launcher processes, automatic retirement of an idle web launcher when opening Offline, and detection of stale sessions before an update. The manual stop command remains a recovery tool rather than the normal exit procedure.

Map voting, team sizes, and match rules

  • Map voting: Added per-player map votes, changing or clearing a vote, visible totals, and removal of votes from players who are no longer eligible. Queued players do not get to control a match they have not joined.
  • Tie handling: Added a random choice among the maps tied for the highest positive vote count, rather than always favoring a particular entry.
  • Change the first map: Added pre-match voting so players do not have to finish an unwanted opening map. A strict majority of connected eligible players switches it immediately; one player alone can choose immediately.
  • Votes during play: Retained next-match voting while a match is underway, with the transition applied at the appropriate boundary. An administrator can explicitly queue a map that overrides the normal vote result.
  • Explicit match sizes: Added 2v2, 3v3, and 4v4 choices, with 3v3 as the normal default. Players can request a larger match with bots even when there are fewer human players.
  • Ordered mode buttons: Arranged the choices as 1v1 in the upper left, 2v2 upper right, 3v3 lower left, and 4v4 lower right.
  • 1v1 Duel: Restored the Duel rules with the extra-life/self-revive marker mechanic. This remains a two-human, opposing-team mode rather than a bot-filled team match.
  • Bot fill follows the selected size: Fill targets now account for the actual number of humans on each team, including a single person playing with and against bots. In 2v2, two humans on one side can face two bots; one human per side can receive one bot teammate each.
  • Separate size and bot preferences: Added bot on/off voting alongside match-size selection, instead of requiring the server administrator to manually change every requested configuration.
  • Stable readiness when voting: Fixed repeated identical votes unnecessarily resetting readiness or restarting the start sequence.
  • Administrator authority: Added policies for server-chosen bot fill, player votes on bots only, or player votes on both match size and bot fill. Enforced the policy on the backend as well as in the interface.
  • Admin control fixes: Fixed the team-size and forced/default bot-fill dropdowns that could not be interacted with under the wrong UI state.
  • Difficulty choices: Added Very Easy, Easy, Medium, and Hard selection, player-vote support, and a server default/forced difficulty. Tied or absent difficulty votes use the configured fallback.
  • Fair waiting-room admission: Added a bounded FIFO waiting room, cancellation and expiry, and admission only when there is capacity. Waiting does not prematurely start a game process, and rotation/reconnection handling preserves the appropriate reservations.

Two to four local players joining online

  • Multiple people on one PC: Added online joining with one to four local players, each with a controller, sharing the game’s arena view. Local guests count as real human slots rather than bots or spectators.
  • Independent player identities: Each person has a name, team, ready state, vote, and native player slot. Guests can be on the same team or opposing teams.
  • Saved guest setup: Added persistent local guest names and starting teams under the collapsed “Players on this PC” setup.
  • Compact lobby controls: Added a Local Player selector for acting as each person and a “Ready everyone on this PC” convenience action.
  • Whole-party admission: Parties wait together when there is insufficient room. Admission respects both total capacity and the selected size of each team.
  • Separate controller ownership: Wired native local-player creation, controller ownership, team/name join data, and readiness so the additional controllers control their own players.
  • Party-aware map changes: Added a controlled game-window restart and automatic reconnection for transitions that the native multi-local-player travel path could not complete reliably. Reservations and names survive the reconnect. These transitions can also reopen other connected game windows; they are not seamless native travel.
  • Clean departures: Leaving or stopping the session removes the group from that PC. Moderation applies to the shared connection, and cleanup avoids leaving guest slots behind.
  • Opening class choices in the web UI: Added remembered class and modifier choices for every local player, including people on opposite teams who cannot both use the same initial native Ready Up screen conveniently.
  • Appropriate visibility and timing: Opening-choice controls appear for two to four local online players, remain editable through initial ready-up, and stop applying once that opening phase ends. “Choose in game” disables automatic selection for that person.
  • Normal between-round selection: Kept the losing team’s in-game class-change screen rather than replacing it with the web controls. Cosmetic selections are preserved when opening classes are applied.
  • Reduced redundant traffic: Fixed repeated class-choice messages with multiple local players. Unchanged choices no longer resend continuously.

Better Hard bots

  • Investigated the actual difficulty data: Traced the native difficulty catalogue and AI decision settings rather than assuming that the label “Hard” pointed to the strongest configuration.
  • Corrected the Hard configuration: Found that the published Hard selection reached a configuration with reviving disabled and a substantially reduced ability-evaluation probability. Replaced that effective setup with the stronger native configuration.
  • Reviving teammates: Enabled deliberate revive behavior on Hard and examined how the AI values a downed teammate, approaches a revive, and avoids unnecessary duplicate revive attempts.
  • More capable decisions: Enabled the stronger native avoidance, node-prediction, and tactical settings used by the improved configuration. Ability evaluation is no longer suppressed by the previous probability setting.
  • All six existing classes: Applied the improvement to the shared native AI used across Smash, Shock, Blade, Ghost, Snipe, and Thief. This improves existing decision logic; it is not six newly written AI systems or a guarantee that bots always choose correctly.
  • Hard by default on official servers: Added a one-time default migration to the new Hard setup while preserving later deliberate administrator changes.
  • Offline and hosted coverage: Applied the Hard configuration to offline Local Match, player-hosted games, and dedicated servers, not only the official VPS builds.
  • More varied dedicated-server loadouts: Added randomized native classes and valid modifiers for dedicated-server bots instead of always starting them as Smash.
  • No RESET for launcher-managed bots: Excluded the custom Ghost RESET modifier from dedicated and hosted bot-fill loadouts because the existing AI does not understand its intended use.
  • No constant AI scanner: Applied the difficulty change at initialization rather than adding a continuous Python loop that searches every bot each frame.

Ghost RESET, movement, and powerup visibility

  • A fourth Ghost modifier: Added RESET alongside the existing Ghost choices, preserving Extend, Medic, and Agile.
  • Improved RESET interaction: Replaced the early body-contact-only behavior with a Thief-sized area that follows Ghost during activation. Moving that area into an enemy applies the reset, making it much less dependent on precisely touching character models.
  • Moving visual feedback: Added a team-colored ring that follows the player, showing the effective area while the ability is active.
  • Current RESET balance: Added movement speed 10% above base Ghost while retaining normal Ghost ability duration.
  • Consistent enemy handling: Each eligible enemy is reset once per activation. Teammates and invalid/dead targets are excluded; an enemy ability already underway can finish before its recharge reset is applied.
  • Online and offline behavior: Implemented the gameplay logic in the authoritative host/server path and supported the corresponding client feedback, including offline matches.
  • Analog movement restoration: Compared the older game’s movement path with World Arena and restored walking versus running based on stick input. The maximum run speed and modifier speed calculations were retained. This is a restored walk/run distinction, not a claim that a continuously proportional speed curve has been fully reproduced.
  • More visible powerup markers: Increased the size and brightness of the floor indicators that show possible powerup spawns. This is a visibility change; it does not change their collision, spawn schedule, or location selection.

Official maps and community-map support

  • Clean official-map catalogue: Collected the 28 built-in layouts across seven stadiums, corrected display-name/asset-name mismatches, and removed internal carrier/debug choices from the normal player-facing list.
  • Loading community maps: Added catalogue discovery for native custom-map folders, including map names, covers, author information, and stadium associations.
  • Correct custom-map surroundings: Loaded custom layouts through an appropriate native stadium so the arena setting, team presentation, and other stadium-dependent behavior remain coherent.
  • Safe return to official maps: Cleared custom-map state during travel back to a built-in layout so the previous custom pattern does not leak into the next match.
  • Map consistency checks: Added map fingerprints/inventory checks so a client and server can detect differing custom-map data. Everyone still needs matching map files; this is not automatic Workshop downloading.
  • Other packaged maps and examples: Included Scissor, Blocks, PINCH, Sunrise, the Wall Wraps and Tubing training packs, and native node/movement showcase material.
  • Catalogue cleanup: Consolidated equivalent showcase entries while retaining distinct layouts that happened to share a name. Corrected malformed JSON and inconsistent stadium aliases found during import.

Map Studio

  • A browser-based map editor: Built a standalone editor that can be used without running the game, then bundled it into the client’s Tools tab so players do not need a separate editor installation or Python setup.
  • Projects and native exports: Added new projects, imports, editable project saves, and native map ZIP export containing the map data, metadata, and cover. Exported maps can be installed in the game’s custom-map folder.
  • Visual editing: Added placement and dragging of laser/node points and powerup positions, coordinate editing, rotation, grid snapping, and a corrected canvas/world-axis mapping.
  • Movement and timing: Exposed node movement, paths, rotation, delays, durations, repeating sequences, and powerup timing. Advanced JSON access preserves native fields that are not represented by a simple form control.
  • Metadata and covers: Added stadium selection, title, description, author information, cover import, and generated cover support.
  • Validation: Added checks for point-name uniqueness, missing references, invalid deletion, and relevant native limits. Export avoids accidentally reusing an imported Workshop identity.
  • Improved duplication: Duplicated points keep the original base name and receive a unique suffix where necessary. Two points cannot share the same saved identifier because other map objects refer to those names.
  • Hide clutter while editing: Added temporary hide/show controls for nodes, spawns, and points, plus a way to show everything again. Hidden objects remain in the project and can still be reached from the lists.
  • Fixed “Move Before Capture”: Corrected the LinearPath checkbox that needed two clicks to turn off, caused by the inspector being replaced during an ordinary edit.
  • Reorder entries: Added up/down and move-to-index controls for lasers, powerups, and points, with undo/redo. Preserved dependent references and repeat/node relationships while changing the order.
  • Missing powerup entry: Added PT_Stun to the editor’s powerup choices.
  • Restored examples and templates: Fixed the embedded editor’s template-loading paths and request handling after templates disappeared from the public build.
  • Eight bundled templates: Included LaserNodeOverview, the movement showcase, Simple Node Show Case, Sunrise, Torchsong, and the official Arrowhead, Prime, and Fish layouts as starting references.
  • Integrated navigation: Added a return-to-launcher path for the bundled editor while retaining the standalone editor’s own exit flow.
  • A full tutorial: Created a website-ready guide covering installation, project structure, coordinates, lasers, movement paths, powerups, timing, validation, export, and playtesting. Included an editable First Circuit example and its exported map package.

Video, monitors, controllers, language, and accessibility

  • Usable in-game video settings: Removed the behavior that prevented normal video changes from taking effect. Restored window resizing and persistence for online and offline play.
  • A usable resolution menu: Expanded the incomplete Windowed resolution list, including common widescreen and ultrawide sizes, and fixed paths that left resolution selection unavailable.
  • Optional launch preferences: Retained web-UI startup display options while allowing normal in-game settings to remain useful after launch.
  • Monitor selection: Added primary-monitor defaulting, an explicit display choice, and the option to let the game choose.
  • Windows Identify numbering: Changed display labels to match the numbering reported by Windows rather than relying on an arbitrary enumeration order.
  • Correct initial placement: Passed the selected monitor coordinates before the game creates its window, reducing the large window appearing on the wrong screen and then jumping across the desktop.
  • Correct borderless size: Used the selected display’s actual dimensions and checked the resulting placement, including displays to the left of the primary screen. The fallback is bounded rather than continuously forcing the window back after the player resizes it.
  • Controller ability remapping: Added selection of the supported controller buttons/triggers for the ability action and dealt with conflicting gameplay bindings while preserving menu navigation and movement axes. Native button prompts do not necessarily reflect every remap.
  • Selectable game language: Exposed the game’s existing English, French, German, Spanish, Italian, Japanese, Brazilian Portuguese, Russian, and Simplified Chinese localizations. This selects shipped game translations; it does not translate every custom web-UI label.
  • Three color options: Added Off, Original Color-Blind Mode, and Fixed Red / Blue.
  • Consistent fixed colors: Made Red / Blue available across stadiums rather than allowing each stadium palette to replace it, with corresponding team-color handling in the web interface.
  • Original color-blind initialization: Fixed direct-connect initialization so the original mode is applied correctly when the native palette cache would otherwise retain the wrong state.
  • Audio persistence: Added saved volume handling and an 80% starting volume for fresh installs, including the required native settings synchronization.

Monitor placement and resizing received native geometry tests, including simulated mixed-monitor layouts. This should not be read as exhaustive hands-on testing of every physical display, scaling, or driver combination.

Spectator mode and camera

  • Watch without taking a player slot: Added dedicated-server spectator joining alongside the normal player flow, including joining a match already in progress.
  • Separate observer capacity: Added support for up to four spectators alongside eight active players. Observers are not a hidden third playing team and do not take a human or bot-fill slot.
  • Restricted spectator actions: Spectators cannot ready up, vote, switch teams, or affect match sizing and bot fill.
  • Free camera: Added WASD panning, Q/E height adjustment, right-mouse dragging or arrow-key look controls, and a lower camera viewpoint for closer views of players and walls.
  • Movement tuning: Increased the base camera speed by 25%, added Shift for faster movement and Ctrl for precision movement, and smoothed motion using native frame time.
  • Reset and clean view: Added R to return to the arena view and H to show/hide game overlays. Reduced unwanted presentation clutter, including the lingering arena-logo issue in the early preview.
  • Late-join stability: Added guards for replicated objects that are not ready when an observer enters an ongoing match.
  • Capacity testing: Exercised a full eight-player session with four spectator connections and checked that observer participation did not consume the players’ slots or voting permissions.

Saved settings and a cleaner installation

  • Persistent player names: Added a saved name, migrated the earlier text-file format to JSON, and used that saved value when returning to the web UI.
  • Fixed the update-time name regression: Removed the personal player-name file from managed release content so an update no longer replaces it with a packaged default. Added recovery from an existing saved UI profile where possible.
  • Shared online/offline cosmetics: Used the same customization data for both modes instead of maintaining independent appearance files. Added capture and restoration of all four emote-wheel slots while preserving older saves.
  • Moved personal files out of the root: Relocated customization, audio, and player-name data into the support folder, with migration of older locations/formats.
  • Reduced help-file clutter: Consolidated the useful instructions into one player guide and removed or merged stale custom-map and obsolete Duel documentation.
  • Preserved settings during normal updates: Kept user-created settings and cosmetics separate from managed release files. Manual build-folder replacement still requires carrying personal settings forward; the updater handles its managed installation automatically.
  • Predictable diagnostics: Kept session logs and support files in dedicated locations instead of dropping more loose files into the game root.

Launcher, patch delivery, and release compatibility

  • A Windows download/update launcher: Built the custom launcher around Cloudflare R2 and the Revival download domain, replacing the repeated manual download-and-unzip cycle for normal updates.
  • Fresh installation and updates: Added choosing an installation folder, installing the full client, detecting an existing installation, and fetching changed content.
  • Faster preparation and downloading: Moved to reusable compressed content chunks, bounded parallel downloads, cache reuse, retries, and resume behavior, with progress information for larger first installs.
  • Content reuse: Used content-addressed objects so unchanged data can be reused across builds rather than uploaded or downloaded again as an entire game archive.
  • Signed update manifests: Added release-manifest signature verification and file/chunk hashing so the launcher can verify the published content it is applying.
  • Safer installation: Added staged writes, a single-update lock, backup/journal recovery, and checks against unsafe paths or unexpected filesystem links. Verification occurs before the final installed files are accepted.
  • Managed-file cleanup: Remove obsolete managed files without treating every unknown file in the installation as disposable. Personal settings and added content are handled separately from release-owned files.
  • Automatic checking: Made the normal launcher check for updates before proceeding to the Online / Offline game selector. The standalone offline game is not remotely disabled.
  • Installation-folder fix: Corrected the behavior that kept restoring the previously saved folder after a user tried to choose a different location.
  • Clearer executable naming: Moved the downloadable entry point to LaserLeagueLauncher.exe, distinct from the installed game’s Laser League Revival.exe, while accommodating earlier download names.
  • Launcher artwork: Added the Revival icon and branding to the launcher executable and presentation.
  • Required launcher protocol: Added compatibility handling for launcher/update-protocol changes so obsolete launchers can be directed to a suitable replacement.
  • Mandatory official-server updates: Added a shared client/server compatibility identity and clear mismatch messages. Release practice now rotates that identity for every coordinated public update, including changes that might otherwise remain backward-compatible.
  • Release validation: Refresh build hashes, check that the previous release is rejected and the matching release passes the compatibility gate, verify both official servers, and only then publish the matching client update.
  • Safe publication order: Upload immutable release content before advancing the public latest-release pointer, then verify the public manifest and changed downloads.
  • Owner-operated publishing: Added preparation/publishing tools and written instructions so releases can be uploaded without manually assembling every R2 object.
  • Hosting diagnostics: Investigated the selective HTTP 403 failures and identified Cloudflare’s browser challenge/Bot Fight Mode on the download manifest as the cause in the reported case.
Back to top ↑Read the Dev Blog →