Releases / v0.79.0

v0.79.0 Out Loud

2026-08-26 Latest

When a script asks for something that isn't there, the engine says so.

Nearly every hour lost to Floptle scripting has had the same shape: a call answers nil, nothing is reported, and the symptom turns up three scripts away as a value that was never set. This release goes through the calls that do that most and gives each of them a voice — and fixes the two lookups that were answering nil when they should have found something.

Scripts in folders answer to their own name

If your script lives at scripts/forgery/playermovement.lua, this now works:

lua
local movement = findTagged("Player")[1]:getscript("playermovement")

Before, only the full "forgery/playermovement" found it. The short name — the one on the editor tab, in the Inspector row, and in front of every line that script prints to the Console — matched nothing and returned nil without a word. Both spellings work now, everywhere a script is named by name: getscript, findScript, findScripts, and scriptref params.

If two folders hold a file with the same name, the short name is refused and both are named, rather than one being picked for you.

The node calls are spelled like the rest of the API

node:getChild, node:getParent, node:getScript, node:getComponent and node:getSorting — camelCase, like hasTag, lookAt, distanceTo and every other node call. These five were the only lowercase ones, and typing the spelling the rest of the API taught you died with "attempt to call a nil value". The lowercase spellings still work and always will; nothing in your project needs changing.

Mistype any other node call and it now tells you the one you meant:

a node has no `HasTag` — did you mean `hasTag`?

Lists start at 1, and say so

lua
findTagged("enemy")[0]   -- this list is 1-based, so [0] is never one of its
                         -- elements — the first is [1] and the last is
                         -- [#list]. It holds 3.

[0] used to hand back nil, which then failed on the next line as "attempt to index a nil value" — pointing at the wrong place and saying nothing about the cause. Asking past the end still reads nil, so if findTagged("boss")[1] then is still how you check whether there are any.

Lookups that find nothing name what IS there

Hero:getscript("helth") found nothing — that node carries health, inventory.
Hero:getcomponent("rigidbody") found nothing — that node carries RigidBody,
  Material. (did you mean `RigidBody`?)
findScript("spawner") found nothing — no node in this scene carries a script
  by that name. This scene runs: enemy, hud, player_controller.

Each is said once, however many frames ask. A script that is attached but switched off now says that too, instead of reading as a script with no such function — two problems that looked identical and want opposite fixes.

Writing a field a node doesn't have, on a handle from find or getChild, says so as well: those handles are rebuilt each time you ask for one, so the value was going nowhere.

Console and terminal

log(...) and print(...) were each printing to the terminal twice, which reads as your code having run twice. Once now. A dedicated server prints them at all now — it was the one place a script could talk and nobody was listening, and its warnings were going the same way.

Items on a bone stay where you put them

A node attached to a bone was placed correctly only while it was also a child of that model in the Hierarchy — which is how the editor sets it up, and nothing held it afterwards. Move it anywhere else in the tree and it still tracked the bone's motion perfectly while sitting in the wrong place. It is placed by world position now, so it lands on the bone wherever you file it.

Selecting a part opens its material

Click a part of a model — in the viewport or in ◈ Objects & Rig — and that part's material editor opens while the others close. A model with a dozen parts no longer means scrolling past eleven open editors to reach the one you just clicked. Open a second to compare, or close the one you're on, and it stays that way until you select something else.

Upgrading

Nothing to do. Every older spelling still works.

Floptle Hub

Linux x86_64 7.5 MB Download → sha256 ccc7e7b066dd1655692be346865afdf3f2da54e024881de600d5bd18d2879fd9
macOS Apple Silicon 5.7 MB Download → sha256 cbebb66275990e84ee980f09b0cac9fb8a85e46a632e04a974f7a249a050f1d0
macOS Intel 6.2 MB Download → sha256 6412857c6eabc05fcee704d0f2907d44f495498dbb29c9f808c056538f578f34
Windows x86_64 7.1 MB Download → sha256 ab1e959776e4e0ac0137fea073fd1025f21ef74c8f1875d0f6cce76592acf131

Engine

Linux x86_64 20.8 MB Download → sha256 5b086f6f830c20b5d20ec3205ebdda2b8121e03cda4360ad326adc9ba5800291
macOS Apple Silicon 16.8 MB Download → sha256 9c08efbbf89872519698ebd9af19d76a49f0c2c49165566aa5342103acd82f03
macOS Intel 18.2 MB Download → sha256 87ec0a224e7ecedd3dbf6709947c89889246f1e299f918914e12cf517510dfa1
Windows x86_64 20.6 MB Download → sha256 b3f3f0c12cacfa611950d9f33ed0d14ae70034258d1d011050b55c0fda67461c

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.