Swapbound Changelog
All notable changes to Swapbound (game + editor) are documented here.
[Unreleased]
- Fix checkpoint respawn overlap handling in Swapbound game runtime: when a checkpoint is placed slightly inside solid geometry, player spawn now searches for the nearest non-overlapping position (prioritizing upward correction) to prevent spawning inside hitboxes and falling through collision.
[0.2.0] - 2026-03-01
- Add a new
waterlevel object to Swapbound editor/runtime: water is rendered as a background layer behind other geometry, is placeable via a dedicated editor tool, and instantly kills the player on contact. - Remove Swapbound
messagetext-trigger authoring/playback from active flow: hide message panel in editor, remove message tool placement, and ignoremessagetriggers in editor/runtime sanitization and gameplay trigger handling. - Add advanced switch state behavior for Swapbound: switch visuals now show top glow by state (off=red, on=green, used=orange), editor exposes switch start-state + mode (
activate/deactivate/toggle), and runtime supports switch targets controlling both platforms and other switches. - Harden community level ingestion for Swapbound editor + runtime: enforce JSON size limits, reject unsafe key paths (
__proto__/prototype/constructor) and excessively deep/large payloads, sanitize imported world entities against strict type/range defaults, and validate external campaign/site-level fetches before parsing. - Continue Swapbound modularization from single-file runtime scripts into load-ordered modules:
game-config.js,game-audio.js,game-core.js,game-runtime.js,game-render.js, plus editor moduleseditor-config.js,editor-data.js,editor-tools.js,editor-canvas.js,editor-main.js; remove legacy monolith filesgame.jsandeditor.js. - Split Swapbound runtime code out of inline HTML scripts into dedicated files (
site/swapbound/js/game.jsandsite/swapbound/js/editor.js) while preserving behavior, enabling safer incremental refactors. - Restore Swapbound runtime pages from production snapshot after a failed intermediate script-extraction refactor, then re-apply
site/swapbound/path updates and hardening fixes (manifest fallback paths, test cache-busting, noopener, and missing-exit render guard). - Reorganize Swapbound into a dedicated subfolder structure under
site/swapbound/: move runtime pages tosite/swapbound/game.htmlandsite/swapbound/editor.html, move campaign files tosite/swapbound/assets/game-levels/, update internal/site/sitemap links, and keep legacy root URLs as redirect pages. - Enforce unique custom remap bindings in the editor (auto-swap behavior) so one key cannot accidentally carry multiple actions in the same remap trigger configuration.
- Add legacy message-text compatibility for older level files using
txt: the editor now surfaces it in message fields and the runtime can display it as fallback. - Add advanced remap authoring in the Swapbound editor: a visual key-overlay preview plus per-action routing controls (
move left,move right,jump,interact/down) with preset A/B or custom mappings, and runtime support for trigger-level custom remap mappings in-game. - Move distance-helper configuration in the Swapbound editor into a dedicated collapsible panel, auto-opening only when
Distance helper / Afstand-hulpis enabled and disabling controls when turned off. - Add explicit trigger-configuration controls in the Swapbound editor for
remapandkeyswapitems (profile selection and keyswap target), removing the need to edit raw JSON for these trigger behaviors. - Make the in-game controls visualization update immediately on keyswap triggers, including swapping the displayed active overlays between Player 1 and Player 2 key layouts.
- Update the Swapbound status-panel controls layout so Player 1 and Player 2 key maps render side-by-side on desktop (with mobile fallback stacking).
- Redesign the in-game control mapping display into a visual key layout per player: blurred base keycaps (
WASD/ arrow keys) with high-contrast directional overlays for currently active actions. - Remove legacy redirect entry pages (
site/game-shared-control-prototype.html,site/game-level-editor-prototype.html,site/split-step-game.html,site/split-step-editor.html) and keep Swapbound URLs canonical onsite/swapbound/game.htmlandsite/swapbound/editor.html. - Improve Swapbound external-campaign level loading with multi-path manifest fallbacks (
assets/...,./assets/...,/assets/...,site/assets/...) so level count/progression stays correct across local hosting setups. - Add a site-level picker in the Swapbound editor that reads
assets/game-levels/manifest.json, allowing editors to select and load published level JSON files directly into the canvas workflow. - Add a hand-built shared-control co-op platformer prototype (
site/swapbound/game.html) on thegamebranch, with two-player split controls for one character, block/switch/bridge puzzle flow, control remap event, room-jump test tooling, character animation polish, and local procedural synth SFX/music via Web Audio API. - Document the planned first 5 campaign levels for the shared-control game concept in
gameURS.md,gameFS.md, andgameDS.md, including the “one new mechanic per level†progression and checkpoint-based fail/hazard approach. - Rework the shared-control prototype into a dedicated Level 1 onboarding layout (movement + pits/checkpoints only), add a 3-lives old-school loop (checkpoint respawn while lives remain, reset to Level 1 start on zero lives), and surface lives in the in-game HUD.
- Add minimal multi-level progression (
Level 1->Level 2) and tune the early level plan: Level 1 jump difficulty now ramps within the level, Level 2 emphasizes block use for higher climbs and longer jumps, and game docs now clarify Level 3 lift/switch progression with repeated block/jump practice. - Add
Level 3to the playable prototype progression as a lift/switch level with repeated jumping and block use, using one-way switches that lower bridge/lift platforms. - Add
Level 4to the playable shared-control prototype progression as the remap-focused chapter, including a later in-level player key-role swap trigger (WASD/Arrow groups), keyswap HUD/overlay feedback, and room-jump test behavior that respects remap/keyswap state (with solo test mode skipping both swaps). - Add
Level 5to the playable shared-control prototype progression as a first combo "exam" level, combining block, switch/lift, remap, and key-role swap concepts with checkpoint-based recovery and shared lives continuity. - Add a compact level editor prototype page (
site/swapbound/editor.html) for the shared-control game with canvas placement tools, selection/move, and JSON import/export in the runtimeworldformat so new hand-built levels can be authored without editing JS builders directly. - Improve the level editor prototype UX with grid snapping for placement/moving and a zoom-aware canvas work area that aligns the editable area with the colored room bands (removing the confusing extra non-level space below the rooms).
- Improve editor placement flow so clicking existing objects selects/moves them instead of spawning duplicates, and auto-return to
selectafter placing a new object (making block/platform editing much faster). - Add a direct
Test levelflow from the level editor prototype: export current world JSON tolocalStorageand open the shared-control game in?editorTest=1mode, with the game prototype able to load and play a custom editor-authored world as a single test level. - Add visual switch-to-platform link lines in the level editor prototype so switch
targetconnections to lifts/bridges are visible on canvas (with a missing-target indicator when a switch target id does not resolve). - Add visual platform movement guides in the level editor prototype: a dashed vertical line with arrow and endpoints shows each platform/lift
y0 -> y1travel path so start/end positions are readable without inspecting JSON only. - Add a draggable platform path-end handle in the level editor prototype so the platform movement guide can be adjusted with the mouse (length/direction), while keeping the path anchor attached to the platform when the platform itself is moved.
- Extend the shared-control game runtime platform movement to support editor-authored platform paths with horizontal/diagonal travel (
x0/x1/targetXalongsidey0/y1/targetY), while remaining backward-compatible with existing vertical-only lift/bridge levels. - Improve level editor iteration speed with a
Fit R1zoom shortcut (room 1 width in view) and aDuplicate selectedaction for quickly adding extra blocks/platforms/triggers while preserving snap-to-grid placement. - Fix editor-authored platform path behavior in the game runtime so platforms consistently spawn at their configured start point (
x0/y0) and only move toward the configured end point (x1/y1) after activation, preventing unexpected movement at level start in editor test mode. - Make the level editor
Export JSONaction more explicit: it now refreshes the world JSON textarea, focuses/selects the exported JSON, and attempts clipboard copy (when supported) so export feedback is immediate and obvious. - Add a true file-save action to the level editor prototype (
Save .json file) that downloads the current world data as a local JSON file, alongside the textarea/clipboard export flow. - Improve the level editor prototype with undo/redo history controls (buttons + Ctrl/Cmd shortcuts) and draggable resize handles for selected objects (corner handles for most rectangles, side handles for platforms).
- Add visual switch-target linking in the level editor prototype: select a switch and drag its center node to a target object's center node to set
switch.targetwithout manual JSON id entry. - Add a distance/spaced-copy helper to the level editor prototype: preview and place a duplicate of the selected object at an exact
DX/DYspacing (including horizontal edge-gap mode for jump tuning). - Add editor + runtime support for
messagetriggers: place a text trigger zone in the level editor and show a custom on-enter toast in the game prototype (withtextNl/textEnsupport). - Add dedicated message-trigger text fields in the level editor UI (NL/EN + once toggle) so
messagetrigger copy can be authored without editing raw selected-object JSON. - Add room-based music preset authoring in the level editor (
R1-R5preset selectors) and extend editor test payloads to include{ world, music }, with the game prototype applying editor-defined room music presets on room changes (bar-boundary switching, backward-compatible with world-only payloads). - Add external level JSON loading support for the game prototype via
site/swapbound/assets/game-levels/manifest.json+ per-level files (using the editor{ world, music }format), with fallback to built-in JS levels when no manifest entries/files are present. - Migrate the current built-in campaign
Level 1-Level 5layouts into external JSON files undersite/swapbound/assets/game-levels/and populatemanifest.jsonwith 5 entries so the prototype now runs the file-based campaign path by default. - Improve shared-control runtime block/platform interaction so blocks standing on moving platforms are carried with platform movement (including horizontal motion), enabling puzzle setups where lifts transport blocks into stoppers/drop points more reliably.
- Fix level editor
Import JSONUX by opening a real file picker (.json) and loading the selected project file into the editor (instead of only parsing the textarea contents). - Add a jump-distance helper overlay to the level editor prototype for selected walkable geometry (
solid/block/platform), showing estimated max jump distance/peak based on runtime movement physics. - Add a toggleable debug mode to the game prototype (default off) with a UI button +
F3hotkey, including an on-canvas debug HUD and conditional trigger-boundary/debug overlays. - Calibrate the editor jump helper to include practical edge-overhang reach (player body overlap at ledge) so displayed max gap distance better matches in-game jumps.
- Extend the editor jump helper with separate
safeandtightgap estimates (with a small safety buffer) and distinct guide lines for easier platform-spacing decisions. - Extend the editor jump trajectory arc visualization below start height (toward world floor) so downward-jump possibilities are visible instead of ending only at equal-height landing.
- Remove the level editor
Load examplebutton from the UI to keep the action panel leaner during normal editing (startup still initializes with the default sample world). - Add a dedicated
Distance helper / Afstand-hulptoggle in the level editor so spaced-copy preview lines/labels can be shown or hidden independently from the jump guide. - Rework message trigger authoring in the level editor + runtime: add selectable message modes (
Zone enter,Progress line (Y),Always on), editable progress threshold Y, draggable Y-threshold line on canvas forProgress line, and runtime support for progress-crossing and persistent always-on message display. - Improve message-trigger editor UX by auto-focusing the NL message text field when a message item is created/selected and clarifying help text so trigger-mode editing (
Zone enter/Progress line/Always on) is easier to discover. - Correct message progress-trigger orientation to a vertical
Xthreshold line (instead of horizontal), with editor/runtime compatibility for legacyprogressYpayloads. - Fix accidental object movement on simple selection clicks by delaying drag-start until a small pointer-move threshold is exceeded.
- Fix editor focus-steal on message selection by removing forced auto-focus to the message text field, so clicking other text areas keeps cursor focus where expected.
- Improve progress-line interaction by allowing direct click/drag on the vertical line itself (not only the center handle), including selecting the linked message trigger on line click.
- Clarify message progress input semantics as world-coordinate X (
Progress X (world px)) in the editor. - Place triggered message text boxes near the configured trigger location in-game (anchor to trigger world position) instead of always rendering at a fixed HUD location.
- Add collapsible panels in the level-editor sidebar (Music, Message, Selected JSON, Project JSON) and auto-open only selection-relevant panels (
Messagefor message items,Selected JSONwhen any object is selected) to reduce visual clutter. - Refine level-editor sidebar information density by converting secondary sections to collapsible panels and keeping only selection-relevant panels expanded during editing.
- Rename the co-op game project to
Swapboundand update public integration naming/URLs (swapbound/game.html,swapbound/editor.html) while preserving legacy game URLs via redirects. - Simplify the player-facing
Swapboundsidebar by removing in-page test tooling (room jump / solo / debug toggles), and move those controls into the editor test launcher (start room,solo test,debug on start) via URL-driven editor test parameters. - Remove the player-facing
Room progressblock from the Swapbound sidebar to keep gameplay UI focused on only actionable player information. - Fix Swapbound language synchronization so in-game UI text follows the active site language toggle, and pass
langthrough the editorTest levellauncher for consistent NL/EN behavior in test sessions.