Hey Thornido, great component kit, thank you for creating this! Here are some feedback notes and requests from using it:
What's working well
Zero-autoload, zero-cross-dependency discipline. Every addon standing alone is the single biggest reason we could plan a-la-carte adoption (upgrade tree + achievements + save core) instead of all-or-nothing.
Logic/UI split + signal-driven APIs. Clean seams for replacing the front-end while keeping the model.
The demos. Playable demos per component sold the pack better than any screenshot; I could instantly see the solid UX patterns and their usefulness.
Requests, in priority order for us
- Keyboard-first navigation on every UI component. Our game (and any controller-first game) hides the mouse cursor. Inventory, shop, and upgrade tree are mouse-driven today. A focus model driven by ui_* actions would make the whole pack usable in keyboard/gamepad games out of the box.
- Expose the model without the UI. The upgrade tree is the best example: the node/cost/prerequisite/purchase logic is exactly what we want, but we need to render it in our own idiom (typed selection, pixel font). A documented "headless" API per component (model class + signals, UI purely optional) would double where the pack fits.
- Central theming. One theme resource (font, colors, panel styles) consumed by all components. Right now restyling means editing scenes per component. Even just routing everything through a single Theme would help enormously.
- Pause-safe overlays, documented. Menus/overlays opened while get_tree().paused need deliberate process_mode choices. We hit this repeatedly in our own UI; a stated convention (and ALWAYS-mode demos for pause menus) would save integrators real debugging time.
- Status effects: explicit stacking policies. Refresh vs. stack vs. extend per effect, and signed/percent ticks. We have a live bug in our hand-rolled slow effect (overlapping slows save each other's modified speed) that a well-specified stacking model prevents by design.
- Save system: versioning + migration examples. The register(save_func, load_func) core is the right shape; a worked example of migrating a save across schema versions would make it trustworthy enough to adopt early rather than late.
- Loot tables: pity/guarantee rules. "Guarantee at least one X every N rolls" as a first-class table option - we hand-rolled exactly this for a guaranteed drop category and suspect every roguelite does.
- Cooldown radial-wipe as a standalone control. The radial wipe is the most reusable 40 lines in the pack; publishing it as a self-contained Control/shader (feed it a 0..1 progress) would let games use it for any meter, not just cooldowns.
- Finalize the license text. The LICENSE file describes itself as a draft. The terms are fine (in-game use incl. commercial, no standalone redistribution) - just removing the word "draft" would spare every buyer the double-check we did.
Small bug/paper-cut notes
A couple of demo scenes assume a 16:9 base resolution and clip at other window sizes.
Inventory demo: drag-and-drop works, but there's no keyboard path to the same operations (see request #1).