Releases / v0.103.0

v0.103.0 Holds Steady

2026-09-29 Engine Latest

A game can hold a steady frame rate: cap it to a rate it can always make, or let the engine lower the render resolution whenever the graphics card falls behind. Fast bodies stop at the walls they run into instead of ending up on the far side, and shape casts can start from a floor. A camera added to a script-made node can be read back again, and a bent arm or leg reaches its target.

A steady frame rate

When a game's cost on the graphics card swings with the view, some frames miss the display's refresh and some don't. On a 144 Hz display it flips between 144 and 72 frames a second, and at speed that judder is metres on screen. Two new ways to hold it steady:

  • app.setFrameCap(72) draws no more than that many frames a second, on a steady clock. app.refreshRate() says what the display runs at, so a game can offer half or a third of it. app.setFrameCap(0) removes the cap.
  • app.setDynamicResolution{ min = 0.6 } lets the engine choose the render scale each frame from how long the graphics card took. A heavy view renders fewer pixels instead of missing the frame. It steps down 5% at a time as soon as a frame runs over, and back up only after a second and a half with room to spare, so it settles rather than hunting. targetMs sets the time a frame should fit in. By default it's 90% of the frame's time at the cap, or else at the display's refresh rate. app.renderScale() reads the scale it chose, and app.setRenderScale hands the choice back to the game.

Like the other video settings, both last for the session. Keep a player's choice with save.*.

Fast bodies stop at walls

A sphere or capsule body moving fast enough could pass into a wall built from a model or with the map tools, and be pushed out on the far side. At 60 m/s a character launched at a wall ended up behind it about one time in five. Now a body moving more than half its radius in one physics step sweeps the move. It stops where it first touches, loses only its speed into the wall, and slides on along it. Bodies at ordinary speeds move exactly as before.

spherecast and capsulecast take { ignoreStart = true }. A shape resting on a floor used to report a hit at distance 0 the moment it was cast along that floor. With the option, only a surface it moves into counts:

lua
local hit = capsulecast(node.pos, move, 0.35, 0.9, move:length(), { ignoreStart = true })

Both casts now check only what they pass near, as raycast does, instead of every collider in the level.

Fixed

  • A camera given to a createNode node with setCamera can be read back with getComponent("Camera") again. In 0.102.0 it answered nil, and the same was true of anything else a createNode callback added.
  • anim:reach puts a hand or foot on its target when the limb starts out bent. An idle character's knees are already bent, and a reach from there opened the knee and left the foot short of the target. The foot-planting recipe in the animation guide now places feet from a fixed stance, because feeding last frame's foot positions back in made feet creep downhill.

Floptle Hub

Linux x86_64 9.0 MB Download → sha256 309b25b5064d741beb24bbbe620035c2d29420a2c1580426954993b7fa6044c8
macOS Apple Silicon 5.9 MB Download → sha256 32d505fb7bee33da63b38042ad7d7218b4401b0801ba93b66403526d953e9d86
macOS Intel 6.4 MB Download → sha256 07cd720d67d105052bbf78dc11526dc4a68074bafa9e4bf81fb56a9c79b2695a
Windows x86_64 7.3 MB Download → sha256 2032a8ec71bc129623cc3bd7b4d237cf0123571913c3b9363dcbb908af3187d9

Engine

Linux x86_64 37.3 MB Download → sha256 758a6b9cb7452bd8e6cd2df87081c7931a7883ddf217b5fbd9cd292bb7874548
macOS Apple Silicon 28.8 MB Download → sha256 bfdb057b2d2ca5ca4934ed9faac0324ad0f9353a2a839f0f17ed23125c8eae3c
macOS Intel 31.0 MB Download → sha256 bef410135f55caca953f2f1276bced21e87cb07038be0c93477f58c7e5e63676
web 4.6 MB Download → sha256 b32b95d39c1a83c9741deeae887435d251cce388c27b9f7f2f2cd576ea9f23ba
Windows x86_64 35.1 MB Download → sha256 6ed931ef4de3c8437e8b7a74b58801f3235b677011be07c98470eeb240987a13

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.