Complete reference
All 34 commands—without guesswork.
Every card explains syntax and cost as well as exact behavior, result flow, tactical use and common mistakes. Tap a command to open the full reference.
- 34
- commands
- 7
- categories
- 200
- max. lines
Go If consumes exactly one fresh result from the immediately preceding testable command. Selection, rotation, waiting or another control command in between makes the result stale.
05 commands
Growth
GrowCreates exactly one cube in a fixed direction.4 units
grow(direction: .xPlus)Starting at the active cube, only the adjacent cell on the chosen axis is checked. If it is free, one own cube is created there and becomes active. Boundaries and occupied cells stop the attempt; the command never chooses an alternative direction.
Parameters
- direction: one of the six axes xPlus, xMinus, yPlus, yMinus, zPlus or zMinus.
Result
Produces a fresh result such as free, blocked, boundary, own cube, enemy cube or enemy core. Direct core contact wins immediately.
Tactical use
Best for precisely planned arms, grids and controlled advances where every direction is deliberate.
Common mistake
A blocked attempt does not change the preferred direction. Use Find Free Direction first when automatic evasion is required.
checkNeighbor(direction: .xPlus)
goIf(.free, to: .advance)
.advance:
grow(direction: .xPlus)Grow If FreeChecks and grows atomically into the first genuinely free target cell.5 units
growIfFree()With an explicit direction, only that adjacent cell is checked. Without one, the preferred direction is tested first, followed deterministically by the remaining neighbors. The first free candidate is built and stored as the new preferred direction. Occupied cells are neither attacked nor captured, and this command cannot win through core contact.
Parameters
- direction: optional; strict when supplied, otherwise an automatic search starting with the preferred direction.
Result
Reports success with a new cube, or blocked when no valid free cell can be found. Can be consumed directly by Go If.
Tactical use
Without a parameter it is a compact safe-evasion step; with a direction it suits precisely planned grid lines.
Common mistake
This command only grows into empty space. Use Capture Enemy Cube for enemy contact.
growIfFree()
goIf(.blocked, to: .newRoute)Grow to MarkerMoves one axis step closer to the selected spatial target.6 units
growToMarker()The largest distance to the stored marker determines the next axis. With wrap-around, the shorter valid route is used. If the marker has already been reached, the command reports success without creating an unnecessary cube.
Parameters
- marker: optional slot 1 to 5. Omit it to use the most recently active marker; slots 4 and 5 require the memory upgrade.
Result
Success, blockage, boundary or missing/locked marker; can be used directly by Go If.
Tactical use
For return points, patrols and routes between a search front and a safe origin.
Common mistake
Without a valid active marker, the structure remains unchanged. Use Marker is now needed only by legacy programs that deliberately switch targets.
setMarker(marker: 1, direction: .yPlus, range: 4)
// later
growToMarker()Grow in Preferred DirectionGrows cheaply in the stored preferred direction.3 units
growPreferredDirection()Uses the exact preferred direction produced by signal search, scanning, Set Direction or Find Free Direction. The command is deliberately simple and never detours around boundaries or obstacles.
Parameters
- No parameters.
Result
Reports growth success or the concrete blockage and therefore produces a fresh condition result.
Tactical use
The standard follow-up to Find Strongest Signal or Find Free Direction.
Common mistake
An old or rotated preferred direction can differ from the expected scan route.
findStrongestSignal()
scanDirection(range: 6)
growPreferredDirection()Grow RandomlyRandomly chooses one currently free adjacent cell.5 units
growRandomly()On completion, all six neighbors of the active cube are considered. Exactly one free candidate is selected at random. This creates varied structures but not a reproducible route.
Parameters
- No parameters.
Result
Success with a new active cube, or blocked when no neighbor is free.
Tactical use
Useful for broad exploration, unpredictable opponents and batch tests against rigid strategies.
Common mistake
Randomness complicates debugging and does not guarantee progress toward a signal.
selectNewest()
growRandomly()
scanArea(radius: 1)05 commands
Sensing
Check NeighborInspects exactly one adjacent cell—cheaply and unambiguously.2 units
checkNeighbor(direction: .xMinus)The sensor looks one cell away and distinguishes free space, own structure, enemy, enemy core, core aura, neutral cube, item, boundary and blockage. Enemy findings update the preferred direction.
Parameters
- direction: optional; omit it to inspect the preferred direction.
Result
Always produces a fresh sensor result. Finding the enemy core directly ends the match.
Tactical use
Often more efficient and precise than an area scan in close combat.
Common mistake
Consecutive neighbor checks overwrite the previous result; Go If must follow the result it should consume.
checkNeighbor(direction: .zMinus)
goIf(.enemyCore, to: .attack)Scan DirectionScans a straight ray until the first occupied cell.2 + range
scanDirection(direction: .xPlus, range: 6)Starting at the active cube, cells are checked one by one up to the configured range. The ray stops at the first own, enemy, neutral or item cube and cannot see through it. If direction is omitted, the preferred direction is used; enemy and aura findings store the scan direction.
Parameters
- direction: optional; defaults to the preferred direction.
- range: 1 to 8; default 4 and directly affects cost.
Result
Returns the first relevant hit on the ray. A visible enemy core wins immediately.
Tactical use
Use after Find Strongest Signal to confirm the rough axis, or as an efficient corridor scan.
Common mistake
The full range cost is paid even when the ray is blocked early. Your own cubes can obstruct the view.
findStrongestSignal()
scanDirection(range: 8)
goIf(.coreAura, to: .closeCombat)Scan AreaInspects a diamond-shaped 3D neighborhood around the active cube.8 units (radius 1) / 20 units (radius 2)
scanArea(radius: 2)Radius 1 covers the six direct neighbors; radius 2 adds every nearby cell at Manhattan distance two. Results follow a fixed priority: enemy core, core aura, enemy cube, item, neutral cube, own cube, free cell.
Parameters
- radius: 1 or 2. Radius 2 costs much more but covers substantially more space.
Result
A fresh prioritized result; finding the enemy core wins immediately.
Tactical use
Use radius 1 for close combat and contact fronts; reserve radius 2 for deliberate wide scans, not every loop.
Common mistake
The result reports the most important finding, not a complete list of every cell.
scanArea(radius: 1)
goIf(.neutralCube, to: .collect)Scan Body ContactReports new or core-advancing enemy contact anywhere on the own structure.12 units
scanBodyContact()The sensor checks every direct face shared by the own and enemy structures and stores the own contact point closest to the core. New or closer contact returns .bodyContact. An unchanged outer front produces no repeated alarm. Within three cells, .coreThreat remains urgent on every scan. The active cube and preferred direction stay unchanged.
Parameters
- No parameters.
Result
.bodyContact for new or closer contact, .coreThreat inside the core-protection range, or blocked when no relevant contact exists.
Tactical use
Placed at the start of a loop, it detects attacks on distant branches without moving the current attack front.
Common mistake
The scan does not activate the stored contact point. Activate Contact Point must follow inside the defense branch.
scanBodyContact()
goIf(.bodyContact, to: .defense)
.defense:
activateContactPoint()Track Enemy StructureRemembers a confirmed breach for 96 units and follows the enemy structure locally inward.4 units
trackEnemyStructure()A real enemy finding, body contact or successful capture is required. This pursuit knowledge remains valid for 96 units even if a flanking command replaces the latest sensor result. The active cube must still touch enemy structure directly. The command then chooses a direction deeper into the connected body and avoids a still-stabilized target when possible. It does not capture a cube or reveal the core.
Parameters
- No parameters.
Result
Enemy cube with an updated preferred direction, or blocked when local contact has been lost.
Tactical use
Use immediately after a successful capture inside a hunt loop to dismantle an enemy branch without another long-range search.
Common mistake
Stored pursuit knowledge does not replace direct contact. If the active cube has moved away, the command returns blocked.
.hunt:
trackEnemyStructure()
goIf(.blocked, to: .flank)
captureEnemyCube()
goIf(.enemyCube, to: .hunt)03 commands
Structures
Capture Enemy CubeCaptures an enemy cube directly adjacent to the active own cube.8 units
captureEnemyCube()The attack starts exclusively from the active own cube and uses an optional explicit direction, otherwise the preferred direction. The captured cube becomes active and is stabilized against immediate recapture for 12 units. A protected target returns blocked. Hitting the enemy core wins the match; enemy sections disconnected from their core become neutral.
Parameters
- direction: optional; selects the exact adjacent side, otherwise the preferred direction is used.
Result
Enemy cube, enemy core or blocked. Success keeps the active point at the new contact front.
Tactical use
After Activate Contact Point, this command clears a remotely detected contact front locally. Track Enemy Structure then keeps the confirmed breach active.
Common mistake
The command no longer searches the entire own structure automatically. Without the correct active contact point it cannot reach a distant target.
activateContactPoint()
captureEnemyCube()
goIf(.enemyCube, to: .hunt)Capture Neutral CubeAdds an adjacent neutral cube to the own structure.4 units
captureNeutralCube(direction: .yPlus)All own contact surfaces are searched for neutral cubes. Exact scan targets, proximity to the scan point, optional direction and distance to the active cube determine the selection. The captured cube becomes active.
Parameters
- direction: optional; influences selection but does not force one specific contact.
Result
Success with a new active structure point, or no reachable neutral cube.
Tactical use
Efficient expansion where neutral cubes already occupy valuable positions.
Common mistake
A neutral finding is useful only when at least one own cube has direct contact.
scanArea(radius: 1)
goIf(.neutralCube, to: .collect)
.collect:
captureNeutralCube()Expand FrontAutomatically chooses a useful edge cube and expands the structure there.8 units
expandFront()The command evaluates the whole own front, not just the active cube. It sorts candidates using the optional or stored direction and creates exactly one cube on a genuinely free adjacent point.
Parameters
- direction: optional preference for the front search.
Result
Success with a new edge cube, or blocked when no safe front cell is free.
Tactical use
Robust network expansion when the active cube is trapped or the structure has several branches.
Common mistake
The automation is expensive and less predictable than a directed growth step.
findStrongestSignal()
expandFront()
captureEnemyCube()10 commands
Selection & direction
Set DirectionImmediately stores a new preferred direction.1 unit
setDirection(direction: .zPlus)Only the direction value is replaced. Active cube, markers, scan knowledge and structure remain unchanged. Subsequent direction-aware or automatic commands can use the new value.
Parameters
- direction: one of the six 3D axis directions.
Result
No sensor result; a previously fresh result can no longer be consumed by Go If afterward.
Tactical use
For fixed openings, directional phases and reproducible test programs.
Common mistake
Do not place Set Direction between a sensor and Go If because the result becomes stale.
setDirection(direction: .zPlus)
growPreferredDirection()Rotate DirectionCycles the preferred direction through 3D space.1 unit
rotateDirection(steps: 1)The six axis directions use a fixed order. Positive and negative steps rotate in opposite directions, wrapping around at the end. This enables spirals, zigzags and systematic spatial sweeps.
Parameters
- steps: -2 to 2; default 1.
Result
No fresh condition result; only the stored direction changes.
Tactical use
Rotate after blockages or scan a different axis on every loop.
Common mistake
Rotation depends on the current value. Use Set Direction first when an absolute starting direction is required.
scanDirection(range: 4)
rotateDirection(steps: 1)
goTo(to: .search)Find Free DirectionDeterministically finds a free neighbor and stores its direction.3 units
findFreeDirection()All six direct neighbors are checked in a fixed order starting with the current preferred direction. The first free candidate wins. No cube is created yet; the following growth step remains a deliberate decision.
Parameters
- No parameters.
Result
free with an updated preferred direction, or blocked when no neighbor is free.
Tactical use
The most reliable pairing is Find Free Direction immediately followed by Grow in Preferred Direction.
Common mistake
The command builds nothing by itself. Without a following growth command, the structure does not change.
findFreeDirection()
goIf(.blocked, to: .core)
growPreferredDirection()Find Strongest SignalDetermines the rough axis of the strongest enemy signal.18 units
findStrongestSignal()The search stores only the dominant axis and displays it at the active cube for 30 game units. Inside the core aura, the hint points roughly toward the core but reveals neither an exact position nor a concrete cube. A real enemy finding ends the hint.
Parameters
- No parameters.
Result
A fresh signal or aura hint plus a new preferred direction. This command cannot win on its own.
Tactical use
Use sparingly as an expensive guide, then verify with Scan Direction or close-range sensing.
Common mistake
The signal is not a line of sight. Blind growth can still hit structure or a boundary even when the axis is correct.
findStrongestSignal()
goIf(.coreAura, to: .closeCombat)
scanDirection(range: 8)Activate Contact PointSelects the own cube at the most recently stored body contact.2 units
activateContactPoint()The command uses the most recent still-valid Scan Body Contact result. It activates the own contact cube and aims the preferred direction at the touching enemy cube. It neither builds nor attacks. If the stored contact is stale or gone, selection and direction remain unchanged.
Parameters
- No parameters.
Result
Success with an activated contact point, or blocked without a valid stored contact.
Tactical use
Connects the global body scan to a local capture, enabling fast defense on distant branches.
Common mistake
Activate Contact Point does not attack. Capture Enemy Cube must run separately afterward.
scanBodyContact()
goIf(.bodyContact, to: .defense)
.defense:
activateContactPoint()
captureEnemyCube()Select CoreSelects the own program core as the active origin.1 unit
selectCore()Only the active selection changes. Core position and state, remaining structure, markers, direction and sensor knowledge are preserved.
Parameters
- No parameters.
Result
No sensor result.
Tactical use
Starting point for defense, core-centered markers and controlled core movement.
Common mistake
Selection commands invalidate a previous result for Go If.
selectCore()
setMarker(marker: 1, range: 2)Move CoreAtomically moves the program core one cell in the preferred direction.5 units
moveCore()A free target first becomes an own cube and then the new core; an existing own target cube becomes the core directly. The previous core remains as a normal cube. Enemies, neutral cubes and boundaries block the move without any detour.
Parameters
- No parameters.
Result
Success or concrete blockage; usable as a fresh result for Go If.
Tactical use
Enables small mobile structures and makes stale core-position assumptions dangerous for the opponent.
Common mistake
Movement follows only the preferred direction. Scan first or use Find Free Direction.
findFreeDirection()
moveCore()
deleteOldest()Select NewestActivates the newest own cube that still exists.1 unit
selectNewest()Internal creation order decides the result. This reliably returns the origin to the latest growth tip even if other commands changed the active cube.
Parameters
- No parameters.
Result
No sensor result; only the selection changes.
Tactical use
A common start for search loops and a useful follow-up after front expansion.
Common mistake
The newest cube is not necessarily the spatially outermost or strategically best one.
selectNewest()
scanDirection(range: 6)Select OldestActivates the oldest remaining non-core cube.1 unit
selectOldest()Selection follows creation age while protecting the core. If the structure consists only of the core, the current selection remains unchanged.
Parameters
- No parameters.
Result
No sensor result.
Tactical use
Useful for retraction, maintaining old branches or inspecting the structural root.
Common mistake
Oldest does not automatically mean safe to delete; deletion commands check connectivity separately.
selectOldest()
scanArea(radius: 1)Select OutermostActivates the own cube with the most extreme coordinate on an axis.2 units
selectOutermost(direction: .xPlus)The largest coordinate wins in a positive direction and the smallest in a negative direction. This selects an outer front independently of creation order.
Parameters
- direction: optional; defines the axis and positive or negative side. Omit it to use the preferred direction.
Result
No sensor result.
Tactical use
For systematic mapping and flank attacks. After Find Strongest Signal, omitting the parameter selects the outermost front facing the signal.
Common mistake
Internal order breaks ties; several cubes can share the same extreme coordinate.
selectOutermost(direction: .yMinus)
growIfFree(direction: .yMinus)04 commands
Program control
Go ToUnconditionally jumps to a named program label.1 unit
goTo(to: .search)A program label sits directly before the first command of its block, is not an executable command and costs no units. The editor keeps labels and targets together when moving code. Older numeric line targets remain compatible.
Parameters
- to: unique label name; programs support up to 200 command lines.
Result
The next executed command is the first command after the target label.
Tactical use
For clear loops, separate search/close-combat phases and skipping alternative branches.
Common mistake
Live analysis reports missing, duplicate or self-referencing labels. A jump invalidates sensor results.
.search:
findStrongestSignal()
scanDirection()
goTo(to: .search)Go IfBranches once using the fresh result of the immediately preceding command.1 unit
goIf(.coreAura, to: .closeCombat)Only commands that produce a condition result can prepare Go If. The result is consumed by this evaluation whether or not the condition matches. No selection, direction, wait or control command may appear in between.
Parameters
- condition: for example free, blocked, enemy cube, enemy core, core aura, body contact, core threat, item, boundary, neutral cube or any finding.
- to: unique target label.
Result
Matching results jump; otherwise execution continues on the next line. The result is consumed afterward.
Tactical use
The key building block for state changes, if/else logic and targeted reactions.
Common mistake
Several Go If commands cannot test the same result in sequence. A new sensing command must run before another test.
scanDirection(range: 6)
goIf(.coreAura, to: .closeCombat)WaitDelays only the own program while the opponent and match continue.1 to 50 wait units
wait(count: 3)The program remains on this line for the configured number of units. Structure, active cube, direction and markers stay unchanged. Waiting can deliberately offset actions or let an opponent enter range.
Parameters
- count: 1 to 50; every unit delays the next own command.
Result
No sensor result; any previous result becomes stale.
Tactical use
For timing experiments, asynchronous patterns and controlled interception strategies.
Common mistake
Waiting is not free. Long pauses give the opponent real computation time.
wait(count: 3)
scanArea(radius: 1)Restart ProgramRestarts early at the first active program line.1 unit
restartProgram()This advanced command skips every line below it. Programs loop automatically at the normal end, so it is useful only for deliberately aborting a special branch.
Parameters
- No parameters.
Result
Jumps to the beginning; direction, markers and active cube remain, sensor results do not.
Tactical use
A compact emergency exit from long subroutines when a dedicated return label is unnecessary.
Common mistake
At the end of a program this command is redundant and merely costs an extra unit.
.specialCase:
scanArea(radius: 1)
restartProgram()02 commands
Markers
Set MarkerStores a calculated spatial coordinate in a marker slot.2 + range
setMarker(marker: 1, direction: .yPlus, range: 4)Direction and distance are applied from the active cube to calculate a target coordinate. A valid target is stored and the slot is activated. Targets beyond the arena are not stored without wrap-around.
Parameters
- marker: slot 1 to 5; 1 to 3 immediately, 4 and 5 after the memory upgrade.
- direction: optional; defaults to the preferred direction.
- range: 1 to 8; default 2 and affects cost.
Result
Success with a stored target, or boundary/locked slot; directly testable.
Tactical use
For return points, fixed scan positions and multi-phase routes.
Common mistake
A marker is a spatial target, not a program-code label.
selectCore()
setMarker(marker: 1, direction: .yPlus, range: 4)Use MarkerLegacy command: activates an existing marker as the current spatial target.1 unit
useMarker(marker: 2)The stored target is selected, but the active cube is not moved. Empty or locked slots clearly report a blockage. The editor no longer offers this redundant step for new programs; Grow to Marker uses the active or specified slot directly. Existing programs remain compatible.
Parameters
- marker: slot 1 to 5.
Result
Success for a valid marker, or blocked; can be consumed as a fresh result.
Tactical use
Relevant only for legacy programs or deliberate switching among several stored targets.
Common mistake
For new code, use Grow to Marker(marker: …) or Grow to Marker() directly.
useMarker(marker: 2)
goIf(.blocked, to: .fallbackRoute)
growToMarker(marker: 2)05 commands
Retraction
Delete OldestRemoves the oldest safe non-core cube.3 units
deleteOldest()The oldest candidate is removed only if the core remains protected and every remaining cube still connects to the core through adjacent cells.
Parameters
- No parameters.
Result
Success or safety blockage; fresh and consumable by Go If.
Tactical use
Keeps moving structures small and removes obsolete rear sections.
Common mistake
An old articulation point is not removed when that would detach a branch.
moveCore()
deleteOldest()Delete NewestRemoves the newest safe non-core cube.2 units
deleteNewest()The newest remaining cube is checked for core protection and overall connectivity. It is deleted only when the remaining structure stays fully connected.
Parameters
- No parameters.
Result
Success or safety blockage.
Tactical use
Controlled undo for the latest growth step, useful for probing advances.
Common mistake
After automatic front expansion, the newest cube is not necessarily the active point.
growPreferredDirection()
goIf(.blocked, to: .back)
.back:
deleteNewest()Delete ActiveAttempts to remove only the currently selected cube.2 units
deleteActive()The core cannot be deleted. Any other active cube is removed only if the remaining structure stays connected. After success, the core becomes active.
Parameters
- No parameters.
Result
Success, core protection or connectivity blockage.
Tactical use
For precise removal of a deliberately selected branch point.
Common mistake
After success, the active origin moves to the core; subsequent commands start there.
selectOutermost(direction: .xMinus)
deleteActive()Delete OutermostRemoves the outermost safe cube on a chosen side of an axis.4 units
deleteOutermost(direction: .xMinus)The spatially most extreme non-core cube is selected first. Core protection and full connectivity are then checked; an unsafe candidate remains in place.
Parameters
- direction: axis and positive or negative side to retract.
Result
Success or safety blockage.
Tactical use
Cleans up one distant side of a large search network.
Common mistake
The outermost cube may be a critical bridge and therefore remain protected.
deleteOutermost(direction: .xMinus)
retractTrail(count: 2)Retract TrailSafely removes several old cubes in sequence.2 + 2 × count
retractTrail(count: 3)For every step, the oldest suitable non-core cube is selected again and checked for connectivity. The retraction stops as soon as a candidate would be unsafe.
Parameters
- count: 1 to 20; adds 2 units for every requested cube.
Result
Success with the portion actually removed, or an early safety blockage.
Tactical use
For telescoping arms, mobile cores and memory-efficient search paths.
Common mistake
Command cost follows the requested count even when retraction stops early.
growPreferredDirection()
scanDirection(range: 8)
retractTrail(count: 2)