c17769246f
Two related cleanups from the best-practice audit: Task 3 — typed Resources instead of MBase / MScene / MLevel / MSetting The old model classes wrapped the godot_db_manager Table API: each row read went through table.get_data_at_row_idx(int), Cell.get_data(), and 'as int' / 'as String' casts that don't actually parse anything in Godot 4. m_value, m_lock, m_label, ... members shadowed the cell indirection. Setters round-tripped through table.edit_data() + Global.database.save_db(). That's a lot of plumbing for what is, in the end, three flat tables of static strings. Introduce three @export-typed Resources: db/scene_entry.gd class_name SceneEntry db/level_entry.gd class_name LevelEntry db/settings_data.gd class_name SettingsData Rewrite scripts/Database.gd so Database.DB holds: settings: SettingsData levels: Array[LevelEntry] scenes: Array[SceneEntry] Build them once at startup from ahog.json, and serialise back to the same JSON shape on save() so existing progress files keep working. LevelEntry carries its own object_to_find / object_finding / reset methods (talking to Global.database for cross-table lookups), and SceneEntry carries its own mesh_path / audio_sound. Per-scene dissolve state (value, tick_reference, dissolved) lives on SceneEntry as non-exported runtime fields. Delete db/MBase.gd / db/MScene.gd / db/MLevel.gd / db/MSetting.gd. Update consumers: - scripts/Setting.gd: read/write Global.database.settings directly, call Global.database.save() after each setter. - scenes/levels/Levels.gd: iterate Global.database.scenes_for_level( current_scene_int) instead of mscene.new(i) for every row; scene state reads (scene.lock, scene.mesh, scene.counter, ...) replace scene.lock() / scene.mesh() / scene.counter() method calls; runtime dissolve state lives on the SceneEntry instance instead of mutable m_value / m_tick_reference members on MScene; 'dissolved' flag replaces set_mesh(null) signalling. - scenes/UI/choose_scenes/ChooseScene.gd: iterate Global.database .levels; level.name / level.thumb property access in place of level.name() / level.thumbnail(). configure_reset() loses its redundant index argument (LevelEntry knows its own index). - scripts/event.gd: _on_reset_level signature now takes LevelEntry, reset path drops index forwarding. Task 2 — type hints across the remaining scripts scripts/Global.gd, scenes/Main.gd, scenes/UI/ending/Ending.gd, scenes/UI/loading/Loading.gd, scenes/UI/settings/Settings.gd: add typed parameters and -> return annotations. current_scene_int is now 'int = -1' (sentinel) so callers don't fall into Variant comparisons; event.gd:_on_reset_level resets it to -1 instead of null. Settings.gd no longer wraps button_pressed in int() before passing to the now-typed bool setters. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
43 lines
1.5 KiB
GDScript
43 lines
1.5 KiB
GDScript
class_name Event
|
|
|
|
# UI event handlers, namespaced as static methods so they can be wired
|
|
# directly from anywhere without an autoload.
|
|
#
|
|
# button.pressed.connect(Event._on_main_scene_pressed)
|
|
#
|
|
# Per-level dispatch goes through `level_pressed(name)` which maps the level
|
|
# name to the appropriate handler.
|
|
|
|
static func _loading_is_started(_anim_name: StringName) -> void:
|
|
Global.loaded = false
|
|
|
|
static func _loading_is_finished(_anim_name: StringName) -> void:
|
|
Global.loaded = true
|
|
|
|
static func _on_warcraft_pressed() -> void:
|
|
Global.current_scene_int = 0
|
|
Global.goto_scene("res://scenes/levels/warcraft/WarCraft.tscn")
|
|
|
|
static func _on_home_pressed() -> void:
|
|
Global.current_scene_int = 1
|
|
Global.goto_scene("res://scenes/levels/home/Home.tscn")
|
|
|
|
static func _on_reset_level(level: LevelEntry, node: String, index: int, parent) -> void:
|
|
Global.current_scene_int = index
|
|
level.reset()
|
|
parent.configure_reset(level, node, true)
|
|
parent.configure_counter(level, node)
|
|
Global.current_scene_int = -1
|
|
|
|
static func _on_main_scene_pressed() -> void:
|
|
Global.goto_scene("res://scenes/Main.tscn")
|
|
|
|
# Returns the press handler for a level by name (used by ChooseScene to wire
|
|
# the dynamic level-select buttons). Returns Callable() if unknown.
|
|
static func level_pressed(name: String) -> Callable:
|
|
match name.to_lower():
|
|
"warcraft": return _on_warcraft_pressed
|
|
"home": return _on_home_pressed
|
|
push_warning("Event.level_pressed: no handler for level '%s'" % name)
|
|
return Callable()
|