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:
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
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
Engine
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.