Fixed in 1.0.1, live now - thanks for reporting it, and sorry for the slow reply. You were right, and the cause was worse than the symptom: the demo called Save.write(...) directly, but Save is an autoload that only exists after the plugin is enabled, while Godot parses every .gd file the moment the zip lands in the project. So everyone got those errors on first contact, having done nothing wrong. The demo now resolves the singleton at runtime, so the parser never needs the name, and it tells you to enable the plugin instead of failing silently. Your own code still just calls Save.write(...).
saltmire
2
Posts
8
Followers
A member registered 55 days ago
Creator of
Drop-in Hitbox2D / Hurtbox2D for Godot 4 — damage, teams, knockback and i-frames with zero collision-layer setup
Free MIT Hitbox2D / Hurtbox2D for Godot 4 — damage, teams, knockback, i-frames with zero collision-layer setup
One-line save/load for Godot 4 — free, MIT. Write & read game state in a single call.
One-line save/load for Godot 4 — encryption, schema migration, backup recovery, gzip compression & smart autosave.
Free MIT one-call 2D particle bursts for Godot 4 — sparks, pickups, explosions, dust & confetti in one line.
Free MIT motion-trail tool for Godot 4. Attach fading afterimages to any sprite in one call — dashes, speed, juice.
One-call game feel for Godot 4: shake, hit-stop, flash, damage numbers & FX combined into simple combo calls
One-line 2D sprite shader effects for Godot 4 — dissolve, outline, hit-flash, freeze, hologram.
Free MIT scene-transition manager for Godot 4 — fade, iris, wipes, pixelate in one line.
A complete, data-driven survivors-like template for Godot 4.6 — with a playable web demo.
Recent community posts
Free & open-source: Saltmire Juice, a game-feel kit for Godot 4 comments · Replied to Scoremonger in Free & open-source: Saltmire Juice, a game-feel kit for Godot 4 comments
You were right, and your diagnosis was right too - that is exactly the fix.
Two bugs, one cause. The one you hit: pop() never killed the running tween, so two tweens fought over `scale` every frame and the new pop looked like it did nothing.
The one underneath, which I only found because you reported this: `var base = node.scale` read the CURRENT scale. Mid-animation that is a point on the elastic curve, not the rest scale - and it became the new "base", so the node never returned to its real size. Repro: five pops, each interrupted after two frames. Old code ended at scale 0.9089 instead of 1.0000.
flash() had the same defect: stacked tweens, and it faded back to a hardcoded white, so any node whose modulate was not white got repainted permanently.
Fixed in 1.1.0, live now. The rest scale (and colour) is stored per node, the running tween is killed on retrigger, and the exact rest value is restored on finish - TRANS_ELASTIC can land a hair off. Also added pop_reset(node) for when you resize a node on purpose between pops. There is a headless regression test in the repo that fails on the old code and passes on the new one, so this cannot come back silently.
Thanks for writing it up that carefully - it saved everyone who installs this next. The itch download has 1.1.0; pushing the same commit to GitHub is still pending on my side.










