send_o manual • Game version / 遊戲版本:6.12.15 Hexagon
Learn to play, build a level, or make a theme. Where would you like to start?
Start playing • Create a level • Make a theme
從遊玩、製作關卡到自訂主題,你想先開始那個部分?
開始遊玩 • 製作關卡 • 製作主題
Game Introduction
send_o is a physics puzzle game built from text characters. Place tools to guide particles from a spawner [G] to a matching collector [@]. Watch what happens, pause, adjust your layout, and try again.
Start with the built-in levels to learn each tool, or use the sandbox to build and share your own puzzles. The full version and lite version use the same puzzles and mechanics; lite reduces visual effects. You can play with a mouse and keyboard or touch controls.
Your First Game
- Open send_o and choose 1. GRAVITY from LEVELS. Find the spawner and collector before placing anything.
- Press START or Space to watch the particles. Press it again to pause when you see where they miss the collector.
- Choose CONVEYOR in TOOLS and click an empty cell to place it. To rotate, switch to SELECT, select your conveyor, then press R.
- Press RESET to clear particles and collection counts while keeping your arrangement. Start again to compare the result.
- Watch COLLECTED in the top-right status display (HUD). When the clear condition is met, its counter turns green. You can keep experimenting after clearing the level.
You do not need the JSON reference to play. Check controls when you need a shortcut and element reference when you meet a new tool.
Controls and Shortcuts
Mouse
- Left click: place element / select element
- Left click + drag: continuous placement / move element (requires "SELECT" tool)
- Right click + drag / middle click + drag: pan the view
- Right click: open quick action menu (copy, paste, rotate, delete, etc.)
- Drag the "send_o" title: move the sidebar
- Double click the "send_o" title: reset the sidebar position
- Left click HUD: toggle HUD hide
Keyboard Shortcuts
Number keys select a tool only when the current level allows it. Rotate and delete act on selected, editable elements.
- Space: start / pause
- 1: switch to "SELECT" tool
- 2: switch to "CONVEYOR" tool
- 3: switch to "SPRING" tool
- 4: switch to "PORTAL" tool
- 5: switch to "WALL" tool
- 6: switch to "FILTER" tool
- 7: switch to "PISTON" tool
- 8: switch to "SPAWNER" tool
- 9: switch to "COLLECTOR" tool
- R: rotate
- D / Delete: delete
- CTRL (or ⌘) + Z: undo
- CTRL + Y / ⌘ + shift + Z: redo
- CTRL (or ⌘) + C / CTRL (or ⌘) + X / CTRL (or ⌘) + V: copy / cut / paste
- F2: save level preview (PNG)
- Shift + F2: save live level preview (PNG)
- Escape: deselect / cancel paste mode
Touch
- Single finger: same as left mouse (place, select, drag)
- Long press: open the quick action menu
- Two fingers: pinch to zoom, drag to pan, twist to rotate
- Tap HUD: toggle HUD hide
View & Camera
- Mouse wheel: zoom in / out (0.35× - 4×), centered on the cursor; snaps to 1× with a brief catch
- Right click + drag / middle click + drag: pan the view
- Two-finger pinch: zoom and pan simultaneously
- Two-finger rotate: rotate the playfield view; snaps to 0°/90°/180°/270° with a brief catch
- Switching levels or resizing the window resets zoom, pan, and rotation
Game Modes
- Built-in levels: solve the puzzle using the available tools. Preset elements are normally locked.
- After clearing: the playfield unlocks, including preset elements and restricted tools. This is a good time to take apart a solution and see how it works.
- 0. SANDBOX: experiment freely, import levels, export your work, and customize the game's appearance. The sandbox starts with a generated maze.
- Imported levels: leave MOVABLE unchecked to play with the author's restrictions. Check it to freely edit the preset layout. MOVABLE is an import option, not proof that you solved the puzzle.
Play Someone Else's Level
- Download the creator's level JSON file.
- Choose 0. SANDBOX → IMPORT, then select the file or paste its JSON text.
- Leave MOVABLE unchecked for the intended puzzle, then confirm IMPORT. Select tools and play as you would in a built-in level.
If you want to study or remix the layout, import with MOVABLE checked. Keep the original file so you can return to the author's version.
Create and Share a Level
A level JSON is a text file describing the playfield, its tools, and its goals. Start from the working example below; you can edit it in the game without writing a whole file from scratch.
- Download this level JSON. In 0. SANDBOX, choose IMPORT, select the file, check MOVABLE, and confirm.
- This example starts with the collector beside the spawner. Pause and use SELECT to move the collector from
(4, 4)to(2, 2), below the spawner at(2, 4). Press RESET, then START to test. The field holds only one particle at a time; a missed particle can stop further spawning until you reset or collect it. The level goal is five collected particles. - Use the element's quick action menu to change its particle type, spawn interval, or collection target. Use EDIT for level-wide JSON settings, then APPLY.
- Choose EXPORT. Give the level a unique lowercase ID, a readable name, and a description explaining the goal.
- Import the exported file with MOVABLE unchecked to test the player's experience. If its ID already exists, follow the replacement prompt or give the test copy a different ID. Check that the puzzle is solvable with the permitted tools.
- Share the exported JSON file. A level preview is useful alongside it, but cannot be imported as a playable level. Keep a downloaded backup before refreshing or closing the game.
BOUNDARY includes boundary walls in the exported file. MINIFY produces compact JSON; leave it off when you want to read or edit the file. For coordinates, portal pairs, and clear conditions, see Level JSON Format.
Try or Make a Theme
- Download Slate theme or another example from the theme reference.
- In 0. SANDBOX, open CUSTOMIZE, load or paste the theme JSON, and press APPLY. Theme files belong here; the level IMPORT dialog accepts level files.
- To make a variation, change one setting at a time: try
ui.bgfor the background orfonts.uiScalefor interface text size. Keep text and particle types easy to distinguish. - Use EXPORT inside CUSTOMIZE to save the theme. If you select a custom TTF/OTF font, keep the font file and its sharing permission with your project; a font name alone does not provide that font to another device.
Theme settings are stored in this browser. RESET inside CUSTOMIZE restores the theme defaults and remove local configuration; it is different from the playfield RESET button. Lite does not display the full version's overlay effects.
Troubleshooting
- A tool is disabled or an element will not move: the level may restrict it. Clear the level to unlock it, or use MOVABLE when importing for editing.
- A spawner stops: check whether the active particle count reached
maxParticles, or its finitespawnNumhas been used up. A limit of zero prevents spawning. - A collector ignores particles: check
collectTypeand whether that collector already reached its own target. Filters let their matching type through; they do not collect it. - The level does not clear:
levelchecks the total collected count;collectorschecks each collector with a positive target;bothrequires both. A level target of 0 never satisfies the total-count goal. In collectors-only mode, collectors with a target of 0 are skipped; with no positive collector targets, that condition is already met. - JSON import fails: check the dialog type first, then commas, double quotes, and brackets. An
elements[n]error identifies an entry in the elements array, counting from zero. Check for overlapping coordinates and paired portals pointing back to each other. - The game feels slow: try lite and a smaller particle limit. When reporting a problem, include the level file, game version, browser/device, steps, and what you expected.
Element Reference
Conveyor >
Continuously applies a directional force to any particle touching it.
Valid rotations: 0°, 45°, 90°, 135°, 180°, 225°, 270°, 315°.
Spring U
When a particle touches it, launches the particle at high speed in the spring's facing direction, then enters a cooldown (symbol changes to V). Resets when cooldown finishes.
Valid rotations: 0°, 45°, 90°, 135°, 180°, 225°, 270°, 315°.
Portal P
Consists of a start (purple) and an end (blue). Particles that touch the start are instantly teleported to the end position with a brief cooldown to prevent re-triggering.
Place the start first, then click to place the end and pair them.
Cannot be rotated.
Wall #
A static obstacle. Particles bounce off according to their angle of incidence.
Valid rotations: 0°, 90°, 180°, 270°.
Horizontal walls (90° or 270°) are immovable by pistons — boundary walls default to this orientation. In post-clear movable, sandbox, or when the level's movable flag is set, boundary walls can be rotated to allow piston interaction.
Filter F
A type-selective wall. The filter is color-coded to a particle type (filterType): matching particles pass straight through as if it weren't there, while all other particles treat it exactly like a solid wall.
Cannot be rotated.
Piston [T]
When a particle approaches, the piston head extends in its facing direction, pushing elements ahead and applying velocity to particles. On retraction, it pulls elements behind the head back.
Valid rotations: 0°, 90°, 180°, 270°.
Stops its push chain upon encountering a horizontal wall, but can still push elements that have free space before the wall. Max piston chain 25.
Spawner [G]
Periodically spawns particles in its facing direction (downward at 0°; default interval: 90 simulation ticks). Pauses when the on-field particle count reaches the level's maxParticles.
Valid rotations: 0°, 90°, 180°, 270°.
Collector [@]
Collects any particle of its matching type (collectType) that enters its cell, incrementing the count and playing a sound effect. Particles of other types pass through without being collected.
The collector is color-coded to its collectType. When its own targetCount is reached, it dims to signal completion and stop collecting; a collector with targetCount 0 means infinite and never dims. If targetCount > 0, a lighter-colored number at the bottom-right shows how many more particles are needed. While the level clear condition is met, the HUD counter turns green.
Valid rotations: 0°, 90°, 180°, 270°.
Particle Types
Particles come in seven color-coded types, each with distinct physical properties. Spawners, collectors, and filters all reference these types.
owhite — baseline: normal weight, gravity, friction and bounce*yellow — light: falls slowly under reduced gravity, drifts more=red — heavy: strong gravity, falls and stacks fast#cyan — bouncy: very high restitution, rebounds energetically+green — near anti-gravity: barely falls and floats around the field$purple — sticky & heavy: very high friction, low bounce, slows down on conveyors, stacks easily, and is hard to launch off springs~orange — slippery: very low friction, low bounce, normal gravity, and moves faster on conveyors
Game UI
Choose a Level or Tool
LEVELS selects the level; LEVEL DESC. explains it. Choose a tool in TOOLS. A disabled tool is restricted in the current mode.
Run, Retry, and Edit
- START / PAUSE: run or pause the simulation. Space is the shortcut.
- RESET: clear active particles and collected counts, keeping the arrangement for another attempt.
- CLEAR ALL: rebuild the level. Normal built-in puzzles remove player placements; custom or unlocked modes reload their level data, with MOVABLE custom edits retained. Do not use it as a blank-canvas command. Export a backup before rebuilding work you want to keep.
- IMPORT: load level JSON in the sandbox. EDIT: modify an imported custom level's JSON.
- EXPORT: save a sandbox or custom level as JSON. CUSTOMIZE: open theme settings in the sandbox or a custom level.
Change an Element
Right-click or long-press an element to open quick actions. Use PARTICLE to choose the type, INTERVAL for a spawner's interval, and TARGET for a collector's goal. The - / + buttons support press-and-hold. Locked properties appear disabled.
Use Level Preview in this menu to save a PNG; long-press that option for a live preview. On a keyboard, use F2 or Shift + F2.
Read the Status Display
- STATUS: :D means running; :| means paused.
- CURSOR: the grid position under your pointer.
- PARTICLES: active particles / particle limit.
- COLLECTED: collected particles / target. Green indicates that the clear condition has been met.
Optional Diagnostics
Add ?debug=1 to the game URL for basic performance and level information. Levels 2, 3, and 4 add detailed performance, device information, and level/entity diagnostics respectively. At level 4, hitboxes, guide overlays, and element IDs are also shown. Debug mode exposes test levels, some of which can be demanding. None of this is needed for normal play.
Level JSON Format
Top-level Fields
id(required): level identifier, allow lowercase letters, digits, -, ., _, max 50 chars; consecutive dots (..) are not allowed. Exported files are namedsend_o-<id>.json.name(required): display name shown in the level selector, max 100 charsdescription: level description, max 500 charswidth/height: playfield size in grid cells (columns × rows), used to build boundary walls whenbuildBoundaryis true, default 25 × 18startX/startY: cartesian origin of the playfield rectangle (bottom-left corner), whenbuildBoundaryis true, boundary walls are generated on this ring (withwidth/height), does not shiftelementsx/ycoordinates, keep these aligned with your layout, a wrong origin can spawn walls in the wrong place, or even worse, make the game treat coincidental horizontal walls on that ring as redundant boundary walls and omit them on exportbuildBoundary: whether to generate boundary walls around the playfield edges, true (default) or false, player-placed elements are kept, except horizontal walls on the playfield perimeter are ignored and omitted on exportmaxParticles: maximum on-field particle count (non-negative integer), spawners pause when this limit is reached, set to 0 to prevent any spawning, default 20targetCount: level clear target — total particles collected across all collectors (used whenclearConditionislevelorboth), set to 0 for infinite, default 10clearCondition: how the level is cleared —level(default),collectors(every collector withtargetCount> 0 reaches its goal; HUD showsN / *), orbothdisallowedTools: array of placement tools disabled during normal play (ignored in post-clear movable, sandbox, or whenmovableis true), valid values: conveyor, spring, portal, wall, filter, piston, spawner, collector. If omitted or empty, portal, spawner, and collector are disabled by defaultspeed: level speed multiplier, values > 1 = speed up, 0 < values < 1 slow down; 1 is normal speed, default 1gravity: gravity scale, 0 = zero-g, negative = upward gravity, 1 = default normal gravityspawnNum: total particles each Spawner produces per active session, 0 (default) = unlimitedelements(required): array of element objects (may be empty)
Elements Array
Each element object contains:
serialId: unique integer within the level, used for portal pairing (required for portal)tool(required): element type, one of: conveyor, spring, portal, wall, filter, piston, spawner, collectorx/y(required): grid position in cartesian coordinates (origin at bottom-left, x increases right, y increases up)-
rotation(wall, conveyor, spring, piston, spawner, collector; defaults to 0): integer rotation angle in degrees- conveyor, spring: 0, 45, 90, 135, 180, 225, 270, 315
- wall, piston, spawner, collector: 0, 90, 180, 270
- filter, portal: rotation is not used; rotating a spawner changes its emission direction, while rotating a collector does not change which particle type it accepts
- any other value (e.g. 123, -1, 114.514, "x x xxx") is not allowed
role(portal only, required): start or endpairedSerialId(portal only, required): theserialIdof the paired portalfilterType(filter only): particle type allowed to pass through — o, *, =, #, +, $, ~ (default o)spawnType(spawner only): particle type — o, *, =, #, +, $, ~ (default o)interval(spawner only): spawn interval in ticks, default 90 (≈ 1.5 s at 60 Hz)collectType(collector only): particle type the collector accepts — o, *, =, #, +, $, ~ (default o)targetCount(collector only): per-collector collection target, 0 = infinite; a remaining-count badge appears at the collector's bottom-right corner
Rotation Reference
Angles are in clockwise degrees. The default facing direction varies by element type:
- Wall: 0° = vertical #
- Conveyor: 0° = pointing right
- Spring: 0° = launches upward
- Piston: 0° = pushes upward
- Spawner: 0° = down, 90° = left, 180° = up, 270° = right
JSON Format Example
{
"id": "guidefirstdrop",
"name": "G. FIRST DROP",
"description": "Guide five particles into the collector. Try moving collector to clear this level!",
"width": 7,
"height": 7,
"maxParticles": 1,
"targetCount": 5,
"elements": [
{
"serialId": 0,
"tool": "spawner",
"x": 2,
"y": 4
},
{
"serialId": 1,
"tool": "collector",
"x": 4,
"y": 4,
"targetCount": 0
}
]
}
Theme JSON Format
In sandbox mode, use CUSTOMIZE to load a theme JSON. Settings are saved in your browser. Use RESET in CUSTOMIZE to clear stored theme data.
Here's some example theme JSON:
ui — game UI colors
Applied to the sidebar, window, buttons, etc.
bg: page / panel backgroundterminal: primary text and bordersterminalDark: secondary textterminalDim: dimmed labels and hintsterminalLight: bright text (e.g. window titles)accent: accent highlights (e.g. paused HUD tone, spring element default)danger: important actions (CANCEL, RESET, delete spark effects)hudRunning: color of :DhudPaused: color of :|hudCleared: HUD COLLECTED text when the clear target is metmodalBackdrop: dimmed area behind modal windowspanelBg,hoverBg,glow,subtleFill,accentHoverBg,dangerHoverBg: overrides for derived UI fills; leave empty ("") to auto-derive frombg/terminal/accent/danger
fonts — typography
game: name for game main font, also used for the send_o brand and window titlesui: name for game UIuiScale: multiplier applied to all UI text sizes, positive number between 0.2 and 8, default 1-
uiSizes: optional per-component UI text multipliers, each key stacks on top ofuiScale, same 0.2–8 range, default 1:brand(send_o logo),sectionTitle,levelSelect(level dropdown),levelInfo(level description box),toolButton,toolGlyph(tool icons),tips,controlButtonhud,contextMenu(right-click menu),modalTitle,modalText,modalButton,formLabel,formInput,themeExport,fontAlign(font align panel),debugOverlay
bitmapFill: legacy export field, glyph colors come from canvas tints-
elementOffsets: per-element glyph nudge inside each grid cell (pixels), keys match element types, each hasoffsetX/offsetY:conveyor,spring,portal,wall,filter,piston([T]idle body),pistonHead(extendedT/[ ]),spawner,collector,particle- positive X moves right, positive Y moves down relative to the cell center crosshair
elementSizes: per-element glyph font size (pixels), same keys aselementOffsets.
canvas — playfield rendering
background: playfield background behind the griddefaultTint: fallback tint for elements / particles without a dedicated entryserialDebugLabel: tint for level JSONserialIdlabels on built-in elements (plain number, e.g. 5) when debug overlay level = 4 or higherlayoutSerialDebugLabel: tint for player-placed layout index labels (plain number with different color fromserialDebugLabel, e.g. 0) when debug overlay level = 4 or higherplacementPreviewAlpha: opacity of the tool / paste placement ghost (0–1, default 0.55)
canvas.grid — grid dots / LOD cells
color: grid line / dot colorpreviewFillAlpha/previewStrokeAlpha: fill and outline of the placement preview cell under the cursorlodFillAlpha/lodStrokeAlpha: grid dot fill and cell outline opacitylodStrokeWidth: background cell outline width in screen pixels
canvas.selection — multi-select marquee on the playfield
color: selection box stroke colorfillAlpha: selection box fill opacitystrokeWidth: selection box line width in screen pixels
canvas.elements — fixed element glyph tints (bitmap text on the grid)
wall,conveyor: static element colorspring: default spring color;springReady/springCooldown: spring ready vs. on-cooldown statespiston,pistonHead: idle body ([T]) vs. extended head / bracket (T/[ ])portalStart,portalEnd: portal start vs. end glyphs- Filter, spawner, and collector glyphs are tinted by their particle type — see
canvas.particlesbelow, not this section
canvas.particles — particle and type-colored element tints (keys are particle type characters)
owhite,*yellow,=red,#cyan,+green,$magenta,~orange- Also drives filter / spawner / collector colors according to their configured particle type
canvas.fx — short-lived effect colors
place: spark effects when placing elementsdelete: spark effects when deletingcopy/cut: clipboard operation spark effectsspawn: spawner emit spark effectsselect: selection-change spark effectsfloatingText: floating COPY / CUT / PASTE labels
canvas.collector — collector full / badge styling
dimFactor: multiply tint when collector target is met (default 0.45)badgeLighten: lighten factor for the remaining-count badge (default 0.55)
Theme color values
Most theme color fields accept #rgb / #rrggbb or integer tints on canvas / debug.
For cycling RGB lighting, use a chroma object instead of a plain color:
{"chroma":{"colors":["#ff0080","#00e5ff","#a855f7"],"speed":1.2}}
colors: at least two hex colors, cycled in array orderspeed: full cycles per second (default 1); higher = faster
Chroma works on UI colors, canvas tints, and debug overlay colors. Optional rgba UI overrides (panelBg, etc.) cannot use chroma.
effects — page overlays (full send_o only)
crtOverlay: scanline RGB overlay, default truecrtGlow: inset screen glow, default truecrtFlicker: full-screen flicker layer, default truemodalGlow: pulsing glow on window content, default truehoverReveal: cursor-following highlight on UI buttons, default true
debug — debug overlay
hitboxPenetrable,hitboxSolid,hitboxPhysics,hitboxCollectorFull: playfield hitbox colorsdirection,portalLink,pointerCell,pointerCellOutside,playfieldBounds,fitBounds: guide overlaysfpsChart,lowFpsChart,longFrameMarker: performance chartsoverlayText,overlayBorder,overlayBg: debug panel chrome (dark themes; light themes still derive panel colors fromui)
Solutions
Stuck? Try adjusting one tool at a time first. When you want a hint, open the example solutions. These images reveal layouts for some levels; they are examples, not the only solutions.
Report a Problem
Use the contact links on about page. Include the game version, browser/device, steps to reproduce, and a level JSON or screenshot if it helps. Describe what happened and what you expected.
Known issue:
Sources
- Matter.js - Matter.js physics engine
- PixiJS - PixiJS renderer
- Share Tech Mono - Game default UI font
- unsafe-eval — PixiJS text rendering adapter
- VT323 - Game default main font
This game contains AI-assisted code
For sources used by pages other than send_o, see the sources page
遊戲介紹
send_o 是用文字字元組成的物理解謎遊戲。放置工具,把 spawner [G] 產生的粒子引導到類型相符的 collector [@]。觀察結果、暫停、調整配置,再試一次。
先從內建關卡認識各種工具,或在沙盒製作並分享自己的謎題。完整版與 lite 版的關卡和機制相同,lite 減少了視覺效果。你可以使用滑鼠、鍵盤或觸控操作。
第一次遊玩
- 開啟 send_o,在 LEVELS 選擇 1. GRAVITY。放置工具前,先找到生成器與收集器。
- 按 START 或空白鍵觀察粒子;看出它們在哪裡偏離收集器後,再按一次暫停。
- 在 TOOLS 選擇 CONVEYOR,點空格放置。要旋轉時,切換到 SELECT,選取你的輸送帶,再按 R。
- 按 RESET 清除粒子與收集計數,保留配置,再次開始比較結果。
- 觀察右上角狀態顯示(HUD)的 COLLECTED。達到通關條件時,計數會變綠色;通關後仍可繼續實驗。
操作與快捷鍵
滑鼠
- 左鍵點擊:放置元素 / 選取元素
- 左鍵拖曳:連續放置 / 移動元素(需使用 "SELECT" 工具)
- 右鍵拖曳 / 中鍵拖曳:平移視野
- 右鍵點擊:開啟快捷選單(複製、貼上、旋轉、刪除等)
- 拖曳 "send_o" 標題:移動側欄
- 雙擊 "send_o" 標題:重置側欄位置
- 左鍵點擊 HUD:切換 HUD 隱藏
鍵盤快捷鍵
數字鍵只能切換目前關卡允許的工具。旋轉與刪除作用於已選取、可編輯的元件。
- 空白鍵:開始 / 暫停
- 1:切換至 "SELECT" 工具
- 2:切換至 "CONVEYOR" 工具
- 3:切換至 "SPRING" 工具
- 4:切換至 "PORTAL" 工具
- 5:切換至 "WALL" 工具
- 6:切換至 "FILTER" 工具
- 7:切換至 "PISTON" 工具
- 8:切換至 "SPAWNER" 工具
- 9:切換至 "COLLECTOR" 工具
- R:旋轉
- D / Delete:刪除
- CTRL(或 ⌘)+ Z:復原
- CTRL + Y / ⌘ + shift + Z:重做
- CTRL(或 ⌘)+ C / CTRL(或 ⌘)+ X / CTRL(或 ⌘)+ V:複製 / 剪下 / 貼上
- F2:儲存關卡預覽(PNG)
- Shift + F2:儲存即時關卡預覽(PNG)
- Escape:取消選取 / 取消貼上模式
觸控
- 單指:等同滑鼠左鍵(放置、選取、拖曳)
- 長按:開啟快捷選單
- 雙指:捏合縮放、拖曳平移、扭轉旋轉
- 點擊 HUD:切換 HUD 隱藏
視野與鏡頭
- 滑鼠滾輪:以游標為中心縮放(0.35× - 4×),接近 1× 時會短暫吸附
- 右鍵拖曳 / 中鍵拖曳:平移視野
- 雙指捏合:同時縮放與平移
- 雙指旋轉:旋轉場地視角,接近 0°/90°/180°/270° 時會短暫吸附
- 切換關卡或調整視窗大小時,會重設縮放、平移與旋轉
遊戲模式
- 內建關卡:使用允許的工具解題,預設元件通常會鎖定。
- 通關後:場地會解鎖,包含預設元件與原本受限的工具,適合拆開解法、研究運作方式。
- 0. SANDBOX:自由實驗、匯入關卡、匯出作品與自訂遊戲外觀。沙盒開始時會生成迷宮。
- 匯入關卡:不勾 MOVABLE,就依作者的限制遊玩;勾選後可以自由編輯預設配置。MOVABLE 是匯入選項,不代表已完成解謎。
遊玩別人的關卡
- 下載作者提供的關卡 JSON 檔。
- 選擇 0. SANDBOX → IMPORT,再選取檔案或貼上 JSON 文字。
- 不勾選 MOVABLE,再按 IMPORT 確認。就可以以關卡創作者的建議配置開始遊玩。
想研究或改作配置時,匯入時勾選 MOVABLE。你可以保留原始檔,方便回到作者提供的版本。
製作與分享關卡
關卡 JSON 是描述場地、工具與目標的文字檔。先從下面能運作的範例開始,你可以直接在遊戲裡編輯。
- 下載這個範例關卡 JSON。進入 0. SANDBOX,選擇 IMPORT、選取檔案,勾選 MOVABLE 後確認。
- 看起來這關的收集器在生成器旁邊。確認暫停後,用 SELECT 把收集器從
(4, 4)移到(2, 2),位於生成器(2, 4)下方。按 RESET,再按 START 測試。場上同時只能有一顆粒子;漏接的粒子可能使生成停止,直到你重置或把它收進去。關卡目標是收集五顆粒子。 - 用元件的快捷選單調整粒子類型、生成間隔或收集目標。關卡整體的 JSON 設定用 EDIT 修改,再按 APPLY。
- 選擇 EXPORT,填入不重複的小寫 ID、容易辨識的名稱,以及說明目標的描述。
- 重新匯入匯出的檔案,建議不勾 MOVABLE 好測試玩家的體驗。若 ID 已存在,依提示取代,或替測試副本換一個 ID。確認使用允許的工具能夠通關。
- 分享匯出的 JSON 檔。關卡預覽可以一起附上,但不可當作可玩的關卡匯入。重新整理或關閉遊戲網頁前,先下載備份。
BOUNDARY 會把邊界牆包含在匯出檔案內。MINIFY 會產生緊湊的 JSON,想閱讀或編輯時可以不勾。座標、傳送門配對與通關條件請查關卡 JSON 格式。
套用與製作主題
- 下載 Slate 主題,或在主題格式參考下載看看其它範例。
- 進入 0. SANDBOX,開啟 CUSTOMIZE,載入或貼上主題 JSON,再按 APPLY。主題要放在這裡;關卡的 IMPORT 視窗是用來載入關卡檔案的。
- 想做自己的版本,一次先改一項:例如用
ui.bg改背景,或用fonts.uiScale調整介面字級。確認文字與各種粒子仍容易辨識。 - 在 CUSTOMIZE 裡用 EXPORT 儲存主題。如果選用了自訂 TTF/OTF 字體,請把字體檔與分享許可一併保留在作品中;只有字體名稱,不會讓另一台裝置取得該字體。
主題設定會保存在目前的瀏覽器。CUSTOMIZE 裡的 RESET 會恢復預設主題並移除本機設定,與遊戲場地的 RESET 按鈕不同。Lite 不會顯示完整版的頁面疊加特效。
常見問題
- 工具不能選或元件不能移動:可能是關卡限制。通關後會解鎖,或在匯入時使用 MOVABLE 進行編輯。
- 生成器不動了:檢查場上粒子是否已達
maxParticles,或是否用完有限的spawnNum。粒子上限設為 0 時不會生成。 - 收集器不收了:檢查
collectType,以及該收集器是否已達自己的目標。Filter 會讓符合類型的粒子穿過,不會收集粒子。 - 通關不了:
level看總收集量;collectors看每個有正數目標的收集器;both兩者都要達成。關卡目標設為 0 時,總收集量條件不會達成。只看收集器的模式會略過目標為 0 的收集器;如果沒有正數收集器目標,該條件會直接視為達成。 - JSON 無法匯入:先確認視窗類型,再檢查逗號、雙引號與括號。錯誤中的
elements[n]指 elements 陣列的項目,從 0 起算。也要檢查重疊座標,以及傳送門是否互相配對。 - 遊戲卡卡的:試試 lite,或降低粒子上限。回報問題時,附上關卡檔、遊戲版本、瀏覽器與裝置、重現步驟,以及預期結果。
元素說明
Conveyor >
對接觸的粒子持續施加朝指定方向的推力。
可用角度:0°、45°、90°、135°、180°、225°、270°、315°。
Spring U
粒子接觸時,會朝彈簧面向的方向高速彈射,接著進入冷卻(符號變為 V),冷卻結束後恢復。
可用角度:0°、45°、90°、135°、180°、225°、270°、315°。
Portal P
分為起點(紫色)和終點(藍色)。粒子接觸起點後會立刻傳送到終點,並有短暫冷卻以避免重複觸發。
先放置起點,再點擊放置終點以配對。
不可旋轉。
Wall #
靜態障礙物,粒子會依入射角度反彈。
可用角度:0°、90°、180°、270°。
橫向牆壁(90° 或 270°)無法被活塞移動,邊界牆預設為這個方向。通關後、沙盒中,或關卡設定了 movable 旗標時,可以旋轉邊界牆,讓活塞能與它互動。
Filter F
依粒子類型選擇性通過的牆壁。Filter 會以對應粒子類型(filterType)的顏色標示:相符的粒子會直接穿過,其它粒子則把它當成普通實心牆壁。
不可旋轉。
Piston [T]
粒子靠近時,活塞頭朝指定方向伸出,推動前方元件並對粒子施加速度;縮回時會把頭部後方的元件拉回。
可用角度:0°、90°、180°、270°。
推進鏈遇到橫向牆壁時會停止,但仍可推動橫向牆前方有空間的元件。活塞鏈最多 25。
Spawner [G]
定時朝指定方向生成粒子(0° 時向下,預設間隔為 90 個模擬 tick)。場上粒子數達到關卡的 maxParticles 時會暫停生成。
可用角度:0°、90°、180°、270°。
Collector [@]
收集進入其格子且類型相符(collectType)的粒子,增加計數並播放音效。其它類型的粒子會直接穿過,不被收集。
收集器依 collectType 顯示顏色。達到自己的 targetCount 時,顏色會調暗以表示完成,並停止收集;targetCount 為 0 代表無限,不會調暗。targetCount > 0 時,右下角會以較亮的數字顯示還差幾顆。關卡通關條件達成時,HUD 計數會變綠色。
可用角度:0°、90°、180°、270°。
粒子類型
粒子共有七種以顏色區分的類型,各自有不同的物理特性。生成器、收集器與過濾器都使用這些類型。
o白色 — 基準:一般重量、重力、摩擦與彈性*黃色 — 輕:重力較弱,下落慢,更容易飄動=紅色 — 重:重力強,下落與堆積快#青色 — 高彈性:恢復係數很高,反彈強烈+綠色 — 近乎反重力:幾乎不下落,會在場上飄動$紫色 — 黏而重:摩擦力很大、彈性低,在輸送帶上較慢、容易堆積,也很難被彈簧彈開~橘色 — 滑:摩擦力很小、彈性低、重力一般,在輸送帶上移動較快
遊戲介面
選擇關卡與工具
LEVELS 選擇關卡,LEVEL DESC. 顯示關卡說明。用 TOOLS 選工具。工具不可用,表示目前模式限制了該工具。
執行、重試與編輯
- START / PAUSE:開始或暫停模擬,快捷鍵是空白鍵。
- RESET:清除場上粒子與收集計數,保留配置,方便再次嘗試。
- CLEAR ALL:重建關卡。一般內建解謎關卡會移除玩家放置的元件;自訂或解鎖模式會重新載入關卡資料,其中 MOVABLE 自訂關卡會保留編輯後的配置。不要把它當成清空畫布的指令。重建前,先匯出想保留的作品。
- IMPORT:在沙盒載入關卡 JSON。EDIT:修改已匯入自訂關卡的 JSON。
- EXPORT:將沙盒或自訂關卡儲存為 JSON。CUSTOMIZE:在沙盒或自訂關卡開啟主題設定。
調整元件
對元件按右鍵或長按,開啟快捷選單。PARTICLE 選粒子類型,INTERVAL 調整生成器間隔,TARGET 調整收集器目標。- / + 按鈕可長按。受限制的屬性會顯示為不可用。
選單的 Level Preview 可以儲存 PNG,長按該選項則取得即時預覽;鍵盤對應 F2 與 Shift + F2。
狀態顯示
- STATUS::D 表示執行中,:| 表示暫停。
- CURSOR:游標下方的格子座標。
- PARTICLES:場上粒子數 / 粒子上限。
- COLLECTED:收集量 / 目標,綠色表示已達通關條件。
進階
在遊戲網址後加 ?debug=1,可查看基本效能與關卡資訊。等級 2、3、4 分別增加詳細效能、裝置資訊、關卡與元件診斷。等級 4 也會顯示碰撞範圍、輔助線與元件 ID。除錯模式會開放一些測試關卡,其中部分負載較高。一般遊玩不需要這些資訊。
關卡 JSON 格式
最上層欄位
id(必填):關卡識別碼,接受小寫英文字母、數字、-、.、_,最多 50 個字元,不可連續使用兩個句點(..)。匯出檔名為send_o-<id>.json。name(必填):顯示在關卡選單中的名稱,最多 100 個字元description:關卡描述,最多 500 個字元width/height:場地的格子尺寸(欄 × 列),buildBoundary為 true 時用於生成邊界牆,預設 25 × 18startX/startY:場地矩形的笛卡兒座標原點(左下角)。buildBoundary為 true 時,邊界牆依此原點與width/height生成,不會移動elements的x/y座標。請讓原點與配置對齊;錯誤的原點可能讓牆生成在錯的位置,甚至把剛好位於該範圍邊緣的橫向牆視為多餘邊界牆,在匯出時省略buildBoundary:是否在場地邊緣生成邊界牆,可為 true(預設)或 false。玩家放置的元件會保留,但場地邊緣的橫向牆會被略過,不包含在匯出檔案中maxParticles:場上粒子數上限(非負整數),達到上限時生成器暫停,設為 0 時不會生成,預設 20targetCount:關卡通關目標,即所有收集器的總收集量(clearCondition為level或both時使用),設為 0 代表無限,預設 10clearCondition:通關方式,可為level(預設)、collectors(每個targetCount> 0 的收集器都達標,HUD 顯示N / *),或bothdisallowedTools:一般遊玩時禁用的放置工具陣列(通關後、沙盒中,或movable為 true 時忽略此限制),可填 conveyor、spring、portal、wall、filter、piston、spawner、collector。省略或填空陣列時,預設禁用 portal、spawner、collectorspeed:關卡速度倍率,大於 1 加速,介於 0 與 1 之間減速,1 為正常速度,預設 1gravity:重力倍率,0 為無重力,負數為向上重力,1 為預設正常重力spawnNum:每次執行期間,各生成器可產生的粒子總數,0(預設)代表無限elements(必填):元素物件陣列,可以為空
元素陣列
每個元素物件包含:
serialId:關卡內不重複的整數,用於傳送門配對(portal 必填)tool(必填):元素類型,可為 conveyor、spring、portal、wall、filter、piston、spawner、collectorx/y(必填):笛卡兒座標系的格子座標(左下角為原點,向右 x 增加,向上 y 增加)-
rotation(wall、conveyor、spring、piston、spawner、collector 使用,預設 0):以度數表示的整數旋轉角度- conveyor, spring: 0, 45, 90, 135, 180, 225, 270, 315
- wall, piston, spawner, collector: 0, 90, 180, 270
- filter、portal 不使用旋轉;spawner 旋轉會改變生成方向,collector 旋轉不影響它可收集的粒子類型
- 不接受其它數值(例如 123、-1、114.514、"x x xxx")
role(portal 專用,必填):start 或 endpairedSerialId(portal 專用,必填):配對傳送門的serialIdfilterType(filter 專用):允許通過的粒子類型,可為 o、*、=、#、+、$、~,預設 ospawnType(spawner 專用):粒子類型,可為 o、*、=、#、+、$、~,預設 ointerval(spawner 專用):以 tick 為單位的生成間隔,預設 90(60 Hz 下約 1.5 秒)collectType(collector 專用):收集器接受的粒子類型,可為 o、*、=、#、+、$、~,預設 otargetCount(collector 專用):此收集器的收集目標,0 代表無限;右下角會顯示剩餘數量
旋轉角度參考
角度為順時針度數。各元素的預設朝向如下:
- Wall:0° = 直向 #
- Conveyor:0° = 向右
- Spring:0° = 向上彈射
- Piston:0° = 向上推送
- Spawner:0° 向下、90° 向左、180° 向上、270° 向右
JSON 格式範例
{
"id": "guidefirstdrop",
"name": "G. FIRST DROP",
"description": "Guide five particles into the collector. Try moving collector to clear this level!",
"width": 7,
"height": 7,
"maxParticles": 1,
"targetCount": 5,
"elements": [
{
"serialId": 0,
"tool": "spawner",
"x": 2,
"y": 4
},
{
"serialId": 1,
"tool": "collector",
"x": 4,
"y": 4,
"targetCount": 0
}
]
}
主題 JSON 格式
在沙盒模式用 CUSTOMIZE 載入主題 JSON。設定會保存在你的瀏覽器;用 CUSTOMIZE 裡的 RESET 可清除儲存的主題資料。
以下是一些主題 JSON 範例:
ui — 遊戲介面配色
套用至側欄、視窗、按鈕等介面。
bg:頁面 / 面板背景terminal:主要文字與邊框terminalDark:次要文字terminalDim:較淡的標籤與提示terminalLight:較亮的文字,例如視窗標題accent:強調色,例如 HUD 暫停狀態與彈簧的預設色danger:重要操作(CANCEL、RESET、刪除火花效果)hudRunning::D 的顏色hudPaused::| 的顏色hudCleared:達到通關目標時 HUD 的 COLLECTED 文字顏色modalBackdrop:對話框後方的遮罩panelBg、hoverBg、glow、subtleFill、accentHoverBg、dangerHoverBg:衍生介面填色的覆寫值;留空("")會依bg/terminal/accent/danger自動推算
fonts — 字體
game:遊戲主要字體名稱,也用於 send_o 標誌與視窗標題ui:遊戲介面的字體名稱uiScale:套用到所有介面字級的倍率,接受 0.2 至 8 之間的正數,預設 1-
uiSizes:各部件介面文字的可選倍率,每項會再乘上uiScale,同樣接受 0.2–8,預設 1:brand(send_o 標誌)、sectionTitle、levelSelect(關卡下拉選單)、levelInfo(關卡說明框)、toolButton、toolGlyph(工具圖示)、tips、controlButtonhud,contextMenu(right-click menu),modalTitle,modalText,modalButton,formLabel,formInput,themeExport,fontAlign(font align panel),debugOverlay
bitmapFill:舊版匯出欄位,字形顏色來自畫布著色-
elementOffsets:各元素字形在格子內的位移(像素),鍵名對應元素類型,每項含offsetX/offsetY:conveyor、spring、portal、wall、filter、piston(收合本體[T])、pistonHead(伸出頭部T/[ ])、spawner、collector、particle- 正 X 向右、正 Y 向下,以格子中心的十字線為基準
elementSizes:各元素字形的字級(像素),鍵名同elementOffsets。
canvas — 遊戲場地繪製
background:網格後方的場地背景defaultTint:沒有專屬設定的元素或粒子使用的預設著色serialDebugLabel:除錯等級 4 以上時,內建元件的關卡 JSONserialId標籤顏色(純數字,例如 5)layoutSerialDebugLabel:除錯等級 4 以上時,玩家放置元件的配置索引標籤顏色(與serialDebugLabel顏色不同的純數字,例如 0)placementPreviewAlpha:工具或貼上放置預覽的透明度(0–1,預設 0.55)
canvas.grid — 網格點 / LOD 格線
color:格線 / 網格點顏色previewFillAlpha/previewStrokeAlpha:游標下放置預覽格的填色與外框lodFillAlpha/lodStrokeAlpha:網格點填色與格線透明度lodStrokeWidth:背景格線寬度,以螢幕像素為單位
canvas.selection — 場上的框選區域
color:選取框邊線顏色fillAlpha:選取框填色透明度strokeWidth:選取框線寬,以螢幕像素為單位
canvas.elements — 固定元素字形著色(網格上的點陣文字)
wall、conveyor:靜態元素顏色spring:彈簧預設色;springReady/springCooldown:可觸發 / 冷卻中的顏色piston、pistonHead:收合本體([T])與伸出的頭部 / 括號(T/[ ])portalStart、portalEnd:傳送門起點與終點的字形顏色- Filter、spawner、collector 的字形依粒子類型著色,請看下方的
canvas.particles,不在此區設定
canvas.particles — 粒子與依類型著色的元件顏色(鍵名為粒子字元)
o白、*黃、=紅、#青、+綠、$洋紅、~橘- 也會依設定的粒子類型,決定 filter / spawner / collector 的顏色
canvas.fx — 短暫特效顏色
place:放置元件時的火花效果delete:刪除時的火花效果copy/cut:剪貼簿操作的火花效果spawn:生成器產生粒子時的火花效果select:選取變更時的火花效果floatingText:浮動的 COPY / CUT / PASTE 標籤
canvas.collector — 收集器滿載 / 徽章樣式
dimFactor:收集器達標時的著色乘算係數(預設 0.45)badgeLighten:剩餘數量徽章的提亮係數(預設 0.55)
主題色欄位格式
多數主題色欄位接受 #rgb / #rrggbb,或 canvas / debug 使用的整數色值。
想使用循環 RGB 燈光時,可用 chroma 物件取代單一顏色:
{"chroma":{"colors":["#ff0080","#00e5ff","#a855f7"],"speed":1.2}}
colors:至少兩個 hex 色,依陣列順序循環speed:每秒完整循環次數(預設 1),數值越大越快
Chroma 可用於介面顏色、畫布著色與除錯面板顏色;可選的 rgba 介面覆寫值(panelBg 等)不支援 chroma。
effects — 頁面疊加效果(僅完整版 send_o)
crtOverlay:掃描線 RGB 疊層,預設 truecrtGlow:螢幕內緣光暈,預設 truecrtFlicker:全畫面閃爍層,預設 truemodalGlow:視窗內容的脈動光暈,預設 truehoverReveal:介面按鈕上跟隨游標的高光,預設 true
debug — 除錯面板
hitboxPenetrable、hitboxSolid、hitboxPhysics、hitboxCollectorFull:場上的碰撞範圍顏色direction、portalLink、pointerCell、pointerCellOutside、playfieldBounds、fitBounds:輔助線fpsChart、lowFpsChart、longFrameMarker:效能圖表overlayText、overlayBorder、overlayBg:除錯面板外觀(深色主題;淺色主題仍由ui推算面板色)
參考解法
你卡了?可以先一次只調整一個工具。想看提示時,再開啟範例解法。圖片會揭露部分關卡的配置;它們是範例,不是唯一的解法。
回報問題
使用 about 頁面的聯絡方式。附上遊戲版本、瀏覽器與裝置、重現步驟,必要時提供關卡 JSON 或截圖,並說明實際與預期結果。
已知問題:
素材來源
- Matter.js - Matter.js 物理引擎
- PixiJS - PixiJS 渲染引擎
- Share Tech Mono - 遊戲預設介面字體
- unsafe-eval — PixiJS 文字渲染配接器
- VT323 - 遊戲預設主要字體
本遊戲含有 AI 輔助程式碼
send_o 以外的其它網頁素材來源請見 sources 頁面