Releases / v0.116.0-rc6

v0.116.0-rc6 Lands On Its Feet

2026-10-13 Engine

Everything in rc5, plus physics that behaves like things, joints, isometric and hexagonal maps, particles that land on the level, and 2D lights and shadows that do what their controls say.

Bodies collide with each other, and turn

Two moving rigidbodies used to pass through each other, so crates never stacked and a character could not push one. They collide now, with their mass, bounce and friction.

A Rigidbody with rotates ticked is turned by what it hits: a crate tips off a ledge, a ball rolls down a slope, and a stack of crates stands still instead of shaking itself apart. A sprite given a body starts with it on; every body already in a scene stays upright. From a script, node.spin is how fast a body turns, in degrees a second.

A fast box or polygon body no longer comes out the far side of a thin wall, and a crate hitting a wall square on no longer spins.

Joints

Add Component ▸ Physics ▸ Joint holds a node's body to another node, or to where it starts:

  • hinge turns freely or between limits, and can be driven by a motor;
  • fixed welds two bodies so they move as one;
  • distance holds them a set length apart, rope only up to it;
  • spring pulls toward its length, as stiff and damped as you set;
  • slider runs along the other node's axis between limits;
  • wheel hangs on a suspension and is driven round;
  • target pulls toward a point a script sets.

A joint can break past a force, and the two bodies it joins stop colliding with each other unless you ask. The joint goes on the moving part, so a car is a body with a wheel joint on each wheel. Joints are drawn in the Scene view and saved with the scene. From a script:

lua
lamp:setJoint{ kind = "rope", to = hook, length = 4 }
door:setJoint{ kind = "hinge", to = frame, limit = true, min = 0, max = 100 }
lamp:removeJoint()

Isometric and hexagonal maps

A tileset's grid in the ◫ Tiles tab can be square, isometric, hex (pointy top) or hex (flat top). Every map painted with it lays its cells out that way. Tiles draw in their cells, the cursor picks the cell it is over, and solid cells collide and cast shadows with their own diamond or hexagon outline. Art taller than its cell, like an isometric block, stands up out of it, and the nearer block covers the one behind. cell height sets the cells' proportions: 0.5 for the usual 2:1 diamond.

tm:cellAt and tm:worldAt answer in diamonds and hexagons on such a map. Isometric and hexagonal maps from Tiled now import with their shape. Autotiling and tm:path still work on square neighbours.

Particles meet the level

Tick collides with the level on a track in the ✱ Particles tab and its particles stop at walls, floors and the ground instead of passing through. They bounce, with a bounce and a friction to tune, or die on contact for rain and sparks that wink out. Only Play has a level, so the tab's preview passes through everything.

Lit particles now take the point lights near them, with their colour and falloff. In a 2D scene they take the 2D lights that reach their layer, so dust glows beside a torch and stays dark in a corner.

2D lights and shadows

  • Only solid tiles cast. A tile layer used to throw shadows from every opaque pixel, decor and background included. It now casts from the tiles its tileset marks solid, as one block per wall, so a light finds no seams.
  • No more streaks. Shadows from a light some way off broke into thin lines of light fanning out across the floor. They are clean edges now.
  • shadow strength under 2D light is how much of a light a caster stops. Lower it for a shadow that lets some light through.
  • height under 2D light sets how high a lamp hangs over normal-mapped art. Low lamps throw long relief and high lamps light from above. It was fixed at a third of the range.
  • A 2D light no longer shows the 3D casts shadows box, which did nothing there. casts stop this light is its switch.

From a script: node:setLighting2D{ shadowStrength = 0.5, height = 2 }.

Pixel-perfect 2D

Set Camera 2D ▸ art pixels to your art's pixels per world unit, and the camera keeps its zoom where every art pixel covers a whole number of screen pixels, including while a script zooms it. Play and floptle check name any sprite or tile layer drawn at a different density, which is usually a node scaled up to make a small sprite bigger. From a script: node:setCamera2D{ artPixels = 8 }.

A followed player no longer wobbles a pixel as the camera tracks them, and a camera a script moves is no longer nudged off the position it was given.

Editing

  • The Scene view. Press on a node that is already selected and drag, and it moves. A press that does not travel is still a click. A sprite, tile layer or 2D body only turns in its plane, and anywhere inside its ring turns it.
  • Tiles. With the tile tool out, , and . turn the brush a quarter turn either way, and [ and ] mirror it.
  • The Image tab. A marquee dragged up or to the left now selects the box you drew, not a strip. Ctrl+wheel changes the brush size one step per notch, and a plain scroll never does.
  • Removing things. Any type added to a node, such as a Sprite, can be taken off from its header's menu with Remove component, leaving an Empty. Curve keys and gradient stops can be removed.
  • Undo. Tileset edits in the Tiles tab and edits in the Particles tab undo with Ctrl+Z. Image palette changes undo too. Deleting an animation state asks first.

Scripts and tools

  • A tile a script sets or clears with tm:set, tm:fill or tm:fillRect collides from the next frame, and a static block a script moves takes its collider with it. tm:oneWay answers whether a square is a one-way platform. A body standing on a one-way ledge reads as grounded.
  • A param pinned in a scene that a script has since changed to an on/off switch is named in the Console and by floptle check, where before it quietly arrived as off.
  • floptle run and floptle shot take --fps to step frames at a display rate and --frame-jitter to vary each frame's time, for a bug that only shows on a fast monitor.

Upgrading

Nothing to do. Bodies in your scenes stay upright unless you tick rotates. A tile layer that cast shadows now casts only from its solid tiles. If you relied on decor tiles casting, mark those tiles solid in the Tiles tab.

Floptle Hub

Linux x86_64 10.7 MB Download → sha256 0bf82b081154b80465b0aa5f7a49f4c80c338f668e732ce59d3c1da2cbc581d3
macOS Apple Silicon 7.4 MB Download → sha256 26f0b8a8acbe982fd4c87d40558345d4f77781ce2e000f3878d6a5e16cbba520
macOS Intel 7.9 MB Download → sha256 092081486abc64c2f3c66b2a453967c7f02b12ba5df3e194c24664d10430b561
Windows x86_64 9.1 MB Download → sha256 21aef6bac6c639da6b457952524ceeaff8d7ef31ac60e70cde90ad4ad95d8804

Engine

Linux x86_64 54.9 MB Download → sha256 033c344a03feb3b25302cf6fc4cefbe8dda3eafeeeb01f4fcb35845496811d4f
macOS Apple Silicon 42.7 MB Download → sha256 3cede27ee7c631299b911ae7832da8a11f8ec353ed5dbbaae6801422d4b6b892
macOS Intel 46.0 MB Download → sha256 80adabbfbc8bf9bb49126ba02c01d4fec32ed6571d1c43ce4904b134a58eff71
web 5.0 MB Download → sha256 ff92334f26b102baee4616d59f99a933058aeff2b465c66b0c7cf6b4e27f82da
Windows x86_64 51.9 MB Download → sha256 2a51ffb9d015b87d92bd251b2f9ea52a22e778ba10510de6d7ca30b808fc5ddf

The binaries are not signed yet. On macOS, right-click the app and pick Open the first time. On Windows, if SmartScreen appears, pick More info then Run anyway.