Releases: MarcyMarbles/Qualia-Mods
Release list
V2.0.1
V2.0.0-RC1
v2.0.0-RC1
Added
_early_setup()lifecycle hook — mods can now override_early_setup()to run code synchronously during bootstrap, before game autoloads (ItemMap, etc.) start their async work. The node is already in the tree soget_tree()works, but noawaitis allowed. Enables interception of game nodes like IconGenerator before they execute.- ModBase class — new base class for zero-boilerplate mod development
- Auto-detects
mod_idfrom folder name - Pre-populates
configfrom mod.cfg + user overrides - Auto-wires
_on_<hook>()methods — just define the method, no manualadd_hook()needed - Convenience helpers:
log_info(),get_cfg(),settings_tab() - Full lifecycle:
_early_setup()→_setup()→_game_ready()→_config_changed()→_cleanup()
- Auto-detects
- Godot editor plugin — SDK addon for the Godot editor
- New Mod dialog — scaffolds mod directory with mod.cfg and mod_main.gd
- Pack Mod — select a mod from
res://mods/, one-click .pck export with .gd.remap generation - Hooks Browser — lists all available hooks with phase, description, and "Insert into current script" button
- One-click framework installer — "Setup QualiaMods" button downloads all framework files from GitHub
- mod.cfg dock — inspector panel for editing mod metadata
- Editor dev mode —
_scan_editor_mods()discovers loose mod directories inres://mods/when running from the Godot editor, no .pck packing needed for testing
Changed
log()renamed tolog_info()to avoid conflict with GDScript builtinlog()(natural logarithm)- Mod instances created in
_early_init_mods()are reused by_initialize_mods_async()instead of being recreated
V1.3.1
v1.3.1
Added
- Lang subfolder support — translations can now live in subfolders like
lang/ja/japanese.cfgalongside font files, instead of only flatlang/*.cfg - Per-locale custom fonts —
font = "filename.ttf"andfontSize = 12in[meta]section of translation.cfg; font path resolved relative to the.cfgfile - Language button without mods — "Language" button now appears in main menu even with zero mods installed (shows "lang" when mods are present)
- Packer: imported resource support —
pack_qualiamods.gdnow parses.importfiles to find compiled resources in.godot/imported/(.ctex,.fontdata, etc.) and packs them alongside source files automatically - Packer: directory scanning —
SCAN_DIRSarray for recursive resource discovery; moddders add their directory and the packer picks up fonts, textures, themes, etc.
Fixed
- i18n no longer depends on mods — global translations from
<game_dir>/lang/now load even when no mods are installed; previously the early return on empty mods list skipped i18n initialization entirely - Split i18n init into two phases: global translations load before the mods check, per-mod translations load after dependency resolution
- Locale restore — switching back to English now restores original text and fonts; previously switching away from a non-English locale was a one-way operation
V1.3.0
v1.3.0
Added
- i18n system — runtime localization for the game and mods
- Translators drop
.cfgfiles into<game_dir>/lang/— no mod needed - Mods can include their own translations in
mods/<id>/lang/ - Framework scans global translations first, then per-mod
- Language menu accessible from main menu (mods | lang row)
- Locale choice persists across sessions (
lang/settings.cfg) - Automatic
english.cfgfallback creation if missing
- Translators drop
- Translation format — Godot ConfigFile with
[meta]+[strings]sections- Keys must be quoted to preserve spaces:
"exit game" = "(終了)" localefield for explicit locale code,displayNamefor the selector- Fallback locale guessing from displayName if
localeis omitted
- Keys must be quoted to preserve spaces:
- Dynamic text translation — button hover/state changes caught via signal hooks (
mouse_entered,mouse_exited,pressed,visibility_changed) - Public API
ModLoader.set_locale(locale)— switch language at runtimeModLoader.get_locale()— current locale codeModLoader.get_available_locales()— list of loaded localesModLoader.get_locale_display_name(locale)— display name for selectorModLoader.load_translation(path)— load a .cfg translation file manuallyModLoader.reload_translations()— rescan all translation sources
- SDK —
sdk/i18n/strings.cfgtemplate with all game UI strings, translation examples insdk/examples/minimal/lang/andsdk/template/lang/
V1.2.0
v1.2.0
Added
- Loading screen — shows mod loading progress during startup with per-mod status indicators and progress bar, styled to match the game's visual language (Silkscreen font, dark theme, pixel-art panels)
- Splash screen replacement — replaces the game's default splash image with QualiaMods branding during world startup
- Async bootstrap — mods initialize asynchronously, yielding frames for UI updates
- Subfolder support — PCK files in subdirectories of
mods/are now discovered and loaded - Config hints —
[config_min],[config_max],[config_step]sections in mod.cfg to define numeric ranges for config values - Config hints applied to SpinBox controls in Mods Menu (default max raised from 100 to 10000)
V1.1.0
v1.1.0
Added
- Settings Tab API —
ModLoader.add_settings_tab(name)returns aSettingsTabbuilder for injecting custom tabs into the game's Settings Menu SettingsTab.add_slider()— horizontal slider with labelSettingsTab.add_toggle()— CheckButton with labelSettingsTab.add_option()— OptionButton dropdown with labelSettingsTab.add_spinbox()— SpinBox with labelSettingsTab.add_color()— ColorPickerButton with labelSettingsTab.add_text_input()— LineEdit with labelSettingsTab.add_header()— section header (dimmed label)SettingsTab.add_separator()— horizontal lineSettingsTab.add_label()— info text with auto-wrapSettingsTab.add_spacer()— vertical spacingSettingsTab.add_custom()— insert any Control nodeSettingsTab.get_container()— raw VBoxContainer for fully custom layoutsSettingsTab.get_value(key)/set_value(key, value)— read/write individual controlsSettingsTab.set_values(dict)— bulk-set (useful for presets)SettingsTab.get_all_values()— Dictionary of all control valuesSettingsTab.set_save_prefix(prefix)— enable auto-persistence via settings_fileSettingsTab.load_values()— load from save fileSettingsTab.savedsignal — emitted when Settings Menu save button is pressedSettingsTab.remove()— cleanup the tab
V1.0.0
First release.
Framework:
Mod lifecycle: _init_mod, _game_ready, _on_config_changed, _mod_cleanup
Hooks for game events: game_playable, world_loaded, game_quit, all_loaded, new_game_loaded, mods_all_ready,
items_pre_load
Scene injection (add, replace, swap nodes in the game tree)
Item registration and hot-loading into ItemMap
Method wrapping (callable-chain patching)
Config system with in-game editor
Dependency resolution with topological sort
Inter-mod messaging
UI helpers (main menu buttons, game menu tabs)
Mods Menu:
Toggle mods on/off
View mod info and dependency status
Edit mod configs, saved immediately
SDK:
Stubs for editor autocompletion (ModLoader, Ref)
Mod template
Universal packer script
Example mods
Encyclopedia with full API reference